windowing/windowserver/TClick/multiptrclick.cpp
changeset 0 5d03bc08d59c
--- /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;
+	}