telephonyserverplugins/ctsydispatchlayer/src/requestqueueoneshot.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/ctsydispatchlayer/src/requestqueueoneshot.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,139 @@
+// 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:
+//
+
+#include "requestqueueoneshot.h"
+#include "mdispatchercallback.h"
+#include <ctsy/ltsy/ltsylogger.h>
+#include "ctsydispatcherpanic.h"
+#include <ctsy/pluginapi/cmmdatapackage.h>
+
+const TInt KNoIpc = -1;
+
+CRequestQueueOneShot::TIpcDataPackage::TIpcDataPackage()
+	: iIpc(KNoIpc), 
+	  iDataPackage(NULL), 
+	  iResultCode(KErrNone), 
+	  iCleanupOnly(EFalse), 
+	  iDispatcherCallback(NULL) ,
+	  iLink()
+	{
+	} // CRequestQueueOneShot::TIpcDataPackage::TIpcDataPackage
+
+CRequestQueueOneShot::TIpcDataPackage::~TIpcDataPackage()
+	{
+	delete iDataPackage;
+	iDataPackage = NULL;
+	} // CRequestQueueOneShot::TIpcDataPackage::~TIpcDataPackage
+
+CRequestQueueOneShot::CRequestQueueOneShot()
+	: CAsyncOneShot(CActive::EPriorityStandard),
+	  iIpcQueue(_FOFF(TIpcDataPackage,iLink))
+	{
+	} // CRequestQueueOneShot::CRequestQueueOneShot
+
+
+CRequestQueueOneShot::~CRequestQueueOneShot()
+	{
+	TSYLOGENTRYEXIT;
+	
+	Cancel();
+
+	TIpcDataPackage* ipcDataPackage;
+	while (!iIpcQueue.IsEmpty())
+		{
+		ipcDataPackage = iIpcQueue.First();
+		iIpcQueue.Remove(*ipcDataPackage);
+		ipcDataPackage->iCleanupOnly = ETrue;
+		// Callback to dispatcher to ensure that dispatcher cleans up any heap data
+		// in the CMmDataPackage inside the TIpcDataPackage.
+		ipcDataPackage->iDispatcherCallback->CallbackSync(*ipcDataPackage);
+		}
+	
+	} // CRequestQueueOneShot::~CRequestQueueOneShot
+
+
+CRequestQueueOneShot* CRequestQueueOneShot::NewLC()
+	{
+	CRequestQueueOneShot* self = new (ELeave)CRequestQueueOneShot();
+	CleanupStack::PushL (self);
+	self->ConstructL();
+	return self;
+	} // CRequestQueueOneShot::NewLC
+
+
+CRequestQueueOneShot* CRequestQueueOneShot::NewL()
+	{
+	TSYLOGENTRYEXIT;
+	CRequestQueueOneShot* self = CRequestQueueOneShot::NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	} // CRequestQueueOneShot::NewL
+
+
+void CRequestQueueOneShot::ConstructL()
+	{
+	} // CRequestQueueOneShot::ConstructL
+
+
+void CRequestQueueOneShot::QueueRequest(TIpcDataPackage& aIpcDataPackage)
+/**
+ * Add the request to the queue.
+ * 
+ * @param aIpcDataPackage The encapsulated request to add to the queue.
+ */
+	{
+	TSYLOGENTRYEXITARGS(_L8("IPC=%d,err=%d"), aIpcDataPackage.iIpc, aIpcDataPackage.iResultCode);
+
+	__ASSERT_DEBUG(aIpcDataPackage.iDispatcherCallback != NULL, CtsyDispatcherPanic(EInvalidNullPtr)); 
+	aIpcDataPackage.iCleanupOnly = EFalse;
+	iIpcQueue.AddLast(aIpcDataPackage);
+	
+	// This object is only active if there is something in the queue
+	if (!IsActive())
+		{
+		Call();
+		}
+	
+	} // CRequestQueueOneShot::QueueRequest
+
+
+void CRequestQueueOneShot::DoCancel()
+	{
+	} // CRequestQueueOneShot::DoCancel
+
+
+void CRequestQueueOneShot::RunL()
+/**
+ * Completes the request at the head of the queue.
+ */
+	{
+	TSYLOGENTRYEXIT;
+	
+	if (iStatus == KErrNone)
+		{
+		__ASSERT_DEBUG(!iIpcQueue.IsEmpty(), CtsyDispatcherPanic(ERequestNotFound));
+		TIpcDataPackage* ipcDataPackage = iIpcQueue.First();
+		iIpcQueue.Remove(*ipcDataPackage);
+		ipcDataPackage->iDispatcherCallback->CallbackSync(*ipcDataPackage);
+		}
+	
+	if (!iIpcQueue.IsEmpty())
+		{
+		Call(); // Restart active object to process next request at the head of the queue
+		}
+	
+	} // CRequestQueueOneShot::RunL
+
+