// Copyright (c) 2008-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 <e32def.h>
#include <satcs.h>
#include <pcktcs.h>
#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
#include <ctsy/rmmcustomapi.h>

#include <ctsy/ltsy/mltsydispatchfactory.h>

#include "cmessagerouter.h"
#include <ctsy/ltsy/sat_defs.h>
#include <ctsy/ltsy/cctsydispatchercallback.h>
#include <ctsy/ltsy/ltsylogger.h>
#include "tdispatcherholder.h"
#include "requestqueueoneshot.h"
#include "ctsydispatcherpanic.h"

#include "ccallcontroldispatcher.h"
#include "cphonedispatcher.h"
#include "csecuritydispatcher.h"
#include "cphonebookendispatcher.h"
#include "ccellbroadcastdispatcher.h"
#include "cphonebookondispatcher.h"
#include "cphonebookdispatcher.h"
#include "csatdispatcher.h"
#include "csimdispatcher.h"
#include "csmsdispatcher.h"
#include "ccallcontrolmultipartydispatcher.h"
#include "csupplementaryservicesdispatcher.h"
#include "cpacketservicesdispatcher.h"



TMessageManagerCallbackProxy::TMessageManagerCallbackProxy(MmMessageManagerCallback& aCtsyMessageManagerCallback)
: iCtsyMessageManagerCallback(&aCtsyMessageManagerCallback)
	{
	} // TMessageManagerCallbackProxy::TMessageManagerCallbackProxy

TMessageManagerCallbackProxy::TMessageManagerCallbackProxy()
: iCtsyMessageManagerCallback(NULL)
	{
	}

void TMessageManagerCallbackProxy::SetMessageManagerCallbackProxy(MmMessageManagerCallback& aCtsyMessageManagerCallback)
	{
	iCtsyMessageManagerCallback = &aCtsyMessageManagerCallback;
	}

void TMessageManagerCallbackProxy::Complete( TInt aIpc, TInt aResult )
/**
 * Completes requests / indications back to the Common TSY.
 *
 * @param aIpc The IPC to complete.
 * @param aResult The result code of the request / indication.
 */
	{
	TSYLOGENTRYEXITARGS(_L8(" [IPC=%d, result=%d]"), aIpc, aResult);
	ASSERT(iCtsyMessageManagerCallback);
	iCtsyMessageManagerCallback->Complete(aIpc, aResult);
	} // TMessageManagerCallbackProxy::Complete


void TMessageManagerCallbackProxy::Complete( TInt aIpc, CMmDataPackage* aData, TInt aResult )
/**
 * Completes requests / indications back to the Common TSY.
 *
 * @param aIpc The IPC to complete.
 * @param aData Package encapulating the data relating to the request / indication.
 * @param aResult The result code of the request / indication.
 */
	{
	TSYLOGENTRYEXITARGS(_L8(" [IPC=%d, result=%d, aData=0x%x]"), aIpc, aResult, aData);
	ASSERT(iCtsyMessageManagerCallback);
	iCtsyMessageManagerCallback->Complete(aIpc, aData, aResult);
	} // TMessageManagerCallbackProxy::Complete


CMessageRouter* CMessageRouter::NewL(MmMessageManagerCallback& aMessageManagerCallback)
    {
    TSYLOGENTRYEXIT;

    CMessageRouter* const self = new(ELeave) CMessageRouter(aMessageManagerCallback);
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
    }

CMessageRouter::CMessageRouter(MmMessageManagerCallback& aMessageManagerCallback)
	: 	iMessageManagerCallbackProxy(aMessageManagerCallback),
		iSatMessageManagerCallbackProxy()
    {
    }


void CMessageRouter::ConstructL()
/**
 * Second phase constructor.
 */
    {
    TSYLOGENTRYEXIT;

    iRequestQueueOneShot = CRequestQueueOneShot::NewL();

    // Create callback object
    iCtsyDispatcherCallback = CCtsyDispatcherCallback::NewL();
    
    
    // The following code loads the LicenseeSkeletonLTSY.dll
    // This LTSY is for testing purposes only. In a real
    // environment, the licensee is expected to provide their own 
    // LTSY, which should adhere to the  MLtsyDispatchFactoryV1 interface
    
	#define TEST_CODE
	    
    _LIT(KLicenseeLTSYDllName, "licenseeskeletontsy.dll");    
    
    User::LeaveIfError(iLoadedLib.Load(KLicenseeLTSYDllName));
    typedef MLtsyFactoryBase* (*LTsyFactoryL)();
    LTsyFactoryL libEntry = (LTsyFactoryL)iLoadedLib.Lookup(1);
    MLtsyFactoryBase* ltsyfactory = (MLtsyFactoryBase*)(*libEntry)();	// libEntry may leave.
    iLtsyFactoryV1 = static_cast<MLtsyDispatchFactoryV1*>(ltsyfactory);
    
    iLtsyFactoryV1->ConstructL(*iCtsyDispatcherCallback);

    // Create the dispatchers

	iCtsyDispatcherCallControlDispatcher = CCallControlDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherPhoneDispatcher = CPhoneDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, iSatMessageManagerCallbackProxy,
			*iRequestQueueOneShot, *this);


	iCtsyDispatcherSecurityDispatcher = CSecurityDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherPhonebookEnDispatcher = CPhonebookEnDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherCellBroadcastDispatcher = CCellBroadcastDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherPhonebookOnDispatcher = CPhonebookOnDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherPhonebookDispatcher = CPhonebookDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherSimDispatcher = CSimDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherSmsDispatcher = CSmsDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherCallControlMultipartyDispatcher = CCallControlMultipartyDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherSupplementaryServicesDispatcher = CSupplementaryServicesDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherPacketServicesDispatcher = CPacketServicesDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, *iRequestQueueOneShot);


	iCtsyDispatcherSatDispatcher = CSatDispatcher::NewL(
			*iLtsyFactoryV1, iMessageManagerCallbackProxy, iSatMessageManagerCallbackProxy, *iRequestQueueOneShot);



	iDispatcherHolder = new (ELeave) TDispatcherHolder(
			*iCtsyDispatcherCallControlDispatcher,
			*iCtsyDispatcherPhoneDispatcher,
			*iCtsyDispatcherSecurityDispatcher,
			*iCtsyDispatcherPhonebookEnDispatcher,
			*iCtsyDispatcherCellBroadcastDispatcher,
			*iCtsyDispatcherPhonebookOnDispatcher,
			*iCtsyDispatcherPhonebookDispatcher,
			*iCtsyDispatcherSimDispatcher,
			*iCtsyDispatcherSmsDispatcher,
			*iCtsyDispatcherCallControlMultipartyDispatcher,
			*iCtsyDispatcherSupplementaryServicesDispatcher,
			*iCtsyDispatcherPacketServicesDispatcher,
			*iCtsyDispatcherSatDispatcher);

    iCtsyDispatcherCallback->SetDispatcherHolder(*iDispatcherHolder);

	iCtsyDispatcherCallControlDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherPhoneDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherSecurityDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherPhonebookEnDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherCellBroadcastDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherPhonebookOnDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherPhonebookDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherSimDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherSmsDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherCallControlMultipartyDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherSupplementaryServicesDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherPacketServicesDispatcher->SetDispatcherHolder(*iDispatcherHolder);
	iCtsyDispatcherSatDispatcher->SetDispatcherHolder(*iDispatcherHolder);

    StartBootSequenceL();
    } // CMessageRouter::ConstructL

