windowing/windowserver/test/t_halattprovider/t_halattprovider.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_halattprovider/t_halattprovider.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,157 @@
+// 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:
+// t_halattprovider.ldd Provides fake HAL attribute values on H4 platform for
+// advanced pointer event testing.
+// Fake values are listed in halFunction(TAny* aPtr, TInt aFunction, TAny* a1, TAny* a2).
+// Only some values from the group EHalGroupDigitiser are changed.
+// For not changed values from the group EHalGroupDigitiser the original HAL handler is called
+// (the one loaded before this kernel extension).
+// Original handler of EHalGroupDigitiser group must be registered in order
+// to run this kernel extension.
+// 
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <kernel/kernel.h>
+#include <e32cmn.h>
+
+static SHalEntry gOriginalHandler;
+static TUint8 gNumberOfPointers;
+
+void InitialiseDigitiserHalData()
+	{
+	gNumberOfPointers = 6;
+	}
+
+LOCAL_C TInt halFunction(TAny* aPtr, TInt aFunction, TAny* a1, TAny* a2)
+	{
+	TInt r=KErrNone;
+	THalFunc function = gOriginalHandler.iFunction;
+	switch(aFunction)
+		{
+		case EDigitiserHal3DInfo:
+			{
+			// execute the original handler
+			r = (*function)(aPtr, EDigitiserHal3DInfo, a1, a2);
+			TBool receivedFullData = (r == KErrNone);
+			if (r != KErrNone)
+				{
+				// try to get at least TDigitiserInfoV01
+				r = (*function)(aPtr, EDigitiserHalXYInfo, a1, a2);
+				if (r != KErrNone)
+					{
+					Kern::Printf("t_halattprovider error: original handler of EDigitiserHalXYInfo returned %d", r);
+					return r;
+					}
+				}
+			
+			// read data created by the original handler
+			TPckgBuf<TDigitiserInfoV02> vPckg;
+			TDigitiserInfoV02& data = vPckg();
+			
+			Kern::KUDesGet(vPckg, *(TDes8*)a1);
+			
+			// modify the data with the new values
+			vPckg.SetLength(sizeof(TDigitiserInfoV02));
+			data.iPressureSupported=1;
+			data.iZRange=-100; // max proximity
+			data.iProximityStep=5;
+			data.iMaxPointers=8;
+			data.iNumberOfPointers=gNumberOfPointers;
+			data.iMaxPressure=5000;
+			data.iPressureStep=500;
+			
+			if (!receivedFullData)
+				{
+				// original handler has provided only TDigitiserInfoV01, so we have to
+				// fill all fields of TDigitiserInfoV02
+				data.iThetaSupported=0;
+				data.iPhiSupported=0;
+				data.iAlphaSupported=0;
+				}
+			
+			// return the data
+			Kern::InfoCopy(*(TDes8*)a1, vPckg);
+			
+			break;
+			}
+		case EDigitiserHal3DPointer:
+			{
+			// Return value 1 for EPointer3D
+			TBool ret = ETrue; 
+			kumemput32(a1,&ret,sizeof(ret));
+			break;
+			}
+		case EDigitiserHalSetNumberOfPointers:
+			// Set request for EPointerNumberOfPointers
+			
+			// this line should be a correct implementation of this function but was not tested
+			//kumemget32(&gNumberOfPointers,a1,sizeof(gNumberOfPointers));
+			Kern::Printf("t_halattprovider error: attempt to use not implemented HAL function EDigitiserHalSetNumberOfPointers");
+			r = KErrNotSupported;
+			break;
+		default:
+			r = (*function)(aPtr, aFunction, a1, a2);
+			break;
+		}
+	return r;
+	}
+
+DECLARE_STANDARD_EXTENSION()
+	{
+	TInt r = KErrNone;
+	
+	// Initialise Digitiser HAL Data first.
+	InitialiseDigitiserHalData();
+	
+	NKern::ThreadEnterCS();
+	
+	// Find original handler whose behaviour will be overriden
+	SHalEntry* originalHandlerPtr = Kern::FindHalEntry(EHalGroupDigitiser,0);
+	if (originalHandlerPtr == NULL)
+		{
+		NKern::ThreadLeaveCS();
+		Kern::Printf("t_halattprovider error: original handler of EHalGroupDigitiser group not found");
+		return KErrNotFound;
+		}
+	gOriginalHandler = *originalHandlerPtr; // copy contents of the SHalEntry
+	
+	// Remove original handler
+	r = Kern::RemoveHalEntry(EHalGroupDigitiser, 0);
+	if (r != KErrNone)
+		{
+		NKern::ThreadLeaveCS();
+		Kern::Printf("t_halattprovider error: unable to unregister original handler for EHalGroupDigitiser group, code:%d",r);
+		return r;
+		}
+	
+	// Add new handler
+	r=Kern::AddHalEntry(EHalGroupDigitiser,halFunction,gOriginalHandler.iPtr,0);
+	if (r != KErrNone)
+		{
+		NKern::ThreadLeaveCS();
+		Kern::Printf("t_halattprovider error: unable register handler for EHalGroupDigitiser group, code:%d",r);
+		return r;
+		}
+
+	NKern::ThreadLeaveCS();
+	
+	Kern::Printf("t_halattprovider: registered successfully");
+	return r;
+	}