// 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 "cmmmessagerouterproxy.h"
#include "cmmvoicecalltsy.h"
#include "cmmdatacalltsy.h"
#include "cmmcallextinterface.h"
#include "cmmconferencecalltsy.h"
#include "cmmconferencecallextinterface.h"
#include "cmmphonetsy.h"
#include "cmmlinetsy.h"
#include "cmmnettsy.h"
#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
#include "cmmonstoretsy.h"
#include "cmmenstoretsy.h"
#include "cmmphonebookstoretsy.h"
#include "cmmphoneextinterface.h"
#include "cmmdtmftsy.h"
#include "cmmlinelist.h"
#include "cmmcalllist.h"
#include "cmmpblist.h"
#include "cmmsupplservtsy.h"
#include "Cmmpacketservicetsy.h"
#include "cmmpacketservicegsmwcdmaext.h"
#include "cmmpacketqosgsmwcdmaext.h"
#include "Cmmpacketcontextlist.h"
#include "cmmmbmscontextlist.h"
#include "cmmmbmscontexttsy.h"
#include "CMmCustomTsy.h"
#include "CMmCustomGsmExt.h"
#include "cmmussdtsy.h"
#include "cmmbroadcasttsy.h"
#include "CMmSimLockTsy.h"
#include "CMmWimTsy.h"
#include "CMmSIMTsy.h"
#include "cmmsecuritytsy.h"
#include "cmmsmstsy.h"
#include "cmmsmsstoragetsy.h"
#include "CMmCustomSecurityTsy.h"
#include "ctsydelegates.h"
#include <satcs.h>


CMmMessageRouterProxy::CMmMessageRouterProxy()
    {
    }
    
 CMmMessageRouterProxy* CMmMessageRouterProxy::NewL( 
    CTsyDelegates& aTsyDelegates )
    {
TFLOGSTRING("TSY: CMmMessageRouterProxy::NewL." );    
    CMmMessageRouterProxy* const routerproxy =
        new ( ELeave ) CMmMessageRouterProxy();
    CleanupStack::PushL( routerproxy );
	routerproxy->iTsyDelegates = &aTsyDelegates;
    routerproxy->ConstructL();
    CleanupStack::Pop();
    return routerproxy;	
    }
    
CMmMessageRouterProxy::~CMmMessageRouterProxy()
	{	
	}
	
void CMmMessageRouterProxy::ConstructL()
    {
    }

// ---------------------------------------------------------------------------
// CMmMessageRouterProxy::Complete 
// Complete with a data package
// (other items were commented in a header).
// ---------------------------------------------------------------------------
//
void CMmMessageRouterProxy::Complete( 
    TInt aIpc, 
    CMmDataPackage* aData, 
    TInt aResult )
	{
TFLOGSTRING3("TSY: CMmMessageRouterProxy::Complete. IPC = %d, result: %d", aIpc, aResult);
	RouteCompletion( aIpc, aData, aResult ); 
	}
	
// ---------------------------------------------------------------------------
// CMmMessageRouterProxy::Complete 
// Complete without a data package
// (other items were commented in a header).
// ---------------------------------------------------------------------------
//
void CMmMessageRouterProxy::Complete( TInt aIpc, TInt aResult )
	{    
    CMmDataPackage emptyDataPackage;
	Complete( aIpc, &emptyDataPackage, aResult );
	}
	
// ---------------------------------------------------------------------------
// CMmMessageRouterProxy::RouteCompletion
// Completes a request or notification via the specific Tsy object, based on
// IPC number and data package
// (other items were commented in a header).
// ---------------------------------------------------------------------------
//
EXPORT_C void CMmMessageRouterProxy::RouteCompletion(
    TInt aIpc,
    CMmDataPackage* aDataPackage,
    TInt aResult )
    {
    TRAP_IGNORE( RouteCompletionL( aIpc, aDataPackage, aResult ) );
    }