void CMessageRouter::SetSatMessageManager(MmMessageManagerCallback& aMessageManagerCallback)
	{
	TSYLOGENTRYEXIT;
	iSatMessageManagerCallbackProxy.SetMessageManagerCallbackProxy(aMessageManagerCallback);
	}

void CMessageRouter::SetSatCallOriginInterface(MStkTsyCallOrigin& aSatCallOrigin)
	{
	TSYLOGENTRYEXIT;
	//this pointer is initialised in ConstructL
	iCtsyDispatcherSatDispatcher->SetSatCallOriginInterface(aSatCallOrigin);
	}

CMessageRouter::~CMessageRouter()
    {
    TSYLOGENTRYEXIT;

    if (iLtsyFactoryV1)
    	{
    	iLtsyFactoryV1->Release();
    	iLtsyFactoryV1 = NULL;
    	}

    iLoadedLib.Close();
    
    // Delete dispatchers

	delete iCtsyDispatcherCallControlDispatcher;
    iCtsyDispatcherCallControlDispatcher = NULL;

	delete iCtsyDispatcherPhoneDispatcher;
    iCtsyDispatcherPhoneDispatcher = NULL;

	delete iCtsyDispatcherSecurityDispatcher;
    iCtsyDispatcherSecurityDispatcher = NULL;

	delete iCtsyDispatcherPhonebookEnDispatcher;
    iCtsyDispatcherPhonebookEnDispatcher = NULL;

	delete iCtsyDispatcherCellBroadcastDispatcher;
    iCtsyDispatcherCellBroadcastDispatcher = NULL;

	delete iCtsyDispatcherPhonebookOnDispatcher;
    iCtsyDispatcherPhonebookOnDispatcher = NULL;

	delete iCtsyDispatcherPhonebookDispatcher;
    iCtsyDispatcherPhonebookDispatcher = NULL;

	delete iCtsyDispatcherSimDispatcher;
    iCtsyDispatcherSimDispatcher = NULL;

	delete iCtsyDispatcherSmsDispatcher;
    iCtsyDispatcherSmsDispatcher = NULL;

	delete iCtsyDispatcherCallControlMultipartyDispatcher;
    iCtsyDispatcherCallControlMultipartyDispatcher = NULL;

	delete iCtsyDispatcherSupplementaryServicesDispatcher;
    iCtsyDispatcherSupplementaryServicesDispatcher = NULL;

	delete iCtsyDispatcherPacketServicesDispatcher;
    iCtsyDispatcherPacketServicesDispatcher = NULL;

	delete iCtsyDispatcherSatDispatcher;
    iCtsyDispatcherSatDispatcher = NULL;

    delete iCtsyDispatcherCallback;
    iCtsyDispatcherCallback = NULL;

    delete iDispatcherHolder;
    iDispatcherHolder = NULL;

    delete iRequestQueueOneShot;
    iRequestQueueOneShot = NULL;

    } // CMessageRouter::~CMessageRouter


void CMessageRouter::StartBootSequenceL()
/**
 * Second initialisation phase.
 */
    {
    TSYLOGENTRYEXIT;

    // Kick off boot sequence
    TInt ret = ExtFuncL(EMmTsyBootNotifyModemStatusReadyIPC, NULL);
    LOG(_L8("ExtFuncL(EMmTsyBootNotifyModemStatusReadyIPC returned %d"), ret);
    User::LeaveIfError(ret);
    } // CMessageRouter::StartBootSequenceL


