commands/hal/hal.cpp
changeset 0 7f656887cf89
child 54 ea6622dea85a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/hal/hal.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,196 @@
+// hal.cpp
+// 
+// Copyright (c) 2009 - 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 <fshell/ioutils.h>
+#include <hal.h>
+#include <fshell/common.mmh>
+#include <fshell/ltkhal.h>
+
+using namespace IoUtils;
+
+_LIT(KDefaultDumpFileName, "c:\\private\\102825B1\\HAL.DAT");
+
+class CCmdHal : public CCommandBase
+	{
+public:
+	static CCommandBase* NewLC();
+	~CCmdHal();
+private:
+	CCmdHal();
+private: // From CCommandBase.
+	virtual const TDesC& Name() const;
+	virtual void DoRunL();
+	virtual void ArgumentsL(RCommandArgumentList& aArguments);
+	virtual void OptionsL(RCommandOptionList& aOptions);
+private:
+	enum 
+		{
+		EList,
+		EGet,
+		ESet,
+		EDumpFile
+		} iOperation;
+	HAL::TAttribute iAttribute;
+	TInt iValue;
+	TInt iDeviceNumber;
+	TFileName2 iDumpFileName;
+	};
+
+
+CCommandBase* CCmdHal::NewLC()
+	{
+	CCmdHal* self = new(ELeave) CCmdHal();
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	return self;
+	}
+
+CCmdHal::~CCmdHal()
+	{
+	}
+
+CCmdHal::CCmdHal() : iDumpFileName(KDefaultDumpFileName)
+	{
+	}
+
+const TDesC& CCmdHal::Name() const
+	{
+	_LIT(KName, "hal");	
+	return KName;
+	}
+
+void CCmdHal::DoRunL()
+	{
+	switch (iOperation)
+		{
+		case EGet:
+			{
+			if (!iArguments.IsPresent(1))
+				{
+				LeaveIfErr(KErrArgument, _L("Attribute to get not specified"));
+				}
+			LtkUtils::CHalAttribute* attrib = NULL;
+			if (iOptions.IsPresent(&iDeviceNumber))
+				{
+				TRAPL(attrib = LtkUtils::GetHalInfoL(iDeviceNumber, iAttribute), _L("Couldn't get attribute value"));
+				}
+			else
+				{
+				TRAPL(attrib = LtkUtils::GetHalInfoL(iAttribute), _L("Couldn't get attribute value"));
+				}
+			Printf(_L("%S: %S\r\n"), &attrib->iAttributeName, attrib->iDescription);
+			delete attrib;
+			}
+			break;
+		case ESet:
+			{
+			if (!iArguments.IsPresent(1))
+				{
+				LeaveIfErr(KErrArgument, _L("Attribute to set not specified"));
+				}
+			if (!iArguments.IsPresent(2))
+				{
+				LeaveIfErr(KErrArgument, _L("Attribute value to set not specified"));
+				}
+			if (iOptions.IsPresent(&iDeviceNumber))
+				{
+				LeaveIfErr(HAL::Set(iDeviceNumber, iAttribute, iValue), _L("Couldn't set attribute"));
+				}
+			else
+				{
+				LeaveIfErr(HAL::Set(iAttribute, iValue), _L("Couldn't set attribute"));
+				}
+			}
+			break;
+		case EList:
+			{
+			RPointerArray<LtkUtils::CHalAttribute> attribs;
+			LtkUtils::GetHalInfoL(attribs);
+			for (TInt i = 0; i < attribs.Count(); ++i)
+				{
+				LtkUtils::CHalAttribute& attrib = *attribs[i];
+				Printf(_L("%4d %S: %S\r\n"), attrib.iAttribute, &attrib.iAttributeName, attrib.iDescription);
+				}
+			attribs.ResetAndDestroy();
+			}
+			break;
+		case EDumpFile:
+			{
+			if (!iOptions.IsPresent(&iDumpFileName))
+				{
+#ifdef FSHELL_9_1_SUPPORT
+				TInt ch = 'c';
+				HAL::Get(HAL::ESystemDrive, ch);
+				iDumpFileName[0] = 'A' + ch;
+#else
+				iDumpFileName[0] = 'A' + static_cast<TInt>(RFs::GetSystemDrive());
+#endif
+				}
+			RFile file;
+			LeaveIfErr(file.Open(FsL(), iDumpFileName, EFileRead), _L("Couldn't open \"%S\" for reading"), &iDumpFileName);
+			CleanupClosePushL(file);
+
+			TInt fileSize;
+			LeaveIfErr(file.Size(fileSize), _L("Couldn't find the size of \"%S\""), &iDumpFileName);
+
+			RBuf8 buf;
+			buf.Create(fileSize);
+			buf.CleanupClosePushL();
+
+			LeaveIfErr(file.Read(buf), _L("Couldn't read \"%S\""), &iDumpFileName);
+
+			TInt32* p = (TInt32*)buf.Ptr();
+			TInt32* pE = p + (fileSize / sizeof(TInt32)) - 1;
+			Printf(_L("Machine UID: 0x%08x\r\n"), *p++);
+			Printf(_L("Type prefix: 0x%08x\r\n"), *p++);
+
+			while (p < pE)
+				{
+				TInt attribute = *p++;
+				TInt deviceNumber = (TUint)attribute >> 24;
+				attribute &= 0xFFFFFF;
+				TInt value = *p++;
+				LtkUtils::CHalAttribute* attrib = LtkUtils::GetHalInfoForValueL(deviceNumber, attribute, value);
+				Printf(_L("%4d %S[%d]: %S\r\n"), attrib->iAttribute, &attrib->iAttributeName, deviceNumber, attrib->iDescription);
+				delete attrib;
+				}
+
+			CleanupStack::PopAndDestroy(2, &file);
+			}
+			break;
+		}
+	}
+
+void CCmdHal::ArgumentsL(RCommandArgumentList& aArguments)
+	{
+	_LIT(KArgOperation, "operation");
+	aArguments.AppendEnumL((TInt&)iOperation, KArgOperation);
+
+	_LIT(KArgAttribute, "attribute");
+	aArguments.AppendUintL((TUint&)iAttribute, KArgAttribute);
+
+	_LIT(KArgValue, "value");
+	aArguments.AppendIntL(iValue, KArgValue);
+	}
+
+void CCmdHal::OptionsL(RCommandOptionList& aOptions)
+	{
+	_LIT(KOptDevice, "device");
+	aOptions.AppendIntL(iDeviceNumber, KOptDevice);
+
+	_LIT(KOptDumpFileName, "dump-file-name");
+	aOptions.AppendFileNameL(iDumpFileName, KOptDumpFileName);
+	}
+
+
+EXE_BOILER_PLATE(CCmdHal)
+