diff -r 000000000000 -r bde4ae8d615e os/graphics/windowing/windowserver/test/t_halattprovider/t_halattprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/graphics/windowing/windowserver/test/t_halattprovider/t_halattprovider.cpp Fri Jun 15 03:10:57 2012 +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 +#include + +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 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; + }