commands/drvinfo/drvinfo.cpp
changeset 0 7f656887cf89
child 64 72ffa331d78d
child 66 2a78c4ff2eab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/drvinfo/drvinfo.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,282 @@
+// drvinfo.cpp
+// 
+// Copyright (c) 2007 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// 
+// Initial Contributors:
+// Accenture - Initial contribution
+//
+
+#include <f32file.h>
+#include <fshell/ioutils.h>
+
+using namespace IoUtils;
+
+class CCmdDrvinfo : public CCommandBase
+	{
+public:
+	static CCommandBase* NewLC();
+	~CCmdDrvinfo();
+private:
+	CCmdDrvinfo();
+	void ArgumentErrorL();
+	void PrintDriveInfoL(TInt aDriveNum);
+	void FormatVolInfoL(const TVolumeInfo& volInfo, IoUtils::CTextBuffer& aPrintBuf);
+private: // From CCommandBase.
+	virtual const TDesC& Name() const;
+	virtual void DoRunL();
+	virtual void ArgumentsL(RCommandArgumentList& aArguments);
+	virtual void OptionsL(RCommandOptionList& aOptions);
+private:
+	HBufC* iDriveLetter;
+	TBool iVerbose;
+	TBool iHuman;
+	};
+
+
+CCommandBase* CCmdDrvinfo::NewLC()
+	{
+	CCmdDrvinfo* self = new(ELeave) CCmdDrvinfo();
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	return self;
+	}
+
+CCmdDrvinfo::~CCmdDrvinfo()
+	{
+	delete iDriveLetter;
+	}
+
+CCmdDrvinfo::CCmdDrvinfo()
+	{
+	}
+
+void CCmdDrvinfo::ArgumentErrorL()
+	{
+	Stderr().Write(_L("Invalid drive specification - use \'<drive_letter>:\', e.g. \'drvinfo c:\'\r\n"));
+	User::Leave(KErrArgument);
+	}
+
+void FormatLineEndL(IoUtils::CTextBuffer& aPrintBuf)
+	{
+	_LIT(KSeparator, " | ");
+	if (aPrintBuf.Descriptor().Right(KSeparator().Length()) == KSeparator)
+		{
+		aPrintBuf.Delete(aPrintBuf.Length() - KSeparator().Length(), KSeparator().Length());
+		}
+	if (aPrintBuf.Descriptor()[aPrintBuf.Length() - 1] == '(')
+		{
+		aPrintBuf.Delete(aPrintBuf.Length() - 2, 2);
+		}
+	else
+		{
+		aPrintBuf.AppendL(_L(")"));
+		}
+	aPrintBuf.AppendL(_L("\r\n"));
+	}
+
+void FormatDrvMediaTypeInfoL(const TDriveInfo& aDrvInfo, IoUtils::CTextBuffer& aPrintBuf)
+	{
+	aPrintBuf.AppendFormatL(_L("TMediaType:\t%d ("), aDrvInfo.iType);
+	switch(aDrvInfo.iType)
+		{
+		case EMediaNotPresent:  aPrintBuf.AppendL(_L("EMediaNotPresent"));   break;
+		case EMediaUnknown:	    aPrintBuf.AppendL(_L("EMediaUnknown"));      break;
+		case EMediaFloppy:      aPrintBuf.AppendL(_L("EMediaFloppy"));       break;
+		case EMediaHardDisk:    aPrintBuf.AppendL(_L("EMediaHardDisk"));     break;
+		case EMediaCdRom:		aPrintBuf.AppendL(_L("EMediaCdRom"));        break;
+		case EMediaRam:         aPrintBuf.AppendL(_L("EMediaRam"));          break;
+		case EMediaFlash:       aPrintBuf.AppendL(_L("EMediaFlash"));        break;
+		case EMediaRom:         aPrintBuf.AppendL(_L("EMediaRom"));          break;
+		case EMediaRemote:      aPrintBuf.AppendL(_L("EMediaRemote"));       break;
+		case EMediaNANDFlash:   aPrintBuf.AppendL(_L("EMediaNANDFlash"));    break;
+		default:                aPrintBuf.AppendL(_L("??? Unknown Type"));   break;
+		};
+	FormatLineEndL(aPrintBuf);
+	}
+
+void FormatDriveAttInfoL(const TDriveInfo& aDrvInfo, IoUtils::CTextBuffer& aPrintBuf)
+	{
+	aPrintBuf.AppendFormatL(_L("DriveAtt:\t0x%x ("), aDrvInfo.iDriveAtt);
+	if (aDrvInfo.iDriveAtt & KDriveAttLocal)         aPrintBuf.AppendL(_L("KDriveAttLocal | "));
+	if (aDrvInfo.iDriveAtt & KDriveAttRom)           aPrintBuf.AppendL(_L("KDriveAttRom | "));
+	if (aDrvInfo.iDriveAtt & KDriveAttRedirected)    aPrintBuf.AppendL(_L("KDriveAttRedirected | "));
+	if (aDrvInfo.iDriveAtt & KDriveAttSubsted)       aPrintBuf.AppendL(_L("KDriveAttSubsted | "));
+	if (aDrvInfo.iDriveAtt & KDriveAttInternal)      aPrintBuf.AppendL(_L("KDriveAttInternal | "));
+	if (aDrvInfo.iDriveAtt & KDriveAttRemovable)     aPrintBuf.AppendL(_L("KDriveAttRemovable | "));
+	if (aDrvInfo.iDriveAtt & KDriveAttRemote)        aPrintBuf.AppendL(_L("KDriveAttRemote | "));
+	if (aDrvInfo.iDriveAtt & KDriveAttTransaction)   aPrintBuf.AppendL(_L("KDriveAttTransaction | "));
+	FormatLineEndL(aPrintBuf);
+	}
+
+void FormatMediaAttInfoL(const TDriveInfo& aDrvInfo, IoUtils::CTextBuffer& aPrintBuf)
+	{
+	aPrintBuf.AppendFormatL(_L("MediaAtt:\t0x%x ("),aDrvInfo.iMediaAtt);
+	if (aDrvInfo.iMediaAtt & KMediaAttVariableSize)      aPrintBuf.AppendL(_L("KMediaAttVariableSize | "));
+	if (aDrvInfo.iMediaAtt & KMediaAttDualDensity)       aPrintBuf.AppendL(_L("KMediaAttDualDensity | "));
+	if (aDrvInfo.iMediaAtt & KMediaAttFormattable)       aPrintBuf.AppendL(_L("KMediaAttFormattable | "));
+	if (aDrvInfo.iMediaAtt & KMediaAttWriteProtected)    aPrintBuf.AppendL(_L("KMediaAttWriteProtected | "));
+	if (aDrvInfo.iMediaAtt & KMediaAttLockable)          aPrintBuf.AppendL(_L("KMediaAttLockable | "));
+	if (aDrvInfo.iMediaAtt & KMediaAttLocked)            aPrintBuf.AppendL(_L("KMediaAttLocked | "));
+	if (aDrvInfo.iMediaAtt & KMediaAttHasPassword)       aPrintBuf.AppendL(_L("KMediaAttHasPassword | "));
+	if (aDrvInfo.iMediaAtt & KMediaAttReadWhileWrite)    aPrintBuf.AppendL(_L("KMediaAttReadWhileWrite | "));
+	if (aDrvInfo.iMediaAtt & KMediaAttDeleteNotify)      aPrintBuf.AppendL(_L("KMediaAttDeleteNotify | "));
+	FormatLineEndL(aPrintBuf);
+	}
+
+void CCmdDrvinfo::FormatVolInfoL(const TVolumeInfo& volInfo, IoUtils::CTextBuffer& aPrintBuf)
+	{
+	if (iVerbose)
+		{
+		aPrintBuf.AppendFormatL(_L("VolId:\t0x%x\r\n"), volInfo.iUniqueID);
+		}
+	aPrintBuf.AppendL(_L("VolSize:\t"));
+	if (iHuman)
+		{
+		aPrintBuf.AppendHumanReadableSizeL(volInfo.iSize);
+		aPrintBuf.AppendL(_L("\r\n"));
+		}
+	else
+		{
+		aPrintBuf.AppendFormatL(_L("%ld\r\n"), volInfo.iSize);
+		}
+	aPrintBuf.AppendL(_L("Free:\t"));
+	if (iHuman)
+		{
+		aPrintBuf.AppendHumanReadableSizeL(volInfo.iFree);
+		aPrintBuf.AppendL(_L("\r\n"));
+		}
+	else
+		{
+		aPrintBuf.AppendFormatL(_L("%ld\r\n"), volInfo.iFree);
+		}
+	if (iVerbose)
+		{
+		aPrintBuf.AppendFormatL(_L("VolName:\t\'%S\'"), &volInfo.iName);
+		}
+	aPrintBuf.AppendL(_L("\r\n"));
+	}
+
+void CCmdDrvinfo::PrintDriveInfoL(TInt aDriveNum)
+	{
+	IoUtils::CTextBuffer* buf = IoUtils::CTextBuffer::NewLC(0x100);
+
+	TDriveInfo 	driveInfo;
+	User::LeaveIfError(FsL().Drive(driveInfo, aDriveNum));
+
+	TVolumeInfo volInfo;
+	User::LeaveIfError(Fs().Volume(volInfo, aDriveNum));
+
+	if (iVerbose || (iDriveLetter == NULL))
+		{
+		buf->AppendFormatL(_L("Drive:\t%c:\r\n"), 'A'+ aDriveNum);
+		}
+
+	if (iVerbose)
+		{
+		buf->AppendFormatL(_L("Number:\t%d\r\n"), aDriveNum);
+
+		TBuf<256> tbuf;
+		if (Fs().FileSystemName(tbuf, aDriveNum) == KErrNone)
+			{
+			buf->AppendFormatL(_L("FS name:\t\'%S\'\r\n"), &tbuf);
+			}
+
+		FormatDrvMediaTypeInfoL(driveInfo, *buf);
+		buf->AppendFormatL(_L("BatteryState:\t%d\r\n"),driveInfo.iBattery);
+		FormatDriveAttInfoL(driveInfo, *buf);
+		FormatMediaAttInfoL(driveInfo, *buf);
+		}
+
+	FormatVolInfoL(volInfo, *buf);
+
+	CTextFormatter* formatter = CTextFormatter::NewLC(Stdout());
+	formatter->TabulateL(0, 2, buf->Descriptor());
+	Write(formatter->Descriptor());
+
+	CleanupStack::PopAndDestroy(2, buf);
+	}
+
+const TDesC& CCmdDrvinfo::Name() const
+	{
+	_LIT(KName, "drvinfo");	
+	return KName;
+	}
+
+void CCmdDrvinfo::DoRunL()
+	{
+	TInt driveNum = -1;
+
+	if (iDriveLetter)
+		{
+		const TInt len = iDriveLetter->Length();
+
+		if ((len < 2) || (len > 3) || ((*iDriveLetter)[1] != ':'))
+			{
+			ArgumentErrorL();
+			}
+
+		if ((len == 3) && ((*iDriveLetter)[2] != '\\'))
+			{
+			ArgumentErrorL();
+			}
+
+		driveNum = TChar((*iDriveLetter)[0]).GetUpperCase() - 'A';
+
+		if (driveNum > EDriveZ)
+			{
+			ArgumentErrorL();
+			}
+		}
+
+
+	TDriveList driveList;
+	User::LeaveIfError(FsL().DriveList(driveList));
+
+	if (driveNum >= 0)
+		{
+		if (!driveList[driveNum])
+			{
+			ArgumentErrorL();
+			}
+
+		PrintDriveInfoL(driveNum);
+		}
+	else
+		{
+		for (TInt i = 0; i < KMaxDrives; ++i)
+			{
+			if (driveList[i])
+				{
+				TRAPD(err, PrintDriveInfoL(i));
+				if (err)
+					{
+					PrintWarning(_L("Couldn't read drive info for %c"), 'A'+ i);
+					}
+				Printf(_L("\r\n"));
+				}
+			}
+		}
+	}
+
+void CCmdDrvinfo::ArgumentsL(RCommandArgumentList& aArguments)
+	{
+	_LIT(KArg, "drive_letter");
+	aArguments.AppendStringL(iDriveLetter, KArg);
+	}
+
+void CCmdDrvinfo::OptionsL(RCommandOptionList& aOptions)
+	{
+	_LIT(KOptVerbose, "verbose");
+	_LIT(KOptHuman, "human");
+
+	aOptions.AppendBoolL(iVerbose, KOptVerbose);
+	aOptions.AppendBoolL(iHuman, KOptHuman);
+	}
+
+
+EXE_BOILER_PLATE(CCmdDrvinfo)
+