// ---------------------------------------------------------------------------
// CMmMessageRouterProxy::RouteCompletionL
// Completes a request or notification via the specific Tsy object, based on
// IPC number and data package
// (other items were commented in a header).
// ---------------------------------------------------------------------------
//
void CMmMessageRouterProxy::RouteCompletionL(
    TInt aIpc,
    CMmDataPackage* aDataPackage,
    TInt aResult )
    {
    //Literals used in routing
    _LIT( KStringExternal,  "External"  );
    _LIT( KStringExternal2, "External2" );
    
    //Object to complete
    CBase* mmObject = NULL;
      
     //Get mmObject to complete to
     switch ( aIpc )
        {
        // Call Functionality
        case EMobileCallHold:
        case EEtelCallDial:
        case EEtelCallAnswer:
        case EEtelCallHangUp:
        case EMobileCallResume:
        case EMobileCallSwap:
        case EMobileCallTransfer:
        case EMobileCallGoOneToOne:
        case EMobileCallNotifyMobileCallStatusChange:
        case EMobileCallGetMobileCallInfo:
        case EMobileCallNotifyCallEvent:
        case EMobileConferenceCallGetMobileCallInfo:
        case EMobileCallDialISV:
        case EMobileCallAnswerISV:
        case EMobileCallDialEmergencyCall:
        case EMobileCallReceiveUUI:
        case EMobileCallDialNoFdnCheck: 
        // CSD functionality
        case EMobileCallSetDynamicHscsdParams:
        case EMobileCallNotifyMobileDataCallCapsChange:
        case EMobileCallNotifyHscsdInfoChange:
        case EEtelCallGetCallParams:
        case EEtelCallGetBearerServiceInfo:
        	{
        	TInt callId( -1 );
	        RMobilePhone::TMobileService callMode( 
	            RMobilePhone::EVoiceService );

	        const CCallDataPackage* callData = REINTERPRET_CAST( 
	            const CCallDataPackage*, aDataPackage );

	        callData->GetCallIdAndMode( callId, callMode );

	        //call object can be usually reasoned by Call ID
	        mmObject = REINTERPRET_CAST( CBase*, 
                iMmPhone->CallList()->GetMmCallById( callId ) );	
        	}
            break;
            
		// Line Functionality
        case EEtelLineNotifyCallAdded:
        case EEtelLineNotifyIncomingCall:
        	{
        	TInt callId( -1 );
	        RMobilePhone::TMobileService callMode( 
	            RMobilePhone::EVoiceService );
	            
	        const CCallDataPackage* callData = REINTERPRET_CAST( 
	            const CCallDataPackage*, aDataPackage );
	            
	        callData->GetCallIdAndMode( callId, callMode );

            //correct line object is determined using the call mode
            mmObject = REINTERPRET_CAST( CBase*,
                iMmPhone->LineList()->GetMmLineByMode( callMode ) );
        	}
            break;

        // Conference call functionality
        case EMobileConferenceCallCreateConference:
        case EMobileConferenceCallAddCall:
        case EMobileConferenceCallSwap:
        case EMobileConferenceCallHangUp:
        case EMobileConferenceCallNotifyConferenceStatusChange:
        case EMobileConferenceCallNotifyConferenceEvent:

        // case EMobileConferenceCallGetCaps:
        // case EMobileConferenceCallNotifyCapsChange:
        // case EMobileConferenceCallEnumerateCalls:
        // case EMobileConferenceCallGetConferenceStatus:

        // case EMobileConferenceCallNotifyCapsChangeCancel:
        // case EMobileConferenceCallCreateConferenceCancel:
        // case EMobileConferenceCallAddCallCancel:
        // case EMobileConferenceCallSwapCancel:
        // case EMobileConferenceCallHangUpCancel:
        // case EMobileConferenceCallNotifyConferenceStatusChangeCancel:
        // case EMobileConferenceCallNotifyConferenceEventCancel:
        	mmObject = iTsyDelegates->
                GetTsyObject( CMmMessageManagerBase::EConferenceCallTsy );
            break;
            
		// Phonebook functionality
        // case EMobilePhoneReadDTMFTones:       not supported
        // case EMobilePhoneReadDTMFTonesCancel: not supported
        // case EMobilePhoneStartDTMFTone:                no completion
        // case EMobilePhoneContinueDTMFStringSending:    no completion
        // case EMobilePhoneGetDTMFCaps:                  no DOS call required
        // case EMobilePhoneNotifyDTMFCapsChange:         no DOS call required
        // case EMobilePhoneNotifyDTMFCapsChangeCancel:   no DOS call required
        // case EMobilePhoneNotifyStopInDTMFStringCancel: no DOS call required
        // case EMobilePhoneNotifyDTMFEventCancel: 		  no DOS call required
        case EMobilePhoneNotifyDTMFEvent:
         	mmObject = iTsyDelegates->GetTsyObject( CMmMessageManagerBase::EDtmfTsy );
			break;
			
        case EMmTsyPhoneBookStoreInitIPC:
        case EMmTsyPhoneBookStoreCacheIPC:
        case EMmTsyPhoneBookStoreReadIPC:
        case EMmTsyPhoneBookStoreWriteIPC:
        case EMmTsyPhoneBookStoreGetInfoIPC:
        case EMmTsyPhoneBookStoreDeleteIPC:
        case EMmTsyPhoneBookStoreDeleteAllIPC:
        case EMmTsyPhoneBookStoreResetCacheIPC:
        	{
        	const CPhoneBookDataPackage* phonebookData = REINTERPRET_CAST( 
        	    const CPhoneBookDataPackage*, aDataPackage );

	        TName phoneBookName;
	        phonebookData->GetPhoneBookName( phoneBookName );
TFLOGSTRING2("TSY: CMmMessageRouterProxy::RouteCompletion: PB Name: %S", &phoneBookName);   

	        for( TInt i = 0; i < iMmPhone->PBList()->GetNumberOfObjects(); i++ )
	            {
	            CMmPhoneBookStoreTsy* pbStore = iMmPhone->PBList()->
	                GetMmPBByIndex( i );

	            if ( 0 == pbStore->PhoneBookName()->CompareF( phoneBookName ) )
	                {
	                mmObject = static_cast<CBase*>( pbStore );
	                }
	            }
	        if ( NULL == mmObject )
	            {
TFLOGSTRING("TSY: CMmMessageRouterProxy::RouteCompletion: PB object not found!");
				iMmPhone->SetPBInitActiveStatus( EFalse );
	            }
        	}
            break;
		// ENStore functionality
        case EMmTsyENStoreGetInfoIPC:
        case EMmTsyENStoreReadIPC:
        case EMmTsyENStoreReadAllPhase1IPC:
        	mmObject = iTsyDelegates->
                GetTsyObject( CMmMessageManagerBase::EENStoreTsy  );
            break;
            
		// ONStore functionality
        case EMmTsyONStoreGetInfoIPC:
        case EMmTsyONStoreReadIPC:
        case EMmTsyONStoreWriteIPC:
        case EMmTsyONStoreDeleteIPC:
        case EMmTsyONStoreDeleteAllIPC:
        case EMmTsyONStoreReadAllPhase1IPC:
        case EMmTsyONStoreStoreAllIPC:
		case EMmTsyONStoreReadEntryIPC:
		case EMmTsyONStoreReadSizeIPC:
		case EMmTsyONStoreWriteSizeIPC:
		case EMmTsyONStoreWriteEntryIPC:
        	mmObject = iTsyDelegates->GetTsyObject( 
        	    CMmMessageManagerBase::EONStoreTsy  );
            break;
		
		//Packet data functionality
        case EPacketAttach:
        case EPacketDetach:
        case EPacketGetNtwkRegStatus:
        case EPacketSetAttachMode:
        case EPacketRejectActivationRequest:
        case EPacketGetAttachMode:
        case EPacketSetDefaultContextParams:
        case EPacketNotifyContextAdded:
        case EPacketNotifyStatusChange:
        case EPacketNotifyDynamicCapsChange:
        case EPacketNotifyMSClassChange:
        case EPacketSetPrefBearer:
        case EPacketNotifyChangeOfNtwkRegStatus:
        case EMmTsyNotifyEGprsInfoChangeIPC: // dummy internal IPC
        case EPacketNotifyAttachModeChange:
        case EPacketNotifyContextActivationRequested:
        case EPacketContextInitialiseContext:
        case EPacketQoSSetProfileParams:
        case EPacketQoSNotifyProfileChanged:
        case EPacketNotifyReleaseModeChange:
        case EPacketContextSetConfig:
        case EPacketContextDelete:
        case EPacketContextNotifyDataTransferred:
        case EPacketContextActivate:
        case EPacketContextNotifyConfigChanged:
        case EPacketContextNotifyConnectionSpeedChange:
        case EPacketContextNotifyStatusChange:
        case EPacketContextDeactivate:
        case EPacketContextGetDataVolumeTransferred:
        case EPacketContextModifyActiveContext:
        case ECustomSetAlwaysOnMode:
        case EPacketNotifyTransferCapsIPC:
        case EPacketEnumerateMbmsActiveServiceList:
        case EPacketNotifyMbmsServiceAvailabilityChange:
        case EPacketUpdateMbmsMonitorServiceList:
        case EPacketGetMbmsNetworkServiceStatus:
        case EPacketNotifyMbmsNetworkServiceStatusChange:
        case EPacketContextUpdateMbmsSessionList:
        case EPacketGetStaticCaps:
        case EPacketEnumerateMbmsMonitorServiceList:
        case ECtsyPacketMbmsInitialiseContextComp:
        case ECtsyPacketMbmsContextNotifyConfigChanged:
#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
        case EPacketContextNotifyConnectionInfoChange: 
#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
        	mmObject = REINTERPRET_CAST( 
                CBase*, iMmPhone->PacketDataSession() );
            break;

        // USSD functionality
        case EMobileUssdMessagingSendRelease:
        case EMobileUssdMessagingSendMessage:
        case EMobileUssdMessagingSendMessageNoFdnCheck:
        case EMobileUssdMessagingReceiveMessage:
        case EMobileUssdMessagingNotifyNetworkRelease:
        	mmObject = iTsyDelegates->GetTsyObject( 
        	    CMmMessageManagerBase::EUssdMessagingTsy );
            break;
            
		// Broadcast functionality
        case EMmTsyGsmBroadcastNotifyMessageReceived:
        case EMmTsyWcdmaBroadcastNotifyMessageReceived:
        case EMobileBroadcastMessagingReceiveMessage:
        case EMobileBroadcastMessagingReceiveMessageCancel:
        case EMobileBroadcastMessagingSetFilterSetting:
        case EMobileBroadcastMessagingSetLanguageFilter:
        case EMobileBroadcastMessagingStoreIdList:
        	mmObject = iTsyDelegates->GetTsyObject(  
        	    CMmMessageManagerBase::EBroadcastMessagingTsy );
			break;
			
		// SMS functionality
        case EMobileSmsMessagingGetMessageStoreInfo:
        case EMmTsyActivateSmsRouting:
        case EMmTsyDeactivateSmsRouting:
        case EMobileSmsMessagingReceiveMessage:
        case EMobileSmsMessagingSendMessage:
        case EMobileSmsMessagingSendMessageNoFdnCheck: 
        case EMmTsySmsSendSatMessage:
        case EMobileSmsMessagingResumeSmsReception:
        case EMobileSmsMessagingGetSmspListPhase1:
        case EMobileSmsMessagingStoreSmspList:
        case EMobileSmsMessagingAckSmsStored:
        case EMobileSmsMessagingNackSmsStored:
        case EMobileSmsMessagingSetMoSmsBearer:
        	mmObject = iTsyDelegates->GetTsyObject(  
        	    CMmMessageManagerBase::ESmsMessagingTsy );
            break;
            
		// Storage functionality
        case EMobilePhoneStoreGetInfo:
        case EMobilePhoneStoreDelete:
        case EMobilePhoneStoreDeleteAll:
        case EMobilePhoneStoreRead:
        case EMobilePhoneStoreWrite:
        case EMobilePhoneStoreReadAllPhase1:
        	mmObject = iTsyDelegates->GetTsyObject(  
        	    CMmMessageManagerBase::EPhoneStoreTsy );
            break;

        // Custom Tsy functionality
        case ECustomCancelUssdSessionIPC:
        case ECustomSsAdditionalInfoNotificationIPC:
        case ECustomNotifySsNetworkEventIPC:
        case ECustomNotifySsRequestCompleteIPC:
        case ECustomNotifyDtmfEventIPC:
        case ECustomGetDiagnosticOctetsIPC:
        case ECustomGetRemoteAlertingToneStatusIPC:
        case ECustomClearCallBlackListIPC:
        case ECustomCheckEmergencyNumberIPC:
        case ECustomGetLifeTimeIPC:
        case ECustomTerminateCallIPC:
        case ECustomGetAlsBlockedIPC:
        case ECustomSetAlsBlockedIPC:
        case ECustomCheckAlsPpSupportIPC:
        case ECustomCheckTwoDigitDialSupportIPC:
        case ECustomGetCipheringInfoIPC:
        case ECustomNotifyCipheringInfoChangeIPC:
        case ECustomNotifyNSPSStatusIPC:
        case ECustomNetWakeupIPC:
        case ECustomGetOperatorNameIPC:
        case ECustomResetNetServerIPC:
        case ECustomNotifyNetworkConnectionFailureIPC:
        case ECustomGetSystemNetworkModesIPC:
        case ECustomSetSystemNetworkModeIPC:
        case ECustomGetNetworkProviderNameIPC:
        case ECustomGetCurrentSystemNetworkModesIPC:
        case ECustomSatRefreshCompleteNotificationIPC:
        case ECustomReadSimFileIPC:
        case ECustomSimLockActivateIPC:
        case ECustomSimLockDeActivateIPC:
        case ECustomSendAPDUReqIPC:
        case ECustomSimWarmResetIPC:
        case ECustomGetATRIPC:
        case ECustomSendAPDUReqV2IPC:
        case ECustomGetSimCardReaderStatusIPC:
        case ECustomNotifySimCardStatusIPC:
        case ECustomPowerSimOnIPC:
        case ECustomPowerSimOffIPC:
        case ECustomStartSimCbTopicBrowsingIPC:
        case ECustomDeleteSimCbTopicIPC:
        case EReadViagHomeZoneParamsIPC:
        case EReadViagHomeZoneCacheIPC:
        case EWriteViagHomeZoneUHZIUESettingsIPC:
        case EWriteViagHomeZoneCacheIPC:
        case ECustomGetSimAuthenticationDataIPC:
        case ECustomSetDriveModeIPC:
        case ECustomNotifyRauEventIPC:
        case ECustomReadHSxPAStatusIPC:
        case ECustomWriteHSxPAStatusIPC:
        case ECustomNotifyHSxPAStatusIPC:
        case ECustomGetIccCallForwardingStatusIPC:
        case ECustomNotifyIccCallForwardingStatusChangeIPC:
        case ECustomGetCellInfoIPC:
        case ECustomNotifyCellInfoChangeIPC:
        case ECustomGetBandSelectionIPC:
        case ECustomSetBandSelectionIPC:
        case ECustomNotifyRemoteAlertingToneStatusChangeIPC:
        case ECustomGetServiceTableSupportbyApplicationIPC:
        case ECustomGetProgrammableOperatorLogoIPC:
        	mmObject = iTsyDelegates->GetTsyObject( 
        	    CMmMessageManagerBase::ECustomTsy );
            break;

        // Security (Custom) functionality
        case ECustomIsBlockedIPC:
        case ECustomCheckSecurityCodeIPC:
        //case ECustomCheckEmergencyNumberIPC:
        //case ECustomSatRefreshCompleteNotificationIPC:
        case ECustomDisablePhoneLockIPC:
        case ECustomCheckSecurityCodeCancelIPC:
        case EMmTsySecurityGetSimActivePinStateIPC:
        	mmObject = iTsyDelegates->GetTsyObject( 
        	    CMmMessageManagerBase::ESecurityTsy );
            break;
        // This is a special case
        case EMobileCallNotifyPrivacyConfirmation:
            break; 
        default:
        	mmObject = iTsyDelegates->GetTsyObject( 
        	    CMmMessageManagerBase::EPhoneTsy );
            break;
        }
        
	// Route completion to right TSY 	
    if ( NULL != mmObject )
        {
        switch ( aIpc )
            {
            case EMobileCallHold:                
                static_cast<CMmVoiceCallTsy*>( mmObject )->
                    CompleteHold( aResult );
                break;
            case EMobileCallDialNoFdnCheck:
            	static_cast<CMmCallTsy*>( mmObject )->
                	CompleteDialNoFdn( aResult );
            	break;
            case EEtelCallDial:
            case EMobileCallDialISV:                
                static_cast<CMmCallTsy*>( mmObject )->
                    CompleteDial( aResult );
                break;                
            case EEtelCallAnswer:
            case EMobileCallAnswerISV:                
                static_cast<CMmCallTsy*>( mmObject )->
                    CompleteAnswerIncomingCall( aResult );
                break;                
            case EEtelCallHangUp:                
                static_cast<CMmCallTsy*>( mmObject )->
                    CompleteHangUp( aResult );
                break;                
            case EMobileCallResume:                
                static_cast<CMmVoiceCallTsy*>( mmObject )->
                    CompleteResume( aResult );
                break;                
            case EMobileCallSwap:                
                static_cast<CMmVoiceCallTsy*>( mmObject )->
                    CompleteSwap( aResult );
                break;                
            case EMobileCallTransfer:                
                static_cast<CMmVoiceCallTsy*>( mmObject )->
                    CompleteTransfer( aResult );
                break;                
            case EMobileCallGoOneToOne:                
                static_cast<CMmVoiceCallTsy*>( mmObject )->
                    CompleteGoOneToOne( aResult );
                break;                
            case EMobileCallNotifyMobileCallStatusChange:                
                static_cast<CMmCallTsy*>( mmObject )->
                    CompleteNotifyStatusChange( aResult, aDataPackage );
                // phone idicator status may change
                iMmPhone->CompleteNotifyIndicatorChange();
                break;                
            case EMobileCallGetMobileCallInfo:                
                static_cast<CMmCallTsy*>( mmObject )->
                    CompleteNotifyMobileCallInfoChange( aDataPackage );
                break;                
            case EMobileCallNotifyCallEvent:                
                static_cast<CMmCallTsy*>( mmObject )->
                    CompleteNotifyRemoteCallEvent( aDataPackage );
                break;
            case EMobileCallReceiveUUI:                
                static_cast<CMmVoiceCallTsy*>( mmObject )->
                    CompleteReceiveUUI( aDataPackage, aResult );
                break;
            case EMobileConferenceCallGetMobileCallInfo:                
                static_cast<CMmCallTsy*>( mmObject )->
                    CompleteNotifyMobileCallInfoChange( aDataPackage );
                break;                
            case EEtelLineNotifyCallAdded:                
                static_cast<CMmLineTsy*>( mmObject )->
                    CompleteNotifyAddBypassingCall( aDataPackage );
                break;                
            case EEtelLineNotifyIncomingCall:                
                static_cast<CMmLineTsy*>( mmObject )->
                    CompleteNotifyIncomingCall( aDataPackage );
                break;                
            case EMobilePhoneSetNetworkSelectionSetting:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteSetNetworkSelectionSetting( aResult );
                break;                
            case EMobilePhoneNotifyNetworkRegistrationStatusChange:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteNotifyNetworkRegistrationStatusChange( 
                    aDataPackage, aResult );
                // phone indicator status may change
                iMmPhone->CompleteNotifyIndicatorChange();
                break;                
            case EMobilePhoneNotifyModeChange:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteNotifyModeChange( aDataPackage, aResult );
                break;                
            case EMobilePhoneNotifyCurrentNetworkChange:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteNotifyCurrentNetworkChange( 
                    aDataPackage, aResult );
                break;                
            case EMobilePhoneNotifyNetworkSelectionSettingChange:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteNotifyNetworkSelectionSettingChange( 
                                                          aDataPackage );
                break;                
            case EMobilePhoneSelectNetwork:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteSelectNetwork( aResult );
                break;                
            case EMobilePhoneGetDetectedNetworksV2Phase1:
                {
                CMmNetTsy* netTsy = 
                    static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy();

                netTsy->ProcessGetDetectedNetworksPhase1L(  
                    aDataPackage, aResult );
                break;
                }
            case EMobilePhoneAuthorizationInfoPhase1:
                {
                CMmNetTsy* netTsy = 
                    static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy();                
                netTsy->ProcessGetAuthorizationInfoPhase1L(
                    aDataPackage, aResult );
                break;
                }
            case EMobilePhoneGetHomeNetwork:
                {
                CMmPhoneTsy* phoneTsy = 
                    static_cast<CMmPhoneTsy*>( mmObject );
                static_cast<CMmPhoneExtInterface*>( phoneTsy->
                    PhoneExtInterface() )->CompleteGetHomeNetwork( 
                    aDataPackage );
                break;
                }
			case EMmTsySimRefreshRegisterIPC:
            	{
            	CMmPhoneTsy* phoneTsy =
                	static_cast<CMmPhoneTsy*>( mmObject );
            	phoneTsy->CompleteSimRefreshRegister( aResult );
            	break;
            	}
            case EMobilePhoneGetDetectedNetworksCancel:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteGetDetectedNetworksCancel( aResult );
                break;
            case EMobilePhoneSelectNetworkCancel:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteSelectNetworkCancel( aResult );
                break;
            case EMobilePhoneNotifySignalStrengthChange:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteNotifySignalStrengthChange( aDataPackage );
                break;
            case EMobilePhoneNotifyNITZInfoChange:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteNotifyNITZInfoChange( aDataPackage );
                break;
            case ECtsyPhoneCellInfoComp:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteCellInfoReq( aDataPackage, aResult );
                break;            	            	
            case ECtsyPhoneCellInfoIndComp:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                	CompleteCellInfoIndReq( aDataPackage, aResult );
                break;            	
            case EMobilePhoneGetNetworkRegistrationStatus:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteGetNetworkRegistrationStatus( aResult );
                break;
            case EMobilePhoneGetCipheringIndicatorStatus:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteGetCipheringIndicatorStatus( 
                    aDataPackage, aResult );
                break;
            case EMobilePhoneNotifyNetworkSecurityLevelChange:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteNotifyNetworkSecurityLevelChange( 
                    aDataPackage );
                break;
            
      		case EMobilePhoneGetCurrentActiveUSimApplication:
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    CompleteGetCurrentActiveUSimApplication( 
                    aDataPackage, aResult );
                break;                                
#ifdef USING_CTSY_DISPATCHER
    		case ECtsyUpdateLifeTimeComp:
            	{
            	CMmPhoneTsy* phoneTsy =
                	static_cast<CMmPhoneTsy*>( mmObject );
            	phoneTsy->CompleteUpdateLifeTimer( aResult );
            	break;
            	}
#else
				case EMmTsyUpdateLifeTimeIPC:
            	{
            	CMmPhoneTsy* phoneTsy =
                	static_cast<CMmPhoneTsy*>( mmObject );
            	phoneTsy->CompleteUpdateLifeTimer( aResult );
            	break;
            	}                                 
#endif //USING_CTSY_DISPATCHER
      		case ECtsyPhoneTerminateAllCallsComp:
      			static_cast<CMmPhoneTsy*>( mmObject )->
      				CompleteTerminateAllCallsReq( aResult );
      			break;
            case ECtsyPhoneTerminateActiveCallsComp:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteTerminateActiveCallsReq( aResult );
                break;
                
            // Conference call functionality
            case EMobileConferenceCallCreateConference:                
                static_cast<CMmConferenceCallTsy*>( mmObject )->
                    CompleteCreateConference( aResult );
                break;                
            case EMobileConferenceCallAddCall:                
                static_cast<CMmConferenceCallTsy*>( mmObject )->
                    CompleteAddCall( aResult );
                break;                
            case EMobileConferenceCallSwap:                
                static_cast<CMmConferenceCallTsy*>( mmObject )->
                    CompleteSwap( aResult );
                break;                
            case EMobileConferenceCallHangUp:                
                static_cast<CMmConferenceCallTsy*>( mmObject )->
                    CompleteHangUp( aResult );
                break;                
            case EMobileConferenceCallNotifyConferenceStatusChange:                
                static_cast<CMmConferenceCallTsy*>( mmObject )->
                    CompleteNotifyConferenceStatusChange();
                break;                
            case EMobileConferenceCallNotifyConferenceEvent:
                static_cast<CMmConferenceCallTsy*>( mmObject )->
                    GetActiveConferenceCallExtension()->
                    CompleteNotifyConferenceEvent( aDataPackage );
                break;
            // case EMobileConferenceCallGetCaps:
            // case EMobileConferenceCallNotifyCapsChange:
            // case EMobileConferenceCallEnumerateCalls:
            // case EMobileConferenceCallGetConferenceStatus:

            // case EMobileConferenceCallNotifyCapsChangeCancel:
            // case EMobileConferenceCallCreateConferenceCancel:
            // case EMobileConferenceCallAddCallCancel:
            // case EMobileConferenceCallSwapCancel:
            // case EMobileConferenceCallHangUpCancel:
            // case EMobileConferenceCallNotifyConferenceStatusChangeCancel:
            // case EMobileConferenceCallNotifyConferenceEventCancel:

            // DTMF functionality
            case EMobilePhoneSendDTMFTones:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetDtmfTsy()->
                    CompleteSendDTMFTones( aResult );
                break;
#ifdef USING_CTSY_DISPATCHER
            case EMobilePhoneStartDTMFTone:
            	static_cast<CMmPhoneTsy*>( mmObject )->GetDtmfTsy()->
            		CompleteStartDTMFTone( aResult );
            	break;
            case EMobilePhoneStopDTMFTone:
            	static_cast<CMmPhoneTsy*>( mmObject )->GetDtmfTsy()->
            		CompleteStopDTMFTone( aResult );
            	break;
#else
            case EMobilePhoneStopDTMFTone:
#endif //USING_CTSY_DISPATCHER             	
            case EMobilePhoneSendDTMFTonesCancel:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetDtmfTsy()->
                    CompleteSendDTMFTonesCancel( aResult );
                break;                
            case EMobilePhoneNotifyStopInDTMFString:
                static_cast<CMmPhoneTsy*>( mmObject )->GetDtmfTsy()->
                    CompleteNotifyStopInDTMFString( aDataPackage );
                break;

            // case EMobilePhoneReadDTMFTones:       not supported
            // case EMobilePhoneReadDTMFTonesCancel: not supported
            // case EMobilePhoneStartDTMFTone:                no completion
            // case EMobilePhoneContinueDTMFStringSending:    no completion
            // case EMobilePhoneGetDTMFCaps:                  no DOS call required
            // case EMobilePhoneNotifyDTMFCapsChange:         no DOS call required
            // case EMobilePhoneNotifyDTMFCapsChangeCancel:   no DOS call required
            // case EMobilePhoneNotifyDTMFEventCancel:		  no DOS call required
            // case EMobilePhoneNotifyStopInDTMFStringCancel: no DOS call required

            case EMobilePhoneNotifyDTMFEvent: 				//no DOS call required
	           	// unpack result: a RMobilePhone::TMobilePhoneDTMFEvent
				TInt dtmfInfo;
				aDataPackage->UnPackData( dtmfInfo );
				static_cast<CMmDtmfTsy*>( mmObject )->CompleteNotifyDTMFEvent( dtmfInfo );
				break;
            case EMmTsyPhoneBookStoreInitIPC:                
                {
                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                    CompletePBStoreInitializationL( 
                    aResult, aDataPackage );
                    TBool done = EFalse;
                    
                    // NOTE: The statement above is redundant, as the loop below calls CompletePBStoreInitializationL
                    // on every phonebook store. However, we need to be certain that changing the order in which
                    // phonebook stores are initialised won't introduce side effects. (One future improvement)
                    for( TInt i = 0; i < iMmPhone->PBList()->GetNumberOfObjects(); i++ )
        	            {
TFLOGSTRING("TSY: CMmMessageRouterProxy::RouteCompletion:EMmTsyPhoneBookStoreInitIPC for loop, check init statuses ");
        	            CMmPhoneBookStoreTsy* pbStore = iMmPhone->PBList()->
        	                GetMmPBByIndex( i );
                        done = pbStore->IsPBInitDone();
TFLOGSTRING3("TSY: CMmMessageRouterProxy::RouteCompletion: active: %i, done: %i",iMmPhone->IsPBInitActive(), done);
        	            if ( iMmPhone->IsPBInitActive() && !done ) 
        	                {
TFLOGSTRING2("TSY: CMmMessageRouterProxy::RouteCompletion: complete also to: %S",pbStore->PhoneBookName());
        	                mmObject = static_cast<CBase*>( pbStore );
        	                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                                CompletePBStoreInitializationL( 
                                    aResult, aDataPackage );
        	                }
        	            }
                iMmPhone->SetPBInitActiveStatus( EFalse );    
                }
                break;                
            case EMmTsyPhoneBookStoreCacheIPC:                
                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                    CompleteCachingL( aResult, aDataPackage );
                break;                
            case EMmTsyPhoneBookStoreReadIPC:                
                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                    CompleteReadL( aResult, aDataPackage );
                break;                
            case EMmTsyPhoneBookStoreWriteIPC:                
                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                    CompleteWriteL( aResult, aDataPackage );
                break;                
            case EMmTsyPhoneBookStoreGetInfoIPC:                
                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                    CompleteCountEntries( aResult, aDataPackage );
                break;                
            case EMmTsyPhoneBookStoreDeleteIPC:                
                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                    CompleteDeleteL( aResult, aDataPackage );
                break;                
            case EMmTsyPhoneBookStoreDeleteAllIPC:                
                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                    CompleteDeleteAll( aResult, aDataPackage );
                break;                
            case EMmTsyPhoneBookStoreResetCacheIPC:                
                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                    ResetCacheReady();
                static_cast<CMmPhoneBookStoreTsy*>( mmObject )->
                    ResetCache();
                break;                
            
            // CSD functionality
            case EEtelPhoneNotifyModemDetected:
                {
                RPhone::TStatus* modemStatus = NULL;
                //unpack the data
                aDataPackage->UnPackData( &modemStatus );
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteNotifyModemDetected( *modemStatus );
                break;
                }
            case EMobileCallSetDynamicHscsdParams:                
                static_cast<CMmDataCallTsy*>( mmObject )->
                    CompleteSetDynamicHscsdParams( aResult );
                break;                
            case EMobileCallNotifyMobileDataCallCapsChange:                
                static_cast<CMmDataCallTsy*>( mmObject )->
                    ActiveCallExtension()->
                    ReceivedMobileDataCallCaps( aDataPackage );
                break;                
            case EMobileCallNotifyHscsdInfoChange:                
                static_cast<CMmDataCallTsy*>( mmObject )->
                    ActiveCallExtension()->ReceivedHscsdInfo( 
                    aDataPackage );
                break;                
            case EEtelCallGetCallParams:                
                static_cast<CMmCallTsy*>( mmObject )->
                ActiveCallExtension()->ReceivedCallParams( aDataPackage );
                break;                
            case EEtelCallGetBearerServiceInfo:
                {
                RCall::TBearerService* bearerService = NULL;
                aDataPackage->UnPackData( &bearerService );
                static_cast<CMmCallTsy*>( mmObject )->
                    ActiveCallExtension()->ReceivedBearerServiceInfo( 
                    *bearerService );
                break;
                }
            case EMmTsyENStoreGetInfoIPC:                
                static_cast<CMmENStoreTsy*>( mmObject )->CompleteGetInfo(
                    aResult, aDataPackage );
                break;                
            case EMmTsyENStoreReadIPC:                
                static_cast<CMmENStoreTsy*>( mmObject )->CompleteRead(
                    aResult, aDataPackage );
                break;                
            case EMmTsyENStoreReadAllPhase1IPC:                
                static_cast<CMmENStoreTsy*>( mmObject )->
                        CompleteReadAllPhase1L( aResult, aDataPackage );
                break;                
            case EMmTsyONStoreGetInfoIPC:                
                static_cast<CMmONStoreTsy*>( mmObject )->CompleteGetInfo(
                    aResult, aDataPackage );
                break;                
            case EMmTsyONStoreReadIPC:                
                static_cast<CMmONStoreTsy*>( mmObject )->CompleteRead(
                    aResult, aDataPackage );
                break;                
            case EMmTsyONStoreWriteIPC:                
                static_cast<CMmONStoreTsy*>( mmObject )->CompleteWrite(
                    aResult, aDataPackage );
                break;                
            case EMmTsyONStoreDeleteIPC:                
                static_cast<CMmONStoreTsy*>( mmObject )->CompleteDelete(
                    aResult );
                break;                
            case EMmTsyONStoreDeleteAllIPC:                
                static_cast<CMmONStoreTsy*>( mmObject )->
                    CompleteDeleteAll( aResult );
                break;
            case EMmTsyONStoreReadAllPhase1IPC:
                static_cast<CMmONStoreTsy*>( mmObject )->
                    CompleteReadAllPhase1L();
                break;
            case EMmTsyONStoreReadEntryIPC:
   				STATIC_CAST( CMmONStoreTsy*, mmObject )->
                    InternalRetrieveONListReadEntryL( 
                    aResult, aDataPackage );
                break;
            case EMmTsyONStoreReadSizeIPC:
                STATIC_CAST( CMmONStoreTsy*, mmObject )->
                    InternalRetrieveONListReadSizeL( 
                    aResult, aDataPackage );
                break;
            case EMmTsyONStoreWriteSizeIPC:
                STATIC_CAST( CMmONStoreTsy*, mmObject )->
                    InternalStoreAllGetSizeL( aResult, aDataPackage );
                break;
            case EMmTsyONStoreWriteEntryIPC:
   				STATIC_CAST( CMmONStoreTsy*, mmObject )->
                    InternalStoreAllWriteEntryL( aResult );
                break;
            case EPacketAttach:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                ActivePacketServiceExtension()->CompleteAttach( 
                    aResult );
	            break;	            
	        case EPacketDetach:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                ActivePacketServiceExtension()->CompleteDetachL( 
                    aResult );
	            break;	            
	        case EPacketGetNtwkRegStatus:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                ActivePacketServiceExtension()->
                    CompleteGetNtwkRegStatus( aDataPackage, aResult );
	            break;	            
	            
	        case ECustomSetAlwaysOnMode:
            	STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
                    CompleteSetAlwaysOn( aResult );
            	break;	            
	        case EPacketSetAttachMode:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                ActivePacketServiceExtension()->CompleteSetAttachMode( 
	                aResult );
	            break;	            
	        case EPacketRejectActivationRequest:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                CompleteRejectActivationRequest();
	            break;	            
	        case EPacketGetAttachMode:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                ActivePacketServiceExtension()->CompleteGetAttachMode(
	                aDataPackage, aResult );
	            break;	            
	        case EPacketSetDefaultContextParams:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                ActivePacketServiceExtension()->
	                CompleteSetDefaultContextParams( aResult );
	            break;	            
	        case EPacketNotifyContextAdded:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                CompleteNotifyContextAdded( aDataPackage);
	            break;	            
	        case EPacketNotifyStatusChange:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                CompletePacketStatusChanged( aDataPackage, aResult );
	            break;	            
	        case EPacketNotifyDynamicCapsChange:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                ActivePacketServiceExtension()->
                    CompleteDynamicCapsChange( aDataPackage );
	            break;	            
            case EPacketNotifyTransferCapsIPC:                  
                STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
                    ActivePacketServiceExtension()->
                    CompleteTransferCapsChange( aDataPackage );
	            break;   	                	            
	        case EPacketNotifyMSClassChange:	          
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                CompleteNotifyMSClassChange( aDataPackage );
	            break;	            
	        case EPacketSetPrefBearer:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                ActivePacketServiceExtension()->
                    CompleteSetPreferredBearer( aResult );
	            break;	            
	        case EPacketNotifyChangeOfNtwkRegStatus:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                CompleteNotifyChangeOfNtwkRegStatus( aDataPackage, aResult );
	            break;	            
	        case EMmTsyNotifyEGprsInfoChangeIPC:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                CompleteNotifyEGprsInfoChange( aDataPackage );
	            break;	            
	        case EPacketNotifyAttachModeChange:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                PreferredBearerChanged( aDataPackage );
	            break;	            
	        case EPacketNotifyContextActivationRequested:	            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                CompleteNotifyContextActivationRequested( 
                        aDataPackage );
	            break;	            
            case EPacketNotifyMbmsNetworkServiceStatusChange:
            	static_cast<CMmPacketServiceTsy*>(mmObject)->
            	CompleteNotifyMbmsNetworkServiceStatusChange(aDataPackage, aResult);
            	break;
            case EPacketNotifyMbmsServiceAvailabilityChange:
            	static_cast<CMmPacketServiceTsy*>(mmObject)->
            	CompleteNotifyMbmsServiceAvailabilityChangeL(aDataPackage, aResult);
            	break;
            case EPacketGetMbmsNetworkServiceStatus:
            	static_cast<CMmPacketServiceTsy*>(mmObject)->
            	CompleteGetMbmsNetworkServiceStatus(aDataPackage, aResult);
            	break;
            case EPacketGetStaticCaps:
            	static_cast<CMmPacketServiceTsy*>(mmObject)->
            	ActivePacketServiceExtension()->CompleteGetStaticCaps(aDataPackage, aResult);
            	break;
            case EPacketEnumerateMbmsMonitorServiceList:
            	{
            	if (KErrNone == aResult)
                    { 
                    TInt maxMonitorValue;
                    aDataPackage->UnPackData( maxMonitorValue );
                    static_cast<CMmPacketServiceTsy*>(mmObject)->CompleteMaxMonitoredServicesChange( maxMonitorValue );
                    }	
            	}
            	break;	
            case EPacketUpdateMbmsMonitorServiceList: 
	            static_cast<CMmPacketServiceTsy*> ( mmObject )
	                ->CompleteUpdateMbmsMonitorServiceList( aDataPackage, 
	                    aResult );	            
                break;
	        case EPacketContextInitialiseContext:
	            {
	            TInfoName* contextName = NULL;
#ifdef USING_CTSY_DISPATCHER
	            TDesC* channelId = NULL;
	            aDataPackage->UnPackData(&contextName, &channelId);
	            __ASSERT_DEBUG(contextName,User::Invariant());
	            __ASSERT_DEBUG(channelId,User::Invariant());
#else
	            aDataPackage->UnPackData( &contextName);
#endif //USING_CTSY_DISPATCHER	            
	            
	            CMmPacketServiceTsy* serviceTsy = static_cast<CMmPacketServiceTsy*> (mmObject);
	                
	            CMmPacketContextTsy* mmPacketContextTsy = 
	                serviceTsy->ContextTsy( *contextName );
                    	            
	            if( NULL != mmPacketContextTsy && 
	            	mmPacketContextTsy->ContextType( ) == 
	            	CMmPacketContextTsy::EContextTypePacketContext )
	                {
	                CMmPacketContextGsmWcdmaExt* mmPacketContextExt =
	                    mmPacketContextTsy->PacketContextGsmWcdmaExt();
	                if( NULL != mmPacketContextExt )
	                    {
#ifdef USING_CTSY_DISPATCHER	                    
                        mmPacketContextExt->CompleteInitialiseContext(*channelId, aResult);
#else	                    
                            // The initialise context API will return the context name as the channelId.
                            mmPacketContextExt->CompleteInitialiseContext(aResult);
#endif //USING_CTSY_DISPATCHER                       
	                    }
	                }
	            break;
	            }
	            
	        case ECtsyPacketMbmsInitialiseContextComp:
	        	{
	        	TInfoName* contextName = NULL;
	        	RPacketContext::TDataChannelV2* dataChannelV2 = NULL;
	        	aDataPackage->UnPackData( &contextName, &dataChannelV2 );
	            CMmPacketServiceTsy* serviceTsy = static_cast<CMmPacketServiceTsy*> (mmObject);

	            CMmPacketContextTsy* mmPacketContextTsy = serviceTsy->ContextTsy( *contextName );
	        	
	        	CMmMBMSContextTsy* context = static_cast<CMmMBMSContextTsy*>  ( mmPacketContextTsy );
	        	
	        	if( NULL != context )
	        	   {
	        	   context->CompleteInitialiseContext( aResult, dataChannelV2 );	                    
	        	   }        		        
	        	break;
	        	}
	        	
	        case EPacketQoSSetProfileParams:
	            {
	            TInfoName mmPacketContextName;
	            aDataPackage->UnPackData( mmPacketContextName );

	            CMmPacketQoSTsy* mmPacketQosTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->QosTsy( 
	                mmPacketContextName );

	                if ( NULL != mmPacketQosTsy )
	                    {
	                    mmPacketQosTsy->
                            CompleteSetProfileParameters( aResult );
	                    }
	            break;
	            }
	        case EPacketQoSNotifyProfileChanged:
	            {
	            TInfoName mmPacketContextName;

	            aDataPackage->UnPackData( mmPacketContextName );

	            CMmPacketQoSTsy* mmPacketQosTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->QosTsy( 
	                mmPacketContextName );

	            if ( NULL != mmPacketQosTsy )
                    {
                    mmPacketQosTsy->PacketQoSGsmWcdmaExt()->
                        CompleteNotifyProfileChanged( aDataPackage );
                    }
	            break;
	            }
	        case EPacketNotifyReleaseModeChange:            
	            STATIC_CAST( CMmPacketServiceTsy*, mmObject )->
	                CompleteNetworkModeChange( aDataPackage );
	            break;            
	        case EPacketContextSetConfig:
	            {
	            TInfoName* contextName = NULL;
	            aDataPackage->UnPackData( &contextName );
	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                    ContextTsy( *contextName );
                    
	            if( NULL != mmPacketContextTsy && 
	            	mmPacketContextTsy->ContextType( ) == 
	            	CMmPacketContextTsy::EContextTypePacketContext )
	                {
    	            if( NULL != mmPacketContextTsy )
    	                {
    	                CMmPacketContextGsmWcdmaExt* mmPacketContextGsmWcdma =
    	                    mmPacketContextTsy->PacketContextGsmWcdmaExt();

    	                if( NULL != mmPacketContextGsmWcdma )
    	                    {
    	                    mmPacketContextGsmWcdma->
                                CompleteSetConfig( aResult);
    	                    }
    	                }
	                }
	            else
	                {	                
	                CMmMBMSContextTsy* context = static_cast<CMmMBMSContextTsy*> ( mmPacketContextTsy );
	                if( NULL != context )
	                    {
                        context->CompleteSetConfig( 
                        aResult );
                        }	                    	                
	                }
	            break;
	            }
            case EPacketEnumerateMbmsActiveServiceList:
                { 
                static_cast<CMmPacketServiceTsy*> ( mmObject )->
	                    CompleteEnumerateMbmsActiveServiceList( 
	                        aDataPackage, aResult );
                break;
                }
	            
            case EPacketContextUpdateMbmsSessionList:
                {
	            TInfoName* contextName = NULL;
	            aDataPackage->UnPackData( &contextName );
	            
	            CMmPacketContextTsy* mmPacketContextTsy = static_cast<CMmPacketServiceTsy*> ( mmObject )->
                    ContextTsy( *contextName );
                    
	            if( NULL != mmPacketContextTsy && 
	            		mmPacketContextTsy->ContextType( ) == 
	            		CMmPacketContextTsy::EContextTypeMBMS )
	                {
	                static_cast<CMmMBMSContextTsy*> 
	                    ( mmPacketContextTsy )->CompleteUpdateMbmsSessionList( aResult );
	                }
                break;
                }    
	        case EPacketContextDelete:
	            {
	            TInfoName* contextName = NULL;
	            aDataPackage->UnPackData( &contextName );
	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                    ContextTsy( *contextName );
	            
	            if( NULL != mmPacketContextTsy && 
	            	mmPacketContextTsy->ContextType( ) == 
	            	CMmPacketContextTsy::EContextTypePacketContext )
	                {
	                CMmPacketContextGsmWcdmaExt* mmPacketContextGsmWcdma =
	                    mmPacketContextTsy->PacketContextGsmWcdmaExt();

	                if( NULL != mmPacketContextGsmWcdma )
	                    {
	                    mmPacketContextGsmWcdma->CompleteDelete( aResult );
	                    }
	                }
	            else
	                {
	                CMmMBMSContextTsy* context = static_cast< 
	                    CMmMBMSContextTsy*>( mmPacketContextTsy );
	                if( NULL != context )
	                    {
                        context->CompleteDelete( 
                        aResult );
                        }	                	                
	                }
	            break;
	            }
	        case EPacketContextNotifyDataTransferred:
	            {
	            TInfoName* contextName = NULL;
	            RPacketContext::TDataVolume* dataVolume;
	            aDataPackage->UnPackData( &contextName, &dataVolume );
	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                    ContextTsy( *contextName );
	            if( NULL == mmPacketContextTsy && 
	                ( 0 == ( *contextName ).Compare( KStringExternal ) || 
	                0 == ( *contextName ).Compare( KStringExternal2 ) ) )
	                {
	                mmPacketContextTsy = STATIC_CAST(
	                    CMmPacketServiceTsy*, mmObject )->DialUpContext( 
	                    *contextName );
	                }
	            if( NULL != mmPacketContextTsy )
	                {
	                mmPacketContextTsy->
                        SetDataVolume( aResult, *dataVolume );
	                }
	            break;
	            }
	        case EPacketContextActivate:
	            {
	            TInfoName* contextName = NULL;
	            aDataPackage->UnPackData( &contextName);
	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                                                ContextTsy( *contextName );
                                                    	            
	            if( NULL == mmPacketContextTsy && 
	                ( 0 == (*contextName).Compare(KStringExternal) || 
	                0 == (*contextName).Compare(KStringExternal2) ) )
	                {
	                mmPacketContextTsy = STATIC_CAST(
	                    CMmPacketServiceTsy*, mmObject )->DialUpContext(
                        *contextName );
	                }
	            if( (mmPacketContextTsy != NULL) && (mmPacketContextTsy->ContextType( ) == 
	            	CMmPacketContextTsy::EContextTypePacketContext ))
	                {
	                CMmPacketContextGsmWcdmaExt* mmPacketContextGsmWcdma =
    	                    mmPacketContextTsy->PacketContextGsmWcdmaExt();
	                if( NULL != mmPacketContextGsmWcdma )
	                	{
	                	mmPacketContextGsmWcdma->CompleteActivate(aDataPackage, aResult );
	                	}
	                }
	            else if( (mmPacketContextTsy != NULL) && ( mmPacketContextTsy->ContextType( ) == 
	                			CMmPacketContextTsy::EContextTypeMBMS ))
	                    {	                    
    	                CMmMBMSContextTsy* mbmsContext = static_cast<
    	                    CMmMBMSContextTsy*>( mmPacketContextTsy );
    	                mbmsContext->CompleteActivate( aResult );	            	                    	                    
	                    }	                    
	            break;
	            }
	        case ECtsyPacketMbmsContextNotifyConfigChanged:
	        	{
	        	TInfoName* contextName = NULL;
	            aDataPackage->UnPackData( &contextName );

	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                                              ContextTsy( *contextName );                                              	                	                
	            if( (mmPacketContextTsy != NULL) && ( mmPacketContextTsy->ContextType( ) == 
	            	CMmPacketContextTsy::EContextTypeMBMS ) )
	            	{
	            	CMmMBMSContextTsy* mbmsContext = static_cast<CMmMBMSContextTsy*>( mmPacketContextTsy );
	            	mbmsContext->CompleteNotifyConfigChanged(aDataPackage,aResult);
	            	}
	            
	            break;
	           	}
	        
	        case EPacketContextNotifyConfigChanged:
	            {
	            TInfoName* contextName = NULL;
	            aDataPackage->UnPackData( &contextName );

	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                                              ContextTsy( *contextName );                                              	                	                
	            if( NULL == mmPacketContextTsy )
	                {
	                mmPacketContextTsy = STATIC_CAST(
	                    CMmPacketServiceTsy*, mmObject )->DialUpContext( 
	                    *contextName );
	                }
	            if( ( NULL != mmPacketContextTsy ) &&(mmPacketContextTsy->ContextType() == 
	            	CMmPacketContextTsy::EContextTypePacketContext ))
	                {
	                CMmPacketContextGsmWcdmaExt* mmPacketContextGsmWcdma = mmPacketContextTsy->PacketContextGsmWcdmaExt();
	                if( NULL != mmPacketContextGsmWcdma )
	                	{
	                	mmPacketContextGsmWcdma->CompleteActivatePhase2(
	                			aDataPackage, aResult );
	                	}
	                }
	            break;
	            }
	        case EPacketContextNotifyConnectionSpeedChange:
	            {
	            TInfoName* contextName = NULL;
	            TInt* connectionSpeed = NULL;
	            aDataPackage->UnPackData( &contextName, &connectionSpeed );

	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                    ContextTsy( *contextName );
	            
	            if( NULL == mmPacketContextTsy )
	                {
	                mmPacketContextTsy = STATIC_CAST(
	                    CMmPacketServiceTsy*, mmObject )->DialUpContext(
                        *contextName );
	                }
	            if( NULL != mmPacketContextTsy )
	                {
                    mmPacketContextTsy->
                        CompleteNotifyConnectionSpeedChange(
                        *connectionSpeed );
	                }
	            break;
	            }
	        case EPacketContextNotifyStatusChange:
	            {
	            TInfoName* contextName = NULL;
	            aDataPackage->UnPackData( &contextName );
	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
                    CMmPacketServiceTsy*, mmObject )->
                    ContextTsy( *contextName );
	                
	            if( NULL == mmPacketContextTsy && 
	                ( 0 == ( *contextName ).Compare( KStringExternal ) || 
	                0 == ( *contextName ).Compare( KStringExternal2 ) ) )
	                {
	                mmPacketContextTsy = STATIC_CAST(
	                    CMmPacketServiceTsy*, mmObject )->DialUpContext(
                        *contextName );
	                }
	     
	            if( NULL != mmPacketContextTsy )
	                {
	                // pdp context
    	            if( mmPacketContextTsy->ContextType( ) == 
    	            	CMmPacketContextTsy::EContextTypePacketContext )
    	                { 	                
    	                CMmPacketContextGsmWcdmaExt* mmPacketContextGsmWcdma =
    	                    mmPacketContextTsy->PacketContextGsmWcdmaExt();

    	                if( NULL != mmPacketContextGsmWcdma )
    	                    {
                          mmPacketContextGsmWcdma->CompleteNotifyStatusChange(
                                aDataPackage, aResult );
    	                    }
    	                }
    	            // mbms context
    	            else if( (mmPacketContextTsy != NULL) && (mmPacketContextTsy->ContextType( ) == 
    	            			CMmPacketContextTsy::EContextTypeMBMS ))
    	                    {	                    
    	                CMmMBMSContextTsy* mbmsContext = static_cast<
    	                    CMmMBMSContextTsy*>( mmPacketContextTsy );
    	                mbmsContext->CompleteNotifyStatusChange(
                                aDataPackage, aResult );            	                    	                    
	                    } 
	                }
	            break;
	            }
	        case EPacketContextDeactivate:
	            {
            	TInfoName* contextName = NULL;
            	
            	// only packed for MBMS in a particular fail scenario
            	RPacketMbmsContext::CMbmsSession* session = NULL;
         
	            if(aResult == KErrMbmsImpreciseServiceEntries)
	            	{
	            	// definitely an MBMS session
	            	aDataPackage->UnPackData( &contextName, &session );
	            	}
	            else
	            	{
	            	aDataPackage->UnPackData( &contextName );
	            	}
	            
	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                                                ContextTsy( *contextName );
                                             
	            if( NULL == mmPacketContextTsy )
	                {
	                mmPacketContextTsy = STATIC_CAST(
	                    CMmPacketServiceTsy*, mmObject )->DialUpContext(
                        *contextName );
	                }
	            if( (mmPacketContextTsy != NULL) &&(mmPacketContextTsy->ContextType() == 
	            	CMmPacketContextTsy::EContextTypePacketContext ))
	                {		            

    	            if( NULL != mmPacketContextTsy )
    	                {
    	                CMmPacketContextGsmWcdmaExt* mmPacketContextGsmWcdma =
    	                    mmPacketContextTsy->PacketContextGsmWcdmaExt();

    	                if( NULL != mmPacketContextGsmWcdma )
    	                    {
    	                    mmPacketContextGsmWcdma->
                                CompleteDeactivate(aResult);
    	                    }
    	                }
	                }
	                else if((mmPacketContextTsy != NULL) && (mmPacketContextTsy->ContextType( ) == 
	                	CMmPacketContextTsy::EContextTypeMBMS ))
	                    {
    	                CMmMBMSContextTsy* mbmsContext = static_cast<
    	                    CMmMBMSContextTsy*>( mmPacketContextTsy );
    	                mbmsContext->CompleteDeactivate(aDataPackage, aResult);	            	                    	                    
	                    }	                
	            break;
	            }
	        case EPacketContextGetDataVolumeTransferred:
	            {
	            TInfoName* contextName = NULL;
	            aDataPackage->UnPackData( &contextName );
	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                    ContextTsy( *contextName );

	            if( NULL == mmPacketContextTsy )
	                {
	                mmPacketContextTsy = STATIC_CAST(
	                    CMmPacketServiceTsy*, mmObject )->DialUpContext(
                        *contextName );
	                }

	            if( NULL != mmPacketContextTsy )
	                {
	                CMmPacketContextGsmWcdmaExt* mmPacketContextGsmWcdma =
	                    mmPacketContextTsy->PacketContextGsmWcdmaExt();

	                if( NULL != mmPacketContextGsmWcdma )
	                    {
                        mmPacketContextGsmWcdma->
                            CompleteGetDataVolumeTransferred( aDataPackage,
                            aResult );
	                    }
	                }
	            break;
	            }
	        case EPacketContextModifyActiveContext:
	            {
	            TInfoName* contextName = NULL;
	            aDataPackage->UnPackData( &contextName );
	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                    ContextTsy( *contextName );
	            
	            if( NULL != mmPacketContextTsy )
	                {
	                CMmPacketContextGsmWcdmaExt* mmPacketContextGsmWcdma =
	                    mmPacketContextTsy->PacketContextGsmWcdmaExt();

	                if( NULL != mmPacketContextGsmWcdma )
	                    {
	                    mmPacketContextGsmWcdma->
                        CompleteModifyActiveContext( 
                        aDataPackage, aResult );
	                    }
	                }
	            break;
	            }	            
#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
	        case EPacketContextNotifyConnectionInfoChange:
	            {
	            TInfoName* contextName = NULL;
	            TConnectionInfoBase* infoBase = NULL;
	            aDataPackage->UnPackData( &contextName, &infoBase );

	            CMmPacketContextTsy* mmPacketContextTsy = STATIC_CAST( 
	                CMmPacketServiceTsy*, mmObject )->
                    ContextTsy( *contextName );
	            
	            if( NULL != mmPacketContextTsy )
	                {
                    mmPacketContextTsy->
                        CompleteNotifyConnectionInfoChange( infoBase );
	                }
	            break;
	            }
#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
	            	            	            
            //USSD
            case EMobileUssdMessagingSendMessage:                
                static_cast<CMmUssdTsy*>( mmObject )->
                    CompleteSendMessage( aResult );
                break;                
            case EMobileUssdMessagingSendMessageNoFdnCheck:                
                static_cast<CMmUssdTsy*>( mmObject )->
                    CompleteSendMessageNoFdnCheck( aResult );
                break;                                
            case EMobileUssdMessagingReceiveMessage:                
                static_cast<CMmUssdTsy*>( mmObject )->
                    CompleteReceiveMessage( aResult, aDataPackage );
                break;                
            case EMobileUssdMessagingSendRelease:                
                static_cast<CMmUssdTsy*>( mmObject )->
                    CompleteSendRelease( aResult, aDataPackage );
                break; 
            case EMobileUssdMessagingNotifyNetworkRelease:                
                static_cast<CMmUssdTsy*>( mmObject )->
                    CompleteNotifyNetworkRelease( aResult, aDataPackage );
                break;                
            case EMmTsyGsmBroadcastNotifyMessageReceived:                
                static_cast<CMmBroadcastTsy*>( mmObject )->
                    CompleteReceiveMessageGsmCbs( aResult, aDataPackage );
                break;                
            case EMmTsyWcdmaBroadcastNotifyMessageReceived:                
                static_cast<CMmBroadcastTsy*>( mmObject )->
                  CompleteReceiveMessageWcdmaCbs( aResult, aDataPackage );
                break;                
            case EMobileBroadcastMessagingReceiveMessage:                
                static_cast<CMmBroadcastTsy*>( mmObject )->
                    InternalCompleteCbRoutingRequest( aResult );
                break;                
            case EMobileBroadcastMessagingReceiveMessageCancel:                
                static_cast<CMmBroadcastTsy*>( mmObject )->
                    CompleteReceiveMessageCancel( aResult );
                break;                
            case EMobileBroadcastMessagingSetFilterSetting:                
                static_cast<CMmBroadcastTsy*>( mmObject )->
                    CompleteSetFilterSetting( aResult );
                break;                
            case EMobileSmsMessagingGetMessageStoreInfo:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteGetMessageStoreInfo( aResult, aDataPackage );
                break;                
            case EMmTsyActivateSmsRouting:
            case EMmTsyDeactivateSmsRouting:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteActivateSmsRouting( aResult, aDataPackage );
                break;                
            case EMobileSmsMessagingReceiveMessage:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteReceiveMessage( aResult, aDataPackage );
                break;                
            case EMobileSmsMessagingSendMessage:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteSendMessage( aResult, aDataPackage );
                break;                
            case EMobileSmsMessagingSendMessageNoFdnCheck:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteSendMessageNoFdnCheck( aResult, aDataPackage );
                break;                
            case EMmTsySmsSendSatMessage:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteSendSatMessage( aResult );
                break;                
            case EMobileSmsMessagingResumeSmsReception:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteResumeSmsReception( aResult );
                break;                
            case EMobileSmsMessagingGetSmspListPhase1:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteReadAllSmspPhase1( aResult, aDataPackage );
                break;                
            case EMobileSmsMessagingStoreSmspList:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    InternalStoreSmspList( aResult );
                break;                
            case EMobileSmsMessagingAckSmsStored:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteAckSmsStored( aResult );
                break;                
            case EMobileSmsMessagingNackSmsStored:                
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteNackSmsStored( aResult );
                break;                
            case EMobileSmsMessagingSetMoSmsBearer:
                static_cast<CMmSmsTsy*>( mmObject )->
                    CompleteSetMoSmsBearer( aResult );
                break;
            case EMobilePhoneStoreGetInfo:                
                static_cast<CMmSmsStorageTsy*>( mmObject )->
                    CompleteGetInfo( aResult, aDataPackage );
                break;                
            case EMobilePhoneStoreDelete:                
                static_cast<CMmSmsStorageTsy*>( mmObject )->
                    CompleteDeleteSms( aResult );
                break;                
            case EMobilePhoneStoreDeleteAll:                
                static_cast<CMmSmsStorageTsy*>( mmObject )->
                    CompleteDeleteAllSms( aResult );
                break;                
            case EMobilePhoneStoreRead:               
                static_cast<CMmSmsStorageTsy*>( mmObject )->
            		CompleteReadSms( aResult, aDataPackage );
                break;                
            case EMobilePhoneStoreWrite:                
                static_cast<CMmSmsStorageTsy*>( mmObject )->
                    CompleteWriteSms( aResult, aDataPackage );
                break;                
            case EMobilePhoneStoreReadAllPhase1:
                {
                if ( iMmPhone->GetSmsTsy()->GetSmsStorageTsy() )
                    {
                    static_cast<CMmSmsStorageTsy*>( mmObject )->
                        RetrieveSmsListReadSmsL( aResult, aDataPackage );
                    }
                break;
                }
            
            // Supplementary Services functionality
            // Call Forwarding
            case EMobilePhoneGetCallForwardingStatusPhase1:
                {
                // unpack result: a CMobilePhoneCFList
                CMobilePhoneCFList* cfResults;
                aDataPackage->UnPackData( &cfResults );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteGetCallForwardingStatusPhase1L( 
                    cfResults, aResult );
                break;
                }
            case EMobilePhoneNotifyCallServiceCapsChange:                
                {
                // unpack result: a RMobilePhone::TMobilePhoneCallServiceCaps
                RMobilePhone::TMobilePhoneCallServiceCaps callServiceCaps;
                aDataPackage->UnPackData( callServiceCaps );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                  CompleteNotifyCallServiceCapsChange( callServiceCaps );
                break;
                }
            case EMobilePhoneSetCallForwardingStatus:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteSetCallForwardingStatus( aResult );
                break;                
            case EMobilePhoneNotifyCallForwardingStatusChange:
                {
                // unpack result: a RMobilePhone::TMobilePhoneCFCondition
                RMobilePhone::TMobilePhoneCFCondition cfCondition;
                aDataPackage->UnPackData( cfCondition );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                  CompleteNotifyCallForwardingStatusChange( cfCondition );
                break;
                }
            case EMobilePhoneNotifyCallForwardingActive:
                {
                // unpack results: a RMobilePhone::TMobileService
                // and a RMobilePhone::TMobilePhoneCFActive
                RMobilePhone::TMobileService serviceGroup;
                RMobilePhone::TMobilePhoneCFActive activeType;
                aDataPackage->UnPackData( serviceGroup, activeType );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteNotifyCallForwardingActive( 
                    serviceGroup, activeType );
                break;
                }
            // Call Barring
            case EMobilePhoneGetBarringStatusPhase1:
                {
                // unpack result: a CMobilePhoneCBList
                CMobilePhoneCBList* cbResults;
                aDataPackage->UnPackData( &cbResults );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                CompleteGetCallBarringStatusPhase1L( cbResults, aResult );
                break;
                }
            case EMobilePhoneSetCallBarringStatus:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteSetCallBarringStatus( aResult );
                break;                
            case EMobilePhoneNotifyCallBarringStatusChange:
                {
                // unpack result: a RMobilePhone::TMobilePhoneCBCondition
                RMobilePhone::TMobilePhoneCBCondition cbCondition;
                aDataPackage->UnPackData( cbCondition );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteNotifyCallBarringStatusChange( cbCondition );
                break;
                }
            // Supplementary Services password change
            case EMobilePhoneSetSSPassword:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteSetSSPassword( aResult );
                break;                
            // Call Waiting
            case EMobilePhoneGetWaitingStatusPhase1:
                {
                // unpack result: a CMobilePhoneCWList
                CMobilePhoneCWList* cwResults;
                aDataPackage->UnPackData( &cwResults );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                CompleteGetCallWaitingStatusPhase1L( cwResults, aResult );
                break;
                }
            case EMobilePhoneSetCallWaitingStatus:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteSetCallWaitingStatus( aResult );
                break;                
            case EMobilePhoneNotifyCallWaitingStatusChange:
                {
                // unpack result: RMobilePhone::TMobilePhoneCWInfoEntryV1
                RMobilePhone::TMobilePhoneCWInfoEntryV1* cwStatus;
                aDataPackage->UnPackData( &cwStatus );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteNotifyCallWaitingStatusChange( cwStatus );
                break;
                }
            // Identity EMobilePhoneGetIdentityServiceStatus
            case EMobilePhoneGetIdentityServiceStatus:
                {
                // if no error, then unpack result: a
                // RMobilePhone::TMobilePhoneIdServiceStatus
                RMobilePhone::TMobilePhoneIdServiceStatus status =
                    RMobilePhone::EIdServiceUnknown;
                if ( KErrNone == aResult )
                    {
                    aDataPackage->UnPackData( status );
                    }
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteGetIdentityServiceStatus( status, aResult );
                break;
                }
            // User's Access to Network Services
            case EMobilePhoneSendNetworkServiceRequest:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteSendNetworkServiceRequest( aResult );
                break;  
            case EMobilePhoneSendNetworkServiceRequestNoFdnCheck:
            	static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteSendNetworkServiceRequestNoFdnCheck( aResult );
                break;
            // Notify for Send Network Service Request
            case ECtsyPhoneSendNetworkServiceRequestInd:
            	static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
            		CompleteSendNetworkServiceRequestInd( aResult,aDataPackage);
            	break;
            // Notify for All Send Network Service Request
            case EMobilePhoneNotifyAllSendNetworkServiceRequest:
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                CompleteNotifyAllSendNetworkServiceRequest( aResult,
                    aDataPackage );
                break;
            // Get ICC message waiting indicators
            case EMobilePhoneGetIccMessageWaitingIndicators:
                {
                // packed param: RMobilePhone::TMobilePhoneMessageWaitingV1
                RMobilePhone::TMobilePhoneMessageWaitingV1* mmWaiting;
                aDataPackage->UnPackData( &mmWaiting );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteGetIccMessageWaitingIndicators( mmWaiting,
                    aResult );
                }
                break;
                
            // Set ICC message waiting indicators
            case EMobilePhoneSetIccMessageWaitingIndicators:                    
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteSetIccMessageWaitingIndicators( aResult );
                break;
                    
            // Notify ICC message waiting indicators change
            case EMobilePhoneNotifyIccMessageWaitingIndicatorsChange:
                // packed param: RMobilePhone::TMobilePhoneMessageWaitingV1
                RMobilePhone::TMobilePhoneMessageWaitingV1* mmWaiting;
                aDataPackage->UnPackData( &mmWaiting );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSupplServTsy()->
                    CompleteNotifyIccMessageWaitingIndicatorChange(
                    mmWaiting, aResult );
                break;    

            // case EMobilePhoneGetCallForwardingStatusPhase2:          no DOS call required
            // case EMobilePhoneGetCallForwardingStatusCancel:          no DOS call required
            // case EMobilePhoneSetCallForwardingStatusCancel:          no DOS call required
            // case EMobilePhoneNotifyCallForwardingStatusChangeCancel: no DOS call required
            // case EMobilePhoneNotifyCallForwardingActiveCancel:       no DOS call required
            // case EMobilePhoneGetCallForwardingIndicator:             not supported
            // case EMobilePhoneGetCallForwardingIndicatorCancel:       not supported

            // Custom Tsy functionality
            case ECustomSsAdditionalInfoNotificationIPC:
                {
                // unpack pointer to RMmCustomAPI::TSsAdditionalInfo
                RMmCustomAPI::TSsAdditionalInfo* addInfo;
                aDataPackage->UnPackData( addInfo );

                static_cast<CMmCustomTsy*>( mmObject )->
                CompleteSsAdditionalInfoNotification( addInfo, aResult );
                break;
                }
            case ECustomNotifySsNetworkEventIPC:
                {
                // unpack result: a RMmCustomAPI::TSsTypeAndMode and
                // a RMmCustomAPI::TSsInfo
                RMmCustomAPI::TSsTypeAndMode ssTypeAndMode;
                RMmCustomAPI::TSsInfo ssInfo;
                aDataPackage->UnPackData( ssTypeAndMode, ssInfo );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifySsNetworkEvent( ssTypeAndMode, ssInfo, 
                    aResult );
                break;
                }
            case ECustomNotifySsRequestCompleteIPC:
                {
                // unpack result: a TInt with SS status
                TInt ssStatus;
                aDataPackage->UnPackData( ssStatus );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteSsRequestCompleteNotification( 
                    ssStatus, aResult );
                break;
                }
            case ECustomNotifyDtmfEventIPC:
                {
                // unpack result: a RMmCustomAPI::TDtmfInfo
                RMmCustomAPI::TDtmfInfo dtmfInfo;
                aDataPackage->UnPackData( dtmfInfo );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifyDtmfEvent( dtmfInfo, aResult );
                break;
                }
         	case ECustomNotifyRauEventIPC:
                {
                // unpack result
                RMmCustomAPI::TRauEventStatus rauEventStatus;
                aDataPackage->UnPackData( rauEventStatus );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifyRauEvent( rauEventStatus, aResult );
                break;
                }
            case ECustomGetDiagnosticOctetsIPC:
                {
                // unpack result: TInt (call ID) and TUint8 (diagnostics)
                TInt callId( -1 );
                TUint8 diags;
                aDataPackage->UnPackData( callId, diags );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetDiagnosticOctects( callId, diags );
                break;
                }
            case ECustomGetRemoteAlertingToneStatusIPC:
                {
                // unpack result: a TBool playRemoteAlertToneLocally
                TBool playRemoteAlertToneLocally;
                aDataPackage->UnPackData( playRemoteAlertToneLocally );
                // not completed by Custom Tsy, but by the GSM extension
                CMmCustomGsmExt* customGsmExt = 
                    static_cast<CMmCustomGsmExt*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetActiveExtensionPtr() );
                
                if ( customGsmExt )
                    {
                    customGsmExt->SetLocalRemoteAlertToneRequired(
                        playRemoteAlertToneLocally );
                    }
                break;
                }
            case ECustomClearCallBlackListIPC:                
                // no packed parameters
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteClearCallBlackList( aResult );
                break;                
            case ECustomCheckEmergencyNumberIPC:
                {
                // packed parameter: a ptr to TMobileTelNumber
                RMmCustomAPI::TMobileTelNumber* telNumber;
                aDataPackage->UnPackData( telNumber );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteCheckEmergencyNumber( telNumber, aResult );
                break;
                }
            case ECustomGetLifeTimeIPC:
                {
                // packed parameter: a RMmCustomAPI::TLifeTimeData
                RMmCustomAPI::TLifeTimeData lifeTime;
                aDataPackage->UnPackData( lifeTime );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetLifeTime( lifeTime, aResult );
                break;
                }
            case ECustomTerminateCallIPC:                
                // no packed parameters
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteTerminateCall( aResult );
                break;                
            case ECustomGetAlsBlockedIPC:
                {
                // packed parameter: TGetAlsBlockStatus (block status)
                RMmCustomAPI::TGetAlsBlockStatus blockStatus;
                aDataPackage->UnPackData( blockStatus );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetAlsBlocked( blockStatus, aResult );
                break;
                }
            case ECustomSetAlsBlockedIPC:                
                // no packed parameters
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteSetAlsBlocked( aResult );
                break;                
            case ECustomCheckAlsPpSupportIPC:
                {
                // packed parameter: RMmCustomAPI::TAlsSupport
                RMmCustomAPI::TAlsSupport alsSupport;
                aDataPackage->UnPackData( alsSupport );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetAlsPpSupport( alsSupport, aResult );
                break;
                }
            case ECustomCheckTwoDigitDialSupportIPC:
                {
                // packed parameter: RMmCustomAPI::TTwoDigitDialSupport
                RMmCustomAPI::TTwoDigitDialSupport twoDigitDialSupport;
                aDataPackage->UnPackData( twoDigitDialSupport );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteCheckTwoDigitDialSupport( twoDigitDialSupport,
                    aResult );
                break;
                }
            case ECustomGetCipheringInfoIPC:
                {
                // packed parameter:
                // TBool (ciphering indicator required/not required)
                TBool indReq;
                aDataPackage->UnPackData( indReq );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetCipheringInfo( indReq, aResult );
                break;
                }
            case ECustomNotifyCipheringInfoChangeIPC:
                {
                // packed parameters:
                // TBool (ciphering indicator required/not required)
                // TBool (ciphering on/off)
                TBool indReq;
                TBool ciStatus;
                aDataPackage->UnPackData( indReq, ciStatus );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifyCipheringInfoChange( indReq, ciStatus, 
                    aResult );
                break;
                }
            case ECustomNotifyNSPSStatusIPC:
                {
                // packed parameter: TBool nspsIsOn
                TBool nspsIsOn;
                aDataPackage->UnPackData( nspsIsOn );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifyNSPSStatus( nspsIsOn );
                break;
                }
            case ECustomNetWakeupIPC:                
                // no packed parameters
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNetWakeup( aResult );
                break;                
            case ECustomGetOperatorNameIPC:
                {
                // packed parameter: a RMmCustomAPI::TOperatorNameInfo
                RMmCustomAPI::TOperatorNameInfo operNameInfo;
                aDataPackage->UnPackData( operNameInfo );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetOperatorName( operNameInfo, aResult );
                break;
                }
            case EMobilePhoneIMSAuthenticate:                
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteImsAuthentication( aDataPackage, aResult );
                break;                
            case ECustomGetSimAuthenticationDataIPC:                
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteSimAuthentication( aDataPackage, aResult );
                break;                
            case ECustomResetNetServerIPC:                
                // no packed parameters
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteResetNetServer( aResult );
                break;                
            case ECustomNotifyNetworkConnectionFailureIPC:                
                // no packed parameters
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifyNetworkConnectionFailure();
                break;                
            case ECustomGetSystemNetworkModesIPC:
                {
                // packed parameters TUint32 (systemNetworkModes)
                TUint32 systemNetworkModes;
                aDataPackage->UnPackData( systemNetworkModes );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetSystemOrCurrentNetworkModes( 
                    systemNetworkModes, aResult );
                break;
                }
            case ECustomSetSystemNetworkModeIPC:                
                // no packed parameters)
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteSetSystemNetworkMode( aResult );
                break;                
            case ECustomGetNetworkProviderNameIPC:
                {
                // packed parameter: TDes* (network provider name)
                TDes* name;
                aDataPackage->UnPackData( name );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetNetworkOperatorName( name, aResult );
                break;
                }
            case ECustomGetCurrentSystemNetworkModesIPC:
                {
                TUint32 currentNetworkModes;
                aDataPackage->UnPackData( currentNetworkModes );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetCurrentSystemNetworkMode( 
                    currentNetworkModes, aResult );
                break;
                }
            case ECustomGetBandSelectionIPC:
                {
                // Packed parameters TBandSelection (systemNetworkBand). 
                // Initialize parameters. In otherwise compiler gives warning.
                // CompleteGetSystemNetworkBand does not handle parameters if 
                // aResult is not KErrNone.
                RMmCustomAPI::TBandSelection systemNetworkBand
                    = RMmCustomAPI::ENetworkBandAny;
                RMmCustomAPI::TNetworkModeCaps systemNetworkMode
                    = RMmCustomAPI::KCapsNetworkModeDual;
                if (KErrNone == aResult)
                	{
                aDataPackage->UnPackData( systemNetworkBand,
                    systemNetworkMode );
                	}
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetSystemNetworkBand( 
                    systemNetworkBand, systemNetworkMode, aResult );
                break;
                }
            case ECustomSetBandSelectionIPC:                
                // no packed parameters)
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteSetSystemNetworkBand( aResult );
                break;
            
            case ECustomSatRefreshCompleteNotificationIPC:                
                // no packed parameters
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteSatRefreshCompleteNotification();
                break;                
            case ECustomReadSimFileIPC:
                {
                // packed parameter: pointer to TDesC8 (SIM data)
                TDesC8* simData;
                aDataPackage->UnPackData( simData );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetSimFileInfo( simData, aResult );
                break;
                }
            case ECustomSimLockActivateIPC:
                {
                // no packed parameters
                CMmSimLockTsy* simLockTsy = static_cast<CMmSimLockTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetSimLockTsyPtr() );
                simLockTsy->CompleteActivateSimLock( aResult );
                break;
                }
            case ECustomSimLockDeActivateIPC:
                {
                // no packed parameters
                CMmSimLockTsy* simLockTsy = static_cast<CMmSimLockTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetSimLockTsyPtr() );
                simLockTsy->CompleteDeActivateSimLock( aResult );
                break;
                }
            case ECustomSendAPDUReqIPC:
                {
                CMmWimTsy* wimTsy = static_cast<CMmWimTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetWimTsyPtr() );
                wimTsy->CompleteSendAPDUReq( aDataPackage, aResult );
                break;
                }
            case ECustomSimWarmResetIPC:
                {
                // no packed parameters
                CMmWimTsy* wimTsy = static_cast<CMmWimTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetWimTsyPtr() );
                wimTsy->CompleteSimWarmReset( aResult );
                break;
                }
            case ECustomGetATRIPC:
                {
                // packed parameter: TPtrC8* atr
                TPtrC8* atr;
                aDataPackage->UnPackData( &atr );
                CMmWimTsy* wimTsy = static_cast<CMmWimTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetWimTsyPtr() );
                wimTsy->CompleteGetATR( *atr, aResult );
                break;
                }
            case ECustomGetSimCardReaderStatusIPC:
                {
                // packed parameter: TPtrC8* status
                TPtrC8* status;
                aDataPackage->UnPackData( &status );
                CMmWimTsy* wimTsy = static_cast<CMmWimTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetWimTsyPtr() );
                wimTsy->CompleteGetSimCardReaderStatus( 
                    *status, aResult );
                break;
                }
            case ECustomNotifySimCardStatusIPC:
                {
                // packed param: RMmCustomAPI::TSIMCardStatus returnStatus
                RMmCustomAPI::TSIMCardStatus returnStatus;
                aDataPackage->UnPackData( returnStatus );
                CMmWimTsy* wimTsy = static_cast<CMmWimTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetWimTsyPtr() );
                wimTsy->CompleteNotifySimCardStatus( returnStatus );
                break;
                }
            case ECustomSendAPDUReqV2IPC:
                {
                // packed parameter: TPtrC8* data
                TPtrC8* data;
                aDataPackage->UnPackData( &data );
                CMmWimTsy* wimTsy = static_cast<CMmWimTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetWimTsyPtr() );
                wimTsy->CompleteSendAPDUReqV2( *data, aResult );
                break;
                }
            case ECustomPowerSimOnIPC:
                {
                // no packed parameters
                CMmWimTsy* wimTsy = static_cast<CMmWimTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetWimTsyPtr() );
                wimTsy->CompletePowerSimOn( aResult );
                break;
                }
            case ECustomPowerSimOffIPC:
                {
                // no packed parameters
                CMmWimTsy* wimTsy = static_cast<CMmWimTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetWimTsyPtr() );
                wimTsy->CompletePowerSimOff( aResult );
                break;
                }
            case ECustomStartSimCbTopicBrowsingIPC:
                {
                // packed parameter: pointer to array with CB topics
                CArrayFixFlat<RMmCustomAPI::TSimCbTopic>* 
                    cimCbTopics = NULL;
                if ( KErrNone == aResult )
                    {
                    // only unpack data in successful case
                    aDataPackage->UnPackData( cimCbTopics );
                    }
                CMmSIMTsy* simTsy = static_cast<CMmSIMTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetSIMTsyPtr() );
                simTsy->CompleteStartSimCbTopicBrowsing( 
                    cimCbTopics, aResult );
                break;
                }
            case ECustomDeleteSimCbTopicIPC:
                {
                // no packed parameters
                CMmSIMTsy* simTsy = static_cast<CMmSIMTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetSIMTsyPtr() );
                simTsy->CompleteDeleteSimCbTopic( aResult );
                break;
                }
                
            case ECustomGetServiceTableSupportbyApplicationIPC:
            	{
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetUSIMServiceSupport(aDataPackage, aResult );
                break;
            	
            	}
            	
            case EReadViagHomeZoneParamsIPC:
                {
                // packed parameter: RMmCustomAPI::TViagParams, pointer to 
                // RMmCustomAPI::TViagElements
                RMmCustomAPI::TViagParams viagParams;
                RMmCustomAPI::TViagElements* viagElems = NULL;
                if ( KErrNone == aResult )
                    {
                    // only unpack data in successful case
                    aDataPackage->UnPackData( viagParams, viagElems );
                    }
                CMmSIMTsy* simTsy = static_cast<CMmSIMTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                                                        GetSIMTsyPtr() );
                simTsy->CompleteReadViagHomeZoneParamsResp( &viagParams, 
                    viagElems, aResult );
                break;
                }
            case EReadViagHomeZoneCacheIPC:
                {
                // packed parameter: RMmCustomAPI::TViagCacheRecordContent
                RMmCustomAPI::TViagCacheRecordContent viagRecordContent;
                aDataPackage->UnPackData( viagRecordContent );
                CMmSIMTsy* simTsy = static_cast<CMmSIMTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetSIMTsyPtr() );
                simTsy->CompleteReadViagHomeZoneCacheRespL( 
                    &viagRecordContent, aResult );
                break;
                }
            case EWriteViagHomeZoneCacheIPC:
                {
                // no packed parameters
                CMmSIMTsy* simTsy = static_cast<CMmSIMTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetSIMTsyPtr() );
                simTsy->CompleteWriteViagHomeZoneCacheResp( aResult );
                break;
                }
            case EWriteViagHomeZoneUHZIUESettingsIPC:
                {
                // no packed parameters
                CMmSIMTsy* simTsy = static_cast<CMmSIMTsy*>(
                    static_cast<CMmCustomTsy*>( mmObject )->
                    GetSIMTsyPtr() );
                simTsy->CompleteWriteViagHomeZoneUHZIUESettingsResp( 
                    aResult );
                break;
                }
            case ECustomSetDriveModeIPC:                
                // no packed parameters
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteSetDriveMode( aResult );
                break;                
            
            // Security (Custom) functionality
            case ECustomIsBlockedIPC:
                {
                TBool isBlocked;
                aDataPackage->UnPackData ( isBlocked );
                static_cast<CMmCustomSecurityTsy*>( mmObject )->
                    CompleteIsBlocked( aResult, isBlocked );
                break;
                }
            case ECustomCheckSecurityCodeIPC:                
                static_cast<CMmCustomSecurityTsy*>( mmObject )->
                    CompleteCheckSecurityCode( aResult );
                break;                
            //case ECustomCheckEmergencyNumberIPC:
            //case ECustomSatRefreshCompleteNotificationIPC:
            case ECustomDisablePhoneLockIPC:                
                static_cast<CMmCustomSecurityTsy*>( mmObject )->
                    CompleteDisablePhoneLock( aResult);
                break;                
            case ECustomCheckSecurityCodeCancelIPC:                
                static_cast<CMmCustomSecurityTsy*>( mmObject )->
                    CompleteCheckSecurityCodeCancel();
                break;                
            case ECustomReadHSxPAStatusIPC:
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteReadHSxPAStatus( aDataPackage, aResult );
                break;
            case ECustomWriteHSxPAStatusIPC:
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteWriteHSxPAStatus( aResult );
                break;
            case ECustomNotifyHSxPAStatusIPC:
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifyHSxPAStatus( aDataPackage, aResult );
                break;
            case ECustomGetIccCallForwardingStatusIPC:
            	static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetIccCallForwardingStatus( aDataPackage, aResult );
                break;
            case ECustomNotifyIccCallForwardingStatusChangeIPC:
            	static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifyIccCallForwardingStatusChange( aDataPackage, aResult );
                break;
            case ECustomGetCellInfoIPC:
                {
                //unpack the data
                RMmCustomAPI::TMmCellInfo* cellInfo;
                aDataPackage->UnPackData( &cellInfo );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteGetCellInfo( cellInfo, aResult );
                break;
                }
            case ECustomNotifyCellInfoChangeIPC:
            	{
                //unpack the data
                RMmCustomAPI::TMmCellInfo* cellInfoChange;
                aDataPackage->UnPackData( &cellInfoChange );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifyCellInfoChange( cellInfoChange, aResult );
                break;
                }
        	case ECustomNotifyRemoteAlertingToneStatusChangeIPC:
                {
                // unpack result
                RMmCustomAPI::TRemoteAlertingToneStatus remoteAlertingToneStatus;
                aDataPackage->UnPackData( remoteAlertingToneStatus );
                static_cast<CMmCustomTsy*>( mmObject )->
                    CompleteNotifyRemoteAlertingToneStatusChange( 
                    remoteAlertingToneStatus, aResult );
                break;
                }
                
            case ECustomGetProgrammableOperatorLogoIPC:
            	{
            	RMmCustomAPI::TOperatorId* operatorId;
            	RMmCustomAPI::TOperatorLogo* operatorLogo;
            	aDataPackage->UnPackData(&operatorId, &operatorLogo);
				static_cast<CMmCustomTsy*>( mmObject )->CompleteGetProgrammableOperatorLogo(operatorId, operatorLogo, aResult);
				break;
            	}
                
                
        	// Security cases
            case EMobilePhoneGetLockInfo:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSecurityTsy()->
                    CompleteGetLockInfo( aDataPackage, aResult );
                break;                
            case EMobilePhoneChangeSecurityCode:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSecurityTsy()->
                    CompleteChangeSecurityCode( aResult );
                break;                
            case EMobilePhoneAbortSecurityCode:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSecurityTsy()->
                    CompleteAbortSecurityCode( aResult );
                break;                
            case EMobilePhoneVerifySecurityCode:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSecurityTsy()->
                    CompleteVerifySecurityCodeL( aResult );
                break;                
            case EMobilePhoneSetLockSetting:
                {
                //unpack the data
                RMobilePhone::TMobilePhoneLockStatus* status = NULL;
                RMobilePhone::TMobilePhoneLockSetting* setting = NULL;
                aDataPackage->UnPackData( &status, &setting );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSecurityTsy()->
                    CompleteSetLockSetting( aResult,*status, *setting );
                break;
                }
            case EMobilePhoneNotifySecurityEvent:
                {
                RMobilePhone::TMobilePhoneSecurityEvent* event = NULL;
                //unpack the data
                aDataPackage->UnPackData( &event );
                static_cast<CMmPhoneTsy*>( mmObject )->GetSecurityTsy()->
                    CompleteNotifySecurityEventL( *event, aResult );
                break;
                }
            case EMobilePhoneNotifyLockInfoChange:                
                static_cast<CMmPhoneTsy*>( mmObject )->GetSecurityTsy()->
                    CompleteNotifyLockInfoChange( aDataPackage, aResult);
                break;                
            case EMmTsySecurityGetSimActivePinStateIPC:                
                static_cast<CMmCustomSecurityTsy*>(
                    mmObject )->SetActivePin( aDataPackage );
                break;                
            case EMmTsySimGetICCType:                
                static_cast<CMmPhoneTsy*>( mmObject )->
                  PhoneExtInterface()->CompleteGetICCType( aDataPackage );
                break;                
            case EMmTsyBootNotifySimStatusReadyIPC: 
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteNotifySimStatusReadyL();
                break;                
            case EMmTsyBootNotifyModemStatusReadyIPC:                
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteNotifyModemStatusReady();
                break;                
            case EMmTsyBootNotifySecurityReadyIPC:                
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteNotifySecurityReady();
                break;   
            case EMobilePhoneNotifyIccAccessCapsChange:                
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteNotifyIccAccessCapsChange();
                break;              
            case EMmTsyBootGetRFStatusIPC:
                {
                TRfStateInfo* rfInfo = NULL;
                aDataPackage->UnPackData ( &rfInfo );
                CMmPhoneTsy* phoneTsy = 
                                  static_cast<CMmPhoneTsy*>( mmObject );
                phoneTsy->SetRfStateInfo( *rfInfo );
                // inform also SMS Tsy about RF state
                CMmSmsTsy* smsTsy = phoneTsy->SmsSession();
                if ( smsTsy )
                    {
                    if ( ERfsStateInfoInactive == *rfInfo )
                        {
                        smsTsy->SetOffline( ETrue );
                        }
                    else
                        {
                        smsTsy->SetOffline( EFalse );
                        }
                    }
                break;
                }
            case EMobilePhoneGetMailboxNumbers:
            	iMmPhone->CompleteGetMailboxNumbers( aDataPackage, aResult );
                break;            
            // Miscellaneous Phone functionality

            // case EMobilePhoneGetBatteryInfo: // handled in CommonTSY
            case EMobilePhoneNotifyBatteryInfoChange:
                static_cast<CMmPhoneTsy*>( mmObject )->
                  CompleteNotifyBatteryInfoChange(aDataPackage, aResult );
                //  phone indicator status may change
                iMmPhone->CompleteNotifyIndicatorChange();
                break;

            case EMobilePhoneGetPhoneId:
                {
                // packed parameter: TDes8 with serial number
                TBuf8<KSerialNumberLength> serialNumber;
                aDataPackage->UnPackData( serialNumber );
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetPhoneId( serialNumber, aResult );
                break;
                }

