diff -r 000000000000 -r dfb7c4ff071f datacommsserver/networkcontroller/src/asynwrap.cpp --- /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; + } + } + } + } +