TInt CMessageRouter::ExtFuncL(TInt aIpc, const CMmDataPackage* aDataPackage)
/**
 * Part of the MMessageRouter interface which is part of the LTSY plugin
 * interface.
 *
 * This function is the entry point for a request from the CTSY into the
 * LTSY.
 *
 * @param aIpc The IPC of the request.
 *
 * @param aDataPackage The data package containing the parameters of the
 * request.
 *
 * @return Error code to propagate back up to the CTSY relating to making
 * this request. Returns KErrNone on success, KErrNotSupported if the LTSY
 * does not support this request (it could not find a message handler to
 * handle this request).
 */
	{
	TSYLOGENTRYEXITARGS(_L8(" [IPC=%d]"), aIpc);

	TInt ret = KErrNotSupported;

	// Dispatch to Licensee LTSY
	switch (aIpc)
		{

		// CallControl Functional Unit IPCs

	case EEtelCallAnswer:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchAnswerL(aDataPackage);
		break;
	case EMobileCallAnswerISV:
		ret = iCtsyDispatcherCallControlDispatcher->DispatchAnswerIsvL(aDataPackage);
		break;
	case EMobileCallHold:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchHoldL(aDataPackage);
		break;
	case EMobileCallDialEmergencyCall:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchDialEmergencyL(aDataPackage);
		break;
	case EMobilePhoneStopDTMFTone:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchStopDtmfToneL(aDataPackage);
		break;
	case EMobileCallDialISV:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchDialIsvL(aDataPackage);
		break;
	case EMobilePhoneSetALSLine:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchSetActiveAlsLineL(aDataPackage);
		break;
	case EMobilePhoneSendDTMFTonesCancel:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchSendDtmfTonesCancelL(aDataPackage);
		break;
	case EEtelCallHangUp:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchHangUpL(aDataPackage);
		break;
	case EMobileCallResume:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchResumeL(aDataPackage);
		break;
	case EMobileCallSetDynamicHscsdParams:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchSetDynamicHscsdParamsL(aDataPackage);
		break;
	case EEtelCallDial:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchDialL(aDataPackage);
		break;
	case EMobileCallDialNoFdnCheck:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchDialNoFdnCheckL(aDataPackage);
		break;
	case EMobileCallTransfer:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchTransferL(aDataPackage);
		break;
	case EMobilePhoneSendDTMFTones:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchSendDtmfTonesL(aDataPackage);
		break;
	case EMobilePhoneGetIdentityServiceStatus:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchGetIdentityServiceStatusL(aDataPackage);
		break;
	case EMobileCallSwap:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchSwapL(aDataPackage);
		break;
	case EMobilePhoneContinueDTMFStringSending:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchContinueDtmfStringSendingL(aDataPackage);
		break;
	case EEtelCallLoanDataPort:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchLoanDataPortL(aDataPackage);
		break;
	case EEtelCallRecoverDataPort:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchRecoverDataPortL(aDataPackage);
		break;
	case EMobilePhoneStartDTMFTone:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchStartDtmfToneL(aDataPackage);
		break;
	case EMobilePhoneGetALSLine:
		ret = iCtsyDispatcherCallControlDispatcher->DispatchGetActiveAlsLineL();
		break;
	case ECustomCheckEmergencyNumberIPC:
		ret = iCtsyDispatcherCallControlDispatcher->DispatchQueryIsEmergencyNumberL(aDataPackage);
		break;
	case ECustomCheckAlsPpSupportIPC:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchGetAlsPpSupportL();
		break;
	case ECustomGetAlsBlockedIPC:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchGetAlsBlockedStatusL();
		break;
	case ECustomSetAlsBlockedIPC:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchSetAlsBlockedL(aDataPackage);
		break;
	case ECustomGetLifeTimeIPC:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchGetLifeTimeL();
		break;
	case ECustomTerminateCallIPC:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchTerminateCallL(aDataPackage);
		break;
	case ECustomGetIccCallForwardingStatusIPC:
	    ret = iCtsyDispatcherCallControlDispatcher->DispatchGetCallForwardingIndicatorL();
		break;
	case ECtsyUpdateLifeTimeReq:
		ret = iCtsyDispatcherCallControlDispatcher->DispatchUpdateLifeTimeL(aDataPackage);
		break;

		// Phone functionality

	case EMobilePhoneGetFdnStatus:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetFdnStatusL();
		break;
	case EMobilePhoneGetNetworkRegistrationStatus:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetNetworkRegistrationStatusL();
		break;
	case EMmTsyBootNotifyModemStatusReadyIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchBootNotifyModemStatusReadyL();
		break;
	case EMmTsyBootNotifySimStatusReadyIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchBootNotifySimStatusReadyL();
		break;
	case EMobilePhoneGetHomeNetwork:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetHomeNetworkL();
		break;
	case EMmTsySimRefreshRegisterIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchSimRefreshRegisterL(aDataPackage);
		break;
	case EMmTsyGetCallForwardingNumberIPC: 		// Deprecated parts of the boot sequence,
	                                            // deliberately not passed to Licensee LTSY

	case EMmTsyGetCustomVendorExtPtrIPC:		// Part of deprecated custom API initialisation
												// deliberately not passed to Licensee LTSY
		break;
	case EReadViagHomeZoneCacheIPC:				// Deliberated not passed to LTSY
												// Leave like this unless this custom functionality
												// is needed
		break;
	case ECustomNetWakeupIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchNspsWakeupL();
		break;
	case ECustomSetSystemNetworkModeIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchSetSystemNetworkModeL(aDataPackage);
		break;
	case ECustomGetCurrentSystemNetworkModesIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetCurrentSystemNetworkModesL();
		break;
	case ECustomResetNetServerIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchResetNetServerL();
		break;
	case ECustomSetAlwaysOnMode:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchSetAlwaysOnModeL(aDataPackage);
		break;
	case ECustomSetDriveModeIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchSetDriveModeL(aDataPackage);
		break;
	case ECustomReadHSxPAStatusIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetHspaStatusL();
		break;
	case ECustomWriteHSxPAStatusIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchSetHspaStatusL(aDataPackage);
		break;
	case ECustomGetNetworkProviderNameIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetNetworkProviderNameL();
		break;
	case ECustomGetOperatorNameIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetOperatorNameL();
		break;
	case ECustomGetCellInfoIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetCellInfoL();
		break;
	case ECtsyPhoneTerminateAllCallsReq:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchTerminateAllCallsL(aDataPackage);
		break;

		// Phone Functional Unit IPCs

	case EMobilePhoneGetServiceProviderName:
	    ret = iCtsyDispatcherPhoneDispatcher->DispatchGetServiceProviderNameL();
		break;
	case EMobilePhoneGetPhoneId:
	    ret = iCtsyDispatcherPhoneDispatcher->DispatchGetPhoneIdL(KPhoneIdReqOriginPhoneFu);
		break;
	case EMobilePhoneGetDetectedNetworksV2Phase1:
	    ret = iCtsyDispatcherPhoneDispatcher->DispatchGetDetectedNetworksL();
		break;
	case EMobilePhoneGetDetectedNetworksCancel:
	    ret = iCtsyDispatcherPhoneDispatcher->DispatchGetDetectedNetworksCancelL();
		break;
	case EMobilePhoneSelectNetwork:
	    ret = iCtsyDispatcherPhoneDispatcher->DispatchSelectNetworkL(aDataPackage);
		break;
	case EMobilePhoneSelectNetworkCancel:
	    ret = iCtsyDispatcherPhoneDispatcher->DispatchSelectNetworkCancelL();
		break;
	case EMobilePhoneSetNetworkSelectionSetting:
	    ret = iCtsyDispatcherPhoneDispatcher->DispatchSetNetworkSelectionSettingL(aDataPackage);
		break;
	case ECtsyPhoneCellInfoIndReq:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchRegisterCellInfoChangeNotificationL();
		break;
	case ECtsyPhoneCellInfoReq:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetPhoneCellInfoL();
		break;
	case ECustomGetServiceTableSupportbyApplicationIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetUsimServiceSupportL(aDataPackage);
		break;
	case EMobilePhoneGetCurrentActiveUSimApplication:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetCurrentActiveUsimApplicationL();
		break;
	case ECustomGetBandSelectionIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetSystemNetworkBandL();
		break;
	case ECustomSetBandSelectionIPC:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchSetSystemNetworkBandL(aDataPackage);
		break;

		// Security Functional Unit IPCs

	case EMobilePhoneGetSecurityCodeInfo:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchGetSecurityCodeInfoL(aDataPackage);
		break;
	case EMobilePhoneGetLockInfo:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchGetLockInfoL(aDataPackage);
		break;
	case EMobilePhoneAbortSecurityCode:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchAbortSecurityCodeL(aDataPackage);
		break;
	case EMmTsySecurityGetSimActivePinStateIPC:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchGetCurrentActivePinL();
		break;
	case EMobilePhoneSetLockSetting:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchSetLockSettingL(aDataPackage);
		break;
	case EMobilePhoneVerifySecurityCode:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchVerifySecurityCodeL(aDataPackage);
		break;
	case EMmTsyPhoneGetPin1DisableSupportedIPC:
		ret = iCtsyDispatcherSecurityDispatcher->DispatchGetPin1DisableSupportedL();
		break;		
	case ECustomCheckSecurityCodeIPC:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchCheckSecurityCodeL(aDataPackage);
		break;
	case ECustomDisablePhoneLockIPC:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchDisablePhoneLockL(aDataPackage);
		break;
	case ECustomGetCipheringInfoIPC:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchGetCipheringInfoL();
		break;
	case ECustomIsBlockedIPC:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchIsSecurityCodeBlockedL(aDataPackage);
		break;
	case ECustomCheckSecurityCodeCancelIPC:
	    ret = iCtsyDispatcherSecurityDispatcher->DispatchCheckSecurityCodeCancelL(aDataPackage);
		break;		

		// PhonebookEn Functional Unit IPCs

	case EMmTsyENStoreGetInfoIPC:
	    ret = iCtsyDispatcherPhonebookEnDispatcher->DispatchStoreGetInfoL();
		break;
	case EMmTsyENStoreReadAllPhase1IPC:
	    ret = iCtsyDispatcherPhonebookEnDispatcher->DispatchStoreReadAllL();
		break;
	case EMmTsyENStoreReadIPC:
	    ret = iCtsyDispatcherPhonebookEnDispatcher->DispatchStoreReadEntryL(aDataPackage);
		break;

		// CellBroadcast Functional Unit IPCs

	case EMobileBroadcastMessagingSetFilterSetting:
	    ret = iCtsyDispatcherCellBroadcastDispatcher->DispatchSetBroadcastFilterSettingL(aDataPackage);
		break;
	case EMobileBroadcastMessagingReceiveMessage:
	    ret = iCtsyDispatcherCellBroadcastDispatcher->DispatchActivateBroadcastReceiveMessageL(aDataPackage);
		break;
	case EMobileBroadcastMessagingReceiveMessageCancel:
	    ret = iCtsyDispatcherCellBroadcastDispatcher->DispatchReceiveMessageCancelL(aDataPackage);
		break;
	case ECustomStartSimCbTopicBrowsingIPC:
	    ret = iCtsyDispatcherCellBroadcastDispatcher->DispatchStartSimCbTopicBrowsingL();
		break;	
	case ECustomDeleteSimCbTopicIPC:
	    ret = iCtsyDispatcherCellBroadcastDispatcher->DispatchDeleteSimCbTopicL(aDataPackage);
		break;	

		// PhonebookOn Functional Unit IPCs

	case EMmTsyONStoreReadIPC:
	    ret = iCtsyDispatcherPhonebookOnDispatcher->DispatchStoreReadL(aDataPackage);
		break;
	case EMmTsyONStoreDeleteAllIPC:
	    ret = iCtsyDispatcherPhonebookOnDispatcher->DispatchStoreDeleteAllL();
		break;
	case EMmTsyONStoreReadEntryIPC:
	    ret = iCtsyDispatcherPhonebookOnDispatcher->DispatchStoreReadEntryL(aDataPackage);
		break;
	case EMmTsyONStoreGetInfoIPC:
	    ret = iCtsyDispatcherPhonebookOnDispatcher->DispatchStoreGetInfoL();
		break;
	case EMmTsyONStoreReadSizeIPC:
	    ret = iCtsyDispatcherPhonebookOnDispatcher->DispatchStoreGetReadStoreSizeL();
		break;
	case EMmTsyONStoreDeleteIPC:
	    ret = iCtsyDispatcherPhonebookOnDispatcher->DispatchStoreDeleteEntryL(aDataPackage);
		break;
	case EMmTsyONStoreWriteEntryIPC:
	    ret = iCtsyDispatcherPhonebookOnDispatcher->DispatchStoreWriteEntryL(aDataPackage);
		break;
	case EMmTsyONStoreWriteIPC:
	    ret = iCtsyDispatcherPhonebookOnDispatcher->DispatchStoreWriteL(aDataPackage);
		break;
	case EMmTsyONStoreWriteSizeIPC:
	    ret = iCtsyDispatcherPhonebookOnDispatcher->DispatchStoreGetStoreSizeL();
		break;

		// Phonebook Functional Unit IPCs

	case EMmTsyPhoneBookStoreReadIPC:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchStoreReadEntryL(aDataPackage);
		break;
	case EMmTsyPhoneBookStoreDeleteIPC:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchStoreDeleteEntryL(aDataPackage);
		break;
	case EMmTsyPhoneBookStoreCacheIPC:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchStoreCacheL(aDataPackage);
		break;
	case EMmTsyPhoneBookStoreGetInfoIPC:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchStoreGetInfoL(aDataPackage);
		break;
	case EMmTsyPhoneBookStoreInitIPC:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchStoreInitialiseL(aDataPackage);
		break;
	case EMmTsyPhoneBookStoreDeleteAllIPC:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchStoreDeleteAllL(aDataPackage);
		break;
	case EMobilePhoneStoreReadAllPhase1:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchSmsStoreReadAllL();
		break;
	case EMmTsyPhoneBookStoreWriteIPC:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchStoreWriteEntryL(aDataPackage);
		break;
	case EMobilePhoneGetPhoneStoreInfo:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchGetPhoneStoreInfoL(aDataPackage);
		break;
	case EMobilePhoneStoreDelete:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchSmsStoreDeleteEntryL(aDataPackage);
		break;
	case EMobilePhoneStoreDeleteAll:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchSmsStoreDeleteAllL();
		break;
	case EMobilePhoneStoreGetInfo:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchSmsStoreGetInfoL();
		break;
	case EMobilePhoneStoreRead:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchSmsStoreReadEntryL(aDataPackage);
		break;
	case EMobilePhoneStoreWrite:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchSmsStoreWriteEntryL(aDataPackage);
		break;
	case EMmTsyPhoneBookStoreCacheCancelIPC:
	    ret = iCtsyDispatcherPhonebookDispatcher->DispatchStoreCacheCancelL(aDataPackage);
		break;

		// Sim Functional Unit IPCs

	case EMobilePhoneGetAPNControlListServiceStatus:
	    ret = iCtsyDispatcherSimDispatcher->DispatchGetApnControlListServiceStatusL();
		break;
	case EMobilePhoneDeleteAPNName:
	    ret = iCtsyDispatcherSimDispatcher->DispatchDeleteApnNameL(aDataPackage);
		break;
	case EMobilePhoneEnumerateAPNEntries:
	    ret = iCtsyDispatcherSimDispatcher->DispatchEnumerateApnEntriesL();
		break;
	case EMobilePhoneChangeSecurityCode:
	    ret = iCtsyDispatcherSimDispatcher->DispatchChangeSecurityCodeL(aDataPackage);
		break;
	case EMobilePhoneSetFdnSetting:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSetFdnSettingL(aDataPackage);
		break;
	case EMobilePhoneGetCustomerServiceProfile:
	    ret = iCtsyDispatcherSimDispatcher->DispatchGetCustomerServiceProfileL();
		break;
	case EMobilePhoneGetSubscriberId:
	    ret = iCtsyDispatcherSimDispatcher->DispatchGetSubscriberIdL();
		break;
	case EMobilePhoneAppendAPNName:
	    ret = iCtsyDispatcherSimDispatcher->DispatchAppendApnNameL(aDataPackage);
		break;
	case EMmTsySimGetICCType:
	    ret = iCtsyDispatcherSimDispatcher->DispatchGetIccTypeL();
		break;
	case EMobilePhoneSetIccMessageWaitingIndicators:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSetIccMessageWaitingIndicatorsL(aDataPackage);
		break;
	case EMobilePhoneSetAPNControlListServiceStatus:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSetApnControlListServiceStatusL(aDataPackage);
		break;
	case EMobilePhoneGetAPNname:
	    ret = iCtsyDispatcherSimDispatcher->DispatchGetApnNameL(aDataPackage);
		break;
	case EMmTsySimRefreshDoneIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSimRefreshDoneL(aDataPackage);
		break;
	case EMobilePhoneGetServiceTable:
		ret = iCtsyDispatcherSimDispatcher->DispatchGetServiceTableL(aDataPackage);
		break;
	case EMobilePhoneGetIccMessageWaitingIndicators:
		ret = iCtsyDispatcherSimDispatcher->DispatchGetIccMessageWaitingIndicatorsL();
		break;
	case ECustomSimLockActivateIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSimLockActivateL(aDataPackage);
		break;
	case ECustomSimLockDeActivateIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSimLockDeActivateL(aDataPackage);
		break;
	case ECustomGetATRIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchGetAnswerToResetL(aDataPackage);
		break;
	case ECustomGetSimCardReaderStatusIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchGetSimCardReaderStatusL();
		break;
	case ECustomGetSimAuthenticationDataIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchGetSimAuthenticationDataL(aDataPackage);
		break;
	case ECustomPowerSimOffIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchPowerSimOffL();
		break;
	case ECustomPowerSimOnIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchPowerSimOnL();
		break;
	case ECustomReadSimFileIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchReadSimFileL(aDataPackage);
		break;
	case ECustomSendAPDUReqIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSendApduRequestL(aDataPackage);
		break;
	case ECustomSendAPDUReqV2IPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSendApduRequestV2L(aDataPackage);
		break;
	case ECustomSimWarmResetIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSimWarmResetL();
		break;
	case ECustomSetSimMessageStatusReadIPC:
	    ret = iCtsyDispatcherSimDispatcher->DispatchSetSimMessageStatusReadL(aDataPackage);
		break;

	// Sms Functional Unit IPCs

	case EMmTsyActivateSmsRouting:
		ret = iCtsyDispatcherSmsDispatcher->DispatchActivateSmsRoutingL();
		break;
	case EMmTsyDeactivateSmsRouting:
		ret = KErrNone; //do nothing for deactivating sms routing
		break;
	case EMmTsySmsSendSatMessage:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchSendSatSmsL(aDataPackage);
		break;
	case EMobileSmsMessagingGetMessageStoreInfo:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchGetSmsStoreInfoL();
		break;
	case EMobileSmsMessagingGetSmspListPhase1:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchGetSmspListL();
		break;
	case EMobileSmsMessagingNackSmsStored:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchNackSmsStoredL(aDataPackage);
		break;
	case EMobileSmsMessagingAckSmsStored:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchAckSmsStoredL(aDataPackage);
		break;
	case EMobileSmsMessagingResumeSmsReception:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchResumeSmsReceptionL();
		break;
	case EMobileSmsMessagingSendMessage:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchSendSmsMessageL(aDataPackage);
		break;
	case EMobileSmsMessagingSendMessageNoFdnCheck:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchSendSmsMessageNoFdnCheckL(aDataPackage);
		break;
	case EMobileSmsMessagingSetMoSmsBearer:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchSetMoSmsBearerL(aDataPackage);
		break;
	case EMobileSmsMessagingStoreSmspList:
	    ret = iCtsyDispatcherSmsDispatcher->DispatchStoreSmspListEntryL(aDataPackage);
		break;

		// CallControlMultiparty Functional Unit IPCs

	case EMobileConferenceCallHangUp:
	    ret = iCtsyDispatcherCallControlMultipartyDispatcher->DispatchConferenceHangUpL(aDataPackage);
		break;
	case EMobileConferenceCallAddCall:
	    ret = iCtsyDispatcherCallControlMultipartyDispatcher->DispatchConferenceAddCallL(aDataPackage);
		break;
	case EMobileConferenceCallCreateConference:
	    ret = iCtsyDispatcherCallControlMultipartyDispatcher->DispatchCreateConferenceL(aDataPackage);
		break;
	case EMobileConferenceCallSwap:
	    ret = iCtsyDispatcherCallControlMultipartyDispatcher->DispatchConferenceSwapL(aDataPackage);
		break;
	case EMobileCallGoOneToOne:
		ret = iCtsyDispatcherCallControlMultipartyDispatcher->DispatchConferenceGoOneToOneL(aDataPackage);
		break;

		// SupplementaryServices Functional Unit IPCs

	case EMobilePhoneSendNetworkServiceRequestNoFdnCheck:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchSendNetworkServiceRequestNoFdnCheckL(aDataPackage);
		break;
	case EMobilePhoneGetWaitingStatusPhase1:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchGetCallWaitingStatusL();
		break;
	case EMobilePhoneSendNetworkServiceRequest:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchSendNetworkServiceRequestL(aDataPackage);
		break;
	case EMobilePhoneGetBarringStatusPhase1:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchGetCallBarringStatusL(aDataPackage);
		break;
	case EMobilePhoneSetCallBarringStatus:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchSetCallBarringStatusL(aDataPackage);
		break;
	case EMobilePhoneSetCallForwardingStatus:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchSetCallForwardingStatusL(aDataPackage);
		break;
	case EMobilePhoneSetCallWaitingStatus:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchSetCallWaitingStatusL(aDataPackage);
		break;
	case EMobilePhoneSetSSPassword:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchSetSsPasswordL(aDataPackage);
		break;
	case EMobilePhoneGetCallForwardingStatusPhase1:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchGetCallForwardingStatusL(aDataPackage);
		break;
	case EMobileUssdMessagingSendMessage:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchSendUssdMessageL(aDataPackage);
	    break;
	case EMobileUssdMessagingSendMessageNoFdnCheck:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchSendUssdMessageNoFdnCheckL(aDataPackage);
		break;
	case EMobileUssdMessagingSendRelease:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchSendUssdReleaseL();
		break;
	case ECustomClearCallBlackListIPC:
	    ret = iCtsyDispatcherSupplementaryServicesDispatcher->DispatchClearBlacklistL();
		break;

		// PacketServices Functional Unit IPCs

	case EPacketAttach:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchPacketAttachL();
		break;
	case EPacketGetAttachMode:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchGetPacketAttachModeL(aDataPackage);
		break;
	case EPacketGetNtwkRegStatus:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchGetPacketNetworkRegistrationStatusL();
		break;
	case EPacketDetach:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchPacketDetachL();
		break;
	case EPacketContextSetConfig:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchSetPdpContextConfigL(aDataPackage);
		break;
	case EPacketContextModifyActiveContext:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchModifyActivePdpContextL(aDataPackage);
		break;
	case EPacketContextInitialiseContext:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchInitialisePdpContextL(aDataPackage);
		break;
	case EPacketContextDelete:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchDeletePdpContextL(aDataPackage);
		break;
	case EPacketSetAttachMode:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchSetPacketAttachModeL(aDataPackage);
		break;
	case EPacketNotifyStatusChange:
		ret = iCtsyDispatcherPacketServicesDispatcher->DispatchGetStatusL();
		break;
	case EPacketSetDefaultContextParams:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchSetDefaultPdpContextParamsL(aDataPackage);
		break;
	case EPacketContextActivate:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchActivatePdpContextL(aDataPackage);
		break;
	case EPacketQoSSetProfileParams:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchSetPdpContextQosL(aDataPackage);
		break;
	case EPacketRejectActivationRequest:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchRejectNetworkInitiatedContextActivationRequestL();
		break;
	case EPacketContextDeactivate:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchDeactivatePdpContextL(aDataPackage);
		break;
	case EPacketContextAddPacketFilter:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchAddPacketFilterL(aDataPackage);
		break;
	case EPacketContextRemovePacketFilter:
		ret = iCtsyDispatcherPacketServicesDispatcher->DispatchRemovePacketFilterL(aDataPackage);
		break;
	case EPacketInitProxiesIPC:
		// deliberately not passed to Licensee LTSY 
		ret = KErrNone;	
		break;
	case EPacketGetStaticCaps:
	    ret = iCtsyDispatcherPacketServicesDispatcher->DispatchGetStaticCapabilitiesL();
		break;
	case EPacketEnumerateMbmsMonitorServiceList:
		ret = iCtsyDispatcherPacketServicesDispatcher->DispatchGetMaxNoMonitoredServiceListsL();
		break;
	case EPacketEnumerateMbmsActiveServiceList:
		ret = iCtsyDispatcherPacketServicesDispatcher->DispatchGetMaxNoActiveServicesL();
		break;
	case ECtsyPacketMbmsInitialiseContextReq:
		ret = iCtsyDispatcherPacketServicesDispatcher->DispatchInitialiseMbmsContextL(aDataPackage);
		break;
	case EPacketGetMbmsNetworkServiceStatus:
		ret = iCtsyDispatcherPacketServicesDispatcher->DispatchGetMbmsNetworkServiceStatusL(aDataPackage);
		break;
	case EPacketUpdateMbmsMonitorServiceList:
		ret = iCtsyDispatcherPacketServicesDispatcher->DispatchUpdateMbmsMonitorServiceListL(aDataPackage);
		break;
	case EPacketContextUpdateMbmsSessionList:
		ret = iCtsyDispatcherPacketServicesDispatcher->DispatchUpdateMbmsSessionListL(aDataPackage);
		break;

		// Sat Functional Unit IPCs

	case ESatTsySmsDeliverReport:
	    ret = iCtsyDispatcherSatDispatcher->DispatchSmsDeliverReportL(aDataPackage);
		break;
	case ESatTsyGetImageInstance:
	    ret = iCtsyDispatcherSatDispatcher->DispatchGetImageInstanceL(aDataPackage);
		break;
	case ESatTsyGetIMEI:
		ret = iCtsyDispatcherPhoneDispatcher->DispatchGetPhoneIdL(KPhoneIdReqOriginSatFu);
		break;
	case ESatTsyGetIconData:
	    ret = iCtsyDispatcherSatDispatcher->DispatchGetIconDataL(aDataPackage);
		break;
	case ESatTsyGetClut:
	    ret = iCtsyDispatcherSatDispatcher->DispatchGetClutL(aDataPackage);
		break;
	case ESatTsyGetBearerCapability:
	    ret = iCtsyDispatcherSatDispatcher->DispatchGetDefaultBearerCapabilityL();
		break;
	case ESatTsySmsPpDdlStatus:
	    ret = iCtsyDispatcherSatDispatcher->DispatchSmsPpDdlStatusL();
		break;
	case ESatTsyMoSmsControlActivation:
	    ret = iCtsyDispatcherSatDispatcher->DispatchGetSmsControlActivatedL();
		break;
	case ESatTsyCellBroadcast:
	    ret = iCtsyDispatcherSatDispatcher->DispatchCellBroadcastL(aDataPackage);
		break;
	case ESatTsyAccTech:
	    ret = iCtsyDispatcherSatDispatcher->DispatchAccessTechnologyL();
		break;
	case ESatTsyTimingAdvance:
	    ret = iCtsyDispatcherSatDispatcher->DispatchTimingAdvanceL();
		break;
	case ESatNotifyMoSmControlRequest:
	    ret = iCtsyDispatcherSatDispatcher->DispatchNotifySmControlRequestL(aDataPackage);
		break;
	case ESatTsyProvideLocalInfo:
	    ret = iCtsyDispatcherSatDispatcher->DispatchProvideLocationInfoL();
		break;
	case ESatTsySetPolling:
	    ret = iCtsyDispatcherSatDispatcher->DispatchSetPollingIntervalL(aDataPackage);
		break;
	case ESatTsySmsPpDdl:
	    ret = iCtsyDispatcherSatDispatcher->DispatchSmsPpDdlL(aDataPackage);
		break;
	case ESatTsyLocalInformationNmr:
	    ret = iCtsyDispatcherSatDispatcher->DispatchLocalInformationNmrL();
		break;
	case ESatTsySendEnvelope:
	    ret = iCtsyDispatcherSatDispatcher->DispatchSendEnvelopeL(aDataPackage);
		break;
	case ESatTsyServiceRequest:
	    ret = iCtsyDispatcherSatDispatcher->DispatchServiceRequestL(aDataPackage);
		break;
	case ESatTsyReady:
	    ret = iCtsyDispatcherSatDispatcher->DispatchReadyL();
		break;
	case ESatTsyGetIfPendingNotification:
	    ret = iCtsyDispatcherSatDispatcher->DispatchPCmdNotificationL(aDataPackage);
		break;
	case ESatTsyEnvelopeError:
	    ret = iCtsyDispatcherSatDispatcher->DispatchUssdControlEnvelopeErrorL();
		break;
	case ESatTsyTimerExpiredIPC:
	    ret = iCtsyDispatcherSatDispatcher->DispatchTimerExpiredL(aDataPackage);
		break;
	case ESatTerminalRsp:
	    ret = iCtsyDispatcherSatDispatcher->DispatchTerminalRspL(aDataPackage);
		break;
	case ESatNotifySetUpCallPCmd:
		//This IPC is called when a call connected envelope event is delayed because the terminal response to
		//the set up call proactive command must be sent before the event download envelope.
		//so this internal ipc just forwards the saved envelope to the event download api as normal.
		ret = iCtsyDispatcherSatDispatcher->DispatchEventDownloadL(aDataPackage);
	    //ret = iCtsyDispatcherSatDispatcher->DispatchNotifySetUpCallPcmdL(aDataPackage);
		break;
	case ESatMenuSelection:
	    ret = iCtsyDispatcherSatDispatcher->DispatchMenuSelectionL(aDataPackage);
		break;
	case ESatEventDownload:
	    ret = iCtsyDispatcherSatDispatcher->DispatchEventDownloadL(aDataPackage);
		break;
	case ESatTsyUssdStatus:
		ret = iCtsyDispatcherSatDispatcher->DispatchGetUssdControlSupportedL();
		break;
	default:
		LOG(_L8("WARNING: CMessageRouter::ExtFuncL unhandled IPC=%d"), aIpc);
	 	break;
		} // switch (aIpc)

	return TSYLOGSETEXITERR(ret);
	} // CMessageRouter::ExtFuncL

