libraries/btrace_parser/src/btrace_keypress.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/btrace_parser/src/btrace_keypress.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,278 @@
+// btrace_keypress.cpp
+// 
+// Copyright (c) 2008 - 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/ltkutils.h>
+#include "btrace_parser.h"
+
+EXPORT_C CBtraceKeyPress* CBtraceKeyPress::NewL(CBtraceReader& aReader)
+	{
+	CBtraceKeyPress* self = new (ELeave) CBtraceKeyPress(aReader);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CBtraceKeyPress::CBtraceKeyPress(CBtraceReader& aReader): 
+iReader(aReader)
+	{
+	}
+
+EXPORT_C CBtraceKeyPress::~CBtraceKeyPress()
+	{
+	iReader.RemoveObserver(KAmTraceCategory, *this);
+	iKeyNotifs.Close();
+	iPointerNotifs.Close();
+	iGenericNotifs.Close();
+	iRawKeyNotifs.Close();
+	}
+
+void CBtraceKeyPress::ConstructL()
+	{
+	iReader.AddObserverL(KAmTraceCategory, *this);
+	
+	LtkUtils::W32CrackL(); // In case no-one's called it yet
+	}
+
+//
+// CBtraceKeyPress::HandleBtraceFrameL
+// process the btrace frame, stripping out the key event data
+//
+void CBtraceKeyPress::HandleBtraceFrameL(const TBtraceFrame& aFrame)
+	{
+	if(aFrame.iCategory == KAmTraceCategory && aFrame.iSubCategory == EAmTraceSubCategoryEvCapture)
+		{
+		const TUint32* data = reinterpret_cast<const TUint32*>(aFrame.iData.Ptr());
+		const TAmTraceEventEvCapture event = static_cast<TAmTraceEventEvCapture>(*data++);
+			
+		switch(event)
+			{
+			case EAmTraceEventEvCaptureKeyPress:
+				{
+				data += 1; // step over superfluous bytes
+				TKeyEvent* key = (TKeyEvent*) data;
+				SeenKeyL(aFrame.iTickCount, *key);
+				}
+			break;
+	
+			case EAmTraceEventEvCapturePointer:
+				{
+				data += 1; // step over superfluous bytes
+				TPointerEvent* pointer = (TPointerEvent*) data;
+				SeenPointerL(aFrame.iTickCount, *pointer);			
+				}
+			break;
+	
+			case EAmTraceEventEvCaptureUnclassified:
+				{
+				TInt commandClass = *data++;
+				TInt opcode = *data++;
+				SeenUnclassifiedL(aFrame.iTickCount, commandClass, opcode, NULL);
+				}
+				break;
+			
+			case EAmTraceEventEvCaptureRawScan:
+				{
+				TBool isKeyUp = *data++;
+				TInt scanCode = *data++;
+				SeenRawKeyL(aFrame.iTickCount, isKeyUp, scanCode);
+				}
+			break;
+
+			default:
+				// Ignore anything we don't know about.
+			break;
+			}
+		};
+	}
+
+//
+// CBtraceKeyPress::SeenKeyL
+// inform any observers that a key event has occured 
+// & pass a reference back to the key event
+//
+void CBtraceKeyPress::SeenKeyL(const TBtraceTickCount& aTickCount, const TKeyEvent& aKey)
+	{
+	TInt ii = iKeyNotifs.Count();
+	while (--ii >= 0)
+		{
+		MBtraceKeyPressObserver* observer = iKeyNotifs[ii].iObserver;
+		if (iKeyNotifs[ii].iPersistence == ENotificationOneShot)
+			{
+			iKeyNotifs.Remove(ii);
+			}
+		observer->HandleKeyPressL(aTickCount, aKey);
+		}	
+	}
+
+void CBtraceKeyPress::SeenRawKeyL(const TBtraceTickCount& aTickCount, TBool aKeyUp, TInt aScanCode)
+	{
+	TInt ii = iRawKeyNotifs.Count();
+	while (--ii >= 0)
+		{
+		MBtraceKeyPressObserver* observer = iRawKeyNotifs[ii].iObserver;
+		if (iRawKeyNotifs[ii].iPersistence == ENotificationOneShot)
+			{
+			iRawKeyNotifs.Remove(ii);
+			}
+		observer->HandleRawKeyL(aTickCount, aKeyUp, aScanCode);
+		}
+	}
+
+//
+// CBtraceKeyPress::SeenPointerL
+// inform any observers that a key event has occured 
+// & pass a reference back to the key event
+//
+void CBtraceKeyPress::SeenPointerL(const TBtraceTickCount& aTickCount, const TPointerEvent& aPointer)
+	{
+	TInt ii = iPointerNotifs.Count();
+	while (--ii >= 0)
+		{
+		MBtraceKeyPressObserver* observer = iPointerNotifs[ii].iObserver;
+		if (iPointerNotifs[ii].iPersistence == ENotificationOneShot)
+			{
+			iPointerNotifs.Remove(ii);
+			}
+		observer->HandlePointerPressL(aTickCount, aPointer);
+		}	
+	}
+
+//
+// CBtraceKeyPress::SeenUnclassifiedL
+// inform any observers that unknown/unclassified data 
+// has been received for a specific opcode
+void CBtraceKeyPress::SeenUnclassifiedL(const TBtraceTickCount& aTickCount, const TInt aCommandClass, const TInt aOpcode, const TAny* aData)
+	{
+	TInt ii = iGenericNotifs.Count();
+	while (--ii >= 0)
+		{
+		MBtraceKeyPressObserver* observer = iGenericNotifs[ii].iObserver;
+		if (iGenericNotifs[ii].iPersistence == ENotificationOneShot)
+			{
+			iGenericNotifs.Remove(ii);
+			}
+		observer->HandleUnclassifiedDataL(aTickCount, aCommandClass, aOpcode, aData);
+		}	
+	}
+
+//
+// CBtraceKeyPress::NotifyKeyEvent
+// called by the client to register an 
+// interest in any key events captured 
+//
+EXPORT_C void CBtraceKeyPress::NotifyKeyEventL(MBtraceKeyPressObserver& aObserver)
+	{
+	NotifyKeyEventL(aObserver, ENotificationOneShot);
+	}
+	
+EXPORT_C void CBtraceKeyPress::NotifyKeyEventL(MBtraceKeyPressObserver& aObserver, TBtraceNotificationPersistence aPersistence)
+	{
+	TKeyPressNotif notify(aObserver, aPersistence);
+	User::LeaveIfError(iKeyNotifs.Append(notify));
+	}
+	
+EXPORT_C void CBtraceKeyPress::CancelNotifyKeyEvent(MBtraceKeyPressObserver& aObserver)
+	{
+	for (TInt i=iKeyNotifs.Count()-1; i>=0; --i)
+		{
+		if (iKeyNotifs[i].iObserver == &aObserver)
+			{
+			iKeyNotifs.Remove(i);
+			}
+		}
+	}
+
+EXPORT_C void CBtraceKeyPress::NotifyRawKeyEventL(MBtraceKeyPressObserver& aObserver)
+	{
+	NotifyRawKeyEventL(aObserver, ENotificationOneShot);
+	}
+	
+EXPORT_C void CBtraceKeyPress::NotifyRawKeyEventL(MBtraceKeyPressObserver& aObserver, TBtraceNotificationPersistence aPersistence)
+	{
+	TKeyPressNotif notify(aObserver, aPersistence);
+	User::LeaveIfError(iRawKeyNotifs.Append(notify));
+	}
+
+EXPORT_C void CBtraceKeyPress::CancelNotifyRawKeyEvent(MBtraceKeyPressObserver& aObserver)
+	{
+	for (TInt i=iRawKeyNotifs.Count()-1; i>=0; --i)
+		{
+		if (iRawKeyNotifs[i].iObserver == &aObserver)
+			{
+			iRawKeyNotifs.Remove(i);
+			}
+		}
+	}
+
+//
+// CBtraceKeyPress::NotifyPointerEvent
+// called by the client to register an 
+// interest in any pointer events captured 
+//
+EXPORT_C void CBtraceKeyPress::NotifyPointerEventL(MBtraceKeyPressObserver& aObserver)
+	{
+	NotifyPointerEventL(aObserver, ENotificationOneShot);
+	}
+	
+EXPORT_C void CBtraceKeyPress::NotifyPointerEventL(MBtraceKeyPressObserver& aObserver, TBtraceNotificationPersistence aPersistence)
+	{
+	TKeyPressNotif notify(aObserver, aPersistence);
+	User::LeaveIfError(iPointerNotifs.Append(notify));
+	}
+
+EXPORT_C void CBtraceKeyPress::CancelNotifyPointerEvent(MBtraceKeyPressObserver& aObserver)
+	{
+	for (TInt i=iPointerNotifs.Count()-1; i>=0; --i)
+		{
+		if (iPointerNotifs[i].iObserver == &aObserver)
+			{
+			iPointerNotifs.Remove(i);
+			}
+		}
+	}
+
+//
+// CBtraceKeyPress::NotifyUnclassifiedDataL
+// called by the client to register an 
+// interest in any 'generic' events captured 
+//
+EXPORT_C void CBtraceKeyPress::NotifyUnclassifiedDataL(MBtraceKeyPressObserver& aObserver)
+	{
+	NotifyUnclassifiedDataL(aObserver, ENotificationOneShot);
+	}
+
+EXPORT_C void CBtraceKeyPress::NotifyUnclassifiedDataL(MBtraceKeyPressObserver& aObserver, TBtraceNotificationPersistence aPersistence)
+	{
+	TKeyPressNotif notify(aObserver, aPersistence);
+	User::LeaveIfError(iGenericNotifs.Append(notify));	
+	}
+
+EXPORT_C void CBtraceKeyPress::CancelNotifyUnclassifiedData(MBtraceKeyPressObserver& aObserver)
+	{
+	for (TInt i=iGenericNotifs.Count()-1; i>=0; --i)
+		{
+		if (iGenericNotifs[i].iObserver == &aObserver)
+			{
+			iGenericNotifs.Remove(i);
+			}
+		}
+	}
+
+//
+// TKeyPressNotif
+// place holder for observers interested in key &/or pointer events
+//
+CBtraceKeyPress::TKeyPressNotif::TKeyPressNotif(MBtraceKeyPressObserver& aObserver, TBtraceNotificationPersistence aPersistence):
+iObserver(&aObserver), iPersistence(aPersistence)
+	{
+	}