datacommsserver/networkcontroller/src/asynwrap.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/networkcontroller/src/asynwrap.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,162 @@
+// Copyright (c) 2003-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:
+//
+
+/**
+ @file ASYNWRAP.CPP
+*/
+
+#include "asynwrap.h"
+
+CASyncEtelRequestWrapper* CASyncEtelRequestWrapper::NewL(MAsyncRequestsObserver* aObserver)
+/**
+This function is constructing an object of class CASyncEtelRequestWrapper,pushing it to the cleanup stack
+and popping it back.
+
+@param aObserver,a pointer to class MAsyncRequestsObserver to register the asyncronous requests
+@return self, make asyncronous requests synchronous whilst not blocking the thread and thus allowing other 
+active objects to run as normal
+*/
+	{
+	CASyncEtelRequestWrapper* self = new (ELeave) CASyncEtelRequestWrapper();
+	CleanupStack::PushL(self);
+	self->iObserver = aObserver;
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CASyncEtelRequestWrapper::CASyncEtelRequestWrapper()
+	: CActive(CActive::EPriorityStandard)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CASyncEtelRequestWrapper::ConstructL()
+	{
+	iAsyncRequestState = ENoRequests;
+	iAsyncRequestData.iETelAsynError.iError = KErrNone;
+	iAsyncRequestData.iETelAsynError.iFailedRequest = 0x00;
+	iAsyncRequestData.iMSClass = RPacketService::EMSClassUnknown;
+	iAsyncRequestData.iRegistrationStatus = RPacketService::ENotRegisteredNotSearching;
+	}
+
+CASyncEtelRequestWrapper::~CASyncEtelRequestWrapper()
+/**
+Destructor
+*/
+	{
+	Cancel();
+	iPacket.Close();
+	}
+
+void CASyncEtelRequestWrapper::StartAsyncRequests(RTelServer&, RMobilePhone& aMmPhone)
+/**
+Pass the object on which the request was made and the request id - 
+this is needed to cancel the request if necessary
+
+@param aTelServer, establish a root telephony server session.
+@param aMmPhone, encapsulates access to a mobile phone
+*/
+	{
+	// Open PacketService
+	TInt ret = iPacket.Open(aMmPhone);
+	if(ret == KErrNone)
+		{
+		// The first request to be made is GetMSClass from packet session
+		iAsyncRequestState = EGetMSClass;
+		iReqToCancel = EPacketGetMSClass;
+		iPacket.GetMSClass(iStatus,iAsyncRequestData.iMSClass,iMaxMSClass);
+		// Set active and start to wait for the request response
+		if(!IsActive())
+			SetActive();
+		}
+	// Error, complete to the observer
+	else
+		{
+		// Save the error into iError and pass it to GenConn
+		iAsyncRequestData.iETelAsynError.iError = ret;
+		iAsyncRequestData.iETelAsynError.iFailedRequest = 0x00;
+		iObserver->ETelAsyncRequestsComplete(iAsyncRequestData);
+		}
+	}
+
+void CASyncEtelRequestWrapper::DoCancel()
+	{
+	// If the state is not ENoRequests, then we are requesting 
+	// something from ETel
+	if(iAsyncRequestState != ENoRequests)
+		{
+		// Cancel the current packet service request, it is saved
+		// in the iReqToCancel member. 
+		iPacket.CancelAsyncRequest(iReqToCancel);
+		}
+
+	iAsyncRequestState = ENoRequests;
+	iAsyncRequestData.iMSClass = RPacketService::EMSClassUnknown;
+	iAsyncRequestData.iRegistrationStatus = RPacketService::ENotRegisteredNotSearching;
+	}
+
+void CASyncEtelRequestWrapper::RunL()
+	{
+	if(iStatus != KRequestPending)
+		{
+		TInt err = iStatus.Int();
+		// If the request was not cancelled, start requesting the next one
+		if(err!=KErrCancel)
+			{
+			// MSClass information received
+			if(iAsyncRequestState == EGetMSClass)
+				{
+				// If error is not KErrNone and KErrNotSupported, then this state failed. 
+				// Save the error and report it to GenConn when the last state is handled.
+				if(err!=KErrNone && err!= KErrNotSupported)
+					{
+					iAsyncRequestData.iETelAsynError.iError = err;
+					iAsyncRequestData.iETelAsynError.iFailedRequest = EPacketGetMSClass;
+					}
+				// Get current network registration status
+				iAsyncRequestState = EGetNwRegStatus;
+				iReqToCancel = EPacketGetNtwkRegStatus;
+				iAsyncRequestData.iRegistrationStatus = RPacketService::EUnknown;
+				iPacket.GetNtwkRegStatus(iStatus, iAsyncRequestData.iRegistrationStatus);
+				// Start the next request
+				if(!IsActive())
+					{
+					SetActive();
+					}
+				}
+			else if(iAsyncRequestState == EGetNwRegStatus)
+				{
+				// If error is not KErrNone and KErrNotSupported, then this state failed. 
+				// Save the error and report it to GenConn when the last state is handled.
+				if(err!=KErrNone && err!= KErrNotSupported)
+					{
+					iAsyncRequestData.iETelAsynError.iError = err;
+					iAsyncRequestData.iETelAsynError.iFailedRequest = EPacketGetNtwkRegStatus;
+					}
+				// This is the last request
+				iAsyncRequestState = ENoRequests;
+				// All done, move the data to observer
+				iObserver->ETelAsyncRequestsComplete(iAsyncRequestData);
+				}
+			else
+				{
+				// When there is going to be more requests, add them here.
+				iAsyncRequestState = ENoRequests;
+				}
+			}
+		}
+	}
+