graphics/wserv/src/T_DataDsaSession.cpp
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphics/wserv/src/T_DataDsaSession.cpp	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,342 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include "T_GraphicsUtil.h"
+#include "T_DataDsaSession.h"
+
+_LIT(KDataClassname,	"RDirectScreenAccess");
+//command
+_LIT( KCmdnewL, "new" );
+_LIT( KCmdConstruct, "Construct" );
+_LIT( KCmdClose, "Close" );
+_LIT( KCmdRequest, "Request" );
+_LIT( KCmdCompleted, "Completed" );
+_LIT( KCmdCancel, "Cancel" );
+_LIT( KCmdEatupMemory, "Util_EatupMemory" );
+_LIT( KCmdFreeEatenMemory, "Util_FreeEatenMemory" );
+// Fields
+_LIT( KRWsSessionObj, "ws");
+_LIT( KRWindowObj, "win");
+_LIT( KFldRegion, "region1");
+_LIT( KFldMemLeft, "memleft");
+
+//Error
+_LIT( KErrNewL, "Create RDirectScreenAccess() failed.");
+_LIT( KErrRequestRegionMatch, "Execute RDirectScreenAccess::Request() failed, Error: region size not match.");
+_LIT( KLogMissingParameter, "Missing parameter '%S'");
+_LIT( KLogError, "Error=%d");
+_LIT( KStraySignal, "Stray signal");
+
+//Info
+_LIT( KRdsaNew1, "RDSA::new() has been called");
+_LIT( KRdsaNew2, "RDSA::new(session) has been called");
+_LIT( KInfoConstruct, "Construct() has been called" );
+_LIT( KInfoClose, "Close() has been called" );
+_LIT( KInfoRequest, "Request() has been called" );
+_LIT( KInfoCompleted, "Completed() has been called" );
+_LIT( KInfoCancel, "Cancel() has been called" );
+_LIT( KRunRequestReady, "RunRequestReady %d");
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+CT_DataDsaSession::CT_DataDsaSession() : 
+	iDsaSession(NULL),
+	iActiveRequestReady(NULL)
+	{
+	}
+
+void CT_DataDsaSession::ConstructL()
+	{
+	iActiveRequestReady = CActiveCallback::NewL(*this);
+	}
+
+CT_DataDsaSession::~CT_DataDsaSession()
+	{
+	this->DestroyData();
+	}
+
+CT_DataDsaSession* CT_DataDsaSession::NewL()
+	{
+	CT_DataDsaSession* self = new (ELeave) CT_DataDsaSession();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void CT_DataDsaSession::SetObjectL(TAny* aAny)
+	{
+	this->DestroyData();
+	iDsaSession = static_cast<RDirectScreenAccess*>(aAny);
+	}
+
+void CT_DataDsaSession::DisownObjectL()
+	{
+	iDsaSession = NULL;
+	}
+
+void CT_DataDsaSession::DestroyData()
+	{
+	delete iDsaSession;
+	iDsaSession = NULL;
+	delete iActiveRequestReady;
+	iActiveRequestReady = NULL;
+	}
+
+MWsClientClass* CT_DataDsaSession::GetClientClass() const
+	{
+	return iDsaSession;
+	}
+
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand			the command to process
+ * @param aSection			the entry in the ini file requiring the command to be processed
+ * @param aAsyncErrorIndex	index of command. used for async calls
+ *
+ * @return ETrue if the command is processed
+ */
+TBool CT_DataDsaSession::DoCommandL(const TTEFFunction& aCommand, const
+			TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+	{
+	TBool result( ETrue );
+	INFO_PRINTF1(aCommand);
+	
+	if ( !aCommand.Compare( KCmdnewL ) || !aCommand.Compare( KDataClassname ) )
+        {
+    	DoCmdnewL(aSection);
+        }
+	else if ( !aCommand.Compare( KCmdConstruct ) )
+        {
+        DoCmdConstruct();
+        }
+	else if ( !aCommand.Compare( KCmdClose ) )
+        {
+        DoCmdClose();
+        }
+	else if ( !aCommand.Compare( KCmdRequest) )
+        {
+        DoCmdRequestL(aSection , aAsyncErrorIndex);
+        }
+	else if ( !aCommand.Compare( KCmdCompleted ) )
+        {
+        DoCmdCompleted();
+        }
+	else if ( !aCommand.Compare( KCmdCancel ) )
+        {
+        DoCmdCancel();
+        }    
+    else if ( !aCommand.Compare(KCmdEatupMemory))
+    	{
+    	DoCmdEatupMemory(aSection);
+    	}
+    else if (!aCommand.Compare(KCmdFreeEatenMemory))
+    	{
+    	DoCmdFreeEatenMemory();
+    	}
+    else
+        {
+        result = EFalse;
+        }
+	
+    return result;
+	}
+
+/**
+ * Helper method to get RWsSession
+ */
+RWsSession* CT_DataDsaSession::GetRWSessionL(const TDesC& aSection)
+	{
+	RWsSession* iClient = NULL; //Window Session Client
+	TPtrC objectName;
+	
+	if ( GetStringFromConfig(aSection, KRWsSessionObj(), objectName) )
+		{
+		iClient = static_cast<RWsSession*>(GetDataObjectL(objectName));
+		}
+	
+	return iClient;
+	}
+
+/**
+ * Test NewL();
+ */
+void CT_DataDsaSession::DoCmdnewL(const TDesC& aSection)
+	{
+	RWsSession* session = GetRWSessionL(aSection);
+	
+	if(!session)
+		{
+		//no parameter.
+		iDsaSession = new (ELeave) RDirectScreenAccess();
+		INFO_PRINTF1(KRdsaNew1);
+		}
+	else
+		{
+		//with parameter
+		iDsaSession = new (ELeave) RDirectScreenAccess(*session);
+		INFO_PRINTF1(KRdsaNew2);
+		}
+
+	if(!iDsaSession)
+		{
+		ERR_PRINTF1(KErrNewL);
+		SetBlockResult(EFail);
+		}
+	
+	}
+
+
+/**
+ * Test ConstructL();
+ */
+void CT_DataDsaSession::DoCmdConstruct()
+	{
+	INFO_PRINTF1(KInfoConstruct);
+	TInt result = iDsaSession->Construct();
+	
+	if(result)
+		{
+		ERR_PRINTF2(KLogError, result);
+		SetBlockResult(EFail);
+		}
+	
+	}
+
+
+/**
+ * Test Close();
+ */
+void CT_DataDsaSession::DoCmdClose()
+	{
+	INFO_PRINTF1(KInfoClose);
+	iDsaSession->Close();
+	}
+
+
+/**
+ * Test RequestL();
+ */
+void CT_DataDsaSession::DoCmdRequestL(const TDesC& aSection, const TInt aAsyncErrorIndex)
+	{
+	INFO_PRINTF1(KInfoRequest);
+	RWindowBase* iWindow = NULL;
+	TPtrC objectName;
+	
+	if ( GetStringFromConfig(aSection, KRWindowObj(), objectName))
+		{
+		iWindow = static_cast<RWindowBase*> (GetDataObjectL(objectName));
+		}
+	
+	if(!iWindow)
+		{
+		ERR_PRINTF2(KLogMissingParameter , &KRWindowObj);
+		SetBlockResult(EFail);
+		}
+	
+	RRegion* aRegion = NULL;
+	
+	TInt result = iDsaSession->Request(aRegion, iActiveRequestReady->iStatus, *iWindow);
+	if(result)
+		{
+ 		ERR_PRINTF2(KLogError, result);
+		SetError(result);
+		}
+    else
+        {    	
+    	TRect temp;
+    	if( GetRectFromConfig(aSection ,KFldRegion, temp ) && aRegion->Count())
+    		{
+    		//compare the region
+    		TRect temp2 = (*aRegion)[0];
+    		if(temp != temp2)
+    			{
+    			ERR_PRINTF1(KErrRequestRegionMatch);
+    			SetBlockResult(EFail);
+    			}
+    		
+    		}
+    	
+        iActiveRequestReady->Activate(aAsyncErrorIndex);
+        IncOutstanding();		
+    	}
+
+	}
+
+/**
+ * Test Completed();
+ */
+void CT_DataDsaSession::DoCmdCompleted()
+	{
+	INFO_PRINTF1(KInfoCompleted);
+	iDsaSession->Completed();
+	}
+
+/**
+ * Test Cancel();
+ */
+void CT_DataDsaSession::DoCmdCancel()
+	{
+	INFO_PRINTF1(KInfoCancel);
+	iDsaSession->Cancel();
+	}
+
+void CT_DataDsaSession::DoCmdEatupMemory(const TDesC& aSection)
+	{
+	CT_GraphicsUtil::EatupMemory(*this,aSection,KFldMemLeft);
+	}
+void CT_DataDsaSession::DoCmdFreeEatenMemory()
+	{
+	CT_GraphicsUtil::FreeEatenMemory(*this);
+	}
+
+void CT_DataDsaSession::RunL(CActive* aActive, TInt aIndex)
+	{
+	if ( iActiveRequestReady == aActive )
+		{
+		RunRequestReady(aIndex);
+		}
+	else
+		{
+		ERR_PRINTF1(KStraySignal);
+		SetBlockResult(EFail);
+		}
+	
+	}
+
+void CT_DataDsaSession::RunRequestReady( const TInt aIndex)
+	{
+	DecOutstanding();
+	TInt err = iActiveRequestReady->iStatus.Int();
+	INFO_PRINTF2(KRunRequestReady, err);
+	
+	if ( KErrNone != err )
+		{
+		ERR_PRINTF2(KLogError, err);
+		SetAsyncError(aIndex, err);
+		}
+	
+	}
+
+void CT_DataDsaSession::DoCancel(CActive* /*aActive*/, TInt /*aIndex*/)
+	{
+	//nothing.
+	}
+
+