diff -r 000000000000 -r 7f656887cf89 commands/hal/hal.cpp --- /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 +#include +#include +#include + +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 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(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) +