telephonyserverplugins/common_tsy/commontsy/src/mmpacket/Cmmpacketservicetsy.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 23 6b1d113cdff3
--- a/telephonyserverplugins/common_tsy/commontsy/src/mmpacket/Cmmpacketservicetsy.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmpacket/Cmmpacketservicetsy.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,4111 +1,4111 @@
-// Copyright (c) 2006-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 FILES
-#include "Cmmpacketservicetsy.h"
-#include <ctsy/tflogger.h>
-#include <ctsy/serviceapi/mmtsy_defaults.h>
-#include "MmTsy_timeoutdefs.h"
-#include "MmTsy_numberOfSlots.h"
-#include "CMmCommonStaticUtility.h"
-#include "Cmmpacketcontextlist.h"
-#include "cmmpacketservicegsmwcdmaext.h"
-#include "cmmcalllist.h"
-#include "cmmcalltsy.h"
-#include "CMmCustomTsy.h"
-#include "CMmPacketTsy.h"
-#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
-#include <ctsy/pluginapi/cmmdatapackage.h>
-
-#include "cmmmbmscontextlist.h"
-#include "cmmmbmsmonitoredlist.h"
-
-// ======== MEMBER FUNCTIONS ========
-
-CMmPacketServiceTsy::CMmPacketServiceTsy():
-    iReqHandleType(EMultimodePacketServiceReqHandleUnknown)
-    {
-    }
-
-CMmPacketServiceTsy* CMmPacketServiceTsy::NewL(
-        CMmPhoneTsy* const aMmPhone,           
-        CMmMessageManagerBase* const aMessageManager,
-        MLtsyFactoryBase* aFactory  ) 
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NewL" );
-    CMmPacketServiceTsy* const packetService =
-        new ( ELeave ) CMmPacketServiceTsy();
-
-    CleanupClosePushL( *packetService );
-    packetService->iMmPhone = aMmPhone;
-	packetService->iMessageManager = aMessageManager;
-    packetService->ConstructL( aFactory );
-    CleanupStack::Pop();
-
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NewL." );
-    return packetService;
-
-    }
-
-void CMmPacketServiceTsy::ConstructL( MLtsyFactoryBase* aFactory )
-    {
-
-    InitModulesL( aFactory );
-
-    InitStoresAndListsL();
-
-	iMessageManager->RegisterTsyObject( CMmMessageManagerBase::EPacketDataTsy,
-        this  );
-
-    // Current Network Mode is initialized to be EMSClassUnknown
-    iCurrentMode = RMobilePhone::ENetworkModeGsm;
-
-    }
-
-CMmPacketServiceTsy::~CMmPacketServiceTsy()
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::~CMmPacketServiceTsy" );
-
-    if ( iMmPhone )
-        {
-        // deregister tsy object from message manager
-        iMmPhone->MessageManager()->DeregisterTsyObject(this);
-        
-        // Reset packet data session pointer in phone
-        iMmPhone->ResetPacketDataSession();
-        }
-
-    // Delete CMmTsyReqHandleStore object
-    delete iTsyReqHandleStore;
-    // Delete CMmPacketContextList object
-    delete iPacketContextList;
-    // Delete CMmPacketServiceGsmWcdmaExt object
-    delete iMmPacketServiceGsmWcdmaExt;
-    if(iMBMSContextList != NULL)
-    	{
-    	// Delete CMmMBMSContextList object
-    	delete iMBMSContextList;
-    	}
-    if(iGetMbmsMonitoredServiceLists != NULL)
-    	{
-    	// Delete CArrayPtrFlat object
-    	delete iGetMbmsMonitoredServiceLists;
-    	}    
-
-    if ( NULL != iDialUpContext )
-        {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::~CMmPacketServiceTsy: Close Dial-up Object." );
-
-        iDialUpContext->Close();
-        }
-
-    if ( NULL != iSecondaryDialUpContext )
-        {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::~CMmPacketServiceTsy: Close Secondary Dial-up Object." );
-
-        iSecondaryDialUpContext->Close();
-        }
-        
-TFLOGSTRING("TSY: CMmPacketServiceTsy::~CMmPacketServiceTsy: Closing iMutex Object." );
-    iMutex.Close();
-
-#ifdef USING_CTSY_DISPATCHER
-    //CTSY defect (memory leak) this maybe allocated, but it is never deleted.
-    //no need for NULL check as C++ guarantees that operator delete checks its argument for null-ness.
-    delete iMBMSMonitoredList;
-    iMBMSMonitoredList = NULL;
-#endif //USING_CTSY_DISPATCHER    
-    }
-    
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::InitModulesL
-// Initialises extension modules for CMmPacketServiceTsy.
-// if GSM flag is defined
-// allocate memory for CMmPacketServiceGsmWcdmaExt object
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::InitModulesL( MLtsyFactoryBase* aFactory )
-    {
-    // Create Packet Service Gsm extension
-    iMmPacketServiceGsmWcdmaExt =
-        CMmPacketServiceGsmWcdmaExt::NewL( this, aFactory );
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::InitStoresAndListsL
-// Initialises needed stores and lists.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::InitStoresAndListsL()
-    {
-
-#ifdef REQHANDLE_TIMER
-    // Create req handle store
-    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone,
-        ENumOfMultimodePacketServiceRequests, iPacketServiceReqHandles );
-#else
-    // Create req handle store
-    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
-        ENumOfMultimodePacketServiceRequests, iPacketServiceReqHandles );
-
-#endif // REQHANDLE_TIMER
-
-    // Create Packet Context List
-    iPacketContextList = CMmPacketContextList::NewL( this );
-
-    // create mbms context list 
-    iMBMSContextList = CMmMBMSContextList::NewL();
-    
-    // create MBMS monitored service list
-    iGetMbmsMonitoredServiceLists = new CArrayPtrFlat<CListReadAllAttempt>(1);
-    
-            
-    // Set pointer to externally created dial-up context to be NULL
-    iDialUpContext = NULL;
-    
-    // Set pointer to externally created dial-up context to be NULL
-    iSecondaryDialUpContext = NULL;
-
-    // Set phone not attached to the network
-    iInternalSavedData.iServiceStatus = RPacketService::EStatusUnattached;
-
-    // Current Mobile Station Class is initialized to be EMSClassUnknown
-    iInternalSavedData.iMsClass = RPacketService::EMSClassUnknown;
-
-    // If Gpds is suspended this flag is ETrue, otherwise EFalse
-    iSuspended = EFalse;
-
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::Init
-// Initialisation method that is called from ETel Server.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::Init()
-    {
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CustomTsy
-// Returns a pointer to Custom TSY object.
-// return custom tsy owned by phone tsy
-//----------------------------------------------------------------------------
-//
-CMmCustomTsy* CMmPacketServiceTsy::CustomTsy() const
-    {
-    // Return custom tsy
-    return iMmPhone->GetCustomTsy();
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::ActivePacketServiceExtension
-// Returns a pointer to the active packet service extension.
-// The packet data extension implements functionality that is specific for
-// selected mode. There should always be some extension active.
-//----------------------------------------------------------------------------
-//
-CMmPacketServiceGsmWcdmaExt* CMmPacketServiceTsy::ActivePacketServiceExtension()
-    {
-    // Return active packet service extension
-    return iMmPacketServiceGsmWcdmaExt;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::TsyReqHandleStore
-// Returns a pointer to the tsy request handle store.
-// return tsy request handle store
-//----------------------------------------------------------------------------
-//
-CMmTsyReqHandleStore* CMmPacketServiceTsy::TsyReqHandleStore()
-    {
-    // Return tsy request handle store
-    return iTsyReqHandleStore;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::IsContextStatusActive
-// Checks if context status is active from service point of view
-//----------------------------------------------------------------------------
-//
-TBool CMmPacketServiceTsy::IsContextStatusActive(
-    const RPacketContext::TContextStatus aContextStatus  ) const
-    {
-
-    if ( ( RPacketContext::EStatusActive == aContextStatus ) ||
-         ( RPacketContext::EStatusDeactivating == aContextStatus ) )
-        {
-        // Context is active from the service point of view
-        return ETrue;
-        }
-
-    return EFalse;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::UpdateAttachedPacketStatus
-// Sets service status to active or attached and completes status changed
-// notification to the client if needed.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::UpdateAttachedPacketStatus(
-    const TBool aIsActiveContext ) //is context active
-    {
-    TBool isActive( aIsActiveContext );
-    
-    // If external context exist and there are no active internal context
-    if ( iDialUpContext != NULL && isActive == EFalse )
-        {
-        // If external context is active then active context found
-        isActive = IsContextStatusActive( iDialUpContext->ContextStatus() );
-        } 
-
-    // If external context exist and there are no active internal context
-    if ( iSecondaryDialUpContext != NULL && isActive == EFalse )
-        {
-        // If external context is active then active context found
-        isActive = IsContextStatusActive( 
-            iSecondaryDialUpContext->ContextStatus() );
-        }
-
-    if ( isActive && ( RPacketService::EStatusActive !=
-         iInternalSavedData.iServiceStatus ) )
-        {
-        // Complete status change notification to the client and
-        // set service status EStatusActive
-        CMmPacketServiceTsy::CompleteNotifyStatusChange(
-		    RPacketService::EStatusActive, KErrNone );
-
-        }
-    else if ( !isActive && ( RPacketService::EStatusAttached !=
-              iInternalSavedData.iServiceStatus ) )
-        {
-
-        // Complete status change notification to the client and
-        // set service status EStatusAttached
-		CMmPacketServiceTsy::CompleteNotifyStatusChange(
-		    RPacketService::EStatusAttached, KErrNone );
-
-        }
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::UpdateAttachedPacketStatus. Service Status: %d", iInternalSavedData.iServiceStatus );
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompletePacketStatusChanged
-// Called from active extension to notify service that transfer status
-// is changed.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompletePacketStatusChanged(
-    CMmDataPackage* aDataPackage,
-    TInt aErrorCode )
-    {
-	RPacketService::TStatus packetStatus;
-	TBool isresumed;
-	TBool isActiveContext( EFalse );
-
-	//Pack data
-	aDataPackage->UnPackData( packetStatus, isresumed  );
-
-    // Get number of created contexts
-    const TInt numberOfContext( iPacketContextList->NumberOfContexts() );
-
-    if ( isresumed )
-        {
-        // If current status is suspended
-        if ( iSuspended )
-            {
-
-            CMmPacketContextTsy* packetContext;
-            CMmMBMSContextTsy* mbmsContext;
-
-            // check pdp context's
-            for ( TInt i = 0; i < numberOfContext; i++ )
-                {
-                // Get context by index from context list
-                packetContext = iPacketContextList->PacketContextByIndex( i );
-
-                if ( NULL != packetContext )
-                    {
-                    // Inform context that service resumed from suspend
-                    packetContext->ContextResumed();
-                    }
-                }
-                
-            // check mbms context's
-            for ( TInt i = 0; i < iMBMSContextList->NumberOfContexts(); i++ )
-                {
-                // Get context by index from context list
-                mbmsContext = iMBMSContextList->ContextByIndex( i );
-
-                if ( NULL != mbmsContext )
-                    {
-                    // Inform context that service resumed from suspend
-                    mbmsContext->ContextResumed();
-                    }
-                }                
-
-            if ( iDialUpContext != NULL )
-                {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged.  DialUp Context Resumed" );
-
-                iDialUpContext->ContextResumed();
-                }
-
-            if ( iSecondaryDialUpContext != NULL )
-                {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged. Secondary DialUp Context Resumed" );
-
-                iSecondaryDialUpContext->ContextResumed();
-                }
-
-            // Get service status before suspend
-            packetStatus = iInternalSavedData.iServiceStatusBeforeSuspend;
-            // Current status is not suspended
-            iSuspended = EFalse;
-
-            }
-        else
-            {
-            // Resumed without suspend, continue with current status
-            packetStatus = iInternalSavedData.iServiceStatus;
-            }
-        }
-
-    // If current status is not suspended or
-    // current status is suspended and new status is unattached
-    if ( !iSuspended || ( RPacketService::EStatusUnattached == packetStatus ) )
-        {
-        switch ( packetStatus )
-            {
-            case RPacketService::EStatusUnattached:
-                if ( iSuspended )
-                    {
-                    // If previous status was suspended it is not valid 
-                    // anymore
-                    iSuspended = EFalse;
-                    }
-
-                // Complete status change notification with EStatusUnattached
-                CMmPacketServiceTsy::CompleteNotifyStatusChange(
-				    RPacketService::EStatusUnattached, aErrorCode );
-
-                break;
-            case RPacketService::EStatusAttached:
-            case RPacketService::EStatusActive:
-                CMmPacketContextTsy* packetContext;
-
-                for ( TInt i = 0; i < numberOfContext; i++ )
-                    {
-                    packetContext =
-                        iPacketContextList->PacketContextByIndex( i );
-
-                    // If no active context found yet
-                    if ( NULL != packetContext )
-                        {
-                        // Get context status
-                        RPacketContext::TContextStatus contextStatus =
-                            packetContext->ContextStatus();
-
-                        // Check if context is active ( from service point 
-                        // of view )
-                        isActiveContext =
-                            IsContextStatusActive( contextStatus );
-                        }
-                    if ( isActiveContext )
-                        {
-                        // Active context found, break
-                        i = numberOfContext;
-                        }
-                    }
-                    
-                // no active pdp context's, check if any mbms context is active
-                if( !isActiveContext )
-                    {
-                    CMmMBMSContextTsy* mbmsContext;
-                    
-                    // check mbms context's
-                    for ( TInt i = 0; i < iMBMSContextList->NumberOfContexts(); i++ )
-                        {
-                        // Get context by index from context list
-                        mbmsContext = iMBMSContextList->ContextByIndex( i );
-
-                        if ( NULL != mbmsContext )
-                            {
-                            // Get context status
-                            RPacketContext::TContextStatus contextStatus =
-                                mbmsContext->ContextStatus();
-
-                            // Check if context is active ( from service point 
-                            // of view )
-                            isActiveContext =
-                                IsContextStatusActive( contextStatus );
-                            }
-                        if ( isActiveContext )
-                            {
-                            // Active context found, break
-                            i = iMBMSContextList->NumberOfContexts();                                                   
-                            }  
-                        }
-                    }
-
-                // Update service status
-                UpdateAttachedPacketStatus( isActiveContext );
-
-                break;
-            case RPacketService::EStatusSuspended:
-                if ( !iSuspended && ( RPacketService::EStatusUnattached !=
-                     iInternalSavedData.iServiceStatus ) )
-                    {
-                    // Save status before suspend internally
-                    iInternalSavedData.iServiceStatusBeforeSuspend =
-                        iInternalSavedData.iServiceStatus;
-
-                    // Set iSuspended to be ETrue
-                    iSuspended = ETrue;
-
-                    CMmPacketContextTsy* packetContext;
-
-                    for ( TInt i = 0; i < numberOfContext; i++ )
-                        {
-                        // Get next context
-                        packetContext =
-                            iPacketContextList->PacketContextByIndex( i );
-
-                        if ( NULL != packetContext )
-                            {
-                            // Inform context that service is suspend
-                            packetContext->ContextSuspended();
-                            }
-                        }
-                    CMmMBMSContextTsy* mbmsContext;
-                    
-                    // check mbms context's
-                    for ( TInt i = 0; i < iMBMSContextList->NumberOfContexts(); i++ )
-                        {
-                        // Get context by index from context list
-                        mbmsContext = iMBMSContextList->ContextByIndex( i );
-
-                        if ( NULL != mbmsContext )
-                            {
-                            // Inform context that service is suspend
-                            mbmsContext->ContextSuspended();
-                            }
-                        }                       
-
-                    if ( iDialUpContext != NULL )
-                        {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged.  DialUp Context Suspended" );
-                        iDialUpContext->ContextSuspended();
-                        }
-
-                    if ( iSecondaryDialUpContext != NULL )
-                        {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged.  DialUp Context Suspended" );
-                        iSecondaryDialUpContext->ContextSuspended();
-                        }
-
-                    // Complete status change notification with
-                    // EStatusSuspended
-                    CMmPacketServiceTsy::CompleteNotifyStatusChange(
-                        RPacketService::EStatusSuspended, aErrorCode );
-
-                    }
-
-                break;
-            default:
-                break;
-            }
-        }
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged. Service Status: %d", iInternalSavedData.iServiceStatus );
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::ContextStatusChanged
-// Context status is changed from the Service point of view.
-// Called from CMmPacketContextTsy to notify service that context status is
-// changed to inactive, activate or deleted state. These states indicate that
-// context is changed to inactive or active state from the Packet Service
-// point of view.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::ContextStatusChanged(
-    const RPacketContext::TContextStatus aContextStatus )
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::ContextStatusChanged. Context Status: %d", aContextStatus );
-
-    if ( !iSuspended && ( RPacketService::EStatusUnattached !=
-         iInternalSavedData.iServiceStatus ) )
-        {
-
-        TBool isActiveContext( EFalse );
-
-        if ( ( RPacketContext::EStatusInactive == aContextStatus ) ||
-             ( RPacketContext::EStatusDeleted == aContextStatus ) )
-            {
-            const TInt numberOfContext(
-                iPacketContextList->NumberOfContexts() );
-
-            RPacketContext::TContextStatus contextStatus;
-
-            for ( TInt i = 0; i < numberOfContext; i++ )
-                {
-                TInt ret( iPacketContextList->GetContextStatusByIndex(
-                    i, contextStatus ) );
-
-                if ( KErrNone == ret )
-                    {
-                    isActiveContext = IsContextStatusActive( contextStatus );
-
-                    if ( isActiveContext )
-                        {
-                        // Active context found, break
-                        i = numberOfContext;
-                        }
-                    }
-                }
-            }
-
-        else if ( RPacketContext::EStatusActive == aContextStatus )
-            {
-
-            isActiveContext = ETrue;
-
-            }
-
-        UpdateAttachedPacketStatus( isActiveContext );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::PreferredBearerChanged
-// Preferred bearer has been changed save new
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::PreferredBearerChanged(
-    CMmDataPackage* aPackage )      
-    {
-	RPacketService::TPreferredBearer preferredBearer;
-
-	aPackage->UnPackData( preferredBearer );
-
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::PreferredBearerChanged. PreferredBearer: %d", preferredBearer );
-
-    iInternalSavedData.iPreferredBearer = preferredBearer;
-
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::Attach
-// Starts asynchronous attach request to the network.
-// This function will cause the phone to attempt an attach to the packet
-// network, if it is not already attached.  If it is, the error
-// KErrAlreadyExists should be returned.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::AttachL()
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::AttachL." );
-
-    TInt ret( KErrAlreadyExists );
-
-    if ( RPacketService::EStatusUnattached ==
-         iInternalSavedData.iServiceStatus )
-        {
-
-        const TTsyReqHandle attachHandle( iTsyReqHandleStore->GetTsyReqHandle(
-            EMultimodePacketServiceAttach ) );
-
-        if ( EMultimodePacketServiceReqHandleUnknown != attachHandle )
-            {
-            ret = KErrServerBusy;
-            }
-        else
-            {
-            // Attach
-            ret = iMmPacketServiceGsmWcdmaExt->AttachL();
-
-            if ( KErrNone == ret )
-                {
-                // Set request handle
-                iReqHandleType = EMultimodePacketServiceAttach;
-                }
-            else
-                {
-                // Sending to the phonet failed for some reason
-                ret = CMmCommonStaticUtility::EpocErrorCode(
-                    KErrGeneral, KErrGsmMMNetworkFailure );
-                }
-            }
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteAttach
-// Completes asynchronous attach request.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteAttach(
-    const TInt aError )  //error value
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteAttach. Error Value: %d", aError );
-
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceAttach ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-        // Complete the client request
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::Detach
-// Starts asynchronous detach request to the network.
-// This function will cause the phone to attempt to detach from the packet
-// network, if it is not already detached. If it is, the error
-// KErrAlreadyExists should be returned. If at least one context is active the
-// error KErrInUse should be returned.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::DetachL()
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::DetachL." );
-
-    TInt ret( KErrAlreadyExists );
-
-    if ( RPacketService::EStatusUnattached !=
-        iInternalSavedData.iServiceStatus )
-        {
-
-        // Get number of created contexts
-        const TInt numberOfContext( iPacketContextList->NumberOfContexts() );
-        RPacketContext::TContextStatus contextStatus;
-
-        for ( TInt i = 0; i < numberOfContext; i++ )
-            {
-            ret = iPacketContextList->GetContextStatusByIndex(
-                i, contextStatus );
-
-            if ( KErrNone == ret )
-                {
-                if ( IsContextStatusActive( contextStatus ) )
-                    {
-                    // Atleast one of the contexts is active.
-                    ret = KErrInUse;
-                    i= numberOfContext;
-                    }
-                }
-            }
-
-        // If not KErrInUse, no active contexts found and detach can be done
-        if ( KErrInUse != ret )
-            {
-
-            const TTsyReqHandle reqHandle( iTsyReqHandleStore->
-                GetTsyReqHandle( EMultimodePacketServiceDetach ) );
-
-            if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
-                {
-                // Detach
-                ret = iMmPacketServiceGsmWcdmaExt->DetachL();
-
-                if ( KErrNone == ret )
-                    {
-                    // Set request handle
-                    iReqHandleType = EMultimodePacketServiceDetach;
-                    }
-                else
-                    {
-                    // Sending to the phonet failed for some reason
-                    ret = CMmCommonStaticUtility::EpocErrorCode(
-                        KErrGeneral, KErrGsmMMNetworkFailure );
-                    }
-                }
-            else
-                {
-                // The request is already in processing because of previous
-                // request. Complete request with KErrServerBusy informing the
-                // client about the situation.
-                ret = KErrServerBusy;
-                }
-            }
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteDetachL
-// Completes asynchronous detach request.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteDetachL(
-    const TInt aError ) 
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteDetachL. Error Value: %d", aError );
-
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceDetach ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-        // Complete the client request
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
-        }
-    if ( RPacketService::EAttachWhenPossible == iAttachMode )
-        {
-        SetAttachModeL( &iAttachMode );
-        iReqHandleType = EMultimodePacketServiceReqHandleUnknown;
-        }
-    }
-    
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::EnumerateContexts
-// Enumerates contexts.
-// This function will retrieve both the number of opened contexts in the TSY,
-// the aCount parameter containing this value on completion of the function,
-// and the maximum possible number of contexts, passed back in the aMaxAllowed
-// parameter. Note that this is not the maximum number of simultaneously
-// active contexts, but the total number allowed.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::EnumerateContexts(
-    TInt* const aCount,    
-    TInt* const aMaxAllowed ) 
-    {
-    *aCount = iPacketContextList->NumberOfContexts();
-    *aMaxAllowed = KMmMaxNumberOfContexts;
-
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::EnumerateContexts. Count: %d Max Allowed: %d", *aCount, *aMaxAllowed );
-    // Complete the request with KErrNone
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetAttachMode
-// Retrieves the current mode of GPRS Attach operation.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetAttachModeL(
-    RPacketService::TAttachMode* const aMode ) 
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetAttachModeL. Mode:%d", *aMode );
-
-    TInt ret( KErrServerBusy );
-
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
-        EMultimodePacketServiceGetAttachMode ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
-        {
-        // Get attach mode
-        ret = iMmPacketServiceGsmWcdmaExt->GetAttachModeL();
-
-        if ( KErrNone == ret )
-            {
-            // Save pointer to aMode internally
-            iTemporarySavedData.iGetAttachMode = aMode;
-            // Set req handle
-            iReqHandleType = EMultimodePacketServiceGetAttachMode;
-            }
-        }
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteGetAttachMode
-// Completes asynchronous attach request.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteGetAttachMode(
-    const RPacketService::TAttachMode aAttachMode, TInt aResult ) 
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteGetAttachMode. Attach Mode: %d", aAttachMode );
-
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceGetAttachMode ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-        *iTemporarySavedData.iGetAttachMode = aAttachMode;
-        iTemporarySavedData.iGetAttachMode = NULL;
-
-        // Complete the client request
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetContextInfo
-// Gets Context info of the context defined by aIndex.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetContextInfo(
-    const TInt* const aIndex,                 
-    RPacketService::TContextInfo* const aInfo ) 
-    {
-    TInt ret( KErrNone );
-
-    // Call ContextStatusByIndex() to set context status to aInfo->iStatus
-    ret = iPacketContextList->GetContextStatusByIndex(
-        *aIndex, aInfo->iStatus );
-
-    if ( KErrNone == ret )
-        {
-        // Call GetContextNameByIndex() to set context name to aInfo->iName
-        ret = iPacketContextList->GetContextNameByIndex(
-            *aIndex, aInfo->iName );
-
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::GetContextInfo. Context Status: %d Context Name: %S", aInfo->iStatus, &aInfo->iName );
-        }
-
-    // Complete request with ret
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
-    
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetDynamicCaps
-// Returns the dynamic capabilities of the phone.
-// call active extension to get dynamic capabilities to aCaps
-// complete request with KErrNone
-// return KErrNone
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetDynamicCaps(
-    RPacketService::TDynamicCapsFlags* const aCaps ) 
-    {
-    // Call DynamicCaps() from extension
-    iMmPacketServiceGsmWcdmaExt->GetDynamicCaps( aCaps );
-TFLOGSTRING("TSY: CMmPacketServiceTsy::GetDynamicCaps." );
-
-    // Complete the request with KErrNone
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-    
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetMSClass
-// Gets current and maximum value of the Mobile Station Class.
-// This function will retrieve both the current class and the highest class of
-// the mobile station. The parameters aCurrentClass and aMaxClass may take one
-// of the following values which are ordered in terms of class from highest to
-// lowest:
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetMSClass(
-    RPacketService::TMSClass* const aCurrentClass, 
-    RPacketService::TMSClass* const aMaxClass )    
-    {
-    *aCurrentClass = iInternalSavedData.iMsClass;
-    *aMaxClass = KMaxMsClass;
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::GetMSClass. Current Class: %d Max Class: %d", *aCurrentClass, *aMaxClass );
-
-    // Complete the request with KErrNone
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetNtwkRegStatus
-// Gets network registration status.
-// This function allows the client to retrieve the current registration status
-// of the phone on the packet network as defined by the enum
-// TRegistrationStatus.
-//------------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetNtwkRegStatusL(
-    RPacketService::TRegistrationStatus* const aRegistrationStatus ) 
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetNtwkRegStatusL. Tsy Req Handle: %d", iTsyReqHandle );
-
-    const TTsyReqHandle regHandle( iTsyReqHandleStore->GetTsyReqHandle(
-        EMultimodePacketServiceGetNtwkRegStatus ) );
-
-    TInt ret( KErrServerBusy );
-
-    if ( EMultimodePacketServiceReqHandleUnknown == regHandle )
-        {
-
-        // Get network registration status
-        ret = iMmPacketServiceGsmWcdmaExt->GetNtwkRegStatusL();
-
-        if ( KErrNone == ret )
-            {
-            iRegistrationStatus = aRegistrationStatus;
-            // Set request handle type
-            iReqHandleType = EMultimodePacketServiceGetNtwkRegStatus;
-            }
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteGetNtwkRegStatus
-// Completes get network registration status request.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteGetNtwkRegStatus(
-    const RPacketService::TRegistrationStatus aRegistrationStatus,
-    const TInt aError )                             
-    {
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceGetNtwkRegStatus ) );
-
-    // If request handle ok
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-
-        if ( KErrNone == aError )
-            {
-            *iRegistrationStatus = aRegistrationStatus;
-            iRegistrationStatus = NULL;
-            }
-        // Complete the client request
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
-
-        }
-    else
-        {
-        // Request was sent during initialisation from active extension
-        CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus(
-												aRegistrationStatus );
-        }
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::CompleteGetNtwkRegStatus. TSY Req Handle: %d Registration Status: %d", reqHandle, aRegistrationStatus );
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetPreferredBearer
-// Returns preferred bearer.
-// This function will retrieve the currently selected preferred bearer to
-// attach to when in Class C operation. The TSY should cache this value, so
-// the function should return quickly meaning there is no need for an
-// asynchronous version.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetPreferredBearer(
-    RPacketService::TPreferredBearer* const aBearer )   
-    {
-    *aBearer = iInternalSavedData.iPreferredBearer;
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetPreferredBearer. Preferred Bearer: %d", *aBearer );
-
-    // Complete the request with KErrNone
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-    
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetStaticCaps
-// Retrieves those capabilities of the TSY that are constant.
-// call active extension to set static capabilities to aCaps
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetStaticCaps(
-    TUint* const aCaps,                       
-    const RPacketContext::TProtocolType* const aPdpType) 
-    {
-    TInt ret = KErrNone;
-    
-    switch (*aPdpType)
-        {
-        case RPacketContext::EPdpTypeIPv4:
-        case RPacketContext::EPdpTypeIPv6:
-        case RPacketContext::EPdpTypeX25:
-        case RPacketContext::EPdpTypePPP:
-        case RPacketContext::EPdpTypeCDPD:
-            iMmPacketServiceGsmWcdmaExt->GetStaticCaps( aCaps );
-            TFLOGSTRING("TSY: CMmPacketServiceTsy::GetStaticCaps." );
-            
-            // Complete the request with KErrNone
-            CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
-            break;
-        default:
-            ret = KErrArgument;
-            break;
-        }
-    
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetStatus
-// Returns current status of the packet service.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetStatus(
-    RPacketService::TStatus* const aPacketStatus )   
-    {
-    *aPacketStatus = iInternalSavedData.iServiceStatus;
-
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetStatus. Service Status: %d", *aPacketStatus );
-
-    // Complete the request with KErrNone
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-    
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::NotifyChangeOfNtwkRegStatus
-// Requests notification of network registration status change.
-// Allows a client to be notified whenever a change in the status of the
-// packet network registration is detected.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::NotifyChangeOfNtwkRegStatus(
-    RPacketService::TRegistrationStatus* const aRegistrationStatus )
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyChangeOfNtwkRegStatus." );
-
-    // Set request handle and save pointer to aRegistrationStatus
-    iNotifyDataPointers.iChangeOfNtwkRegStatus = aRegistrationStatus;
-    iReqHandleType =  EMultimodePacketServiceNotifyNtwkRegStatusChange;
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus
-// Completes notify change of ntwk registration status to client.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus(
-    const RPacketService::TRegistrationStatus aRegistrationStatus )
-    {
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus. Current reg Status: %d New reg Status: %d", iInternalSavedData.iRegistrationStatus, aRegistrationStatus );
-
-    // If registration status changed
-    if ( aRegistrationStatus != iInternalSavedData.iRegistrationStatus )
-        {
-        // Save new status internally
-        iInternalSavedData.iRegistrationStatus = aRegistrationStatus;
-
-        // Reset request handle. Returns the deleted request handle
-        const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-            EMultimodePacketServiceNotifyNtwkRegStatusChange ) );
-
-        // If notification is requested by client
-        if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-            {
-            // Set aRegistrationStatus to the etel side memory
-            *iNotifyDataPointers.iChangeOfNtwkRegStatus = aRegistrationStatus;
-            iNotifyDataPointers.iChangeOfNtwkRegStatus = NULL;
-
-            // Complete request with KErrNone
-            CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
-            }
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus
-// Completes notify change of ntwk registration status to client.
-// Handles request coming from MessHandler
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus(
-    CMmDataPackage* aDataPackage, TInt aResult )		
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus.");
-
-	//Unpack necessary data from datapackage
-	RPacketService::TRegistrationStatus registrationStatus;
-	aDataPackage->UnPackData( registrationStatus );
-
-    // If registration status changed
-    if ( registrationStatus != iInternalSavedData.iRegistrationStatus )
-        {
-
-        // Save new status internally
-        iInternalSavedData.iRegistrationStatus = registrationStatus;
-
-        // Reset request handle. Returns the deleted request handle
-        const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-            EMultimodePacketServiceNotifyNtwkRegStatusChange ) );
-
-        // If notification is requested by client
-        if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-            {
-
-            // Set registrationStatus to the etel side memory
-            *iNotifyDataPointers.iChangeOfNtwkRegStatus = registrationStatus;
-            iNotifyDataPointers.iChangeOfNtwkRegStatus = NULL;
-
-            // Complete the client request
-            CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );
-
-            }
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::NotifyContextActivationRequested
-// Requests notification of network requests context activation.
-// This function will complete when the phone receives a request from the
-// packet network to activate a PDP context. Depending on the type of
-// network, this request may contain the PDP type requested, the PDP address
-// for this context, and possibly the Access Point Name (APN) of the gateway
-// to connect to.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::NotifyContextActivationRequested(
-    TPacketDataConfigBase* const aContextParameters ) 
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyContextActivationRequested." );
-
-    TInt ret = KErrNone;
-
-    // If class of aContextParameters is TContextConfigGPRS
-    if ( TPacketDataConfigBase::KConfigGPRS ==
-         aContextParameters->ExtensionId() )
-        {
-        // Cast aContextParameters from TPacketDataConfigBase to
-        // TContextConfigGPRS and save internally
-        iNotifyDataPointers.iContextActivationRequested =
-            ( RPacketContext::TContextConfigGPRS* ) aContextParameters;
-
-        // Set request handle
-        iReqHandleType =
-            EMultimodePacketServiceNotifyContextActivationRequested;
-        }
-    // Else if class of aContextParameters is TContextConfigR99_R4
-    else if ( TPacketDataConfigBase::KConfigRel99Rel4 ==
-         aContextParameters->ExtensionId() )
-        {
-        // Cast aContextParameters from TPacketDataConfigBase to
-        // TContextConfigR99_R4 and save internally
-        iNotifyDataPointers.iContextActivationRequested99 =
-            ( RPacketContext::TContextConfigR99_R4* ) aContextParameters;
-
-        // Set request handle
-        iReqHandleType =
-            EMultimodePacketServiceNotifyContextActivationRequested99;
-        }
-    // Else if class of aContextParameters is TContextConfigR5
-    else if ( TPacketDataConfigBase::KConfigRel5 ==
-         aContextParameters->ExtensionId() )
-        {
-        // Cast aContextParameters from TPacketDataConfigBase to
-        // TContextConfig_R5 and save internally
-        iNotifyDataPointers.iContextActivationRequested5 =
-            ( RPacketContext::TContextConfig_R5* ) aContextParameters;
-
-        // Set request handle
-        iReqHandleType =
-            EMultimodePacketServiceNotifyContextActivationRequested5;           
-        }                
-    // Else class of aContextParameters is not supported
-    else
-        {
-        ret = KErrNotSupported;
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteNotifyContextActivationRequested
-// Completes context activation requested notification to client.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteNotifyContextActivationRequested(
-    CMmDataPackage* aDataPackage )		//contains initial data
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextActivationRequested.");
-
-	//Check if there is client request
-	if ( EMultimodePacketServiceReqHandleUnknown != 
-			CMmPacketServiceTsy::TsyReqHandleStore()->GetTsyReqHandle( 
-				CMmPacketServiceTsy::
-					EMultimodePacketServiceNotifyContextActivationRequested ) ||
-		 EMultimodePacketServiceReqHandleUnknown != 
-		  	CMmPacketServiceTsy::TsyReqHandleStore()->
-              	GetTsyReqHandle( CMmPacketServiceTsy::
-					EMultimodePacketServiceNotifyContextActivationRequested99 ) ||
-		 EMultimodePacketServiceReqHandleUnknown != 
-		 	CMmPacketServiceTsy::TsyReqHandleStore()->
-              	GetTsyReqHandle( CMmPacketServiceTsy::
-					EMultimodePacketServiceNotifyContextActivationRequested5 ) )						
-		{
-		//ETel API client may call RPacketService::NotifyContextActivationRequested
-		//method using one of following parameter class: 
-		//RPacketContext::TContextConfigGPRS, RPacketContext::TContextConfigR99_R4
-		//or RPacketContext::TContextConfig_R5. LTSY may complete 
-		//NotifyContextActivationRequested request using one of these parameter 
-		//classes. CTSY has to complete RPacketService::NotifyContextActivationRequested
-		//requests in all situations.
-		
-		//Copy data temporary from aDataPackage to 
-		//RPacketContext::TContextConfig_R5
-		
-		RPacketContext::TContextConfig_R5 config_R5;
-		TBool config_R5Filled = ETrue;
-		
-		//Before copying initialize GPRS specific fields
-		TUint iPdpCompression = 0;
-		RPacketContext::TAnonymousAccess iAnonymousAccessReqd = 
-			RPacketContext::ENotApplicable;
-		
-		//Before copying reset R99_R4 and R5 specific fields
-		config_R5.iPFI = RPacketContext::EBestEffort;																		
-    	config_R5.iPdpHeaderCompression = RPacketContext::ENoHeaderCompression;     	    
-    	config_R5.iPdpDataCompression = RPacketContext::ENoDataCompression;			
-		
-	
-		TPacketDataConfigBase configBase;
-		aDataPackage->UnPackData( configBase );
-		if ( configBase.ExtensionId() == TPacketDataConfigBase::KConfigGPRS )
-			{		
-	    	RPacketContext::TContextConfigGPRS configGPRS;
-	    	aDataPackage->UnPackData( configGPRS );
-	    	
-			config_R5.iPdpType =configGPRS.iPdpType;			
-			config_R5.iAccessPointName = configGPRS.iAccessPointName;							
-			config_R5.iPdpAddress = configGPRS.iPdpAddress;
-			iPdpCompression = configGPRS.iPdpCompression;
-			iAnonymousAccessReqd = configGPRS.iAnonymousAccessReqd;
-			config_R5.iUseEdge = configGPRS.iUseEdge;
-			config_R5.iProtocolConfigOption.iAuthInfo = 
-				configGPRS.iProtocolConfigOption.iAuthInfo;
-			config_R5.iProtocolConfigOption.iChallenge = 
-				configGPRS.iProtocolConfigOption.iChallenge;
-			config_R5.iProtocolConfigOption.iResponse = 
-				configGPRS.iProtocolConfigOption.iResponse;
-			config_R5.iProtocolConfigOption.iId = 
-				configGPRS.iProtocolConfigOption.iId;
-			config_R5.iProtocolConfigOption.iDnsAddresses = 
-				configGPRS.iProtocolConfigOption.iDnsAddresses;
-			config_R5.iProtocolConfigOption.iMiscBuffer = 
-				configGPRS.iProtocolConfigOption.iMiscBuffer;				
-			config_R5.iNWIContext = configGPRS.iNWIContext;
-			}
-		else if ( configBase.ExtensionId() == TPacketDataConfigBase::KConfigRel99Rel4 )
-			{	
-	    	RPacketContext::TContextConfigR99_R4 config_R99_R4;
-	    	aDataPackage->UnPackData( config_R99_R4 );			
-			
-			config_R5.iPdpType = config_R99_R4.iPdpType;			
-			config_R5.iAccessPointName = config_R99_R4.iAccessPointName;							
-			config_R5.iPdpAddress = config_R99_R4.iPdpAddress;
-			config_R5.iUseEdge = config_R99_R4.iUseEdge;
-			config_R5.iProtocolConfigOption.iAuthInfo =
-				config_R99_R4.iProtocolConfigOption.iAuthInfo;
-			config_R5.iProtocolConfigOption.iChallenge =
-				config_R99_R4.iProtocolConfigOption.iChallenge;
-			config_R5.iProtocolConfigOption.iResponse =
-				config_R99_R4.iProtocolConfigOption.iResponse;
-			config_R5.iProtocolConfigOption.iId =
-				config_R99_R4.iProtocolConfigOption.iId;
-			config_R5.iProtocolConfigOption.iDnsAddresses =
-				config_R99_R4.iProtocolConfigOption.iDnsAddresses;
-			config_R5.iProtocolConfigOption.iMiscBuffer =
-				config_R99_R4.iProtocolConfigOption.iMiscBuffer;								
-			config_R5.iNWIContext = config_R99_R4.iNWIContext;
-			config_R5.iPFI = config_R99_R4.iPFI;	
-			}
-		else if ( configBase.ExtensionId() == TPacketDataConfigBase::KConfigRel5 )
-			{			
-			//Just unpack to config_R5
-	    	aDataPackage->UnPackData( config_R5 );
-			}
-		else
-			{				
-			//Unknown parameter class.
-			config_R5Filled = EFalse;
-			}
-			
-		//Copy data to clients and complete client requests
-		
-		TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-       		EMultimodePacketServiceNotifyContextActivationRequested );	
-		if ( config_R5Filled &&
-		     EMultimodePacketServiceReqHandleUnknown != reqHandle )
-			{
-			// Deliver R97/98 parameters to the ETel Packet API client
-			iNotifyDataPointers.iContextActivationRequested->iPdpType =
-				config_R5.iPdpType;			
-			iNotifyDataPointers.iContextActivationRequested->iAccessPointName =
-				config_R5.iAccessPointName;							
-			iNotifyDataPointers.iContextActivationRequested->iPdpAddress =
-				config_R5.iPdpAddress;
-			iNotifyDataPointers.iContextActivationRequested->iPdpCompression =
-				iPdpCompression;
-			iNotifyDataPointers.iContextActivationRequested->iAnonymousAccessReqd =
-				iAnonymousAccessReqd;
-			iNotifyDataPointers.iContextActivationRequested->iUseEdge =
-				config_R5.iUseEdge;
-			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iAuthInfo =
-				config_R5.iProtocolConfigOption.iAuthInfo;
-			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iChallenge =
-				config_R5.iProtocolConfigOption.iChallenge;
-			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iResponse =
-				config_R5.iProtocolConfigOption.iResponse;
-			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iId =
-				config_R5.iProtocolConfigOption.iId;
-			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iDnsAddresses =
-				config_R5.iProtocolConfigOption.iDnsAddresses;
-			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iMiscBuffer =
-				config_R5.iProtocolConfigOption.iMiscBuffer;				
-			iNotifyDataPointers.iContextActivationRequested->iNWIContext =
-				config_R5.iNWIContext;
-			iNotifyDataPointers.iContextActivationRequested = NULL;
-		
-			// Complete request with KErrNone
-			CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
-		    }		
-
-		reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-       		EMultimodePacketServiceNotifyContextActivationRequested99 );	
-		if ( config_R5Filled &&
-		     EMultimodePacketServiceReqHandleUnknown != reqHandle )
-			{		
-			// Deliver R99_R4 parameters to the ETel Packet API client
-			iNotifyDataPointers.iContextActivationRequested99->iPdpType =
-				config_R5.iPdpType;			
-			iNotifyDataPointers.iContextActivationRequested99->iAccessPointName =
-				config_R5.iAccessPointName;							
-			iNotifyDataPointers.iContextActivationRequested99->iPdpAddress =
-				config_R5.iPdpAddress;
-			iNotifyDataPointers.iContextActivationRequested99->iUseEdge =
-				config_R5.iUseEdge;
-			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iAuthInfo =
-				config_R5.iProtocolConfigOption.iAuthInfo;
-			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iChallenge =
-				config_R5.iProtocolConfigOption.iChallenge;
-			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iResponse =
-				config_R5.iProtocolConfigOption.iResponse;
-			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iId =
-				config_R5.iProtocolConfigOption.iId;
-			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iDnsAddresses =
-				config_R5.iProtocolConfigOption.iDnsAddresses;
-			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iMiscBuffer =
-				config_R5.iProtocolConfigOption.iMiscBuffer;								
-			iNotifyDataPointers.iContextActivationRequested99->iNWIContext =
-				config_R5.iNWIContext;
-			iNotifyDataPointers.iContextActivationRequested99->iPFI =
-				config_R5.iPFI;	
-			iNotifyDataPointers.iContextActivationRequested99 = NULL;	
-
-			// Complete request with KErrNone
-			CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
-			}
-		
-		reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-       		EMultimodePacketServiceNotifyContextActivationRequested5 );	
-		if ( config_R5Filled &&
-		     EMultimodePacketServiceReqHandleUnknown != reqHandle )
-			{	
-			// Deliver R5 parameters to the ETel Packet API client
-			iNotifyDataPointers.iContextActivationRequested5->iPdpType =
-				config_R5.iPdpType;			
-			iNotifyDataPointers.iContextActivationRequested5->iAccessPointName =
-				config_R5.iAccessPointName;							
-			iNotifyDataPointers.iContextActivationRequested5->iPdpAddress =
-				config_R5.iPdpAddress;
-			iNotifyDataPointers.iContextActivationRequested5->iUseEdge =
-				config_R5.iUseEdge;
-			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iAuthInfo =
-				config_R5.iProtocolConfigOption.iAuthInfo;
-			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iChallenge =
-				config_R5.iProtocolConfigOption.iChallenge;
-			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iResponse =
-				config_R5.iProtocolConfigOption.iResponse;
-			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iId =
-				config_R5.iProtocolConfigOption.iId;
-			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iDnsAddresses =
-				config_R5.iProtocolConfigOption.iDnsAddresses;
-			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iMiscBuffer =
-				config_R5.iProtocolConfigOption.iMiscBuffer;								
-			iNotifyDataPointers.iContextActivationRequested5->iNWIContext =
-				config_R5.iNWIContext;
-			iNotifyDataPointers.iContextActivationRequested5->iPFI =
-				config_R5.iPFI;																		
-	    	iNotifyDataPointers.iContextActivationRequested5->iPdpHeaderCompression =
-	    	    config_R5.iPdpHeaderCompression;      	    
-	    	iNotifyDataPointers.iContextActivationRequested5->iPdpDataCompression =
-	            config_R5.iPdpDataCompression;
-	       	iNotifyDataPointers.iContextActivationRequested5 = NULL;
-	            
-	        // Complete request with KErrNone
-	        CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
-			}
-		}
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::NotifyContextAdded
-// Requests notification of context has been added.
-// Allows a client to be notified whenever a new context has been created. It
-// should be noted that once the notification completes, the client must then
-// re-post the notification if they wish to continue receiving further
-// notifications.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::NotifyContextAdded(
-    const TDataPackage& aPackage )   
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyContextAdded." );
-
-	TDes* const context = aPackage.Des1u();
-
-    // Save request handle type and context Name
-    iReqHandleType = EMultimodePacketServiceNotifyContextAdded;
-    iNotifyDataPointers.iContextAdded = context;
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteNotifyContextAdded
-// Completes the context added notification to client.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteNotifyContextAdded(
-    CMmDataPackage* aPackage )  
-    {
-    TInfoName tempHostCID;
-    tempHostCID.Zero();
-    
-	//Variables needed for unpacking data
-
-	TInfoName contextName;
-	contextName.Zero();
-	TInt result ( 0 );
-
-    TInt trapError( KErrNone );
-    TInt ret( KErrNone );
-
-	aPackage->UnPackData( contextName, result  );
-
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded." );
-
-	if ( KErrNone != result )
-        {
-        //if one Dial-up context is created
-        if ( iDialUpContext )
-            {
-            // External context, service has no control to the context.
-            // Context name forced to External2.
-            contextName.Copy( KStringExternal2 );
-
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded :Create Secondary Dial-up Object." );
-        
-            // Create object for externally created dial-up context
-            TRAP( trapError, iSecondaryDialUpContext = CMmPacketContextTsy::NewL(
-                this, tempHostCID, contextName ); );
-            }
-
-        else  
-            {
-            // External context, service has no control to the context.
-            // Context name forced to External.
-            contextName.Copy( KStringExternal );
-
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded :Create Dial-up Object." );
-        
-            // Create object for externally created dial-up context
-            TRAP( trapError, iDialUpContext = CMmPacketContextTsy::NewL(
-                this, tempHostCID, contextName ); );
-            }
-
-        if ( KErrNone == trapError )
-            {
-            if ( contextName.Compare( KStringExternal2 ) == 0 )
-                {
-                ret = iPacketContextList->AddObject(
-                    iSecondaryDialUpContext, 0x00, 0x00, 
-                    contextName );
-                }
-            else if ( contextName.Compare( KStringExternal ) == 0 )
-                {
-                ret = iPacketContextList->AddObject( iDialUpContext,
-                    0x00, 0x00, contextName );
-                }
-
-            if( KErrNone != ret )
-                {
-
-                if ( contextName.Compare( KStringExternal2 ) == 0 )
-                    {
-                    iSecondaryDialUpContext->Close();
-                    }
-                else if ( contextName.Compare( KStringExternal ) == 0 )
-                    {
-                    iDialUpContext->Close();
-                    }
-                }
-
-	        if ( KErrNone != ret || KErrNone != trapError )
-	            {
-	            if ( contextName.Compare( KStringExternal2 ) == 0 )
-	                {
-	                iSecondaryDialUpContext = NULL;
-	                }
-	            else if ( contextName.Compare( KStringExternal ) == 0 )
-	              	{
-	                iDialUpContext = NULL;
-	                }
-	           	}
-	     	}
-        
-        //Check if dial-up context is created, and set default params
-        if ( contextName.Compare( KStringExternal2 ) == 0 )
-            {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded :Reset Secondary Dial-up Object." );
-            // Reset secondary dial-up context
-            if(iSecondaryDialUpContext)
-            	{
-            	iSecondaryDialUpContext->ResetDialUpContext();
-            	}
-			
-            }
-        else if ( contextName.Compare( KStringExternal ) == 0 )
-            {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded :Reset Dial-up Object." );
-            // Reset dial-up context
-            if(iDialUpContext)
-            	{
-            	iDialUpContext->ResetDialUpContext();
-            	}
-            }
-        }
-
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceNotifyContextAdded ) );
-
-    // Check that request handle is valid
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-        // Add context name to the etel side memory
-        *iNotifyDataPointers.iContextAdded = contextName;
-        iNotifyDataPointers.iContextAdded = NULL;
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded. Context Name: %S", &contextName );
-
-        // Complete request with KErrNone
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::NotifyDynamicCapsChange
-// Requests notification of dynamic capabilities change.
-// This function will complete when the dynamic packet data capabilities
-// change; that is, either some action has become possible and/or some action
-// is no longer possible. A common usage of the dynamic capabilities functions
-// would be for GetDynamicCaps() to be called first to retrieve the current
-// set of capabilities, and then the NotifyDynamicCapsChange() request to be
-// posted to be kept informed of any changes.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::NotifyDynamicCapsChange(
-    RPacketService::TDynamicCapsFlags* const aCaps ) 
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyDynamicCapsChange." );
-
-    // Save pointer to aCaps
-    iNotifyDataPointers.iDynamicCapsChange = aCaps;
-
-    // Set request handle type
-    iReqHandleType = EMultimodePacketServiceNotifyDynamicCapsChange;
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteNotifyDynamicCapsChange
-// Completes dynamic capabilities notification to client.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteNotifyDynamicCapsChange(
-    const RPacketService::TDynamicCapsFlags aCaps ) 
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyDynamicCapsChange." );
-
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceNotifyDynamicCapsChange ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-        *iNotifyDataPointers.iDynamicCapsChange = aCaps;
-        iNotifyDataPointers.iDynamicCapsChange = NULL;
-
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::NotifyMSClassChange
-// Requests notification of mobile station class change.
-// This function will complete when there is a change in the current GPRS
-// class of the mobile station. The new class is passed back in the aNewClass
-// parameter.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::NotifyMSClassChange(
-    RPacketService::TMSClass* const aNewClass ) 
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyMSClassChange." );
-
-    // Save aNewClass internally
-    iNotifyDataPointers.iMSClassChange = aNewClass;
-
-    iReqHandleType = EMultimodePacketServiceNotifyMSClassChange;
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteNotifyMSClassChange
-// Completes mobile station class notification to client.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteNotifyMSClassChange(
-    CMmDataPackage* aDataPackage )				
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyMSClassChange." );
-
-	RPacketService::TMSClass newClass;
-	aDataPackage->UnPackData( newClass );
-
-    if ( newClass != iInternalSavedData.iMsClass )
-        {
-        // Save new ms class internally
-        iInternalSavedData.iMsClass = newClass;
-
-        // Reset request handle. Returns the deleted request handle
-        const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-            EMultimodePacketServiceNotifyMSClassChange ) );
-
-        if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-            {
-            // Save changed MS Class to ETel side memory
-            *iNotifyDataPointers.iMSClassChange = newClass;
-            iNotifyDataPointers.iMSClassChange = NULL;
-
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteNotifyMSClassChange. New Ms Class: %d", newClass );
-            // Complete request with KErrNone
-            CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
-            }
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::NotifyStatusChange
-// informs client that service status change.
-// Allows a client to be notified of a change in the status
-// of the connection to the packet service. The new status is
-// passed back to the client via aPacketStatus parameter.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::NotifyStatusChange(
-    RPacketService::TStatus* const aPacketStatus ) 
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyStatusChange." );
-
-    // Save aPacketStatus to internal memory
-    iNotifyDataPointers.iStatusChange = aPacketStatus;
-
-    // Set request handle type
-    iReqHandleType = EMultimodePacketServiceNotifyStatusChange;
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteNotifyStatusChange
-// Completes service status notification to client.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteNotifyStatusChange(
-    const RPacketService::TStatus& aPacketStatus,
-    TInt aErrorCode )
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyStatusChange." );
-    if ( aPacketStatus != iInternalSavedData.iServiceStatus )
-        {
-        iInternalSavedData.iServiceStatus = aPacketStatus;
-
-        // Reset req handle. Returns the deleted req handle
-        const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-            EMultimodePacketServiceNotifyStatusChange ) );
-
-        if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-            {
-            *iNotifyDataPointers.iStatusChange = aPacketStatus;
-            iNotifyDataPointers.iStatusChange = NULL;
-
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteNotifyStatusChange. Service Status:%d", aPacketStatus );
-            CMmPacketServiceTsy::ReqCompleted( reqHandle, aErrorCode );
-            }
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::RejectActivationRequest
-// Reject activation request from the network.
-// This function will cause the phone to reject the network's request for a
-// PDP context activation. Note, there is no corresponding "accept" message
-// for the phone to send. To accept, the phone should simply begin to activate
-// a PDP context with the appropriate IP address before the network's timer
-// expires. On GPRS, this timer is between 5 and 8 seconds, but may
-// effectively be between around 25 and 40 seconds as the specifications state
-// that the activation request should be re-sent up to five times.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::RejectActivationRequestL()
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::RejectActivationRequestL." );
-
-    const TTsyReqHandle tsyRegHandle( iTsyReqHandleStore->GetTsyReqHandle(
-        EMultimodePacketServiceRejectActivationRequest ) );
-
-    TInt ret( KErrServerBusy );
-
-    if ( EMultimodePacketServiceReqHandleUnknown == tsyRegHandle )
-        {
-		// Reject network activation
-		ret = iMessageManager->HandleRequestL( 
-		    EPacketRejectActivationRequest );
-
-        if ( KErrNone == ret )
-            {
-            // Set request handle
-            iReqHandleType = EMultimodePacketServiceRejectActivationRequest;
-            }
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteRejectActivationRequest
-// Completes asynchronous reject activation request.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteRejectActivationRequest()
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteRejectActivationRequest." );
-
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceRejectActivationRequest ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-        // Complete the client request
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::SetAttachMode
-// Sets attach mode given in parameter to the server.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::SetAttachModeL(
-    const RPacketService::TAttachMode* aMode )
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::SetAttachModeL." );
-
-    iAttachMode = *aMode;
-
-    TInt ret( KErrServerBusy );
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
-        EMultimodePacketServiceSetAttachMode ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
-        {
- 		//Set attach mode
-		ret = iMmPacketServiceGsmWcdmaExt->SetAttachModeL( *aMode );
-
-		if ( KErrNone == ret )
-            {
-            // Set req handle
-            iReqHandleType = EMultimodePacketServiceSetAttachMode;
-            }
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteSetAttachMode
-// Completes the Set Attach Mode request.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteSetAttachMode(
-    const TInt aError )  //error value
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteSetAttachMode. Error Value: %d", aError );
-
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceSetAttachMode ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-        // Complete the client request
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::SetPreferredBearer
-// Sets preferred bearer given in parameter to the GPDS server.
-// This function will set the preferred bearer for the MT to default to when
-// dropping from Class B operation to Class C, for instance when the MT moves
-// into a Routing Area of cells or new GPRS network which operates in Network
-// Mode III. Class C operation requires that the MT is attached to either GSM
-// or GPRS, not both.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::SetPreferredBearerL(
-    const TDataPackage& aPackage )		
-    {
-	TAny* const dataPtr = aPackage.Ptr1();
-
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::SetPreferredBearerL. Preferred Bearer: %d", &dataPtr );
-
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
-        EMultimodePacketServiceSetPreferredBearer ) );
-
-    TInt ret( KErrServerBusy );
-
-    if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
-        {
-        RPacketService::TPreferredBearer* abearer = REINTERPRET_CAST(
-            RPacketService::TPreferredBearer*, dataPtr );
-
-        // Set preferred beareraPackage
-        ret = iMmPacketServiceGsmWcdmaExt->SetPreferredBearerL( aPackage );
-
-        if ( KErrNone == ret )
-            {
-            iTemporarySavedData.iPreferredBearer = *abearer;
-
-            // Set request handle type
-            iReqHandleType = EMultimodePacketServiceSetPreferredBearer;
-            }
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteSetPreferredBearer
-// Completes the Set Preferred Bearer request.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteSetPreferredBearer(
-    const TInt aError )  //epoc error code
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteSetPreferredBearer. Error: %d", aError );
-
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceSetPreferredBearer ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-        if ( KErrNone == aError )
-            {
-            iInternalSavedData.iPreferredBearer =
-                iTemporarySavedData.iPreferredBearer;
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteSetPreferredBearer. Preferred Bearer: %d", iInternalSavedData.iPreferredBearer );
-            }
-
-        // Complete the client request
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::ExtFunc
-// ExtFunc is called by the ETel when it has request for the TSY.
-// For TSY to process request a request handle, request type and request data
-// are passed to the TSY.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::ExtFunc(
-    const TTsyReqHandle aTsyReqHandle,  
-    const TInt aIpc,                    
-    const TDataPackage& aPackage )     
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::ExtFunc. IPC: %d", aIpc );
-
-    TInt ret( KErrNone );
-    TInt trapError( KErrNone );
-
-    // Ensure the ReqHandleType is unset.
-    // This will detect cases where this method indirectly calls itself
-    // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
-    // Such cases are not supported because iReqHandleType is in the context of this class instance,
-    // not this request, and we don't want the values set by the inner request and the outer request
-    // interfering with each other.
-    __ASSERT_DEBUG(iReqHandleType==EMultimodePacketServiceReqHandleUnknown, User::Invariant());
-    
-    // Set tsy request handle
-    iTsyReqHandle = aTsyReqHandle;
-
-    // Call DoExtFuncL()
-    TRAP( trapError, ret = DoExtFuncL( aIpc, aPackage ); );
-
-    if ( KErrNone != trapError )
-        {
-        CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, trapError );
-        }
-    else if ( KErrNone != ret )
-        {
-        CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
-        }
-
-    if ( EMultimodePacketServiceReqHandleUnknown != iReqHandleType )
-        {
-        // Save request handle type
-
-#ifdef REQHANDLE_TIMER
-        SetTypeOfResponse( iReqHandleType );
-#else
-        iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, iTsyReqHandle );
-#endif // REQHANDLE_TIMER
-        // We've finished with this value now. Clear it so it doesn't leak
-        //  up to any other instances of this method down the call stack
-        iReqHandleType = EMultimodePacketServiceReqHandleUnknown;
-        }
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::DoExtFuncL
-// Calls correct method to handle ETel server request.
-// unpack packaged parameters
-// call correct method implemention using the IPC number and return the
-// return value back to the caller.
-// in case IPC number is not understood by switch, KErrNotSupported will
-// be returned.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::DoExtFuncL(
-    const TInt aIpc,                
-    const TDataPackage& aPackage )  
-    {
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::DoExtFuncL. IPC: %d TSY Req Handle:%d", aIpc, iTsyReqHandle);
-
-    TInt ret( KErrNotSupported );
-
-    TAny* const dataPtr = aPackage.Ptr1();
-    TAny* const dataPtr2 = aPackage.Ptr2();
-
-    switch ( aIpc )
-        {
-        case EPacketNotifyContextAdded:
-			ret = NotifyContextAdded( aPackage );
-            break;
-        case EPacketAttach:
-            ret = AttachL();
-            break;
-        case EPacketDetach:
-            ret = DetachL();
-            break;
-        case EPacketGetStatus:
-            ret = GetStatus(
-                REINTERPRET_CAST( RPacketService::TStatus*, dataPtr ) );
-            break;
-        case EPacketNotifyStatusChange:
-            ret = NotifyStatusChange(
-                REINTERPRET_CAST( RPacketService::TStatus*, dataPtr ) );
-            break;
-        case EPacketNotifyContextActivationRequested:
-            ret = NotifyContextActivationRequested(
-                REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
-            break;
-        case EPacketRejectActivationRequest:
-            ret = RejectActivationRequestL();
-            break;
-        case EPacketEnumerateContexts:
-            ret = EnumerateContexts(
-                REINTERPRET_CAST( TInt*, dataPtr ),
-                REINTERPRET_CAST( TInt*, dataPtr2 ) );
-            break;
-        case EPacketGetContextInfo:
-            ret = GetContextInfo(
-                REINTERPRET_CAST( TInt*, dataPtr ),
-                REINTERPRET_CAST( RPacketService::TContextInfo*, dataPtr2 ) );
-            break;
-        case EPacketGetNtwkRegStatus:
-            ret = GetNtwkRegStatusL(
-                REINTERPRET_CAST( RPacketService::TRegistrationStatus*,
-                    dataPtr ) );
-            break;
-        case EPacketNotifyChangeOfNtwkRegStatus:
-            ret = NotifyChangeOfNtwkRegStatus(
-                REINTERPRET_CAST( RPacketService::TRegistrationStatus*,
-                    dataPtr ) );
-            break;
-        case EPacketGetMSClass:
-            ret = GetMSClass(
-                REINTERPRET_CAST( RPacketService::TMSClass*, dataPtr ),
-                REINTERPRET_CAST( RPacketService::TMSClass*, dataPtr2 ) );
-            break;
-        case EPacketNotifyMSClassChange:
-            ret = NotifyMSClassChange(
-                REINTERPRET_CAST( RPacketService::TMSClass*, dataPtr ) );
-            break;
-        case EPacketSetPrefBearer:
-			ret = SetPreferredBearerL( aPackage );
-            break;
-        case EPacketGetPrefBearer:
-            ret = GetPreferredBearer( REINTERPRET_CAST(
-                RPacketService::TPreferredBearer*, dataPtr ) );
-            break;
-        case EPacketGetStaticCaps:
-            ret = GetStaticCaps(
-                REINTERPRET_CAST( TUint*, dataPtr ),
-                REINTERPRET_CAST( RPacketContext::TProtocolType*, dataPtr2 ) );
-            break;
-        case EPacketGetDynamicCaps:
-            ret = GetDynamicCaps( REINTERPRET_CAST(
-                RPacketService::TDynamicCapsFlags*, dataPtr ) );
-            break;
-        case EPacketNotifyDynamicCapsChange:
-            ret = NotifyDynamicCapsChange( REINTERPRET_CAST(
-                RPacketService::TDynamicCapsFlags*, dataPtr ) );
-            break;
-        case EPacketSetAttachMode:
-            ret = SetAttachModeL(
-                REINTERPRET_CAST( RPacketService::TAttachMode*, dataPtr ) );
-            break;
-        case EPacketGetAttachMode:
-            ret = GetAttachModeL(
-                REINTERPRET_CAST( RPacketService::TAttachMode*, dataPtr ) );
-            break;
-        case EPacketPrepareOpenSecondary:
-            ret = PrepareOpenSecondary( aPackage.Des1u() );
-            break;
-        case EPacketEnumerateNifs:
-            ret = EnumerateNifs( REINTERPRET_CAST ( TInt*, dataPtr ) );
-            break;
-        case EPacketGetNifInfo:
-        	// Check that dataPtr2 is not null
-        	if (dataPtr2)
-        		{
-        		// Get the TDes8 version of the parameter and find its MaxLength()
-        		TInt parameterLength = aPackage.Des2n()->MaxLength();
-        		
-        		// Create a temporary object of the expected type and find the expected MaxLength()
-        		RPacketService::TNifInfoV2 temp;
-        		RPacketService::TNifInfoV2Pckg tempPckg(temp);
-        		TInt expectedLength = tempPckg.MaxLength();
-
-				// Compare the expected length with the actual length of the sent parameter
-	        	if ( parameterLength == expectedLength )
-	        		{
-		            ret = GetNifInfo( REINTERPRET_CAST( TInt*, dataPtr ),
-	    	            REINTERPRET_CAST( RPacketService::TNifInfoV2*, dataPtr2 ) );
-	        		}
-	        	else
-	        		{
-	        		ret = KErrArgument;
-	        		}
-        		}
-        	else
-        		{
-        		ret = KErrArgument;
-        		}	
-            break;
-        case EPacketEnumerateContextsInNif:
-            ret = EnumerateContextsInNif( aPackage.Des2u(),
-                REINTERPRET_CAST( TInt*, dataPtr ) );
-            break;
-        case EPacketGetContextNameInNif:
-            ret = GetContextNameInNif(
-                REINTERPRET_CAST( RPacketService::TContextNameInNif*,
-                    dataPtr ), aPackage.Des2u() );
-            break;
-        case EPacketSetDefaultContextParams:
-			ret = SetDefaultContextParamsL( aPackage );
-            break;
-        case EPacketGetDefaultContextParams:
-            ret = GetDefaultContextParams(
-                REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
-            break;
-        case EPacketNotifyMbmsNetworkServiceStatusChange:
-        	ret = NotifyMbmsNetworkServiceStatusChange( 
-        		reinterpret_cast<TMbmsNetworkServiceStatus*> (dataPtr ) );
-            break;
-        case EPacketNotifyMbmsServiceAvailabilityChange:
-        	ret = NotifyMbmsServiceAvailabilityChange();
-            break;
-        case EPacketGetMbmsNetworkServiceStatus:
-        	ret = GetMbmsNetworkServiceStatus(
-        	    *reinterpret_cast<TBool*> (dataPtr ),
-        	    reinterpret_cast<TMbmsNetworkServiceStatus*> (dataPtr2 ) );
-        	break; 
-        case EPacketEnumerateMbmsMonitorServiceList:
-            ret = EnumerateMonitorServiceList(
-                *reinterpret_cast<TInt*> ( dataPtr ),
-                *reinterpret_cast<TInt*> ( dataPtr2 ) );
-            break;
-        case EPacketEnumerateMbmsActiveServiceList:
-            ret = EnumerateMbmsActiveServiceList(
-                *reinterpret_cast<TInt*> ( dataPtr),
-                *reinterpret_cast<TInt*>(dataPtr2) );
-            break;
-        case EPacketUpdateMbmsMonitorServiceList:
-			TMbmsAction action;
-			action = *reinterpret_cast< TMbmsAction*> (dataPtr );
-        	if(dataPtr2)
-				{
-				ret = UpdateMbmsMonitorServiceListL(
-               		action,
-                      aPackage.Des2n() );
-				}
-			else
-				{
-				ret = UpdateMbmsMonitorServiceListL(
-					action, NULL );
-				}                            
-            break;
-		case EPacketGetMbmsMonitoredServicesPhase1:
-            ret = GetMbmsMonitoredServicesPhase1L(
-                reinterpret_cast<RMobilePhone::TClientId*> (dataPtr),
-                *reinterpret_cast<TUint*>(dataPtr2 ) );
-            break;
-        case EPacketGetMbmsMonitoredServicesPhase2:
-            ret = GetMbmsMonitoredServicesPhase2(
-                reinterpret_cast<RMobilePhone::TClientId*>( dataPtr ),
-                aPackage.Des2n());
-            break;           
-        //case EPacketSetMSClass:
-        default:
-            break;
-        }
-
-    return ret;
-    }
-
-
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::ReqModeL
-// Returns request mode for given IPC.
-// leave if given IPC is not supported
-// return request mode for IPC number given in parameter
-//----------------------------------------------------------------------------
-//
-CTelObject::TReqMode CMmPacketServiceTsy::ReqModeL(
-    const TInt aIpc ) 
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::ReqModeL. IPC: %d", aIpc );
-
-    CTelObject::TReqMode reqMode( 0 );
-    switch ( aIpc )
-        {
-        // All disabled TSYs wishing to implement their own buffering 
-        // algorithm will place all requests in this category.
-
-        // Get methods that do not use DOS and return immediately.
-        // Other methods that return immediately.
-        // Methods that can propably take a long time flow control not 
-        // required.
-        case EPacketGetNtwkRegStatus:
-        case EPacketGetDynamicCaps:
-        case EPacketGetStatus:
-        case EPacketEnumerateContexts:
-        case EPacketGetContextInfo:
-        case EPacketGetAttachMode:
-        case EPacketGetStaticCaps:
-        case EPacketRejectActivationRequest:
-        case EPacketSetAttachMode:
-        case EPacketAttach:
-        case EPacketDetach:
-        case EPacketSetPrefBearer:
-        case EPacketGetPrefBearer:
-        case EPacketPrepareOpenSecondary:
-        case EPacketEnumerateNifs:
-        case EPacketGetNifInfo:
-        case EPacketEnumerateContextsInNif:
-        case EPacketGetContextNameInNif:
-        case EPacketSetDefaultContextParams:
-        case EPacketGetDefaultContextParams:
-        case EPacketUpdateMbmsMonitorServiceList:
-        case EPacketEnumerateMbmsMonitorServiceList:
-        case EPacketGetMbmsNetworkServiceStatus:
-        case EPacketEnumerateMbmsActiveServiceList:        
-        case EPacketGetMbmsMonitoredServicesPhase1:
-        case EPacketGetMbmsMonitoredServicesPhase2:
-            break;
-
-        // Commands that change the state of the phone.
-        case EPacketGetMSClass:
-            reqMode = KReqModeFlowControlObeyed;
-            break;
-
-        // Requests that notify a client about a change of state.
-        case EPacketNotifyContextAdded:
-        case EPacketNotifyStatusChange:
-        case EPacketNotifyChangeOfNtwkRegStatus:
-        case EPacketNotifyContextActivationRequested:
-        case EPacketNotifyDynamicCapsChange:
-        case EPacketNotifyMSClassChange:
-        case EPacketNotifyMbmsNetworkServiceStatusChange:
-            reqMode = KReqModeMultipleCompletionEnabled |
-                KReqModeRePostImmediately;
-        case EPacketNotifyMbmsServiceAvailabilityChange:       
-            break;
-
-        // Following requests are not supported
-        //case EPacketSetMSClass:
-        default:
-            User::Leave( KErrNotSupported );
-            break;
-        }
-
-    return reqMode;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::NumberOfSlotsL
-// Returns number of slots to be used for given IPC.
-// return number of slots to be used for IPC number given in parameter
-// leave with KErrNotSupported if invalid IPC
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::NumberOfSlotsL(
-    const TInt aIpc ) 
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::NumberOfSlotsL. IPC: %d", aIpc );
-
-    TInt numberOfSlots( 0 );
-    switch ( aIpc )
-        {
-
-        case EPacketNotifyStatusChange:
-            numberOfSlots = KMmPacketServiceNotifyStatusChangeSlots;
-            break;
-        case EPacketNotifyDynamicCapsChange:
-            numberOfSlots = KMmPacketServiceNotifyDynamicCapsChangeSlots;
-            break;
-        case EPacketNotifyContextAdded:
-            numberOfSlots = KMmPacketServiceNotifyContextAddedSlots;
-            break;
-        case EPacketNotifyContextActivationRequested:
-            numberOfSlots =
-                KMmPacketServiceNotifyContextActivationRequestedSlots;
-            break;
-        case EPacketNotifyChangeOfNtwkRegStatus:
-            numberOfSlots = KMmPacketServiceNotifyChangeOfNtwkRegStatusSlots;
-            break;
-        case EPacketNotifyMSClassChange:
-            numberOfSlots = KMmPacketServiceNotifyMSClassChangeSlots;
-            break;
-        case EPacketNotifyMbmsNetworkServiceStatusChange:
-            numberOfSlots = KMmPacketServiceNotifyMBMSServiceStatusSlots;
-            break;
-        default:
-            // Unknown or invalid IPC
-            User::Leave( KErrNotSupported );
-            break;
-        }
-
-    return numberOfSlots;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CancelService
-// When the clients close their sub-sessions (eg. by calling RPhone::Close),
-// they may not have cancelled all their outstanding asynchronous requests
-// before closing. It is up to the ETel server to clean up in this situation,
-// so the server will find the list of outstanding requests related to that
-// sub-session object and pass these outstanding IPC request numbers, one at a
-// time, to the CancelService function in the TSY.
-// This method is also called when client initiates normal cancel to the
-// request.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::CancelService(
-    const TInt aIpc,                    
-    const TTsyReqHandle aTsyReqHandle ) 
-    {
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::CancelService. IPC: %d Tsy Req Handle:%d", aIpc, aTsyReqHandle);
-
-    TInt ret( KErrNone );
-    
-    // Ensure the ReqHandleType is unset.
-    // This will detect cases where this method indirectly calls itself
-    // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
-    // Such cases are not supported because iReqHandleType is in the context of this class instance,
-    // not this request, and we don't want the values set by the inner request and the outer request
-    // interfering with each other.
-    __ASSERT_DEBUG(iReqHandleType==EMultimodePacketServiceReqHandleUnknown, User::Invariant());
-
-    // When the clients close their sub-sessions (eg. by calling
-    // RPacketService::Close), they may not have cancelled all their
-    // outstanding asynchronous requests before closing.  It is up to the ETel
-    // server to clean up in this situation, so the server will find the list
-    // of outstanding requests related to that sub-session object and pass
-    // these outstanding IPC request numbers, one at a time, to the
-    // CancelService method in the TSY.
-
-    switch ( aIpc )
-        {
-        case EPacketNotifyContextAdded:
-            iNotifyDataPointers.iContextAdded = NULL;
-            iReqHandleType = EMultimodePacketServiceNotifyContextAdded;
-            break;
-        case EPacketNotifyStatusChange:
-            iNotifyDataPointers.iStatusChange = NULL;
-            iReqHandleType = EMultimodePacketServiceNotifyStatusChange;
-            break;
-        case EPacketNotifyContextActivationRequested:
-            if ( aTsyReqHandle == iTsyReqHandleStore->GetTsyReqHandle(
-                EMultimodePacketServiceNotifyContextActivationRequested ) )
-                {
-                iNotifyDataPointers.iContextActivationRequested = NULL;
-                iReqHandleType =
-                    EMultimodePacketServiceNotifyContextActivationRequested;
-                }
-            else if ( aTsyReqHandle == iTsyReqHandleStore->GetTsyReqHandle(
-                EMultimodePacketServiceNotifyContextActivationRequested99 ) )
-                {
-                iNotifyDataPointers.iContextActivationRequested99 = NULL;
-                iReqHandleType =
-                    EMultimodePacketServiceNotifyContextActivationRequested99;
-                }
-            else if ( aTsyReqHandle == iTsyReqHandleStore->GetTsyReqHandle(
-                EMultimodePacketServiceNotifyContextActivationRequested5 ) )
-                {
-                iNotifyDataPointers.iContextActivationRequested5 = NULL;
-                iReqHandleType =
-                    EMultimodePacketServiceNotifyContextActivationRequested5;
-                }                
-            break;
-        case EPacketNotifyChangeOfNtwkRegStatus:
-            iNotifyDataPointers.iChangeOfNtwkRegStatus = NULL;
-            iReqHandleType = EMultimodePacketServiceNotifyNtwkRegStatusChange;
-            break;
-        case EPacketNotifyMSClassChange:
-            iNotifyDataPointers.iMSClassChange = NULL;
-            iReqHandleType = EMultimodePacketServiceNotifyMSClassChange;
-            break;
-        case EPacketNotifyDynamicCapsChange:
-            iNotifyDataPointers.iDynamicCapsChange = NULL;
-            iReqHandleType = EMultimodePacketServiceNotifyDynamicCapsChange;
-            break;
-        case EPacketNotifyMbmsNetworkServiceStatusChange:
-        	iNotifyDataPointers.iMBMSStatusChange = NULL;
-        	iReqHandleType = EMultimodePacketServiceNotifyMBMSStatusChange;
-        	break;
-        case EPacketNotifyMbmsServiceAvailabilityChange:
-         	iReqHandleType = EMultimodePacketServiceNotifyMbmsServiceAvailabilityChange;
-        	break;       
-        case EPacketGetMbmsNetworkServiceStatus:
-         	iReqHandleType = EMultimodePacketServiceGetMBMSStatus;
-        	break;       
-        case EPacketGetMbmsMonitoredServicesPhase1:
-        case EPacketGetMbmsMonitoredServicesPhase2:
-        	GetMbmsMonitoredServicesCancel( aTsyReqHandle );
-        	break;
-        case EPacketUpdateMbmsMonitorServiceList:
-        	UpdateMbmsMonitorServiceListCancel(aTsyReqHandle);	
-        	break;
-        // TSY has started a request and it is not possible to then
-        // cancel this request. The best thing for the TSY to do in this case
-        // is to proceed as though the Cancel never happened. The server's 
-        // call to the TSY cancel function will return synchronously.
-        case EPacketAttach:
-        case EPacketDetach:
-        case EPacketGetStatus:
-        case EPacketRejectActivationRequest:
-        case EPacketEnumerateContexts:
-        case EPacketGetContextInfo:
-        case EPacketGetNtwkRegStatus:
-        case EPacketGetMSClass:
-        case EPacketSetPrefBearer:
-        case EPacketGetPrefBearer:
-        case EPacketGetStaticCaps:
-        case EPacketGetDynamicCaps:
-        case EPacketSetAttachMode:
-        case EPacketGetAttachMode:
-        case EPacketEnumerateNifs:
-        case EPacketGetNifInfo:
-        case EPacketEnumerateContextsInNif:
-        case EPacketGetContextNameInNif:
-        case EPacketSetDefaultContextParams:
-        case EPacketGetDefaultContextParams:
-        case EPacketEnumerateMbmsMonitorServiceList:
-        case EPacketEnumerateMbmsActiveServiceList:
-            break;
-
-        // Cancel methods that are not supported.
-        //case EPacketSetMSClass:
-        default:
-            ret = KErrNotSupported;
-            break;
-        }
-
-    if ( EMultimodePacketServiceReqHandleUnknown != iReqHandleType )
-        {
-        // Reset tsy request handle
-        iTsyReqHandleStore->ResetTsyReqHandle( iReqHandleType );
-
-        // Complete request with KErrCancel
-        CMmPacketServiceTsy::ReqCompleted( aTsyReqHandle, KErrCancel );
-        
-        // We've finished with this value now. Clear it so it doesn't leak
-        //  up to any other instances of this method down the call stack
-        iReqHandleType = EMultimodePacketServiceReqHandleUnknown;
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::RegisterNotification
-// Register notification.
-// Returns KErrNone to ETel server in case of known notification request type.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::RegisterNotification(
-    const TInt aIpc ) 
-	{
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::RegisterNotification. IPC: %d", aIpc );
-
-    TInt ret( KErrNone );
-
-    switch ( aIpc )
-        {
-        case EPacketNotifyContextAdded:
-        case EPacketNotifyStatusChange:
-        case EPacketNotifyContextActivationRequested:
-        case EPacketNotifyChangeOfNtwkRegStatus:
-        case EPacketNotifyMSClassChange:
-        case EPacketNotifyDynamicCapsChange:
-        case EPacketNotifyMbmsNetworkServiceStatusChange:
-        case EPacketNotifyMbmsServiceAvailabilityChange:
-            break;
-        default:
-            // Not supported
-            ret = KErrNotSupported;
-            break;
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::DeregisterNotification
-// Deregister notification.
-// Returns KErrNone to ETel server in case of known notification request type.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::DeregisterNotification(
-    const TInt aIpc ) 
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::DeregisterNotification. IPC: %d", aIpc );
-
-    TInt ret( KErrNone );
-
-    switch ( aIpc )
-        {
-        case EPacketNotifyContextAdded:
-        case EPacketNotifyStatusChange:
-        case EPacketNotifyContextActivationRequested:
-        case EPacketNotifyChangeOfNtwkRegStatus:
-        case EPacketNotifyMSClassChange:
-        case EPacketNotifyDynamicCapsChange:
-        case EPacketNotifyMbmsNetworkServiceStatusChange:
-        case EPacketNotifyMbmsServiceAvailabilityChange:
-            break;
-        default:
-            // Not supported
-            ret = KErrNotSupported;
-            break;
-        }
-
-    return ret;
-    }
-    
-  
-
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::GetMbmsNetworkServiceStatus
-// Requests Get MBMS network service status 
-//-----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetMbmsNetworkServiceStatus(
-		TBool aAttemptAttach, 
-		TMbmsNetworkServiceStatus* aMBMSServiceStatus )
-{
-TFLOGSTRING2("TSY: CMmPacketServiceTsy:: TMbmsNetworkServiceStatus = %d", aMBMSServiceStatus );	
-
-   const TTsyReqHandle regHandle( iTsyReqHandleStore->GetTsyReqHandle(
-   EMultimodePacketServiceGetMBMSStatus ) );
-   
-   TInt ret( KErrServerBusy ); 
-   if ( !iMbmsStatusCached )
-    	{
-    	if ( EMultimodePacketServiceReqHandleUnknown == regHandle )  
-    		{
-    		// Save pointer to aMBMSServiceStatus
-    		iTemporarySavedData.iMbmsStatus = aMBMSServiceStatus;  
-    		    			    
-	    	// Get MBMS network service status
-	    	CMmDataPackage dataPackage;
-	    	dataPackage.PackData( &aAttemptAttach );
-			TRAPD(err, ret = iMessageManager->HandleRequestL( EPacketGetMbmsNetworkServiceStatus, &dataPackage));
-			if(err != KErrNone)
-				{
-				ret = err;
-				}
-			}
-			if ( KErrNone == ret )
-   				{
-   	 			// Set request handle type
-	    		iReqHandleType = EMultimodePacketServiceGetMBMSStatus;	
-   				}
-    		
-    	}
-    else // iMbmsStatusCached == ETrue
-    	{
-    	
-		*aMBMSServiceStatus = iInternalSavedData.iMbmsStatus;
-		
-   		// Complete the request with KErrNone
-    	CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-
-    	ret = KErrNone;
-    
-   		}
-   		
- 	return ret;	
-}
-	
-//-----------------------------------------------------------------------------
-// void CMmPacketServiceTsy::CompleteGetMbmsNetworkServiceStatus
-// Completes Get MBMS network service status request 
-//-----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteGetMbmsNetworkServiceStatus( 
-	CMmDataPackage* aDataPackage, TInt aError )
-	{
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteGetMbmsNetworkServiceStatus.");
-
-	//Update the cache
-	TMbmsNetworkServiceStatus mbmsNetworkServiceStatus = EMbmsSupportUnknown;
-	if ( KErrNone == aError )
-		{
-		//Unpack necessary data from datapackage
-		if ( aDataPackage )
-			{
-			aDataPackage->UnPackData( mbmsNetworkServiceStatus );
-			}
-            
-		// Change MBMS cache indicator value
-		iMbmsStatusCached = ETrue;
-		iInternalSavedData.iMbmsStatus = mbmsNetworkServiceStatus;
-		}
-
-	// Reset request handle. Returns the deleted request handle
-	const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-	EMultimodePacketServiceGetMBMSStatus ) );
-
-   // If request handle ok
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-    	{
-    	*iTemporarySavedData.iMbmsStatus = mbmsNetworkServiceStatus;
-        // Complete the client request
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
-        }
-	}
-	
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange
-// Requests notification of MBMS network service status change.
-// Allows a client to be notified whenever a change in the status of the
-// MBMS network service is detected.
-//-----------------------------------------------------------------------------
-//
-
-TInt CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange(
-	TMbmsNetworkServiceStatus* aMBMSServiceStatus )
-	{
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange TMbmsNetworkServiceStatus = %d", aMBMSServiceStatus );
-	
-	// Set request handle and save pointer to aMBMSServiceStatus
-    iNotifyDataPointers.iMBMSStatusChange = aMBMSServiceStatus;
-    iReqHandleType =  EMultimodePacketServiceNotifyMBMSStatusChange;
-
-    return KErrNone;
-	}
-	
-//-----------------------------------------------------------------------------
-// Void CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange
-// Completes notification of MBMS network service status request 
-//-----------------------------------------------------------------------------
-//	
-void CMmPacketServiceTsy::CompleteNotifyMbmsNetworkServiceStatusChange( 
-	CMmDataPackage* aDataPackage, TInt aResult )
-	{
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange.");
-	        
-	TInt result = aResult;        
-	if (aResult == KErrNone)
-		{	        
-		//Unpack necessary data from datapackage
-		TMbmsNetworkServiceStatus newMbmsNetworkServiceStatus;
-		aDataPackage->UnPackData( newMbmsNetworkServiceStatus );
-	
-		// If Mbms network service status changed
-		if ( newMbmsNetworkServiceStatus != iInternalSavedData.iMbmsStatus )
-        	{
-
-        	// Save new status internally
-        	iInternalSavedData.iMbmsStatus = newMbmsNetworkServiceStatus;
-        	iMbmsStatusCached = ETrue;
-        	
-        	// Reset request handle. Returns the deleted request handle
-			const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-	        EMultimodePacketServiceNotifyMBMSStatusChange ) );
-	        	
-	        // If request handle ok
-	    	if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-	        	{
-           		// Set MbmsNetworkServiceStatus to the etel side memory
-           		*iNotifyDataPointers.iMBMSStatusChange = newMbmsNetworkServiceStatus;
-           		iNotifyDataPointers.iMBMSStatusChange = NULL;
-
-	       		// Complete the client request
-	       		CMmPacketServiceTsy::ReqCompleted( reqHandle, result );
-
-        		}
-       	 	} 
-       	 		
-		}
-	else // result is != KErrNone
-		{
-		// Reset request handle. Returns the deleted request handle
-		const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-	    EMultimodePacketServiceNotifyMBMSStatusChange ) );
-	   	// Complete the client request
-	    CMmPacketServiceTsy::ReqCompleted( reqHandle, result );
-		}
-	}
-	
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::NotifyMbmsServiceAvailabilityChange
-// Requests notification of MBMS service availability status change.
-// Allows a client to be notified whenever a change in the status of the
-// MBMS network service is detected.
-//-----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::NotifyMbmsServiceAvailabilityChange()
-	{
-TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyMbmsServiceAvailabilityChange.");
-	
-	// Set request handle
-    iReqHandleType =  EMultimodePacketServiceNotifyMbmsServiceAvailabilityChange;
-
-    return KErrNone;
-	}
-	
-//-----------------------------------------------------------------------------
-// Void CMmPacketServiceTsy::CompleteNotifyMbmsServiceAvailabilityChange
-// Completes notification of MBMS service availability status request 
-//-----------------------------------------------------------------------------
-//	
-void CMmPacketServiceTsy::CompleteNotifyMbmsServiceAvailabilityChangeL(CMmDataPackage* aDataPackage, TInt aResult)
-	{
-	// Reset request handle. Returns the deleted request handle
-	const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-	        EMultimodePacketServiceNotifyMbmsServiceAvailabilityChange ) );
-		
-	// If request handle ok
-	if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-		{
-#ifdef USING_CTSY_DISPATCHER
-		//three defects, 
-		//1) no need to allocate a list all we need is a pointer and we unpack over this
-		//2) PopAndDestroy at the end could cause issues, in the iMBMSMonitoredList null case
-		//3) if completed with an Error,this will cause subsequent  notifys to have no effect as
-		//the request handle has been removed from the store. Here as before the request is completed 
-		//with aResult on aDataPackage or iMBMSMonitoredList being null.
-		if((aResult == KErrNone) && aDataPackage && iMBMSMonitoredList)
-			{
-			CPcktMbmsMonitoredServiceList* updatedMonitorList = NULL;
-			//Unpack necessary data from datapackage
-			aDataPackage->UnPackData(&updatedMonitorList);
-			iMBMSMonitoredList->SetServicesAvailabilityL(updatedMonitorList);
-			}
-		
-		// Complete the client request
- 	   	CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );
-				
-#else
-		if (aResult == KErrNone)
-			{
-			if (aDataPackage)
-				{
-				if(iMBMSMonitoredList != NULL)
-					{
-					// Create new list for changes
-					CPcktMbmsMonitoredServiceList* updatedMonitorList = CPcktMbmsMonitoredServiceList::NewL();
-					CleanupStack::PushL(updatedMonitorList);
-				
-					//Unpack necessary data from datapackage
-					aDataPackage->UnPackData( &updatedMonitorList );
-					iMBMSMonitoredList->SetServicesAvailabilityL(updatedMonitorList);
-					}
-				// Complete the client request
-		 	   	CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );
-	 	  	 	CleanupStack::PopAndDestroy();		 	   	
-	 	   		}
-	 	   	else
-	 	   		{
-				CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );	
-	 	   		}
-			}
-#endif //USING_CTSY_DISPATCHER
-		}
-	}					
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::EnumerateMonitorServiceList
-// Enumrates monitored service list
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::EnumerateMonitorServiceList( TInt& aCount, TInt& aMaxAllowed )
-    {
-		if (iMBMSMonitoredList != NULL)
-			{
-			aCount = iMBMSMonitoredList->NumberOfMonitoredList(  );	
-			}
-		else
-			{
-			aCount = 0;
-			}
-    	aMaxAllowed = iMaxMonitoredServices;
-    	
-TFLOGSTRING("TSY: CMmPacketServiceTsy::EnumerateMonitorServiceList." ); 
-      		
-       	// Complete the request with KErrNone
-    	CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );	  
-
-    return KErrNone;
-    } 
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteMaxMonitoredServicesChange
-// Enumrates monitored service list
-//----------------------------------------------------------------------------
-//    
-void CMmPacketServiceTsy::CompleteMaxMonitoredServicesChange( TInt aMaxMonitorValue )
-	{
-	iMaxMonitoredServices = aMaxMonitorValue;
-	}
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::UpdateMbmsMonitorServiceListL
-// Request to update monitored service list
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::UpdateMbmsMonitorServiceListL( TMbmsAction aAction,   
-             TDes8* aList )
-    { 
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
-   	EMultimodePacketServiceUpdateMBMSMonitorServiceList ) );
-    
-    TInt ret( KErrServerBusy ); 
-   
-	if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )  
-		{ 
-		if (iMBMSMonitoredList == NULL)
-			{
-			// create MBMS monitored service list
-	 		iMBMSMonitoredList = CMmMBMSMonitoredList::NewL( this, iMaxMonitoredServices );	
-			}
-		iActionType = aAction;
-		// Save changes of Monitored service list and action
-		ret = iMBMSMonitoredList->SaveUpdateValuesToTempL(aList, aAction); 
-		
-		// temp list was ok
-		if( KErrNone == ret )
-			{
-			// Get correct data packet and send it to LTSY
-			ret = iMBMSMonitoredList->PackDataL();	
-			
-			if ( KErrNone == ret )
-				{
-				// Set request handle type
-				iReqHandleType = EMultimodePacketServiceUpdateMBMSMonitorServiceList;	
-				}
-			}
-		else if( KErrAlreadyExists == ret )
-			{
-			// there were no new entries client tried to supply. Complete with KErrNone
-			// to client to think updating was ok
-			CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-			ret = KErrNone;
-			}
-		else if( KErrNotFound == ret )
-			{
-			// there were no new entries client tried to supply. Complete with KErrNotfound
-			CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
-			ret = KErrNone;
-			}
-		}	
-	
- 	return ret;	
-    
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteUpdateMbmsMonitorServiceList
-// Completes update monitored service list request
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteUpdateMbmsMonitorServiceList( 
-    CMmDataPackage* aDataPackage, 
-    const TInt aResult)
-	{
-	TFLOGSTRING( "TSY: CMmPacketServiceTsy::CompleteUpdateMbmsMonitorServiceListL." );
-
-	TInt result= aResult;
-	TInt err(KErrNone);
-	// Reset request handle. Returns the deleted request handle
-	const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-	        EMultimodePacketServiceUpdateMBMSMonitorServiceList ) );
-	        
-	if( aResult == KErrNone )
-		{
-		TRAP( err, result = iMBMSMonitoredList->ProcessEntriesL( NULL, iActionType ) );
-		if ( !err )
-		    TRAP( err, CompleteNotifyMbmsServiceAvailabilityChangeL( NULL, aResult ) );		
-		}
-	//there were problem managing entries
-	else if( (aResult == KErrMbmsImpreciseServiceEntries) && (aDataPackage != NULL) )
-		{
-		CPcktMbmsMonitoredServiceList* failedMonitorEntries = NULL;
-		aDataPackage->UnPackData( &failedMonitorEntries ); 
-		// there were a problems with some entries, 
-		// Check failed entries exists and add succesful entries to main list
-		if( failedMonitorEntries != NULL )
-			{
-			TRAP( err, iMBMSMonitoredList->ProcessEntriesL( failedMonitorEntries, iActionType ) );
-			}
-		else // There was a general error, don't add anything to main list
-			{
-			TRAP( err, iMBMSMonitoredList->ResetTempListL() );
-			}
-		}
-	 if( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-		 {
-         // If there was an error due to a function leaving, complete to the client with that error.
-         if (err)
-             {
-             result = err;
-             }
-		 //complete with error to client
-		 CMmPacketServiceTsy::ReqCompleted( reqHandle, result );
-		 }
-	    
-	}
-	
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::UpdateMbmsMonitorServiceListCancel
-// Completes update monitored service list request
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::UpdateMbmsMonitorServiceListCancel( TTsyReqHandle aTsyReqHandle )	
-	{
-	TFLOGSTRING2( "TSY: CMmPacketServiceTsy::UpdateMbmsMonitorServiceListCancel ReqHandle %d", aTsyReqHandle );
-	
-	if ( aTsyReqHandle != EMultimodePacketServiceReqHandleUnknown )
-        {
-        // Reset tsy request handle
-        iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketServiceUpdateMBMSMonitorServiceList );
-
-        // Complete request to client with KErrCancel
-        ReqCompleted( aTsyReqHandle, KErrCancel );
-        }	
-        
-    return KErrNone;
-	}
-
-
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1L
-// Returns size of the monitored service list.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1L(RMobilePhone::TClientId* aClient,  TUint& aBufSize)
-	{
-	TFLOGSTRING("TSY: CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1L called.");
-	// Initialize ret value
-	TInt ret( KErrNone );
-	TInt leaveCode( KErrNone );
-	
-
-	if( !iMBMSMonitoredList )
-		{
-		// No current monitor servece list exist. Complete error.
-		ReqCompleted( iTsyReqHandle, KErrNotFound );
-		}
-	else
-		{
-		// Get current size of monitor service list
-		TRAP( leaveCode, ret = GetSizeOfMonitoredServiceListL( aClient, aBufSize ) );
-		if (leaveCode == KErrNone)
-			{
-			leaveCode = ret;
-			}
-		if ( leaveCode != KErrNone )
-			{
-			ReqCompleted( iTsyReqHandle, leaveCode );
-			}
-		}
-	
-	return leaveCode;
-	}
-
-// ---------------------------------------------------------------------------
-// CMmMBMSMonitoredList::GetSizeOfMonitoredServiceList
-// This function returns size of monitored servicelist.
-// ---------------------------------------------------------------------------
-//  
-TInt CMmPacketServiceTsy::GetSizeOfMonitoredServiceListL(RMobilePhone::TClientId* aClient,  TUint& aBufSize)
-	{
-	// read the list, store its content and then return size of this buffer to client
-	TFLOGSTRING("TSY: CMmPacketServiceTsy::GetSizeOfMonitoredServiceList called.");
-	// create new list
-	CPcktMbmsMonitoredServiceList* currentList=CPcktMbmsMonitoredServiceList::NewL();
-	CleanupStack::PushL(currentList);
-	RPacketService::TMbmsServiceAvailabilityV1 entry;
-	
-	if (!iMBMSMonitoredList)
-		{
-		// create MBMS monitored service list
- 		iMBMSMonitoredList = CMmMBMSMonitoredList::NewL( this, iMaxMonitoredServices );	
-		}
-	
-	// fill TMbmsServiceAvailabilityV1 information
-	for (TInt i=0; i < iMBMSMonitoredList->ServiceList()->Enumerate(); i++)
-		{
-		
-		entry = iMBMSMonitoredList->ServiceList()->GetEntryL(i);
-		// Add the entry into the list, at the next empty location
-		currentList->AddEntryL(entry);
-		}
-	// Store the streamed list and the client ID
-	CListReadAllAttempt* read = CListReadAllAttempt::NewL( aClient );
-	CleanupStack::PushL(read);
-
-	read->iListBuf = currentList->StoreLC();
-	CleanupStack::Pop(); // pop the CBufFlat allocated by StoreLC; iListBuf will be destroy by read destructor 
-	
-	iGetMbmsMonitoredServiceLists->AppendL(read);
-	CleanupStack::Pop(); // pop the CListReadAllAttempt; the read will be destroy in phase 2
-	
-    // return the CBufFlat's size to client
-	aBufSize=(read->iListBuf)->Size();
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetSizeOfMonitoredServiceList: size=%d",aBufSize);  	
-    // Complete first phase of list retrieval
-    ReqCompleted( iTsyReqHandle, KErrNone );
-    CleanupStack::PopAndDestroy( currentList ); // Pop & destroy list
-    return KErrNone;	
-	}
-			
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase2
-// Returns monitored service list.
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase2(RMobilePhone::TClientId* aClient, TDes8* aBuf)
-	{
-	// Initialize ret value
-    TInt ret( KErrNotFound );
-    
-	TFLOGSTRING("TSY: CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase2 called");
-	CListReadAllAttempt* read=NULL;
-	
-	// Find the get Mbms monitored services from this client
-	for (TInt i=0; i<iGetMbmsMonitoredServiceLists->Count(); ++i)
-		{
-		// Check that session and client are rigth ones
-		read = iGetMbmsMonitoredServiceLists->At(i);
-		
-		if ((read->iClient.iSessionHandle == aClient->iSessionHandle) &&
-		    (read->iClient.iSubSessionHandle == aClient->iSubSessionHandle))
-			{
-			TPtr8 bufPtr((read->iListBuf)->Ptr(0));
-			
-	  	
-	  		if ( bufPtr.Length() <= aBuf->Length() )
-		  		{
-		  		// Copy the streamed list to the client
-				// Set pointer to list buffer
-				aBuf->Copy( bufPtr );
-				ret = KErrNone;
-				}
-			else
-				{
-				ret = KErrArgument;
-				}
-			
-			// Delete read and item from internal array
-			delete read;
-			iGetMbmsMonitoredServiceLists->Delete(i);
-			
-			// Complete request
-			ReqCompleted(iTsyReqHandle, ret);
-			
-            return ret;
-			}
-		}
-		
-    // Doesn't found the matching client for read all phase 1
-    return ret;	
-	}
-	
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1LCancel
-// Cancels Set Always On request
-//-----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetMbmsMonitoredServicesCancel( TTsyReqHandle aTsyReqHandle )
-	{
-	
-TFLOGSTRING("TSY: CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1LCancel called");	
-    // Remove the read all attempt
-    CListReadAllAttempt* read = NULL;
-
-    // Check that read all array does not contain any data.
-    // If it does, delete it.
-    // NOTE: functions request mode "Flow control obeyed" currently blocks
-    // request so that only one client can request data at the time.
-    // Therefore, loop-functionality is not needed.
-    if ( iGetMbmsMonitoredServiceLists->Count() > 0 )
-        {
-        read = iGetMbmsMonitoredServiceLists->At( 0 );
-        delete read;
-        iGetMbmsMonitoredServiceLists->Delete( 0 );
-        }
-
-    ReqCompleted( aTsyReqHandle, KErrCancel );
-
-    return KErrNone;	
-	}	
-	
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::MBMSContextList
-// Returns pointer to MBMS context list.
-//----------------------------------------------------------------------------
-//
-CMmMBMSContextList* CMmPacketServiceTsy::MBMSContextList()
-    {
-    return iMBMSContextList;
-    }
-       
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::OpenNewObjectL
-// Creates new Context object and returns a pointer to it.
-//----------------------------------------------------------------------------
-//
-CTelObject* CMmPacketServiceTsy::OpenNewObjectL(
-    TDes& aNewName )  
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. %S", &aNewName );
-    CTelObject* newContext = NULL;
-    TUint8 proxyId( 0 );    
-    TInt ret( KErrNone );
-             
-    if(0 == aNewName.Compare(KMBMSContextName))
-        {
-        ret = iMBMSContextList->GenerateNewContextName( aNewName, proxyId, iMaxActiveServices );
-
-        if( KErrNone != ret )
-            {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. Mbms Leaves with: %d", ret );
-            User::Leave( ret );            
-            }
-            
-        CMmMBMSContextTsy* context = CMmMBMSContextTsy::NewL( this, aNewName, proxyId ); 
-        ret = iMBMSContextList->AddObject( context );
-        if( KErrNone != ret )
-            {
-            // Created context couldn't save.
-            // Call Close() to context to remove it completely
-            context->Close();
-            context = NULL;
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. Mbms Leaves  with: %d", ret );
-            User::Leave( ret );
-            }
-        else
-            {
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::OpenNewObjectL. New MBMS Context Name: %S Proxy Id: %d",&aNewName, proxyId );            
-            newContext = context;            
-            }        
-        }
-    else
-        {            
-        ret = iPacketContextList->GenerateNewContextName( aNewName, proxyId );
-
-        if ( KErrNone != ret )
-            {
-            // Reason to leave is that maximum number of Contexts already exists.
-            // Leaving from here requires that TSY is configurated with max number
-            // of context supported by this phone ( value KMmMaxNumberOfContexts )
-            ret = CMmCommonStaticUtility::EpocErrorCode(
-                KErrOverflow, KErrUmtsMaxNumOfContextExceededByPhone );
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. Leaves with: %d", ret );
-            User::Leave( ret );
-            }
-        CMmPacketContextTsy* context = CMmPacketContextTsy::NewL( this, iHostCID, aNewName, proxyId );
-
-    	// reset cotext name 
-    	iHostCID.Zero();
-        ret = iPacketContextList->AddObject( context, proxyId, 0x00, aNewName );
-        if( KErrNone != ret )
-            {
-            // Created context couldn't save.
-            // Call Close() to context to remove it completely
-            context->Close();
-            context = NULL;
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. Leaves with: %d", ret );
-            User::Leave( ret );
-            }
-        else
-            {
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::OpenNewObjectL. New Context Name: %S Proxy Id: %d",&aNewName, proxyId );            
-            newContext = context;            
-            }
-        }               
-    return newContext;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::OpenNewObjectByNameL
-// Returns context object defined in parameter aName.
-//----------------------------------------------------------------------------
-//
-CTelObject* CMmPacketServiceTsy::OpenNewObjectByNameL(
-    const TDesC& aName )   
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL. Context Name: %S", &aName );
-
-    // length of object's name cannot be over 16 chars
-    if ( 16 < aName.Length() )
-        {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL. Leaves with: %d", KErrOverflow  );
-        User::Leave( KErrOverflow  );
-        }
-
-    const TInfoName mmPacketContextName( aName );
-    CMmPacketContextTsy* mmPacketContext = NULL;
-
-    if ( mmPacketContextName.Compare( KStringExternal ) == 0 )
-        {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL :Open Existing Dial-up Object." );
-        mmPacketContext = iDialUpContext;
-        }
-    else if ( mmPacketContextName.Compare( KStringExternal2 ) == 0 )
-        {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL :Open Existing Secondary Dial-up Object." );
-        mmPacketContext = iSecondaryDialUpContext;
-        }
-    else
-        {
-        mmPacketContext =
-            iPacketContextList->PacketContextByName( &mmPacketContextName );
-        }
-
-    // If not found, Leaves
-    if ( NULL == mmPacketContext )
-        {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL. Leaves with: %d", KErrNotFound );
-        User::Leave( KErrNotFound );
-        }
-
-    return mmPacketContext;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::PacketContextList
-// Returns pointer to the context list object.
-//----------------------------------------------------------------------------
-//
-CMmPacketContextList* CMmPacketServiceTsy::PacketContextList()
-    {
-    return iPacketContextList;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::ServiceStatus
-// Returns current status of Packet Service.
-//----------------------------------------------------------------------------
-//
-RPacketService::TStatus CMmPacketServiceTsy::ServiceStatus() const
-    {
-	return iInternalSavedData.iServiceStatus;
-    }
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::DialUpContext
-// Returns externally created dial-up context.
-//----------------------------------------------------------------------------
-//
-CMmPacketContextTsy* CMmPacketServiceTsy::DialUpContext(
-    const TInfoName aContextName )
-    {
-
-    CMmPacketContextTsy* mmpacketContext = NULL;
-
-    if ( aContextName.Compare( KStringExternal ) == 0 )
-        {
-        mmpacketContext = iDialUpContext;
-        }
-
-    else if ( aContextName.Compare( KStringExternal2 ) == 0 )
-        {
-        mmpacketContext =  iSecondaryDialUpContext;
-        }
-
-    return mmpacketContext;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::ResetPointerToDialUpContex
-// Resets pointer to dial-up context.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::ResetPointerToDialUpContext(
-    const TInfoName aContextName )
-    {
-
-    if ( aContextName.Compare( KStringExternal ) == 0 )
-        {
-        iDialUpContext = NULL;
-        }
-
-    else if ( aContextName.Compare( KStringExternal2 ) == 0 )
-        {
-        iSecondaryDialUpContext = NULL;
-        }
-    }
-
-#ifdef REQHANDLE_TIMER
-
-//---------------------------------------------------------------------------
-// CMmPacketServiceTsy::PhoneTsy
-// Returns pointer to the phone tsy object.
-//---------------------------------------------------------------------------
-//
-CMmPhoneTsy* CMmPacketServiceTsy::PhoneTsy()
-    {
-    return iMmPhone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::SetTypeOfResponse
-// Sets the type of response for a given Handle.
-// Automatic mode includes an automatic response in case of non response from
-// the DOS in a specified time.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::SetTypeOfResponse(
-    const TInt aReqHandleType ) 
-    {
-
-    TInt timeOut( 0 );
-
-    switch ( aReqHandleType )
-        {
-        case EMultimodePacketServiceAttach:
-            timeOut = KMmPacketServiceAttachTimeOut;
-            break;
-        case EMultimodePacketServiceDetach:
-            timeOut = KMmPacketServiceDetachTimeOut;
-            break;
-        case EMultimodePacketServiceGetNtwkRegStatus:
-            timeOut = KMmPacketServiceGetNtwkRegStatusTimeOut;
-            break;
-        case EMultimodePacketServiceSetPreferredBearer:
-            timeOut = KMmPacketServiceSetPreferredBearerTimeOut;
-            break;
-        case EMultimodePacketServiceRejectActivationRequest:
-            timeOut = KMmPacketServiceRejectActivationRequest;
-            break;
-        case EMultimodePacketServiceSetAttachMode:
-            timeOut = KMmPacketServiceSetAttachModeTimeOut;
-            break;
-        case EMultimodePacketServiceGetAttachMode:
-            timeOut = KMmPacketServiceGetAttachModeTimeOut;
-            break;
-        case EMultimodePacketServiceSetDefaultContextParams:
-            timeOut = KMmPacketSetDefaultContextParamsTimeOut;
-            break;
-        case EMultimodePacketServiceGetMBMSStatus:
-            timeOut = KMmPacketServiceGetMbmsNetworkServiceStatusTimeOut;
-            break;
-        case EMultimodePacketServiceUpdateMBMSMonitorServiceList:
-            timeOut = KMmPacketServiceUpdateMbmsMonitorServiceListTimeOut;
-            break;            
-        // Can't use timer:
-        //  - all notifications
-        //case EMultimodePacketServiceNotifyNtwkRegStatusChange:
-        //case EMultimodePacketServiceNotifyContextActivationRequested:
-        //case EMultimodePacketServiceNotifyContextAdded:
-        //case EMultimodePacketServiceNotifyDynamicCapsChange:
-        //case EMultimodePacketServiceNotifyMSClassChange:
-        //case EMultimodePacketServiceNotifyStatusChange:
-
-        default:
-            // Does not use timer
-            iTsyReqHandleStore->SetTsyReqHandle(
-                aReqHandleType, iTsyReqHandle );
-            break;
-        }
-
-    if ( 0 < timeOut )
-        {
-        // The timeout parameter is given in seconds.
-        iTsyReqHandleStore->SetTsyReqHandle(
-            aReqHandleType, iTsyReqHandle, timeOut );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::Complete
-// Completes the request due timer expiration
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::Complete(
-    const CTelObject* const aObject, 
-    const TInt aReqHandleType,      
-    const TInt aError )              
-    {
-
-    if ( this == aObject )
-        {
-        // Call service's Complete()
-        Complete( aReqHandleType, aError );
-        }
-    else if ( aObject == iDialUpContext && NULL != iDialUpContext )
-        {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL :Complete Dial-up Object Request." );
-
-        iDialUpContext->Complete( aReqHandleType, aError );
-        }
-    else if ( aObject == iSecondaryDialUpContext 
-              && NULL != iSecondaryDialUpContext )
-        {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL :Complete Dial-up Object Request." );
-
-        iSecondaryDialUpContext->Complete( aReqHandleType, aError );
-
-        }
-    else
-        {
-
-        CMmPacketContextTsy* context;
-
-        const TInt numberOfContexts( iPacketContextList->NumberOfContexts() );
-
-        // Check if the object is a Context object
-        for ( TInt i = 0; i < numberOfContexts; i++ )
-            {
-
-            // Get context object
-            context = iPacketContextList->PacketContextByIndex( i );
-            
-            if (context == NULL)
-            	{
-            	continue;
-            	}
-            // Check if the current context is the object that we are
-            // trying to find
-            if ( context == aObject )
-                {
-                // Call context's Complete() method
-                context->Complete( aReqHandleType, aError );
-                // Object found, break
-                return ;
-                }
-
-            else if ( context->PacketQoSTsy() == aObject )
-                {
-                // Call qos's Complete() method
-                context->PacketQoSTsy()->Complete( aReqHandleType, aError );
-
-                // Object found, break
-                return ;
-                }
-            }  
-           
-        CMmMBMSContextTsy* mbms;
-        
-        const TInt numberOfMbms( iMBMSContextList->GetNumberOfObjects() );
-        
-        for( TInt i = 0; i < numberOfMbms; i++ )
-            {
-            mbms = MBMSContextList( )->ContextByIndex( i );
-            
-            // Check if the current context is the object that we are
-            // trying to find
-            if ( mbms == aObject )
-                {
-                // Call context's Complete() method
-                mbms->Complete( aReqHandleType, aError );
-                // Object found, break
-                return ;
-                }            
-            }          
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::Complete
-// Completes the request due timer expiration.
-//----------------------------------------------------------------------------
-
-void CMmPacketServiceTsy::Complete(
-    const TInt aReqHandleType,    
-    const TInt aError )            
-    {
-    // All possible TSY req handle types are listed in the
-    // switch case below.
-    switch ( aReqHandleType )
-        {
-
-        case EMultimodePacketServiceAttach:
-            CMmPacketServiceTsy::CompleteAttach( aError );
-            break;
-        case EMultimodePacketServiceDetach:
-            TRAP_IGNORE( CMmPacketServiceTsy::CompleteDetachL( aError ));
-            break;
-        case EMultimodePacketServiceGetNtwkRegStatus:
-            CMmPacketServiceTsy::CompleteGetNtwkRegStatus( 
-                RPacketService::EUnknown, aError );
-            break;
-        case EMultimodePacketServiceSetPreferredBearer:
-            CMmPacketServiceTsy::CompleteSetPreferredBearer( aError );
-            break;
-        case EMultimodePacketServiceSetAttachMode:
-            CMmPacketServiceTsy::CompleteSetAttachMode( aError );
-            break;
-        case EMultimodePacketServiceSetDefaultContextParams:
-            CMmPacketServiceTsy::CompleteSetDefaultContextParams( aError );
-            break;
-        case EMultimodePacketServiceGetMBMSStatus:
-            CMmPacketServiceTsy::CompleteGetMbmsNetworkServiceStatus( NULL, aError );
-            break;   
-        case EMultimodePacketServiceEnumerateMbmsActiveServices:
-            CMmPacketServiceTsy::CompleteEnumerateMbmsActiveServiceList( NULL, aError );
-            break;
-        case EMultimodePacketServiceUpdateMBMSMonitorServiceList:
-           CMmPacketServiceTsy::CompleteUpdateMbmsMonitorServiceList( NULL, aError );
-           break;
-
-        // Can't use timer:
-        //  - all notifications
-        //case EMultimodePacketServiceNotifyNtwkRegStatusChange:
-        //case EMultimodePacketServiceNotifyContextActivationRequested:
-        //case EMultimodePacketServiceNotifyContextAdded:
-        //case EMultimodePacketServiceNotifyDynamicCapsChange:
-        //case EMultimodePacketServiceNotifyMSClassChange:
-        //case EMultimodePacketServiceNotifyStatusChange:
-
-        default:
-            CMmPacketServiceTsy::ReqCompleted( iTsyReqHandleStore->
-				ResetTsyReqHandle( aReqHandleType ), aError );
-            break;
-        }
-    }
-#endif // REQHANDLE_TIMER
-
-
-#ifdef TF_LOGGING_ENABLED
-
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::ReqCompleted
-// Overloads CTelObject::ReqCompleted for logging purposes.
-// Prints the aTsyReqHandle and aError variable in the log file and then
-// calls CTelObject::ReqCompleted.
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::ReqCompleted(
-    const TTsyReqHandle aTsyReqHandle,  
-    const TInt aError )                   
-    {
-TFLOGSTRING3("TSY: CMmPacketServiceTsy::Request Completed. TSY Req Handle: %d Error:%d", aTsyReqHandle, aError );
-
-    CTelObject::ReqCompleted( aTsyReqHandle, aError );
-    }
-
-#endif // TF_LOGGING_ENABLED
-
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::PrepareOpenSecondary
-// Prepares to open secondary from given primary context
-// Next Context that client wants to open is secondary context. Secondary
-// context copies configuration from context given by client
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::PrepareOpenSecondary(
-    TDes16* aPrimaryContextName )  
-    {
-
-    if ( aPrimaryContextName->Length() <= iHostCID.MaxLength() )
-        {
-        // Check if primary context exists; return KErrArgument if it doesn't
-        TInfoName primaryContextName = *aPrimaryContextName;
-        CMmPacketContextTsy* mmPacketContextTsy = iPacketContextList->PacketContextByName(&primaryContextName );
-
-        if( NULL == mmPacketContextTsy )
-            {
-            return KErrArgument;        
-            }
-
-        iHostCID = *aPrimaryContextName;
-        // Complete request with ret
-        CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-        return KErrNone;
-        }
-
-    return KErrArgument;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::EnumerateNifs
-// Method returns number of network interfaces
-// call method EnumerateNifs from CMmPacketContextList
-// complete request to client
-// return KErrNone
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::EnumerateNifs(
-    TInt* aCount )   
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::EnumerateNifs." );
-
-    iPacketContextList->EnumerateNifs( aCount );
-
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetNifInfo
-// Return information about network interface
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetNifInfo(
-    TInt* aIndex,                            
-    RPacketService::TNifInfoV2* aNifInfoV2 ) 
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::GetNifInfo." );
-
-    TInt ret = iPacketContextList->GetNifInfo( aIndex, aNifInfoV2 );
-
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::EnumerateContextsInNif
-// Returns number of contexts in Nif
-// get existingContextName from parameter aExistingContextName
-// call method EnumerateContextsInNif from CMmPacketContextList
-// complete request to client
-// return KErrNone
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::EnumerateContextsInNif(
-    TDesC* aExistingContextName,    
-    TInt* aCount )                   
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::EnumerateContextsInNif." );
-
-	TInt ret = KErrNone;
-	if (aExistingContextName->Length() > KMaxInfoName)
-		{
-		ret = KErrArgument;
-		}
-	else
-		{		
-	    TInfoName existingContextName = *aExistingContextName;
-
-	    iPacketContextList->EnumerateContextsInNif( existingContextName, aCount );
-
-	    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-		}
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetContextNameInNif
-// Returns name of context in network interface
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetContextNameInNif(
-    RPacketService::TContextNameInNif* aContextNameInNif,
-    TDes* aContextName )                
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::GetContextNameInNif." );
-
-    TInt ret = iPacketContextList->GetContextNameInNif( aContextNameInNif,
-        aContextName );
-
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::SetDefaultContextParams
-// Sets default context parameters
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::SetDefaultContextParamsL(
-    const TDataPackage& aPackage )
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::SetDefaultContextParamsL." );
-
-    TInt ret(KErrServerBusy);
-
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
-    EMultimodePacketServiceSetDefaultContextParams ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
-        {
-		ret = iMmPacketServiceGsmWcdmaExt->
-            SetDefaultContextParamsL( aPackage );
-
-        if ( KErrNone == ret )
-            {
-            // Set req handle
-            iReqHandleType = EMultimodePacketServiceSetDefaultContextParams;
-            }
-        }
-
-    return ret;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteSetDefaultContextParams
-// Completes call SetDefaultContextParameters
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteSetDefaultContextParams(
-    TInt aCause )    
-    {
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteSetDefaultContextParams. aCause: %d", aCause );
-
-    // Reset request handle. Returns the deleted request handle
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-        EMultimodePacketServiceSetDefaultContextParams ) );
-
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-        {
-        // Complete the client request
-        CMmPacketServiceTsy::ReqCompleted( reqHandle, aCause );
-        }
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GetDefaultContextParams
-// Gets default context parameters
-//----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::GetDefaultContextParams(
-    TPacketDataConfigBase* aContextConfig )      
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::GetDefaultContextParams." );
-
-    TInt ret = iMmPacketServiceGsmWcdmaExt->GetDefaultContextParams(
-        aContextConfig );
-
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
-
-    return KErrNone;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::IsActivationAllowed
-// Returns true if Packet Data is currently allowed
-//----------------------------------------------------------------------------
-//
-TBool CMmPacketServiceTsy::IsActivationAllowed()
-    {
-    TBool isAllowed = ETrue;
-
-    if ( RMobilePhone::ENetworkModeGsm == iCurrentMode &&
-        RPacketService::EMSClassDualMode != iInternalSavedData.iMsClass )
-        {
-        //Check if the object is a Call object
-        for( TInt i = 0; i < iMmPhone->CallList()->GetNumberOfObjects() ; i++ )
-            {
-            //Get call object
-            CMmCallTsy* call = iMmPhone->CallList()->GetMmCallByIndex( i );
-            //check if the current call object exist
-            if( call != NULL )
-                {
-                //call the complete method
-                RCall::TStatus status = call->Status();
-
-                if ( RCall::EStatusUnknown != status &&
-                     RCall::EStatusIdle != status )
-                    {
-    TFLOGSTRING("TSY: CMmPacketServiceTsy::IsActivationAllowed. CS call active, Context Activation not allowed" );
-                    isAllowed = EFalse;
-                    i = iMmPhone->CallList()->GetNumberOfObjects();
-                    }
-                }
-            }
-        }
-
-    return isAllowed;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::MessageManagerBase
-// returns pointer to CMmMessageManager
-//----------------------------------------------------------------------------
-//
-CMmMessageManagerBase* CMmPacketServiceTsy::MessageManager()
-	{
-	return iMessageManager;
-	}
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteNotifyEGprsInfoChange
-// Completes notification t
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteNotifyEGprsInfoChange(
-    CMmDataPackage* aDataPackage )		
-	{
-TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyEGprsInfoChange." );
-
-	//Unpack data
-	TBool lastEdgeGprsSupport;
-	aDataPackage->UnPackData( lastEdgeGprsSupport );
-
-	iMmPacketServiceGsmWcdmaExt->SetEdgeGprsSupport( lastEdgeGprsSupport );
-
-	CMmCustomTsy* customTsy = CMmPacketServiceTsy::CustomTsy();
-
-        if ( NULL != customTsy )
-            {
-            CMmPacketTsy* packetTsy = customTsy->PacketTsy();
-
-            if ( NULL != packetTsy )
-                {
-                packetTsy->
-                    CompleteNotifyEGprsInfoChange( lastEdgeGprsSupport );
-                }
-            }
-	}
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::QosTsy
-// Gets pointer to right qos by context name given as parameter.
-//----------------------------------------------------------------------------
-//
-CMmPacketQoSTsy* CMmPacketServiceTsy::QosTsy(
-    TInfoName aMmPacketContextName )
-	{
-	CMmPacketQoSTsy* packetQoSTsy = NULL;
-
-	CMmPacketContextTsy* mmPacketContextTsy = iPacketContextList->
-		PacketContextByName( &aMmPacketContextName );
-
-	if ( NULL != mmPacketContextTsy )
-		{
-		packetQoSTsy = mmPacketContextTsy->PacketQoSTsy();
-		}
-
-	if ( NULL != packetQoSTsy )
-		{
-		return packetQoSTsy;
-		}
-
-	else
-		{
-		return NULL;
-		}
-	}
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::CompleteNetworkModeChange
-// Completes Network Mode Change
-//----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteNetworkModeChange(
-    CMmDataPackage* aDataPackage )  
-    {
-    RMobilePhone::TMobilePhoneNetworkMode ntwkMode( 
-        RMobilePhone::ENetworkModeUnknown );
-    //Unpack data
-    aDataPackage->UnPackData( ntwkMode );
-
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteNetworkModeChange. ntwkMode: %d", ntwkMode );
-    iCurrentMode = ntwkMode;
-    }
-
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::Context
-// Accessory method to get right context.
-//----------------------------------------------------------------------------
-//
-CMmPacketContextTsy* CMmPacketServiceTsy::ContextTsy(
-    TInfoName& contextName )
-    {
-    CMmPacketContextTsy* mmPacketContextTsy = iPacketContextList->
-        PacketContextByName( &contextName );
-
-    if( NULL == mmPacketContextTsy )
-        {
-        mmPacketContextTsy = iMBMSContextList->ContextByName( contextName );        
-        }
-    return mmPacketContextTsy;
-    }
-    
-//----------------------------------------------------------------------------
-// CMmPacketServiceTsy::GlobalKernelObjectHandle
-// Returns unnamed mutex handle owned by TSY 
-//----------------------------------------------------------------------------
-//
-RHandleBase* CMmPacketServiceTsy::GlobalKernelObjectHandle()
-    {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::GlobalKernelObjectHandle" );
-
-    if ( KNullHandle == iMutex.Handle() )
-        {
-        TInt ret = iMutex.CreateLocal( EOwnerProcess );
-    
-        if ( KErrNone == ret )
-            {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::GlobalKernelObjectHandle - Mutex created" );
-            }
-        else
-            {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::GlobalKernelObjectHandle - Mutex creation failed" );
-            }                  
-        }
-    else
-        {
-TFLOGSTRING("TSY: CMmPacketServiceTsy::GlobalKernelObjectHandle - Mutex creation skipped" );
-        }
-         
-    return &iMutex;
-    }
-
-//-----------------------------------------------------------------------------
-// CMmPacketServiceTsy::SetAlwaysOnL
-// Requests Set Always On with mode given as parameter aMode
-//-----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::SetAlwaysOnL(	
-    TTsyReqHandle aTsyReqHandle,
-    RMmCustomAPI::TSetAlwaysOnMode aMode )
-	{
-TFLOGSTRING2("TSY: CMmPacketServiceTsy::SetAlwaysOn Mode = %d", aMode );
-TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CompleteSetAlwaysOn ReqHandle %d", aTsyReqHandle );
-	TInt ret( KErrServerBusy );
-	
-	//Check if request is allready pending
-	TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
-        EMultimodePacketSetAlwaysOn );
-	
-	if( EMultimodePacketServiceReqHandleUnknown == reqHandle )
-		{
-        //Pack 
-		CMmDataPackage data;
-		data.PackData( &aMode );
-		
-		iTsyReqHandleStore->SetTsyReqHandle( 
-            EMultimodePacketSetAlwaysOn, aTsyReqHandle );
-		
-		ret = iMessageManager->HandleRequestL( ECustomSetAlwaysOnMode, &data );
-		
-		if ( KErrNone != ret)
-			{
-			iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketSetAlwaysOn );
-			}
-		}
-	
-	return ret;
-	}
-
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::CompleteSetAlwaysOn
-// Completes Set Always On request 
-//-----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteSetAlwaysOn( 
-    TInt aError )
-	{
-TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CompleteSetAlwaysOn Error %d", aError );	
-
-    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
-            								  EMultimodePacketSetAlwaysOn ) );
-
-TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CompleteSetAlwaysOn ReqHandle %d", reqHandle );
-
-    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
-    	{
-    	CMmCustomTsy* customTsy = CMmPacketServiceTsy::CustomTsy();
-
-        if ( NULL != customTsy )
-            {
-            CMmPacketTsy* packetTsy = customTsy->PacketTsy();
-
-            if ( NULL != packetTsy )
-                {
-				packetTsy->CompleteSetAlwaysOn( reqHandle, aError );
-                }
-            }	
-    	}
-	}
-
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::CancelSetAlwaysOn
-// Cancels Set Always On request
-//-----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CancelSetAlwaysOn( 
-    TTsyReqHandle aTsyReqHandle )
-	{
-TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CancelSetAlwaysOn ReqHandle %d", aTsyReqHandle );
-	
-	if ( aTsyReqHandle != EMultimodePacketServiceReqHandleUnknown )
-        {
-        // Reset tsy request handle
-        iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketSetAlwaysOn );
-
-        // Complete request to client with KErrCancel
-        ReqCompleted( aTsyReqHandle, KErrCancel );
-        }
-	}
-
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::EnumerateActiveServiceList
-// Enumerates all active services
-//-----------------------------------------------------------------------------
-//
-TInt CMmPacketServiceTsy::EnumerateMbmsActiveServiceList( TInt &aCount, TInt &aMaxAllowed )
-    {   
-TFLOGSTRING2( "TSY: CMmPacketServiceTsy::EnumerateMbmsActiveServiceList. max: %d", aMaxAllowed );     
-     
-    aCount = EnumerateMbmsActiveServices();
-    aMaxAllowed = iMaxActiveServices;
-    
-TFLOGSTRING3( "TSY: CMmPacketServiceTsy::EnumerateActiveServiceList Count: %d, Max allowed %d", aCount, aMaxAllowed );     
-    // Complete the request with KErrNone
-    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
-    return KErrNone;    
-    }
-    
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::EnumerateMbmsActiveServices
-// Enumerates all active services
-//-----------------------------------------------------------------------------
-//   
-TInt CMmPacketServiceTsy::EnumerateMbmsActiveServices()
-    {
-TFLOGSTRING2( "TSY: CMmPacketServiceTsy::EnumerateMbmsActiveService. max: %d", iMaxActiveServices );     
-    TInt ret( 0 );    
-    
-    for( TInt i = 0; i< iMBMSContextList->NumberOfContexts(); i++ )
-        {
-        CMmMBMSContextTsy* context = iMBMSContextList->ContextByIndex( i );
-        
-        if( RPacketContext::EStatusActive == context->ContextStatus() ||
-            RPacketContext::EStatusReceiving == context->ContextStatus() ||
-            RPacketContext::EStatusSuspended == context->ContextStatus() ||
-            RPacketContext::EStatusDeactivating == context->ContextStatus() )
-            {
-            TInt count = context->SessionCount();
-            if(  0 == count)
-	            {
-	            ret +=1;	
-	            }
-	        else
-		        {
-	            ret += count;	        	
-		        }
-
-            }        
-        }    
-        
-    return ret;
-    }
-    
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::CompleteEnumerateMbmsActiveServiceList
-// Saves the maximum value for active services
-//-----------------------------------------------------------------------------
-//
-void CMmPacketServiceTsy::CompleteEnumerateMbmsActiveServiceList(        
-    CMmDataPackage* aDataPackage,
-    const TInt aResult)
-    {
-TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CompleteEnumerateMbmsActiveServiceList. Error: %d", aResult ); 
-           
-    if( KErrNone == aResult && NULL != aDataPackage )
-        {
-        aDataPackage->UnPackData( iMaxActiveServices );
-        }       
-    }
-    
-//-----------------------------------------------------------------------------
-// TInt CMmPacketServiceTsy::MaximumActiveServices
-// Maximum number of active services
-//-----------------------------------------------------------------------------
-//    
-TInt CMmPacketServiceTsy::MaximumActiveServices()
-    {
-    return iMaxActiveServices;
-    }
-
-//  End of File
-
+// Copyright (c) 2006-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 FILES
+#include "Cmmpacketservicetsy.h"
+#include <ctsy/tflogger.h>
+#include <ctsy/serviceapi/mmtsy_defaults.h>
+#include "MmTsy_timeoutdefs.h"
+#include "MmTsy_numberOfSlots.h"
+#include "CMmCommonStaticUtility.h"
+#include "Cmmpacketcontextlist.h"
+#include "cmmpacketservicegsmwcdmaext.h"
+#include "cmmcalllist.h"
+#include "cmmcalltsy.h"
+#include "CMmCustomTsy.h"
+#include "CMmPacketTsy.h"
+#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
+#include <ctsy/pluginapi/cmmdatapackage.h>
+
+#include "cmmmbmscontextlist.h"
+#include "cmmmbmsmonitoredlist.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmPacketServiceTsy::CMmPacketServiceTsy():
+    iReqHandleType(EMultimodePacketServiceReqHandleUnknown)
+    {
+    }
+
+CMmPacketServiceTsy* CMmPacketServiceTsy::NewL(
+        CMmPhoneTsy* const aMmPhone,           
+        CMmMessageManagerBase* const aMessageManager,
+        MLtsyFactoryBase* aFactory  ) 
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NewL" );
+    CMmPacketServiceTsy* const packetService =
+        new ( ELeave ) CMmPacketServiceTsy();
+
+    CleanupClosePushL( *packetService );
+    packetService->iMmPhone = aMmPhone;
+	packetService->iMessageManager = aMessageManager;
+    packetService->ConstructL( aFactory );
+    CleanupStack::Pop();
+
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NewL." );
+    return packetService;
+
+    }
+
+void CMmPacketServiceTsy::ConstructL( MLtsyFactoryBase* aFactory )
+    {
+
+    InitModulesL( aFactory );
+
+    InitStoresAndListsL();
+
+	iMessageManager->RegisterTsyObject( CMmMessageManagerBase::EPacketDataTsy,
+        this  );
+
+    // Current Network Mode is initialized to be EMSClassUnknown
+    iCurrentMode = RMobilePhone::ENetworkModeGsm;
+
+    }
+
+CMmPacketServiceTsy::~CMmPacketServiceTsy()
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::~CMmPacketServiceTsy" );
+
+    if ( iMmPhone )
+        {
+        // deregister tsy object from message manager
+        iMmPhone->MessageManager()->DeregisterTsyObject(this);
+        
+        // Reset packet data session pointer in phone
+        iMmPhone->ResetPacketDataSession();
+        }
+
+    // Delete CMmTsyReqHandleStore object
+    delete iTsyReqHandleStore;
+    // Delete CMmPacketContextList object
+    delete iPacketContextList;
+    // Delete CMmPacketServiceGsmWcdmaExt object
+    delete iMmPacketServiceGsmWcdmaExt;
+    if(iMBMSContextList != NULL)
+    	{
+    	// Delete CMmMBMSContextList object
+    	delete iMBMSContextList;
+    	}
+    if(iGetMbmsMonitoredServiceLists != NULL)
+    	{
+    	// Delete CArrayPtrFlat object
+    	delete iGetMbmsMonitoredServiceLists;
+    	}    
+
+    if ( NULL != iDialUpContext )
+        {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::~CMmPacketServiceTsy: Close Dial-up Object." );
+
+        iDialUpContext->Close();
+        }
+
+    if ( NULL != iSecondaryDialUpContext )
+        {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::~CMmPacketServiceTsy: Close Secondary Dial-up Object." );
+
+        iSecondaryDialUpContext->Close();
+        }
+        
+TFLOGSTRING("TSY: CMmPacketServiceTsy::~CMmPacketServiceTsy: Closing iMutex Object." );
+    iMutex.Close();
+
+#ifdef USING_CTSY_DISPATCHER
+    //CTSY defect (memory leak) this maybe allocated, but it is never deleted.
+    //no need for NULL check as C++ guarantees that operator delete checks its argument for null-ness.
+    delete iMBMSMonitoredList;
+    iMBMSMonitoredList = NULL;
+#endif //USING_CTSY_DISPATCHER    
+    }
+    
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::InitModulesL
+// Initialises extension modules for CMmPacketServiceTsy.
+// if GSM flag is defined
+// allocate memory for CMmPacketServiceGsmWcdmaExt object
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::InitModulesL( MLtsyFactoryBase* aFactory )
+    {
+    // Create Packet Service Gsm extension
+    iMmPacketServiceGsmWcdmaExt =
+        CMmPacketServiceGsmWcdmaExt::NewL( this, aFactory );
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::InitStoresAndListsL
+// Initialises needed stores and lists.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::InitStoresAndListsL()
+    {
+
+#ifdef REQHANDLE_TIMER
+    // Create req handle store
+    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone,
+        ENumOfMultimodePacketServiceRequests, iPacketServiceReqHandles );
+#else
+    // Create req handle store
+    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
+        ENumOfMultimodePacketServiceRequests, iPacketServiceReqHandles );
+
+#endif // REQHANDLE_TIMER
+
+    // Create Packet Context List
+    iPacketContextList = CMmPacketContextList::NewL( this );
+
+    // create mbms context list 
+    iMBMSContextList = CMmMBMSContextList::NewL();
+    
+    // create MBMS monitored service list
+    iGetMbmsMonitoredServiceLists = new CArrayPtrFlat<CListReadAllAttempt>(1);
+    
+            
+    // Set pointer to externally created dial-up context to be NULL
+    iDialUpContext = NULL;
+    
+    // Set pointer to externally created dial-up context to be NULL
+    iSecondaryDialUpContext = NULL;
+
+    // Set phone not attached to the network
+    iInternalSavedData.iServiceStatus = RPacketService::EStatusUnattached;
+
+    // Current Mobile Station Class is initialized to be EMSClassUnknown
+    iInternalSavedData.iMsClass = RPacketService::EMSClassUnknown;
+
+    // If Gpds is suspended this flag is ETrue, otherwise EFalse
+    iSuspended = EFalse;
+
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::Init
+// Initialisation method that is called from ETel Server.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::Init()
+    {
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CustomTsy
+// Returns a pointer to Custom TSY object.
+// return custom tsy owned by phone tsy
+//----------------------------------------------------------------------------
+//
+CMmCustomTsy* CMmPacketServiceTsy::CustomTsy() const
+    {
+    // Return custom tsy
+    return iMmPhone->GetCustomTsy();
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::ActivePacketServiceExtension
+// Returns a pointer to the active packet service extension.
+// The packet data extension implements functionality that is specific for
+// selected mode. There should always be some extension active.
+//----------------------------------------------------------------------------
+//
+CMmPacketServiceGsmWcdmaExt* CMmPacketServiceTsy::ActivePacketServiceExtension()
+    {
+    // Return active packet service extension
+    return iMmPacketServiceGsmWcdmaExt;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::TsyReqHandleStore
+// Returns a pointer to the tsy request handle store.
+// return tsy request handle store
+//----------------------------------------------------------------------------
+//
+CMmTsyReqHandleStore* CMmPacketServiceTsy::TsyReqHandleStore()
+    {
+    // Return tsy request handle store
+    return iTsyReqHandleStore;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::IsContextStatusActive
+// Checks if context status is active from service point of view
+//----------------------------------------------------------------------------
+//
+TBool CMmPacketServiceTsy::IsContextStatusActive(
+    const RPacketContext::TContextStatus aContextStatus  ) const
+    {
+
+    if ( ( RPacketContext::EStatusActive == aContextStatus ) ||
+         ( RPacketContext::EStatusDeactivating == aContextStatus ) )
+        {
+        // Context is active from the service point of view
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::UpdateAttachedPacketStatus
+// Sets service status to active or attached and completes status changed
+// notification to the client if needed.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::UpdateAttachedPacketStatus(
+    const TBool aIsActiveContext ) //is context active
+    {
+    TBool isActive( aIsActiveContext );
+    
+    // If external context exist and there are no active internal context
+    if ( iDialUpContext != NULL && isActive == EFalse )
+        {
+        // If external context is active then active context found
+        isActive = IsContextStatusActive( iDialUpContext->ContextStatus() );
+        } 
+
+    // If external context exist and there are no active internal context
+    if ( iSecondaryDialUpContext != NULL && isActive == EFalse )
+        {
+        // If external context is active then active context found
+        isActive = IsContextStatusActive( 
+            iSecondaryDialUpContext->ContextStatus() );
+        }
+
+    if ( isActive && ( RPacketService::EStatusActive !=
+         iInternalSavedData.iServiceStatus ) )
+        {
+        // Complete status change notification to the client and
+        // set service status EStatusActive
+        CMmPacketServiceTsy::CompleteNotifyStatusChange(
+		    RPacketService::EStatusActive, KErrNone );
+
+        }
+    else if ( !isActive && ( RPacketService::EStatusAttached !=
+              iInternalSavedData.iServiceStatus ) )
+        {
+
+        // Complete status change notification to the client and
+        // set service status EStatusAttached
+		CMmPacketServiceTsy::CompleteNotifyStatusChange(
+		    RPacketService::EStatusAttached, KErrNone );
+
+        }
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::UpdateAttachedPacketStatus. Service Status: %d", iInternalSavedData.iServiceStatus );
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompletePacketStatusChanged
+// Called from active extension to notify service that transfer status
+// is changed.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompletePacketStatusChanged(
+    CMmDataPackage* aDataPackage,
+    TInt aErrorCode )
+    {
+	RPacketService::TStatus packetStatus;
+	TBool isresumed;
+	TBool isActiveContext( EFalse );
+
+	//Pack data
+	aDataPackage->UnPackData( packetStatus, isresumed  );
+
+    // Get number of created contexts
+    const TInt numberOfContext( iPacketContextList->NumberOfContexts() );
+
+    if ( isresumed )
+        {
+        // If current status is suspended
+        if ( iSuspended )
+            {
+
+            CMmPacketContextTsy* packetContext;
+            CMmMBMSContextTsy* mbmsContext;
+
+            // check pdp context's
+            for ( TInt i = 0; i < numberOfContext; i++ )
+                {
+                // Get context by index from context list
+                packetContext = iPacketContextList->PacketContextByIndex( i );
+
+                if ( NULL != packetContext )
+                    {
+                    // Inform context that service resumed from suspend
+                    packetContext->ContextResumed();
+                    }
+                }
+                
+            // check mbms context's
+            for ( TInt i = 0; i < iMBMSContextList->NumberOfContexts(); i++ )
+                {
+                // Get context by index from context list
+                mbmsContext = iMBMSContextList->ContextByIndex( i );
+
+                if ( NULL != mbmsContext )
+                    {
+                    // Inform context that service resumed from suspend
+                    mbmsContext->ContextResumed();
+                    }
+                }                
+
+            if ( iDialUpContext != NULL )
+                {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged.  DialUp Context Resumed" );
+
+                iDialUpContext->ContextResumed();
+                }
+
+            if ( iSecondaryDialUpContext != NULL )
+                {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged. Secondary DialUp Context Resumed" );
+
+                iSecondaryDialUpContext->ContextResumed();
+                }
+
+            // Get service status before suspend
+            packetStatus = iInternalSavedData.iServiceStatusBeforeSuspend;
+            // Current status is not suspended
+            iSuspended = EFalse;
+
+            }
+        else
+            {
+            // Resumed without suspend, continue with current status
+            packetStatus = iInternalSavedData.iServiceStatus;
+            }
+        }
+
+    // If current status is not suspended or
+    // current status is suspended and new status is unattached
+    if ( !iSuspended || ( RPacketService::EStatusUnattached == packetStatus ) )
+        {
+        switch ( packetStatus )
+            {
+            case RPacketService::EStatusUnattached:
+                if ( iSuspended )
+                    {
+                    // If previous status was suspended it is not valid 
+                    // anymore
+                    iSuspended = EFalse;
+                    }
+
+                // Complete status change notification with EStatusUnattached
+                CMmPacketServiceTsy::CompleteNotifyStatusChange(
+				    RPacketService::EStatusUnattached, aErrorCode );
+
+                break;
+            case RPacketService::EStatusAttached:
+            case RPacketService::EStatusActive:
+                CMmPacketContextTsy* packetContext;
+
+                for ( TInt i = 0; i < numberOfContext; i++ )
+                    {
+                    packetContext =
+                        iPacketContextList->PacketContextByIndex( i );
+
+                    // If no active context found yet
+                    if ( NULL != packetContext )
+                        {
+                        // Get context status
+                        RPacketContext::TContextStatus contextStatus =
+                            packetContext->ContextStatus();
+
+                        // Check if context is active ( from service point 
+                        // of view )
+                        isActiveContext =
+                            IsContextStatusActive( contextStatus );
+                        }
+                    if ( isActiveContext )
+                        {
+                        // Active context found, break
+                        i = numberOfContext;
+                        }
+                    }
+                    
+                // no active pdp context's, check if any mbms context is active
+                if( !isActiveContext )
+                    {
+                    CMmMBMSContextTsy* mbmsContext;
+                    
+                    // check mbms context's
+                    for ( TInt i = 0; i < iMBMSContextList->NumberOfContexts(); i++ )
+                        {
+                        // Get context by index from context list
+                        mbmsContext = iMBMSContextList->ContextByIndex( i );
+
+                        if ( NULL != mbmsContext )
+                            {
+                            // Get context status
+                            RPacketContext::TContextStatus contextStatus =
+                                mbmsContext->ContextStatus();
+
+                            // Check if context is active ( from service point 
+                            // of view )
+                            isActiveContext =
+                                IsContextStatusActive( contextStatus );
+                            }
+                        if ( isActiveContext )
+                            {
+                            // Active context found, break
+                            i = iMBMSContextList->NumberOfContexts();                                                   
+                            }  
+                        }
+                    }
+
+                // Update service status
+                UpdateAttachedPacketStatus( isActiveContext );
+
+                break;
+            case RPacketService::EStatusSuspended:
+                if ( !iSuspended && ( RPacketService::EStatusUnattached !=
+                     iInternalSavedData.iServiceStatus ) )
+                    {
+                    // Save status before suspend internally
+                    iInternalSavedData.iServiceStatusBeforeSuspend =
+                        iInternalSavedData.iServiceStatus;
+
+                    // Set iSuspended to be ETrue
+                    iSuspended = ETrue;
+
+                    CMmPacketContextTsy* packetContext;
+
+                    for ( TInt i = 0; i < numberOfContext; i++ )
+                        {
+                        // Get next context
+                        packetContext =
+                            iPacketContextList->PacketContextByIndex( i );
+
+                        if ( NULL != packetContext )
+                            {
+                            // Inform context that service is suspend
+                            packetContext->ContextSuspended();
+                            }
+                        }
+                    CMmMBMSContextTsy* mbmsContext;
+                    
+                    // check mbms context's
+                    for ( TInt i = 0; i < iMBMSContextList->NumberOfContexts(); i++ )
+                        {
+                        // Get context by index from context list
+                        mbmsContext = iMBMSContextList->ContextByIndex( i );
+
+                        if ( NULL != mbmsContext )
+                            {
+                            // Inform context that service is suspend
+                            mbmsContext->ContextSuspended();
+                            }
+                        }                       
+
+                    if ( iDialUpContext != NULL )
+                        {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged.  DialUp Context Suspended" );
+                        iDialUpContext->ContextSuspended();
+                        }
+
+                    if ( iSecondaryDialUpContext != NULL )
+                        {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged.  DialUp Context Suspended" );
+                        iSecondaryDialUpContext->ContextSuspended();
+                        }
+
+                    // Complete status change notification with
+                    // EStatusSuspended
+                    CMmPacketServiceTsy::CompleteNotifyStatusChange(
+                        RPacketService::EStatusSuspended, aErrorCode );
+
+                    }
+
+                break;
+            default:
+                break;
+            }
+        }
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompletePacketStatusChanged. Service Status: %d", iInternalSavedData.iServiceStatus );
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::ContextStatusChanged
+// Context status is changed from the Service point of view.
+// Called from CMmPacketContextTsy to notify service that context status is
+// changed to inactive, activate or deleted state. These states indicate that
+// context is changed to inactive or active state from the Packet Service
+// point of view.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::ContextStatusChanged(
+    const RPacketContext::TContextStatus aContextStatus )
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::ContextStatusChanged. Context Status: %d", aContextStatus );
+
+    if ( !iSuspended && ( RPacketService::EStatusUnattached !=
+         iInternalSavedData.iServiceStatus ) )
+        {
+
+        TBool isActiveContext( EFalse );
+
+        if ( ( RPacketContext::EStatusInactive == aContextStatus ) ||
+             ( RPacketContext::EStatusDeleted == aContextStatus ) )
+            {
+            const TInt numberOfContext(
+                iPacketContextList->NumberOfContexts() );
+
+            RPacketContext::TContextStatus contextStatus;
+
+            for ( TInt i = 0; i < numberOfContext; i++ )
+                {
+                TInt ret( iPacketContextList->GetContextStatusByIndex(
+                    i, contextStatus ) );
+
+                if ( KErrNone == ret )
+                    {
+                    isActiveContext = IsContextStatusActive( contextStatus );
+
+                    if ( isActiveContext )
+                        {
+                        // Active context found, break
+                        i = numberOfContext;
+                        }
+                    }
+                }
+            }
+
+        else if ( RPacketContext::EStatusActive == aContextStatus )
+            {
+
+            isActiveContext = ETrue;
+
+            }
+
+        UpdateAttachedPacketStatus( isActiveContext );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::PreferredBearerChanged
+// Preferred bearer has been changed save new
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::PreferredBearerChanged(
+    CMmDataPackage* aPackage )      
+    {
+	RPacketService::TPreferredBearer preferredBearer;
+
+	aPackage->UnPackData( preferredBearer );
+
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::PreferredBearerChanged. PreferredBearer: %d", preferredBearer );
+
+    iInternalSavedData.iPreferredBearer = preferredBearer;
+
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::Attach
+// Starts asynchronous attach request to the network.
+// This function will cause the phone to attempt an attach to the packet
+// network, if it is not already attached.  If it is, the error
+// KErrAlreadyExists should be returned.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::AttachL()
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::AttachL." );
+
+    TInt ret( KErrAlreadyExists );
+
+    if ( RPacketService::EStatusUnattached ==
+         iInternalSavedData.iServiceStatus )
+        {
+
+        const TTsyReqHandle attachHandle( iTsyReqHandleStore->GetTsyReqHandle(
+            EMultimodePacketServiceAttach ) );
+
+        if ( EMultimodePacketServiceReqHandleUnknown != attachHandle )
+            {
+            ret = KErrServerBusy;
+            }
+        else
+            {
+            // Attach
+            ret = iMmPacketServiceGsmWcdmaExt->AttachL();
+
+            if ( KErrNone == ret )
+                {
+                // Set request handle
+                iReqHandleType = EMultimodePacketServiceAttach;
+                }
+            else
+                {
+                // Sending to the phonet failed for some reason
+                ret = CMmCommonStaticUtility::EpocErrorCode(
+                    KErrGeneral, KErrGsmMMNetworkFailure );
+                }
+            }
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteAttach
+// Completes asynchronous attach request.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteAttach(
+    const TInt aError )  //error value
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteAttach. Error Value: %d", aError );
+
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceAttach ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+        // Complete the client request
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::Detach
+// Starts asynchronous detach request to the network.
+// This function will cause the phone to attempt to detach from the packet
+// network, if it is not already detached. If it is, the error
+// KErrAlreadyExists should be returned. If at least one context is active the
+// error KErrInUse should be returned.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::DetachL()
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::DetachL." );
+
+    TInt ret( KErrAlreadyExists );
+
+    if ( RPacketService::EStatusUnattached !=
+        iInternalSavedData.iServiceStatus )
+        {
+
+        // Get number of created contexts
+        const TInt numberOfContext( iPacketContextList->NumberOfContexts() );
+        RPacketContext::TContextStatus contextStatus;
+
+        for ( TInt i = 0; i < numberOfContext; i++ )
+            {
+            ret = iPacketContextList->GetContextStatusByIndex(
+                i, contextStatus );
+
+            if ( KErrNone == ret )
+                {
+                if ( IsContextStatusActive( contextStatus ) )
+                    {
+                    // Atleast one of the contexts is active.
+                    ret = KErrInUse;
+                    i= numberOfContext;
+                    }
+                }
+            }
+
+        // If not KErrInUse, no active contexts found and detach can be done
+        if ( KErrInUse != ret )
+            {
+
+            const TTsyReqHandle reqHandle( iTsyReqHandleStore->
+                GetTsyReqHandle( EMultimodePacketServiceDetach ) );
+
+            if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
+                {
+                // Detach
+                ret = iMmPacketServiceGsmWcdmaExt->DetachL();
+
+                if ( KErrNone == ret )
+                    {
+                    // Set request handle
+                    iReqHandleType = EMultimodePacketServiceDetach;
+                    }
+                else
+                    {
+                    // Sending to the phonet failed for some reason
+                    ret = CMmCommonStaticUtility::EpocErrorCode(
+                        KErrGeneral, KErrGsmMMNetworkFailure );
+                    }
+                }
+            else
+                {
+                // The request is already in processing because of previous
+                // request. Complete request with KErrServerBusy informing the
+                // client about the situation.
+                ret = KErrServerBusy;
+                }
+            }
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteDetachL
+// Completes asynchronous detach request.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteDetachL(
+    const TInt aError ) 
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteDetachL. Error Value: %d", aError );
+
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceDetach ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+        // Complete the client request
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
+        }
+    if ( RPacketService::EAttachWhenPossible == iAttachMode )
+        {
+        SetAttachModeL( &iAttachMode );
+        iReqHandleType = EMultimodePacketServiceReqHandleUnknown;
+        }
+    }
+    
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::EnumerateContexts
+// Enumerates contexts.
+// This function will retrieve both the number of opened contexts in the TSY,
+// the aCount parameter containing this value on completion of the function,
+// and the maximum possible number of contexts, passed back in the aMaxAllowed
+// parameter. Note that this is not the maximum number of simultaneously
+// active contexts, but the total number allowed.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::EnumerateContexts(
+    TInt* const aCount,    
+    TInt* const aMaxAllowed ) 
+    {
+    *aCount = iPacketContextList->NumberOfContexts();
+    *aMaxAllowed = KMmMaxNumberOfContexts;
+
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::EnumerateContexts. Count: %d Max Allowed: %d", *aCount, *aMaxAllowed );
+    // Complete the request with KErrNone
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetAttachMode
+// Retrieves the current mode of GPRS Attach operation.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetAttachModeL(
+    RPacketService::TAttachMode* const aMode ) 
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetAttachModeL. Mode:%d", *aMode );
+
+    TInt ret( KErrServerBusy );
+
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
+        EMultimodePacketServiceGetAttachMode ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
+        {
+        // Get attach mode
+        ret = iMmPacketServiceGsmWcdmaExt->GetAttachModeL();
+
+        if ( KErrNone == ret )
+            {
+            // Save pointer to aMode internally
+            iTemporarySavedData.iGetAttachMode = aMode;
+            // Set req handle
+            iReqHandleType = EMultimodePacketServiceGetAttachMode;
+            }
+        }
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteGetAttachMode
+// Completes asynchronous attach request.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteGetAttachMode(
+    const RPacketService::TAttachMode aAttachMode, TInt aResult ) 
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteGetAttachMode. Attach Mode: %d", aAttachMode );
+
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceGetAttachMode ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+        *iTemporarySavedData.iGetAttachMode = aAttachMode;
+        iTemporarySavedData.iGetAttachMode = NULL;
+
+        // Complete the client request
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetContextInfo
+// Gets Context info of the context defined by aIndex.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetContextInfo(
+    const TInt* const aIndex,                 
+    RPacketService::TContextInfo* const aInfo ) 
+    {
+    TInt ret( KErrNone );
+
+    // Call ContextStatusByIndex() to set context status to aInfo->iStatus
+    ret = iPacketContextList->GetContextStatusByIndex(
+        *aIndex, aInfo->iStatus );
+
+    if ( KErrNone == ret )
+        {
+        // Call GetContextNameByIndex() to set context name to aInfo->iName
+        ret = iPacketContextList->GetContextNameByIndex(
+            *aIndex, aInfo->iName );
+
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::GetContextInfo. Context Status: %d Context Name: %S", aInfo->iStatus, &aInfo->iName );
+        }
+
+    // Complete request with ret
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
+    
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetDynamicCaps
+// Returns the dynamic capabilities of the phone.
+// call active extension to get dynamic capabilities to aCaps
+// complete request with KErrNone
+// return KErrNone
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetDynamicCaps(
+    RPacketService::TDynamicCapsFlags* const aCaps ) 
+    {
+    // Call DynamicCaps() from extension
+    iMmPacketServiceGsmWcdmaExt->GetDynamicCaps( aCaps );
+TFLOGSTRING("TSY: CMmPacketServiceTsy::GetDynamicCaps." );
+
+    // Complete the request with KErrNone
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+    
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetMSClass
+// Gets current and maximum value of the Mobile Station Class.
+// This function will retrieve both the current class and the highest class of
+// the mobile station. The parameters aCurrentClass and aMaxClass may take one
+// of the following values which are ordered in terms of class from highest to
+// lowest:
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetMSClass(
+    RPacketService::TMSClass* const aCurrentClass, 
+    RPacketService::TMSClass* const aMaxClass )    
+    {
+    *aCurrentClass = iInternalSavedData.iMsClass;
+    *aMaxClass = KMaxMsClass;
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::GetMSClass. Current Class: %d Max Class: %d", *aCurrentClass, *aMaxClass );
+
+    // Complete the request with KErrNone
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetNtwkRegStatus
+// Gets network registration status.
+// This function allows the client to retrieve the current registration status
+// of the phone on the packet network as defined by the enum
+// TRegistrationStatus.
+//------------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetNtwkRegStatusL(
+    RPacketService::TRegistrationStatus* const aRegistrationStatus ) 
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetNtwkRegStatusL. Tsy Req Handle: %d", iTsyReqHandle );
+
+    const TTsyReqHandle regHandle( iTsyReqHandleStore->GetTsyReqHandle(
+        EMultimodePacketServiceGetNtwkRegStatus ) );
+
+    TInt ret( KErrServerBusy );
+
+    if ( EMultimodePacketServiceReqHandleUnknown == regHandle )
+        {
+
+        // Get network registration status
+        ret = iMmPacketServiceGsmWcdmaExt->GetNtwkRegStatusL();
+
+        if ( KErrNone == ret )
+            {
+            iRegistrationStatus = aRegistrationStatus;
+            // Set request handle type
+            iReqHandleType = EMultimodePacketServiceGetNtwkRegStatus;
+            }
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteGetNtwkRegStatus
+// Completes get network registration status request.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteGetNtwkRegStatus(
+    const RPacketService::TRegistrationStatus aRegistrationStatus,
+    const TInt aError )                             
+    {
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceGetNtwkRegStatus ) );
+
+    // If request handle ok
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+
+        if ( KErrNone == aError )
+            {
+            *iRegistrationStatus = aRegistrationStatus;
+            iRegistrationStatus = NULL;
+            }
+        // Complete the client request
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
+
+        }
+    else
+        {
+        // Request was sent during initialisation from active extension
+        CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus(
+												aRegistrationStatus );
+        }
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::CompleteGetNtwkRegStatus. TSY Req Handle: %d Registration Status: %d", reqHandle, aRegistrationStatus );
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetPreferredBearer
+// Returns preferred bearer.
+// This function will retrieve the currently selected preferred bearer to
+// attach to when in Class C operation. The TSY should cache this value, so
+// the function should return quickly meaning there is no need for an
+// asynchronous version.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetPreferredBearer(
+    RPacketService::TPreferredBearer* const aBearer )   
+    {
+    *aBearer = iInternalSavedData.iPreferredBearer;
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetPreferredBearer. Preferred Bearer: %d", *aBearer );
+
+    // Complete the request with KErrNone
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+    
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetStaticCaps
+// Retrieves those capabilities of the TSY that are constant.
+// call active extension to set static capabilities to aCaps
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetStaticCaps(
+    TUint* const aCaps,                       
+    const RPacketContext::TProtocolType* const aPdpType) 
+    {
+    TInt ret = KErrNone;
+    
+    switch (*aPdpType)
+        {
+        case RPacketContext::EPdpTypeIPv4:
+        case RPacketContext::EPdpTypeIPv6:
+        case RPacketContext::EPdpTypeX25:
+        case RPacketContext::EPdpTypePPP:
+        case RPacketContext::EPdpTypeCDPD:
+            iMmPacketServiceGsmWcdmaExt->GetStaticCaps( aCaps );
+            TFLOGSTRING("TSY: CMmPacketServiceTsy::GetStaticCaps." );
+            
+            // Complete the request with KErrNone
+            CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
+            break;
+        default:
+            ret = KErrArgument;
+            break;
+        }
+    
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetStatus
+// Returns current status of the packet service.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetStatus(
+    RPacketService::TStatus* const aPacketStatus )   
+    {
+    *aPacketStatus = iInternalSavedData.iServiceStatus;
+
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetStatus. Service Status: %d", *aPacketStatus );
+
+    // Complete the request with KErrNone
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+    
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::NotifyChangeOfNtwkRegStatus
+// Requests notification of network registration status change.
+// Allows a client to be notified whenever a change in the status of the
+// packet network registration is detected.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::NotifyChangeOfNtwkRegStatus(
+    RPacketService::TRegistrationStatus* const aRegistrationStatus )
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyChangeOfNtwkRegStatus." );
+
+    // Set request handle and save pointer to aRegistrationStatus
+    iNotifyDataPointers.iChangeOfNtwkRegStatus = aRegistrationStatus;
+    iReqHandleType =  EMultimodePacketServiceNotifyNtwkRegStatusChange;
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus
+// Completes notify change of ntwk registration status to client.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus(
+    const RPacketService::TRegistrationStatus aRegistrationStatus )
+    {
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus. Current reg Status: %d New reg Status: %d", iInternalSavedData.iRegistrationStatus, aRegistrationStatus );
+
+    // If registration status changed
+    if ( aRegistrationStatus != iInternalSavedData.iRegistrationStatus )
+        {
+        // Save new status internally
+        iInternalSavedData.iRegistrationStatus = aRegistrationStatus;
+
+        // Reset request handle. Returns the deleted request handle
+        const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+            EMultimodePacketServiceNotifyNtwkRegStatusChange ) );
+
+        // If notification is requested by client
+        if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+            {
+            // Set aRegistrationStatus to the etel side memory
+            *iNotifyDataPointers.iChangeOfNtwkRegStatus = aRegistrationStatus;
+            iNotifyDataPointers.iChangeOfNtwkRegStatus = NULL;
+
+            // Complete request with KErrNone
+            CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
+            }
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus
+// Completes notify change of ntwk registration status to client.
+// Handles request coming from MessHandler
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus(
+    CMmDataPackage* aDataPackage, TInt aResult )		
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyChangeOfNtwkRegStatus.");
+
+	//Unpack necessary data from datapackage
+	RPacketService::TRegistrationStatus registrationStatus;
+	aDataPackage->UnPackData( registrationStatus );
+
+    // If registration status changed
+    if ( registrationStatus != iInternalSavedData.iRegistrationStatus )
+        {
+
+        // Save new status internally
+        iInternalSavedData.iRegistrationStatus = registrationStatus;
+
+        // Reset request handle. Returns the deleted request handle
+        const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+            EMultimodePacketServiceNotifyNtwkRegStatusChange ) );
+
+        // If notification is requested by client
+        if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+            {
+
+            // Set registrationStatus to the etel side memory
+            *iNotifyDataPointers.iChangeOfNtwkRegStatus = registrationStatus;
+            iNotifyDataPointers.iChangeOfNtwkRegStatus = NULL;
+
+            // Complete the client request
+            CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );
+
+            }
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::NotifyContextActivationRequested
+// Requests notification of network requests context activation.
+// This function will complete when the phone receives a request from the
+// packet network to activate a PDP context. Depending on the type of
+// network, this request may contain the PDP type requested, the PDP address
+// for this context, and possibly the Access Point Name (APN) of the gateway
+// to connect to.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::NotifyContextActivationRequested(
+    TPacketDataConfigBase* const aContextParameters ) 
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyContextActivationRequested." );
+
+    TInt ret = KErrNone;
+
+    // If class of aContextParameters is TContextConfigGPRS
+    if ( TPacketDataConfigBase::KConfigGPRS ==
+         aContextParameters->ExtensionId() )
+        {
+        // Cast aContextParameters from TPacketDataConfigBase to
+        // TContextConfigGPRS and save internally
+        iNotifyDataPointers.iContextActivationRequested =
+            ( RPacketContext::TContextConfigGPRS* ) aContextParameters;
+
+        // Set request handle
+        iReqHandleType =
+            EMultimodePacketServiceNotifyContextActivationRequested;
+        }
+    // Else if class of aContextParameters is TContextConfigR99_R4
+    else if ( TPacketDataConfigBase::KConfigRel99Rel4 ==
+         aContextParameters->ExtensionId() )
+        {
+        // Cast aContextParameters from TPacketDataConfigBase to
+        // TContextConfigR99_R4 and save internally
+        iNotifyDataPointers.iContextActivationRequested99 =
+            ( RPacketContext::TContextConfigR99_R4* ) aContextParameters;
+
+        // Set request handle
+        iReqHandleType =
+            EMultimodePacketServiceNotifyContextActivationRequested99;
+        }
+    // Else if class of aContextParameters is TContextConfigR5
+    else if ( TPacketDataConfigBase::KConfigRel5 ==
+         aContextParameters->ExtensionId() )
+        {
+        // Cast aContextParameters from TPacketDataConfigBase to
+        // TContextConfig_R5 and save internally
+        iNotifyDataPointers.iContextActivationRequested5 =
+            ( RPacketContext::TContextConfig_R5* ) aContextParameters;
+
+        // Set request handle
+        iReqHandleType =
+            EMultimodePacketServiceNotifyContextActivationRequested5;           
+        }                
+    // Else class of aContextParameters is not supported
+    else
+        {
+        ret = KErrNotSupported;
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteNotifyContextActivationRequested
+// Completes context activation requested notification to client.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteNotifyContextActivationRequested(
+    CMmDataPackage* aDataPackage )		//contains initial data
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextActivationRequested.");
+
+	//Check if there is client request
+	if ( EMultimodePacketServiceReqHandleUnknown != 
+			CMmPacketServiceTsy::TsyReqHandleStore()->GetTsyReqHandle( 
+				CMmPacketServiceTsy::
+					EMultimodePacketServiceNotifyContextActivationRequested ) ||
+		 EMultimodePacketServiceReqHandleUnknown != 
+		  	CMmPacketServiceTsy::TsyReqHandleStore()->
+              	GetTsyReqHandle( CMmPacketServiceTsy::
+					EMultimodePacketServiceNotifyContextActivationRequested99 ) ||
+		 EMultimodePacketServiceReqHandleUnknown != 
+		 	CMmPacketServiceTsy::TsyReqHandleStore()->
+              	GetTsyReqHandle( CMmPacketServiceTsy::
+					EMultimodePacketServiceNotifyContextActivationRequested5 ) )						
+		{
+		//ETel API client may call RPacketService::NotifyContextActivationRequested
+		//method using one of following parameter class: 
+		//RPacketContext::TContextConfigGPRS, RPacketContext::TContextConfigR99_R4
+		//or RPacketContext::TContextConfig_R5. LTSY may complete 
+		//NotifyContextActivationRequested request using one of these parameter 
+		//classes. CTSY has to complete RPacketService::NotifyContextActivationRequested
+		//requests in all situations.
+		
+		//Copy data temporary from aDataPackage to 
+		//RPacketContext::TContextConfig_R5
+		
+		RPacketContext::TContextConfig_R5 config_R5;
+		TBool config_R5Filled = ETrue;
+		
+		//Before copying initialize GPRS specific fields
+		TUint iPdpCompression = 0;
+		RPacketContext::TAnonymousAccess iAnonymousAccessReqd = 
+			RPacketContext::ENotApplicable;
+		
+		//Before copying reset R99_R4 and R5 specific fields
+		config_R5.iPFI = RPacketContext::EBestEffort;																		
+    	config_R5.iPdpHeaderCompression = RPacketContext::ENoHeaderCompression;     	    
+    	config_R5.iPdpDataCompression = RPacketContext::ENoDataCompression;			
+		
+	
+		TPacketDataConfigBase configBase;
+		aDataPackage->UnPackData( configBase );
+		if ( configBase.ExtensionId() == TPacketDataConfigBase::KConfigGPRS )
+			{		
+	    	RPacketContext::TContextConfigGPRS configGPRS;
+	    	aDataPackage->UnPackData( configGPRS );
+	    	
+			config_R5.iPdpType =configGPRS.iPdpType;			
+			config_R5.iAccessPointName = configGPRS.iAccessPointName;							
+			config_R5.iPdpAddress = configGPRS.iPdpAddress;
+			iPdpCompression = configGPRS.iPdpCompression;
+			iAnonymousAccessReqd = configGPRS.iAnonymousAccessReqd;
+			config_R5.iUseEdge = configGPRS.iUseEdge;
+			config_R5.iProtocolConfigOption.iAuthInfo = 
+				configGPRS.iProtocolConfigOption.iAuthInfo;
+			config_R5.iProtocolConfigOption.iChallenge = 
+				configGPRS.iProtocolConfigOption.iChallenge;
+			config_R5.iProtocolConfigOption.iResponse = 
+				configGPRS.iProtocolConfigOption.iResponse;
+			config_R5.iProtocolConfigOption.iId = 
+				configGPRS.iProtocolConfigOption.iId;
+			config_R5.iProtocolConfigOption.iDnsAddresses = 
+				configGPRS.iProtocolConfigOption.iDnsAddresses;
+			config_R5.iProtocolConfigOption.iMiscBuffer = 
+				configGPRS.iProtocolConfigOption.iMiscBuffer;				
+			config_R5.iNWIContext = configGPRS.iNWIContext;
+			}
+		else if ( configBase.ExtensionId() == TPacketDataConfigBase::KConfigRel99Rel4 )
+			{	
+	    	RPacketContext::TContextConfigR99_R4 config_R99_R4;
+	    	aDataPackage->UnPackData( config_R99_R4 );			
+			
+			config_R5.iPdpType = config_R99_R4.iPdpType;			
+			config_R5.iAccessPointName = config_R99_R4.iAccessPointName;							
+			config_R5.iPdpAddress = config_R99_R4.iPdpAddress;
+			config_R5.iUseEdge = config_R99_R4.iUseEdge;
+			config_R5.iProtocolConfigOption.iAuthInfo =
+				config_R99_R4.iProtocolConfigOption.iAuthInfo;
+			config_R5.iProtocolConfigOption.iChallenge =
+				config_R99_R4.iProtocolConfigOption.iChallenge;
+			config_R5.iProtocolConfigOption.iResponse =
+				config_R99_R4.iProtocolConfigOption.iResponse;
+			config_R5.iProtocolConfigOption.iId =
+				config_R99_R4.iProtocolConfigOption.iId;
+			config_R5.iProtocolConfigOption.iDnsAddresses =
+				config_R99_R4.iProtocolConfigOption.iDnsAddresses;
+			config_R5.iProtocolConfigOption.iMiscBuffer =
+				config_R99_R4.iProtocolConfigOption.iMiscBuffer;								
+			config_R5.iNWIContext = config_R99_R4.iNWIContext;
+			config_R5.iPFI = config_R99_R4.iPFI;	
+			}
+		else if ( configBase.ExtensionId() == TPacketDataConfigBase::KConfigRel5 )
+			{			
+			//Just unpack to config_R5
+	    	aDataPackage->UnPackData( config_R5 );
+			}
+		else
+			{				
+			//Unknown parameter class.
+			config_R5Filled = EFalse;
+			}
+			
+		//Copy data to clients and complete client requests
+		
+		TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+       		EMultimodePacketServiceNotifyContextActivationRequested );	
+		if ( config_R5Filled &&
+		     EMultimodePacketServiceReqHandleUnknown != reqHandle )
+			{
+			// Deliver R97/98 parameters to the ETel Packet API client
+			iNotifyDataPointers.iContextActivationRequested->iPdpType =
+				config_R5.iPdpType;			
+			iNotifyDataPointers.iContextActivationRequested->iAccessPointName =
+				config_R5.iAccessPointName;							
+			iNotifyDataPointers.iContextActivationRequested->iPdpAddress =
+				config_R5.iPdpAddress;
+			iNotifyDataPointers.iContextActivationRequested->iPdpCompression =
+				iPdpCompression;
+			iNotifyDataPointers.iContextActivationRequested->iAnonymousAccessReqd =
+				iAnonymousAccessReqd;
+			iNotifyDataPointers.iContextActivationRequested->iUseEdge =
+				config_R5.iUseEdge;
+			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iAuthInfo =
+				config_R5.iProtocolConfigOption.iAuthInfo;
+			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iChallenge =
+				config_R5.iProtocolConfigOption.iChallenge;
+			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iResponse =
+				config_R5.iProtocolConfigOption.iResponse;
+			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iId =
+				config_R5.iProtocolConfigOption.iId;
+			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iDnsAddresses =
+				config_R5.iProtocolConfigOption.iDnsAddresses;
+			iNotifyDataPointers.iContextActivationRequested->iProtocolConfigOption.iMiscBuffer =
+				config_R5.iProtocolConfigOption.iMiscBuffer;				
+			iNotifyDataPointers.iContextActivationRequested->iNWIContext =
+				config_R5.iNWIContext;
+			iNotifyDataPointers.iContextActivationRequested = NULL;
+		
+			// Complete request with KErrNone
+			CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
+		    }		
+
+		reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+       		EMultimodePacketServiceNotifyContextActivationRequested99 );	
+		if ( config_R5Filled &&
+		     EMultimodePacketServiceReqHandleUnknown != reqHandle )
+			{		
+			// Deliver R99_R4 parameters to the ETel Packet API client
+			iNotifyDataPointers.iContextActivationRequested99->iPdpType =
+				config_R5.iPdpType;			
+			iNotifyDataPointers.iContextActivationRequested99->iAccessPointName =
+				config_R5.iAccessPointName;							
+			iNotifyDataPointers.iContextActivationRequested99->iPdpAddress =
+				config_R5.iPdpAddress;
+			iNotifyDataPointers.iContextActivationRequested99->iUseEdge =
+				config_R5.iUseEdge;
+			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iAuthInfo =
+				config_R5.iProtocolConfigOption.iAuthInfo;
+			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iChallenge =
+				config_R5.iProtocolConfigOption.iChallenge;
+			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iResponse =
+				config_R5.iProtocolConfigOption.iResponse;
+			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iId =
+				config_R5.iProtocolConfigOption.iId;
+			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iDnsAddresses =
+				config_R5.iProtocolConfigOption.iDnsAddresses;
+			iNotifyDataPointers.iContextActivationRequested99->iProtocolConfigOption.iMiscBuffer =
+				config_R5.iProtocolConfigOption.iMiscBuffer;								
+			iNotifyDataPointers.iContextActivationRequested99->iNWIContext =
+				config_R5.iNWIContext;
+			iNotifyDataPointers.iContextActivationRequested99->iPFI =
+				config_R5.iPFI;	
+			iNotifyDataPointers.iContextActivationRequested99 = NULL;	
+
+			// Complete request with KErrNone
+			CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
+			}
+		
+		reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+       		EMultimodePacketServiceNotifyContextActivationRequested5 );	
+		if ( config_R5Filled &&
+		     EMultimodePacketServiceReqHandleUnknown != reqHandle )
+			{	
+			// Deliver R5 parameters to the ETel Packet API client
+			iNotifyDataPointers.iContextActivationRequested5->iPdpType =
+				config_R5.iPdpType;			
+			iNotifyDataPointers.iContextActivationRequested5->iAccessPointName =
+				config_R5.iAccessPointName;							
+			iNotifyDataPointers.iContextActivationRequested5->iPdpAddress =
+				config_R5.iPdpAddress;
+			iNotifyDataPointers.iContextActivationRequested5->iUseEdge =
+				config_R5.iUseEdge;
+			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iAuthInfo =
+				config_R5.iProtocolConfigOption.iAuthInfo;
+			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iChallenge =
+				config_R5.iProtocolConfigOption.iChallenge;
+			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iResponse =
+				config_R5.iProtocolConfigOption.iResponse;
+			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iId =
+				config_R5.iProtocolConfigOption.iId;
+			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iDnsAddresses =
+				config_R5.iProtocolConfigOption.iDnsAddresses;
+			iNotifyDataPointers.iContextActivationRequested5->iProtocolConfigOption.iMiscBuffer =
+				config_R5.iProtocolConfigOption.iMiscBuffer;								
+			iNotifyDataPointers.iContextActivationRequested5->iNWIContext =
+				config_R5.iNWIContext;
+			iNotifyDataPointers.iContextActivationRequested5->iPFI =
+				config_R5.iPFI;																		
+	    	iNotifyDataPointers.iContextActivationRequested5->iPdpHeaderCompression =
+	    	    config_R5.iPdpHeaderCompression;      	    
+	    	iNotifyDataPointers.iContextActivationRequested5->iPdpDataCompression =
+	            config_R5.iPdpDataCompression;
+	       	iNotifyDataPointers.iContextActivationRequested5 = NULL;
+	            
+	        // Complete request with KErrNone
+	        CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
+			}
+		}
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::NotifyContextAdded
+// Requests notification of context has been added.
+// Allows a client to be notified whenever a new context has been created. It
+// should be noted that once the notification completes, the client must then
+// re-post the notification if they wish to continue receiving further
+// notifications.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::NotifyContextAdded(
+    const TDataPackage& aPackage )   
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyContextAdded." );
+
+	TDes* const context = aPackage.Des1u();
+
+    // Save request handle type and context Name
+    iReqHandleType = EMultimodePacketServiceNotifyContextAdded;
+    iNotifyDataPointers.iContextAdded = context;
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteNotifyContextAdded
+// Completes the context added notification to client.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteNotifyContextAdded(
+    CMmDataPackage* aPackage )  
+    {
+    TInfoName tempHostCID;
+    tempHostCID.Zero();
+    
+	//Variables needed for unpacking data
+
+	TInfoName contextName;
+	contextName.Zero();
+	TInt result ( 0 );
+
+    TInt trapError( KErrNone );
+    TInt ret( KErrNone );
+
+	aPackage->UnPackData( contextName, result  );
+
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded." );
+
+	if ( KErrNone != result )
+        {
+        //if one Dial-up context is created
+        if ( iDialUpContext )
+            {
+            // External context, service has no control to the context.
+            // Context name forced to External2.
+            contextName.Copy( KStringExternal2 );
+
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded :Create Secondary Dial-up Object." );
+        
+            // Create object for externally created dial-up context
+            TRAP( trapError, iSecondaryDialUpContext = CMmPacketContextTsy::NewL(
+                this, tempHostCID, contextName ); );
+            }
+
+        else  
+            {
+            // External context, service has no control to the context.
+            // Context name forced to External.
+            contextName.Copy( KStringExternal );
+
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded :Create Dial-up Object." );
+        
+            // Create object for externally created dial-up context
+            TRAP( trapError, iDialUpContext = CMmPacketContextTsy::NewL(
+                this, tempHostCID, contextName ); );
+            }
+
+        if ( KErrNone == trapError )
+            {
+            if ( contextName.Compare( KStringExternal2 ) == 0 )
+                {
+                ret = iPacketContextList->AddObject(
+                    iSecondaryDialUpContext, 0x00, 0x00, 
+                    contextName );
+                }
+            else if ( contextName.Compare( KStringExternal ) == 0 )
+                {
+                ret = iPacketContextList->AddObject( iDialUpContext,
+                    0x00, 0x00, contextName );
+                }
+
+            if( KErrNone != ret )
+                {
+
+                if ( contextName.Compare( KStringExternal2 ) == 0 )
+                    {
+                    iSecondaryDialUpContext->Close();
+                    }
+                else if ( contextName.Compare( KStringExternal ) == 0 )
+                    {
+                    iDialUpContext->Close();
+                    }
+                }
+
+	        if ( KErrNone != ret || KErrNone != trapError )
+	            {
+	            if ( contextName.Compare( KStringExternal2 ) == 0 )
+	                {
+	                iSecondaryDialUpContext = NULL;
+	                }
+	            else if ( contextName.Compare( KStringExternal ) == 0 )
+	              	{
+	                iDialUpContext = NULL;
+	                }
+	           	}
+	     	}
+        
+        //Check if dial-up context is created, and set default params
+        if ( contextName.Compare( KStringExternal2 ) == 0 )
+            {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded :Reset Secondary Dial-up Object." );
+            // Reset secondary dial-up context
+            if(iSecondaryDialUpContext)
+            	{
+            	iSecondaryDialUpContext->ResetDialUpContext();
+            	}
+			
+            }
+        else if ( contextName.Compare( KStringExternal ) == 0 )
+            {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded :Reset Dial-up Object." );
+            // Reset dial-up context
+            if(iDialUpContext)
+            	{
+            	iDialUpContext->ResetDialUpContext();
+            	}
+            }
+        }
+
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceNotifyContextAdded ) );
+
+    // Check that request handle is valid
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+        // Add context name to the etel side memory
+        *iNotifyDataPointers.iContextAdded = contextName;
+        iNotifyDataPointers.iContextAdded = NULL;
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteNotifyContextAdded. Context Name: %S", &contextName );
+
+        // Complete request with KErrNone
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::NotifyDynamicCapsChange
+// Requests notification of dynamic capabilities change.
+// This function will complete when the dynamic packet data capabilities
+// change; that is, either some action has become possible and/or some action
+// is no longer possible. A common usage of the dynamic capabilities functions
+// would be for GetDynamicCaps() to be called first to retrieve the current
+// set of capabilities, and then the NotifyDynamicCapsChange() request to be
+// posted to be kept informed of any changes.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::NotifyDynamicCapsChange(
+    RPacketService::TDynamicCapsFlags* const aCaps ) 
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyDynamicCapsChange." );
+
+    // Save pointer to aCaps
+    iNotifyDataPointers.iDynamicCapsChange = aCaps;
+
+    // Set request handle type
+    iReqHandleType = EMultimodePacketServiceNotifyDynamicCapsChange;
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteNotifyDynamicCapsChange
+// Completes dynamic capabilities notification to client.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteNotifyDynamicCapsChange(
+    const RPacketService::TDynamicCapsFlags aCaps ) 
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyDynamicCapsChange." );
+
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceNotifyDynamicCapsChange ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+        *iNotifyDataPointers.iDynamicCapsChange = aCaps;
+        iNotifyDataPointers.iDynamicCapsChange = NULL;
+
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::NotifyMSClassChange
+// Requests notification of mobile station class change.
+// This function will complete when there is a change in the current GPRS
+// class of the mobile station. The new class is passed back in the aNewClass
+// parameter.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::NotifyMSClassChange(
+    RPacketService::TMSClass* const aNewClass ) 
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyMSClassChange." );
+
+    // Save aNewClass internally
+    iNotifyDataPointers.iMSClassChange = aNewClass;
+
+    iReqHandleType = EMultimodePacketServiceNotifyMSClassChange;
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteNotifyMSClassChange
+// Completes mobile station class notification to client.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteNotifyMSClassChange(
+    CMmDataPackage* aDataPackage )				
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyMSClassChange." );
+
+	RPacketService::TMSClass newClass;
+	aDataPackage->UnPackData( newClass );
+
+    if ( newClass != iInternalSavedData.iMsClass )
+        {
+        // Save new ms class internally
+        iInternalSavedData.iMsClass = newClass;
+
+        // Reset request handle. Returns the deleted request handle
+        const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+            EMultimodePacketServiceNotifyMSClassChange ) );
+
+        if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+            {
+            // Save changed MS Class to ETel side memory
+            *iNotifyDataPointers.iMSClassChange = newClass;
+            iNotifyDataPointers.iMSClassChange = NULL;
+
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteNotifyMSClassChange. New Ms Class: %d", newClass );
+            // Complete request with KErrNone
+            CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
+            }
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::NotifyStatusChange
+// informs client that service status change.
+// Allows a client to be notified of a change in the status
+// of the connection to the packet service. The new status is
+// passed back to the client via aPacketStatus parameter.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::NotifyStatusChange(
+    RPacketService::TStatus* const aPacketStatus ) 
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyStatusChange." );
+
+    // Save aPacketStatus to internal memory
+    iNotifyDataPointers.iStatusChange = aPacketStatus;
+
+    // Set request handle type
+    iReqHandleType = EMultimodePacketServiceNotifyStatusChange;
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteNotifyStatusChange
+// Completes service status notification to client.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteNotifyStatusChange(
+    const RPacketService::TStatus& aPacketStatus,
+    TInt aErrorCode )
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyStatusChange." );
+    if ( aPacketStatus != iInternalSavedData.iServiceStatus )
+        {
+        iInternalSavedData.iServiceStatus = aPacketStatus;
+
+        // Reset req handle. Returns the deleted req handle
+        const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+            EMultimodePacketServiceNotifyStatusChange ) );
+
+        if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+            {
+            *iNotifyDataPointers.iStatusChange = aPacketStatus;
+            iNotifyDataPointers.iStatusChange = NULL;
+
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteNotifyStatusChange. Service Status:%d", aPacketStatus );
+            CMmPacketServiceTsy::ReqCompleted( reqHandle, aErrorCode );
+            }
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::RejectActivationRequest
+// Reject activation request from the network.
+// This function will cause the phone to reject the network's request for a
+// PDP context activation. Note, there is no corresponding "accept" message
+// for the phone to send. To accept, the phone should simply begin to activate
+// a PDP context with the appropriate IP address before the network's timer
+// expires. On GPRS, this timer is between 5 and 8 seconds, but may
+// effectively be between around 25 and 40 seconds as the specifications state
+// that the activation request should be re-sent up to five times.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::RejectActivationRequestL()
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::RejectActivationRequestL." );
+
+    const TTsyReqHandle tsyRegHandle( iTsyReqHandleStore->GetTsyReqHandle(
+        EMultimodePacketServiceRejectActivationRequest ) );
+
+    TInt ret( KErrServerBusy );
+
+    if ( EMultimodePacketServiceReqHandleUnknown == tsyRegHandle )
+        {
+		// Reject network activation
+		ret = iMessageManager->HandleRequestL( 
+		    EPacketRejectActivationRequest );
+
+        if ( KErrNone == ret )
+            {
+            // Set request handle
+            iReqHandleType = EMultimodePacketServiceRejectActivationRequest;
+            }
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteRejectActivationRequest
+// Completes asynchronous reject activation request.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteRejectActivationRequest()
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteRejectActivationRequest." );
+
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceRejectActivationRequest ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+        // Complete the client request
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, KErrNone );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::SetAttachMode
+// Sets attach mode given in parameter to the server.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::SetAttachModeL(
+    const RPacketService::TAttachMode* aMode )
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::SetAttachModeL." );
+
+    iAttachMode = *aMode;
+
+    TInt ret( KErrServerBusy );
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
+        EMultimodePacketServiceSetAttachMode ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
+        {
+ 		//Set attach mode
+		ret = iMmPacketServiceGsmWcdmaExt->SetAttachModeL( *aMode );
+
+		if ( KErrNone == ret )
+            {
+            // Set req handle
+            iReqHandleType = EMultimodePacketServiceSetAttachMode;
+            }
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteSetAttachMode
+// Completes the Set Attach Mode request.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteSetAttachMode(
+    const TInt aError )  //error value
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteSetAttachMode. Error Value: %d", aError );
+
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceSetAttachMode ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+        // Complete the client request
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::SetPreferredBearer
+// Sets preferred bearer given in parameter to the GPDS server.
+// This function will set the preferred bearer for the MT to default to when
+// dropping from Class B operation to Class C, for instance when the MT moves
+// into a Routing Area of cells or new GPRS network which operates in Network
+// Mode III. Class C operation requires that the MT is attached to either GSM
+// or GPRS, not both.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::SetPreferredBearerL(
+    const TDataPackage& aPackage )		
+    {
+	TAny* const dataPtr = aPackage.Ptr1();
+
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::SetPreferredBearerL. Preferred Bearer: %d", &dataPtr );
+
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
+        EMultimodePacketServiceSetPreferredBearer ) );
+
+    TInt ret( KErrServerBusy );
+
+    if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
+        {
+        RPacketService::TPreferredBearer* abearer = REINTERPRET_CAST(
+            RPacketService::TPreferredBearer*, dataPtr );
+
+        // Set preferred beareraPackage
+        ret = iMmPacketServiceGsmWcdmaExt->SetPreferredBearerL( aPackage );
+
+        if ( KErrNone == ret )
+            {
+            iTemporarySavedData.iPreferredBearer = *abearer;
+
+            // Set request handle type
+            iReqHandleType = EMultimodePacketServiceSetPreferredBearer;
+            }
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteSetPreferredBearer
+// Completes the Set Preferred Bearer request.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteSetPreferredBearer(
+    const TInt aError )  //epoc error code
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteSetPreferredBearer. Error: %d", aError );
+
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceSetPreferredBearer ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+        if ( KErrNone == aError )
+            {
+            iInternalSavedData.iPreferredBearer =
+                iTemporarySavedData.iPreferredBearer;
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteSetPreferredBearer. Preferred Bearer: %d", iInternalSavedData.iPreferredBearer );
+            }
+
+        // Complete the client request
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::ExtFunc
+// ExtFunc is called by the ETel when it has request for the TSY.
+// For TSY to process request a request handle, request type and request data
+// are passed to the TSY.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::ExtFunc(
+    const TTsyReqHandle aTsyReqHandle,  
+    const TInt aIpc,                    
+    const TDataPackage& aPackage )     
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::ExtFunc. IPC: %d", aIpc );
+
+    TInt ret( KErrNone );
+    TInt trapError( KErrNone );
+
+    // Ensure the ReqHandleType is unset.
+    // This will detect cases where this method indirectly calls itself
+    // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
+    // Such cases are not supported because iReqHandleType is in the context of this class instance,
+    // not this request, and we don't want the values set by the inner request and the outer request
+    // interfering with each other.
+    __ASSERT_DEBUG(iReqHandleType==EMultimodePacketServiceReqHandleUnknown, User::Invariant());
+    
+    // Set tsy request handle
+    iTsyReqHandle = aTsyReqHandle;
+
+    // Call DoExtFuncL()
+    TRAP( trapError, ret = DoExtFuncL( aIpc, aPackage ); );
+
+    if ( KErrNone != trapError )
+        {
+        CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, trapError );
+        }
+    else if ( KErrNone != ret )
+        {
+        CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
+        }
+
+    if ( EMultimodePacketServiceReqHandleUnknown != iReqHandleType )
+        {
+        // Save request handle type
+
+#ifdef REQHANDLE_TIMER
+        SetTypeOfResponse( iReqHandleType );
+#else
+        iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, iTsyReqHandle );
+#endif // REQHANDLE_TIMER
+        // We've finished with this value now. Clear it so it doesn't leak
+        //  up to any other instances of this method down the call stack
+        iReqHandleType = EMultimodePacketServiceReqHandleUnknown;
+        }
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::DoExtFuncL
+// Calls correct method to handle ETel server request.
+// unpack packaged parameters
+// call correct method implemention using the IPC number and return the
+// return value back to the caller.
+// in case IPC number is not understood by switch, KErrNotSupported will
+// be returned.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::DoExtFuncL(
+    const TInt aIpc,                
+    const TDataPackage& aPackage )  
+    {
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::DoExtFuncL. IPC: %d TSY Req Handle:%d", aIpc, iTsyReqHandle);
+
+    TInt ret( KErrNotSupported );
+
+    TAny* const dataPtr = aPackage.Ptr1();
+    TAny* const dataPtr2 = aPackage.Ptr2();
+
+    switch ( aIpc )
+        {
+        case EPacketNotifyContextAdded:
+			ret = NotifyContextAdded( aPackage );
+            break;
+        case EPacketAttach:
+            ret = AttachL();
+            break;
+        case EPacketDetach:
+            ret = DetachL();
+            break;
+        case EPacketGetStatus:
+            ret = GetStatus(
+                REINTERPRET_CAST( RPacketService::TStatus*, dataPtr ) );
+            break;
+        case EPacketNotifyStatusChange:
+            ret = NotifyStatusChange(
+                REINTERPRET_CAST( RPacketService::TStatus*, dataPtr ) );
+            break;
+        case EPacketNotifyContextActivationRequested:
+            ret = NotifyContextActivationRequested(
+                REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
+            break;
+        case EPacketRejectActivationRequest:
+            ret = RejectActivationRequestL();
+            break;
+        case EPacketEnumerateContexts:
+            ret = EnumerateContexts(
+                REINTERPRET_CAST( TInt*, dataPtr ),
+                REINTERPRET_CAST( TInt*, dataPtr2 ) );
+            break;
+        case EPacketGetContextInfo:
+            ret = GetContextInfo(
+                REINTERPRET_CAST( TInt*, dataPtr ),
+                REINTERPRET_CAST( RPacketService::TContextInfo*, dataPtr2 ) );
+            break;
+        case EPacketGetNtwkRegStatus:
+            ret = GetNtwkRegStatusL(
+                REINTERPRET_CAST( RPacketService::TRegistrationStatus*,
+                    dataPtr ) );
+            break;
+        case EPacketNotifyChangeOfNtwkRegStatus:
+            ret = NotifyChangeOfNtwkRegStatus(
+                REINTERPRET_CAST( RPacketService::TRegistrationStatus*,
+                    dataPtr ) );
+            break;
+        case EPacketGetMSClass:
+            ret = GetMSClass(
+                REINTERPRET_CAST( RPacketService::TMSClass*, dataPtr ),
+                REINTERPRET_CAST( RPacketService::TMSClass*, dataPtr2 ) );
+            break;
+        case EPacketNotifyMSClassChange:
+            ret = NotifyMSClassChange(
+                REINTERPRET_CAST( RPacketService::TMSClass*, dataPtr ) );
+            break;
+        case EPacketSetPrefBearer:
+			ret = SetPreferredBearerL( aPackage );
+            break;
+        case EPacketGetPrefBearer:
+            ret = GetPreferredBearer( REINTERPRET_CAST(
+                RPacketService::TPreferredBearer*, dataPtr ) );
+            break;
+        case EPacketGetStaticCaps:
+            ret = GetStaticCaps(
+                REINTERPRET_CAST( TUint*, dataPtr ),
+                REINTERPRET_CAST( RPacketContext::TProtocolType*, dataPtr2 ) );
+            break;
+        case EPacketGetDynamicCaps:
+            ret = GetDynamicCaps( REINTERPRET_CAST(
+                RPacketService::TDynamicCapsFlags*, dataPtr ) );
+            break;
+        case EPacketNotifyDynamicCapsChange:
+            ret = NotifyDynamicCapsChange( REINTERPRET_CAST(
+                RPacketService::TDynamicCapsFlags*, dataPtr ) );
+            break;
+        case EPacketSetAttachMode:
+            ret = SetAttachModeL(
+                REINTERPRET_CAST( RPacketService::TAttachMode*, dataPtr ) );
+            break;
+        case EPacketGetAttachMode:
+            ret = GetAttachModeL(
+                REINTERPRET_CAST( RPacketService::TAttachMode*, dataPtr ) );
+            break;
+        case EPacketPrepareOpenSecondary:
+            ret = PrepareOpenSecondary( aPackage.Des1u() );
+            break;
+        case EPacketEnumerateNifs:
+            ret = EnumerateNifs( REINTERPRET_CAST ( TInt*, dataPtr ) );
+            break;
+        case EPacketGetNifInfo:
+        	// Check that dataPtr2 is not null
+        	if (dataPtr2)
+        		{
+        		// Get the TDes8 version of the parameter and find its MaxLength()
+        		TInt parameterLength = aPackage.Des2n()->MaxLength();
+        		
+        		// Create a temporary object of the expected type and find the expected MaxLength()
+        		RPacketService::TNifInfoV2 temp;
+        		RPacketService::TNifInfoV2Pckg tempPckg(temp);
+        		TInt expectedLength = tempPckg.MaxLength();
+
+				// Compare the expected length with the actual length of the sent parameter
+	        	if ( parameterLength == expectedLength )
+	        		{
+		            ret = GetNifInfo( REINTERPRET_CAST( TInt*, dataPtr ),
+	    	            REINTERPRET_CAST( RPacketService::TNifInfoV2*, dataPtr2 ) );
+	        		}
+	        	else
+	        		{
+	        		ret = KErrArgument;
+	        		}
+        		}
+        	else
+        		{
+        		ret = KErrArgument;
+        		}	
+            break;
+        case EPacketEnumerateContextsInNif:
+            ret = EnumerateContextsInNif( aPackage.Des2u(),
+                REINTERPRET_CAST( TInt*, dataPtr ) );
+            break;
+        case EPacketGetContextNameInNif:
+            ret = GetContextNameInNif(
+                REINTERPRET_CAST( RPacketService::TContextNameInNif*,
+                    dataPtr ), aPackage.Des2u() );
+            break;
+        case EPacketSetDefaultContextParams:
+			ret = SetDefaultContextParamsL( aPackage );
+            break;
+        case EPacketGetDefaultContextParams:
+            ret = GetDefaultContextParams(
+                REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
+            break;
+        case EPacketNotifyMbmsNetworkServiceStatusChange:
+        	ret = NotifyMbmsNetworkServiceStatusChange( 
+        		reinterpret_cast<TMbmsNetworkServiceStatus*> (dataPtr ) );
+            break;
+        case EPacketNotifyMbmsServiceAvailabilityChange:
+        	ret = NotifyMbmsServiceAvailabilityChange();
+            break;
+        case EPacketGetMbmsNetworkServiceStatus:
+        	ret = GetMbmsNetworkServiceStatus(
+        	    *reinterpret_cast<TBool*> (dataPtr ),
+        	    reinterpret_cast<TMbmsNetworkServiceStatus*> (dataPtr2 ) );
+        	break; 
+        case EPacketEnumerateMbmsMonitorServiceList:
+            ret = EnumerateMonitorServiceList(
+                *reinterpret_cast<TInt*> ( dataPtr ),
+                *reinterpret_cast<TInt*> ( dataPtr2 ) );
+            break;
+        case EPacketEnumerateMbmsActiveServiceList:
+            ret = EnumerateMbmsActiveServiceList(
+                *reinterpret_cast<TInt*> ( dataPtr),
+                *reinterpret_cast<TInt*>(dataPtr2) );
+            break;
+        case EPacketUpdateMbmsMonitorServiceList:
+			TMbmsAction action;
+			action = *reinterpret_cast< TMbmsAction*> (dataPtr );
+        	if(dataPtr2)
+				{
+				ret = UpdateMbmsMonitorServiceListL(
+               		action,
+                      aPackage.Des2n() );
+				}
+			else
+				{
+				ret = UpdateMbmsMonitorServiceListL(
+					action, NULL );
+				}                            
+            break;
+		case EPacketGetMbmsMonitoredServicesPhase1:
+            ret = GetMbmsMonitoredServicesPhase1L(
+                reinterpret_cast<RMobilePhone::TClientId*> (dataPtr),
+                *reinterpret_cast<TUint*>(dataPtr2 ) );
+            break;
+        case EPacketGetMbmsMonitoredServicesPhase2:
+            ret = GetMbmsMonitoredServicesPhase2(
+                reinterpret_cast<RMobilePhone::TClientId*>( dataPtr ),
+                aPackage.Des2n());
+            break;           
+        //case EPacketSetMSClass:
+        default:
+            break;
+        }
+
+    return ret;
+    }
+
+
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::ReqModeL
+// Returns request mode for given IPC.
+// leave if given IPC is not supported
+// return request mode for IPC number given in parameter
+//----------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmPacketServiceTsy::ReqModeL(
+    const TInt aIpc ) 
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::ReqModeL. IPC: %d", aIpc );
+
+    CTelObject::TReqMode reqMode( 0 );
+    switch ( aIpc )
+        {
+        // All disabled TSYs wishing to implement their own buffering 
+        // algorithm will place all requests in this category.
+
+        // Get methods that do not use DOS and return immediately.
+        // Other methods that return immediately.
+        // Methods that can propably take a long time flow control not 
+        // required.
+        case EPacketGetNtwkRegStatus:
+        case EPacketGetDynamicCaps:
+        case EPacketGetStatus:
+        case EPacketEnumerateContexts:
+        case EPacketGetContextInfo:
+        case EPacketGetAttachMode:
+        case EPacketGetStaticCaps:
+        case EPacketRejectActivationRequest:
+        case EPacketSetAttachMode:
+        case EPacketAttach:
+        case EPacketDetach:
+        case EPacketSetPrefBearer:
+        case EPacketGetPrefBearer:
+        case EPacketPrepareOpenSecondary:
+        case EPacketEnumerateNifs:
+        case EPacketGetNifInfo:
+        case EPacketEnumerateContextsInNif:
+        case EPacketGetContextNameInNif:
+        case EPacketSetDefaultContextParams:
+        case EPacketGetDefaultContextParams:
+        case EPacketUpdateMbmsMonitorServiceList:
+        case EPacketEnumerateMbmsMonitorServiceList:
+        case EPacketGetMbmsNetworkServiceStatus:
+        case EPacketEnumerateMbmsActiveServiceList:        
+        case EPacketGetMbmsMonitoredServicesPhase1:
+        case EPacketGetMbmsMonitoredServicesPhase2:
+            break;
+
+        // Commands that change the state of the phone.
+        case EPacketGetMSClass:
+            reqMode = KReqModeFlowControlObeyed;
+            break;
+
+        // Requests that notify a client about a change of state.
+        case EPacketNotifyContextAdded:
+        case EPacketNotifyStatusChange:
+        case EPacketNotifyChangeOfNtwkRegStatus:
+        case EPacketNotifyContextActivationRequested:
+        case EPacketNotifyDynamicCapsChange:
+        case EPacketNotifyMSClassChange:
+        case EPacketNotifyMbmsNetworkServiceStatusChange:
+            reqMode = KReqModeMultipleCompletionEnabled |
+                KReqModeRePostImmediately;
+        case EPacketNotifyMbmsServiceAvailabilityChange:       
+            break;
+
+        // Following requests are not supported
+        //case EPacketSetMSClass:
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+
+    return reqMode;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::NumberOfSlotsL
+// Returns number of slots to be used for given IPC.
+// return number of slots to be used for IPC number given in parameter
+// leave with KErrNotSupported if invalid IPC
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::NumberOfSlotsL(
+    const TInt aIpc ) 
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::NumberOfSlotsL. IPC: %d", aIpc );
+
+    TInt numberOfSlots( 0 );
+    switch ( aIpc )
+        {
+
+        case EPacketNotifyStatusChange:
+            numberOfSlots = KMmPacketServiceNotifyStatusChangeSlots;
+            break;
+        case EPacketNotifyDynamicCapsChange:
+            numberOfSlots = KMmPacketServiceNotifyDynamicCapsChangeSlots;
+            break;
+        case EPacketNotifyContextAdded:
+            numberOfSlots = KMmPacketServiceNotifyContextAddedSlots;
+            break;
+        case EPacketNotifyContextActivationRequested:
+            numberOfSlots =
+                KMmPacketServiceNotifyContextActivationRequestedSlots;
+            break;
+        case EPacketNotifyChangeOfNtwkRegStatus:
+            numberOfSlots = KMmPacketServiceNotifyChangeOfNtwkRegStatusSlots;
+            break;
+        case EPacketNotifyMSClassChange:
+            numberOfSlots = KMmPacketServiceNotifyMSClassChangeSlots;
+            break;
+        case EPacketNotifyMbmsNetworkServiceStatusChange:
+            numberOfSlots = KMmPacketServiceNotifyMBMSServiceStatusSlots;
+            break;
+        default:
+            // Unknown or invalid IPC
+            User::Leave( KErrNotSupported );
+            break;
+        }
+
+    return numberOfSlots;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CancelService
+// When the clients close their sub-sessions (eg. by calling RPhone::Close),
+// they may not have cancelled all their outstanding asynchronous requests
+// before closing. It is up to the ETel server to clean up in this situation,
+// so the server will find the list of outstanding requests related to that
+// sub-session object and pass these outstanding IPC request numbers, one at a
+// time, to the CancelService function in the TSY.
+// This method is also called when client initiates normal cancel to the
+// request.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::CancelService(
+    const TInt aIpc,                    
+    const TTsyReqHandle aTsyReqHandle ) 
+    {
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::CancelService. IPC: %d Tsy Req Handle:%d", aIpc, aTsyReqHandle);
+
+    TInt ret( KErrNone );
+    
+    // Ensure the ReqHandleType is unset.
+    // This will detect cases where this method indirectly calls itself
+    // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
+    // Such cases are not supported because iReqHandleType is in the context of this class instance,
+    // not this request, and we don't want the values set by the inner request and the outer request
+    // interfering with each other.
+    __ASSERT_DEBUG(iReqHandleType==EMultimodePacketServiceReqHandleUnknown, User::Invariant());
+
+    // When the clients close their sub-sessions (eg. by calling
+    // RPacketService::Close), they may not have cancelled all their
+    // outstanding asynchronous requests before closing.  It is up to the ETel
+    // server to clean up in this situation, so the server will find the list
+    // of outstanding requests related to that sub-session object and pass
+    // these outstanding IPC request numbers, one at a time, to the
+    // CancelService method in the TSY.
+
+    switch ( aIpc )
+        {
+        case EPacketNotifyContextAdded:
+            iNotifyDataPointers.iContextAdded = NULL;
+            iReqHandleType = EMultimodePacketServiceNotifyContextAdded;
+            break;
+        case EPacketNotifyStatusChange:
+            iNotifyDataPointers.iStatusChange = NULL;
+            iReqHandleType = EMultimodePacketServiceNotifyStatusChange;
+            break;
+        case EPacketNotifyContextActivationRequested:
+            if ( aTsyReqHandle == iTsyReqHandleStore->GetTsyReqHandle(
+                EMultimodePacketServiceNotifyContextActivationRequested ) )
+                {
+                iNotifyDataPointers.iContextActivationRequested = NULL;
+                iReqHandleType =
+                    EMultimodePacketServiceNotifyContextActivationRequested;
+                }
+            else if ( aTsyReqHandle == iTsyReqHandleStore->GetTsyReqHandle(
+                EMultimodePacketServiceNotifyContextActivationRequested99 ) )
+                {
+                iNotifyDataPointers.iContextActivationRequested99 = NULL;
+                iReqHandleType =
+                    EMultimodePacketServiceNotifyContextActivationRequested99;
+                }
+            else if ( aTsyReqHandle == iTsyReqHandleStore->GetTsyReqHandle(
+                EMultimodePacketServiceNotifyContextActivationRequested5 ) )
+                {
+                iNotifyDataPointers.iContextActivationRequested5 = NULL;
+                iReqHandleType =
+                    EMultimodePacketServiceNotifyContextActivationRequested5;
+                }                
+            break;
+        case EPacketNotifyChangeOfNtwkRegStatus:
+            iNotifyDataPointers.iChangeOfNtwkRegStatus = NULL;
+            iReqHandleType = EMultimodePacketServiceNotifyNtwkRegStatusChange;
+            break;
+        case EPacketNotifyMSClassChange:
+            iNotifyDataPointers.iMSClassChange = NULL;
+            iReqHandleType = EMultimodePacketServiceNotifyMSClassChange;
+            break;
+        case EPacketNotifyDynamicCapsChange:
+            iNotifyDataPointers.iDynamicCapsChange = NULL;
+            iReqHandleType = EMultimodePacketServiceNotifyDynamicCapsChange;
+            break;
+        case EPacketNotifyMbmsNetworkServiceStatusChange:
+        	iNotifyDataPointers.iMBMSStatusChange = NULL;
+        	iReqHandleType = EMultimodePacketServiceNotifyMBMSStatusChange;
+        	break;
+        case EPacketNotifyMbmsServiceAvailabilityChange:
+         	iReqHandleType = EMultimodePacketServiceNotifyMbmsServiceAvailabilityChange;
+        	break;       
+        case EPacketGetMbmsNetworkServiceStatus:
+         	iReqHandleType = EMultimodePacketServiceGetMBMSStatus;
+        	break;       
+        case EPacketGetMbmsMonitoredServicesPhase1:
+        case EPacketGetMbmsMonitoredServicesPhase2:
+        	GetMbmsMonitoredServicesCancel( aTsyReqHandle );
+        	break;
+        case EPacketUpdateMbmsMonitorServiceList:
+        	UpdateMbmsMonitorServiceListCancel(aTsyReqHandle);	
+        	break;
+        // TSY has started a request and it is not possible to then
+        // cancel this request. The best thing for the TSY to do in this case
+        // is to proceed as though the Cancel never happened. The server's 
+        // call to the TSY cancel function will return synchronously.
+        case EPacketAttach:
+        case EPacketDetach:
+        case EPacketGetStatus:
+        case EPacketRejectActivationRequest:
+        case EPacketEnumerateContexts:
+        case EPacketGetContextInfo:
+        case EPacketGetNtwkRegStatus:
+        case EPacketGetMSClass:
+        case EPacketSetPrefBearer:
+        case EPacketGetPrefBearer:
+        case EPacketGetStaticCaps:
+        case EPacketGetDynamicCaps:
+        case EPacketSetAttachMode:
+        case EPacketGetAttachMode:
+        case EPacketEnumerateNifs:
+        case EPacketGetNifInfo:
+        case EPacketEnumerateContextsInNif:
+        case EPacketGetContextNameInNif:
+        case EPacketSetDefaultContextParams:
+        case EPacketGetDefaultContextParams:
+        case EPacketEnumerateMbmsMonitorServiceList:
+        case EPacketEnumerateMbmsActiveServiceList:
+            break;
+
+        // Cancel methods that are not supported.
+        //case EPacketSetMSClass:
+        default:
+            ret = KErrNotSupported;
+            break;
+        }
+
+    if ( EMultimodePacketServiceReqHandleUnknown != iReqHandleType )
+        {
+        // Reset tsy request handle
+        iTsyReqHandleStore->ResetTsyReqHandle( iReqHandleType );
+
+        // We've finished with this value now. Clear it so it doesn't leak
+        //  up to any other instances of this method down the call stack
+        iReqHandleType = EMultimodePacketServiceReqHandleUnknown;
+
+        // Complete request with KErrCancel
+        CMmPacketServiceTsy::ReqCompleted( aTsyReqHandle, KErrCancel );
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::RegisterNotification
+// Register notification.
+// Returns KErrNone to ETel server in case of known notification request type.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::RegisterNotification(
+    const TInt aIpc ) 
+	{
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::RegisterNotification. IPC: %d", aIpc );
+
+    TInt ret( KErrNone );
+
+    switch ( aIpc )
+        {
+        case EPacketNotifyContextAdded:
+        case EPacketNotifyStatusChange:
+        case EPacketNotifyContextActivationRequested:
+        case EPacketNotifyChangeOfNtwkRegStatus:
+        case EPacketNotifyMSClassChange:
+        case EPacketNotifyDynamicCapsChange:
+        case EPacketNotifyMbmsNetworkServiceStatusChange:
+        case EPacketNotifyMbmsServiceAvailabilityChange:
+            break;
+        default:
+            // Not supported
+            ret = KErrNotSupported;
+            break;
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::DeregisterNotification
+// Deregister notification.
+// Returns KErrNone to ETel server in case of known notification request type.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::DeregisterNotification(
+    const TInt aIpc ) 
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::DeregisterNotification. IPC: %d", aIpc );
+
+    TInt ret( KErrNone );
+
+    switch ( aIpc )
+        {
+        case EPacketNotifyContextAdded:
+        case EPacketNotifyStatusChange:
+        case EPacketNotifyContextActivationRequested:
+        case EPacketNotifyChangeOfNtwkRegStatus:
+        case EPacketNotifyMSClassChange:
+        case EPacketNotifyDynamicCapsChange:
+        case EPacketNotifyMbmsNetworkServiceStatusChange:
+        case EPacketNotifyMbmsServiceAvailabilityChange:
+            break;
+        default:
+            // Not supported
+            ret = KErrNotSupported;
+            break;
+        }
+
+    return ret;
+    }
+    
+  
+
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::GetMbmsNetworkServiceStatus
+// Requests Get MBMS network service status 
+//-----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetMbmsNetworkServiceStatus(
+		TBool aAttemptAttach, 
+		TMbmsNetworkServiceStatus* aMBMSServiceStatus )
+{
+TFLOGSTRING2("TSY: CMmPacketServiceTsy:: TMbmsNetworkServiceStatus = %d", aMBMSServiceStatus );	
+
+   const TTsyReqHandle regHandle( iTsyReqHandleStore->GetTsyReqHandle(
+   EMultimodePacketServiceGetMBMSStatus ) );
+   
+   TInt ret( KErrServerBusy ); 
+   if ( !iMbmsStatusCached )
+    	{
+    	if ( EMultimodePacketServiceReqHandleUnknown == regHandle )  
+    		{
+    		// Save pointer to aMBMSServiceStatus
+    		iTemporarySavedData.iMbmsStatus = aMBMSServiceStatus;  
+    		    			    
+	    	// Get MBMS network service status
+	    	CMmDataPackage dataPackage;
+	    	dataPackage.PackData( &aAttemptAttach );
+			TRAPD(err, ret = iMessageManager->HandleRequestL( EPacketGetMbmsNetworkServiceStatus, &dataPackage));
+			if(err != KErrNone)
+				{
+				ret = err;
+				}
+			}
+			if ( KErrNone == ret )
+   				{
+   	 			// Set request handle type
+	    		iReqHandleType = EMultimodePacketServiceGetMBMSStatus;	
+   				}
+    		
+    	}
+    else // iMbmsStatusCached == ETrue
+    	{
+    	
+		*aMBMSServiceStatus = iInternalSavedData.iMbmsStatus;
+		
+   		// Complete the request with KErrNone
+    	CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+
+    	ret = KErrNone;
+    
+   		}
+   		
+ 	return ret;	
+}
+	
+//-----------------------------------------------------------------------------
+// void CMmPacketServiceTsy::CompleteGetMbmsNetworkServiceStatus
+// Completes Get MBMS network service status request 
+//-----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteGetMbmsNetworkServiceStatus( 
+	CMmDataPackage* aDataPackage, TInt aError )
+	{
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteGetMbmsNetworkServiceStatus.");
+
+	//Update the cache
+	TMbmsNetworkServiceStatus mbmsNetworkServiceStatus = EMbmsSupportUnknown;
+	if ( KErrNone == aError )
+		{
+		//Unpack necessary data from datapackage
+		if ( aDataPackage )
+			{
+			aDataPackage->UnPackData( mbmsNetworkServiceStatus );
+			}
+            
+		// Change MBMS cache indicator value
+		iMbmsStatusCached = ETrue;
+		iInternalSavedData.iMbmsStatus = mbmsNetworkServiceStatus;
+		}
+
+	// Reset request handle. Returns the deleted request handle
+	const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+	EMultimodePacketServiceGetMBMSStatus ) );
+
+   // If request handle ok
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+    	{
+    	*iTemporarySavedData.iMbmsStatus = mbmsNetworkServiceStatus;
+        // Complete the client request
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, aError );
+        }
+	}
+	
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange
+// Requests notification of MBMS network service status change.
+// Allows a client to be notified whenever a change in the status of the
+// MBMS network service is detected.
+//-----------------------------------------------------------------------------
+//
+
+TInt CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange(
+	TMbmsNetworkServiceStatus* aMBMSServiceStatus )
+	{
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange TMbmsNetworkServiceStatus = %d", aMBMSServiceStatus );
+	
+	// Set request handle and save pointer to aMBMSServiceStatus
+    iNotifyDataPointers.iMBMSStatusChange = aMBMSServiceStatus;
+    iReqHandleType =  EMultimodePacketServiceNotifyMBMSStatusChange;
+
+    return KErrNone;
+	}
+	
+//-----------------------------------------------------------------------------
+// Void CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange
+// Completes notification of MBMS network service status request 
+//-----------------------------------------------------------------------------
+//	
+void CMmPacketServiceTsy::CompleteNotifyMbmsNetworkServiceStatusChange( 
+	CMmDataPackage* aDataPackage, TInt aResult )
+	{
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyMbmsNetworkServiceStatusChange.");
+	        
+	TInt result = aResult;        
+	if (aResult == KErrNone)
+		{	        
+		//Unpack necessary data from datapackage
+		TMbmsNetworkServiceStatus newMbmsNetworkServiceStatus;
+		aDataPackage->UnPackData( newMbmsNetworkServiceStatus );
+	
+		// If Mbms network service status changed
+		if ( newMbmsNetworkServiceStatus != iInternalSavedData.iMbmsStatus )
+        	{
+
+        	// Save new status internally
+        	iInternalSavedData.iMbmsStatus = newMbmsNetworkServiceStatus;
+        	iMbmsStatusCached = ETrue;
+        	
+        	// Reset request handle. Returns the deleted request handle
+			const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+	        EMultimodePacketServiceNotifyMBMSStatusChange ) );
+	        	
+	        // If request handle ok
+	    	if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+	        	{
+           		// Set MbmsNetworkServiceStatus to the etel side memory
+           		*iNotifyDataPointers.iMBMSStatusChange = newMbmsNetworkServiceStatus;
+           		iNotifyDataPointers.iMBMSStatusChange = NULL;
+
+	       		// Complete the client request
+	       		CMmPacketServiceTsy::ReqCompleted( reqHandle, result );
+
+        		}
+       	 	} 
+       	 		
+		}
+	else // result is != KErrNone
+		{
+		// Reset request handle. Returns the deleted request handle
+		const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+	    EMultimodePacketServiceNotifyMBMSStatusChange ) );
+	   	// Complete the client request
+	    CMmPacketServiceTsy::ReqCompleted( reqHandle, result );
+		}
+	}
+	
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::NotifyMbmsServiceAvailabilityChange
+// Requests notification of MBMS service availability status change.
+// Allows a client to be notified whenever a change in the status of the
+// MBMS network service is detected.
+//-----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::NotifyMbmsServiceAvailabilityChange()
+	{
+TFLOGSTRING("TSY: CMmPacketServiceTsy::NotifyMbmsServiceAvailabilityChange.");
+	
+	// Set request handle
+    iReqHandleType =  EMultimodePacketServiceNotifyMbmsServiceAvailabilityChange;
+
+    return KErrNone;
+	}
+	
+//-----------------------------------------------------------------------------
+// Void CMmPacketServiceTsy::CompleteNotifyMbmsServiceAvailabilityChange
+// Completes notification of MBMS service availability status request 
+//-----------------------------------------------------------------------------
+//	
+void CMmPacketServiceTsy::CompleteNotifyMbmsServiceAvailabilityChangeL(CMmDataPackage* aDataPackage, TInt aResult)
+	{
+	// Reset request handle. Returns the deleted request handle
+	const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+	        EMultimodePacketServiceNotifyMbmsServiceAvailabilityChange ) );
+		
+	// If request handle ok
+	if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+		{
+#ifdef USING_CTSY_DISPATCHER
+		//three defects, 
+		//1) no need to allocate a list all we need is a pointer and we unpack over this
+		//2) PopAndDestroy at the end could cause issues, in the iMBMSMonitoredList null case
+		//3) if completed with an Error,this will cause subsequent  notifys to have no effect as
+		//the request handle has been removed from the store. Here as before the request is completed 
+		//with aResult on aDataPackage or iMBMSMonitoredList being null.
+		if((aResult == KErrNone) && aDataPackage && iMBMSMonitoredList)
+			{
+			CPcktMbmsMonitoredServiceList* updatedMonitorList = NULL;
+			//Unpack necessary data from datapackage
+			aDataPackage->UnPackData(&updatedMonitorList);
+			iMBMSMonitoredList->SetServicesAvailabilityL(updatedMonitorList);
+			}
+		
+		// Complete the client request
+ 	   	CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );
+				
+#else
+		if (aResult == KErrNone)
+			{
+			if (aDataPackage)
+				{
+				if(iMBMSMonitoredList != NULL)
+					{
+					// Create new list for changes
+					CPcktMbmsMonitoredServiceList* updatedMonitorList = CPcktMbmsMonitoredServiceList::NewL();
+					CleanupStack::PushL(updatedMonitorList);
+				
+					//Unpack necessary data from datapackage
+					aDataPackage->UnPackData( &updatedMonitorList );
+					iMBMSMonitoredList->SetServicesAvailabilityL(updatedMonitorList);
+					}
+				// Complete the client request
+		 	   	CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );
+	 	  	 	CleanupStack::PopAndDestroy();		 	   	
+	 	   		}
+	 	   	else
+	 	   		{
+				CMmPacketServiceTsy::ReqCompleted( reqHandle, aResult );	
+	 	   		}
+			}
+#endif //USING_CTSY_DISPATCHER
+		}
+	}					
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::EnumerateMonitorServiceList
+// Enumrates monitored service list
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::EnumerateMonitorServiceList( TInt& aCount, TInt& aMaxAllowed )
+    {
+		if (iMBMSMonitoredList != NULL)
+			{
+			aCount = iMBMSMonitoredList->NumberOfMonitoredList(  );	
+			}
+		else
+			{
+			aCount = 0;
+			}
+    	aMaxAllowed = iMaxMonitoredServices;
+    	
+TFLOGSTRING("TSY: CMmPacketServiceTsy::EnumerateMonitorServiceList." ); 
+      		
+       	// Complete the request with KErrNone
+    	CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );	  
+
+    return KErrNone;
+    } 
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteMaxMonitoredServicesChange
+// Enumrates monitored service list
+//----------------------------------------------------------------------------
+//    
+void CMmPacketServiceTsy::CompleteMaxMonitoredServicesChange( TInt aMaxMonitorValue )
+	{
+	iMaxMonitoredServices = aMaxMonitorValue;
+	}
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::UpdateMbmsMonitorServiceListL
+// Request to update monitored service list
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::UpdateMbmsMonitorServiceListL( TMbmsAction aAction,   
+             TDes8* aList )
+    { 
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
+   	EMultimodePacketServiceUpdateMBMSMonitorServiceList ) );
+    
+    TInt ret( KErrServerBusy ); 
+   
+	if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )  
+		{ 
+		if (iMBMSMonitoredList == NULL)
+			{
+			// create MBMS monitored service list
+	 		iMBMSMonitoredList = CMmMBMSMonitoredList::NewL( this, iMaxMonitoredServices );	
+			}
+		iActionType = aAction;
+		// Save changes of Monitored service list and action
+		ret = iMBMSMonitoredList->SaveUpdateValuesToTempL(aList, aAction); 
+		
+		// temp list was ok
+		if( KErrNone == ret )
+			{
+			// Get correct data packet and send it to LTSY
+			ret = iMBMSMonitoredList->PackDataL();	
+			
+			if ( KErrNone == ret )
+				{
+				// Set request handle type
+				iReqHandleType = EMultimodePacketServiceUpdateMBMSMonitorServiceList;	
+				}
+			}
+		else if( KErrAlreadyExists == ret )
+			{
+			// there were no new entries client tried to supply. Complete with KErrNone
+			// to client to think updating was ok
+			CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+			ret = KErrNone;
+			}
+		else if( KErrNotFound == ret )
+			{
+			// there were no new entries client tried to supply. Complete with KErrNotfound
+			CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
+			ret = KErrNone;
+			}
+		}	
+	
+ 	return ret;	
+    
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteUpdateMbmsMonitorServiceList
+// Completes update monitored service list request
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteUpdateMbmsMonitorServiceList( 
+    CMmDataPackage* aDataPackage, 
+    const TInt aResult)
+	{
+	TFLOGSTRING( "TSY: CMmPacketServiceTsy::CompleteUpdateMbmsMonitorServiceListL." );
+
+	TInt result= aResult;
+	TInt err(KErrNone);
+	// Reset request handle. Returns the deleted request handle
+	const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+	        EMultimodePacketServiceUpdateMBMSMonitorServiceList ) );
+	        
+	if( aResult == KErrNone )
+		{
+		TRAP( err, result = iMBMSMonitoredList->ProcessEntriesL( NULL, iActionType ) );
+		if ( !err )
+		    TRAP( err, CompleteNotifyMbmsServiceAvailabilityChangeL( NULL, aResult ) );		
+		}
+	//there were problem managing entries
+	else if( (aResult == KErrMbmsImpreciseServiceEntries) && (aDataPackage != NULL) )
+		{
+		CPcktMbmsMonitoredServiceList* failedMonitorEntries = NULL;
+		aDataPackage->UnPackData( &failedMonitorEntries ); 
+		// there were a problems with some entries, 
+		// Check failed entries exists and add succesful entries to main list
+		if( failedMonitorEntries != NULL )
+			{
+			TRAP( err, iMBMSMonitoredList->ProcessEntriesL( failedMonitorEntries, iActionType ) );
+			}
+		else // There was a general error, don't add anything to main list
+			{
+			TRAP( err, iMBMSMonitoredList->ResetTempListL() );
+			}
+		}
+	 if( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+		 {
+         // If there was an error due to a function leaving, complete to the client with that error.
+         if (err)
+             {
+             result = err;
+             }
+		 //complete with error to client
+		 CMmPacketServiceTsy::ReqCompleted( reqHandle, result );
+		 }
+	    
+	}
+	
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::UpdateMbmsMonitorServiceListCancel
+// Completes update monitored service list request
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::UpdateMbmsMonitorServiceListCancel( TTsyReqHandle aTsyReqHandle )	
+	{
+	TFLOGSTRING2( "TSY: CMmPacketServiceTsy::UpdateMbmsMonitorServiceListCancel ReqHandle %d", aTsyReqHandle );
+	
+	if ( aTsyReqHandle != EMultimodePacketServiceReqHandleUnknown )
+        {
+        // Reset tsy request handle
+        iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketServiceUpdateMBMSMonitorServiceList );
+
+        // Complete request to client with KErrCancel
+        ReqCompleted( aTsyReqHandle, KErrCancel );
+        }	
+        
+    return KErrNone;
+	}
+
+
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1L
+// Returns size of the monitored service list.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1L(RMobilePhone::TClientId* aClient,  TUint& aBufSize)
+	{
+	TFLOGSTRING("TSY: CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1L called.");
+	// Initialize ret value
+	TInt ret( KErrNone );
+	TInt leaveCode( KErrNone );
+	
+
+	if( !iMBMSMonitoredList )
+		{
+		// No current monitor servece list exist. Complete error.
+		ReqCompleted( iTsyReqHandle, KErrNotFound );
+		}
+	else
+		{
+		// Get current size of monitor service list
+		TRAP( leaveCode, ret = GetSizeOfMonitoredServiceListL( aClient, aBufSize ) );
+		if (leaveCode == KErrNone)
+			{
+			leaveCode = ret;
+			}
+		if ( leaveCode != KErrNone )
+			{
+			ReqCompleted( iTsyReqHandle, leaveCode );
+			}
+		}
+	
+	return leaveCode;
+	}
+
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::GetSizeOfMonitoredServiceList
+// This function returns size of monitored servicelist.
+// ---------------------------------------------------------------------------
+//  
+TInt CMmPacketServiceTsy::GetSizeOfMonitoredServiceListL(RMobilePhone::TClientId* aClient,  TUint& aBufSize)
+	{
+	// read the list, store its content and then return size of this buffer to client
+	TFLOGSTRING("TSY: CMmPacketServiceTsy::GetSizeOfMonitoredServiceList called.");
+	// create new list
+	CPcktMbmsMonitoredServiceList* currentList=CPcktMbmsMonitoredServiceList::NewL();
+	CleanupStack::PushL(currentList);
+	RPacketService::TMbmsServiceAvailabilityV1 entry;
+	
+	if (!iMBMSMonitoredList)
+		{
+		// create MBMS monitored service list
+ 		iMBMSMonitoredList = CMmMBMSMonitoredList::NewL( this, iMaxMonitoredServices );	
+		}
+	
+	// fill TMbmsServiceAvailabilityV1 information
+	for (TInt i=0; i < iMBMSMonitoredList->ServiceList()->Enumerate(); i++)
+		{
+		
+		entry = iMBMSMonitoredList->ServiceList()->GetEntryL(i);
+		// Add the entry into the list, at the next empty location
+		currentList->AddEntryL(entry);
+		}
+	// Store the streamed list and the client ID
+	CListReadAllAttempt* read = CListReadAllAttempt::NewL( aClient );
+	CleanupStack::PushL(read);
+
+	read->iListBuf = currentList->StoreLC();
+	CleanupStack::Pop(); // pop the CBufFlat allocated by StoreLC; iListBuf will be destroy by read destructor 
+	
+	iGetMbmsMonitoredServiceLists->AppendL(read);
+	CleanupStack::Pop(); // pop the CListReadAllAttempt; the read will be destroy in phase 2
+	
+    // return the CBufFlat's size to client
+	aBufSize=(read->iListBuf)->Size();
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::GetSizeOfMonitoredServiceList: size=%d",aBufSize);  	
+    // Complete first phase of list retrieval
+    ReqCompleted( iTsyReqHandle, KErrNone );
+    CleanupStack::PopAndDestroy( currentList ); // Pop & destroy list
+    return KErrNone;	
+	}
+			
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase2
+// Returns monitored service list.
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase2(RMobilePhone::TClientId* aClient, TDes8* aBuf)
+	{
+	// Initialize ret value
+    TInt ret( KErrNotFound );
+    
+	TFLOGSTRING("TSY: CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase2 called");
+	CListReadAllAttempt* read=NULL;
+	
+	// Find the get Mbms monitored services from this client
+	for (TInt i=0; i<iGetMbmsMonitoredServiceLists->Count(); ++i)
+		{
+		// Check that session and client are rigth ones
+		read = iGetMbmsMonitoredServiceLists->At(i);
+		
+		if ((read->iClient.iSessionHandle == aClient->iSessionHandle) &&
+		    (read->iClient.iSubSessionHandle == aClient->iSubSessionHandle))
+			{
+			TPtr8 bufPtr((read->iListBuf)->Ptr(0));
+			
+	  	
+	  		if ( bufPtr.Length() <= aBuf->Length() )
+		  		{
+		  		// Copy the streamed list to the client
+				// Set pointer to list buffer
+				aBuf->Copy( bufPtr );
+				ret = KErrNone;
+				}
+			else
+				{
+				ret = KErrArgument;
+				}
+			
+			// Delete read and item from internal array
+			delete read;
+			iGetMbmsMonitoredServiceLists->Delete(i);
+			
+			// Complete request
+			ReqCompleted(iTsyReqHandle, ret);
+			
+            return ret;
+			}
+		}
+		
+    // Doesn't found the matching client for read all phase 1
+    return ret;	
+	}
+	
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1LCancel
+// Cancels Set Always On request
+//-----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetMbmsMonitoredServicesCancel( TTsyReqHandle aTsyReqHandle )
+	{
+	
+TFLOGSTRING("TSY: CMmPacketServiceTsy::GetMbmsMonitoredServicesPhase1LCancel called");	
+    // Remove the read all attempt
+    CListReadAllAttempt* read = NULL;
+
+    // Check that read all array does not contain any data.
+    // If it does, delete it.
+    // NOTE: functions request mode "Flow control obeyed" currently blocks
+    // request so that only one client can request data at the time.
+    // Therefore, loop-functionality is not needed.
+    if ( iGetMbmsMonitoredServiceLists->Count() > 0 )
+        {
+        read = iGetMbmsMonitoredServiceLists->At( 0 );
+        delete read;
+        iGetMbmsMonitoredServiceLists->Delete( 0 );
+        }
+
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+
+    return KErrNone;	
+	}	
+	
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::MBMSContextList
+// Returns pointer to MBMS context list.
+//----------------------------------------------------------------------------
+//
+CMmMBMSContextList* CMmPacketServiceTsy::MBMSContextList()
+    {
+    return iMBMSContextList;
+    }
+       
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::OpenNewObjectL
+// Creates new Context object and returns a pointer to it.
+//----------------------------------------------------------------------------
+//
+CTelObject* CMmPacketServiceTsy::OpenNewObjectL(
+    TDes& aNewName )  
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. %S", &aNewName );
+    CTelObject* newContext = NULL;
+    TUint8 proxyId( 0 );    
+    TInt ret( KErrNone );
+             
+    if(0 == aNewName.Compare(KMBMSContextName))
+        {
+        ret = iMBMSContextList->GenerateNewContextName( aNewName, proxyId, iMaxActiveServices );
+
+        if( KErrNone != ret )
+            {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. Mbms Leaves with: %d", ret );
+            User::Leave( ret );            
+            }
+            
+        CMmMBMSContextTsy* context = CMmMBMSContextTsy::NewL( this, aNewName, proxyId ); 
+        ret = iMBMSContextList->AddObject( context );
+        if( KErrNone != ret )
+            {
+            // Created context couldn't save.
+            // Call Close() to context to remove it completely
+            context->Close();
+            context = NULL;
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. Mbms Leaves  with: %d", ret );
+            User::Leave( ret );
+            }
+        else
+            {
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::OpenNewObjectL. New MBMS Context Name: %S Proxy Id: %d",&aNewName, proxyId );            
+            newContext = context;            
+            }        
+        }
+    else
+        {            
+        ret = iPacketContextList->GenerateNewContextName( aNewName, proxyId );
+
+        if ( KErrNone != ret )
+            {
+            // Reason to leave is that maximum number of Contexts already exists.
+            // Leaving from here requires that TSY is configurated with max number
+            // of context supported by this phone ( value KMmMaxNumberOfContexts )
+            ret = CMmCommonStaticUtility::EpocErrorCode(
+                KErrOverflow, KErrUmtsMaxNumOfContextExceededByPhone );
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. Leaves with: %d", ret );
+            User::Leave( ret );
+            }
+        CMmPacketContextTsy* context = CMmPacketContextTsy::NewL( this, iHostCID, aNewName, proxyId );
+
+    	// reset cotext name 
+    	iHostCID.Zero();
+        ret = iPacketContextList->AddObject( context, proxyId, 0x00, aNewName );
+        if( KErrNone != ret )
+            {
+            // Created context couldn't save.
+            // Call Close() to context to remove it completely
+            context->Close();
+            context = NULL;
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectL. Leaves with: %d", ret );
+            User::Leave( ret );
+            }
+        else
+            {
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::OpenNewObjectL. New Context Name: %S Proxy Id: %d",&aNewName, proxyId );            
+            newContext = context;            
+            }
+        }               
+    return newContext;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::OpenNewObjectByNameL
+// Returns context object defined in parameter aName.
+//----------------------------------------------------------------------------
+//
+CTelObject* CMmPacketServiceTsy::OpenNewObjectByNameL(
+    const TDesC& aName )   
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL. Context Name: %S", &aName );
+
+    // length of object's name cannot be over 16 chars
+    if ( 16 < aName.Length() )
+        {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL. Leaves with: %d", KErrOverflow  );
+        User::Leave( KErrOverflow  );
+        }
+
+    const TInfoName mmPacketContextName( aName );
+    CMmPacketContextTsy* mmPacketContext = NULL;
+
+    if ( mmPacketContextName.Compare( KStringExternal ) == 0 )
+        {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL :Open Existing Dial-up Object." );
+        mmPacketContext = iDialUpContext;
+        }
+    else if ( mmPacketContextName.Compare( KStringExternal2 ) == 0 )
+        {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL :Open Existing Secondary Dial-up Object." );
+        mmPacketContext = iSecondaryDialUpContext;
+        }
+    else
+        {
+        mmPacketContext =
+            iPacketContextList->PacketContextByName( &mmPacketContextName );
+        }
+
+    // If not found, Leaves
+    if ( NULL == mmPacketContext )
+        {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL. Leaves with: %d", KErrNotFound );
+        User::Leave( KErrNotFound );
+        }
+
+    return mmPacketContext;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::PacketContextList
+// Returns pointer to the context list object.
+//----------------------------------------------------------------------------
+//
+CMmPacketContextList* CMmPacketServiceTsy::PacketContextList()
+    {
+    return iPacketContextList;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::ServiceStatus
+// Returns current status of Packet Service.
+//----------------------------------------------------------------------------
+//
+RPacketService::TStatus CMmPacketServiceTsy::ServiceStatus() const
+    {
+	return iInternalSavedData.iServiceStatus;
+    }
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::DialUpContext
+// Returns externally created dial-up context.
+//----------------------------------------------------------------------------
+//
+CMmPacketContextTsy* CMmPacketServiceTsy::DialUpContext(
+    const TInfoName aContextName )
+    {
+
+    CMmPacketContextTsy* mmpacketContext = NULL;
+
+    if ( aContextName.Compare( KStringExternal ) == 0 )
+        {
+        mmpacketContext = iDialUpContext;
+        }
+
+    else if ( aContextName.Compare( KStringExternal2 ) == 0 )
+        {
+        mmpacketContext =  iSecondaryDialUpContext;
+        }
+
+    return mmpacketContext;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::ResetPointerToDialUpContex
+// Resets pointer to dial-up context.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::ResetPointerToDialUpContext(
+    const TInfoName aContextName )
+    {
+
+    if ( aContextName.Compare( KStringExternal ) == 0 )
+        {
+        iDialUpContext = NULL;
+        }
+
+    else if ( aContextName.Compare( KStringExternal2 ) == 0 )
+        {
+        iSecondaryDialUpContext = NULL;
+        }
+    }
+
+#ifdef REQHANDLE_TIMER
+
+//---------------------------------------------------------------------------
+// CMmPacketServiceTsy::PhoneTsy
+// Returns pointer to the phone tsy object.
+//---------------------------------------------------------------------------
+//
+CMmPhoneTsy* CMmPacketServiceTsy::PhoneTsy()
+    {
+    return iMmPhone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::SetTypeOfResponse
+// Sets the type of response for a given Handle.
+// Automatic mode includes an automatic response in case of non response from
+// the DOS in a specified time.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::SetTypeOfResponse(
+    const TInt aReqHandleType ) 
+    {
+
+    TInt timeOut( 0 );
+
+    switch ( aReqHandleType )
+        {
+        case EMultimodePacketServiceAttach:
+            timeOut = KMmPacketServiceAttachTimeOut;
+            break;
+        case EMultimodePacketServiceDetach:
+            timeOut = KMmPacketServiceDetachTimeOut;
+            break;
+        case EMultimodePacketServiceGetNtwkRegStatus:
+            timeOut = KMmPacketServiceGetNtwkRegStatusTimeOut;
+            break;
+        case EMultimodePacketServiceSetPreferredBearer:
+            timeOut = KMmPacketServiceSetPreferredBearerTimeOut;
+            break;
+        case EMultimodePacketServiceRejectActivationRequest:
+            timeOut = KMmPacketServiceRejectActivationRequest;
+            break;
+        case EMultimodePacketServiceSetAttachMode:
+            timeOut = KMmPacketServiceSetAttachModeTimeOut;
+            break;
+        case EMultimodePacketServiceGetAttachMode:
+            timeOut = KMmPacketServiceGetAttachModeTimeOut;
+            break;
+        case EMultimodePacketServiceSetDefaultContextParams:
+            timeOut = KMmPacketSetDefaultContextParamsTimeOut;
+            break;
+        case EMultimodePacketServiceGetMBMSStatus:
+            timeOut = KMmPacketServiceGetMbmsNetworkServiceStatusTimeOut;
+            break;
+        case EMultimodePacketServiceUpdateMBMSMonitorServiceList:
+            timeOut = KMmPacketServiceUpdateMbmsMonitorServiceListTimeOut;
+            break;            
+        // Can't use timer:
+        //  - all notifications
+        //case EMultimodePacketServiceNotifyNtwkRegStatusChange:
+        //case EMultimodePacketServiceNotifyContextActivationRequested:
+        //case EMultimodePacketServiceNotifyContextAdded:
+        //case EMultimodePacketServiceNotifyDynamicCapsChange:
+        //case EMultimodePacketServiceNotifyMSClassChange:
+        //case EMultimodePacketServiceNotifyStatusChange:
+
+        default:
+            // Does not use timer
+            iTsyReqHandleStore->SetTsyReqHandle(
+                aReqHandleType, iTsyReqHandle );
+            break;
+        }
+
+    if ( 0 < timeOut )
+        {
+        // The timeout parameter is given in seconds.
+        iTsyReqHandleStore->SetTsyReqHandle(
+            aReqHandleType, iTsyReqHandle, timeOut );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::Complete
+// Completes the request due timer expiration
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::Complete(
+    const CTelObject* const aObject, 
+    const TInt aReqHandleType,      
+    const TInt aError )              
+    {
+
+    if ( this == aObject )
+        {
+        // Call service's Complete()
+        Complete( aReqHandleType, aError );
+        }
+    else if ( aObject == iDialUpContext && NULL != iDialUpContext )
+        {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL :Complete Dial-up Object Request." );
+
+        iDialUpContext->Complete( aReqHandleType, aError );
+        }
+    else if ( aObject == iSecondaryDialUpContext 
+              && NULL != iSecondaryDialUpContext )
+        {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::OpenNewObjectByNameL :Complete Dial-up Object Request." );
+
+        iSecondaryDialUpContext->Complete( aReqHandleType, aError );
+
+        }
+    else
+        {
+
+        CMmPacketContextTsy* context;
+
+        const TInt numberOfContexts( iPacketContextList->NumberOfContexts() );
+
+        // Check if the object is a Context object
+        for ( TInt i = 0; i < numberOfContexts; i++ )
+            {
+
+            // Get context object
+            context = iPacketContextList->PacketContextByIndex( i );
+            
+            if (context == NULL)
+            	{
+            	continue;
+            	}
+            // Check if the current context is the object that we are
+            // trying to find
+            if ( context == aObject )
+                {
+                // Call context's Complete() method
+                context->Complete( aReqHandleType, aError );
+                // Object found, break
+                return ;
+                }
+
+            else if ( context->PacketQoSTsy() == aObject )
+                {
+                // Call qos's Complete() method
+                context->PacketQoSTsy()->Complete( aReqHandleType, aError );
+
+                // Object found, break
+                return ;
+                }
+            }  
+           
+        CMmMBMSContextTsy* mbms;
+        
+        const TInt numberOfMbms( iMBMSContextList->GetNumberOfObjects() );
+        
+        for( TInt i = 0; i < numberOfMbms; i++ )
+            {
+            mbms = MBMSContextList( )->ContextByIndex( i );
+            
+            // Check if the current context is the object that we are
+            // trying to find
+            if ( mbms == aObject )
+                {
+                // Call context's Complete() method
+                mbms->Complete( aReqHandleType, aError );
+                // Object found, break
+                return ;
+                }            
+            }          
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::Complete
+// Completes the request due timer expiration.
+//----------------------------------------------------------------------------
+
+void CMmPacketServiceTsy::Complete(
+    const TInt aReqHandleType,    
+    const TInt aError )            
+    {
+    // All possible TSY req handle types are listed in the
+    // switch case below.
+    switch ( aReqHandleType )
+        {
+
+        case EMultimodePacketServiceAttach:
+            CMmPacketServiceTsy::CompleteAttach( aError );
+            break;
+        case EMultimodePacketServiceDetach:
+            TRAP_IGNORE( CMmPacketServiceTsy::CompleteDetachL( aError ));
+            break;
+        case EMultimodePacketServiceGetNtwkRegStatus:
+            CMmPacketServiceTsy::CompleteGetNtwkRegStatus( 
+                RPacketService::EUnknown, aError );
+            break;
+        case EMultimodePacketServiceSetPreferredBearer:
+            CMmPacketServiceTsy::CompleteSetPreferredBearer( aError );
+            break;
+        case EMultimodePacketServiceSetAttachMode:
+            CMmPacketServiceTsy::CompleteSetAttachMode( aError );
+            break;
+        case EMultimodePacketServiceSetDefaultContextParams:
+            CMmPacketServiceTsy::CompleteSetDefaultContextParams( aError );
+            break;
+        case EMultimodePacketServiceGetMBMSStatus:
+            CMmPacketServiceTsy::CompleteGetMbmsNetworkServiceStatus( NULL, aError );
+            break;   
+        case EMultimodePacketServiceEnumerateMbmsActiveServices:
+            CMmPacketServiceTsy::CompleteEnumerateMbmsActiveServiceList( NULL, aError );
+            break;
+        case EMultimodePacketServiceUpdateMBMSMonitorServiceList:
+           CMmPacketServiceTsy::CompleteUpdateMbmsMonitorServiceList( NULL, aError );
+           break;
+
+        // Can't use timer:
+        //  - all notifications
+        //case EMultimodePacketServiceNotifyNtwkRegStatusChange:
+        //case EMultimodePacketServiceNotifyContextActivationRequested:
+        //case EMultimodePacketServiceNotifyContextAdded:
+        //case EMultimodePacketServiceNotifyDynamicCapsChange:
+        //case EMultimodePacketServiceNotifyMSClassChange:
+        //case EMultimodePacketServiceNotifyStatusChange:
+
+        default:
+            CMmPacketServiceTsy::ReqCompleted( iTsyReqHandleStore->
+				ResetTsyReqHandle( aReqHandleType ), aError );
+            break;
+        }
+    }
+#endif // REQHANDLE_TIMER
+
+
+#ifdef TF_LOGGING_ENABLED
+
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::ReqCompleted
+// Overloads CTelObject::ReqCompleted for logging purposes.
+// Prints the aTsyReqHandle and aError variable in the log file and then
+// calls CTelObject::ReqCompleted.
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::ReqCompleted(
+    const TTsyReqHandle aTsyReqHandle,  
+    const TInt aError )                   
+    {
+TFLOGSTRING3("TSY: CMmPacketServiceTsy::Request Completed. TSY Req Handle: %d Error:%d", aTsyReqHandle, aError );
+
+    CTelObject::ReqCompleted( aTsyReqHandle, aError );
+    }
+
+#endif // TF_LOGGING_ENABLED
+
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::PrepareOpenSecondary
+// Prepares to open secondary from given primary context
+// Next Context that client wants to open is secondary context. Secondary
+// context copies configuration from context given by client
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::PrepareOpenSecondary(
+    TDes16* aPrimaryContextName )  
+    {
+
+    if ( aPrimaryContextName->Length() <= iHostCID.MaxLength() )
+        {
+        // Check if primary context exists; return KErrArgument if it doesn't
+        TInfoName primaryContextName = *aPrimaryContextName;
+        CMmPacketContextTsy* mmPacketContextTsy = iPacketContextList->PacketContextByName(&primaryContextName );
+
+        if( NULL == mmPacketContextTsy )
+            {
+            return KErrArgument;        
+            }
+
+        iHostCID = *aPrimaryContextName;
+        // Complete request with ret
+        CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+        return KErrNone;
+        }
+
+    return KErrArgument;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::EnumerateNifs
+// Method returns number of network interfaces
+// call method EnumerateNifs from CMmPacketContextList
+// complete request to client
+// return KErrNone
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::EnumerateNifs(
+    TInt* aCount )   
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::EnumerateNifs." );
+
+    iPacketContextList->EnumerateNifs( aCount );
+
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetNifInfo
+// Return information about network interface
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetNifInfo(
+    TInt* aIndex,                            
+    RPacketService::TNifInfoV2* aNifInfoV2 ) 
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::GetNifInfo." );
+
+    TInt ret = iPacketContextList->GetNifInfo( aIndex, aNifInfoV2 );
+
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::EnumerateContextsInNif
+// Returns number of contexts in Nif
+// get existingContextName from parameter aExistingContextName
+// call method EnumerateContextsInNif from CMmPacketContextList
+// complete request to client
+// return KErrNone
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::EnumerateContextsInNif(
+    TDesC* aExistingContextName,    
+    TInt* aCount )                   
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::EnumerateContextsInNif." );
+
+	TInt ret = KErrNone;
+	if (aExistingContextName->Length() > KMaxInfoName)
+		{
+		ret = KErrArgument;
+		}
+	else
+		{		
+	    TInfoName existingContextName = *aExistingContextName;
+
+	    iPacketContextList->EnumerateContextsInNif( existingContextName, aCount );
+
+	    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+		}
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetContextNameInNif
+// Returns name of context in network interface
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetContextNameInNif(
+    RPacketService::TContextNameInNif* aContextNameInNif,
+    TDes* aContextName )                
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::GetContextNameInNif." );
+
+    TInt ret = iPacketContextList->GetContextNameInNif( aContextNameInNif,
+        aContextName );
+
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::SetDefaultContextParams
+// Sets default context parameters
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::SetDefaultContextParamsL(
+    const TDataPackage& aPackage )
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::SetDefaultContextParamsL." );
+
+    TInt ret(KErrServerBusy);
+
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->GetTsyReqHandle(
+    EMultimodePacketServiceSetDefaultContextParams ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown == reqHandle )
+        {
+		ret = iMmPacketServiceGsmWcdmaExt->
+            SetDefaultContextParamsL( aPackage );
+
+        if ( KErrNone == ret )
+            {
+            // Set req handle
+            iReqHandleType = EMultimodePacketServiceSetDefaultContextParams;
+            }
+        }
+
+    return ret;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteSetDefaultContextParams
+// Completes call SetDefaultContextParameters
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteSetDefaultContextParams(
+    TInt aCause )    
+    {
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteSetDefaultContextParams. aCause: %d", aCause );
+
+    // Reset request handle. Returns the deleted request handle
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodePacketServiceSetDefaultContextParams ) );
+
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+        {
+        // Complete the client request
+        CMmPacketServiceTsy::ReqCompleted( reqHandle, aCause );
+        }
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GetDefaultContextParams
+// Gets default context parameters
+//----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::GetDefaultContextParams(
+    TPacketDataConfigBase* aContextConfig )      
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::GetDefaultContextParams." );
+
+    TInt ret = iMmPacketServiceGsmWcdmaExt->GetDefaultContextParams(
+        aContextConfig );
+
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, ret );
+
+    return KErrNone;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::IsActivationAllowed
+// Returns true if Packet Data is currently allowed
+//----------------------------------------------------------------------------
+//
+TBool CMmPacketServiceTsy::IsActivationAllowed()
+    {
+    TBool isAllowed = ETrue;
+
+    if ( RMobilePhone::ENetworkModeGsm == iCurrentMode &&
+        RPacketService::EMSClassDualMode != iInternalSavedData.iMsClass )
+        {
+        //Check if the object is a Call object
+        for( TInt i = 0; i < iMmPhone->CallList()->GetNumberOfObjects() ; i++ )
+            {
+            //Get call object
+            CMmCallTsy* call = iMmPhone->CallList()->GetMmCallByIndex( i );
+            //check if the current call object exist
+            if( call != NULL )
+                {
+                //call the complete method
+                RCall::TStatus status = call->Status();
+
+                if ( RCall::EStatusUnknown != status &&
+                     RCall::EStatusIdle != status )
+                    {
+    TFLOGSTRING("TSY: CMmPacketServiceTsy::IsActivationAllowed. CS call active, Context Activation not allowed" );
+                    isAllowed = EFalse;
+                    i = iMmPhone->CallList()->GetNumberOfObjects();
+                    }
+                }
+            }
+        }
+
+    return isAllowed;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::MessageManagerBase
+// returns pointer to CMmMessageManager
+//----------------------------------------------------------------------------
+//
+CMmMessageManagerBase* CMmPacketServiceTsy::MessageManager()
+	{
+	return iMessageManager;
+	}
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteNotifyEGprsInfoChange
+// Completes notification t
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteNotifyEGprsInfoChange(
+    CMmDataPackage* aDataPackage )		
+	{
+TFLOGSTRING("TSY: CMmPacketServiceTsy::CompleteNotifyEGprsInfoChange." );
+
+	//Unpack data
+	TBool lastEdgeGprsSupport;
+	aDataPackage->UnPackData( lastEdgeGprsSupport );
+
+	iMmPacketServiceGsmWcdmaExt->SetEdgeGprsSupport( lastEdgeGprsSupport );
+
+	CMmCustomTsy* customTsy = CMmPacketServiceTsy::CustomTsy();
+
+        if ( NULL != customTsy )
+            {
+            CMmPacketTsy* packetTsy = customTsy->PacketTsy();
+
+            if ( NULL != packetTsy )
+                {
+                packetTsy->
+                    CompleteNotifyEGprsInfoChange( lastEdgeGprsSupport );
+                }
+            }
+	}
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::QosTsy
+// Gets pointer to right qos by context name given as parameter.
+//----------------------------------------------------------------------------
+//
+CMmPacketQoSTsy* CMmPacketServiceTsy::QosTsy(
+    TInfoName aMmPacketContextName )
+	{
+	CMmPacketQoSTsy* packetQoSTsy = NULL;
+
+	CMmPacketContextTsy* mmPacketContextTsy = iPacketContextList->
+		PacketContextByName( &aMmPacketContextName );
+
+	if ( NULL != mmPacketContextTsy )
+		{
+		packetQoSTsy = mmPacketContextTsy->PacketQoSTsy();
+		}
+
+	if ( NULL != packetQoSTsy )
+		{
+		return packetQoSTsy;
+		}
+
+	else
+		{
+		return NULL;
+		}
+	}
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::CompleteNetworkModeChange
+// Completes Network Mode Change
+//----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteNetworkModeChange(
+    CMmDataPackage* aDataPackage )  
+    {
+    RMobilePhone::TMobilePhoneNetworkMode ntwkMode( 
+        RMobilePhone::ENetworkModeUnknown );
+    //Unpack data
+    aDataPackage->UnPackData( ntwkMode );
+
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::CompleteNetworkModeChange. ntwkMode: %d", ntwkMode );
+    iCurrentMode = ntwkMode;
+    }
+
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::Context
+// Accessory method to get right context.
+//----------------------------------------------------------------------------
+//
+CMmPacketContextTsy* CMmPacketServiceTsy::ContextTsy(
+    TInfoName& contextName )
+    {
+    CMmPacketContextTsy* mmPacketContextTsy = iPacketContextList->
+        PacketContextByName( &contextName );
+
+    if( NULL == mmPacketContextTsy )
+        {
+        mmPacketContextTsy = iMBMSContextList->ContextByName( contextName );        
+        }
+    return mmPacketContextTsy;
+    }
+    
+//----------------------------------------------------------------------------
+// CMmPacketServiceTsy::GlobalKernelObjectHandle
+// Returns unnamed mutex handle owned by TSY 
+//----------------------------------------------------------------------------
+//
+RHandleBase* CMmPacketServiceTsy::GlobalKernelObjectHandle()
+    {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::GlobalKernelObjectHandle" );
+
+    if ( KNullHandle == iMutex.Handle() )
+        {
+        TInt ret = iMutex.CreateLocal( EOwnerProcess );
+    
+        if ( KErrNone == ret )
+            {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::GlobalKernelObjectHandle - Mutex created" );
+            }
+        else
+            {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::GlobalKernelObjectHandle - Mutex creation failed" );
+            }                  
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmPacketServiceTsy::GlobalKernelObjectHandle - Mutex creation skipped" );
+        }
+         
+    return &iMutex;
+    }
+
+//-----------------------------------------------------------------------------
+// CMmPacketServiceTsy::SetAlwaysOnL
+// Requests Set Always On with mode given as parameter aMode
+//-----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::SetAlwaysOnL(	
+    TTsyReqHandle aTsyReqHandle,
+    RMmCustomAPI::TSetAlwaysOnMode aMode )
+	{
+TFLOGSTRING2("TSY: CMmPacketServiceTsy::SetAlwaysOn Mode = %d", aMode );
+TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CompleteSetAlwaysOn ReqHandle %d", aTsyReqHandle );
+	TInt ret( KErrServerBusy );
+	
+	//Check if request is allready pending
+	TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
+        EMultimodePacketSetAlwaysOn );
+	
+	if( EMultimodePacketServiceReqHandleUnknown == reqHandle )
+		{
+        //Pack 
+		CMmDataPackage data;
+		data.PackData( &aMode );
+		
+		iTsyReqHandleStore->SetTsyReqHandle( 
+            EMultimodePacketSetAlwaysOn, aTsyReqHandle );
+		
+		ret = iMessageManager->HandleRequestL( ECustomSetAlwaysOnMode, &data );
+		
+		if ( KErrNone != ret)
+			{
+			iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketSetAlwaysOn );
+			}
+		}
+	
+	return ret;
+	}
+
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::CompleteSetAlwaysOn
+// Completes Set Always On request 
+//-----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteSetAlwaysOn( 
+    TInt aError )
+	{
+TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CompleteSetAlwaysOn Error %d", aError );	
+
+    const TTsyReqHandle reqHandle( iTsyReqHandleStore->ResetTsyReqHandle(
+            								  EMultimodePacketSetAlwaysOn ) );
+
+TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CompleteSetAlwaysOn ReqHandle %d", reqHandle );
+
+    if ( EMultimodePacketServiceReqHandleUnknown != reqHandle )
+    	{
+    	CMmCustomTsy* customTsy = CMmPacketServiceTsy::CustomTsy();
+
+        if ( NULL != customTsy )
+            {
+            CMmPacketTsy* packetTsy = customTsy->PacketTsy();
+
+            if ( NULL != packetTsy )
+                {
+				packetTsy->CompleteSetAlwaysOn( reqHandle, aError );
+                }
+            }	
+    	}
+	}
+
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::CancelSetAlwaysOn
+// Cancels Set Always On request
+//-----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CancelSetAlwaysOn( 
+    TTsyReqHandle aTsyReqHandle )
+	{
+TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CancelSetAlwaysOn ReqHandle %d", aTsyReqHandle );
+	
+	if ( aTsyReqHandle != EMultimodePacketServiceReqHandleUnknown )
+        {
+        // Reset tsy request handle
+        iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketSetAlwaysOn );
+
+        // Complete request to client with KErrCancel
+        ReqCompleted( aTsyReqHandle, KErrCancel );
+        }
+	}
+
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::EnumerateActiveServiceList
+// Enumerates all active services
+//-----------------------------------------------------------------------------
+//
+TInt CMmPacketServiceTsy::EnumerateMbmsActiveServiceList( TInt &aCount, TInt &aMaxAllowed )
+    {   
+TFLOGSTRING2( "TSY: CMmPacketServiceTsy::EnumerateMbmsActiveServiceList. max: %d", aMaxAllowed );     
+     
+    aCount = EnumerateMbmsActiveServices();
+    aMaxAllowed = iMaxActiveServices;
+    
+TFLOGSTRING3( "TSY: CMmPacketServiceTsy::EnumerateActiveServiceList Count: %d, Max allowed %d", aCount, aMaxAllowed );     
+    // Complete the request with KErrNone
+    CMmPacketServiceTsy::ReqCompleted( iTsyReqHandle, KErrNone );
+    return KErrNone;    
+    }
+    
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::EnumerateMbmsActiveServices
+// Enumerates all active services
+//-----------------------------------------------------------------------------
+//   
+TInt CMmPacketServiceTsy::EnumerateMbmsActiveServices()
+    {
+TFLOGSTRING2( "TSY: CMmPacketServiceTsy::EnumerateMbmsActiveService. max: %d", iMaxActiveServices );     
+    TInt ret( 0 );    
+    
+    for( TInt i = 0; i< iMBMSContextList->NumberOfContexts(); i++ )
+        {
+        CMmMBMSContextTsy* context = iMBMSContextList->ContextByIndex( i );
+        
+        if( RPacketContext::EStatusActive == context->ContextStatus() ||
+            RPacketContext::EStatusReceiving == context->ContextStatus() ||
+            RPacketContext::EStatusSuspended == context->ContextStatus() ||
+            RPacketContext::EStatusDeactivating == context->ContextStatus() )
+            {
+            TInt count = context->SessionCount();
+            if(  0 == count)
+	            {
+	            ret +=1;	
+	            }
+	        else
+		        {
+	            ret += count;	        	
+		        }
+
+            }        
+        }    
+        
+    return ret;
+    }
+    
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::CompleteEnumerateMbmsActiveServiceList
+// Saves the maximum value for active services
+//-----------------------------------------------------------------------------
+//
+void CMmPacketServiceTsy::CompleteEnumerateMbmsActiveServiceList(        
+    CMmDataPackage* aDataPackage,
+    const TInt aResult)
+    {
+TFLOGSTRING2( "TSY: CMmPacketServiceTsy::CompleteEnumerateMbmsActiveServiceList. Error: %d", aResult ); 
+           
+    if( KErrNone == aResult && NULL != aDataPackage )
+        {
+        aDataPackage->UnPackData( iMaxActiveServices );
+        }       
+    }
+    
+//-----------------------------------------------------------------------------
+// TInt CMmPacketServiceTsy::MaximumActiveServices
+// Maximum number of active services
+//-----------------------------------------------------------------------------
+//    
+TInt CMmPacketServiceTsy::MaximumActiveServices()
+    {
+    return iMaxActiveServices;
+    }
+
+//  End of File
+