void CMessageRouter::HandleNotifyModemReadyReceivedL()
	{
	/*
	 * This is the first IPC that is sent from CtsyDispatcher->CTSY indicating modem
	 * is ready. We piggy-back on the back of this to now query what callback indicators
	 * are supported.  We do it here rather than at construction because for some basebands
	 * it is possible this information must be read from configuration or even queried asynchronously.
	 * If it is async they can do it before invoking the CallbackBootNotifyModemStatusReady
	 *
	 */
	QuerySupporterCallbackIndicators();

	// Method to retrieve network related information which will get stored in various Ctsy caches.
	RetrieveNetworkInfoL();
	}

void CMessageRouter::QuerySupporterCallbackIndicators()
	{

	// Query the support for all the callback indicators
	// At present we do not do anything with this information (other than log it)
	// but in the future we could link this up to
	// registering for notifiers.  So if a baseband does not support the notifier
	// then client can be returned
	// KErrNotSUpported rather than just never completing.

	TUint32 indmask;
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchCallControlFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("CallControl indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchPhoneFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("Security indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchSecurityFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("CallControl indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchPhonebookEnFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("Phonebook EN indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchCellBroadcastFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("Cell Broadcast indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchPhonebookOnFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("Phonebook ON indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchPhonebookFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("Phonebook indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchSimFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("SIM indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchSmsFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("Sms indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchCallControlMultipartyFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("Call Control Multiparty indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchSupplementaryServicesFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("Supplementary Services indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchPacketServicesFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("Packet Services indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	iLtsyFactoryV1->IsCallbackIndicatorSupported(KDispatchSatFuncUnitId, EIndIdGroup1, indmask);
	LOG(_L8("SAT indicator support. GroupID=%d, bitmask = 0x%x"), EIndIdGroup1, indmask);
	}

void CMessageRouter::RetrieveNetworkInfoL()
	{
	// Call methods to get various network information from the Ltsy
	iCtsyDispatcherPhoneDispatcher->DispatchGetCurrentNetworkInfoL();
	iCtsyDispatcherPhoneDispatcher->DispatchGetNetworkModeL();
	iCtsyDispatcherPhoneDispatcher->DispatchGetNitzInfoL();
	iCtsyDispatcherPhoneDispatcher->DispatchGetSignalStrengthL();
	iCtsyDispatcherPhoneDispatcher->DispatchGetBatteryInfoL();
	}
