telephonyserverplugins/common_tsy/test/component/src/cctsyactiveretriever.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/test/component/src/cctsyactiveretriever.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,238 @@
+// Copyright (c) 2007-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:
+// Implementation of CFilteringActiveScheduler and CActiveRetriever
+// 
+//
+
+/**
+ @file 
+*/
+
+#include "cctsyactiveretriever.h"
+
+
+TInt CActiveRetriever::iSimultaneousRetrieveRequestsNumber(0);
+
+//----------------------------------------------------------------------------
+// Implementation of CFilteringActiveScheduler
+//----------------------------------------------------------------------------
+CFilteringActiveScheduler::~CFilteringActiveScheduler()
+	{
+	iRetrievers.Reset();
+	}
+
+//
+void CFilteringActiveScheduler::AddRetrieverL(CActiveRetriever& aRetriever)
+	{
+	iRetrievers.AppendL(&aRetriever);
+	}
+
+//	
+void CFilteringActiveScheduler::StartScheduler()
+	{
+
+	for (TInt i = 0; i<iRetrievers.Count(); i++)
+		{
+		if (iRetrievers[i]->IsActive())
+			{
+			// only if there is Active Retriever then actually starts Scheduler
+			return CActiveScheduler::Start();
+			}
+		}
+	}
+
+//
+void CFilteringActiveScheduler::WaitForAnyRequest()
+	{
+	do 	
+		{
+		CActiveScheduler::WaitForAnyRequest();
+		}
+	while (!IsOneOfMyRequestsComplete()); // WaitForAnyRequest while one of my requests is not complete 
+	}
+
+
+// check whether thera is any Retriever's request complete
+TBool CFilteringActiveScheduler::IsOneOfMyRequestsComplete()
+	{
+	TBool ret(EFalse);
+	
+	for (TInt i = 0; i<iRetrievers.Count() && !ret; i++)
+		{
+		if (iRetrievers[i]->IsRequestComplete())
+			{
+			ret = ETrue;
+			iRetrievers[i]->PerformCancelIfNeeded();
+			}
+		}
+	
+	return ret;
+	}
+
+//----------------------------------------------------------------------------
+// Implementation of CActiveRetriever
+//----------------------------------------------------------------------------
+CActiveRetriever* CActiveRetriever::
+			NewLC(CAsyncRetrieveVariableLengthBufferV2& aAsynchRetrieveBuffer)
+    {
+	CActiveRetriever* self =  new (ELeave) CActiveRetriever(aAsynchRetrieveBuffer);
+	CleanupStack::PushL(self);
+	return self;		
+    }
+    
+//
+CActiveRetriever* CActiveRetriever::
+			NewL(CAsyncRetrieveVariableLengthBufferV2& aAsynchRetrieveBuffer)
+    {
+	return new (ELeave) CActiveRetriever(aAsynchRetrieveBuffer);
+    }
+    
+//
+CActiveRetriever::CActiveRetriever(CAsyncRetrieveVariableLengthBufferV2& aAsynchRetrieveBuffer) : 
+    CActive(EPriorityStandard),
+    iAsynchRetrieveBuffer(aAsynchRetrieveBuffer),
+    iTestCase(ECaseNotSpecified),
+    iPhase1Passed(EFalse)
+    {
+    CActiveScheduler::Add(this);
+    }
+    
+//
+CActiveRetriever::~CActiveRetriever()
+    {
+    Cancel();
+    }
+//
+TBool CActiveRetriever::IsRequestComplete()
+	{
+	TBool ret(EFalse);
+	
+	if ( ( AsynchRetrieveBuffer().IsActive() && 
+	       AsynchRetrieveBuffer().iStatus!=KRequestPending ) ||
+	     ( IsActive() && iStatus!=KRequestPending) )
+		{
+		ret = ETrue;
+		}
+	
+	return ret;
+	}
+
+//
+void CActiveRetriever::PerformCancelIfNeeded()
+	{
+	if ( AsynchRetrieveBuffer().IsActive() && 
+	     AsynchRetrieveBuffer().iStatus!=KRequestPending )
+		{
+		switch(TestCase())
+			{
+			case CActiveRetriever::ECasePhase2Cancel:
+				if ( ! Phase1Passed() ) // cancel request after passing of 1st phase
+					{
+					SetPhase1Passed(ETrue);
+					break;
+					}
+			case CActiveRetriever::ECasePhase1Cancel:
+				AsynchRetrieveBuffer().Cancel();
+				SetTestCase(CActiveRetriever::ECaseNotSpecified);
+				break;
+			case CActiveRetriever::ECaseNotSpecified:
+			default:
+				break;
+			}
+		}
+	}
+
+// resets pending requests number, STATIC 
+TInt CActiveRetriever::ResetRequestsNumber()
+	{
+	TInt ret(iSimultaneousRetrieveRequestsNumber); 
+	iSimultaneousRetrieveRequestsNumber = 0;
+	return ret;
+	}
+//
+TRequestStatus& CActiveRetriever::Status()
+	{
+	return iStatus;
+	}
+
+// AO's request function with test case parameter
+void CActiveRetriever::Activate(TTestCase aTestCase)
+    {
+    if ( ECaseGeneralCancelCase != aTestCase )
+    	{
+        iTestCase = aTestCase;
+        iSimultaneousRetrieveRequestsNumber++;
+        SetActive();
+    	}
+    else
+    	{
+    	iAsynchRetrieveBuffer.Cancel();
+	    iTestCase = ECaseNotSpecified;
+    	}
+    }
+    
+//   
+void CActiveRetriever::RunL()
+    {
+    DoComplete(); // stops the Scheduler
+    }
+
+//
+void CActiveRetriever::DoCancel()
+    {
+    if (IsActive())
+	    {
+	    iAsynchRetrieveBuffer.Cancel();
+	    DoComplete();
+	    }
+    }
+    
+//
+CActive& CActiveRetriever::AsynchRetrieveBuffer()
+	{
+	return iAsynchRetrieveBuffer;
+	}
+	
+//
+void CActiveRetriever::SetTestCase(CActiveRetriever::TTestCase aCase)
+	{
+	iTestCase = aCase;
+	}
+
+//	
+CActiveRetriever::TTestCase CActiveRetriever::TestCase()
+	{
+	return iTestCase;
+	}
+
+//
+void CActiveRetriever::SetPhase1Passed(TBool aPassed)
+	{
+	iPhase1Passed = aPassed;
+	}
+
+//	
+TBool CActiveRetriever::Phase1Passed()
+	{
+	return iPhase1Passed;
+	}
+
+//
+void CActiveRetriever::DoComplete()
+	{
+    if (!(--iSimultaneousRetrieveRequestsNumber))
+	    {
+    	CActiveScheduler::Stop();
+    	}
+	}