#ifdef USING_CTSY_DISPATCHER               
            case ECtsyGetPhoneIdV2Comp: 
                {
                // Ltsy returns packed parameter of RMobilePhone::TMobilePhoneIdentityV1
                RMobilePhone::TMobilePhoneIdentityV1* phoneId = NULL;
                aDataPackage->UnPackData(&phoneId);
                __ASSERT_DEBUG(phoneId, User::Invariant());

                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetPhoneId(*phoneId, aResult);
                break;
                }
#endif //USING_CTSY_DISPATCHER
             
            case EMobilePhoneGetSubscriberId:
                {
                // packed param: TBuf8<RMobilePhone::KIMSISize> with IMSI
                TBuf8<RMobilePhone::KIMSISize> imsi;
                aDataPackage->UnPackData( imsi );
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetSubscriberIdL( imsi, aResult );
                break;
                }
            case EMobilePhoneGetALSLine:
                {
                // packed parameter: RMobilePhone::TMobilePhoneALSLine
                RMobilePhone::TMobilePhoneALSLine alsStatus;
                aDataPackage->UnPackData ( alsStatus );

                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetAlsLine ( alsStatus, aResult );
                break;
                }
            case EMobilePhoneSetALSLine:                
                // no packed parameters
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteSetAlsLine ( aResult );
                break;                
            case EMobilePhoneGetCustomerServiceProfile:
                {
                // packed parameter: RMobilePhone::TMobilePhoneCspFileV1
                RMobilePhone::TMobilePhoneCspFileV1 cspFile;
                aDataPackage->UnPackData( cspFile );
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetCustomerServiceProfile( cspFile, aResult );
                break;
                }
            case EMobilePhoneGetPhoneStoreInfo:
                {
                //packed param: RMobilePhoneStore::TMobilePhoneStoreInfoV1
                RMobilePhoneStore::TMobilePhoneStoreInfoV1 phoneStoreInfo;
                aDataPackage->UnPackData( phoneStoreInfo );
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetPhoneStoreInfo( phoneStoreInfo, aResult );
                break;
                }
            case EMobilePhoneGetServiceTable:
                {
                //packed param: RMobilePhone::TMobilePhoneServiceTableV1
                RMobilePhone::TMobilePhoneServiceTableV1 table;
                aDataPackage->UnPackData( table );
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetServiceTableL ( table, aResult );
                break;
                }
            case EMmTsyPhoneGetPin1DisableSupportedIPC:
                {
                // packed parameter: TBool (supported or not)
                TBool supported = EFalse;
                aDataPackage->UnPackData( supported );
                if ( !supported )
                    {
                    static_cast<CMmPhoneTsy*>( mmObject )->
                          GetSecurityTsy()->SetPin1DisableNotSupported();
                    }
                break;
                }
            case EMobilePhoneSetFdnSetting :                
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteSetFdnSettingL( aResult );
                break;                
            case EMobilePhoneGetFdnStatus:                
                static_cast<CMmPhoneTsy*>( mmObject )-> 
                    CompleteGetFdnStatus( aDataPackage, aResult );
                break;                
            case EMobilePhoneGetServiceProviderName:                
                static_cast<CMmPhoneTsy*>( mmObject )->
                  CompleteGetServiceProviderName( aDataPackage, aResult );
                break;                
            case EMmTsySimRefreshNowIPC:
                {
                //packed param: TUint16(list of SIM files to be refreshed)
                TUint16 filesToRefresh = 0;
                aDataPackage->UnPackData( filesToRefresh );
                // Refresh notification received, start refresh
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteSimRefreshNowL( filesToRefresh );
                break;
                }
            case EMmTsyGetCallForwardingNumberIPC:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetCallForwardingNumber( 
                    aResult, aDataPackage );
                break;

            // Access point control list (ACL)
            case EMobilePhoneEnumerateAPNEntries:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteEnumerateAPNEntries( aDataPackage, aResult );
                break;
            case EMobilePhoneGetAPNname:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetAPNname( aDataPackage, aResult );
                break;
            case EMobilePhoneAppendAPNName:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteAppendAPNName( aResult );
                break;
            case EMobilePhoneDeleteAPNName:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteDeleteAPNName( aResult );
                break;
            case EMobilePhoneSetAPNControlListServiceStatus:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteSetAPNControlListServiceStatus( aResult );
                break;
            case EMobilePhoneGetAPNControlListServiceStatus:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteGetAPNControlListServiceStatus( aDataPackage, 
                    aResult );
                break;
            case EMobilePhoneNotifyAPNListChanged:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteNotifyAPNListChanged( aResult );
                break;
            case EMobilePhoneNotifyAPNControlListServiceStatusChange:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    CompleteNotifyAPNControlListServiceStatusChange( 
                    aDataPackage, aResult );
                break;
            case EMobilePhoneGetSecurityCodeInfo:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    GetSecurityTsy()->CompleteGetSecurityCodeInfo( 
                    aDataPackage, aResult );
                break;
            case EMobilePhoneNotifySecurityCodeInfoChange:
                static_cast<CMmPhoneTsy*>( mmObject )->
                    GetSecurityTsy()->CompleteNotifySecurityCodeInfoChange( 
                    aDataPackage, aResult );
                break;
            case EMmTsyPhoneBookStoreFdnInfoIPC:
