diff -r 683f4b1f08ce -r 377ac716dabb core/builtins/gobble.cpp --- a/core/builtins/gobble.cpp Thu Sep 09 15:47:34 2010 +0100 +++ b/core/builtins/gobble.cpp Tue Sep 14 09:49:39 2010 +0100 @@ -11,6 +11,7 @@ // #include "gobble.h" +#include CCommandBase* CCmdGobble::NewLC() @@ -38,9 +39,20 @@ void CCmdGobble::DoRunL() { - if (iAmount < iBlockSize) + RFs& fs = FsL(); + if (iAmount == 0) { - LeaveIfErr(KErrArgument, _L("The amount to consume must be less than the block size (%d)"), iBlockSize); + TInt drive = EDriveC; + if (iFileName.Length() == 0) LeaveIfErr(KErrBadName, _L("Bad file name")); + RFs::CharToDrive(iFileName[0], drive); + TVolumeInfo volInfo; + LeaveIfErr(fs.Volume(volInfo, drive), _L("Couldn't get volume information for drive %c"), iFileName[0]); + iAmount = volInfo.iFree; + } + + if (!iNoWrite && iAmount < iBlockSize) + { + LeaveIfErr(KErrArgument, _L("The amount to consume must be greater than the block size (%d)"), iBlockSize); } if (iAmount & 0x80000000) { @@ -50,7 +62,6 @@ { LeaveIfErr(KErrArgument, _L("The block size is too large (maximum is %d)"), KMaxTInt); } - RFs& fs = FsL(); fs.MkDirAll(iFileName); RFile file; TInt err = file.Open(fs, iFileName, EFileWrite); @@ -58,51 +69,64 @@ { err = file.Create(fs, iFileName, EFileWrite); } - User::LeaveIfError(err); + LeaveIfErr(err, _L("Couldn't create file %S"), &iFileName); CleanupClosePushL(file); - TInt pos = 0; - User::LeaveIfError(file.Seek(ESeekEnd, pos)); - HBufC8* buf = HBufC8::NewLC(iBlockSize); - TPtr8 ptr(buf->Des()); - ptr.Fill(TChar('x'), iBlockSize); - - TInt toWrite = static_cast(iAmount); - do + if (iNoWrite) + { + TInt size = 0; + LeaveIfErr(file.Size(size), _L("Couldn't get file size")); + size += iAmount; + LeaveIfErr(file.SetSize(size), _L("Couldn't set filesize to %d"), size); + } + else { - TInt writeSize; - if (toWrite > static_cast(iBlockSize)) + TInt pos = 0; + User::LeaveIfError(file.Seek(ESeekEnd, pos)); + HBufC8* buf = HBufC8::NewLC(iBlockSize); + TPtr8 ptr(buf->Des()); + ptr.Fill(TChar('x'), iBlockSize); + + TInt toWrite = static_cast(iAmount); + do { - writeSize = static_cast(iBlockSize); - } - else - { - writeSize = toWrite; + TInt writeSize; + if (toWrite > static_cast(iBlockSize)) + { + writeSize = static_cast(iBlockSize); + } + else + { + writeSize = toWrite; + } + ptr.SetLength(writeSize); + err = file.Write(ptr); + if (err == KErrNone) + { + if (iVerbose) + { + Printf(_L("\rWrote %d"), iAmount - toWrite); + } + toWrite -= writeSize; + } } - ptr.SetLength(writeSize); - err = file.Write(ptr); - if (err == KErrNone) - { - if (iVerbose) - { - Printf(_L("\rWrote %d"), iAmount - toWrite); - } - toWrite -= writeSize; - } - } while ((err == KErrNone) && (toWrite > 0)); if (iVerbose) { Printf(_L("\rWrote %d"), iAmount - toWrite); } - - CleanupStack::PopAndDestroy(2, &file); + CleanupStack::PopAndDestroy(buf); + } + CleanupStack::PopAndDestroy(&file); } void CCmdGobble::OptionsL(RCommandOptionList& aOptions) { _LIT(KCmdOptVerbose, "verbose"); aOptions.AppendBoolL(iVerbose, KCmdOptVerbose); + + _LIT(KCmdOptNoWrite, "no-write"); + aOptions.AppendBoolL(iNoWrite, KCmdOptNoWrite); } void CCmdGobble::ArgumentsL(RCommandArgumentList& aArguments)