commands/input/input.cpp
changeset 95 b3ffff030d5c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/input/input.cpp	Thu Oct 28 16:54:54 2010 +0100
@@ -0,0 +1,217 @@
+// input.cpp
+// 
+// Copyright (c) 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 <e32keys.h>
+#include <fshell/ioutils.h>
+#include <fshell/common.mmh>
+#include <fshell/ltkutils.h>
+
+using namespace IoUtils;
+
+
+class TKeyMapping
+	{
+public:
+	TUint16 iConsoleKey;
+	TUint16 iScanCode;
+	TUint16 iModifiers;
+#ifdef __WINS__
+	const TText* iLabel;
+#else
+	const wchar_t* iLabel;
+#endif
+	};
+
+const TKeyMapping KKeyMappings[] = 
+	{
+		{ '0', '0',	0, L"Zero" },
+		{ '1', '1',	0, L"One" },
+		{ '2', '2',	0, L"Two" },
+		{ '3', '3',	0, L"Three" },
+		{ '4', '4',	0, L"Four" },
+		{ '5', '5',	0, L"Five" },
+		{ '6', '6',	0, L"Six" },
+		{ '7', '7',	0, L"Seven" },
+		{ '8', '8',	0, L"Eight" },
+		{ '9', '9',	0, L"Nine" },
+		{ '*', '*',	0, L"Star" },
+		{ '#', '#',	0, L"Hash" },
+		{ EKeyUpArrow, EStdKeyUpArrow,	0, L"Up" },
+		{ EKeyDownArrow, EStdKeyDownArrow,	0, L"Down" },
+		{ EKeyLeftArrow, EStdKeyLeftArrow,	0, L"Left" },
+		{ EKeyRightArrow, EStdKeyRightArrow,	0, L"Right" },
+#ifdef LTK_PLATFORM_DCM
+		{ EKeyEnter, 167,	0, L"Enter" },
+		{ 'o', 164,	0, L"Menu" },
+		{ 'p', 165,	0, L"Camera" },
+		{ 'l', 228,	0, L"Mail" },
+		{ ';', 229,	0, L"IMode" },
+		{ ',', 196,	0, L"Call" },
+		{ '.', EStdKeyBackspace, 0, L"Clear" },
+		{ '/', 197,	0, L"End" },
+		{ 'm', 230,	0, L"Multi" },
+#endif
+	};
+const TInt KNumKeyMappings = sizeof(KKeyMappings) / sizeof(TKeyMapping);
+
+
+class CCmdInput : public CCommandBase
+	{
+public:
+	static CCommandBase* NewLC();
+	~CCmdInput();
+private:
+	CCmdInput();
+	void ShowKeyMappings();
+	void SimulateKeyL(TInt aConsoleKey);
+private: // From CCommandBase.
+	virtual const TDesC& Name() const;
+	virtual void DoRunL();
+	virtual void ArgumentsL(RCommandArgumentList& aArguments);
+	virtual void OptionsL(RCommandOptionList& aOptions);
+private:
+	TUint iConsoleKey;
+	TBool iShow;
+	TUint iScanCode;
+	TUint iModifiers;
+	};
+
+EXE_BOILER_PLATE(CCmdInput)
+
+CCommandBase* CCmdInput::NewLC()
+	{
+	CCmdInput* self = new(ELeave) CCmdInput();
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	return self;
+	}
+
+CCmdInput::~CCmdInput()
+	{
+	}
+
+CCmdInput::CCmdInput()
+	{
+	}
+
+void CCmdInput::ShowKeyMappings()
+	{
+	IoUtils::CTextBuffer* buf = IoUtils::CTextBuffer::NewLC(0x100);
+
+	buf->AppendL(_L("Input key\tScan Code\tModifiers\tLabel\r\n"));
+	for (TInt i = 0; i < KNumKeyMappings; ++i)
+		{
+		const TKeyMapping& mapping = KKeyMappings[i];
+		if (mapping.iConsoleKey == EKeyUpArrow)
+			{
+			buf->AppendFormatL(_L("Up (0x%x)\t0x%x\t0x%x\t%s\r\n"), mapping.iConsoleKey, mapping.iScanCode, mapping.iModifiers, mapping.iLabel);
+			}
+		else if (mapping.iConsoleKey == EKeyDownArrow)
+			{
+			buf->AppendFormatL(_L("Down (0x%x)\t0x%x\t0x%x\t%s\r\n"), mapping.iConsoleKey, mapping.iScanCode, mapping.iModifiers, mapping.iLabel);
+			}
+		else if (mapping.iConsoleKey == EKeyLeftArrow)
+			{
+			buf->AppendFormatL(_L("Left (0x%x)\t0x%x\t0x%x\t%s\r\n"), mapping.iConsoleKey, mapping.iScanCode, mapping.iModifiers, mapping.iLabel);
+			}
+		else if (mapping.iConsoleKey == EKeyRightArrow)
+			{
+			buf->AppendFormatL(_L("Right (0x%x)\t0x%x\t0x%x\t%s\r\n"), mapping.iConsoleKey, mapping.iScanCode, mapping.iModifiers, mapping.iLabel);
+			}
+		else if (mapping.iConsoleKey == EKeyEnter)
+			{
+			buf->AppendFormatL(_L("Enter (0x%x)\t0x%x\t0x%x\t%s\r\n"), mapping.iConsoleKey, mapping.iScanCode, mapping.iModifiers, mapping.iLabel);
+			}
+		else
+			{
+			buf->AppendFormatL(_L("%c (0x%x)\t0x%x\t0x%x\t%s\r\n"), mapping.iConsoleKey, mapping.iConsoleKey, mapping.iScanCode, mapping.iModifiers, mapping.iLabel);
+			}
+		}
+
+	CTextFormatter* formatter = CTextFormatter::NewLC(Stdout());
+	formatter->TabulateL(0, 2, buf->Descriptor());
+	Write(formatter->Descriptor());
+
+	CleanupStack::PopAndDestroy(2, buf);
+	}
+
+void CCmdInput::SimulateKeyL(TInt aConsoleKey)
+	{
+	for (TInt i = 0; i < KNumKeyMappings; ++i)
+		{
+		const TKeyMapping& mapping = KKeyMappings[i];
+		if (aConsoleKey == mapping.iConsoleKey)
+			{
+			LtkUtils::InjectRawKeyEvent(mapping.iScanCode, mapping.iModifiers, 0);
+			break;
+			}
+		}
+	}
+
+const TDesC& CCmdInput::Name() const
+	{
+	_LIT(KName, "input");	
+	return KName;
+	}
+
+void CCmdInput::ArgumentsL(RCommandArgumentList& aArguments)
+	{
+	aArguments.AppendUintL(iConsoleKey, _L("key"));
+	}
+
+void CCmdInput::OptionsL(RCommandOptionList& aOptions)
+	{
+	aOptions.AppendBoolL(iShow, _L("show"));
+	aOptions.AppendUintL(iScanCode, _L("scan-code"));
+	aOptions.AppendUintL(iModifiers, _L("modifiers"));
+	}
+
+void CCmdInput::DoRunL()
+	{
+	if (iShow)
+		{
+		ShowKeyMappings();
+		}
+	else if (iOptions.IsPresent(&iScanCode))
+		{
+		LtkUtils::InjectRawKeyEvent(iScanCode, iModifiers, 0);
+		}
+	else
+		{
+		if (iArguments.IsPresent(&iConsoleKey))
+			{
+			SimulateKeyL(iConsoleKey);
+			}
+		else
+			{
+			RIoConsoleReadHandle& stdin = Stdin();
+			stdin.SetReadModeL(RIoReadHandle::EFull);
+			TBuf<1> buf;
+			TInt err = KErrNone;
+			while (err == KErrNone)
+				{
+				err = stdin.Read(buf);
+				if (err == KErrNone)
+					{
+					if (buf[0] == 'q')
+						{
+						break;
+						}
+					else
+						{
+						SimulateKeyL(buf[0]);
+						}
+					}
+				}
+			}
+		}
+	}