TFLOGSTRING("TSY: CMmMessageRouterProxy::RouteCompletion: route to phonetsy EMmTsyPhoneBookStoreFdnInfoIPC");               
                static_cast<CMmPhoneTsy*>( mmObject )->
                    SaveFdnInfoDetails( aResult, aDataPackage );
                break;
            default:
                break;
            }

        }
    else //special cases goes here
        {
        switch ( aIpc )
            {
            //this IPC has to be routed to
            //the NetTsy object as is an special case. 
            //We Force the routing.
            case EMobileCallNotifyPrivacyConfirmation:
                {
                mmObject =iTsyDelegates-> 
                      GetTsyObject(  CMmMessageManagerBase::EPhoneTsy );
                static_cast<CMmPhoneTsy*>( mmObject )->GetNetTsy()->
                    ReceivedCallPrivacyInformation( aDataPackage );
                break;
                }
            case EMobileCallGetMobileCallInfo:
                {
                // If call object is not found, this call object has just 
                // been initiated. Inform Line object instead.
                // (Get mobile call information is always completed before 
                // call status change)
                TInt callId( -1 );
                RMobilePhone::TMobileService callMode( 
                    RMobilePhone::EVoiceService );

                const CCallDataPackage* callData = 
                  reinterpret_cast<const CCallDataPackage*>(aDataPackage);
                callData->GetCallIdAndMode( callId, callMode );

                mmObject = REINTERPRET_CAST( CBase*, 
                      iMmPhone->LineList()->GetMmLineByMode( callMode ) );
                
                if ( NULL == mmObject )
                    {
TFLOGSTRING("TSY: CMmMessageRouterProxy::RouteCompletion: Call object not found for mobile Call Info!");
                    }
                else
                    {
                    // complete call added notification directly from here
                    static_cast<CMmLineTsy*>( mmObject )->
                        CompleteNotifyDiallingStatus( aDataPackage );
                    }
                break;
                }
            case EEtelCallDial:
            case EMobileCallDialISV:
            case EMobileCallDialNoFdnCheck:
                {
                //If data/video call creation fails (e.g when dialled 
                //number has not been in the FDN list), dial is completed 
                //when this call object has just been initiated 
                //(and therefore not found).
                TInt callId( -1 );
                RMobilePhone::TMobileService callMode( 
                    RMobilePhone::EServiceUnspecified );

                const CCallDataPackage* callData = 
                reinterpret_cast<const CCallDataPackage*>( aDataPackage );
                callData->GetCallIdAndMode( callId, callMode );

                if ( callId == 0 && ( 
                    callMode == RMobilePhone::ECircuitDataService || 
                    callMode == RMobilePhone::EVoiceService || 
                    callMode == RMobilePhone::EAuxVoiceService ) )
                    {
                    //check if data call exists
                    CMmDataCallTsy* mmCall = 
                      reinterpret_cast<CMmDataCallTsy*>(
                        iMmPhone->CallList()->
                            GetMmCallByMode( callMode ) );

                    if ( NULL == mmCall )
                        {
TFLOGSTRING("TSY: CMmMessageRouterProxy::RouteCompletion: Call object not found for Dial!");
                        }
                    else
                        {
                        //find object that requested dial
                        if ( ( mmCall->IsServiceLocallyRequested( 
                            CMmCallTsy::EMultimodeCallDial ) )
                            || ( mmCall->IsServiceLocallyRequested( 
                            CMmCallTsy::EMultimodeCallDialISV ) ) 
                            || (mmCall->IsServiceLocallyRequested( 
                            CMmCallTsy::EMultimodeMobileCallDialEmergencyCall ) ) 
                            || ( mmCall->IsServiceLocallyRequested( 
                            CMmCallTsy::
                            EMultimodeCallDialNoFdnCheck ) ) )
                            {
                            for( TInt i = 0; i < iMmPhone->CallList()->
                                GetNumberOfObjects(); i++ )
                                {
                                mmCall = reinterpret_cast<CMmDataCallTsy*>(
                                    iMmPhone->CallList()->
                                                    GetMmCallByIndex(i) );
                                                    
                                if ( ( mmCall->ServiceRequested( 
                                    CMmCallTsy::EMultimodeCallDial ) 
                                      && mmCall->CallMode() == callMode )
                                      || ( mmCall->ServiceRequested( 
                                      CMmCallTsy::EMultimodeCallDialISV ) 
                                    && mmCall->CallMode() == callMode ) )
                                    {
TFLOGSTRING("TSY: CMmMessageRouterProxy::RouteCompletion: Special case before CompleteDial");                                    
                                    mmCall->CompleteDial( aResult );
                                    break;
                                    }
                                    
                                if  ( mmCall->ServiceRequested( 
                                    CMmCallTsy::EMultimodeCallDialNoFdnCheck ) 
                                    && mmCall->CallMode() == callMode )
                                    {
TFLOGSTRING("TSY: CMmMessageRouterProxy::RouteCompletion: Special case before CompleteDialNoFdn");                                          
                                    mmCall->CompleteDialNoFdn( aResult );
                                    break;
                                    }
                                }
                            }
                        }
                    }
                break;
                }
            default:
                break;
            }
        }
    }
    
// ---------------------------------------------------------------------------
// CMmMessageRouterProxy::RegisterTsyObject
// Registers a Tsy object for request and notification completions
// (other items were commented in a header).
// ---------------------------------------------------------------------------
//  
void CMmMessageRouterProxy::SetPhoneTsy(
    CMmPhoneTsy* aMmPhone )
    {
    iMmPhone = aMmPhone;
    }

//  End of File
