--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/TClick/multiptrclick.cpp Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,246 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Test Multi Pointer Click Plug-In DLL
+//
+//
+
+#include <e32std.h>
+#include "W32CLICK.H"
+#include "multiptrclick.h"
+
+class CMultiPtrClickMaker : public CClickMaker
+ {
+ enum {EEventBufferSize=32};
+public:
+ ~CMultiPtrClickMaker();
+ void ConstructL();
+ //Virtual function from CClickMaker
+ void KeyEvent(TEventCode aType, const TKeyEvent& aEvent);
+ void PointerEvent(const TPointerEvent& aEvent);
+ void OtherEvent(TInt aType, TAny* aParam);
+ TInt CommandReplyL(TInt aOpcode, TAny *aArgs);
+
+private:
+ TInt AddEvent(const TWsEvent* aEvent);
+ TInt AddEvent(const TPointerEventData* aEvent);
+ TBool ComparePointerEvents(const TPointerEvent* aExpectedEvent, const TPointerEvent* aActualEvent);
+ TBool CompareOtherEvents(const TPointerEventData* aExpectedEvent, const TPointerEventData* aActualEvent);
+private:
+ CCirBuf<TWsEvent> iPtrEventBuffer;
+ CCirBuf<TPointerEventData> iOtherEventBuffer;
+ TBuf<255> iErrorDes;
+ TInt iPtrEventCount;
+ TInt iOtherEventCount;
+ TInt iError;
+ };
+
+
+void CMultiPtrClickMaker::ConstructL()
+ {
+ iPtrEventBuffer.SetLengthL(EEventBufferSize);
+ iOtherEventBuffer.SetLengthL(EEventBufferSize);
+ }
+
+CMultiPtrClickMaker::~CMultiPtrClickMaker()
+ {
+ }
+
+void CMultiPtrClickMaker::KeyEvent(TEventCode /*aType*/,const TKeyEvent& /*aEvent*/)
+ {
+ }
+
+TBool CMultiPtrClickMaker::ComparePointerEvents(const TPointerEvent* aExpectedEvent, const TPointerEvent* aActualEvent)
+ {
+ // Check pointer type
+ if (aExpectedEvent->iType != aActualEvent->iType)
+ {
+ _LIT(KEventType, "Actual Wserv Event type = %d Expected Wserv Event Type = %d ");
+ iErrorDes.Format(KEventType, aActualEvent->iType, aExpectedEvent->iType);
+ return EFalse;
+ }
+
+ if (aExpectedEvent->iPosition != aActualEvent->iPosition)
+ {
+ _LIT(KPointerPosition, "Actual PointerPosition = (%d, %d) Expected PointerPosition = (%d, %d) ");
+ iErrorDes.Format(KPointerPosition, aActualEvent->iPosition.iX, aActualEvent->iPosition.iY, aExpectedEvent->iPosition.iX, aExpectedEvent->iPosition.iY);
+ return EFalse;
+ }
+
+ if (aExpectedEvent->iParentPosition != aActualEvent->iParentPosition)
+ {
+ _LIT(KPointerPosition, "Actual parent Position = (%d, %d) Expected parent Position = (%d, %d) ");
+ iErrorDes.Format(KPointerPosition, aActualEvent->iParentPosition.iX, aActualEvent->iParentPosition.iY, aExpectedEvent->iParentPosition.iX, aExpectedEvent->iParentPosition.iY);
+ return EFalse;
+ }
+
+ if (aExpectedEvent->IsAdvancedPointerEvent() != aActualEvent->IsAdvancedPointerEvent())
+ {
+ _LIT(KPointerPosition, "Actual event is TAdvancedPointerEvent = %d Expected event is TAdvancedPointerEvent = %d ");
+ iErrorDes.Format(KPointerPosition, aActualEvent->IsAdvancedPointerEvent(), aExpectedEvent->IsAdvancedPointerEvent());
+ return EFalse;
+ }
+
+ if (aExpectedEvent->IsAdvancedPointerEvent())
+ {
+ const TAdvancedPointerEvent& expectedAdvancedEvent = *aExpectedEvent->AdvancedPointerEvent();
+ const TAdvancedPointerEvent& actualAdvancedEvent = *aActualEvent->AdvancedPointerEvent();
+
+ if (expectedAdvancedEvent.PointerNumber() != actualAdvancedEvent.PointerNumber())
+ {
+ _LIT(KPointerNumber, "Actual PointerNumber = %d Expected PointerNumber = %d ");
+ iErrorDes.Format(KPointerNumber, actualAdvancedEvent.PointerNumber(), expectedAdvancedEvent.PointerNumber());
+ return EFalse;
+ }
+
+ if (expectedAdvancedEvent.Pressure() != actualAdvancedEvent.Pressure())
+ {
+ _LIT(KPointerPressure, "Actual Pressure = %d Expected Pressure = %d ");
+ iErrorDes.Format(KPointerPressure, actualAdvancedEvent.Pressure(), expectedAdvancedEvent.Pressure());
+ return EFalse;
+ }
+
+ if (expectedAdvancedEvent.Proximity() != actualAdvancedEvent.Proximity())
+ {
+ _LIT(KPointerProximity, "Actual Proximity = %d Expected Proximity = %d ");
+ iErrorDes.Format(KPointerProximity, actualAdvancedEvent.Proximity(), expectedAdvancedEvent.Proximity());
+ return EFalse;
+ }
+ }
+
+ return ETrue;
+ }
+
+//
+void CMultiPtrClickMaker::PointerEvent(const TPointerEvent& aEvent)
+ {
+ // If it has already failed then do not test other events
+ // becasue the error value and its descriptor will be over written
+ if (iError)
+ {
+ return;
+ }
+
+ // Get pointer event from buffer
+ TWsEvent expectedEvent;
+ iPtrEventBuffer.Remove(&expectedEvent);
+
+ // Increment event count
+ iPtrEventCount++;
+
+ // increment this counter in OtherEvent() becasue first pointer event iscalled and then OtherEvent() is called
+ if (!ComparePointerEvents(expectedEvent.Pointer(), &aEvent))
+ {
+ iError = iPtrEventCount;
+ }
+ }
+
+TBool CMultiPtrClickMaker::CompareOtherEvents(const TPointerEventData* aExpectedEvent, const TPointerEventData* aActualEvent)
+ {
+ if (aExpectedEvent->iCurrentPos != aActualEvent->iCurrentPos)
+ {
+ _LIT(KCurrentPosition, "Actual CurrentPosition w.r.t screen = (%d,%d) Expected CurrentPosition w.r.t screen = (%d,%d)");
+ iErrorDes.Copy(KCurrentPosition);
+ iErrorDes.Format(KCurrentPosition, aActualEvent->iCurrentPos.iX, aActualEvent->iCurrentPos.iX, aExpectedEvent->iCurrentPos.iX, aExpectedEvent->iCurrentPos.iY);
+ return EFalse;
+ }
+
+ if (aExpectedEvent->iClientHandle != aActualEvent->iClientHandle)
+ {
+ _LIT(KWindowHandle, "Actual Window Handle = %d Expected Window Handle = %d ");
+ iErrorDes.Copy(KWindowHandle);
+ iErrorDes.Format(KWindowHandle, aActualEvent->iClientHandle, aExpectedEvent->iClientHandle);
+ return EFalse;
+ }
+
+ return ComparePointerEvents(&aExpectedEvent->iPointerEvent, &aActualEvent->iPointerEvent);
+ }
+
+void CMultiPtrClickMaker::OtherEvent(TInt aType, TAny* aParam)
+ {
+ if (aType != EEventPointer)
+ {
+ return;
+ }
+
+ if (iError)
+ {
+ return;
+ }
+
+ TPointerEventData expectedEvent;
+ iOtherEventBuffer.Remove(&expectedEvent);
+
+ iOtherEventCount++;
+
+ TPointerEventData* data=static_cast<TPointerEventData*>(aParam);
+
+ if (!CompareOtherEvents(&expectedEvent, data))
+ {
+ iError = iPtrEventCount;
+ }
+ }
+
+TInt CMultiPtrClickMaker::AddEvent(const TWsEvent* aEvent)
+ {
+ return iPtrEventBuffer.Add(aEvent);
+ }
+
+TInt CMultiPtrClickMaker::AddEvent(const TPointerEventData* aEvent)
+ {
+ return iOtherEventBuffer.Add(aEvent);
+ }
+
+TInt CMultiPtrClickMaker::CommandReplyL(TInt aOpcode, TAny *aArgs)
+ {
+ TMultiPtrClickArgUnion pData;
+ pData.any=aArgs;
+ switch (aOpcode)
+ {
+ case EMultiPtrClickEventAdd:
+ return AddEvent(pData.WsEvent);
+ case EMultiPtrOtherEventAdd:
+ return AddEvent(pData.OtherEvent);
+ case EMultiPtrClickEventError:
+ return iError;
+ case EMultiPtrClickEventErrorDesc:
+ if (iError != KErrNone)
+ {
+ RChunk chunk;
+ chunk.OpenGlobal(KMultiPtrClickChunk, ETrue);
+ TUint8* desPtr = chunk.Base() + *(static_cast<TInt*>(aArgs));
+ TPtr8 ptrDes(desPtr, iErrorDes.Length(), iErrorDes.Length());
+ ptrDes.Copy(iErrorDes);
+ chunk.Close();
+ return iErrorDes.Length();
+ // returns the error description which gets displayed in logs if test failed
+ }
+ break;
+ case EMultiPtrClickEventReset:
+ iPtrEventBuffer.Reset();
+ iError = 0;
+ iPtrEventCount = 0;
+ break;
+ default:;
+ }
+ return(KErrNone);
+ }
+
+EXPORT_C CClickMaker* CreateMultiPtrClickMakerL()
+ {
+ CMultiPtrClickMaker* plugIn=new(ELeave) CMultiPtrClickMaker;
+ CleanupStack::PushL(plugIn);
+ plugIn->ConstructL();
+ CleanupStack::Pop(plugIn);
+ return plugIn;
+ }