commands/ecom/ecom.cpp
changeset 0 7f656887cf89
child 73 dc41da2f70a4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/ecom/ecom.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,151 @@
+// ecom.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/memoryaccesscmd.h>
+#include <ecom/ecom.h>
+#include <fshell/ltkutils.h>
+
+using namespace IoUtils;
+
+class CCmdEcom : public CMemoryAccessCommandBase
+	{
+public:
+	static CCommandBase* NewLC();
+	~CCmdEcom();
+private:
+	CCmdEcom();
+private: // From CCommandBase.
+	virtual const TDesC& Name() const;
+	virtual void DoRunL();
+	virtual void ArgumentsL(RCommandArgumentList& aArguments);
+	virtual void OptionsL(RCommandOptionList& aOptions);
+private:
+	enum TCmd
+		{
+		EList,
+		ECreate,
+		};
+	TCmd iCmd;
+	TUint iUid;
+	TBool iVerbose;
+	};
+
+
+CCommandBase* CCmdEcom::NewLC()
+	{
+	CCmdEcom* self = new(ELeave) CCmdEcom();
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	return self;
+	}
+
+CCmdEcom::~CCmdEcom()
+	{
+	REComSession::FinalClose();
+	}
+
+CCmdEcom::CCmdEcom()
+	{
+	}
+
+const TDesC& CCmdEcom::Name() const
+	{
+	_LIT(KName, "ecom");	
+	return KName;
+	}
+
+void CCmdEcom::ArgumentsL(RCommandArgumentList& aArguments)
+	{
+	aArguments.AppendEnumL((TInt&)iCmd, _L("command"));
+	aArguments.AppendUintL(iUid, _L("uid"));
+	}
+
+void CCmdEcom::OptionsL(RCommandOptionList& aOptions)
+	{
+	aOptions.AppendBoolL(iVerbose, _L("verbose"));
+	}
+
+
+EXE_BOILER_PLATE(CCmdEcom)
+
+void CCmdEcom::DoRunL()
+	{
+	TUid uid = TUid::Uid(iUid);
+	if (iCmd == EList)
+		{
+		RImplInfoPtrArray impls;
+		LtkUtils::CleanupResetAndDestroyPushL(impls);
+		TRAPL(REComSession::ListImplementationsL(uid, impls), _L("Couldn't ListImplementations for 0x%x"), iUid);
+		if (impls.Count() == 0)
+			{
+			Printf(_L("No implementations found."));
+			}
+		else
+			{
+			for (TInt i = 0; i < impls.Count(); i++)
+				{
+				const CImplementationInformation* info = impls[i];
+				Printf(_L("0x%x: %S"), info->ImplementationUid(), &info->DisplayName());
+				TInt version = info->Version();
+				if (version != 1)
+					{
+					Printf(_L(" (v%d)"), version);
+					}
+				if (iVerbose)
+					{
+					Printf(_L("\r\nRomOnly=%d RomBased=%d Drive=%c Disabled=%d"), info->RomOnly(), info->RomBased(), 'A' + (TInt)info->Drive(), info->Disabled());
+					if (info->DataType().Length())
+						{
+						Printf(_L8("\r\nDataType: %S"), &info->DataType());
+						}
+					if (info->OpaqueData().Length())
+						{
+						Printf(_L("\r\nOpaqueData:\r\n"));
+						LtkUtils::HexDumpToOutput(info->OpaqueData(), Stdout());
+						}
+					Printf(_L("\r\n"));
+					}
+				Printf(_L("\r\n"));
+				}
+			}
+		CleanupStack::PopAndDestroy(&impls);
+		}
+	else if (iCmd == ECreate)
+		{
+		TUid implKey; // We don't care about this
+		TAny* impl = NULL;
+		TRAPL(impl = REComSession::CreateImplementationL(uid, implKey), _L("Couldn't instanciate plugin uid 0x%x"), iUid);
+		if (impl == NULL) LeaveIfErr(KErrGeneral, _L("Plugin returned NULL implementation pointer!"));
+		Printf(_L("Instanciated plugin 0x%x ok.\r\n"), iUid);
+
+#ifdef FSHELL_MEMORY_ACCESS_SUPPORT
+		if (iVerbose)
+			{
+			LoadMemoryAccessL();
+			
+			TAny* vtablePtr = *(TAny**)impl;
+			TFullName8 dllName;
+			TInt res = iMemAccess.FindAddressInCodeSegments(dllName, vtablePtr);
+			if (res < 0)
+				{
+				PrintError(res, _L("Couldn't find vtable address in code segments"));
+				}
+			else
+				{
+				Printf(_L8("Implementation is probably from DLL %S at offset %d.\r\n"), &dllName, res);
+				}
+			}
+#endif
+
+		User::Exit(KErrNone); // Don't even try and clean up - the plugin would probably crash if we did
+		}
+	}