--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/KEYCLICK.CPP Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,196 @@
+// Copyright (c) 2001-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:
+// Definition of the class that manages the keyclick plugin
+//
+//
+
+#include "KEYCLICK.H"
+
+#include "server.h"
+#include "W32CLICK.H"
+#include "panics.h"
+#include "inifile.h"
+#include "advancedpointereventhelper.h"
+
+CClickMaker* CClick::iHandler=NULL;
+TBool CClick::iIsChangeable=ETrue;
+TBool CClick::iKeyClickOveride=EFalse;
+TBool CClick::iKeyClickEnabled=ETrue;
+TBool CClick::iPenClickEnabled=ETrue;
+RLibrary CClick::iPlugIn;
+TBool CClick::iIsLoaded=EFalse;
+
+const TUid KClickPlugInDllUid={0x10004F63};
+static _LIT_SECURITY_POLICY_C1(KSecurityPolicy_WriteDeviceData,ECapabilityWriteDeviceData);
+
+
+/*static part*/
+
+void CClick::InitStaticsL()
+ {
+ _LIT(KClickPlugin,"KEYCLICKPLUGIN");
+ TPtrC plugInName;
+ if (WsIniFile->FindVar(KClickPlugin,plugInName))
+ LoadNewLibraryL(plugInName);
+ _LIT(KClickFixed,"KEYCLICKPLUGINFIXED");
+ iIsChangeable=!WsIniFile->FindVar(KClickFixed);
+ }
+
+void CClick::DeleteStatics()
+ {
+ if (iIsLoaded)
+ {
+ delete iHandler;
+ iHandler=NULL;
+ iPlugIn.Close();
+ }
+ }
+
+void CClick::KeyEvent(TEventCode aType,const TKeyEvent& aEvent)
+ {
+ WS_ASSERT_DEBUG(iHandler, EWsPanicClickPluginNotLoaded);
+ if (iKeyClickEnabled && !iKeyClickOveride)
+ {
+ TRAP_IGNORE(iHandler->KeyEvent(aType,aEvent)); // TRAP leaves in case the plugin is badly behaved
+ }
+ }
+
+void CClick::PointerEvent(const TPoint& aScreenPos,const TAdvancedPointerEvent& aEvent)
+ {
+ WS_ASSERT_DEBUG(iHandler, EWsPanicClickPluginNotLoaded);
+ if (iPenClickEnabled)
+ {
+ TAdvancedPointerEvent event;
+ TAdvancedPointerEventHelper::Copy(aEvent,event);
+ event.iParentPosition=aScreenPos;
+ TRAP_IGNORE(iHandler->PointerEvent(event)); // TRAP leaves in case the plugin is badly behaved
+ }
+ }
+
+void CClick::OtherEvent(TInt aType,TAny* aParam)
+ {
+ WS_ASSERT_DEBUG(iHandler, EWsPanicClickPluginNotLoaded);
+ if (aType!=EEventPointer || iPenClickEnabled)
+ TRAP_IGNORE(iHandler->OtherEvent(aType,aParam)); // TRAP leaves in case the plugin is badly behaved
+ }
+
+void CClick::LoadNewLibraryL(const TDesC &aDllName)
+ {
+ WS_ASSERT_DEBUG(iIsChangeable, EWsPanicChangeClickPlugin);
+ const TUidType uidType(KDllUid,KClickPlugInDllUid);
+ RLibrary plugIn;
+ User::LeaveIfError(plugIn.Load(aDllName,uidType));
+ CleanupClosePushL(plugIn);
+ CreateCClickHandler function;
+ CClickMaker* handler;
+ function=(CreateCClickHandler)User::LeaveIfNull((TAny*)plugIn.Lookup(1)); //Can only cast function pointer with C-style casts
+ handler=(*function)();
+ if (handler)
+ {
+ Unload();
+ CleanupStack::Pop(&plugIn);
+ iPlugIn=plugIn;
+ iHandler=handler;
+ iIsLoaded=ETrue;
+ }
+ else
+ CleanupStack::PopAndDestroy(&plugIn);
+ }
+
+/*object part*/
+
+void CClick::ConstructL(const TUid& aUid)
+ {
+ NewObjL();
+ iThirdUid=aUid;
+ }
+
+void CClick::CommandL(TInt aOpcode,const TAny* aCmdData)
+ {
+ TWsClickCmdUnion pData;
+ pData.any=aCmdData;
+ switch(aOpcode)
+ {
+ case EWsClickOpFree:
+ delete this;
+ break;
+ case EWsClickOpIsLoaded:
+ {
+ TUint reply=0;
+ if (IsHandler())
+ reply|=EClickLoaded;
+ if (iIsChangeable)
+ reply|=EClickLoadable;
+ SetReply(reply);
+ }
+ break;
+ case EWsClickOpUnLoad:
+ {
+ if(!KSecurityPolicy_WriteDeviceData().CheckPolicy(iWsOwner->ClientMessage(),__PLATSEC_DIAGNOSTIC_STRING("Capability check failed for RSoundPlugIn::UnLoad API")))
+ {
+ User::Leave(KErrPermissionDenied);
+ }
+ if (iIsChangeable)
+ Unload();
+ else
+ SetReply(KErrNotSupported);
+ }
+ break;
+ case EWsClickOpLoad:
+ {
+ if(!KSecurityPolicy_WriteDeviceData().CheckPolicy(iWsOwner->ClientMessage(),__PLATSEC_DIAGNOSTIC_STRING("Capability check failed for RSoundPlugIn::Load API")))
+ {
+ User::Leave(KErrPermissionDenied);
+ }
+ if (iIsChangeable)
+ LoadNewLibraryL(iWsOwner->BufferTPtr((TText*)(pData.Int+1),*pData.Int));
+ else
+ SetReply(KErrNotSupported);
+ }
+ break;
+ case EWsClickOpSetKeyClick:
+ {
+ if(KSecurityPolicy_WriteDeviceData().CheckPolicy(iWsOwner->ClientMessage(),__PLATSEC_DIAGNOSTIC_STRING("Capability check failed for RSoundPlugIn::SetKeyClick API")))
+ {
+ iKeyClickEnabled=*pData.Bool;
+ }
+ }
+ break;
+ case EWsClickOpSetPenClick:
+ {
+ if(KSecurityPolicy_WriteDeviceData().CheckPolicy(iWsOwner->ClientMessage(),__PLATSEC_DIAGNOSTIC_STRING("Capability check failed for RSoundPlugIn::SetPenClick API")))
+ {
+ iPenClickEnabled=*pData.Bool;
+ }
+ }
+ break;
+ case EWsClickOpKeyClickEnabled:
+ SetReply(iKeyClickEnabled);
+ break;
+ case EWsClickOpPenClickEnabled:
+ SetReply(iPenClickEnabled);
+ break;
+ case EWsClickOpCommandReply:
+ {
+ TInt reply=RSoundPlugIn::ESoundWrongPlugIn;
+ if (iHandler && iThirdUid==ThirdUid() && iThirdUid!=TUid::Null())
+ TRAP(reply, reply = iHandler->CommandReplyL(*pData.Int,(TAny*)(pData.Int+1)));
+ SetReply(reply);
+ }
+ break;
+ default:
+ OwnerPanic(EWservPanicOpcode);
+ break;
+ }
+ }