telephonyserverplugins/multimodetsy/Multimode/gprs/Gprs.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/multimodetsy/Multimode/gprs/Gprs.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/multimodetsy/Multimode/gprs/Gprs.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,1168 +1,1168 @@
-// Copyright (c) 2001-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:
-// This file implements the CGprs class. Used to implement the RPacketService API.
-// This file also implements the CGprsContextEntry class used to store a pointer to a CGprsContext object.
-// 
-//
-
-/**
- @file
-*/
-
-#include "Gprscontext.h"
-#include "mSLOGGER.H"
-#include "NOTIFY.H"
-#include "ATGprsAttach.H"
-#include "ATGprsDetach.H"
-#include "AtGprsClass.h"
-#include "atgprsntwkregstatus.h"					// for CATGprsNtwkRegStatus
-#include "atgprsntwkregstatuschange.h"		// for CATGprsNtwkRegStatusChange
-#include "ATIO.H"
-#include "ATHANGUP.H"
-
-
-CGprs* CGprs::NewL(CATIO* aIo, CATInit* aInit, CPhoneGlobals* aPhoneGlobals)
-/**
- * Standard 2 phase constructor.
- *
- * @param aIo pointer to communication object.
- * @param aInit pointer to AT phone init object.
- * @param aPhoneGlobals pointer to phone global wide states.
- */
-    {
-    CGprs* gprs=new(ELeave) CGprs(aIo, aInit, aPhoneGlobals);
-    CleanupStack::PushL(gprs);
-    gprs->ConstructL();
-    CleanupStack::Pop();
-    return gprs;
-    }
-
-
-CGprs::CGprs(CATIO* aIo, CATInit*   aInit, CPhoneGlobals* aPhoneGlobals) 
-        : CSubSessionExtBase(), iIo(aIo), iInit(aInit), iPhoneGlobals(aPhoneGlobals)
-/**
- * Constructor
- *
- * @param aIo pointer to communication object.
- * @param aInit pointer to AT phone init object.
- * @param aPhoneGlobals pointer to phone global wide states.
- */
-    {
-    LOGTEXT(_L8("CGprs: Entered constructor"));
-    }    
-
-
-void CGprs::ConstructL()
-/**
- * Construct all objects that can leave.
- */
-    {
-    LOGTEXT(_L8("CGprs: ConstructL"));
-    iContexts.SetOffset(_FOFF(CGprsContextEntry,iLink));
-    iATGPRSAttach       = CATGprsAttach::NewL(iIo, this, iInit, iPhoneGlobals); 
-    iATGprsDetach       = CATGprsDetach::NewL(iIo, this, iInit, iPhoneGlobals); 
-    iATGprsClass        = CATGprsClass::NewL(iIo, this, iInit, iPhoneGlobals);
-    iATGprsNtwkRegStatusChange= CATGprsNtwkRegStatusChange::NewL(iIo,this,iPhoneGlobals);
-    iATGprsNtwkRegStatus= CATGprsNtwkRegStatus::NewL(iIo, this, iInit, iPhoneGlobals,iATGprsNtwkRegStatusChange);
-   	iMutex.CreateGlobal(KNullDesC, EOwnerProcess);
-    }
-    
-RHandleBase* CGprs::GlobalKernelObjectHandle()
-/**
-* Implements CSubSessionExtBase virtual method, which provides
-* handle of the mutex object to etel server that passes it up to clients.
-* @return pointer to synchronisation mutex object
-*/
-	{
-		return &iMutex;
-	}
-
-
-CGprs::~CGprs()
-/**
- * Destructor
- */
-    {
-    LOGTEXT(_L8("CGprs: Entered destructor"));
-	iMutex.Close();
-    iPhoneGlobals->iNotificationStore->RemoveClientFromLastEvents(this);
-    CGprsContextEntry* contextEntry;
-    TDblQueIter<CGprsContextEntry> iter(iContexts);
-    while (contextEntry=iter++, contextEntry)
-        {
-        contextEntry->Deque();
-        contextEntry->iContext->Close();
-        delete contextEntry;
-        __ASSERT_ALWAYS(iContexts.IsEmpty(),Panic(EPacketContextsRemaining));
-        }
-
-		delete iATGprsNtwkRegStatusChange;
-		delete iATGprsNtwkRegStatus;
-    delete iATGprsClass;
-    delete iATGprsDetach; 
-		delete iATGPRSAttach;
-    }
-
-
-void CGprs::Init()
-/**
- * This function does nothing.
- */
-    {
-    LOGTEXT(_L8("CGprs: init()"));
-    }
-
-
-CTelObject* CGprs::OpenNewObjectByNameL(const TDesC& /*aName*/)
-/**
- * This functionality does not have to be supported as it is
- * not requitred by the Etel Packet API (etelpckt).
- */
-    {  
-    LOGTEXT(_L8("CGprs::OpenNewObjectByNameL Leaving with KErrNotFound as this is not supported"));
-
-    User::Leave(KErrNotFound);		// Have to leave otherwise etel will think we have returned a
-		                              // valid CTelObject and will cause an access violation.
-
-		return NULL;
-    }
-
-
-CTelObject* CGprs::OpenNewObjectL(TDes& aNewName)
-/**
- * This function returns a pointer to a new context object.
- *
- * @param  aNewName name of the new context.
- */
-    {
-    TInt cid = 0;
-    GenerateNewContextNameAndCid(aNewName, cid);
-    if(cid > MaxNumberOfContexts())
-        User::Leave(KErrOverflow);
-#if defined __LOGDEB__ 
-    TBuf8<40> tmpLog;
-    tmpLog.Copy(aNewName);
-    LOGTEXT2(_L8("CGprs::OpenNewObjectL(), %S"), &tmpLog);
-#endif
-    RPacketContext::TContextConfigGPRS contextConfigV01;
-    ContextConfigGPRS(&contextConfigV01);
-    CGprsContext* context = CGprsContext::NewL(this, iIo, iInit, iPhoneGlobals, aNewName,  cid, &contextConfigV01);
-	CleanupStack::PushL(context);
-    AppendNewContextL(context);
-	CleanupStack::Pop(context);
-    iPhoneGlobals->iNotificationStore->CheckNotification(this, EPacketContextAddedChanged);
-    return context;
-    } 
-
-
-CTelObject::TReqMode CGprs::ReqModeL(const TInt aIpc)
-/**
- * This function is called from the framework and checks the flow control for a IPC call.
- * @param aIpc IPC call from client.
- */
-	{
-	CTelObject::TReqMode ret=0;
-	switch (aIpc)
-		{
-		case EPacketAttach:
-		case EPacketDetach:
-		case EPacketSetMSClass:
-			ret = KReqModeFlowControlObeyed;
-			break;
-		case EPacketGetNtwkRegStatus:
-			if (!iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
-				{
-				ret = KReqModeFlowControlObeyed;
-				}
-			break;
-		case EPacketGetMSClass:
-		case EPacketGetDynamicCaps:
-		case EPacketGetDefaultContextParams:
-		case EPacketGetStatus:
-		case EPacketEnumerateContexts:
-		case EPacketGetContextInfo:
-		case EPacketGetAttachMode:
-		case EPacketGetStaticCaps: 
-		case EPacketSetDefaultContextParams:
-		case EPacketRejectActivationRequest:
-		case EPacketSetAttachMode:
-			break;
-		case EPacketNotifyContextAdded:
-		case EPacketNotifyStatusChange:
-		case EPacketNotifyChangeOfNtwkRegStatus:	
-			ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
-			break; 
-		default:
-			User::Leave(KErrNotSupported);
-			break;
-		}
-
-	// Check if the data port is currently loaned. If it is and the requested IPC
-	// is flow controlled then block Etel calling the IPC by leaving with KErrInUse
-	if((ret&KReqModeFlowControlObeyed) && iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
-		{
-		LOGTEXT2(_L8("ReqModeL Leaving with KErrInUse as data port is loaned (aIpc=%d)"),aIpc);
-		User::Leave(KErrInUse);
-		}
-
-    return ret;
-    }
-
-TInt CGprs::RegisterNotification(const TInt aIpc)
-/**
- * This function is called from the framework.
- * @param  aIpc IPC call from client.
- */
-    {
-	LOGTEXT2(_L8("CGprs::RegisterNotification called with aIpc=%d"),aIpc);
-    switch (aIpc)
-        {
-        case EPacketNotifyContextAdded:
-        case EPacketNotifyStatusChange:
-        case EPacketNotifyContextActivationRequested:
-        case EPacketNotifyChangeOfNtwkRegStatus:
-        case EPacketNotifyMSClassChange:
-        case EPacketNotifyDynamicCapsChange:
-            return KErrNone;
-        default:
-            // Unknown or invalid IPC
-            LOGTEXT2(_L8("CGprs::RegisterNotification Error Unknown IPC, aIpc=%d"),aIpc);
-            return KErrNotSupported;
-        }
-    }
-
-
-TInt CGprs::DeregisterNotification(const TInt aIpc)
-/**
- * This function is called when there is no client listening to a notification anymore.
- * @param aIpc IPC call from client.
- */
-    {
-	LOGTEXT2(_L8("CGprs::DeregisterNotification called with aIpc=%d"),aIpc);
-    switch (aIpc)
-        {
-        case EPacketNotifyContextAdded:
-        case EPacketNotifyStatusChange:
-        case EPacketNotifyContextActivationRequested:
-        case EPacketNotifyChangeOfNtwkRegStatus:
-        case EPacketNotifyMSClassChange:
-        case EPacketNotifyDynamicCapsChange:
-            return KErrNone;
-        default:
-            // Unknown or invalid IPC
-            LOGTEXT2(_L8("CGprs::DeregisterNotification Error Unknown IPC, aIpc=%d"),aIpc);
-            return KErrNotSupported;
-        }
-    }
-
-
-TInt CGprs::NumberOfSlotsL(const TInt aIpc)
-/**
- * This function is called from the framework and checks the number of slots for a notification.
- * @param aIpc IPC call from client.
- */
-    {
-    TInt numberOfSlots=0;
-    switch (aIpc)
-        {
-        case EPacketNotifyStatusChange:
-        case EPacketNotifyDynamicCapsChange:
-            LOGTEXT(_L8("CGprs: Registered with 10 slot"));
-            numberOfSlots=10;
-            break;
-        case EPacketNotifyContextAdded:
-        case EPacketNotifyContextActivationRequested:
-        case EPacketNotifyChangeOfNtwkRegStatus:
-        case EPacketNotifyMSClassChange:
-            LOGTEXT(_L8("CGprs: Registered with 2 slot"));
-            numberOfSlots=2;
-            break;
-        default:
-            // Unknown or invalid IPC
-            LOGTEXT2(_L8("CGprs: Number of Slots error, unknown IPC:%d"),aIpc);
-            User::Leave(KErrNotSupported);
-            break;
-        }  
-    return numberOfSlots;
-    }
-
-
-TInt CGprs::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,const TDataPackage& aPackage)
-/**
- * This function is called from the framework.
- * @param aTsyReqHandle handle to client.
- * @param aIpc IPC call from client.
- * @param aPackage agruments with the IPC call.
- */
-    {
-    TAny* dataPtr=aPackage.Ptr1();
-    TAny* dataPtr2=aPackage.Ptr2();
-    switch (aIpc)
-        {
-        case EPacketNotifyContextAdded:
-            return NotifyContextAdded(aTsyReqHandle, aPackage.Des1u());
-        case EPacketGetStatus:
-            return GetStatus(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TStatus*, dataPtr));
-        case EPacketNotifyStatusChange:
-            return NotifyStatusChange(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TStatus*, dataPtr));
-        case EPacketNotifyContextActivationRequested:
-            return NotifyContextActivationRequested(aTsyReqHandle,
-			REINTERPRET_CAST(RPacketContext::TProtocolType*, dataPtr));
-        case EPacketEnumerateContexts:
-            return EnumerateContexts(aTsyReqHandle,
-            REINTERPRET_CAST(TInt*, dataPtr),
-            REINTERPRET_CAST(TInt*, dataPtr2));
-        case EPacketGetContextInfo:
-            return GetContextInfo(aTsyReqHandle,
-            *REINTERPRET_CAST(TInt*, dataPtr),
-            REINTERPRET_CAST(RPacketService::TContextInfo*, dataPtr2));
-        case EPacketGetNtwkRegStatus:
-            return GetNtwkRegStatus(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TRegistrationStatus*, dataPtr));
-        case EPacketNotifyChangeOfNtwkRegStatus:
-            return NotifyChangeOfNtwkRegStatus(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TRegistrationStatus*, dataPtr));
-        case EPacketGetMSClass:
-            return GetMSClass(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr),
-            REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr2));
-        case EPacketSetMSClass:
-            return SetMSClass(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr));
-        case EPacketNotifyMSClassChange:
-            return NotifyMSClassChange(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr));
-        case EPacketGetStaticCaps:
-            return GetStaticCaps(aTsyReqHandle, 
-				REINTERPRET_CAST(TUint*, dataPtr),
-				REINTERPRET_CAST(RPacketContext::TProtocolType*, dataPtr2));
-        case EPacketGetDynamicCaps:
-            return GetDynamicCaps(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TDynamicCapsFlags*, dataPtr));
-        case EPacketNotifyDynamicCapsChange:
-            return NotifyDynamicCapsChange(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TDynamicCapsFlags*, dataPtr));
-        case EPacketSetAttachMode:
-            return SetAttachMode(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
-        case EPacketGetAttachMode:
-            return GetAttachMode(aTsyReqHandle,
-            REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
-        case EPacketAttach:
-            return Attach(aTsyReqHandle);
-        case EPacketDetach:
-            return Detach(aTsyReqHandle);
-        case EPacketRejectActivationRequest:
-            return RejectActivationRequest(aTsyReqHandle);
-        case EPacketSetDefaultContextParams:
-            return SetDefaultContextParams(aTsyReqHandle, aPackage.Des1n());
-        case EPacketGetDefaultContextParams:
-            return GetDefaultContextParams(aTsyReqHandle, aPackage.Des1n());
-        default:
-            return KErrNotSupported;
-        }
-    }
-
-
-TInt CGprs::CancelService(const TInt aIpc, const TTsyReqHandle aTsyReqHandle)
-/**
- * This function is called from the framework and cancels a outstanding request.
- * @param aIpc The IPC to cancel.
- * @param aTsyReqHandle the client handle to cancel.
- */
-    {
-    LOGTEXT(_L8("CGprs: - CancelService called"));
-    switch (aIpc)
-        {
-        case EPacketNotifyContextAdded:
-            return NotifyContextAddedCancel(aTsyReqHandle);
-        case EPacketAttach:
-            return AttachCancel(aTsyReqHandle);
-        case EPacketDetach:
-            return DetachCancel(aTsyReqHandle);
-        case EPacketNotifyStatusChange:
-            return NotifyStatusChangeCancel(aTsyReqHandle);
-        case EPacketNotifyContextActivationRequested:
-            return NotifyContextActivationRequestedCancel(aTsyReqHandle);
-        case EPacketRejectActivationRequest:
-            return RejectActivationRequestCancel(aTsyReqHandle);
-        case EPacketGetContextInfo:
-            return GetContextInfoCancel(aTsyReqHandle);
-        case EPacketNotifyChangeOfNtwkRegStatus:
-            return NotifyChangeOfNtwkRegStatusCancel(aTsyReqHandle);
-        case EPacketGetMSClass:
-            return GetMSClassCancel(aTsyReqHandle);
-        case EPacketSetMSClass:
-            return SetMSClassCancel(aTsyReqHandle);
-        case EPacketNotifyMSClassChange:
-            return NotifyMSClassChangeCancel(aTsyReqHandle);
-        case EPacketNotifyDynamicCapsChange:
-            return NotifyDynamicCapsChangeCancel(aTsyReqHandle);
-				case EPacketGetNtwkRegStatus:
-            return GetNtwkRegStatusCancel(aTsyReqHandle);
-        default:
-            return KErrGeneral; // Should never get to this point, as Etel should try to cancel IPC we do not support
-        } 
-    }
-
-
-void CGprs::AppendNewContextL(CGprsContext* aNewContext)
-/**
- * This function adds a context to the list.
- *
- * @param aNewContext Adds a context to the linked list of contexts.
- */
-    {
-    LOGTEXT(_L8("CGprs::AppendNewContextL called"));
-    CGprsContextEntry* entry = new (ELeave) CGprsContextEntry(aNewContext);
-    iContexts.AddLast(*entry);
-    }
-
-
-void CGprs::RemoveContext(CGprsContext* aContext)
-/**
- * This function removes a context from the list.
- *
- * @param aContext Context to remove from linked list.
- */
-    {
-#ifdef _DEBUG
-    TBuf8<KMaxName> tmpLog;
-    tmpLog.Copy(*(aContext->ContextName()));		// Convert 16bit string to 8bit so we can log it
-    LOGTEXT2(_L8("CGprs::RemoveContext called, %S"), &tmpLog);
-#endif
-    CGprsContextEntry* contextEntry;
-    TDblQueIter<CGprsContextEntry> iter(iContexts);
-    while (contextEntry=iter++, contextEntry)
-        {
-        if (contextEntry->iContext == aContext)
-            {
-            contextEntry->Deque();
-            delete contextEntry;    // just deletes list entry, not the context itself
-            break;
-            }
-        }
-    }
-
-
-TDes* CGprs::NameOfLastAddedContext()
-/**
- * This function gets the name of the last added context.
- */
-    {
-    if (iContexts.IsEmpty())
-        return NULL;
-    CGprsContextEntry* contextEntry = iContexts.Last();
-    __ASSERT_ALWAYS(contextEntry,Panic(EPacketContextDoesNotExist));
-    return (contextEntry->iContext->ContextName());
-    }
-
-
-RPacketService::TStatus CGprs::Status()
-/**
- * This function returns the GPRS status.
- */
-    {
-    return iPhoneGlobals->iGprsStatus;
-    }
-
-
-void CGprs::SetStatus(RPacketService::TStatus aStatus)
-/**
- * This function sets the GPRS status.
- * @param aStatus Status to set.
- */
-
-    {
-    iPhoneGlobals->iGprsStatus = aStatus;
-    }
-
-RPacketService::TRegistrationStatus CGprs::RegistrationStatus()
-/**
- * This function returns the GPRS network registration status.
- */
-    {
-    return iPhoneGlobals->iGprsRegistrationStatus;
-    }
-
-
-void CGprs::SetRegistrationStatus(RPacketService::TRegistrationStatus aStatus)
-/**
- * This function sets the GPRS registration status.
- * @param aStatus Status to set.
- */
-    {
-    iPhoneGlobals->iGprsRegistrationStatus = aStatus;
-    }
-
-
-TInt CGprs::NumberOfContexts()
-/**
- * This function returns the number of contexts.
- */
-    {
-    TInt count=0;
-    TDblQueIter<CGprsContextEntry> iter(iContexts);
-    while (iter++)
-        {
-        count++;
-        }
-    return count;
-    }
-
-
-void CGprs::GenerateNewContextNameAndCid(TDes& aName, TInt& aCid)
-/**
- * This function generates a unique context name and the first not taken cid number.
- * There is a 1 to 1 mapping between this Cid and the one in the phone. 
- * In order to do this we need to check all existing Cids, since they may not
- * be in conical order and there can be holes in the list(3,1,4,6,5) we need 
- * to loop around and find the lowest that we can use to create a name and a new
- * Cid.
- * @param aName New name that is generated.
- * @param aCid New context id.
- */
-    {
-    TInt lowestAvailableCid = 1;
-    TInt count = NumberOfContexts();
-    if(count != 0 )
-        {
-        // There can be gaps between the Cids that the tsy has, so get the
-        // Cid number between them, if any. This nested for loop will find 
-        // the lowest available cid there is.
-        for(TInt k = 0; k < count;k++)
-            {
-            for(TInt i = 0; i < count;i++)
-                {
-                CGprsContext* context = Context(i);
-                if(context->Cid() == lowestAvailableCid)
-                    ++lowestAvailableCid;
-                }
-            }
-        }
-    aCid = lowestAvailableCid;
-    _LIT(KGprsName, "GPRS_CONTEXT");
-	aName.Zero();
-    aName.Append(KGprsName);
-    aName.AppendNum(lowestAvailableCid);
-    }
-
-
-RPacketService::TMSClass CGprs::CurrentMSClass()
-/**
- * This function returns the current MS class.
- */
-    {
-    return iPhoneGlobals->iMSClass;
-    }
-
-
-void CGprs::SetCurrentMSClass(RPacketService::TMSClass aMSClass)
-/**
- * This function sets the current MS class.
- *
- * @param aMSClass Current MSClass to set.
- */
-    {
-    iPhoneGlobals->iMSClass = aMSClass;
-    }
-
-
-RPacketService::TMSClass CGprs::MaxMSClass()
-/**
- * This function returns the maximum MS class.
- */
-    {
-    return iPhoneGlobals->iMaxMSClass;
-    }
-
-
-
-void CGprs::SetContextConfigGPRS(const RPacketContext::TContextConfigGPRS* aContextConfigV01)
-/**
- * This function sets the default context configuration.
- *
- * @param aContextConfigV01 Set default context configuration.
- */
-    {
-    iDefContextConfigGPRS.iPdpType = aContextConfigV01->iPdpType;
-    iDefContextConfigGPRS.iAccessPointName.Copy(aContextConfigV01->iAccessPointName);
-    iDefContextConfigGPRS.iPdpAddress.Copy(aContextConfigV01->iPdpAddress);
-    iDefContextConfigGPRS.iPdpCompression = aContextConfigV01->iPdpCompression;
-    iDefContextConfigGPRS.iAnonymousAccessReqd = aContextConfigV01->iAnonymousAccessReqd;
-    }
-
-
-void CGprs::ContextConfigGPRS(RPacketContext::TContextConfigGPRS* aContextConfigV01)
-/**
- * This function gets the default context configuration.
- *
- * @param aContextConfigV01 Default context configuration to get.
- */
-    {
-    aContextConfigV01->iPdpType = iDefContextConfigGPRS.iPdpType;
-    aContextConfigV01->iAccessPointName.Copy(iDefContextConfigGPRS.iAccessPointName);
-    aContextConfigV01->iPdpAddress.Copy(iDefContextConfigGPRS.iPdpAddress);
-    aContextConfigV01->iPdpCompression = iDefContextConfigGPRS.iPdpCompression;
-    aContextConfigV01->iAnonymousAccessReqd = iDefContextConfigGPRS.iAnonymousAccessReqd;
-    }
-
-
-TInt CGprs::MaxNumberOfContexts()
-/**
- * This function returns the maximum number of contexts that the phone supports.
- */
-
-    {
-    return iPhoneGlobals->iGprsMaxNumContexts;
-    }
-
-
-CGprsContext* CGprs::Context(TInt aCount)
-/**
- * This function returns a specific context
- * @param aCount context to Retrieve in linked list.
- */
-    {
-    if(aCount >= NumberOfContexts())
-        return NULL;
-    CGprsContextEntry* contextEntry;
-    TDblQueIter<CGprsContextEntry> iter(iContexts);
-    iter.SetToFirst();
-    for (TInt i=0;i<(aCount);i++)
-        {
-        iter++;
-        }
-    contextEntry = iter;    
-    return contextEntry->iContext;
-    }
-
-
-TInt CGprs::NotifyContextAdded(const TTsyReqHandle aTsyReqHandle, TDes* aContextId)
-    {
-    LOGTEXT(_L8("CGprs::NotifyContextAdded called"));
-    iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketContextAdded, aTsyReqHandle, this, aContextId);
-    return KErrNone;
-    }
-
-
-TInt CGprs::NotifyContextAddedCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyContextAddedCancel called"));
-    iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
-    return KErrNone;
-    }
-
-
-TInt CGprs::Attach(const TTsyReqHandle aTsyReqHandle)
-/**
- * Called from a client via ExtFunc.
- * This function will start the sending of a AT command(AT+CGATT=1). 
- * @param aTsyReqHandle  request handle that is completed when done with request.
- * @return 
- */
-    {
-    LOGTEXT(_L8("CGprs::Attach called"));
-    iATGPRSAttach->ExecuteCommand(aTsyReqHandle, NULL);		
-    return KErrNone;
-    }
-
-
-TInt CGprs::AttachCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::AttachCancel called"));
-    iATGPRSAttach->CancelCommand(aTsyReqHandle);	
-    return KErrNone;
-    }
-
-
-TInt CGprs::Detach(const TTsyReqHandle aTsyReqHandle)
-/**
- * Called from a client via ExtFunc.
- * This function will start the sending of a AT command(AT+CGATT=0). 
- * @param aTsyReqHandle  request handle that is completed when done with request.
- * @return 
- */
-    {
-    LOGTEXT(_L8("CGprs::Detach called"));
-    iATGprsDetach->ExecuteCommand(aTsyReqHandle, NULL);	
-    return KErrNone;
-    }
-
-
-TInt CGprs::DetachCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::DetachCancel called"));
-    iATGprsDetach->CancelCommand(aTsyReqHandle);	
-    return KErrNone;
-    }
-
-
-TInt CGprs::GetStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TStatus* aGprsStatus)
-/**
- * Called from a client via ExtFunc.
- * This function will return the state of the CGprs object
- * @param aTsyReqHandle  request handle that is completed when done with request.
- * @param  aGprsStatus   Pointer to a RPacketService::TStatus.
- */
-    {
-    LOGTEXT(_L8("CGprs::GetStatus called"));
-    *aGprsStatus = Status();
-    ReqCompleted(aTsyReqHandle,KErrNone);
-    return KErrNone;
-    }
-
- 
-TInt CGprs::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TStatus* aGprsStatus)
-/**
- * Called from a client via ExtFunc.
- * This function will complete when EPacketStatusChanged event is triggered.
- * @param aTsyReqHandle  request handle that is completed.
- * @param  aConfig  Pointer to a RPacketService::TStatus
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyStatusChange called"));
-    iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketStatusChange, aTsyReqHandle, this, aGprsStatus);
-    return KErrNone;
-    }
-
-
-TInt CGprs::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding notification request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyStatusChangeCancel called"));
-    iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
-    return KErrNone;
-    }
-
-
-TInt CGprs::NotifyContextActivationRequested(const TTsyReqHandle aTsyReqHandle, RPacketContext::TProtocolType* /*aPdpType*/)
-/**
- * This function is not supported.
- * @param aTsyReqHandle   request handle that is completed.
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyContextActivationRequested called"));
-    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req22
-    return KErrNone;
-    }
-
-
-TInt CGprs::NotifyContextActivationRequestedCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding notification request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyContextActivationRequestedCancel called"));
-    ReqCompleted(aTsyReqHandle, KErrNone); // Req23
-    return KErrNone;
-    }
-
-
-TInt CGprs::RejectActivationRequest(const TTsyReqHandle aTsyReqHandle)
-/**
- * This function is not supported.
- * @param aTsyReqHandle   request handle that is completed.
- */
-    {
-    LOGTEXT(_L8("CGprs::RejectActivationRequest called"));
-    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req24
-    return KErrNone;
-    }
-
-
-TInt CGprs::RejectActivationRequestCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::RejectActivationRequestCancel called"));
-    ReqCompleted(aTsyReqHandle, KErrCancel); // Req25
-    return KErrNone;
-    }
-
-
-TInt CGprs::EnumerateContexts(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed)
-/**
- * Called from a client via ExtFunc.
- * This function will return the current amount of contexts that the TSY has loaded and the
- * maximum amount of contexts that the phone support.
- * @param aTsyReqHandle  request handle that is completed.
- * @param  aCount Number of CGprsContext that the CGprs object has in its list.
- * @param  aMaxAllowed The largest context number, this is read from the phone.
- */
-    {
-    LOGTEXT(_L8("CGprs::EnumerateContexts called"));
-    *aCount = NumberOfContexts();
-    *aMaxAllowed = MaxNumberOfContexts();
-    ReqCompleted(aTsyReqHandle,KErrNone);
-    return KErrNone;
-    }
-
-
-TInt CGprs::GetContextInfo(const TTsyReqHandle aTsyReqHandle, TInt aIndex, RPacketService::TContextInfo* aInfo)
-/**
- * Called from a client via ExtFunc.
- * Returns the context info of aIndex in context list.
- * @param aTsyReqHandle  request handle that is completed.
- * @param  aIndex Context number
- * @param  aInfo  Pointer to a RPacketService::TContextInfo
- */
-    {
-    LOGTEXT2(_L8("CGprs::GetContextInfo called with aIndex=%d"),aIndex);
-
-	TInt ret(KErrNone);
-	if(aIndex>=0 &&	aIndex<=MaxNumberOfContexts())
-		{
-		TDblQueIter<CGprsContextEntry> iter(iContexts);
-		iter.SetToFirst();
-		for (TInt i=0;i!=aIndex;++i)
-			iter++;
-	    
-	    CGprsContextEntry* contextEntry=iter;
-		if (contextEntry)
-			*aInfo = *contextEntry->iContext->ContextInfo();
-		else
-			ret=KErrArgument;
-		}
-	else
-		ret=KErrArgument;
-
-	ReqCompleted(aTsyReqHandle,ret);
-    return KErrNone;
-    }
-
-
-TInt CGprs::GetContextInfoCancel(const TTsyReqHandle aTsyReqHandle) 
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::GetContextInfoCancel called"));
-    ReqCompleted(aTsyReqHandle, KErrCancel);
-    return KErrNone;
-    }
-
-
-TInt CGprs::GetNtwkRegStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TRegistrationStatus* aRegistrationStatus)
-/**
- * @param aTsyReqHandle request handle that is completed.
- */
-	{
-	LOGTEXT(_L8("CGprs::GetNtwkRegStatus called"));
-	if (iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
-		{
-		ReqCompleted(aTsyReqHandle, KErrNone);
-		}
-	else
-		{
-		iATGprsNtwkRegStatus->ExecuteCommand(aTsyReqHandle,aRegistrationStatus);
-		}
-	return KErrNone;
-	}
-
-TInt CGprs::GetNtwkRegStatusCancel(const TTsyReqHandle aTsyReqHandle) 
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-  {
-  LOGTEXT(_L8("CGprs::GetNtwkRegStatusCancel called"));
-  iATGprsNtwkRegStatus->CancelCommand(aTsyReqHandle);			
-  return KErrNone;
-  }
-
-
-TInt CGprs::NotifyChangeOfNtwkRegStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TRegistrationStatus* aRegistrationStatus)
-/**
- * This function is not supported.
- * @param aTsyReqHandle   request handle that is completed.
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyChangeOfNtwkRegStatus called"));		
-	if(iPhoneGlobals->iModemSupportsCGREGNotification)
-		{
-		// Make sure AT class watching for unsolicited registration result code is enabled
-		iATGprsNtwkRegStatusChange->Enable();
-		iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketNtwkRegStatusChange,aTsyReqHandle,this,aRegistrationStatus);
-		return KErrNone;
-		}
-
-    LOGTEXT(_L8("CGprs::NotifyChangeOfNtwkRegStatus returning KErrNotSupported"));		
-	return KErrNotSupported;		// Etel will complete the client request for us
-	}
-
-
-TInt CGprs::NotifyChangeOfNtwkRegStatusCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyChangeOfNtwkRegStatusCancel called"));
-    iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
-    return KErrNone;
-    }
-
-TInt CGprs::GetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aCurrentClass, RPacketService::TMSClass* aMaxClass)
-/**
- * Called from a client via ExtFunc.
- * This function returns the current RPacketService::TMSClass. It also returns the maximum class that the 
- * phone supports.
- * @param aTsyReqHandle  request handle that is completed.
- * @param  aCurrentClass  pointer to a  RPacketService::TMSClass
- * @param  aMaxClass      pointer to a  RPacketService::TMSClass
- */
-    {
-    LOGTEXT(_L8("CGprs::GetMSClass called"));
-    *aMaxClass = MaxMSClass();
-    *aCurrentClass = CurrentMSClass();
-    ReqCompleted(aTsyReqHandle, KErrNone);
-    return KErrNone;
-    }
-
-
-TInt CGprs::GetMSClassCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::GetMSClassCancel called"));
-    ReqCompleted(aTsyReqHandle, KErrCancel);
-    return KErrNone;
-    }
-
-
-TInt CGprs::SetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aClass)
-/**
- * Called from a client via ExtFunc.
- * This function will start the sending of a AT command to the phone(AT+CGCLASS).
- * @param aTsyReqHandle  request handle that is completed.
- * @param  aClass  pointer to a  RPacketService::TMSClass
- */
-    {
-    LOGTEXT(_L8("CGprs::SetMSClass called"));
-    iATGprsClass->ExecuteCommand(aTsyReqHandle, aClass);		
-    return KErrNone;
-    }
-
-
-TInt CGprs::SetMSClassCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::SetMSClassCancel called"));
-    iATGprsClass->CancelCommand(aTsyReqHandle);			
-    return KErrNone;
-    }   
-
-
-TInt CGprs::NotifyMSClassChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* /*aNewClass*/)
-/**
- * This function is not supported.
- * @param aTsyReqHandle   request handle that is completed.
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyMSClassChange called"));
-    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req26
-    return KErrNone;
-    }
-
-
-TInt CGprs::NotifyMSClassChangeCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyMSClassChangeCancel called"));
-    ReqCompleted(aTsyReqHandle, KErrCancel); // Req27
-    return KErrNone;
-    }
-   
-
-TInt CGprs::GetStaticCaps(const TTsyReqHandle aTsyReqHandle, TUint* aCaps, RPacketContext::TProtocolType* aPdpType)
-/**
- * Called from a client via ExtFunc.
- * This function returns the static caps that from the phone.
- * Note that in this function we validate the value of aPdpType.
- * @param aTsyReqHandle request handle that is completed. 
- * @param  aCaps     Pointer to a RPacketService::TStaticCaps  
- * @param  aPdpType  Pointer to a TPdpType
- */
-    {
-    LOGTEXT(_L8("CGprs::GetStaticCaps called"));
-    if (*aPdpType!=RPacketContext::EPdpTypeIPv4) 
-        {
-        LOGTEXT(_L8("CGprs::GetStaticCaps aPdpType is not EPdpTypeIPv4, completeing with KErrNotSupported"));
-				ReqCompleted(aTsyReqHandle,KErrNotSupported);
-        return KErrNone;
-        }
-		//
-		// Static caps are hardcoded according to the MMTSY design document.
-		*aCaps=RPacketService::KCapsSetDefaultContextSupported;
-		*aCaps|=RPacketService::KCapsMSClassSupported;
-
-    ReqCompleted(aTsyReqHandle,KErrNone);
-    return KErrNone;
-    }
-
-
-TInt CGprs::GetDynamicCaps(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* /*aCaps*/)
-/**
- * This function is not supported.
- * @param aTsyReqHandle   request handle that is completed.
- */
-    {
-    LOGTEXT(_L8("CGprs::GetDynamicCaps called"));
-    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req28
-    return KErrNone;
-    }
-
-
-TInt CGprs::NotifyDynamicCapsChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* /*aCaps*/)
-/**
- * This function is not supported.
- * @param aTsyReqHandle   request handle that is completed.
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyDynamicCapsChange called"));
-    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req29
-    return KErrNone;
-    }
-
-
-TInt CGprs::NotifyDynamicCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle  The handle to cancel
- */
-    {
-    LOGTEXT(_L8("CGprs::NotifyDynamicCapsChangeCancel called"));
-    ReqCompleted(aTsyReqHandle, KErrCancel); // Req30
-    return KErrNone;
-    }
-
-
-TInt CGprs::SetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* /*aMode*/)
-/**
- * This function is not supported.
- * @param aTsyReqHandle   request handle that is completed.
- */
-    {
-    LOGTEXT(_L8("CGprs::SetAttachMode called"));
-    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req40
-    return KErrNone;
-    }
-
-
-TInt CGprs::GetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* /*aMode*/)
-/**
- * This function is not supported.
- * @param aTsyReqHandle   request handle that is completed.
- */
-    {
-    LOGTEXT(_L8("CGprs::GetAttachMode called"));
-    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req41
-    return KErrNone;
-    }
-
-
-TInt CGprs::SetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, const TDesC8* aPckg)
-/**
- * Called from a client via ExtFunc.
- * This function will set the default parameters for a context.
- * These parameters are used when a new context is created.
- * @param aTsyReqHandle  request handle that is completed.
- * @param  aPckg Pointer to a RPacketContext::TContextConfigPckg
- */
-
-    {
-    LOGTEXT(_L8("CGprs::SetDefaultContextParams called"));
-	TPckg<RPacketContext::TContextConfigGPRS>* defaultContextV1Pckg = (TPckg<RPacketContext::TContextConfigGPRS>*) aPckg;
-	RPacketContext::TContextConfigGPRS& defaultContextV1 = (*defaultContextV1Pckg)();
-	SetContextConfigGPRS(&defaultContextV1);
-    ReqCompleted(aTsyReqHandle,KErrNone);
-    return KErrNone;
-    }
-
-
-TInt CGprs::GetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg)
-/**
- * Called from a client via ExtFunc.
- * This function will get the default parameters for a context.
- * @param aTsyReqHandle  request handle that is completed.
- * @param  aPckg Pointer to a RPacketContext::TContextConfigPckg
- */
-
-    {
-    LOGTEXT(_L8("CGprs::GetDefaultContextParams called"));
-	TPckg<RPacketContext::TContextConfigGPRS>* defaultContextV1Pckg = (TPckg<RPacketContext::TContextConfigGPRS>*) aPckg;
-	RPacketContext::TContextConfigGPRS& defaultContextV1 = (*defaultContextV1Pckg)();
-    ContextConfigGPRS(&defaultContextV1);
-    ReqCompleted(aTsyReqHandle,KErrNone);
-    return KErrNone;
-    }
-
-
-//
-// CGprsContextEntry class
-//
-CGprsContextEntry::CGprsContextEntry(CGprsContext* aContext)
-: iContext(aContext)
-/**
- * Constructor
- * @param aContext Context to add to entry
- */
-    {}
-
-
-CGprsContextEntry::~CGprsContextEntry()
-/**
- * Destructor
- */
-    {}
-
-
-void CGprsContextEntry::Deque()
-/**
- * Remove entry from TDblQue link
- */
-    {
-    iLink.Deque();
-    iLink.iPrev=iLink.iNext=NULL;
-    }
+// Copyright (c) 2001-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:
+// This file implements the CGprs class. Used to implement the RPacketService API.
+// This file also implements the CGprsContextEntry class used to store a pointer to a CGprsContext object.
+// 
+//
+
+/**
+ @file
+*/
+
+#include "Gprscontext.h"
+#include "mSLOGGER.H"
+#include "NOTIFY.H"
+#include "ATGprsAttach.H"
+#include "ATGprsDetach.H"
+#include "AtGprsClass.h"
+#include "atgprsntwkregstatus.h"					// for CATGprsNtwkRegStatus
+#include "atgprsntwkregstatuschange.h"		// for CATGprsNtwkRegStatusChange
+#include "ATIO.H"
+#include "ATHANGUP.H"
+
+
+CGprs* CGprs::NewL(CATIO* aIo, CATInit* aInit, CPhoneGlobals* aPhoneGlobals)
+/**
+ * Standard 2 phase constructor.
+ *
+ * @param aIo pointer to communication object.
+ * @param aInit pointer to AT phone init object.
+ * @param aPhoneGlobals pointer to phone global wide states.
+ */
+    {
+    CGprs* gprs=new(ELeave) CGprs(aIo, aInit, aPhoneGlobals);
+    CleanupStack::PushL(gprs);
+    gprs->ConstructL();
+    CleanupStack::Pop();
+    return gprs;
+    }
+
+
+CGprs::CGprs(CATIO* aIo, CATInit*   aInit, CPhoneGlobals* aPhoneGlobals) 
+        : CSubSessionExtBase(), iIo(aIo), iInit(aInit), iPhoneGlobals(aPhoneGlobals)
+/**
+ * Constructor
+ *
+ * @param aIo pointer to communication object.
+ * @param aInit pointer to AT phone init object.
+ * @param aPhoneGlobals pointer to phone global wide states.
+ */
+    {
+    LOGTEXT(_L8("CGprs: Entered constructor"));
+    }    
+
+
+void CGprs::ConstructL()
+/**
+ * Construct all objects that can leave.
+ */
+    {
+    LOGTEXT(_L8("CGprs: ConstructL"));
+    iContexts.SetOffset(_FOFF(CGprsContextEntry,iLink));
+    iATGPRSAttach       = CATGprsAttach::NewL(iIo, this, iInit, iPhoneGlobals); 
+    iATGprsDetach       = CATGprsDetach::NewL(iIo, this, iInit, iPhoneGlobals); 
+    iATGprsClass        = CATGprsClass::NewL(iIo, this, iInit, iPhoneGlobals);
+    iATGprsNtwkRegStatusChange= CATGprsNtwkRegStatusChange::NewL(iIo,this,iPhoneGlobals);
+    iATGprsNtwkRegStatus= CATGprsNtwkRegStatus::NewL(iIo, this, iInit, iPhoneGlobals,iATGprsNtwkRegStatusChange);
+   	iMutex.CreateGlobal(KNullDesC, EOwnerProcess);
+    }
+    
+RHandleBase* CGprs::GlobalKernelObjectHandle()
+/**
+* Implements CSubSessionExtBase virtual method, which provides
+* handle of the mutex object to etel server that passes it up to clients.
+* @return pointer to synchronisation mutex object
+*/
+	{
+		return &iMutex;
+	}
+
+
+CGprs::~CGprs()
+/**
+ * Destructor
+ */
+    {
+    LOGTEXT(_L8("CGprs: Entered destructor"));
+	iMutex.Close();
+    iPhoneGlobals->iNotificationStore->RemoveClientFromLastEvents(this);
+    CGprsContextEntry* contextEntry;
+    TDblQueIter<CGprsContextEntry> iter(iContexts);
+    while (contextEntry=iter++, contextEntry)
+        {
+        contextEntry->Deque();
+        contextEntry->iContext->Close();
+        delete contextEntry;
+        __ASSERT_ALWAYS(iContexts.IsEmpty(),Panic(EPacketContextsRemaining));
+        }
+
+		delete iATGprsNtwkRegStatusChange;
+		delete iATGprsNtwkRegStatus;
+    delete iATGprsClass;
+    delete iATGprsDetach; 
+		delete iATGPRSAttach;
+    }
+
+
+void CGprs::Init()
+/**
+ * This function does nothing.
+ */
+    {
+    LOGTEXT(_L8("CGprs: init()"));
+    }
+
+
+CTelObject* CGprs::OpenNewObjectByNameL(const TDesC& /*aName*/)
+/**
+ * This functionality does not have to be supported as it is
+ * not requitred by the Etel Packet API (etelpckt).
+ */
+    {  
+    LOGTEXT(_L8("CGprs::OpenNewObjectByNameL Leaving with KErrNotFound as this is not supported"));
+
+    User::Leave(KErrNotFound);		// Have to leave otherwise etel will think we have returned a
+		                              // valid CTelObject and will cause an access violation.
+
+		return NULL;
+    }
+
+
+CTelObject* CGprs::OpenNewObjectL(TDes& aNewName)
+/**
+ * This function returns a pointer to a new context object.
+ *
+ * @param  aNewName name of the new context.
+ */
+    {
+    TInt cid = 0;
+    GenerateNewContextNameAndCid(aNewName, cid);
+    if(cid > MaxNumberOfContexts())
+        User::Leave(KErrOverflow);
+#if defined __LOGDEB__ 
+    TBuf8<40> tmpLog;
+    tmpLog.Copy(aNewName);
+    LOGTEXT2(_L8("CGprs::OpenNewObjectL(), %S"), &tmpLog);
+#endif
+    RPacketContext::TContextConfigGPRS contextConfigV01;
+    ContextConfigGPRS(&contextConfigV01);
+    CGprsContext* context = CGprsContext::NewL(this, iIo, iInit, iPhoneGlobals, aNewName,  cid, &contextConfigV01);
+	CleanupStack::PushL(context);
+    AppendNewContextL(context);
+	CleanupStack::Pop(context);
+    iPhoneGlobals->iNotificationStore->CheckNotification(this, EPacketContextAddedChanged);
+    return context;
+    } 
+
+
+CTelObject::TReqMode CGprs::ReqModeL(const TInt aIpc)
+/**
+ * This function is called from the framework and checks the flow control for a IPC call.
+ * @param aIpc IPC call from client.
+ */
+	{
+	CTelObject::TReqMode ret=0;
+	switch (aIpc)
+		{
+		case EPacketAttach:
+		case EPacketDetach:
+		case EPacketSetMSClass:
+			ret = KReqModeFlowControlObeyed;
+			break;
+		case EPacketGetNtwkRegStatus:
+			if (!iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
+				{
+				ret = KReqModeFlowControlObeyed;
+				}
+			break;
+		case EPacketGetMSClass:
+		case EPacketGetDynamicCaps:
+		case EPacketGetDefaultContextParams:
+		case EPacketGetStatus:
+		case EPacketEnumerateContexts:
+		case EPacketGetContextInfo:
+		case EPacketGetAttachMode:
+		case EPacketGetStaticCaps: 
+		case EPacketSetDefaultContextParams:
+		case EPacketRejectActivationRequest:
+		case EPacketSetAttachMode:
+			break;
+		case EPacketNotifyContextAdded:
+		case EPacketNotifyStatusChange:
+		case EPacketNotifyChangeOfNtwkRegStatus:	
+			ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+			break; 
+		default:
+			User::Leave(KErrNotSupported);
+			break;
+		}
+
+	// Check if the data port is currently loaned. If it is and the requested IPC
+	// is flow controlled then block Etel calling the IPC by leaving with KErrInUse
+	if((ret&KReqModeFlowControlObeyed) && iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
+		{
+		LOGTEXT2(_L8("ReqModeL Leaving with KErrInUse as data port is loaned (aIpc=%d)"),aIpc);
+		User::Leave(KErrInUse);
+		}
+
+    return ret;
+    }
+
+TInt CGprs::RegisterNotification(const TInt aIpc)
+/**
+ * This function is called from the framework.
+ * @param  aIpc IPC call from client.
+ */
+    {
+	LOGTEXT2(_L8("CGprs::RegisterNotification called with aIpc=%d"),aIpc);
+    switch (aIpc)
+        {
+        case EPacketNotifyContextAdded:
+        case EPacketNotifyStatusChange:
+        case EPacketNotifyContextActivationRequested:
+        case EPacketNotifyChangeOfNtwkRegStatus:
+        case EPacketNotifyMSClassChange:
+        case EPacketNotifyDynamicCapsChange:
+            return KErrNone;
+        default:
+            // Unknown or invalid IPC
+            LOGTEXT2(_L8("CGprs::RegisterNotification Error Unknown IPC, aIpc=%d"),aIpc);
+            return KErrNotSupported;
+        }
+    }
+
+
+TInt CGprs::DeregisterNotification(const TInt aIpc)
+/**
+ * This function is called when there is no client listening to a notification anymore.
+ * @param aIpc IPC call from client.
+ */
+    {
+	LOGTEXT2(_L8("CGprs::DeregisterNotification called with aIpc=%d"),aIpc);
+    switch (aIpc)
+        {
+        case EPacketNotifyContextAdded:
+        case EPacketNotifyStatusChange:
+        case EPacketNotifyContextActivationRequested:
+        case EPacketNotifyChangeOfNtwkRegStatus:
+        case EPacketNotifyMSClassChange:
+        case EPacketNotifyDynamicCapsChange:
+            return KErrNone;
+        default:
+            // Unknown or invalid IPC
+            LOGTEXT2(_L8("CGprs::DeregisterNotification Error Unknown IPC, aIpc=%d"),aIpc);
+            return KErrNotSupported;
+        }
+    }
+
+
+TInt CGprs::NumberOfSlotsL(const TInt aIpc)
+/**
+ * This function is called from the framework and checks the number of slots for a notification.
+ * @param aIpc IPC call from client.
+ */
+    {
+    TInt numberOfSlots=0;
+    switch (aIpc)
+        {
+        case EPacketNotifyStatusChange:
+        case EPacketNotifyDynamicCapsChange:
+            LOGTEXT(_L8("CGprs: Registered with 10 slot"));
+            numberOfSlots=10;
+            break;
+        case EPacketNotifyContextAdded:
+        case EPacketNotifyContextActivationRequested:
+        case EPacketNotifyChangeOfNtwkRegStatus:
+        case EPacketNotifyMSClassChange:
+            LOGTEXT(_L8("CGprs: Registered with 2 slot"));
+            numberOfSlots=2;
+            break;
+        default:
+            // Unknown or invalid IPC
+            LOGTEXT2(_L8("CGprs: Number of Slots error, unknown IPC:%d"),aIpc);
+            User::Leave(KErrNotSupported);
+            break;
+        }  
+    return numberOfSlots;
+    }
+
+
+TInt CGprs::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,const TDataPackage& aPackage)
+/**
+ * This function is called from the framework.
+ * @param aTsyReqHandle handle to client.
+ * @param aIpc IPC call from client.
+ * @param aPackage agruments with the IPC call.
+ */
+    {
+    TAny* dataPtr=aPackage.Ptr1();
+    TAny* dataPtr2=aPackage.Ptr2();
+    switch (aIpc)
+        {
+        case EPacketNotifyContextAdded:
+            return NotifyContextAdded(aTsyReqHandle, aPackage.Des1u());
+        case EPacketGetStatus:
+            return GetStatus(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TStatus*, dataPtr));
+        case EPacketNotifyStatusChange:
+            return NotifyStatusChange(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TStatus*, dataPtr));
+        case EPacketNotifyContextActivationRequested:
+            return NotifyContextActivationRequested(aTsyReqHandle,
+			REINTERPRET_CAST(RPacketContext::TProtocolType*, dataPtr));
+        case EPacketEnumerateContexts:
+            return EnumerateContexts(aTsyReqHandle,
+            REINTERPRET_CAST(TInt*, dataPtr),
+            REINTERPRET_CAST(TInt*, dataPtr2));
+        case EPacketGetContextInfo:
+            return GetContextInfo(aTsyReqHandle,
+            *REINTERPRET_CAST(TInt*, dataPtr),
+            REINTERPRET_CAST(RPacketService::TContextInfo*, dataPtr2));
+        case EPacketGetNtwkRegStatus:
+            return GetNtwkRegStatus(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TRegistrationStatus*, dataPtr));
+        case EPacketNotifyChangeOfNtwkRegStatus:
+            return NotifyChangeOfNtwkRegStatus(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TRegistrationStatus*, dataPtr));
+        case EPacketGetMSClass:
+            return GetMSClass(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr),
+            REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr2));
+        case EPacketSetMSClass:
+            return SetMSClass(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr));
+        case EPacketNotifyMSClassChange:
+            return NotifyMSClassChange(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TMSClass*, dataPtr));
+        case EPacketGetStaticCaps:
+            return GetStaticCaps(aTsyReqHandle, 
+				REINTERPRET_CAST(TUint*, dataPtr),
+				REINTERPRET_CAST(RPacketContext::TProtocolType*, dataPtr2));
+        case EPacketGetDynamicCaps:
+            return GetDynamicCaps(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TDynamicCapsFlags*, dataPtr));
+        case EPacketNotifyDynamicCapsChange:
+            return NotifyDynamicCapsChange(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TDynamicCapsFlags*, dataPtr));
+        case EPacketSetAttachMode:
+            return SetAttachMode(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
+        case EPacketGetAttachMode:
+            return GetAttachMode(aTsyReqHandle,
+            REINTERPRET_CAST(RPacketService::TAttachMode*, dataPtr));
+        case EPacketAttach:
+            return Attach(aTsyReqHandle);
+        case EPacketDetach:
+            return Detach(aTsyReqHandle);
+        case EPacketRejectActivationRequest:
+            return RejectActivationRequest(aTsyReqHandle);
+        case EPacketSetDefaultContextParams:
+            return SetDefaultContextParams(aTsyReqHandle, aPackage.Des1n());
+        case EPacketGetDefaultContextParams:
+            return GetDefaultContextParams(aTsyReqHandle, aPackage.Des1n());
+        default:
+            return KErrNotSupported;
+        }
+    }
+
+
+TInt CGprs::CancelService(const TInt aIpc, const TTsyReqHandle aTsyReqHandle)
+/**
+ * This function is called from the framework and cancels a outstanding request.
+ * @param aIpc The IPC to cancel.
+ * @param aTsyReqHandle the client handle to cancel.
+ */
+    {
+    LOGTEXT(_L8("CGprs: - CancelService called"));
+    switch (aIpc)
+        {
+        case EPacketNotifyContextAdded:
+            return NotifyContextAddedCancel(aTsyReqHandle);
+        case EPacketAttach:
+            return AttachCancel(aTsyReqHandle);
+        case EPacketDetach:
+            return DetachCancel(aTsyReqHandle);
+        case EPacketNotifyStatusChange:
+            return NotifyStatusChangeCancel(aTsyReqHandle);
+        case EPacketNotifyContextActivationRequested:
+            return NotifyContextActivationRequestedCancel(aTsyReqHandle);
+        case EPacketRejectActivationRequest:
+            return RejectActivationRequestCancel(aTsyReqHandle);
+        case EPacketGetContextInfo:
+            return GetContextInfoCancel(aTsyReqHandle);
+        case EPacketNotifyChangeOfNtwkRegStatus:
+            return NotifyChangeOfNtwkRegStatusCancel(aTsyReqHandle);
+        case EPacketGetMSClass:
+            return GetMSClassCancel(aTsyReqHandle);
+        case EPacketSetMSClass:
+            return SetMSClassCancel(aTsyReqHandle);
+        case EPacketNotifyMSClassChange:
+            return NotifyMSClassChangeCancel(aTsyReqHandle);
+        case EPacketNotifyDynamicCapsChange:
+            return NotifyDynamicCapsChangeCancel(aTsyReqHandle);
+				case EPacketGetNtwkRegStatus:
+            return GetNtwkRegStatusCancel(aTsyReqHandle);
+        default:
+            return KErrGeneral; // Should never get to this point, as Etel should try to cancel IPC we do not support
+        } 
+    }
+
+
+void CGprs::AppendNewContextL(CGprsContext* aNewContext)
+/**
+ * This function adds a context to the list.
+ *
+ * @param aNewContext Adds a context to the linked list of contexts.
+ */
+    {
+    LOGTEXT(_L8("CGprs::AppendNewContextL called"));
+    CGprsContextEntry* entry = new (ELeave) CGprsContextEntry(aNewContext);
+    iContexts.AddLast(*entry);
+    }
+
+
+void CGprs::RemoveContext(CGprsContext* aContext)
+/**
+ * This function removes a context from the list.
+ *
+ * @param aContext Context to remove from linked list.
+ */
+    {
+#ifdef _DEBUG
+    TBuf8<KMaxName> tmpLog;
+    tmpLog.Copy(*(aContext->ContextName()));		// Convert 16bit string to 8bit so we can log it
+    LOGTEXT2(_L8("CGprs::RemoveContext called, %S"), &tmpLog);
+#endif
+    CGprsContextEntry* contextEntry;
+    TDblQueIter<CGprsContextEntry> iter(iContexts);
+    while (contextEntry=iter++, contextEntry)
+        {
+        if (contextEntry->iContext == aContext)
+            {
+            contextEntry->Deque();
+            delete contextEntry;    // just deletes list entry, not the context itself
+            break;
+            }
+        }
+    }
+
+
+TDes* CGprs::NameOfLastAddedContext()
+/**
+ * This function gets the name of the last added context.
+ */
+    {
+    if (iContexts.IsEmpty())
+        return NULL;
+    CGprsContextEntry* contextEntry = iContexts.Last();
+    __ASSERT_ALWAYS(contextEntry,Panic(EPacketContextDoesNotExist));
+    return (contextEntry->iContext->ContextName());
+    }
+
+
+RPacketService::TStatus CGprs::Status()
+/**
+ * This function returns the GPRS status.
+ */
+    {
+    return iPhoneGlobals->iGprsStatus;
+    }
+
+
+void CGprs::SetStatus(RPacketService::TStatus aStatus)
+/**
+ * This function sets the GPRS status.
+ * @param aStatus Status to set.
+ */
+
+    {
+    iPhoneGlobals->iGprsStatus = aStatus;
+    }
+
+RPacketService::TRegistrationStatus CGprs::RegistrationStatus()
+/**
+ * This function returns the GPRS network registration status.
+ */
+    {
+    return iPhoneGlobals->iGprsRegistrationStatus;
+    }
+
+
+void CGprs::SetRegistrationStatus(RPacketService::TRegistrationStatus aStatus)
+/**
+ * This function sets the GPRS registration status.
+ * @param aStatus Status to set.
+ */
+    {
+    iPhoneGlobals->iGprsRegistrationStatus = aStatus;
+    }
+
+
+TInt CGprs::NumberOfContexts()
+/**
+ * This function returns the number of contexts.
+ */
+    {
+    TInt count=0;
+    TDblQueIter<CGprsContextEntry> iter(iContexts);
+    while (iter++)
+        {
+        count++;
+        }
+    return count;
+    }
+
+
+void CGprs::GenerateNewContextNameAndCid(TDes& aName, TInt& aCid)
+/**
+ * This function generates a unique context name and the first not taken cid number.
+ * There is a 1 to 1 mapping between this Cid and the one in the phone. 
+ * In order to do this we need to check all existing Cids, since they may not
+ * be in conical order and there can be holes in the list(3,1,4,6,5) we need 
+ * to loop around and find the lowest that we can use to create a name and a new
+ * Cid.
+ * @param aName New name that is generated.
+ * @param aCid New context id.
+ */
+    {
+    TInt lowestAvailableCid = 1;
+    TInt count = NumberOfContexts();
+    if(count != 0 )
+        {
+        // There can be gaps between the Cids that the tsy has, so get the
+        // Cid number between them, if any. This nested for loop will find 
+        // the lowest available cid there is.
+        for(TInt k = 0; k < count;k++)
+            {
+            for(TInt i = 0; i < count;i++)
+                {
+                CGprsContext* context = Context(i);
+                if(context->Cid() == lowestAvailableCid)
+                    ++lowestAvailableCid;
+                }
+            }
+        }
+    aCid = lowestAvailableCid;
+    _LIT(KGprsName, "GPRS_CONTEXT");
+	aName.Zero();
+    aName.Append(KGprsName);
+    aName.AppendNum(lowestAvailableCid);
+    }
+
+
+RPacketService::TMSClass CGprs::CurrentMSClass()
+/**
+ * This function returns the current MS class.
+ */
+    {
+    return iPhoneGlobals->iMSClass;
+    }
+
+
+void CGprs::SetCurrentMSClass(RPacketService::TMSClass aMSClass)
+/**
+ * This function sets the current MS class.
+ *
+ * @param aMSClass Current MSClass to set.
+ */
+    {
+    iPhoneGlobals->iMSClass = aMSClass;
+    }
+
+
+RPacketService::TMSClass CGprs::MaxMSClass()
+/**
+ * This function returns the maximum MS class.
+ */
+    {
+    return iPhoneGlobals->iMaxMSClass;
+    }
+
+
+
+void CGprs::SetContextConfigGPRS(const RPacketContext::TContextConfigGPRS* aContextConfigV01)
+/**
+ * This function sets the default context configuration.
+ *
+ * @param aContextConfigV01 Set default context configuration.
+ */
+    {
+    iDefContextConfigGPRS.iPdpType = aContextConfigV01->iPdpType;
+    iDefContextConfigGPRS.iAccessPointName.Copy(aContextConfigV01->iAccessPointName);
+    iDefContextConfigGPRS.iPdpAddress.Copy(aContextConfigV01->iPdpAddress);
+    iDefContextConfigGPRS.iPdpCompression = aContextConfigV01->iPdpCompression;
+    iDefContextConfigGPRS.iAnonymousAccessReqd = aContextConfigV01->iAnonymousAccessReqd;
+    }
+
+
+void CGprs::ContextConfigGPRS(RPacketContext::TContextConfigGPRS* aContextConfigV01)
+/**
+ * This function gets the default context configuration.
+ *
+ * @param aContextConfigV01 Default context configuration to get.
+ */
+    {
+    aContextConfigV01->iPdpType = iDefContextConfigGPRS.iPdpType;
+    aContextConfigV01->iAccessPointName.Copy(iDefContextConfigGPRS.iAccessPointName);
+    aContextConfigV01->iPdpAddress.Copy(iDefContextConfigGPRS.iPdpAddress);
+    aContextConfigV01->iPdpCompression = iDefContextConfigGPRS.iPdpCompression;
+    aContextConfigV01->iAnonymousAccessReqd = iDefContextConfigGPRS.iAnonymousAccessReqd;
+    }
+
+
+TInt CGprs::MaxNumberOfContexts()
+/**
+ * This function returns the maximum number of contexts that the phone supports.
+ */
+
+    {
+    return iPhoneGlobals->iGprsMaxNumContexts;
+    }
+
+
+CGprsContext* CGprs::Context(TInt aCount)
+/**
+ * This function returns a specific context
+ * @param aCount context to Retrieve in linked list.
+ */
+    {
+    if(aCount >= NumberOfContexts())
+        return NULL;
+    CGprsContextEntry* contextEntry;
+    TDblQueIter<CGprsContextEntry> iter(iContexts);
+    iter.SetToFirst();
+    for (TInt i=0;i<(aCount);i++)
+        {
+        iter++;
+        }
+    contextEntry = iter;    
+    return contextEntry->iContext;
+    }
+
+
+TInt CGprs::NotifyContextAdded(const TTsyReqHandle aTsyReqHandle, TDes* aContextId)
+    {
+    LOGTEXT(_L8("CGprs::NotifyContextAdded called"));
+    iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketContextAdded, aTsyReqHandle, this, aContextId);
+    return KErrNone;
+    }
+
+
+TInt CGprs::NotifyContextAddedCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyContextAddedCancel called"));
+    iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
+    return KErrNone;
+    }
+
+
+TInt CGprs::Attach(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Called from a client via ExtFunc.
+ * This function will start the sending of a AT command(AT+CGATT=1). 
+ * @param aTsyReqHandle  request handle that is completed when done with request.
+ * @return 
+ */
+    {
+    LOGTEXT(_L8("CGprs::Attach called"));
+    iATGPRSAttach->ExecuteCommand(aTsyReqHandle, NULL);		
+    return KErrNone;
+    }
+
+
+TInt CGprs::AttachCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::AttachCancel called"));
+    iATGPRSAttach->CancelCommand(aTsyReqHandle);	
+    return KErrNone;
+    }
+
+
+TInt CGprs::Detach(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Called from a client via ExtFunc.
+ * This function will start the sending of a AT command(AT+CGATT=0). 
+ * @param aTsyReqHandle  request handle that is completed when done with request.
+ * @return 
+ */
+    {
+    LOGTEXT(_L8("CGprs::Detach called"));
+    iATGprsDetach->ExecuteCommand(aTsyReqHandle, NULL);	
+    return KErrNone;
+    }
+
+
+TInt CGprs::DetachCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::DetachCancel called"));
+    iATGprsDetach->CancelCommand(aTsyReqHandle);	
+    return KErrNone;
+    }
+
+
+TInt CGprs::GetStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TStatus* aGprsStatus)
+/**
+ * Called from a client via ExtFunc.
+ * This function will return the state of the CGprs object
+ * @param aTsyReqHandle  request handle that is completed when done with request.
+ * @param  aGprsStatus   Pointer to a RPacketService::TStatus.
+ */
+    {
+    LOGTEXT(_L8("CGprs::GetStatus called"));
+    *aGprsStatus = Status();
+    ReqCompleted(aTsyReqHandle,KErrNone);
+    return KErrNone;
+    }
+
+ 
+TInt CGprs::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TStatus* aGprsStatus)
+/**
+ * Called from a client via ExtFunc.
+ * This function will complete when EPacketStatusChanged event is triggered.
+ * @param aTsyReqHandle  request handle that is completed.
+ * @param  aConfig  Pointer to a RPacketService::TStatus
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyStatusChange called"));
+    iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketStatusChange, aTsyReqHandle, this, aGprsStatus);
+    return KErrNone;
+    }
+
+
+TInt CGprs::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding notification request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyStatusChangeCancel called"));
+    iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
+    return KErrNone;
+    }
+
+
+TInt CGprs::NotifyContextActivationRequested(const TTsyReqHandle aTsyReqHandle, RPacketContext::TProtocolType* /*aPdpType*/)
+/**
+ * This function is not supported.
+ * @param aTsyReqHandle   request handle that is completed.
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyContextActivationRequested called"));
+    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req22
+    return KErrNone;
+    }
+
+
+TInt CGprs::NotifyContextActivationRequestedCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding notification request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyContextActivationRequestedCancel called"));
+    ReqCompleted(aTsyReqHandle, KErrNone); // Req23
+    return KErrNone;
+    }
+
+
+TInt CGprs::RejectActivationRequest(const TTsyReqHandle aTsyReqHandle)
+/**
+ * This function is not supported.
+ * @param aTsyReqHandle   request handle that is completed.
+ */
+    {
+    LOGTEXT(_L8("CGprs::RejectActivationRequest called"));
+    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req24
+    return KErrNone;
+    }
+
+
+TInt CGprs::RejectActivationRequestCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::RejectActivationRequestCancel called"));
+    ReqCompleted(aTsyReqHandle, KErrCancel); // Req25
+    return KErrNone;
+    }
+
+
+TInt CGprs::EnumerateContexts(const TTsyReqHandle aTsyReqHandle, TInt* aCount, TInt* aMaxAllowed)
+/**
+ * Called from a client via ExtFunc.
+ * This function will return the current amount of contexts that the TSY has loaded and the
+ * maximum amount of contexts that the phone support.
+ * @param aTsyReqHandle  request handle that is completed.
+ * @param  aCount Number of CGprsContext that the CGprs object has in its list.
+ * @param  aMaxAllowed The largest context number, this is read from the phone.
+ */
+    {
+    LOGTEXT(_L8("CGprs::EnumerateContexts called"));
+    *aCount = NumberOfContexts();
+    *aMaxAllowed = MaxNumberOfContexts();
+    ReqCompleted(aTsyReqHandle,KErrNone);
+    return KErrNone;
+    }
+
+
+TInt CGprs::GetContextInfo(const TTsyReqHandle aTsyReqHandle, TInt aIndex, RPacketService::TContextInfo* aInfo)
+/**
+ * Called from a client via ExtFunc.
+ * Returns the context info of aIndex in context list.
+ * @param aTsyReqHandle  request handle that is completed.
+ * @param  aIndex Context number
+ * @param  aInfo  Pointer to a RPacketService::TContextInfo
+ */
+    {
+    LOGTEXT2(_L8("CGprs::GetContextInfo called with aIndex=%d"),aIndex);
+
+	TInt ret(KErrNone);
+	if(aIndex>=0 &&	aIndex<=MaxNumberOfContexts())
+		{
+		TDblQueIter<CGprsContextEntry> iter(iContexts);
+		iter.SetToFirst();
+		for (TInt i=0;i!=aIndex;++i)
+			iter++;
+	    
+	    CGprsContextEntry* contextEntry=iter;
+		if (contextEntry)
+			*aInfo = *contextEntry->iContext->ContextInfo();
+		else
+			ret=KErrArgument;
+		}
+	else
+		ret=KErrArgument;
+
+	ReqCompleted(aTsyReqHandle,ret);
+    return KErrNone;
+    }
+
+
+TInt CGprs::GetContextInfoCancel(const TTsyReqHandle aTsyReqHandle) 
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::GetContextInfoCancel called"));
+    ReqCompleted(aTsyReqHandle, KErrCancel);
+    return KErrNone;
+    }
+
+
+TInt CGprs::GetNtwkRegStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TRegistrationStatus* aRegistrationStatus)
+/**
+ * @param aTsyReqHandle request handle that is completed.
+ */
+	{
+	LOGTEXT(_L8("CGprs::GetNtwkRegStatus called"));
+	if (iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
+		{
+		ReqCompleted(aTsyReqHandle, KErrNone);
+		}
+	else
+		{
+		iATGprsNtwkRegStatus->ExecuteCommand(aTsyReqHandle,aRegistrationStatus);
+		}
+	return KErrNone;
+	}
+
+TInt CGprs::GetNtwkRegStatusCancel(const TTsyReqHandle aTsyReqHandle) 
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+  {
+  LOGTEXT(_L8("CGprs::GetNtwkRegStatusCancel called"));
+  iATGprsNtwkRegStatus->CancelCommand(aTsyReqHandle);			
+  return KErrNone;
+  }
+
+
+TInt CGprs::NotifyChangeOfNtwkRegStatus(const TTsyReqHandle aTsyReqHandle, RPacketService::TRegistrationStatus* aRegistrationStatus)
+/**
+ * This function is not supported.
+ * @param aTsyReqHandle   request handle that is completed.
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyChangeOfNtwkRegStatus called"));		
+	if(iPhoneGlobals->iModemSupportsCGREGNotification)
+		{
+		// Make sure AT class watching for unsolicited registration result code is enabled
+		iATGprsNtwkRegStatusChange->Enable();
+		iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketNtwkRegStatusChange,aTsyReqHandle,this,aRegistrationStatus);
+		return KErrNone;
+		}
+
+    LOGTEXT(_L8("CGprs::NotifyChangeOfNtwkRegStatus returning KErrNotSupported"));		
+	return KErrNotSupported;		// Etel will complete the client request for us
+	}
+
+
+TInt CGprs::NotifyChangeOfNtwkRegStatusCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyChangeOfNtwkRegStatusCancel called"));
+    iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
+    return KErrNone;
+    }
+
+TInt CGprs::GetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aCurrentClass, RPacketService::TMSClass* aMaxClass)
+/**
+ * Called from a client via ExtFunc.
+ * This function returns the current RPacketService::TMSClass. It also returns the maximum class that the 
+ * phone supports.
+ * @param aTsyReqHandle  request handle that is completed.
+ * @param  aCurrentClass  pointer to a  RPacketService::TMSClass
+ * @param  aMaxClass      pointer to a  RPacketService::TMSClass
+ */
+    {
+    LOGTEXT(_L8("CGprs::GetMSClass called"));
+    *aMaxClass = MaxMSClass();
+    *aCurrentClass = CurrentMSClass();
+    ReqCompleted(aTsyReqHandle, KErrNone);
+    return KErrNone;
+    }
+
+
+TInt CGprs::GetMSClassCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::GetMSClassCancel called"));
+    ReqCompleted(aTsyReqHandle, KErrCancel);
+    return KErrNone;
+    }
+
+
+TInt CGprs::SetMSClass(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* aClass)
+/**
+ * Called from a client via ExtFunc.
+ * This function will start the sending of a AT command to the phone(AT+CGCLASS).
+ * @param aTsyReqHandle  request handle that is completed.
+ * @param  aClass  pointer to a  RPacketService::TMSClass
+ */
+    {
+    LOGTEXT(_L8("CGprs::SetMSClass called"));
+    iATGprsClass->ExecuteCommand(aTsyReqHandle, aClass);		
+    return KErrNone;
+    }
+
+
+TInt CGprs::SetMSClassCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::SetMSClassCancel called"));
+    iATGprsClass->CancelCommand(aTsyReqHandle);			
+    return KErrNone;
+    }   
+
+
+TInt CGprs::NotifyMSClassChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TMSClass* /*aNewClass*/)
+/**
+ * This function is not supported.
+ * @param aTsyReqHandle   request handle that is completed.
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyMSClassChange called"));
+    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req26
+    return KErrNone;
+    }
+
+
+TInt CGprs::NotifyMSClassChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyMSClassChangeCancel called"));
+    ReqCompleted(aTsyReqHandle, KErrCancel); // Req27
+    return KErrNone;
+    }
+   
+
+TInt CGprs::GetStaticCaps(const TTsyReqHandle aTsyReqHandle, TUint* aCaps, RPacketContext::TProtocolType* aPdpType)
+/**
+ * Called from a client via ExtFunc.
+ * This function returns the static caps that from the phone.
+ * Note that in this function we validate the value of aPdpType.
+ * @param aTsyReqHandle request handle that is completed. 
+ * @param  aCaps     Pointer to a RPacketService::TStaticCaps  
+ * @param  aPdpType  Pointer to a TPdpType
+ */
+    {
+    LOGTEXT(_L8("CGprs::GetStaticCaps called"));
+    if (*aPdpType!=RPacketContext::EPdpTypeIPv4) 
+        {
+        LOGTEXT(_L8("CGprs::GetStaticCaps aPdpType is not EPdpTypeIPv4, completeing with KErrNotSupported"));
+				ReqCompleted(aTsyReqHandle,KErrNotSupported);
+        return KErrNone;
+        }
+		//
+		// Static caps are hardcoded according to the MMTSY design document.
+		*aCaps=RPacketService::KCapsSetDefaultContextSupported;
+		*aCaps|=RPacketService::KCapsMSClassSupported;
+
+    ReqCompleted(aTsyReqHandle,KErrNone);
+    return KErrNone;
+    }
+
+
+TInt CGprs::GetDynamicCaps(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* /*aCaps*/)
+/**
+ * This function is not supported.
+ * @param aTsyReqHandle   request handle that is completed.
+ */
+    {
+    LOGTEXT(_L8("CGprs::GetDynamicCaps called"));
+    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req28
+    return KErrNone;
+    }
+
+
+TInt CGprs::NotifyDynamicCapsChange(const TTsyReqHandle aTsyReqHandle, RPacketService::TDynamicCapsFlags* /*aCaps*/)
+/**
+ * This function is not supported.
+ * @param aTsyReqHandle   request handle that is completed.
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyDynamicCapsChange called"));
+    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req29
+    return KErrNone;
+    }
+
+
+TInt CGprs::NotifyDynamicCapsChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle  The handle to cancel
+ */
+    {
+    LOGTEXT(_L8("CGprs::NotifyDynamicCapsChangeCancel called"));
+    ReqCompleted(aTsyReqHandle, KErrCancel); // Req30
+    return KErrNone;
+    }
+
+
+TInt CGprs::SetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* /*aMode*/)
+/**
+ * This function is not supported.
+ * @param aTsyReqHandle   request handle that is completed.
+ */
+    {
+    LOGTEXT(_L8("CGprs::SetAttachMode called"));
+    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req40
+    return KErrNone;
+    }
+
+
+TInt CGprs::GetAttachMode(const TTsyReqHandle aTsyReqHandle, RPacketService::TAttachMode* /*aMode*/)
+/**
+ * This function is not supported.
+ * @param aTsyReqHandle   request handle that is completed.
+ */
+    {
+    LOGTEXT(_L8("CGprs::GetAttachMode called"));
+    ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req41
+    return KErrNone;
+    }
+
+
+TInt CGprs::SetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, const TDesC8* aPckg)
+/**
+ * Called from a client via ExtFunc.
+ * This function will set the default parameters for a context.
+ * These parameters are used when a new context is created.
+ * @param aTsyReqHandle  request handle that is completed.
+ * @param  aPckg Pointer to a RPacketContext::TContextConfigPckg
+ */
+
+    {
+    LOGTEXT(_L8("CGprs::SetDefaultContextParams called"));
+	TPckg<RPacketContext::TContextConfigGPRS>* defaultContextV1Pckg = (TPckg<RPacketContext::TContextConfigGPRS>*) aPckg;
+	RPacketContext::TContextConfigGPRS& defaultContextV1 = (*defaultContextV1Pckg)();
+	SetContextConfigGPRS(&defaultContextV1);
+    ReqCompleted(aTsyReqHandle,KErrNone);
+    return KErrNone;
+    }
+
+
+TInt CGprs::GetDefaultContextParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg)
+/**
+ * Called from a client via ExtFunc.
+ * This function will get the default parameters for a context.
+ * @param aTsyReqHandle  request handle that is completed.
+ * @param  aPckg Pointer to a RPacketContext::TContextConfigPckg
+ */
+
+    {
+    LOGTEXT(_L8("CGprs::GetDefaultContextParams called"));
+	TPckg<RPacketContext::TContextConfigGPRS>* defaultContextV1Pckg = (TPckg<RPacketContext::TContextConfigGPRS>*) aPckg;
+	RPacketContext::TContextConfigGPRS& defaultContextV1 = (*defaultContextV1Pckg)();
+    ContextConfigGPRS(&defaultContextV1);
+    ReqCompleted(aTsyReqHandle,KErrNone);
+    return KErrNone;
+    }
+
+
+//
+// CGprsContextEntry class
+//
+CGprsContextEntry::CGprsContextEntry(CGprsContext* aContext)
+: iContext(aContext)
+/**
+ * Constructor
+ * @param aContext Context to add to entry
+ */
+    {}
+
+
+CGprsContextEntry::~CGprsContextEntry()
+/**
+ * Destructor
+ */
+    {}
+
+
+void CGprsContextEntry::Deque()
+/**
+ * Remove entry from TDblQue link
+ */
+    {
+    iLink.Deque();
+    iLink.iPrev=iLink.iNext=NULL;
+    }