textinput/peninputarc/src/peninputcrp/peninputcrp.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputarc/src/peninputcrp/peninputcrp.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,267 @@
+/*
+* Copyright (c) 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:
+*
+*/
+
+#include "peninputcrp.h"
+#include "peninputcrpmsg.h"
+#include <ecom/implementationproxy.h>
+#include <s32mem.h> //RDesReadStream
+
+//const TInt KDefaultScreen(0);
+const TInt KImpId(0x2000B5E7);
+
+#define INVERTLANDSCAPE
+
+const TInt KMonitoredEvents = TWservCrEvent::EDsaDrawingBegin|TWservCrEvent::EDsaDrawingEnd ;
+
+	
+class CAknWsService : public CBase, public MWsEventHandler
+	{
+	public:
+		static void CreateL(MWsGraphicDrawerEnvironment& aEnv, CAknWsServiceCRP* aSrv);
+		static void Delete(CAknWsServiceCRP* aSrv);
+		static inline CAknWsService* Service();
+		~CAknWsService();
+		
+	private:
+		void DoHandleEvent(const TWservCrEvent& aEvent);
+		void ConstructL();
+		CAknWsService(MWsGraphicDrawerEnvironment& aEnv);
+			    
+	private:
+		MWsGraphicDrawerEnvironment* iEnv;
+		CAknWsServiceCRP* iService;		
+	};
+
+
+inline CAknWsService* CAknWsService::Service()
+	{
+	return static_cast<CAknWsService*> (Dll::Tls());
+	}
+
+CAknWsService::CAknWsService(MWsGraphicDrawerEnvironment& aEnv) :
+iEnv(&aEnv)
+	{
+	}
+
+void CAknWsService::ConstructL()	
+	{
+	}
+
+void CAknWsService::CreateL(MWsGraphicDrawerEnvironment& aEnv, CAknWsServiceCRP* aSrv)
+	{
+	CAknWsService* srv = Service();
+	if(srv == NULL)
+		{
+		srv = new (ELeave) CAknWsService(aEnv);
+		CleanupStack::PushL(srv);
+		srv->ConstructL();
+		CleanupStack::Pop();
+		Dll::SetTls(srv);
+		}
+	else
+		{
+		CAknWsServiceCRP* s = srv->iService;
+		if(s != NULL)
+			{
+			while(s->iNext != NULL)
+				s = s->iNext;
+			s->iNext = aSrv;
+			return;
+			}
+		}
+	srv->iService = aSrv;
+	aEnv.RegisterEventHandler(aSrv, srv, KMonitoredEvents);	
+	}
+	
+void CAknWsService::Delete(CAknWsServiceCRP* aSrv) 
+	{
+	CAknWsService* srv = Service();
+	if(srv != NULL)
+		{
+		if(aSrv == srv->iService)
+			{
+			srv->iEnv->UnregisterEventHandler(aSrv);
+			if(aSrv->iNext != NULL)
+				{
+				srv->iEnv->RegisterEventHandler(aSrv->iNext, srv, KMonitoredEvents);
+				}
+			else  
+				{
+				srv->iService = NULL;	
+				delete srv;
+				Dll::SetTls(NULL);
+				return;
+				}
+			}
+			
+		CAknWsServiceCRP* s = srv->iService;
+		while(s->iNext != aSrv)
+			{
+			s = s->iNext;
+			ASSERT(s != NULL);
+			}
+		s->iNext = aSrv->iNext;	
+		}
+	}
+	
+CAknWsService::~CAknWsService()
+	{
+	RDebug::Print(_L("QQQ destructor"));
+	
+	}
+	
+		
+void CAknWsService::DoHandleEvent(const TWservCrEvent& aEvent)
+	{
+	
+    //TInt data = 0;
+    if(aEvent.Type() == TWservCrEvent::EDsaDrawingBegin)
+        {
+        // DSA is active 
+       	iService->SetDsaActive(ETrue);
+        }
+        
+    if(aEvent.Type() == TWservCrEvent::EDsaDrawingEnd)
+        {
+        // DSA is inactive
+        iService->SetDsaActive(EFalse);
+        }
+	
+	}
+		
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+CWsGraphicDrawer* CAknWsServiceCRP::CreateL()
+	{
+	CAknWsServiceCRP* crp = new (ELeave) CAknWsServiceCRP();
+	return crp;
+	}
+	
+
+	
+CAknWsServiceCRP::~CAknWsServiceCRP()	
+	{
+	CAknWsService::Delete(this);
+    iDsaGrpList.Close();
+	}
+
+void CAknWsServiceCRP::DoDraw(MWsGc& /*aGc*/, const TRect& /*aRect*/, const TDesC8& /*aData*/) const
+	{
+	//draws nothing
+	}
+	
+void CAknWsServiceCRP::HandleMessage(const TDesC8& aData)
+	{
+	TRAP_IGNORE(DoHandleMessageL(aData));
+	}
+	
+TBool CAknWsServiceCRP::IsDsaApp(TInt aId)
+    {
+    return iDsaGrpList.Find(aId) != KErrNotFound;
+    }
+
+void CAknWsServiceCRP::RemoveDsaApp(TInt aId)
+    {
+    TInt idx = iDsaGrpList.Find(aId);
+    if(KErrNotFound != idx)
+        iDsaGrpList.Remove(idx);
+    }
+TInt CAknWsServiceCRP::HandleSynchronMessage(const TDesC8& aData)
+	{
+	RDesReadStream in(aData);
+	TInt cmd = 0;
+	TRAP_IGNORE( cmd = in.ReadInt32L()); 
+//	RDebug::Printf("QQQ HandleSynchronMessage %d", cmd);
+	switch(cmd)
+		{
+	    case NPenInputCRPServiceMsg::EIsDsaApp:
+	        {
+            return iIsDsaActive;	        
+	        }
+	    default:
+	        break;
+		}
+	return 0;
+	}
+	
+void CAknWsServiceCRP::DoHandleMessageL(const TDesC8& aData)
+	{
+	RDesReadStream in(aData);
+	const TInt cmd = in.ReadInt32L(); 
+//	RDebug::Printf("QQQ DoHandleMessageL %d", cmd);
+	switch(cmd)
+		{
+	    case NPenInputCRPServiceMsg::ERemoveDsaApp:
+            {
+            TInt id = in.ReadInt32L(); 
+            RemoveDsaApp(id);
+            }
+	        break;
+        default:		        
+			break;
+		} 	
+	}
+	
+	
+void CAknWsServiceCRP::ConstructL(MWsGraphicDrawerEnvironment& aEnv,
+ const TGraphicDrawerId& aId, MWsClient& aOwner, const TDesC8& /*aData*/)
+	{
+	BaseConstructL(aEnv, aId, aOwner);
+	CAknWsService::CreateL(aEnv, this);
+	}
+	
+	
+
+void CAknWsServiceCRP::AddDsaGrp(TInt aId)
+    {
+    if(KErrNotFound == iDsaGrpList.Find(aId))
+        {
+        iDsaGrpList.Append(aId);
+        }
+    }
+    
+void CAknWsServiceCRP::SetDsaActive( TBool aIsActive )
+	{
+	iIsDsaActive = aIsActive;
+	}
+    
+TAny* CAknWsServiceCRP::ResolveObjectInterface(TUint aTypeId)
+	{
+	if(aTypeId == KWsGraphicHandleSynchronMessageId)
+		{
+		TAny* interface = NULL;
+		interface = static_cast<MWsGraphicHandleSynchronMessage*>(this);
+		return interface;
+		}
+	return CWsGraphicDrawer::ResolveObjectInterface(aTypeId);
+	}	
+    
+    
+LOCAL_C const TImplementationProxy KImplementationTable[] = 
+	{
+	IMPLEMENTATION_PROXY_ENTRY(KImpId, CAknWsServiceCRP::CreateL)
+	};
+	
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = (sizeof(KImplementationTable) / sizeof(TImplementationProxy));
+	return KImplementationTable;
+	}
+