adaptationlayer/tsy/nokiatsy_dll/src/cmmcustommesshandler.cpp
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/adaptationlayer/tsy/nokiatsy_dll/src/cmmcustommesshandler.cpp	Fri Nov 06 17:28:23 2009 +0000
@@ -0,0 +1,8365 @@
+/*
+* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 "cmmcustommesshandler.h"
+#include "cmmsecuritymesshandler.h"
+#include "cmmstaticutility.h"
+#include "cmmnetmesshandler.h"
+#include "cmmnetoperatornamehandler.h"
+#include "cmmcallmesshandler.h"
+#include "cmmphonetsender.h"
+#include "cmmmessagerouter.h"
+#include "tsylogger.h"
+
+#include <tisi.h>
+#include <call_modemisi.h>
+#include <csdisi.h>
+#include <gssisi.h>
+
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+// Removed for Bridge camp!
+#include <mtcisi.h>
+#endif
+
+#include <infoisi.h>
+#include <net_modemisi.h>
+#include <uiccisi.h>
+#include <ss_wmisi.h>
+// #include <permisi.h> To be done in CPS
+#include <product_profile_definitions.h>
+
+#include <ctsy/serviceapi/mmgsmwcdmautils.h>
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
+
+#include <ctsy/serviceapi/gsmerror.h>
+#include <etelmmerr.h>
+
+#include "osttracedefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cmmcustommesshandlertraces.h"
+#endif
+
+// EXTERNAL DATA STRUCTURES
+    //None
+
+// EXTERNAL FUNCTION PROTOTYPES
+    //None
+
+// CONSTANTS
+// hard-coded transaction id for ISI messages
+const TUint8 KCustomTransId = 6;
+// const TUint8 KCustomWimTransId = 7;
+
+// Max length for HSXPA message request
+const TUint KHSxPAMaxMessageSize = 2;
+
+// Uicc Card Status Byte (hardcoded). Values are derived from APDU server
+// interface documentation. Bitfield READER_STATUS_BYTE
+const TUint8 KUiccCardStatusCardNotPresentOrPoweredOff = 0x10; //0001 0000
+const TUint8 KUiccCardStatusCardPresentAndPoweredOn = 0xD0; //1101 0000 (0001 0000|0x40|0x80)
+
+// Consts needed when constructing APDU's going to be sent to the UICC
+const TUint8 KEvenInstructionCode = 0x88;
+const TUint8 KOddInstructionCode  = 0x89;
+
+const TUint8 KFirstBlockOfAuthenticationData         = 0x80;
+const TUint8 KFirstBlockOfAuthenticationResponseData = 0xA0;
+
+const TUint8 KGsmAuthenticationContext  = 0x80; // 1000 0000
+const TUint8 K3GAuthenticationContext   = 0x81; // 1000 0001
+const TUint8 KGBAAuthenticationContext  = 0x84; // 1000 0100
+const TUint8 KMBMSAuthenticationContext = 0x85; // 1000 0101
+
+const TUint8 KMaximumLenOfDataExpected = 0x00;
+const TUint8 KRunGsmAlgorithmRespLen   = 0x0C;
+const TUint8 KClaNoSm = 0x00;
+const TUint8 KClaIcc  = 0xA0;
+
+const TUint8 KSw1Position = 0x02;
+const TUint8 KSw2Position = 0x01;
+
+const TUint8 KNormalCommandEnding                     = 0x00;
+const TUint8 KAppAuthErrorIncorrectMac                = 0x01;
+const TUint8 KCmdNotAllowedConditionsNotSatisfied     = 0x02;
+const TUint8 KWarningAuthRespAvailable                = 0x03;
+const TUint8 KWarningMoreDataAvailable                = 0x04;
+const TUint8 KAppErrorAuthMbmsKeyFresh                = 0x05;
+const TUint8 KAppErrorAuthMbmsOutOfMemMsk             = 0x06;
+const TUint8 KAppErrorAuthMbmsOutOfMemMuk             = 0x07;
+const TUint8 KWrongParametersDataNotFound             = 0x08;
+const TUint8 KCmdNotAllowedSecurityStatusNotSatisfied = 0x09;
+const TUint8 KUnknownCommandEnding                    = 0xFF;
+
+const TUint8 KApduOk  = 0x00;
+const TUint8 KApduNok = 0x01;
+
+const TUint8 KMinLenOfRes     = 0x04;
+const TUint8 KMaxLenOfRes     = 0x10;
+const TUint8 KLenOfSRes       = 0x04;
+const TUint8 KLenOfIk         = 0x10;
+const TUint8 KLenOfCk         = 0x10;
+const TUint8 KLenOfKc         = 0x08;
+const TUint8 KLenOfAuts       = 0x0E;
+const TUint8 KMaxMbmsMikeyLen = 0xFB;
+const TUint8 KMaxMbmsSaltLen  = 0xFB;
+const TUint8 KMaxApduSize     = 0xFF;
+const TUint8 KMaxParentalRatingDataSize = 0x02;
+const TUint8 KMaxSpeSize                = 0x01;
+
+const TUint8 KSuccessfull3GAuthTag    = 0xDB;
+const TUint8 KSyncFailureTag          = 0xDC;
+const TUint8 KGBABootstappingModeTag  = 0xDD;
+const TUint8 KGBANAFDerivationModeTag = 0xDE;
+const TUint8 KMBMSDataObjectTag       = 0x53;
+
+const TUint8 KMskUpdateMode                 = 0x01;
+const TUint8 KMtkGenerationMode             = 0x02;
+const TUint8 KMskDeletionMode               = 0x03;
+const TUint8 KSuccessfullMbmsOperationTag   = 0xDB;
+const TUint8 KMbmsOperationResponseTag53    = 0x53;
+const TUint8 KMbmsOperationResponseTag73    = 0x73;
+const TUint8 KOMABcastOperationResponseTag  = 0xAE;
+const TUint8 KBcastManagementDataTag = 0x80;
+const TUint8 KParentalRatingDataTag  = 0x8A;
+const TUint8 KSPETypeNotSupportedTag = 0x8B;
+const TUint8 KMikeyMessageTag        = 0x8C;
+const TUint8 KTekDataTag             = 0x86;
+const TUint8 KSaltDataTag            = 0x87;
+const TUint8 KParentalControlTag     = 0x88;
+
+const TUint8 KServiceGBA          = 0x44; // service no 68
+const TUint8 KServiceMBMSsecurity = 0x45; // service no 69
+
+
+// MACROS
+    //None
+
+// LOCAL CONSTANTS AND MACROS
+    //None
+
+// MODULE DATA STRUCTURES
+    //None
+
+// LOCAL FUNCTION PROTOTYPES
+    //None
+
+// ============================= LOCAL FUNCTIONS ===============================
+    //None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CMmCustomMessHandler
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+CMmCustomMessHandler::CMmCustomMessHandler()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::CMmCustomMessHandler.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CMMCUSTOMMESSHANDLER, "CMmCustomMessHandler::CMmCustomMessHandler" );
+    iSimCBTopicToBeDeleted = KUnusedCbMsgId;
+    // Set to true because it doesn't delete topic at start up
+    iTopicInSimMemoryDelete = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::~CMmCustomMessHandler
+// Destructor, deletes all allocated resources.
+// -----------------------------------------------------------------------------
+//
+CMmCustomMessHandler::~CMmCustomMessHandler()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::~CMmCustomMessHandler.\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_CMMCUSTOMMESSHANDLER, "CMmCustomMessHandler::~CMmCustomMessHandler" );
+
+    if( iListOfCiphValues )
+        {
+        //close the array of ciphering values
+        iListOfCiphValues->Close();
+        //delete the list of ciphering values
+        delete iListOfCiphValues;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMmCustomMessHandler* CMmCustomMessHandler::NewL
+        (
+        CMmPhoNetSender* aPhoNetSender, // pointer to the phonet sender
+        CMmPhoNetReceiver* aPhoNetReceiver, // pointer to the phonet sender
+        CMmNetMessHandler* aNetMessHandler, // pointer to the Net messHandler
+        CMmSecurityMessHandler* aSecurityMessHandler, // pointer to the security
+        CMmMessageRouter* aMessageRouter, //pointer to the message router
+        CMmUiccMessHandler* aUiccMessHandler
+        )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NewL.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NEWL, "CMmCustomMessHandler::NewL" );
+
+    CMmCustomMessHandler* customMessHandler =
+        new( ELeave ) CMmCustomMessHandler();
+
+    CleanupStack::PushL( customMessHandler );
+    customMessHandler->iPhoNetSender = aPhoNetSender;
+    customMessHandler->iNetMessHandler = aNetMessHandler;
+    customMessHandler->iSecurityMessHandler = aSecurityMessHandler;
+    customMessHandler->iMessageRouter = aMessageRouter;
+    customMessHandler->iMmUiccMessHandler = aUiccMessHandler;
+
+    customMessHandler->ConstructL();
+
+    // CALL
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_MODEM_CALL );
+
+    // NETWORK
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_MODEM_NETWORK );
+
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+
+// TO BE DONE WITH INFO_PP_DATA_READ_RESP
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_INFO,
+        INFO_PP_READ_RESP );
+#endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+    // SS
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_SS,
+        SS_SERVICE_COMPLETED_IND );
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_SS,
+        SS_SERVICE_FAILED_RESP );
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_SS,
+        SS_GSM_USSD_SEND_RESP );
+
+    // GSS
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_GSS,
+        GSS_CS_SERVICE_RESP );
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_GSS,
+        GSS_CS_SERVICE_FAIL_RESP );
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_GSS,
+        GSS_HSXPA_USER_SETTING_READ_RESP );
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_GSS,
+        GSS_HSXPA_USER_SETTING_WRITE_RESP );
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_GSS,
+        GSS_HSXPA_USER_SETTING_IND );
+
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+    // MTC
+    // Removed for Bridge camp
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_MTC,
+        MTC_RAT_QUERY_RESP );
+#endif
+
+    // PMM
+    /* To be done in CPS
+    aPhoNetReceiver->RegisterL( customMessHandler,
+        PN_PERMANENT_DATA,
+        PERM_PM_RECORD_READ_RESP );
+
+    aPhoNetReceiver->RegisterL( customMessHandler,
+        PN_PERMANENT_DATA,
+        PERM_PM_RECORD_WRITE_RESP );*/
+
+    // UICC
+    aPhoNetReceiver->RegisterL(
+        customMessHandler,
+        PN_UICC,
+        UICC_CARD_IND);
+
+    CleanupStack::Pop( customMessHandler );
+
+    // Send PERM_PM_RECORD_READ_REQ and update
+    // iCallLifeTimer.
+    customMessHandler->ReadLifeTimerFromPermanentMemory ( KCustomTransId );
+
+    return customMessHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::ConstructL()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ConstructL.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CONSTRUCTL, "CMmCustomMessHandler::ConstructL" );
+
+    // Initialize iListOfCiphValues
+    iListOfCiphValues = new ( ELeave ) RArray<TCiphListEntry>( 1 );
+
+    // Initialize refresh indication boolean
+    iIsRefresh = EFalse;
+
+    // Initialize ECID boolean
+    iECIDInfoRequested = EFalse;
+
+    // Initialize ECID information
+    iECIDInfo.iMCC = 0; // Mobile Country Code
+    iECIDInfo.iMNC = 0; // Mobile Network Code
+    iECIDInfo.iCID = 0; // Cell identity
+    iECIDInfo.iLAC = 0; // Location area code
+
+    // Initialize Call Life Timer value.
+    iCallLifeTimer = KCallLifeTimerNotSet;
+    
+    // initialize ISim application activation status
+    iIsimApplActivated = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ReceiveMessageL
+// Entry point for messages received from Domestic OS. Switches the message
+// to the correct method.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::ReceiveMessageL
+        (
+        const TIsiReceiveC& aIsiMessage  // ISI-message received
+        )
+    {
+    TInt resource( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_RESOURCEID ) );
+    TInt messageId( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) );
+
+TFLOGSTRING3("TSY: CMmCustomMessHandler::ReceiveMessageL, Resource: %d, Message: %d", resource, messageId);
+OstTraceExt2( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL;resource=%d;messageId=%d", resource, messageId );
+
+    switch( resource )
+        {
+        case PN_MODEM_CALL:
+            {
+            // switch according to the message id
+            // and call the appropriate messagehandler method
+            switch( messageId )
+                {
+                case CALL_MODEM_RELEASE_RESP:
+                    {
+                    CallReleaseResp( aIsiMessage );
+                    break;
+                    }
+                case CALL_MODEM_NOTIFICATION_IND:
+                    {
+                    CallGsmNotificationInd( aIsiMessage );
+                    break;
+                    }
+                case CALL_MODEM_MO_ALERT_IND:
+                    {
+                    CallMoAlertInd( aIsiMessage );
+                    break;
+                    }
+                case CALL_MODEM_TERMINATED_IND:
+                    {
+                    CallTerminateInd( aIsiMessage );
+                    break;
+                    }
+                case CALL_MODEM_RELEASE_IND:
+                    {
+                    CallReleaseInd( aIsiMessage );
+                    break;
+                    }
+                case CALL_MODEM_BLACKLIST_CLEAR_RESP:
+                    {
+                    CallGsmBlackListClearResp();
+                    break;
+                    }
+                case CALL_MODEM_EMERG_NBR_CHECK_RESP:
+                    {
+                    CallEmergencyNbrCheckResp( aIsiMessage );
+                    break;
+                    }
+                default:
+                    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ReceiveMessageL - switch resource - case PN_MODEM_CALL, switch messageId - default");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL- switch resource - case PN_CALL, switch messageId - default" );
+                    break;
+                    }
+                }
+            break;
+            }
+        case PN_GSS:
+            {
+            // switch according to the message id
+            // and call the appropriate messagehandler method
+            switch( messageId )
+                {
+                case GSS_CS_SERVICE_RESP:
+                    {
+                    GssCsServiceResp( aIsiMessage );
+                    break;
+                    }
+                case GSS_CS_SERVICE_FAIL_RESP:
+                    {
+                    GssCsServiceFailResp( aIsiMessage );
+                    break;
+                    }
+                case GSS_HSXPA_USER_SETTING_READ_RESP:
+                    {
+                    ReadHSxPAStatusResp( aIsiMessage );
+                    break;
+                    }
+                case GSS_HSXPA_USER_SETTING_WRITE_RESP:
+                    {
+                    WriteHSxPAStatusResp( aIsiMessage );
+                    break;
+                    }
+                case GSS_HSXPA_USER_SETTING_IND:
+                    {
+                    HSxPASettingInd( aIsiMessage );
+                    break;
+                    }
+                default:
+                    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ReceiveMessageL - switch resource - case PN_GSS, switch messageId - default");
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL- switch resource - case PN_GSS, switch messageId - default" );
+                    break;
+                    }
+                }
+            break; // end case PN_GSS
+            }
+        case PN_MODEM_NETWORK:
+            {
+            // switch according to the message id
+            // and call the appropriate messagehandler method
+            switch( messageId )
+                {
+                case NET_CS_WAKEUP_RESP:
+                    {
+                    NetCsWakeupResp();
+                    break;
+                    }
+                case NET_MODEM_REG_STATUS_IND:
+                    {
+                    NetModemRegStatusInd( aIsiMessage );
+                    break;
+                    }
+                case NET_CIPHERING_IND:
+                    {
+                    NetCipheringInd( aIsiMessage );
+                    break;
+                    }
+                case NET_MODEM_REG_STATUS_GET_RESP:
+                    {
+                    NetModemRegStatusGetResp( aIsiMessage );
+                    break;
+                    }
+                case NET_SET_RESP:
+                    {
+                    NetSetResp( aIsiMessage );
+                    break;
+                    }
+                case NET_RAT_RESP:
+                    {
+                    NetRatResp( aIsiMessage );
+                    break;
+                    }
+                case NET_NEIGHBOUR_CELLS_RESP:
+                    {
+                    NetNeighbourCellsResp( aIsiMessage );
+                    break;
+                    }
+                default:
+                    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ReceiveMessageL - switch resource - case PN_MODEM_NETWORK, switch messageId - default");
+OstTrace0( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL- switch resource - case PN_MODEM_NETWORK, switch messageId - default" );
+                    break;
+                    }
+                }
+            break;
+            }
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+        // Removed for Bridge camp
+        case PN_MTC:
+            {
+            switch( messageId )
+                {
+                case MTC_RAT_QUERY_RESP:
+                    {
+                    MtcRatQueryResp( aIsiMessage );
+                    break;
+                    }
+                default:
+                    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ReceiveMessageL - switch resource - case PN_MTC, switch messageId - default");
+OstTrace0( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL- switch resource - case PN_MTC, switch messageId - default" );
+                    break;
+                    }
+                }
+            break;
+            }
+#endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+        case PN_INFO:
+#else /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+        case PN_MODEM_INFO:
+#endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+            {
+            // switch according to the message id
+            // and call the appropriate messagehandler method
+            switch( messageId )
+                {
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+                 // TO BE DONE WITH INFO_PP_DATA_READ_RESP
+                 case INFO_PP_READ_RESP:
+                    {
+                    InfoPpReadResp( aIsiMessage );
+                    break;
+                    }
+#endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+                 default:
+                    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ReceiveMessageL - switch resource - case PN_INFO, switch messageId - default");
+OstTrace0( TRACE_NORMAL, DUP6_CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL- switch resource - case PN_INFO, switch messageId - default" );
+                    break;
+                    }
+                }
+            break;
+            }
+        case PN_SS:
+            {
+            switch( messageId )
+                {
+                case SS_SERVICE_COMPLETED_IND:
+                    {
+                    SsServiceCompletedInd( aIsiMessage );
+                    break;
+                    }
+                case SS_SERVICE_FAILED_RESP:
+                    {
+                    SsServiceFailedResp( aIsiMessage );
+                    break;
+                    }
+                case SS_GSM_USSD_SEND_RESP:
+                    {
+                    SsGsmUssdSendResp( aIsiMessage );
+                    break;
+                    }
+                default:
+                    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ReceiveMessageL - switch resource - case PN_SS, switch messageId - default");
+OstTrace0( TRACE_NORMAL, DUP12_CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL- switch resource - case PN_SS, switch messageId - default" );
+                    break;
+                    }
+                }
+            break;
+            }
+        /* To be done in CPS
+        case PN_PERMANENT_DATA:
+            {
+            if ( KCustomTransId == aIsiMessage.Get8bit( ISI_HEADER_OFFSET_TRANSID ) )
+                {
+                switch( messageId )
+                    {
+                    case PERM_PM_RECORD_READ_RESP:
+                        {
+                        LifeTimerFromPermanentMemoryReadResponse( aIsiMessage );
+                        break;
+                        }
+
+                    case PERM_PM_RECORD_WRITE_RESP:
+                        {
+                        LifeTimerToPermanentMemoryWriteResponse( aIsiMessage );
+                        break;
+                        }
+
+                    default:
+                        {
+                        TFLOGSTRING("TSY: CMmCustomMessHandler::ReceiveMessageL\
+                            - switch resource - case PN_PERMANENT_DATA, switch messageId - default.\n");
+OstTrace0( TRACE_NORMAL, DUP16_CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL - switch resource - case PN_PERMANENT_DATA, switch messageId - default." );
+                        break;
+                        }
+                    }
+                TFLOGSTRING("TSY: CMmCustomMessHandler::ReceiveMessageL\
+                            - switch resource - case PN_PERMANENT_DATA, transaction id is not KCustomTransId\n");
+OstTrace0( TRACE_NORMAL, DUP14_CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL - switch resource - case PN_PERMANENT_DATA, transaction id is not KCustomTransId" );
+                }
+            break;
+            }*/
+
+        case PN_UICC:
+            {
+            if( UICC_CARD_IND == messageId )
+                {
+                UiccCardInd( aIsiMessage );
+                }
+            break;
+            }
+        default:
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ReceiveMessageL - switch resource - default" );
+OstTrace0( TRACE_NORMAL, DUP13_CMMCUSTOMMESSHANDLER_RECEIVEMESSAGEL, "CMmCustomMessHandler::ReceiveMessageL- switch resource - default" );
+            break; // server not known
+            }
+        } // end of switch
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallReleaseReq
+// Constructs CALL_MODEM_RELEASE_REQ ISI message from input parameters and sends
+// it through phonet. HangUp request message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::CallReleaseReq
+        (
+        TUint8 aTransactionId, //transaction id
+        TUint8 aCallId, //call id
+        TUint8 aCause //cause value for releasing the call
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::CallReleaseReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLRELEASEREQ, "CMmCustomMessHandler::CallReleaseReq" );
+
+    iReleaseCauseValueSent = aCause;
+
+    //Append data for ISI message
+    TBuf8< 2 + SIZE_CALL_MODEM_SB_CAUSE > messageBuf;
+
+    messageBuf.Append( aCallId );
+    messageBuf.Append( 1 ); // Num of Subblocks
+
+    //Call_Release_Req sub block
+    messageBuf.Append( CALL_MODEM_SB_CAUSE );
+    messageBuf.Append( SIZE_CALL_MODEM_SB_CAUSE );
+    messageBuf.Append( CALL_MODEM_CAUSE_TYPE_CLIENT );
+    messageBuf.Append( aCause );
+
+    //send message via phonet
+    return iPhoNetSender->Send( PN_MODEM_CALL, aTransactionId, CALL_MODEM_RELEASE_REQ,
+      messageBuf );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallReleaseResp
+// Breaks response to the HangUp request. In case of failure, HangUp is
+// completed to the Symbian OS layer. Otherwise HangUp handle the success case.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::CallReleaseResp
+        (
+        const TIsiReceiveC& aIsiMsg    //received ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::CallReleaseResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLRELEASERESP, "CMmCustomMessHandler::CallReleaseResp" );
+
+    //initialize the causeType and causeValue
+    TUint8 causeType  = 0;
+    TUint8 causeValue = 0;
+    TInt ret = KErrNone;
+
+    TUint sbStartOffSet( 0 );
+
+    //get cause sub block
+    //if subblock is present
+    if( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_RELEASE_RESP, CALL_MODEM_SB_CAUSE,
+        EIsiSubBlockTypeId8Len8, sbStartOffSet ) )
+      {
+        //get cause type
+        causeType = aIsiMsg.Get8bit( sbStartOffSet +
+            CALL_MODEM_SB_CAUSE_OFFSET_CAUSETYPE );
+
+        //get cause value
+        causeValue = aIsiMsg.Get8bit( sbStartOffSet +
+            CALL_MODEM_SB_CAUSE_OFFSET_CAUSE );
+
+        if( iReleaseCauseValueSent != causeValue )
+            {
+            //map error value to ETEL error value
+            ret = CMmStaticUtility::CSCauseToEpocError ( PN_MODEM_CALL,
+                causeType, causeValue );
+            }
+        }
+  // no packed parameters for completion
+  iMessageRouter->Complete( ECustomTerminateCallIPC, ret );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallMoAlertInd
+// This method breaks the CallMo alerting indication message.
+// Trying to find Remote alerting information. In success case
+// send LocalRemoteAlertToneRequired value to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::CallMoAlertInd
+        (
+        const TIsiReceiveC& aIsiMsg    //received ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::CallMoAlertInd.");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLMOALERTIND, "CMmCustomMessHandler::CallMoAlertInd" );
+
+    TBool playRemoteAlertToneLocally( EFalse );
+    TUint sbStartOffSet( 0 );
+
+    // Get call alerting info sub block
+    // if subblock was found
+    if( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_MO_ALERT_IND,
+        CALL_MODEM_SB_ALERTING_INFO,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::CallMoAlertInd,\
+            - CALL_MODEM_SB_ALERTING_INFO sub block found.");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_CALLMOALERTIND, "CMmCustomMessHandler::CallMoAlertInd, CALL_MODEM_SB_ALERTING_INFO sub block found" );
+
+        // Get alerting info
+        TUint8 callAlertingInfo( aIsiMsg.Get8bit(
+            sbStartOffSet + CALL_MODEM_SB_ALERTING_INFO_OFFSET_ALERTINGINFO ) );
+
+        // If LSB is "1" inform that remote alerting tone
+        // should be generated locally.
+        if ( callAlertingInfo & 0x01 )
+            {
+            playRemoteAlertToneLocally = ETrue;
+            }
+        }
+
+    // Complete remote alerting tone notification
+    // parameter for SOS layer: a TBool playRemoteAlertToneLocally
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &playRemoteAlertToneLocally );
+    iMessageRouter->Complete( ECustomGetRemoteAlertingToneStatusIPC,
+        &dataPackage,
+        KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadCiReq
+// Read ciphering indicator status from UICC
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccReadCiReq( TInt aTrId )
+    {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccReadCiReq, transaction ID: %d", aTrId );
+OstTrace1( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADCIREQ, "CMmCustomMessHandler::UiccReadCiReq;aTrId=%d", aTrId );
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccReadTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = static_cast<TUiccTrId>( aTrId );
+    // We need to know the CI status info which is located in byte 3 in EF AD
+    // b1=0: ciphering indicator feature disabled
+    // b1=1: ciphering indicator feature enabled
+    params.dataAmount = 1;
+    params.dataOffset = 2;
+    params.fileId = KElemFileAdministrativeData;
+    params.fileIdSfi = 3;
+    params.serviceType = UICC_APPL_READ_TRANSPARENT;
+
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadCiResp
+// Complete ciphering indicator status
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccReadCiResp(
+    TInt aStatus,
+    TInt aTrId,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadCiResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADCIRESP, "CMmCustomMessHandler::UiccReadCiResp" );
+
+    TInt ret( KErrNone );
+    TBool cipherIndicatorStatus( EFalse );
+
+    if( UICC_STATUS_OK == aStatus  )
+        {
+        // Get ciphering indicator info ( bit 0)
+        TUint8 cipheringIndicator(aFileData[0] & 0x01 );
+        if ( cipheringIndicator )
+            {
+            cipherIndicatorStatus = ETrue;
+            }
+        }
+    else
+        {
+        ret = KErrNotFound;
+        }
+
+    if ( ETrIdReadCipheringIndicatorStatusCustom == aTrId )
+        {
+        // Complete GetCipheringInfo
+        // packed parameter: TBool (ciphering indicator required/not required)
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &cipherIndicatorStatus );
+        iMessageRouter->Complete(
+            ECustomGetCipheringInfoIPC,
+            &dataPackage,
+            ret );
+        }
+    else if( ETrIdNotifyCipheringIndicatorStatusCustom == aTrId )
+        {
+        CMmDataPackage dataPackage;
+        TCiphListEntry chiplistentry;
+        chiplistentry.iTraId = aTrId;
+
+        // Find the right value of ciphering for this resp message
+        TInt index ( iListOfCiphValues->Find( chiplistentry, Match ) );
+
+        // If the right value is found
+        if ( KErrNotFound != index )
+            {
+            TBool cipheringOn( ( *iListOfCiphValues )[index ].iCiphStatus );
+            dataPackage.PackData( &cipherIndicatorStatus, &cipheringOn );
+
+            // Delete the used ciphering value from the list
+            iListOfCiphValues->Remove( index );
+            // Compress the list
+            iListOfCiphValues->Compress();
+            }
+        else
+            {
+            TBool constantFalse( EFalse );
+            dataPackage.PackData( &constantFalse, &constantFalse );
+            ret = KErrGeneral;
+            }
+
+        iMessageRouter->Complete(
+            ECustomNotifyCipheringInfoChangeIPC,
+            &dataPackage,
+            ret );
+        }
+    //No else
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetCsWakeupReq
+// Constructs NET_CS_WAKEUP_REQ ISI message from input parameters and sends
+// it through phonet.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::NetCsWakeupReq( TUint8 aTransId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetCsWakeupReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETCSWAKEUPREQ, "CMmCustomMessHandler::NetCsWakeupReq" );
+
+    //Data buffer length is 2
+    TBuf8<2> data;
+    data.Append( aTransId );
+    data.Append( NET_CS_WAKEUP_REQ );
+
+    TIsiSend isimsg( iPhoNetSender->SendBufferDes() );
+    isimsg.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_MODEM_NETWORK );
+    isimsg.CopyData( ISI_HEADER_SIZE, data );
+
+    return( iPhoNetSender->Send( isimsg.Complete() ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetCsWakeupResp
+// Breaks a NET_CS_WAKEUP_RESP ISI message and complete NetWakeup with
+// KErrNone to SOS layer
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::NetCsWakeupResp()
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::NetCsWakeupResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETCSWAKEUPRESP, "CMmCustomMessHandler::NetCsWakeupResp" );
+
+    //getting this message indicates that the wakeup was successful
+    //complete NetWakeup method (no packed parameters)
+    iMessageRouter->Complete( ECustomNetWakeupIPC, KErrNone );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetCipheringInd
+// This method breaks the ciphering indication message.
+// This indication saves the ciphering status and calls SimReadCiReq to get the
+// status of the ciphering indicator
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::NetCipheringInd(
+        const TIsiReceiveC &aIsiMsg )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::NetCipheringInd.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETCIPHERINGIND, "CMmCustomMessHandler::NetCipheringInd" );
+
+    //set chipering to False
+    TBool cipher( EFalse );
+
+    //get the ciphering status
+    TUint8 cipheringStatus( aIsiMsg.Get8bit( ISI_HEADER_SIZE +
+      NET_CIPHERING_IND_OFFSET_CIPHERINGSTATUS ) );
+
+    //check the value of the ciphering status
+    if ( NET_CIPHERING_INDICATOR_ON == cipheringStatus )
+        {
+        cipher = ETrue;
+        }
+
+    TUint8 traId( ETrIdNotifyCipheringIndicatorStatusCustom );
+
+    //save the ciphering information for later completion in the list.
+    //this method has to request the sim to complete, so new indication
+    //might come, values must be buffered.
+    TCiphListEntry chiplistentry;
+    chiplistentry.iTraId = traId;
+    chiplistentry.iCiphStatus = cipher;
+    iListOfCiphValues->Append( chiplistentry );
+
+    //get the ciphering indicator information from SIM card
+    //the response of this method will call the completion for the
+    //notification
+    UiccReadCiReq( ETrIdNotifyCipheringIndicatorStatusCustom );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetModemRegStatusInd
+// This method breaks the NET_MODEM_REG_STATUS_IND message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::NetModemRegStatusInd
+        (
+        const TIsiReceiveC& aIsiMsg
+        )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetModemRegStatusInd");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETMODEMREGSTATUSIND, "CMmCustomMessHandler::NetModemRegStatusInd" );
+
+    if ( 0 != aIsiMsg.Get8bit(
+        ISI_HEADER_SIZE +
+        NET_MODEM_REG_STATUS_IND_OFFSET_SUBBLOCKCOUNT ) )
+        {
+        TUint sbStartOffSet( 0 );
+
+        TInt retValue( aIsiMsg.FindSubBlockOffsetById(
+            ISI_HEADER_SIZE + SIZE_NET_MODEM_REG_STATUS_IND,
+            NET_MODEM_REG_INFO_COMMON,
+            EIsiSubBlockTypeId8Len8,
+            sbStartOffSet ) );
+
+        // Check if NET_MODEM_REG_INFO_COMMON sub block is present.
+        if ( KErrNone == retValue )
+            {
+            // Get registration status
+            TUint8 registrationStatus( aIsiMsg.Get8bit(
+                sbStartOffSet +
+                NET_MODEM_REG_INFO_COMMON_OFFSET_REGISTRATIONSTATUS ) );
+
+            TBool nspsIsOn( EFalse );
+
+            switch ( registrationStatus )
+                {
+                case NET_REG_STATUS_NSPS:
+                case NET_REG_STATUS_NSPS_NO_COVERAGE:
+                    {
+                    nspsIsOn = ETrue;
+                    break;
+                    }
+                case NET_REG_STATUS_NOSERV_NOSIM:
+                case NET_REG_STATUS_NOSERV_SIM_REJECTED_BY_NW:
+                    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetModemRegStatusInd, No SIM");
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_NETMODEMREGSTATUSIND, "CMmCustomMessHandler::NetModemRegStatusInd, No SIM" );
+                    // Complete NetworkConnectionFailure notification
+                    // (no packed parameters).
+                    // If puk code is required notification shouldn't
+                    // be completed.
+                    TBool pukCodeRequired( iSecurityMessHandler->GetPukCodeReq() );
+                    if( !pukCodeRequired )
+                        {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetModemRegStatusInd - Complete network connection failure");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_NETMODEMREGSTATUSIND, "CMmCustomMessHandler::NetModemRegStatusInd - Complete network connection failure" );
+
+                        iMessageRouter->Complete(
+                            ECustomNotifyNetworkConnectionFailureIPC,
+                            KErrNone );
+                        }
+                    break;
+                    }
+                default:
+                    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetModemRegStatusInd, switch registrationStatus - default");
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_NETMODEMREGSTATUSIND, "CMmCustomMessHandler::NetModemRegStatusInd, switch registrationStatus - default" );
+                    break;
+                    }
+                }
+
+            // Inform of the status of NSPS.
+            // Packed parameter: TBool nspsIsOn.
+            CMmDataPackage dataPackage;
+            dataPackage.PackData( &nspsIsOn );
+
+            iMessageRouter->Complete(
+                ECustomNotifyNSPSStatusIPC,
+                &dataPackage,
+                KErrNone );
+            }
+        // No else
+
+        // Check if ECID info needs to be updated.
+        CheckECIDInfo( aIsiMsg );
+        }
+    // No else
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadDynamic2FlagsReq
+// Read dynamic 2 flags from UICC
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccReadDynamic2FlagsReq()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadDynamic2FlagsReq");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADDYNAMIC2FLAGSREQ, "CMmCustomMessHandler::UiccReadDynamic2FlagsReq" );
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccWriteTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdReadDynamic2Flags;
+    params.dataOffset = 0;
+    params.dataAmount = 0;
+    params.fileId = KElemFileDyn2FlagsOrange;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.serviceType = UICC_APPL_READ_TRANSPARENT;
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( KOrangeDedicatedFile >> 8 );
+    params.filePath.Append( KOrangeDedicatedFile );
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadDynamic2FlagsResp
+// Complete dynamic 2 flags
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccReadDynamic2FlagsResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadDynamic2FlagsResp");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADDYNAMIC2FLAGSRESP, "CMmCustomMessHandler::UiccReadDynamic2FlagsResp" );
+
+    TInt ret( KErrNone );
+    RMmCustomAPI::TGetAlsBlockStatus blockStatus
+        ( RMmCustomAPI::EBlockStatusUnknown );
+
+    if ( UICC_STATUS_OK == aStatus )
+        {
+        // The value of the block status is in the LSB byte
+        if ( aFileData[0] & 0x01 )
+            {
+            blockStatus = RMmCustomAPI::EBlockStatusActive;
+            }
+        else
+            {
+            blockStatus = RMmCustomAPI::EBlockStatusInactive;
+            }
+        }
+    else
+        {
+        blockStatus = RMmCustomAPI::EBlockStatusNotSupported;
+        ret = KErrNotFound;
+        }
+
+    // Complete, packed parameter: TGetAlsBlockStatus (block status)
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &blockStatus );
+    iMessageRouter->Complete(
+        ECustomGetAlsBlockedIPC,
+        &dataPackage,
+        ret );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccWriteDynamic2FlagsReq
+// Write dynamic 2 flags to UICC
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccWriteDynamic2FlagsReq( TUint8 aInfo )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccWriteDynamic2FlagsReq");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCWRITEDYNAMIC2FLAGSREQ, "CMmCustomMessHandler::UiccWriteDynamic2FlagsReq" );
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccWriteTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdWriteDynamic2Flags;
+    params.dataOffset = 0;
+    params.fileId = KElemFileDyn2FlagsOrange;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.serviceType = UICC_APPL_UPDATE_TRANSPARENT;
+
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( KOrangeDedicatedFile >> 8 );
+    params.filePath.Append( KOrangeDedicatedFile );
+
+    params.fileData.Append( aInfo );
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccWriteDynamic2FlagsResp
+// Complete write dynamic flags request ro UICC
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccWriteDynamic2FlagsResp( TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccWriteDynamic2FlagsReq");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCWRITEDYNAMIC2FLAGSRESP, "CMmCustomMessHandler::UiccWriteDynamic2FlagsResp" );
+
+    TInt ret( KErrNone );
+
+    if ( UICC_STATUS_OK != aStatus )
+        {
+        ret = KErrGeneral;
+        }
+
+    iMessageRouter->Complete( ECustomSetAlsBlockedIPC, ret );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallTerminateInd
+// This method breaks the CALL_MODEM_TERMINATE_IND
+// indication message. Gets CALL_MODEM_SB_SS_DIAGNOSTICS sub blocks and sets
+// information into a call object.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::CallTerminateInd
+        (
+        const TIsiReceiveC& aIsiMsg    //received ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::CallTerminateInd.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLTERMINATEIND, "CMmCustomMessHandler::CallTerminateInd" );
+
+    //unique call id (without possible generic id)
+    TInt callId = static_cast<TInt>( aIsiMsg.Get8bit( ISI_HEADER_SIZE +
+        CALL_MODEM_TERMINATED_IND_OFFSET_CALLID ) & 0x07 );
+
+    if ( CALL_MODEM_ID_NONE != callId )
+        {
+        TUint sbStartOffSet( 0 );
+
+        TUint8 ssDiagnostics = 0;
+
+        //find sub block
+        if( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+          ISI_HEADER_SIZE + SIZE_CALL_MODEM_TERMINATED_IND, CALL_MODEM_SB_SS_DIAGNOSTICS,
+          EIsiSubBlockTypeId8Len8, sbStartOffSet ) )
+          {
+            //get ss diagnostics
+            ssDiagnostics = aIsiMsg.Get8bit( sbStartOffSet +
+                CALL_MODEM_SB_SS_DIAGNOSTICS_OFFSET_DIAGNOSTICS );
+
+            // Set highest bit to 1 if there is some diagnostic information
+            // (This is in accordance with 3GPP TS 24.008 "Mobile radio
+            // interface Layer 3 specification; Core network protocols" and with
+            // Series 60 Supplementary Services UI Specification)
+            if ( 0 != ssDiagnostics )
+                {
+                ssDiagnostics |= 0x80; // binary 10000000
+                TFLOGSTRING3("TSY:CMmCustomMessHandler::CallTerminatedInd: Diagnostic octet=%d received for call id=%d",
+                    ssDiagnostics, callId );
+OstTraceExt2( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_CALLTERMINATEIND, "CMmCustomMessHandler::CallTerminateInd;Diagnostic octet==%hhu received for call id=%d", ssDiagnostics, callId );
+                }
+            }
+
+        // set the diagnostics in call object (might be zero)
+        // parameters for SOS layer: Call id and TUint8 with diagnostics
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &callId, &ssDiagnostics );
+        iMessageRouter->Complete( ECustomGetDiagnosticOctetsIPC, &dataPackage,
+           KErrNone );
+
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallReleaseInd
+// This method breaks the CALL_MODEM_RELEASE_IND.
+// indication message. Gets CALL_MODEM_SB_SS_DIAGNOSTICS sub blocks and sets
+// information into a call object.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::CallReleaseInd
+        (
+        const TIsiReceiveC& aIsiMsg    //received ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::CallReleaseInd.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLRELEASEIND, "CMmCustomMessHandler::CallReleaseInd" );
+
+    //unique call id (without possible generic id)
+    TInt callId = static_cast<TInt>( aIsiMsg.Get8bit( ISI_HEADER_SIZE +
+        CALL_MODEM_RELEASE_IND_OFFSET_CALLID ) & 0x07 );
+
+    if ( CALL_MODEM_ID_NONE != callId )
+        {
+        TUint sbStartOffSet( 0 );
+
+        TUint8 ssDiagnostics = 0;
+
+        //get call operation sub block
+        if( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+          ISI_HEADER_SIZE + SIZE_CALL_MODEM_RELEASE_IND, CALL_MODEM_SB_SS_DIAGNOSTICS,
+          EIsiSubBlockTypeId8Len8, sbStartOffSet ) )
+          {
+            //get ss diagnostics
+            ssDiagnostics = aIsiMsg.Get8bit( sbStartOffSet +
+                CALL_MODEM_SB_SS_DIAGNOSTICS_OFFSET_DIAGNOSTICS );
+
+            // Set highest bit to 1 if there is some diagnostic information
+            // (This is in accordance with 3GPP TS 24.008 "Mobile radio
+            // interface Layer 3 specification; Core network protocols" and with
+            // Series 60 Supplementary Services UI Specification)
+            if ( 0 != ssDiagnostics )
+                {
+                ssDiagnostics |= 0x80; // binary 10000000
+                TFLOGSTRING3("TSY:CMmCustomMessHandler::CallReleaseInd: Diagnostic octet=%d received for call id=%d",
+                    ssDiagnostics, callId );
+OstTraceExt2( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_CALLRELEASEIND, "CMmCustomMessHandler::CallReleaseInd;Diagnostic octet==%hhu received for call id=%d", ssDiagnostics, callId );
+                }
+            }
+
+        // set the diagnostics in call object (might be zero)
+        // parameters for SOS layer: Call id and TUint8 with diagnostics
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &callId, &ssDiagnostics );
+        iMessageRouter->Complete( ECustomGetDiagnosticOctetsIPC, &dataPackage,
+           KErrNone );
+
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::InfoPpReadReq
+// Constructs INFO_PP_READ_REQ ISI message from input parameters and sends
+// it through phonet. This message can be used to read ALS or Two Digit Dialling
+// support status in the product profiles from INFO server.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::InfoPpReadReq
+        (
+        TProductProfileRequestType aReqType // request type, used as
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::InfoPpReadReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_INFOPPREADREQ, "CMmCustomMessHandler::InfoPpReadReq" );
+
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+    //create the buffer for SB_PP subblock
+    TBuf8<SIZE_INFO_SB_PP> sbPPSubBlockBuf( 0 );
+    TIsiSubBlock sbPPSubBlock( sbPPSubBlockBuf, INFO_SB_PP, EIsiSubBlockTypeId8Len8 );
+    //add 0x00 as the Dynamic Value ID, not needed cause we want to get
+    //a static value
+    sbPPSubBlockBuf.Append( 0x00 );
+
+    //add 0x01 as the length of the product profile, we want only als
+    //profile, thus lenght is 1
+    sbPPSubBlockBuf.Append( 0x01 );
+
+    //add the product profile number
+    if ( EGetAlsPPSupport == aReqType )
+        {
+        sbPPSubBlockBuf.Append( INFO_PP_ALS );
+        }
+    else if ( ECheckTwoDigitDialSupport == aReqType )
+        {
+        sbPPSubBlockBuf.Append( KinfoPpTwoDigitDial );
+        }
+  else
+    {
+    // not supported
+    return KErrArgument;
+    }
+
+    //value of the product profile is 0x00, not need cause we are reading
+    sbPPSubBlockBuf.Append( 0x00 );
+
+  // Construct INFO_PP_READ_REQ message (1 data byte +
+  // sub block count + INFO_SB_PP sub block)
+  TBuf8< 2 + SIZE_INFO_SB_PP > infoPpReadReq;
+
+    //set pp batch reading to read specific product profile, thus 0.
+    infoPpReadReq.Append( INFO_PP_PROD_PROFILE_FEATURE );
+
+    // add sub block
+    infoPpReadReq.Append( 1 ); // number of sub blocks
+    infoPpReadReq.Append( sbPPSubBlock.CompleteSubBlock() );
+
+    //create the isi message
+  //transaction id = request type
+  TUint8 transId = static_cast<TUint8>( aReqType );
+
+    return iPhoNetSender->Send( PN_INFO, transId, INFO_PP_READ_REQ, infoPpReadReq );
+
+#endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::InfoPpReadResp
+// Breaks a INFO_PP_READ_RESP ISI message. This method
+// gets the status of the ALS or two digit support.
+// Complete with packed parameter RMmCustomAPI::TAlsSupport or
+// RMmCustomAPI::TTwoDigitDialSupport to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::InfoPpReadResp
+        (
+        const TIsiReceiveC& aIsiMessage    //received ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::InfoPpReadResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_INFOPPREADRESP, "CMmCustomMessHandler::InfoPpReadResp" );
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+    TInt errorValue( KErrGeneral );
+
+    // Get Status
+    TUint8 status = aIsiMessage.Get8bit( ISI_HEADER_SIZE + INFO_PP_READ_RESP_OFFSET_STATUS );
+
+    //initialize the als support with off
+    RMmCustomAPI::TAlsSupport alsSupport( RMmCustomAPI::EAlsSupportOff );
+
+    //initialize two digit support with off
+    RMmCustomAPI::TTwoDigitDialSupport twoDigitDialSupport(
+        RMmCustomAPI::ETwoDigitDialSupportOff );
+
+  TFLOGSTRING2("TSY: CMmCustomMessHandler::InfoPpReadResp - Status: %d",
+    status );
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_INFOPPREADRESP, "CMmCustomMessHandler::InfoPpReadResp;status=%hhu", status );
+
+    switch ( status )
+        {
+        case INFO_OK:
+            {
+
+          TUint sbInfoPpReadStartOffset( 0 );
+
+
+            if ( KErrNone == aIsiMessage.FindSubBlockOffsetById( ISI_HEADER_SIZE + SIZE_INFO_PP_READ_RESP,
+              INFO_SB_PP, EIsiSubBlockTypeId8Len8, sbInfoPpReadStartOffset ) )
+
+                {
+
+                TInt length = aIsiMessage.Get8bit( sbInfoPpReadStartOffset + INFO_SB_PP_OFFSET_STRLEN  );
+
+        TFLOGSTRING2("TSY: CMmCustomMessHandler::InfoPpReadResp - Info length: %d",
+          length );
+OstTrace1( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_INFOPPREADRESP, "CMmCustomMessHandler::InfoPpReadResp - Info length=%d", length );
+
+                if ( 1 == length )
+                    {
+                    //introduce the pPFeatures buffer to hold the feature value,
+                    //buffer size is 2
+                    TBuf8<KTwo> pPFeatures;
+
+                    //copy the 2 bytes from product profile
+                    pPFeatures.Copy( aIsiMessage.GetData( sbInfoPpReadStartOffset
+                      + INFO_SB_PP_OFFSET_PRODUCTPROFILE, KTwo ) );
+
+          TFLOGSTRING2("TSY: CMmCustomMessHandler::InfoPpReadResp - Info data: %S",
+            &pPFeatures );
+OstTraceExt1( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_INFOPPREADRESP, "CMmCustomMessHandler::InfoPpReadResp;pPfeatures=%s", pPFeatures );
+
+                    //check that product profile is requested one
+                    if ( INFO_PP_ALS == pPFeatures [0] )
+                        {
+                        //Get the value of the Als feature
+                        if ( 0 != pPFeatures [1] )
+                            {
+              TFLOGSTRING("TSY: CMmCustomMessHandler::InfoPpReadResp - EAlsSupportOn");
+OstTrace0( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_INFOPPREADRESP, "CMmCustomMessHandler::InfoPpReadResp - EAlsSupportOn" );
+              alsSupport = RMmCustomAPI::EAlsSupportOn;
+                            }
+                        //set the error value to KErrNone
+                        errorValue = KErrNone;
+                        }
+                    else if ( KinfoPpTwoDigitDial == pPFeatures [0] )
+                        {
+                        //Get the value of the two digit dial feature
+                        if ( 0 != pPFeatures [1] )
+                            {
+              TFLOGSTRING("TSY: CMmCustomMessHandler::InfoPpReadResp - EAlsSupportOff");
+OstTrace0( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_INFOPPREADRESP, "CMmCustomMessHandler::InfoPpReadResp - EAlsSupportOff" );
+              twoDigitDialSupport =
+                RMmCustomAPI::ETwoDigitDialSupportOn;
+                            }
+                        //set the error value to KErrNone
+                        errorValue = KErrNone;
+                        }
+
+                    //No else
+
+                    }
+                }
+            break;
+            }
+        case INFO_FAIL:
+            {
+            //error in operation
+            errorValue = KErrGeneral;
+            break;
+            }
+        case INFO_NO_NUMBER:
+            {
+            //information is not found
+            errorValue = KErrNotFound;
+            break;
+            }
+        default:
+            {
+            TFLOGSTRING("TSY: CMmCustomMessHandler::InfoPpReadResp, switch status - default.\n" );
+OstTrace0( TRACE_NORMAL, DUP6_CMMCUSTOMMESSHANDLER_INFOPPREADRESP, "CMmCustomMessHandler::InfoPpReadResp, switch status - default" );
+            errorValue = KErrNotSupported;
+            break;
+            }
+        }
+
+  TUint8 traId = aIsiMessage.Get8bit( ISI_HEADER_SIZE + INFO_PP_READ_RESP_OFFSET_TRANSID );
+    if ( EGetAlsPPSupport == traId )
+        {
+    // complete with packed parameter RMmCustomAPI::TAlsSupport
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &alsSupport );
+    iMessageRouter->Complete( ECustomCheckAlsPpSupportIPC,
+      &dataPackage, errorValue );
+        }
+    else if ( ECheckTwoDigitDialSupport == traId )
+        {
+    // complete with packed parameter RMmCustomAPI::TTwoDigitDialSupport
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &twoDigitDialSupport );
+    iMessageRouter->Complete( ECustomCheckTwoDigitDialSupportIPC,
+      &dataPackage, errorValue );
+        }
+
+    //No else
+#endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallGsmBlackListClearReq
+// Constructs CALL_MODEM_BLACKLIST_CLEAR_REQ ISI message from input parameters and
+// sends it through phonet.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::CallGsmBlackListClearReq
+        (
+         TUint8 aTransId // Transaction Id
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmBlackListClearReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLGSMBLACKLISTCLEARREQ, "CMmCustomMessHandler::CallGsmBlackListClearReq" );
+
+  // Construct CALL_MODEM_BLACKLIST_CLEAR_REQ message (1 data byte +
+  // sub block count)
+  TBuf8<2> blackListClearReq;
+
+    blackListClearReq.Append( KCustomPadding );
+    blackListClearReq.Append( 0x00 ); // sub block count
+
+    //Send message via PhoNet
+    return iPhoNetSender->Send( PN_MODEM_CALL, aTransId, CALL_MODEM_BLACKLIST_CLEAR_REQ,
+      blackListClearReq );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallGsmBlackListClearResp
+// Breaks a CALL_MODEM_BLACKLIST_CLEAR_RESP ISI message. This method
+// gets indicates that the clear blacklist was successful.
+// Complete CallGsmBlackListClear with KErrNone to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::CallGsmBlackListClearResp
+        (
+//         const TIsiReceiveC& aIsiMsg // Received isi messge
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmBlackListClearResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLGSMBLACKLISTCLEARRESP, "CMmCustomMessHandler::CallGsmBlackListClearResp" );
+
+    // call server response
+    //getting this message indicates that the clear blacklist was successful
+    //complete SOS layer method
+  iMessageRouter->Complete( ECustomClearCallBlackListIPC, KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::SsServiceCompletedInd
+// This method breaks the SS_SERVICE_COMPLETED_IND ISI message.
+// Complete SsRequestCompleteNotification method from custom api or
+// Complete NotifySsAdditionalInfo to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::SsServiceCompletedInd
+        (
+        const TIsiReceiveC& aIsiMessage //received ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::SsServiceCompletedInd");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_SSSERVICECOMPLETEDIND, "CMmCustomMessHandler::SsServiceCompletedInd" );
+
+    if ( 0 < aIsiMessage.Get8bit( ISI_HEADER_SIZE +
+                SS_SERVICE_COMPLETED_IND_OFFSET_SUBBLOCKCOUNT ) )
+        {
+        TUint ssStatus( 0 );
+        TUint8 sbSsStatus( 0 );
+        TUint sbForwardingFeatureOffset( 0 );
+        TUint sbBarringFeatureOffset( 0 );
+
+        TUint sbStartOffset(0);
+        // SS_STATUS_RESULT sub block
+        if ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+                ISI_HEADER_SIZE + SIZE_SS_SERVICE_COMPLETED_IND,
+                SS_STATUS_RESULT,
+                EIsiSubBlockTypeId8Len8,
+                sbStartOffset ) )
+            {
+            sbSsStatus = aIsiMessage.Get8bit( sbStartOffset +
+                                              SS_STATUS_RESULT_OFFSET_SSSTATUS );
+            }
+
+        // SS_GSM_FORWARDING_INFO sub block
+        if ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+                ISI_HEADER_SIZE + SIZE_SS_SERVICE_COMPLETED_IND,
+                SS_GSM_FORWARDING_INFO,
+                EIsiSubBlockTypeId8Len8,
+                sbStartOffset ) )
+            {
+            // Sub block's sub block SS_GSM_FORWARDING_FEATURE:
+            if ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+                            sbStartOffset + SIZE_SS_GSM_FORWARDING_INFO,
+                            SS_GSM_FORWARDING_FEATURE,
+                            EIsiSubBlockTypeId8Len8,
+                            sbForwardingFeatureOffset
+                            ) )
+                {
+                sbSsStatus = aIsiMessage.Get8bit( sbForwardingFeatureOffset +
+                                SS_GSM_FORWARDING_FEATURE_OFFSET_SSSTATUS );
+                }
+      //Cases which don't return the other sub block should still be ok.
+      else
+        {
+        // This simulates successfull SS case, where the info subblock
+        // is received, but the forwarding feature isn't(the real status
+        // cannot be read).
+        sbSsStatus = SS_GSM_ACTIVE;
+        }
+            }
+
+        // SS_GSM_BARRING_INFO sub block
+        if ( 0 == sbSsStatus && KErrNone == aIsiMessage.FindSubBlockOffsetById(
+                ISI_HEADER_SIZE + SIZE_SS_SERVICE_COMPLETED_IND,
+                SS_GSM_BARRING_INFO,
+                EIsiSubBlockTypeId8Len8,
+                sbStartOffset
+                ) )
+            {
+            // Sub block's sub block SS_GSM_BARRING_FEATURE
+            if ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+                            sbStartOffset + SIZE_SS_GSM_BARRING_FEATURE,
+                            SS_GSM_BARRING_FEATURE,
+                            EIsiSubBlockTypeId8Len8,
+                            sbBarringFeatureOffset
+                            ) )
+                {
+
+                sbSsStatus = aIsiMessage.Get8bit( sbBarringFeatureOffset +
+                                    SS_GSM_BARRING_FEATURE_OFFSET_SSSTATUS );
+                }
+            }
+
+
+        // SS_GSM_GENERIC_SERVICE_INFO sub block
+        if ( 0 == sbSsStatus && KErrNone == aIsiMessage.FindSubBlockOffsetById(
+                ISI_HEADER_SIZE + SIZE_SS_SERVICE_COMPLETED_IND,
+                SS_GSM_GENERIC_SERVICE_INFO,
+                EIsiSubBlockTypeId8Len8,
+                sbStartOffset
+                ) )
+            {
+            sbSsStatus = aIsiMessage.Get8bit( sbStartOffset +
+                                              SS_GSM_GENERIC_SERVICE_INFO_OFFSET_SSSTATUS );
+            }
+
+        // SS_GSM_DATA sub block
+        if ( 0 == sbSsStatus && KErrNone == aIsiMessage.FindSubBlockOffsetById(
+                ISI_HEADER_SIZE + SIZE_SS_SERVICE_COMPLETED_IND,
+                SS_GSM_DATA,
+                EIsiSubBlockTypeId8Len8,
+                sbStartOffset
+                ) )
+            {
+            sbSsStatus = aIsiMessage.Get8bit( sbStartOffset +
+                                              SS_GSM_DATA_OFFSET_SSSTATUS );
+            }
+
+        if ( 0 != sbSsStatus )
+            {
+            //Found SS status info from SS_SERVICE_COMPLETED_IND
+            if ( SS_GSM_ACTIVE & sbSsStatus )
+                {
+                ssStatus = KCustomApiSsGsmActive;
+                }
+            else if ( SS_GSM_REGISTERED & sbSsStatus )
+                {
+                ssStatus = KCustomApiSsGsmRegistered;
+                }
+            else if ( SS_GSM_PROVISIONED & sbSsStatus )
+                {
+                ssStatus = KCustomApiSsGsmProvisioned;
+                }
+            else
+                {
+                ssStatus = KCustomApiSsGsmQuiescent;
+                }
+      TFLOGSTRING2("TSY: CMmCustomMessHandler::SsServiceCompletedInd: Complete SsRequestCompleteNotification ssStatus:%d",
+        ssStatus );
+OstTrace1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_SSSERVICECOMPLETEDIND, "CMmCustomMessHandler::SsServiceCompletedInd;Complete SsRequestCompleteNotification ssStatus=%u", ssStatus );
+
+            CMmDataPackage dataPackage;
+            // pack parameter: a TInt with SS status
+            dataPackage.PackData( &ssStatus );
+            iMessageRouter->Complete( ECustomNotifySsRequestCompleteIPC,
+                &dataPackage, KErrNone );
+
+            }
+
+        if ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+                ISI_HEADER_SIZE + SIZE_SS_SERVICE_COMPLETED_IND,
+                SS_GSM_ADDITIONAL_INFO,
+                EIsiSubBlockTypeId8Len8,
+                sbStartOffset ) )
+            {
+            //create SsAdditionalInfo structure
+            RMmCustomAPI::TSsAdditionalInfo additionalInfo;
+
+            additionalInfo.iOperationCode =
+                aIsiMessage.Get8bit( ISI_HEADER_SIZE +
+                    SS_SERVICE_COMPLETED_IND_OFFSET_OPERATION );
+
+            TUint8 length = aIsiMessage.Get8bit( sbStartOffset +
+                SS_GSM_ADDITIONAL_INFO_OFFSET_RETURNRESULTLEN );
+
+            additionalInfo.iAdditionalInfo.Copy( aIsiMessage.GetData(
+                sbStartOffset + SS_GSM_ADDITIONAL_INFO_OFFSET_RETURNRESULT,
+                length  ) );
+
+      TFLOGSTRING("TSY: CMmCustomMessHandler::SsServiceCompletedInd: Complete SsAdditionalInfoNotification");
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_SSSERVICECOMPLETEDIND, "CMmCustomMessHandler::SsServiceCompletedInd - Complete SsAdditionalInfoNotification" );
+
+      // complete notification
+            CMmDataPackage dataPackage;
+            // pack parameter: pointer to RMmCustomAPI::TSsAdditionalInfo
+            RMmCustomAPI::TSsAdditionalInfo* additionalInfoPtr =
+              &additionalInfo;
+            dataPackage.PackData( &additionalInfoPtr );
+            iMessageRouter->Complete( ECustomSsAdditionalInfoNotificationIPC,
+                &dataPackage, KErrNone );
+
+            }
+        }
+    else  // No subblock found, e.g. in AlterEgo functionality
+        {
+        TInt ssStatus( KCustomApiSsGsmQuiescent );
+
+         CMmDataPackage dataPackage;
+         // pack parameter: a TInt with SS status
+         dataPackage.PackData( &ssStatus );
+         iMessageRouter->Complete( ECustomNotifySsRequestCompleteIPC,
+                &dataPackage, KErrNone );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::SsServiceFailedResp
+// Breaks a SS_SERVICE_FAILED_RESP ISI message. This method
+// triggers SsRequestCompleteNotification notification.
+// Completes SsRequestCompleteNotification method from custom tsy with
+// status value 0xFFFF to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::SsServiceFailedResp
+        (
+        const TIsiReceiveC& aIsiMessage //received ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::SsServiceFailedResp");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_SSSERVICEFAILEDRESP, "CMmCustomMessHandler::SsServiceFailedResp" );
+
+    TInt ssStatus( RMmCustomAPI::KSsStatusReturnError );
+
+    CMmDataPackage dataPackage;
+
+    TUint sbStartOffset( 0 );
+
+    //create SsAdditionalInfo structure
+    RMmCustomAPI::TSsAdditionalInfo additionalInfo;
+
+    // this data is not available, set to 0 just in case
+    additionalInfo.iOperationCode = 0x00;
+
+    //if sub block exists
+    if ( KErrNone == aIsiMessage.FindSubBlockOffsetByIndex(
+        ISI_HEADER_SIZE + SIZE_SS_SERVICE_FAILED_RESP,
+        1,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffset ) )
+        {
+        TUint8 subBlockId( aIsiMessage.Get8bit( sbStartOffset ) );
+        switch ( subBlockId )
+            {
+            case SS_GSM_INDICATE_PASSWORD_ERROR:
+                {
+                // Set error code to additional info. No mapping needed because
+                // client wants error code as it was received from network.
+                additionalInfo.iAdditionalInfo.Append(
+                    aIsiMessage.Get8bit( sbStartOffset +
+                        SS_GSM_INDICATE_PASSWORD_ERROR_OFFSET_GUIDANCEINFO ) );
+                break;
+                }
+            case SS_GSM_INDICATE_ERROR:
+                {
+                additionalInfo.iAdditionalInfo.Append( aIsiMessage.Get8bit(
+                    sbStartOffset + SS_GSM_INDICATE_ERROR_OFFSET_ERRORCODE ) );
+                // If additional indication is not default, add it to buffer
+                TUint8 addIndication(
+                    aIsiMessage.Get8bit( sbStartOffset +
+                        SS_GSM_INDICATE_ERROR_OFFSET_ADDITIONALINDICATION ) );
+                // Just to keep previous functionality, the default value
+                // not added to buffer
+                if ( SS_DEFAULT_VALUE != addIndication )
+                    {
+                    additionalInfo.iAdditionalInfo.Append( addIndication );
+                    }
+                break;
+                }
+            case SS_GSM_INDICATE_PROBLEM:
+                {
+                // Problem code is added to additional info only if RELEASE
+                // COMPLETE message from network includes Return Result
+                // component
+                if ( SS_GSM_RETURN_RESULT_PROBLEM ==
+                    aIsiMessage.Get8bit( sbStartOffset +
+                        SS_GSM_INDICATE_PROBLEM_OFFSET_PROBLEMTYPE ) )
+                    {
+                    additionalInfo.iAdditionalInfo.Append(
+                        aIsiMessage.Get8bit( sbStartOffset +
+                            SS_GSM_INDICATE_PROBLEM_OFFSET_PROBLEMCODE ) );
+                    }
+                break;
+                }
+            case SS_GSM_INDICATE_MSG_ERROR:
+                {
+                additionalInfo.iAdditionalInfo.Append(
+                    aIsiMessage.Get8bit( sbStartOffset +
+                        SS_GSM_INDICATE_MSG_ERROR_OFFSET_MESSAGEERRORCODE ) );
+                break;
+                }
+            case SS_OTHER_ERROR:
+                {
+                additionalInfo.iAdditionalInfo.Append( aIsiMessage.Get8bit(
+                    sbStartOffset + SS_OTHER_ERROR_OFFSET_ERRORCODE ) );
+                break;
+                }
+            case SS_GSM_MM_RELEASED:
+                {
+                // This subblock occurs when network has released SS request,
+                // therefore SS status is set accordingly
+                ssStatus = RMmCustomAPI::KSsStatusNetworkFailure;
+
+                additionalInfo.iAdditionalInfo.Append( aIsiMessage.Get8bit(
+                    sbStartOffset + SS_GSM_MM_RELEASED_OFFSET_CAUSE ) );
+                break;
+                }
+            default:
+                {
+                // unknown error sub block
+                additionalInfo.iAdditionalInfo.Append( 0x00 );
+                break;
+                }
+            }
+        TFLOGSTRING2("TSY: CMmCustomMessHandler::SsServiceFailedResp: Ss Status: %d", ssStatus );
+OstTrace1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_SSSERVICEFAILEDRESP, "CMmCustomMessHandler::SsServiceFailedResp;Ss Status=%d", ssStatus );
+        // pack parameter: a TInt with SS status
+        dataPackage.PackData( &ssStatus );
+
+        // To complete outstanding SsRequestCompleteNotification
+        iMessageRouter->Complete(
+            ECustomNotifySsRequestCompleteIPC,
+            &dataPackage,
+            KErrNone );
+
+        TFLOGSTRING2("TSY: CMmCustomMessHandler::SsServiceFailedResp: SB ID: 0x%x",subBlockId );
+OstTraceExt1( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_SSSERVICEFAILEDRESP, "CMmCustomMessHandler::SsServiceFailedResp;subBlockId=%hhx", subBlockId );
+        // pack parameter: pointer to RMmCustomAPI::TSsAdditionalInfo
+        RMmCustomAPI::TSsAdditionalInfo* additionalInfoPtr = &additionalInfo;
+        dataPackage.PackData( &additionalInfoPtr );
+
+        // To complete outstanding SsAdditionalInfoNotification
+        iMessageRouter->Complete(
+            ECustomSsAdditionalInfoNotificationIPC,
+            &dataPackage,
+            KErrNone );
+        }
+    else
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::SsServiceFailedResp: No subblock's");
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_SSSERVICEFAILEDRESP, "CMmCustomMessHandler::SsServiceFailedResp - No subblock's" );
+
+        dataPackage.PackData( &ssStatus );
+
+        // No subblocks, complete with default values
+        iMessageRouter->Complete( ECustomNotifySsRequestCompleteIPC,
+                              &dataPackage,
+                              KErrNone );
+        // No additional info given, no need to complete
+        // ECustomSsAdditionalInfoNotificationIPC
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallEmergencyNbrCheckReq
+// Constructs CALL_MODEM_EMERGENCY_NBR_CHECK_REQ ISI message from input parameters
+// and sends it through phonet. This message can be used to check if given
+// number is an emrgency number.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::CallEmergencyNbrCheckReq
+        (
+        TUint8 aTransId,              // Transaction Id
+        RMmCustomAPI::TMobileTelNumber& aNumber,  // Telnumber
+        RMmCustomAPI::TCheckMode aCheckMode     // Check mode
+        )
+    {
+  TFLOGSTRING( "TSY: CMmCustomMessHandler::CallEmergencyNbrCheckReq" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLEMERGENCYNBRCHECKREQ, "CMmCustomMessHandler::CallEmergencyNbrCheckReq" );
+
+    //save the information to match it when the response is got
+    iUsedEmergencyNbrCheckMode = aCheckMode;
+    iEmergencyNumberLength = aNumber.Length();
+
+  // Construct CALL_MODEM_EMERG_NBR_CHECK_REQ message (1 filler +
+  // sub block count + bytes for CALL_MODEM_SB_DESTINATION_ADDRESS sub block)
+  TBuf8< 2 + SIZE_CALL_MODEM_SB_DESTINATION_ADDRESS +
+      ( RMobilePhone::KMaxMobileTelNumberSize * 2 ) > callEmergencyNbrCheckReq;
+
+    // Filler
+    callEmergencyNbrCheckReq.Append( KCustomPadding );
+    // Sub block count
+    callEmergencyNbrCheckReq.Append( 1 );
+
+    //create the CALL_MODEM_DESTINATION_ADDRESS subblock
+    TBuf8<SIZE_CALL_MODEM_SB_DESTINATION_ADDRESS +
+        ( RMobilePhone::KMaxMobileTelNumberSize * 2 )>
+        destinationAddressBuf( 0 );
+    TIsiSubBlock destinationAddressSb( destinationAddressBuf,
+        CALL_MODEM_SB_DESTINATION_ADDRESS, EIsiSubBlockTypeId8Len8 );
+
+    //add the Address type, not needed because this is not checked on ISA side
+    destinationAddressBuf.Append( CALL_MODEM_NBR_PLAN_UNKNOWN );
+
+    //add padding bytes
+    destinationAddressBuf.Append( KCustomPadding );
+    destinationAddressBuf.Append( KCustomPadding );
+
+    //add number length
+  //lint -e{732} Warning about "loss of sign". Root cause is that
+  //TDesC::Length() returns a signed TInt
+    destinationAddressBuf.Append( aNumber.Length() );
+
+    //add the number string
+    TIsiUtility::CopyToBigEndian( aNumber, destinationAddressBuf );
+
+    // add the CALL_MODEM_DESTINATION_ADDRESS subblock
+    callEmergencyNbrCheckReq.Append( destinationAddressSb.CompleteSubBlock() );
+
+    // Sending message to phonet
+    return iPhoNetSender->Send( PN_MODEM_CALL, aTransId, CALL_MODEM_EMERG_NBR_CHECK_REQ,
+      callEmergencyNbrCheckReq );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallEmergencyNbrCheckResp
+// Breaks a CALL_EMERGENCY_CHECK_RESP ISI message. This method
+// provides information whether the given number was an emergency number or not.
+// Complete CompleteCheckEmergencyNumber with status and errorValue to SOS layer
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+
+void CMmCustomMessHandler::CallEmergencyNbrCheckResp
+        (
+        const TIsiReceiveC& aIsiMsg        // Received ISI message
+        )
+    {
+  TFLOGSTRING("TSY: CMmCustomMessHandler::CallEmergencyNbrCheckResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLEMERGENCYNBRCHECKRESP, "CMmCustomMessHandler::CallEmergencyNbrCheckResp" );
+
+    // Get Status
+    TUint8 status( aIsiMsg.Get8bit( ISI_HEADER_SIZE +
+        CALL_MODEM_EMERG_NBR_CHECK_RESP_OFFSET_STATUS ));
+
+  RMmCustomAPI::TMobileTelNumber telNumber;
+
+    //Using the advance checking of the call server forces us to make sure
+    //that the call server is not is not misleading us...
+    if ( CALL_MODEM_EMERG_NBR_CHECK_PASS == status )
+        {
+        TUint sbStartOffSet( 0 );
+
+        if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+          ISI_HEADER_SIZE + SIZE_CALL_MODEM_EMERG_NBR_CHECK_RESP,
+          CALL_MODEM_SB_EMERG_NUMBER, EIsiSubBlockTypeId8Len8, sbStartOffSet ) )
+            {
+            //get length of returned number (number of Unicode characters)
+            TUint8 numberLength( aIsiMsg.Get8bit( sbStartOffSet +
+                CALL_MODEM_SB_EMERG_NUMBER_OFFSET_ADDRLEN ));
+
+             //copy 8-bit number to the 16-bit target using correct endianess
+             //ISI message contains one Unicode digit in two bytes ==> multiply length by 2
+             TIsiUtility::CopyFromBigEndian( aIsiMsg.GetData( sbStartOffSet +
+                 CALL_MODEM_SB_EMERG_NUMBER_OFFSET_ADDR,
+                 numberLength * 2 ), telNumber );
+
+            //Check that the Number length returned by call server doesn't
+            //differ from original phone number.
+            //Call server uses advanced mode while checking
+            //numbers. For example 2112 is valid emergency number for
+            //call server -> server returns number 112. However 2112 is not
+            //emergency number.
+            if ( RMmCustomAPI::EEmerNumberCheckNormal ==
+              iUsedEmergencyNbrCheckMode && numberLength !=
+              iEmergencyNumberLength )
+                {
+                status = CALL_MODEM_EMERG_NBR_CHECK_FAIL;
+                }
+            }
+        else
+            {
+            //acording to call server feature description, in case of succesful
+            //checking the sub block should be present. Therefore we consider
+            //this case as a failure.
+            status = CALL_MODEM_EMERG_NBR_CHECK_FAIL;
+            }
+        }
+
+  // map to result: failed is 0, successful is ptr to number
+  RMmCustomAPI::TMobileTelNumber* result =
+    ( ( CALL_MODEM_EMERG_NBR_CHECK_FAIL == status ) ?
+      0 : &telNumber );
+
+  // packed parameter: TBool result
+  CMmDataPackage dataPackage;
+  dataPackage.PackData( &result );
+  
+  TFLOGSTRING2( "TSY: TSY: CMmCustomMessHandler::CallEmergencyNbrCheckResp status: %d", status);
+  TFLOGSTRING2( "TSY: TSY: CMmCustomMessHandler::CallEmergencyNbrCheckResp emergency number: %S", &telNumber);
+    //we complete with KErrNone as there is always a value to return
+  iMessageRouter->Complete( ECustomCheckEmergencyNumberIPC, &dataPackage,
+    KErrNone );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccOperatorReq
+// Read operator name from UICC
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccOperatorReq()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccOperatorReq" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCOPERATORREQ, "CMmCustomMessHandler::UiccOperatorReq" );
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccReadTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdReadOperatorNameCustom;
+    params.dataOffset = 0;
+    params.dataAmount = 0;
+    params.fileId = KElemFileOperatorName;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.serviceType = UICC_APPL_READ_TRANSPARENT;
+
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccOperatorResp
+// Complete operator name
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccOperatorResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccOperatorResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCOPERATORRESP, "CMmCustomMessHandler::UiccOperatorResp" );
+
+    TInt errorValue( KErrGeneral );
+
+    // Network provider name
+    TBuf<KNwProviderNameLength> name;
+
+    if ( KErrNone == aStatus )
+        {
+        errorValue = KErrNone;
+        name.Copy( aFileData );
+        }
+
+    // Packed parameter: TDes* (network provider name)
+    CMmDataPackage dataPackage;
+    TDes* namePtr( &name );
+    dataPackage.PackData( &namePtr );
+
+    iMessageRouter->Complete(
+        ECustomGetNetworkProviderNameIPC,
+        &dataPackage,
+        errorValue );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::SsGsmUssdSendReq
+// Constructs SS_GSM_USSD_SEND_REQ ISI message from input parameters
+// and sends it through phonet.
+// This message can be used only to cancel ussd session.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::SsGsmUssdSendReq
+        (
+        TUint8 aTransId             //transaction Id
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::SsGsmUssdSendReq" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_SSGSMUSSDSENDREQ, "CMmCustomMessHandler::SsGsmUssdSendReq" );
+
+    // create buffer for isi msg data
+    TBuf8<2> data;
+    data.Append( SS_GSM_USSD_END );
+    //number of sub blocks
+    data.Append( 0 );
+
+    // Message sent via Phonet and return
+    return iPhoNetSender->Send( PN_SS, aTransId, SS_GSM_USSD_SEND_REQ, data  );
+
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::SsGsmUssdSendResp
+// Breaks a SS_USSD_SEND_RESP ISI message.
+// This method gets USSD type information from message and completes cancelling
+// of ussd session. Complete CancelUssdSession with KErrNone to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::SsGsmUssdSendResp
+        (
+        const TIsiReceiveC& aIsiMessage //received ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::SsGsmUssdSendResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_SSGSMUSSDSENDRESP, "CMmCustomMessHandler::SsGsmUssdSendResp" );
+
+
+    TUint ussdType( aIsiMessage.Get8bit(
+                        ISI_HEADER_SIZE +
+                        SS_GSM_USSD_SEND_RESP_OFFSET_USSDTYPE ) );
+
+    if ( SS_GSM_USSD_END == ussdType )
+        {
+        // no packed parameters for completion
+        iMessageRouter->Complete( ECustomCancelUssdSessionIPC, KErrNone );
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::Match
+// This method can be checks if two TCiphListEntry entries are same.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CMmCustomMessHandler::Match
+        (
+        const TCiphListEntry& aArg1, //first argument
+        const TCiphListEntry& aArg2  //second argument
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::Match.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_MATCH, "CMmCustomMessHandler::Match" );
+
+    TBool ret ( EFalse );
+
+    //we are interested only in the traId value
+    if ( aArg1.iTraId == aArg2.iTraId )
+        {
+        ret = ETrue;
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetModemRegStatusGetReq
+// Constructs NET_MODEM_REG_STATUS_GET_REQ ISI message from input parameters
+// and sends it through phonet.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::NetModemRegStatusGetReq
+        (
+        const TUint8 aTransactionId
+        )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetModemRegStatusGetReq." );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETMODEMREGSTATUSGETREQ, "CMmCustomMessHandler::NetModemRegStatusGetReq" );
+
+    // Data length buffer is 2.
+    TBuf8<2> data;
+    data.Append( aTransactionId );
+    data.Append( NET_MODEM_REG_STATUS_GET_REQ );
+
+    TIsiSend isimsg( iPhoNetSender->SendBufferDes() );
+    isimsg.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_MODEM_NETWORK );
+    isimsg.CopyData( ISI_HEADER_SIZE, data );
+
+    return( iPhoNetSender->Send( isimsg.Complete() ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetModemRegStatusGetResp
+// NET_MODEM_REG_STATUS_GET_RESP message is handled in queue functionality
+// in cmmnetmesshandler/cmmnetoperatornamehandler and will be completed
+// there after handling.
+// This method check if ECID info needs to be updated.
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::NetModemRegStatusGetResp(
+       const TIsiReceiveC& aIsiMsg )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetModemRegStatusGetResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETMODEMREGSTATUSGETRESP, "CMmCustomMessHandler::NetModemRegStatusGetResp" );
+
+    // Get the success code.
+    TUint8 successCode( aIsiMsg.Get8bit(
+        ISI_HEADER_SIZE +
+        NET_MODEM_REG_STATUS_GET_RESP_OFFSET_SUCCESSCODE ) );
+
+    if ( NET_CAUSE_OK == successCode )
+        {
+        // Check if ECID info needs to be updated.
+        CheckECIDInfo( aIsiMsg );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CallGsmNotificationInd
+// This method breaks the CALL_MODEM_NOTIFICATION_IND ISI message.
+// Complete: ECustomNotifySsNetworkEventIPC to SOS layer.
+// If CALL_MODEM_SB_ALERTING_INFO sub block exist ECustomGetRemoteAlertingToneStatusIPC
+// is completed to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::CallGsmNotificationInd
+        (
+        const TIsiReceiveC& aIsiMsg // received ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd" );
+
+    TInt ret( KErrNone );
+
+    // For packaging
+    CMmDataPackage dataPackage;
+
+    RMmCustomAPI::TSsTypeAndMode ssTypeAndMode;
+    RMmCustomAPI::TSsInfo ssInfo;
+
+    // Initialize the default values
+    ssInfo.iCallHold = RMmCustomAPI::ESsHoldNotActive;
+    ssInfo.iEctCallState = RMmCustomAPI::ESsEctNotActive;
+    ssInfo.iCallWait = EFalse;
+    ssInfo.iConfInd = EFalse;
+    ssInfo.iClirSuppReject = EFalse;
+    ssInfo.iForwMode = RMmCustomAPI::EForwNotActive;
+    ssInfo.iCugIndex = CALL_MODEM_CUG_DEFAULT;
+    ssInfo.iChoice = RMmCustomAPI::ESsChoiceUnknown;
+    ssInfo.iRemoteAddress.FillZ();
+    ssTypeAndMode.iSsMode = RMmCustomAPI::ESsModeUnknown;
+    ssTypeAndMode.iSsType = RMmCustomAPI::ESsAllSs;
+
+    TUint sbStartOffSet( 0 );
+
+    // Get CALL_MODEM_SB_SS_CODE sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_SS_CODE,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+            - CALL_MODEM_SB_SS_CODE sub block founded");
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, CALL_MODEM_SB_SS_CODE sub block found" );
+
+        TUint16 ssCode( aIsiMsg.Get16bit(
+            sbStartOffSet + CALL_MODEM_SB_SS_CODE_OFFSET_MMISSCODE ) );
+
+        switch ( ssCode )
+            {
+            case CALL_MODEM_SSC_ALL_FWDS:
+            case CALL_MODEM_SSC_CFU:
+            case CALL_MODEM_SSC_CFB:
+            case CALL_MODEM_SSC_CFNRY:
+            case CALL_MODEM_SSC_CFGNC:
+            case CALL_MODEM_SSC_ALL_COND_FWD:
+                {
+                HandleForwarding( ssCode, aIsiMsg, ssTypeAndMode );
+                break;
+                }
+            case CALL_MODEM_SSC_OUTGOING_BARR_SERV:
+            case CALL_MODEM_SSC_INCOMING_BARR_SERV:
+                {
+                HandleBarring( ssCode, aIsiMsg, ssTypeAndMode );
+                break;
+                }
+            case CALL_MODEM_SSC_CALL_WAITING:
+                {
+                ssTypeAndMode.iSsType = RMmCustomAPI::ESsCallWaiting;
+                break;
+                }
+            case CALL_MODEM_SSC_CLIP:
+                {
+                ssTypeAndMode.iSsType = RMmCustomAPI::ESsClip;
+                break;
+                }
+            case CALL_MODEM_SSC_CLIR:
+                {
+                ssTypeAndMode.iSsType = RMmCustomAPI::ESsClir;
+                break;
+                }
+            case CALL_MODEM_SSC_COLP:
+                {
+                ssTypeAndMode.iSsType = RMmCustomAPI::ESsColp;
+                break;
+                }
+            case CALL_MODEM_SSC_COLR:
+                {
+                ssTypeAndMode.iSsType = RMmCustomAPI::ESsColr;
+                break;
+                }
+            default:
+                {
+                TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+                    switch ssCode - default.");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, switch ssCode - default" );
+                break;
+                }
+            }
+        }
+
+    // Get CALL_GSM_SS_NOTIFY sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_SS_NOTIFY,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+            - CALL_MODEM_SB_SS_NOTIFY sub block founded");
+OstTrace0( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, CALL_MODEM_SB_SS_NOTIFY sub block found" );
+
+        // Get the SsNotifyIndictor
+        TUint8 ssNotify( aIsiMsg.Get8bit(
+            sbStartOffSet + CALL_MODEM_SB_SS_NOTIFY_OFFSET_SSNOTIFICATION ) );
+
+        // Mask the value
+        // Incoming call is a forwarded call
+        if ( CALL_MODEM_SSN_INCOMING_IS_FWD == ssNotify )
+            {
+            ssInfo.iForwMode = RMmCustomAPI::ESsIncCallIsForw;
+            }
+        // Incoming call has been forwarded to C
+        else if ( CALL_MODEM_SSN_INCOMING_FWD == ssNotify )
+            {
+            ssInfo.iForwMode = RMmCustomAPI::ESsIncCallForwToC;
+            }
+        //Outgoing call is fowarded to C
+        else if ( CALL_MODEM_SSN_OUTGOING_FWD == ssNotify )
+            {
+            ssInfo.iForwMode = RMmCustomAPI::ESsOutCallForwToC;
+            }
+        // No else
+        }
+
+    // Get CALL_MODEM_SB_SS_NOTIFY_INDICATOR sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_SS_NOTIFY_INDICATOR,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+            - CALL_MODEM_SB_SS_NOTIFY_INDICATOR sub block founded");
+OstTrace0( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, CALL_MODEM_SB_SS_NOTIFY_INDICATOR sub block found" );
+
+        // Get the SsNotifyIndictor
+        TUint8 ssNotifyIndicator( aIsiMsg.Get8bit( sbStartOffSet +
+            CALL_MODEM_SB_SS_NOTIFY_INDICATOR_OFFSET_SSINDICATOR ) );
+
+        // Mask the value of the Indicator
+        if ( CALL_MODEM_SSI_CALL_IS_WAITING == ssNotifyIndicator ) // Call waiting
+            {
+            ssInfo.iCallWait = ETrue;
+            }
+        else if ( CALL_MODEM_SSI_MPTY == ssNotifyIndicator ) // Conference call
+            {
+            ssInfo.iConfInd = ETrue;
+            }
+        // CLIR suppresion rejected
+        else if ( CALL_MODEM_SSI_CLIR_SUPPR_REJ == ssNotifyIndicator )
+            {
+            ssInfo.iClirSuppReject = ETrue;
+            }
+        // No else
+        }
+
+    // Get CALL_MODEM_SB_SS_HOLD_INDICATOR sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_SS_HOLD_INDICATOR,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+            - CALL_MODEM_SB_SS_HOLD_INDICATOR sub block founded");
+OstTrace0( TRACE_NORMAL, DUP6_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, CALL_MODEM_SB_SS_HOLD_INDICATOR sub block found" );
+
+        // Get the ectIndictor
+        TUint8 holdIndicator( aIsiMsg.Get8bit( sbStartOffSet +
+            CALL_MODEM_SB_SS_HOLD_INDICATOR_OFFSET_SSHOLDINDICATOR ) );
+
+        // If hold indicator is 1
+        if ( holdIndicator )
+            {
+            ssInfo.iCallHold = RMmCustomAPI::ESsHoldActive;
+            }
+        else // hold indicator is 0
+            {
+            ssInfo.iCallHold = RMmCustomAPI::ESsHoldResume;
+            }
+        }
+
+    // Get CALL_MODEM_SB_CUG_INFO sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_CUG_INFO,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+            - CALL_MODEM_SB_CUG_INFO sub block founded");
+OstTrace0( TRACE_NORMAL, DUP7_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, CALL_MODEM_SB_CUG_INFO sub block found" );
+
+        // Get the CUG index
+        ssInfo.iCugIndex = aIsiMsg.Get16bit(
+            sbStartOffSet + CALL_MODEM_SB_CUG_INFO_OFFSET_CUGIND );
+        }
+
+    // Get CALL_MODEM_SB_SS_ECT_INDICATOR sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_SS_ECT_INDICATOR,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+            - CALL_MODEM_SB_SS_ECT_INDICATOR sub block founded");
+OstTrace0( TRACE_NORMAL, DUP8_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, CALL_MODEM_SB_SS_ECT_INDICATOR sub block found" );
+
+        // Get the ectIndictor
+        TUint8 ectIndicator( aIsiMsg.Get8bit(
+            sbStartOffSet + CALL_MODEM_SB_SS_ECT_INDICATOR_OFFSET_SSECTINDICATOR ) );
+
+        // If ect is 1
+        if ( ectIndicator )
+            {
+            ssInfo.iEctCallState = RMmCustomAPI::ESsEctActive;
+            }
+        else // ect is 0
+            {
+            ssInfo.iEctCallState = RMmCustomAPI::ESsEctAlerting;
+            }
+        }
+
+    // Get CALL_MODEM_SB_REMOTE_ADDRESS sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_REMOTE_ADDRESS,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+            - CALL_MODEM_SB_REMOTE_ADDRESS sub block founded");
+OstTrace0( TRACE_NORMAL, DUP9_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, CALL_MODEM_SB_REMOTE_ADDRESS sub block found" );
+
+        // Get the presentation
+
+        TUint8 presentationIndicator( aIsiMsg.Get8bit(
+            sbStartOffSet + CALL_MODEM_SB_REMOTE_ADDRESS_OFFSET_PRESENTATION ) );
+        // Mask with 0110 0000 to get bits 6-7
+        presentationIndicator &= 0x60;
+
+        switch ( presentationIndicator )
+            {
+            case CALL_MODEM_PRESENTATION_ALLOWED:
+                {
+                ssInfo.iChoice = RMmCustomAPI::ESsPresAllowed;
+                break;
+                }
+            case CALL_MODEM_PRESENTATION_RESTRICTED:
+                {
+                ssInfo.iChoice = RMmCustomAPI::ESsPresRestricted;
+                break;
+                }
+            case CALL_MODEM_PRESENTATION_UNAVAILABLE:
+                {
+                ssInfo.iChoice = RMmCustomAPI::ESsNumberNotAvailable;
+                break;
+                }
+            default:
+                {
+                TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+                    - CALL_MODEM_SB_REMOTE_ADDRESS sub block\
+                    - switch presentationIndicator - default.");
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, switch presentationIndicator - default" );
+                // The variable already has a default value
+                break;
+                }
+            }
+
+        // Copy the number with rigth endianess
+        TUint8 remoteAddressLength( aIsiMsg.Get8bit(
+            sbStartOffSet + CALL_MODEM_SB_REMOTE_ADDRESS_OFFSET_ADDRLEN ) );
+
+        // Copy 8-bit name to the 16-bit target using correct endianess
+        TIsiUtility::CopyFromBigEndian( aIsiMsg.GetData(
+            sbStartOffSet + CALL_MODEM_SB_REMOTE_ADDRESS_OFFSET_ADDR,
+            remoteAddressLength ),
+            ssInfo.iRemoteAddress );
+        }
+
+    // Get CALL_MODEM_SB_ALERTING_INFO sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_ALERTING_INFO,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::CallGsmNotificationInd,\
+            - CALL_MODEM_SB_ALERTING_INFO sub block founded");
+OstTrace0( TRACE_NORMAL, DUP10_CMMCUSTOMMESSHANDLER_CALLGSMNOTIFICATIONIND, "CMmCustomMessHandler::CallGsmNotificationInd, CALL_MODEM_SB_ALERTING_INFO sub block found" );
+
+        TBool playRemoteAlertToneLocally( EFalse );
+
+        // Get alerting info
+        TUint8 callAlertingInfo( aIsiMsg.Get8bit(
+            sbStartOffSet + CALL_MODEM_SB_ALERTING_INFO_OFFSET_ALERTINGINFO ) );
+
+        // If LSB is "1" inform that remote alerting tone
+        // should be generated locally.
+        if ( callAlertingInfo & 0x01 )
+            {
+            playRemoteAlertToneLocally = ETrue;
+            }
+
+        // Complete remote alerting tone notification
+        // Parameter for SOS layer: a TBool playRemoteAlertToneLocally
+        dataPackage.PackData( &playRemoteAlertToneLocally );
+        iMessageRouter->Complete( ECustomGetRemoteAlertingToneStatusIPC,
+            &dataPackage,
+            KErrNone );
+        }
+
+    // Complete SsNetworkEvent notification
+    // Pack parameter: a RMmCustomAPI::TSsTypeAndMode and
+    // a RMmCustomAPI::TSsInfo
+    dataPackage.PackData( &ssTypeAndMode, &ssInfo );
+    iMessageRouter->Complete( ECustomNotifySsNetworkEventIPC,
+        &dataPackage,
+        ret );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::HandleForwarding
+// Breaks a CALL_MODEM_NOTIFICATION_IND ISI message.
+// Gets forwardfing related information from message and sets it in
+// aSsTypeAndMode for further completion in the method CallGsmNotificationIndL2
+// to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::HandleForwarding
+        (
+        TUint16 aSsCode, //SS code
+        const TIsiReceiveC& aIsiMsg,  //Isi message
+        RMmCustomAPI::TSsTypeAndMode& aSsTypeAndMode //ss type and mode
+        ) const
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::HandleForwarding.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_HANDLEFORWARDING, "CMmCustomMessHandler::HandleForwarding" );
+
+    //identify the kind of forwarding
+    switch ( aSsCode )
+        {
+        case CALL_MODEM_SSC_ALL_FWDS:
+            aSsTypeAndMode.iSsType = RMmCustomAPI::ESsAllForwardings;
+            break;
+        case CALL_MODEM_SSC_CFU:
+            aSsTypeAndMode.iSsType = RMmCustomAPI::ESsForwUncond;
+            break;
+        case CALL_MODEM_SSC_CFB:
+            aSsTypeAndMode.iSsType = RMmCustomAPI::ESsForwBusy;
+            break;
+        case CALL_MODEM_SSC_CFNRY:
+            aSsTypeAndMode.iSsType = RMmCustomAPI::ESsForwNoReply;
+            break;
+        case CALL_MODEM_SSC_CFGNC:
+            aSsTypeAndMode.iSsType = RMmCustomAPI::ESsForwNoReach;
+            break;
+        case CALL_MODEM_SSC_ALL_COND_FWD:
+            aSsTypeAndMode.iSsType = RMmCustomAPI::ESsAllCondForwardings;
+            break;
+        default:
+            TFLOGSTRING("TSY: CMmCustomMessHandler::HandleForwarding, switch aSsCode - default.\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_HANDLEFORWARDING, "CMmCustomMessHandler::HandleForwarding, switch aSsCode - default" );
+            //this case is imposible, added due code convention
+            break;
+        }
+
+    TUint sbStartOffSet( 0 );
+
+    //get call gsm ss status sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_SS_STATUS, EIsiSubBlockTypeId8Len8, sbStartOffSet ) )
+        {
+        //get the ss status
+        TUint8 ssStatus ( aIsiMsg.Get8bit( sbStartOffSet +
+            CALL_MODEM_SB_SS_STATUS_OFFSET_SSSTATUS ) );
+
+        //set the right status for the bit configuration of ssStatus
+        if ( CALL_MODEM_SS_STATUS_ACTIVE & ssStatus ) //if active is present
+            {
+            aSsTypeAndMode.iSsMode = RMmCustomAPI::ESsModeActive;
+            }
+        // if quiescent is present
+        else if ( CALL_MODEM_SS_STATUS_QUIESCENT & ssStatus )
+            {
+            //if registered and provisioned, and not active or quiescent
+            aSsTypeAndMode.iSsMode = RMmCustomAPI::ESsModeNotAvailable;
+            }
+        //if registered and provisioned, and not active or quiescent
+        else if ( ( CALL_MODEM_SS_STATUS_REGISTERED | CALL_MODEM_SS_STATUS_PROVISIONED )
+          == ssStatus )
+            {
+            aSsTypeAndMode.iSsMode = RMmCustomAPI::ESsModeNotActive;
+            }
+        else if ( CALL_MODEM_SS_STATUS_PROVISIONED == ssStatus ) //only provisioned
+            {
+            aSsTypeAndMode.iSsMode = RMmCustomAPI::ESsModeNotRegistered;
+            }
+        else //not provisioned
+            {
+            aSsTypeAndMode.iSsMode = RMmCustomAPI::ESsModeNotProvisioned;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::HandleBarring
+// Breaks a CALL_MODEM_NOTIFICATION_IND ISI message.
+// Gets barring related information from message and sets it in
+// aSsTypeAndMode for further completion in the method CallGsmNotificationIndL2.
+// to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::HandleBarring
+        (
+        TUint16 aSsCode,       //SS code
+        const TIsiReceiveC& aIsiMsg,  //ISI message
+        RMmCustomAPI::TSsTypeAndMode& aSsTypeAndMode //Ss type and mode
+        ) const
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::HandleBarring.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_HANDLEBARRING, "CMmCustomMessHandler::HandleBarring" );
+
+    //identify the kind of barring
+    switch ( aSsCode )
+        {
+         case CALL_MODEM_SSC_OUTGOING_BARR_SERV:
+             aSsTypeAndMode.iSsType = RMmCustomAPI::ESsOutgoingBarrServ;
+             break;
+         case CALL_MODEM_SSC_INCOMING_BARR_SERV:
+             aSsTypeAndMode.iSsType = RMmCustomAPI::ESsIncomingBarrServ;
+             break;
+         default:
+             TFLOGSTRING("TSY: CMmCustomMessHandler::HandleBarring, switch aSsCode - default.\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_HANDLEBARRING, "CMmCustomMessHandler::HandleBarring, switch aSsCode - default" );
+             //this case is imposible, added due code convention
+             break;
+        }
+
+    TUint sbStartOffSet( 0 );
+
+    //get call gsm ss status sub block
+    if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_CALL_MODEM_NOTIFICATION_IND,
+        CALL_MODEM_SB_SS_STATUS, EIsiSubBlockTypeId8Len8, sbStartOffSet ) )
+        {
+        //get the ss status
+        TUint8 ssStatus ( aIsiMsg.Get8bit( sbStartOffSet +
+            CALL_MODEM_SB_SS_STATUS_OFFSET_SSSTATUS ) );
+
+        //set the right status for the bit configuration of ssStatus
+        if ( CALL_MODEM_SS_STATUS_ACTIVE & ssStatus ) //if active is present
+            {
+            aSsTypeAndMode.iSsMode = RMmCustomAPI::ESsModeActive;
+            }
+        //if quiescent is present
+        else if ( CALL_MODEM_SS_STATUS_QUIESCENT & ssStatus )
+            {
+            aSsTypeAndMode.iSsMode = RMmCustomAPI::ESsModeNotAvailable;
+            }
+        else if ( CALL_MODEM_SS_STATUS_PROVISIONED == ssStatus ) //only provisioned
+            {
+            aSsTypeAndMode.iSsMode = RMmCustomAPI::ESsModeNotRegistered;
+            }
+        else
+            {
+            aSsTypeAndMode.iSsMode = RMmCustomAPI::ESsModeNotProvisioned;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetSetReq
+// Constructs NET_SET_REQ ISI message from input parameters
+// and sends it through phonet.
+// This message is created for reseting the network server
+// to previous registered network when the user doesn't select
+// a network from the network list got in a search
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::NetSetReq( TUint8 aTransId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetSetReq");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETSETREQ, "CMmCustomMessHandler::NetSetReq" );
+
+    // Data for ISI message, buffer size is one
+    TBuf8<2 + SIZE_NET_OPERATOR_INFO_COMMON> netSetReq;
+    // Registered in another protocol is set to 0
+    netSetReq.Append ( 0 );
+
+    // 1 SubBlock
+    netSetReq.Append ( 1 );
+
+    TBuf8<SIZE_NET_OPERATOR_INFO_COMMON> netGsmOperatorInfoCommonBuf;
+    TIsiSubBlock netGsmOperatorInfoCommonSb(
+        netGsmOperatorInfoCommonBuf,
+        NET_OPERATOR_INFO_COMMON,
+        EIsiSubBlockTypeId8Len8 );
+
+    netGsmOperatorInfoCommonBuf.Append( NET_SELECT_MODE_NO_SELECTION );
+    netGsmOperatorInfoCommonBuf.Append( NET_INDEX_NOT_USED );
+
+    netSetReq.Append( netGsmOperatorInfoCommonSb.CompleteSubBlock() );
+
+    // Send message via Phonet
+    return iPhoNetSender->Send(
+        PN_MODEM_NETWORK,
+        aTransId,
+        NET_SET_REQ,
+        netSetReq );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetSetResp
+// Breaks a NET_SERVER_RESP ISI message.
+// This message maps the CS cause value to ETel error value and complete
+// CompleteResetNetServer to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::NetSetResp( const TIsiReceiveC& aIsiMsg )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetSetResp");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETSETRESP, "CMmCustomMessHandler::NetSetResp" );
+
+    // Get the cause
+    TUint8 cause( aIsiMsg.Get8bit(
+        ISI_HEADER_SIZE +
+        NET_SET_RESP_OFFSET_SUCCESSCODE ) );
+
+    // Map the cs error as symbian value
+    TInt error( CMmStaticUtility::CSCauseToEpocError(
+        PN_MODEM_NETWORK,
+        KTsyNetCauseCommon,
+        cause ) );
+
+    // Completion ResetNetServer method (no packed parameters)
+    iMessageRouter->Complete( ECustomResetNetServerIPC, error );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetRatResp
+// Breaks a NET_SERVER_RESP ISI message.
+// This method get RatName sub blocks maps the CS cause value to ETel error
+// value and complete ResetNetServer to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::NetRatResp( const TIsiReceiveC& aIsiMsg )
+    {
+TFLOGSTRING( "TSY: CMmCustomMessHandler::NetRatResp");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETRATRESP, "CMmCustomMessHandler::NetRatResp" );
+
+    // Get the success code
+    TUint8 successCode( aIsiMsg.Get8bit(
+        ISI_HEADER_SIZE + NET_RAT_RESP_OFFSET_SUCCESSCODE ) );
+
+    TInt ret( KErrNone );
+
+    TUint32 supportedNetworkModes( 0 );
+
+TFLOGSTRING2( "TSY: CMmCustomMessHandler::NetRatResp successCode : %d", successCode);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_NETRATRESP, "CMmCustomMessHandler::NetRatResp;successCode=%hhu", successCode );
+
+    // Check if we have sub blocks in the message
+    if ( aIsiMsg.Get8bit( ISI_HEADER_SIZE + NET_RAT_RESP_OFFSET_SUBBLOCKCOUNT )
+        != 0 && NET_CAUSE_OK == successCode )
+        {
+        TUint8 subBlockIndex( 1 );
+        TUint sbStartOffSet( 0 );
+
+        // NET_RAT_INFO sub block
+        while ( KErrNone == aIsiMsg.FindSubBlockOffsetByIndex(
+            ISI_HEADER_SIZE + SIZE_NET_RAT_RESP,
+            subBlockIndex,
+            EIsiSubBlockTypeId8Len8,
+            sbStartOffSet ) )
+            {
+            // Get ratName
+            TUint8 ratName( aIsiMsg.Get8bit(
+                sbStartOffSet + NET_RAT_INFO_OFFSET_RATNAME ) );
+
+            switch ( ratName )
+                {
+                case NET_GSM_RAT:
+                    {
+                    supportedNetworkModes += RMmCustomAPI::KCapsNetworkModeGsm;
+                    break;
+                    }
+                case NET_UMTS_RAT:
+                    {
+                    supportedNetworkModes += RMmCustomAPI::KCapsNetworkModeUmts;
+                    break;
+                    }
+                }
+            subBlockIndex++;
+            }
+        }
+    else
+        {
+        // Map the cs error as symbian value
+        ret = CMmStaticUtility::CSCauseToEpocError(
+            PN_MODEM_NETWORK,
+            KTsyNetCauseCommon,
+            successCode );
+        }
+
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &supportedNetworkModes );
+
+TFLOGSTRING2( "TSY: CMmCustomMessHandler::NetRatResp - ret: %d", ret);
+OstTrace1( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_NETRATRESP, "CMmCustomMessHandler::NetRatResp;ret=%d", ret );
+
+    // Completion ResetNetServer method (packed parameters)
+    iMessageRouter->Complete(
+        ECustomGetSystemNetworkModesIPC,
+        &dataPackage,
+        ret );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::GssCsServiceResp
+// Breaks a GSS_CS_SERVICE_RESP ISI message.
+// completes ECustomSetSystemNetworkModeIPC, ECustomSetBandSelectionIPC or
+// ECustomGetBandSelectionIPC with KErrNone to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::GssCsServiceResp (
+        const TIsiReceiveC& aIsiMessage ) // Received isi message
+    {
+    TFLOGSTRING( "TSY: CMmCustomMessHandler::GssCsServiceResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_GSSCSSERVICERESP, "CMmCustomMessHandler::GssCsServiceResp" );
+
+    TUint8 transactId ( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + GSS_CS_SERVICE_RESP_OFFSET_TRANSID ) );
+
+    TUint8 operation ( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + GSS_CS_SERVICE_RESP_OFFSET_OPERATION ) );
+
+    // GSS_SELECTED_RAT_WRITE (0x0E)
+    if ( KCustomTransId == transactId && GSS_SELECTED_RAT_WRITE == operation )
+        {
+        //completion ResetGssServer method (no packed parameters)
+        TFLOGSTRING("TSY: CMmCustomMessHandler::GssCsServiceResp - Complete ECustomSetSystemNetworkModeIPC");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_GSSCSSERVICERESP, "CMmCustomMessHandler::GssCsServiceResp - Complete ECustomSetSystemNetworkModeIPC" );
+        iMessageRouter->Complete( ECustomSetSystemNetworkModeIPC, KErrNone );
+        }
+
+// not suppoted for S60 ver 3.2
+#if ( NCP_COMMON_S60_VERSION_SUPPORT != S60_VERSION_32 )
+
+    // GSS_SELECTED_BANDS_WRITE (0x9D)
+    else if ( GSS_SELECTED_BANDS_WRITE == operation )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::GssCsServiceResp - Complete ECustomSetBandSelectionIPC");
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_GSSCSSERVICERESP, "CMmCustomMessHandler::GssCsServiceResp - Complete ECustomSetBandSelectionIPC" );
+        iMessageRouter->Complete( ECustomSetBandSelectionIPC, KErrNone );
+        }
+    // GSS_SELECTED_BANDS_READ (0x9E)
+    else if ( GSS_SELECTED_BANDS_READ == operation )
+        {
+        CompleteGetBandSelection( aIsiMessage );
+        }
+#endif // NCP_COMMON_S60_VERSION_SUPPORT
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::GssCsServiceFailResp
+// Breaks a GSS_CS_SERVICE_FAIL_RESP ISI message.
+// completes ECustomSetSystemNetworkModeIPC, ECustomSetBandSelectionIPC
+// or ECustomGetBandSelectionIPC with error value to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::GssCsServiceFailResp (
+        const TIsiReceiveC& aIsiMessage ) // Received isi message
+    {
+    TFLOGSTRING( "TSY: CMmCustomMessHandler::GssCsServiceFailResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_GSSCSSERVICEFAILRESP, "CMmCustomMessHandler::GssCsServiceFailResp" );
+
+    TUint8 transactId ( aIsiMessage.Get8bit( ISI_HEADER_SIZE +
+        GSS_CS_SERVICE_FAIL_RESP_OFFSET_TRANSID ) );
+    TUint8 operation ( aIsiMessage.Get8bit( ISI_HEADER_SIZE +
+        GSS_CS_SERVICE_FAIL_RESP_OFFSET_OPERATION ) );
+
+    // GSS_SELECTED_RAT_WRITE (0x0E)
+    if ( KCustomTransId == transactId && GSS_SELECTED_RAT_WRITE == operation )
+        {
+        //completion ResetGssServer method (no packed parameters)
+        TFLOGSTRING("TSY: CMmCustomMessHandler::GssCsServiceFailResp - ECustomSetSystemNetworkModeIPC");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_GSSCSSERVICEFAILRESP, "CMmCustomMessHandler::GssCsServiceFailResp - ECustomSetSystemNetworkModeIPC" );
+        iMessageRouter->Complete( ECustomSetSystemNetworkModeIPC, KErrGeneral );
+        }
+// not suppoted for S60 ver 3.2
+#if ( NCP_COMMON_S60_VERSION_SUPPORT != S60_VERSION_32 )
+
+    else if ( GSS_SELECTED_BANDS_WRITE == operation )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::GssCsServiceFailResp - ECustomSetBandSelectionIPC");
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_GSSCSSERVICEFAILRESP, "CMmCustomMessHandler::GssCsServiceFailResp - ECustomSetBandSelectionIPC" );
+        iMessageRouter->Complete( ECustomSetBandSelectionIPC, KErrGeneral );
+        }
+    else if ( GSS_SELECTED_BANDS_READ == operation )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::GssCsServiceFailResp - ECustomGetBandSelectionIPC");
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_GSSCSSERVICEFAILRESP, "CMmCustomMessHandler::GssCsServiceFailResp - ECustomGetBandSelectionIPC" );
+        iMessageRouter->Complete( ECustomGetBandSelectionIPC, KErrGeneral );
+        }
+#endif // NCP_COMMON_S60_VERSION_SUPPORT
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadFieldReq
+// Read given file from UICC
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccReadFieldReq(
+    RMmCustomAPI::TSimFileInfo& aSimFileInfo )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadFieldReq" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADFIELDREQ, "CMmCustomMessHandler::UiccReadFieldReq" );
+
+    // We have received only file path, file ID is two last bytes of path
+    TInt length( aSimFileInfo.iPath.Length() );
+    TBuf8<2> temp;
+    if ( 2 <= length )
+        {
+        temp.Append( aSimFileInfo.iPath.Mid( length - 2 ) );
+        }
+    TUint16 fileId( static_cast<TUint16> ( (temp[0] << 8 ) | temp[1] ) );
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccReadTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdReadField;
+    params.dataAmount = aSimFileInfo.iSize;
+    params.dataOffset = aSimFileInfo.iOffSet;
+    params.fileId = fileId;
+    params.serviceType = UICC_APPL_READ_TRANSPARENT;
+    params.filePath = aSimFileInfo.iPath.Mid( 0, length - 2 );
+
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadFieldResp
+// Complete read file
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccReadFieldResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadFieldResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADFIELDRESP, "CMmCustomMessHandler::UiccReadFieldResp" );
+
+    TInt error( KErrNone );
+    if ( aStatus != KErrNone )
+        {
+        error = KErrNotFound;
+        }
+
+    // Packed parameter for completion: pointer to TDesC8 with data
+    const TDesC8* dataPtr = &aFileData;
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &dataPtr );
+    iMessageRouter->Complete( ECustomReadSimFileIPC, &dataPackage, error);
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetRatReq
+// Constructs NET_RAT_REQ ISI message from input parameters and
+// sends it through phonet.This message is created to read Supported Net Rats
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::NetRatReq
+        (
+        TUint8 aTransId, // transaction Id
+        TBool aUseCurrentRats // use current rats setting
+        )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetRatReq");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETRATREQ, "CMmCustomMessHandler::NetRatReq" );
+
+TFLOGSTRING3( "TSY: CCMmCustomMessHandler::NetRatReq - aTransId: %d, aUseCurrentRats: %d", aTransId, aUseCurrentRats );
+OstTraceExt2( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_NETRATREQ, "CMmCustomMessHandler::NetRatReq;aTransId=%hhu;aUseCurrentRats=%hhu", aTransId, aUseCurrentRats );
+
+    // Create message data buffer for service type, buffer size is 1
+    TBuf8<1> messageData;
+    // Append service type
+    if ( aUseCurrentRats )
+        {
+        messageData.Append( NET_CURRENT_RAT );
+        }
+    else
+        {
+        messageData.Append( NET_SUPPORTED_RATS );
+        }
+
+    // Sending message to phonet
+    return iPhoNetSender->Send(
+        PN_MODEM_NETWORK,
+        aTransId,
+        NET_RAT_REQ,
+        messageData );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::GssCsServiceReq
+// Constructs GSS_CS_SERVICE_REQ ISI message from input parameters and
+// sends it through phonet.This message is created to set System network mode
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::GssCsServiceReq
+        (
+        TUint8 aTransId,             //transaction Id
+        RMmCustomAPI::TNetworkModeCaps aNetworkModeCaps //network mode caps
+        )
+    {
+
+    TFLOGSTRING2( "TSY: CMmCustomMessHandler::GssCsServiceReq - aTransId: %d",
+                    aTransId );
+OstTraceExt1( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_GSSCSSERVICEREQ, "CMmCustomMessHandler::GssCsServiceReq;aTransId=%hhu", aTransId );
+
+    // create message data buffer for service type, buffer size is 6
+    TBuf8< KGssCsBufferSize > messageData;
+
+    // append service type, GSS_SELECTED_RAT_WRITE (0x0E)
+    messageData.Append( GSS_SELECTED_RAT_WRITE );
+
+    // Number of sub blocks
+    messageData.Append( 1 );
+
+    // add the GSS_RAT_INFO (0x0B) subblock into ISI
+    messageData.Append( GSS_RAT_INFO );
+
+    // Length of sub block is 4 (SIZE_GSS_RAT_INFO)
+    messageData.Append( SIZE_GSS_RAT_INFO );
+
+    //Sub block for GSS_RAT_INFO_FUNCTIONS
+    if ( RMmCustomAPI::KCapsNetworkModeGsm == aNetworkModeCaps )
+        {
+        // GSS_GSM_RAT (0x01) is GSM mode
+        messageData.Append( GSS_GSM_RAT );
+        }
+    else if ( RMmCustomAPI::KCapsNetworkModeUmts == aNetworkModeCaps )
+        {
+        // GSS_UMTS_RAT (0x02) is Umts mode
+        messageData.Append( GSS_UMTS_RAT );
+        }
+    else
+        {
+        // GSS_DUAL_RAT (0x00) is Dual mode
+        messageData.Append( GSS_DUAL_RAT );
+        }
+
+    // Padding byte
+    messageData.Append( KCustomPadding );
+
+    // Sending message to phonet
+    return iPhoNetSender->Send( PN_GSS, aTransId, GSS_CS_SERVICE_REQ, messageData );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ExtFuncL
+// Forwards requests coming from the Symbian OS layer to the
+// specific method.
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::ExtFuncL
+        (
+        TInt aIpc, //Ipc
+        const CMmDataPackage* aDataPackage  //data package
+        )
+    {
+
+    //*************************************************************//
+    // NOTE
+    //
+    // LICENSEE SPECIFIC MESSAGE HANDLER IMPLEMENTATION STARTS HERE
+    //
+    //*************************************************************//
+
+    TInt ret( KErrNone );
+
+    TUint8 transId = KCustomTransId;
+
+    TFLOGSTRING2("TSY: CMmCustomMessHandler::ExtFuncL -- aIpc -- (%d)", aIpc );
+OstTrace1( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_EXTFUNCL, "CMmCustomMessHandler::ExtFuncL;aIpc=%d", aIpc );
+
+    switch ( aIpc )
+        {
+        case ECustomCancelUssdSessionIPC:
+            {
+            //no packed parameters
+            ret = SsGsmUssdSendReq( transId );
+            break;
+            }
+        case ECustomClearCallBlackListIPC:
+            {
+            //no packed parameters
+            ret = CallGsmBlackListClearReq( transId );
+            break;
+            }
+        case ECustomCheckEmergencyNumberIPC:
+            {
+            // packed parameter: a RMmCustomAPI::TEmerNumberCheckMode
+            RMmCustomAPI::TEmerNumberCheckMode checkMode;
+            aDataPackage->UnPackData( checkMode );
+            ret = CallEmergencyNbrCheckReq( transId, checkMode.iNumber,
+                                            checkMode.iCheckMode );
+            break;
+            }
+        case ECustomTerminateCallIPC:
+            {
+            // packed parameters: pointer to an array of TInt (Call Id)
+            // and TBool isError
+            TInt callId;
+            TBool isError;
+            aDataPackage->UnPackData( callId, isError );
+
+            // map Custom API values to ISA values
+            // cause Value (error or user request)
+            TUint8 causeValue =
+                ( isError ? CALL_MODEM_CAUSE_ERROR_REQUEST : CALL_MODEM_CAUSE_RELEASE_BY_USER );
+
+            // call Id
+            TUint8 callIdISA = 0;
+            // martpiir 27-May-2004: This cannot remain, must be checked
+            // jlof 29-Sep-2004: "all calls" id was originally -2, but now
+            // negative or zero
+            // call id means all calls. Taking absolute value of it gives
+            // alerting call id.
+            if ( 0 >= callId )
+                {
+                TFLOGSTRING("TSY: CMmCustomMessHandler::ExtFuncL -- ECustomTerminateCallIPC -- (hold+active+alerting)");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_EXTFUNCL, "CMmCustomMessHandler::ExtFuncL - ECustomTerminateCallIPC - (hold+active+alerting)" );
+                // alerting call (if any) is included as negated value..
+                callIdISA = TUint8( CALL_MODEM_ID_HOLD | CALL_MODEM_ID_ACTIVE | ( -callId ));
+                }
+            else if ( 1 <= callId && 7 >= callId )
+                {
+                TFLOGSTRING2("TSY: CMmCustomMessHandler::ExtFuncL -- ECustomTerminateCallIPC -- (%d)", TInt(callId) );
+OstTrace1( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_EXTFUNCL, "CMmCustomMessHandler::ExtFuncL;callId=%d", callId );
+                callIdISA = static_cast<TUint8>( callId );
+                }
+            else
+                {
+                // no call found
+                ret = KErrArgument;
+                }
+
+            if ( KErrNone == ret )
+                {
+                ret = CallReleaseReq( transId, callIdISA, causeValue );
+                }
+            break;
+            }
+        case ECustomGetAlsBlockedIPC:
+            {
+            ret = UiccReadDynamic2FlagsReq();
+            break;
+            }
+        case ECustomSetAlsBlockedIPC:
+            {
+            // Packed parameter: TSetAlsBlock (block status)
+            RMmCustomAPI::TSetAlsBlock blockStatus;
+            aDataPackage->UnPackData( blockStatus );
+
+            // Map Custom API values to ISA values
+            TUint8 blockStatusISA = static_cast<TUint8>( blockStatus );
+            ret = UiccWriteDynamic2FlagsReq( blockStatusISA );
+            break;
+            }
+        case ECustomCheckAlsPpSupportIPC:
+            {
+            //no packed parameters
+            // request type is used as transaction id. needed for
+            // completion.
+            ret = InfoPpReadReq( EGetAlsPPSupport );
+            break;
+            }
+        case ECustomCheckTwoDigitDialSupportIPC:
+            {
+            //no packed parameters
+            // request type is used as transaction id. needed for
+            // completion.
+            ret = InfoPpReadReq( ECheckTwoDigitDialSupport );
+            break;
+            }
+        case ECustomGetCipheringInfoIPC:
+            {
+            //no packed parameters
+            ret = UiccReadCiReq( ETrIdReadCipheringIndicatorStatusCustom );
+            break;
+            }
+        case ECustomNetWakeupIPC:
+            {
+            //no packed parameters
+            ret = NetCsWakeupReq( transId );
+            break;
+            }
+        case ECustomGetOperatorNameIPC:
+            {
+            //no packed parameters
+            ret = NetModemRegStatusGetReq( transId );
+            break;
+            }
+        case ECustomResetNetServerIPC:
+            {
+            //no packed parameters
+            ret = NetSetReq( transId );
+            break;
+            }
+        case ECustomGetNetworkProviderNameIPC:
+            {
+            ret = UiccOperatorReq();
+            break;
+            }
+        case ECustomReadSimFileIPC:
+            {
+            //packed parameter: RMmCustomAPI::TSimFileInfo
+            RMmCustomAPI::TSimFileInfo simFileInfo;
+            aDataPackage->UnPackData( simFileInfo );
+            ret = UiccReadFieldReq( simFileInfo );
+            break;
+            }
+        case EMobilePhoneIMSAuthenticate:
+            {
+            ret = UiccHandleImsAuthentication( *aDataPackage );
+            break;
+            }
+        case ECustomGetSimAuthenticationDataIPC:
+            {
+            ret = UiccSendAuthenticateApdu( *aDataPackage );
+            break;
+            }
+        // Supported network modes
+        case ECustomGetSystemNetworkModesIPC:
+            {
+            TBool useCurrentRats;
+            aDataPackage->UnPackData( useCurrentRats );
+            ret = NetRatReq( transId, useCurrentRats );
+            break;
+            }
+        // Set system network mode
+        case ECustomSetSystemNetworkModeIPC:
+            {
+            RMmCustomAPI::TNetworkModeCaps networkModeCaps;
+            aDataPackage->UnPackData( networkModeCaps );
+            ret = GssCsServiceReq( transId, networkModeCaps  );
+            break;
+            }
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+        // Current network modes
+        // Removed for Bridge camp!
+        case ECustomGetCurrentSystemNetworkModesIPC:
+            {
+            ret = MtcRatQueryReq( transId );
+            break;
+            }
+#endif /*  INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+
+        // Get GSM/WCDMA cell info
+        case ECustomGetCellInfoIPC:
+            {
+            iECIDInfoRequested = ETrue;
+            ret = NetNeighbourCellsReq( transId );
+            break;
+            }
+
+        case ECustomSimWarmResetIPC:
+            {
+            ret = UiccSimWarmResetReq();
+            break;
+            }
+
+        case ECustomGetATRIPC:
+            {
+            ret = UiccSimGetAtrReq();
+            break;
+            }
+
+        case ECustomGetSimCardReaderStatusIPC:
+            {
+            ret = UiccCardReaderStatusReq();
+            break;
+            }
+
+        case ECustomSendAPDUReqV2IPC:
+            {
+            // packed parameter: RMmCustomAPI::TApduParameters
+            RMmCustomAPI::TApduParameters apduParameters;
+            TInt traId( ETrIdSendAPDUv2 );
+
+            //Unpack aDataPackage
+            aDataPackage->UnPackData( apduParameters );
+
+            ret = UiccSendAPDUReq( apduParameters, traId);
+            break;
+            }
+        case ECustomPowerSimOnIPC:
+            {
+            ret = UiccSimPowerOnReq();
+            break;
+            }
+        case ECustomPowerSimOffIPC:
+            {
+            ret = UiccSimPowerOffReq();
+            break;
+            }
+
+        case ECustomSendAPDUReqIPC:
+            {
+            // packed parameter: RMmCustomAPI::TApdu
+            RMmCustomAPI::TApdu apduData;
+            RMmCustomAPI::TApduParameters apduParameters;
+            TInt traId( ETrIdSendAPDU );
+
+            //Unpack aDataPackage
+            aDataPackage->UnPackData( apduData );
+
+            apduParameters.iCmdData.Append(*apduData.iData);
+
+            ret = UiccSendAPDUReq( apduParameters, traId );
+            break;
+            }
+
+        //from MmSIMMessHandler
+        case ECustomStartSimCbTopicBrowsingIPC:
+            {
+            ret = UiccReadCbMsgIdsReq( ETrIdReadCbMsgIds );
+            break;
+            }
+        case ECustomDeleteSimCbTopicIPC:
+            {
+            // packed parameter: TUint with topic id
+            aDataPackage->UnPackData( iSimCBTopicToBeDeleted,
+                iTopicInSimMemoryDelete );
+            ret = UiccReadCbMsgIdsReq( ETrIdUpdateCbMsgIdsPhase1 );
+            break;
+            }
+        case EReadViagHomeZoneParamsIPC:
+            {
+            ret = UiccReadViagHomeZoneParametersReq();
+            break;
+            }
+        case EReadViagHomeZoneCacheIPC:
+            {
+            // packed parameter: RMmCustomAPI::TViagCacheRecordId
+            RMmCustomAPI::TViagCacheRecordId recordId;
+            aDataPackage->UnPackData( recordId );
+            ret = UiccReadViagHomeZoneCacheReq( recordId );
+            break;
+            }
+        case EWriteViagHomeZoneCacheIPC:
+            {
+            // packed parameters: RMmCustomAPI::TViagCacheRecordId
+            // and RMmCustomAPI::TViagCacheRecordContent
+            RMmCustomAPI::TViagCacheRecordId recordId;
+            RMmCustomAPI::TViagCacheRecordContent recordContent;
+            aDataPackage->UnPackData( recordId, recordContent );
+            ret = UiccWriteViagHomeZoneCacheReq( recordId, recordContent );
+            break;
+            }
+        //WCDMA HZ
+        case EWriteViagHomeZoneUHZIUESettingsIPC:
+            {
+            //Unpack the packed settings data
+            RMmCustomAPI::TViagUHZIUESettings settingUhziui;
+            aDataPackage->UnPackData( settingUhziui );
+            ret = UiccWriteViagHomeZoneUhziueSettingsReq( settingUhziui );
+            break;
+            }
+        case ECustomWriteHSxPAStatusIPC:
+            {
+            RMmCustomAPI::THSxPAStatus aStatus;
+            aDataPackage->UnPackData( aStatus );
+            ret = WriteHSxPAStatusReq( transId, aStatus );
+            break;
+            }
+
+        case ECustomReadHSxPAStatusIPC:
+            {
+            ret = ReadHSxPAStatusReq( transId );
+            break;
+            }
+
+// not suppoted for S60 ver 3.2
+#if ( NCP_COMMON_S60_VERSION_SUPPORT != S60_VERSION_32 )
+
+        // Set custom band selection
+        case ECustomSetBandSelectionIPC:
+            {
+            RMmCustomAPI::TNetworkModeCaps networkModeCaps;
+            RMmCustomAPI::TBandSelection bandSelection;
+            aDataPackage->UnPackData( bandSelection, networkModeCaps );
+
+            ret = GssCsServiceSetBandReq( transId,
+                networkModeCaps,
+                bandSelection );
+            break;
+            }
+
+        // Get custom band selection
+        case ECustomGetBandSelectionIPC:
+            {
+            ret = GssCsServiceGetBandReq( transId );
+            break;
+            }
+
+#endif // NCP_COMMON_S60_VERSION_SUPPORT
+
+        case EMmTsyUpdateLifeTimeIPC:
+            {
+            TTimeIntervalSeconds time;
+            aDataPackage->UnPackData( time );
+
+            ret = WriteLifeTimerToPermanentMemory( transId, time );
+
+            break;
+            }
+
+        case ECustomGetLifeTimeIPC:
+            {
+            //no packed parameters
+            ret = GetTotalLifeTimerValue();
+            break;
+            }
+
+        default:
+            {
+            // this method should only be called for Custom Tsy cases
+            TFLOGSTRING2("TSY: CMmCustomMessHandler::ExtFuncL - Unknown IPC: %d", aIpc);
+OstTrace1( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_EXTFUNCL, "CMmCustomMessHandler::ExtFuncL;aIpc=%d", aIpc );
+            ret = KErrArgument;
+            break;
+            }
+        }
+
+    return ret;
+  }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ProcessUiccMsg
+// Handles data received from UICC server
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::ProcessUiccMsg(
+    TInt aTraId,
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING3("TSY: CMmCustomMessHandler::ProcessUiccMsg, transaction ID: %d, status: %d", aTraId, aStatus );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_PROCESSUICCMSG, "CMmCustomMessHandler::ProcessUiccMsg" );
+
+    TInt ret( KErrNone );
+
+    switch( aTraId )
+        {
+        case ETrIdReadField:
+            {
+            UiccReadFieldResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdReadCbMsgIds:
+        case ETrIdUpdateCbMsgIdsPhase1:
+            {
+            UiccReadCbMsgIdsResp( aStatus, aTraId, aFileData );
+            break;
+            }
+        case ETrIdUpdateCbMsgIdsPhase2:
+            {
+            UiccDeleteCbMsgIdResp( aStatus );
+            break;
+            }
+        case ETrIdReadCipheringIndicatorStatusCustom:
+        case ETrIdNotifyCipheringIndicatorStatusCustom:
+            {
+            UiccReadCiResp( aStatus, aTraId, aFileData );
+            break;
+            }
+        case ETrIdReadOperatorNameCustom:
+            {
+            UiccOperatorResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdReadViagHomeZoneParamsCustom:
+            {
+            UiccReadViagHomeZoneParametersResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdReadViagHomeZoneCacheCustom:
+            {
+            UiccReadViagHomeZoneCacheResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdWriteViagHomeZoneCacheCustom:
+            {
+            UiccWriteViagHomeZoneCacheResp( aStatus );
+            break;
+            }
+        case ETrIdWriteViagHomeZoneUhziueSettingsCustom:
+            {
+            UiccWriteViagHomeZoneUhziueSettingsResp( aStatus );
+            break;
+            }
+        case ETrIdReadDynamic2Flags:
+            {
+            UiccReadDynamic2FlagsResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdWriteDynamic2Flags:
+            {
+            UiccWriteDynamic2FlagsResp( aStatus );
+            break;
+            }
+
+        case ETrIdSimPowerOff:
+            {
+            UiccSimPowerOffResp( aStatus );
+            break;
+            }
+
+        case ETrIdSimWarmReset:
+            {
+            UiccSimWarmResetResp( aStatus );
+            break;
+            }
+
+        case ETrIdSimGetATR:
+            {
+            UiccSimGetAtrResp( aStatus, aFileData );
+            break;
+            }
+
+        case ETrIdSimPowerOn:
+            {
+            UiccSimPowerOnResp( aStatus );
+            break;
+            }
+
+        case ETrIdSendAPDUv2:
+        case ETrIdSendAPDU:
+            {
+            UiccSendAPDUResp( aStatus, aFileData, aTraId );
+            break;
+            }
+
+        case ETrIdCardReaderStatus:
+            {
+            UiccCardReaderStatusResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdEEapSimAuthenticate:
+            {
+            UiccGsmSecurityContextApduResp( aTraId, aStatus, aFileData );
+            break;
+            }
+        case ETrIdEEapAkaAuthenticate:
+        case ETrIdEEapAkaAuthenticateIms:
+            {
+            Uicc3GSecurityContextApduResp( aTraId, aStatus, aFileData );
+            break;
+            }
+        case ETrIdEGbaBootstrap:
+            {
+            UiccGBABootstrappingApduResp( aTraId, aStatus, aFileData );
+            break;
+            }
+        case ETrIdEGbaBootstrapRead:
+            {
+            UiccGBABootstrapReadResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdEGbaBootstrapUpdate:
+            {
+            UiccGBABootstrapUpdateResp( aStatus );
+            break;
+            }
+        case ETrIdEGbaNafDerivation:
+            {
+            UiccGBANafDerivationApduResp( aTraId, aStatus, aFileData );
+            break;
+            }
+        case ETrIdEMbmsMskUpdate:
+            {
+            UiccMbmsMskUpdateApduResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdEMbmsMtkGeneration:
+            {
+            UiccMbmsMtkGenerationApduResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdEMbmsMskDeletion:
+            {
+            UiccMbmsMskDeletionApduResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdRunGsmAlgorithmSim:
+        case ETrIdRunGsmAlgorithmAka:
+        case ETrIdRunGsmAlgorithmIms:
+            {
+            UiccRunGsmAlgorithmApduResp( aTraId, aStatus, aFileData );
+            break;
+            }
+        case ETrIdActivateIsimApplication:
+            {
+            UiccHandleIsimActivationResp( aStatus );
+            break;
+            }
+        default:
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::ProcessUiccMsg - unknown transaction ID" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_PROCESSUICCMSG, "CMmCustomMessHandler::ProcessUiccMsg - unknown transaction ID" );
+
+            break;
+            }
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::MtcRatQueryReq
+// Constructs MTC_RAT_QUERY_REQ ISI message from input parameters and
+// sends it through phonet.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+// Removed for Bridge camp
+TInt CMmCustomMessHandler::MtcRatQueryReq
+        (
+        TUint8 aTransId   //transaction Id
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::MtcRatQueryReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_MTCRATQUERYREQ, "CMmCustomMessHandler::MtcRatQueryReq" );
+
+    TBuf8<KTwo> messageData;
+
+    //append padding bytes
+    messageData.Append( 0 );
+    messageData.Append( 0 );
+
+    // Sending message to phonet
+    return iPhoNetSender->Send( PN_MTC, aTransId, MTC_RAT_QUERY_REQ, messageData );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::MtcRatQueryResp
+// Breaks a MTC_RAT_QUERY_RESP ISI message.
+// This method get the ratMode and complete the request with error value
+// to SOS layer.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+// Removed for Bridge camp
+void CMmCustomMessHandler::MtcRatQueryResp
+        (
+        const TIsiReceiveC& aIsiMessage // Received isi message
+        )
+    {
+    TInt ret ( KErrNone );
+
+    TUint32 ratMode ( RMmCustomAPI::KCapsNetworkModeDual );
+    TUint8 mode = aIsiMessage.Get8bit( ISI_HEADER_SIZE + MTC_RAT_QUERY_RESP_OFFSET_RAT );
+
+TFLOGSTRING3("TSY: CMmCustomMessHandler::MtcRatQueryResp. RatMode:%d, mode:%d", ratMode, mode);
+OstTraceExt2( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_MTCRATQUERYRESP, "CMmCustomMessHandler::MtcRatQueryResp;mode=%hhu;ratMode=%u", mode, ratMode );
+
+    switch ( mode )
+        {
+        case MTC_GSM_RAT:
+            {
+            ratMode = RMmCustomAPI::KCapsNetworkModeGsm;
+            break;
+            }
+        case MTC_UMTS_RAT:
+            {
+            ratMode = RMmCustomAPI::KCapsNetworkModeUmts;
+            break;
+            }
+        case MTC_NO_RAT_SELECTION: //this means dual mode
+            {
+            //value already initalized to dual
+            break;
+            }
+        default: // MTC_UNKNOWN_RAT
+            {
+            TFLOGSTRING("TSY: CMmCustomMessHandler::MtcRatQueryResp, switch mode - default.\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_MTCRATQUERYRESP, "CMmCustomMessHandler::MtcRatQueryResp, switch mode - default" );
+            ret = KErrGeneral;
+            break;
+            }
+        }
+
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &ratMode );
+
+    //completion ResetNetServer method (packed parameters)
+    iMessageRouter->Complete( ECustomGetCurrentSystemNetworkModesIPC,
+        &dataPackage, ret );
+
+    }
+#endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadViagHomeZoneParametersReq
+// Read home zone parameters from UICC
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccReadViagHomeZoneParametersReq()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadViagHomeZoneParametersReq" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADVIAGHOMEZONEPARAMETERSREQ, "CMmCustomMessHandler::UiccReadViagHomeZoneParametersReq" );
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccReadTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdReadViagHomeZoneParamsCustom;
+    params.dataAmount = 0;
+    params.dataOffset = 0;
+    params.fileId = KElemFileHomeZone;
+    params.serviceType = UICC_APPL_READ_TRANSPARENT;
+
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( KO2DedicatedFile >> 8 );
+    params.filePath.Append( KO2DedicatedFile );
+
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadViagHomeZoneParametersResp
+// Complete home zone parameters
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccReadViagHomeZoneParametersResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadViagHomeZoneParametersResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADVIAGHOMEZONEPARAMETERSRESP, "CMmCustomMessHandler::UiccReadViagHomeZoneParametersResp" );
+
+    TInt error( KErrNone );
+    if ( KErrNone == aStatus )
+        {
+        TUint8 length( 0 );
+        TUint8 i( 0 );
+        TUint8 j( 0 );
+        TUint8 index( 2 );
+
+        // Viag params, reset
+        iViagParams.iScp.Zero();
+        iViagParams.iSmsC.Zero();
+        iViagParams.iSubscribedZoneAndVersion = 0;
+
+        // Set homezone subscription and version ( byte 1 )
+        iViagParams.iSubscribedZoneAndVersion = aFileData[0];
+
+        // Set SMSC number ( 7 bytes, not include length )
+        length = aFileData[1];
+        for ( i = 0; i < length; i++ )
+            {
+            iViagParams.iSmsC.Append( aFileData[index++] );
+            }
+
+        // Set SCP number
+        length = aFileData[9];
+        index = 10;
+        for ( i = 0; i < length; i++ )
+            {
+            iViagParams.iScp.Append( aFileData[index++] );
+            }
+
+        // Viag elements
+        RMmCustomAPI::TViagElements* viagElems(
+            new (ELeave) RMmCustomAPI::TViagElements
+            ( RMmCustomAPI::KViagElementCount ) );
+        CleanupStack::PushL( viagElems );
+        TUint8 elemDataIndex( 17 ); // Home zone elements stars from byte 18
+        TUint32 tempCoordinate( 0 );
+
+        TUint8 byte1( 0 );
+        TUint8 byte2( 0 );
+        TUint8 byte3( 0 );
+        TUint8 byte4( 0 );
+
+        // Set viag elements
+        for ( ; j < RMmCustomAPI::KViagElementCount; j++ )
+            {
+            RMmCustomAPI::TViagElement elem;
+            // Set zone id
+            elem.iCoordinates.iZoneId = aFileData[ elemDataIndex ];
+
+            // Next four bytes are for x coordinate
+            byte1 = aFileData[++elemDataIndex];
+            byte2 = aFileData[++elemDataIndex];
+            byte3 = aFileData[++elemDataIndex];
+            byte4 = aFileData[++elemDataIndex];
+
+            tempCoordinate = ( byte1 << 24 ) |
+                ( byte2 << 16 ) |
+                ( byte3 << 8 ) |
+                ( byte4 );
+            elem.iCoordinates.iX = tempCoordinate;
+
+            // Next four bytes are for y coordinate
+            byte1 = aFileData[++elemDataIndex];
+            byte2 = aFileData[++elemDataIndex];
+            byte3 = aFileData[++elemDataIndex];
+            byte4 = aFileData[++elemDataIndex];
+
+            tempCoordinate = ( byte1 << 24 ) |
+                ( byte2 << 16 ) |
+                ( byte3 << 8 ) |
+                ( byte4 );
+            elem.iCoordinates.iY = tempCoordinate;
+
+            // Next four bytes are for r2
+            byte1 = aFileData[++elemDataIndex];
+            byte2 = aFileData[++elemDataIndex];
+            byte3 = aFileData[++elemDataIndex];
+            byte4 = aFileData[++elemDataIndex];
+
+            tempCoordinate = ( byte1 << 24 ) |
+                ( byte2 << 16 ) |
+                ( byte3 << 8 ) |
+                ( byte4 );
+            elem.iCoordinates.iR2 = tempCoordinate;
+
+            // Set active flag
+            // Bit 1 indicates homzone active
+            TBool isActive(
+                ( aFileData[++elemDataIndex] & KHomeZoneActiveBit ) );
+
+            if ( isActive )
+                {
+                // Bit 2 indicates if an active homezone is marked as a cityzone
+                TBool isCityZone(
+                    ( aFileData[elemDataIndex] & KCityZoneActiveBit ) );
+                if ( isCityZone )
+                    {
+                    elem.iActiveFlag = RMmCustomAPI::ECityZone;
+                    }
+                else
+                    {
+                    elem.iActiveFlag = RMmCustomAPI::EHomeZone;
+                    }
+                }
+            else
+                {
+                elem.iActiveFlag = RMmCustomAPI::ENotActive;
+                }
+
+            // Set name (12 bytes)
+            elem.iName.Zero();
+            for ( i = 0; i < 12; i++ )
+                {
+                elem.iName.Append( aFileData[++elemDataIndex] );
+                }
+
+            viagElems->AppendL( elem );
+            elemDataIndex++;
+            }
+
+        // Complete
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &iViagParams, &viagElems );
+        iMessageRouter->Complete( EReadViagHomeZoneParamsIPC,
+            &dataPackage, error );
+
+        //delete iViagElems;
+        CleanupStack::PopAndDestroy(viagElems);
+        }
+    else
+        {
+        // Complete with error value
+        iMessageRouter->Complete(
+            EReadViagHomeZoneParamsIPC,
+            KErrAccessDenied );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadVIAGHomeZoneCacheReq
+// Read home zone cache
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccReadViagHomeZoneCacheReq(
+    const RMmCustomAPI::TViagCacheRecordId& aRecordId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadViagHomeZoneCacheReq" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADVIAGHOMEZONECACHEREQ, "CMmCustomMessHandler::UiccReadViagHomeZoneCacheReq" );
+
+    TUint8 cacheId( aRecordId.iCacheId );
+    TUint8 recordId( aRecordId.iRecordId );
+    TUint16 fileId( 0 );
+
+    // The record numbers in SIM Server range from 1 to 21. Client's record
+    // numbers range from 0 to 20. We have to increase the index by one.
+    recordId++;
+
+    // Define file ID according to cache ID
+    switch( cacheId )
+        {
+        case 1:
+            {
+            fileId = KElemFileHomeZoneCache1;
+            break;
+            }
+        case 2:
+            {
+            fileId = KElemFileHomeZoneCache2;
+            break;
+            }
+        case 3:
+            {
+            fileId = KElemFileHomeZoneCache3;
+            break;
+            }
+        case 4:
+            {
+            fileId = KElemFileHomeZoneCache4;
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccReadLinearFixed params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdReadViagHomeZoneCacheCustom;
+    params.dataOffset = 0;
+    params.dataAmount = 0;
+    params.record = recordId;
+
+    params.fileId = fileId;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.serviceType = UICC_APPL_READ_LINEAR_FIXED;
+
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( KO2DedicatedFile >> 8 );
+    params.filePath.Append( KO2DedicatedFile );
+
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadViagHomeZoneCacheResp
+// Complete home zone cache
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccReadViagHomeZoneCacheResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadViagHomeZoneCacheResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADVIAGHOMEZONECACHERESP, "CMmCustomMessHandler::UiccReadViagHomeZoneCacheResp" );
+
+    TInt ret( KErrAccessDenied );
+
+    RMmCustomAPI::TViagCacheRecordContent viagRecord;
+
+    if ( KErrNone == aStatus )
+        {
+        viagRecord.iLac = ( aFileData[0] << 8 ) | aFileData[1];
+        viagRecord.iCellId = ( aFileData[2] << 8 ) | aFileData[3];
+        ret = KErrNone;
+        }
+    else
+        {
+        viagRecord.iLac = NULL;
+        viagRecord.iCellId = NULL;
+        }
+
+    // Complete, packed parameter: RMmCustomAPI::TViagCacheRecordContent
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &viagRecord );
+    iMessageRouter->Complete( EReadViagHomeZoneCacheIPC, &dataPackage, ret );
+
+    return;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccWriteVIAGHomeZoneCacheReq
+// Write home zone cache
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccWriteViagHomeZoneCacheReq(
+    const RMmCustomAPI::TViagCacheRecordId& aRecordId,
+    const RMmCustomAPI::TViagCacheRecordContent& aViagRecordContent )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccWriteViagHomeZoneCacheReq" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCWRITEVIAGHOMEZONECACHEREQ, "CMmCustomMessHandler::UiccWriteViagHomeZoneCacheReq" );
+
+    TUint8 cacheId( (TUint8)aRecordId.iCacheId );
+    TUint8 recordId( (TUint8)aRecordId.iRecordId );
+    TUint16 lac( (TUint16)aViagRecordContent.iLac );
+    TUint16 cellId( (TUint16)aViagRecordContent.iCellId );
+    TUint16 fileId( 0 );
+
+    // The record numbers in SIM Server range from 1 to 21. Client's record
+    // numbers range from 0 to 20. We have to shift the index by one.
+    recordId++;
+
+    // Define file ID according to cache ID
+    switch( cacheId )
+        {
+        case 1:
+            {
+            fileId = KElemFileHomeZoneCache1;
+            break;
+            }
+        case 2:
+            {
+            fileId = KElemFileHomeZoneCache2;
+            break;
+            }
+        case 3:
+            {
+            fileId = KElemFileHomeZoneCache3;
+            break;
+            }
+        case 4:
+            {
+            fileId = KElemFileHomeZoneCache4;
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccWriteLinearFixed params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdWriteViagHomeZoneCacheCustom;
+    params.dataOffset = 0;
+    params.dataAmount = 0;
+    params.record = recordId;
+
+    params.fileId = fileId;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.serviceType = UICC_APPL_UPDATE_LINEAR_FIXED;
+
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( KO2DedicatedFile >> 8 );
+    params.filePath.Append( KO2DedicatedFile );
+
+    // File data to be updated.
+    TBuf8<4> fileDataBuf;
+    fileDataBuf.Append( lac >> 8 );
+    fileDataBuf.Append( lac & 0x00FF );
+    fileDataBuf.Append( cellId >> 8);
+    fileDataBuf.Append( cellId & 0x00FF );
+    params.fileData.Append( fileDataBuf );
+
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccWriteViagHomeZoneCacheResp
+// Complete home zone cache
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccWriteViagHomeZoneCacheResp( TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccWriteViagHomeZoneCacheResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCWRITEVIAGHOMEZONECACHERESP, "CMmCustomMessHandler::UiccWriteViagHomeZoneCacheResp" );
+
+    if ( KErrNone == aStatus )
+        {
+        iMessageRouter->Complete( EWriteViagHomeZoneCacheIPC, KErrNone );
+        }
+    else
+        {
+        iMessageRouter->Complete( EWriteViagHomeZoneCacheIPC, KErrGeneral );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccWriteViagHomeZoneUhziueSettingsReq
+// Write home zone settings to UICC
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccWriteViagHomeZoneUhziueSettingsReq(
+    const RMmCustomAPI::TViagUHZIUESettings& aUhziuiSettings )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccWriteViagHomeZoneUhziueSettingsReq" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCWRITEVIAGHOMEZONEUHZIUESETTINGSREQ, "CMmCustomMessHandler::UiccWriteViagHomeZoneUhziueSettingsReq" );
+
+    TUint8 settingsField( aUhziuiSettings.iSettings );
+    TUint8 versionField( aUhziuiSettings.iVersion );
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccWriteTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdWriteViagHomeZoneUhziueSettingsCustom;
+    params.dataOffset = 0;
+
+    params.fileId = KElemFileUhziueSettings;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.serviceType = UICC_APPL_UPDATE_TRANSPARENT;
+
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( KO2DedicatedFile >> 8 );
+    params.filePath.Append( KO2DedicatedFile );
+
+    // File data to be updated.
+    TBuf8<2> fileDataBuf;
+    fileDataBuf.Append( settingsField );
+    fileDataBuf.Append( versionField);
+    params.fileData.Append( fileDataBuf );
+
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccWriteViagHomeZoneUhziueSettingsResp
+// Complete home zone settings
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccWriteViagHomeZoneUhziueSettingsResp(
+    TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccWriteViagHomeZoneUhziueSettingsResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCWRITEVIAGHOMEZONEUHZIUESETTINGSRESP, "CMmCustomMessHandler::UiccWriteViagHomeZoneUhziueSettingsResp" );
+
+    TInt status( KErrAccessDenied );
+
+    if ( KErrNone == aStatus  )
+        {
+        status = KErrNone;
+        }
+    iMessageRouter->Complete( EWriteViagHomeZoneUHZIUESettingsIPC, status );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadCbMsgIdsReq
+// Read CB message IDs from UICC
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccReadCbMsgIdsReq( TUiccTrId aTrId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadCbMsgIdsReq" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADCBMSGIDSREQ, "CMmCustomMessHandler::UiccReadCbMsgIdsReq" );
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccReadTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = aTrId;
+    params.dataOffset = 0;
+    params.dataAmount = 0;
+    params.fileId = KElemFileCellBroadcastMessId;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.serviceType = UICC_APPL_READ_TRANSPARENT;
+
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+    return iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccReadCbMsgIdsResp
+// Complete CB message IDs
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccReadCbMsgIdsResp(
+    TInt aStatus,
+    TInt aTraId,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccReadCbMsgIdsResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCREADCBMSGIDSRESP, "CMmCustomMessHandler::UiccReadCbMsgIdsResp" );
+
+    TInt numOfCbIds( 0 );
+    // File data in bytes
+    TInt length( aFileData.Length() );
+    // Divide by two to get number of 16-bit CB ids
+    numOfCbIds = length >> 1;
+    // Buffer for 16 bits CB identifiers
+    TBuf16<KSimNumberOfCbMsgIds> cbIds;
+    TInt i( 0 );
+    TInt j( 0 );
+    // Loop all the bytes and append 16 bit id to buffer
+    for ( ; i < length && j < numOfCbIds; i += 2, j++ )
+        {
+        TUint16 cbId ( ( aFileData[i] << 8 ) | ( aFileData[i+1] ) );
+        cbIds.Append( cbId );
+        }
+    // Read request, complete CB topic list to CTSY
+    if ( KErrNone == aStatus && ETrIdReadCbMsgIds == aTraId && numOfCbIds > 0 )
+        {
+        CArrayFixFlat<RMmCustomAPI::TSimCbTopic>* simCbTopics = new ( ELeave )
+            CArrayFixFlat<RMmCustomAPI::TSimCbTopic> ( numOfCbIds );
+
+        for ( i = 0; i < numOfCbIds; i++ )
+            {
+            if ( KUnusedCbMsgId != cbIds[i] )
+                {
+                RMmCustomAPI::TSimCbTopic simCbTopic;
+                // CB ID
+                simCbTopic.iNumber = cbIds[i];
+                // Topic names are not stored on the SIM
+                simCbTopic.iName.Zero();
+                // Add CB topic to array
+                simCbTopics->AppendL( simCbTopic );
+                }
+             }
+        simCbTopics->Compress();
+
+        // Complete to SOS layer with packed parameter:
+        // pointer to array with CB topics
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &simCbTopics );
+
+        iMessageRouter->Complete(
+            ECustomStartSimCbTopicBrowsingIPC,
+            &dataPackage,
+            KErrNone );
+        }
+    // Delete request, update EF CBMI with new topic list
+    else if ( KErrNone == aStatus && ETrIdUpdateCbMsgIdsPhase1 == aTraId &&
+        numOfCbIds > 0 && iTopicInSimMemoryDelete )
+        {
+        // Set parameters for UICC_APPL_CMD_REQ message
+        TUiccWriteTransparent params;
+        params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+        params.trId = ETrIdUpdateCbMsgIdsPhase2;
+        params.dataOffset = 0;
+        params.fileId = KElemFileCellBroadcastMessId;
+        params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+        params.serviceType = UICC_APPL_UPDATE_TRANSPARENT;
+
+        // File id path
+        params.filePath.Append( KMasterFileId >> 8 );
+        params.filePath.Append( KMasterFileId );
+        params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+        // File data to be updated.
+        TBuf8<KSimNumberOfCbMsgIds*2> fileDataBuf;
+        for ( i = 0; i < numOfCbIds; i++ )
+            {
+            if ( cbIds[ i ] != iSimCBTopicToBeDeleted )
+                {
+                fileDataBuf.Append( cbIds[ i ] >> 8 ); // MSB
+                fileDataBuf.Append( cbIds[ i ] & 0x00FF ); // LSB
+                }
+            else // This CB id is deleted-> set unused
+                {
+                fileDataBuf.Append( 0xFF );
+                fileDataBuf.Append( 0xFF );
+                }
+            }
+        iSimCBTopicToBeDeleted = KUnusedCbMsgId;
+        params.fileData.Append( fileDataBuf );
+        iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+        }
+    else // Complete error values
+        {
+        if ( ETrIdReadCbMsgIds == aTraId )
+            {
+            iMessageRouter->Complete(
+                ECustomStartSimCbTopicBrowsingIPC,
+                KErrNotFound );
+            }
+        else // Delete request
+            {
+            iMessageRouter->Complete(
+                ECustomDeleteSimCbTopicIPC,
+                KErrNotFound );
+            }
+        iTopicInSimMemoryDelete = ETrue;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccDeleteCbMsgIdResp
+// Delete CB message ID
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccDeleteCbMsgIdResp( TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccDeleteCbMsgIdResp" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCDELETECBMSGIDRESP, "CMmCustomMessHandler::UiccDeleteCbMsgIdResp" );
+
+    TInt err( KErrNone );
+    if ( KErrNone != aStatus )
+        {
+        err = KErrAccessDenied;
+        }
+
+    iMessageRouter->Complete( ECustomDeleteSimCbTopicIPC, err );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::WriteHSxPAStatusReq
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::WriteHSxPAStatusReq
+        (
+        TUint8 aTraId,                      // Transaction identification
+        RMmCustomAPI::THSxPAStatus status   // HSxPA status
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::WriteHSxPAStatusReq");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_WRITEHSXPASTATUSREQ, "CMmCustomMessHandler::WriteHSxPAStatusReq" );
+
+    TBuf8<KHSxPAMaxMessageSize> data;
+    TUint8 value(0);
+
+    if ( RMmCustomAPI::EHSxPAEnabled == status )
+        {
+        value = GSS_HSXPA_ALLOWED;
+        }
+    else // ( RMmCustomAPI::EHSxPADisabled == status )
+        {
+        value = GSS_HSXPA_DISABLED;
+        }
+
+    data.Append( value );
+    data.Append( KCustomPadding ); //Filler
+
+    return iPhoNetSender->Send( PN_GSS,
+                                aTraId,
+                                GSS_HSXPA_USER_SETTING_WRITE_REQ,
+                                data );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::WriteHSxPAStatusResp
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::WriteHSxPAStatusResp
+        (
+        const TIsiReceiveC& aIsiMessage    // an ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::WriteHSxPAStatusResp");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_WRITEHSXPASTATUSRESP, "CMmCustomMessHandler::WriteHSxPAStatusResp" );
+
+    TInt epocError( KErrWrite );
+
+    TUint8 writeStatus = aIsiMessage.Get8bit(
+      ISI_HEADER_SIZE + GSS_HSXPA_USER_SETTING_WRITE_RESP_OFFSET_WRITESTATUS );
+
+    TUint8 reason = aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + GSS_HSXPA_USER_SETTING_WRITE_RESP_OFFSET_FAILCAUSE );
+
+    if ( GSS_OK == writeStatus )
+        {
+        epocError = KErrNone;
+        }
+    // GSS_FAIL == writeStatus and PP bit is disabled
+    else if ( GSS_HSXPA_DISABLED_VIA_PP == reason )
+        {
+        TFLOGSTRING("TSY: CMmCustomMessHandler::WriteHSxPAStatusResp. KErrNotSupported");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_WRITEHSXPASTATUSRESP, "CMmCustomMessHandler::WriteHSxPAStatusResp, KErrNotSupported" );
+        epocError = KErrNotSupported;
+        }
+
+    iMessageRouter->Complete( ECustomWriteHSxPAStatusIPC, epocError );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ReadHSxPAStatusReq
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::ReadHSxPAStatusReq
+        (
+        TUint8 aTraId              // Transaction identification
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::ReadHSxPAStatusReq");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_READHSXPASTATUSREQ, "CMmCustomMessHandler::ReadHSxPAStatusReq" );
+
+    TBuf8<KHSxPAMaxMessageSize> data;
+    data.Append( KCustomPadding ); //Filler
+    data.Append( KCustomPadding ); //Filler
+
+    return iPhoNetSender->Send( PN_GSS,
+                                aTraId,
+                                GSS_HSXPA_USER_SETTING_READ_REQ,
+                                data );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ReadHSxPAStatusResp
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::ReadHSxPAStatusResp
+        (
+        const TIsiReceiveC& aIsiMessage    // an ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::ReadHSxPAStatusResp");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_READHSXPASTATUSRESP, "CMmCustomMessHandler::ReadHSxPAStatusResp" );
+
+    CMmDataPackage dataPackage;
+
+    TUint8 state = aIsiMessage.Get8bit(
+      ISI_HEADER_SIZE + GSS_HSXPA_USER_SETTING_READ_RESP_OFFSET_HSXPAUSERSETTING );
+    TUint8 causeBit = aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + GSS_HSXPA_USER_SETTING_READ_RESP_OFFSET_CAUSE );
+
+    RMmCustomAPI::THSxPAStatus  hsxpaStatus;
+    TInt epocError( KErrNone );
+
+    if ( GSS_HSXPA_DISABLED_VIA_PP != causeBit  )
+        {
+
+        if ( GSS_HSXPA_ALLOWED == state )
+            {
+            hsxpaStatus = RMmCustomAPI::EHSxPAEnabled;
+            }
+        else if ( GSS_HSXPA_DISABLED == state )
+            {
+            hsxpaStatus = RMmCustomAPI::EHSxPADisabled;
+            }
+        else //default -> general error occurs
+            {
+            epocError = KErrGeneral;
+            }
+
+        // complete with packed parameter
+        dataPackage.PackData( &hsxpaStatus );
+        }
+    else  // PPbit is disabled -> not supported
+        {
+        epocError =  KErrNotSupported;
+        }
+
+    iMessageRouter->Complete( ECustomReadHSxPAStatusIPC, &dataPackage, epocError );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::HSxPASettingInd
+// This method breaks the GSS_HSXPA_SETTING_IND ISI.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::HSxPASettingInd
+        (
+        const TIsiReceiveC& aIsiMessage    // an ISI message
+        )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::HSxPASettingInd");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_HSXPASETTINGIND, "CMmCustomMessHandler::HSxPASettingInd" );
+
+    CMmDataPackage dataPackage;
+    RMmCustomAPI::THSxPAStatus hsxpaStatus;
+
+    TUint8 currentState = aIsiMessage.Get8bit(
+      ISI_HEADER_SIZE + GSS_HSXPA_USER_SETTING_IND_OFFSET_HSXPAUSERSETTING );
+
+    if ( GSS_HSXPA_ALLOWED == currentState )
+        {
+        hsxpaStatus = RMmCustomAPI::EHSxPAEnabled;
+        }
+    else // ( GSS_HSXPA_DISABLED == currentState )
+        {
+        hsxpaStatus = RMmCustomAPI::EHSxPADisabled;
+        }
+
+    // complete with packed parameter
+    dataPackage.PackData( &hsxpaStatus );
+    iMessageRouter->Complete( ECustomNotifyHSxPAStatusIPC, &dataPackage, KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetNeighbourCellsReq
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::NetNeighbourCellsReq( const TUint8 aTraId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetNeighbourCellsReq");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETNEIGHBOURCELLSREQ, "CMmCustomMessHandler::NetNeighbourCellsReq" );
+
+    // Add NET_NEIGHBOUR_CELL_INFO_TYPE
+    // (data size is allways 1)
+    TBuf8<1> data;
+    data.Append( NET_ECID_INFORMATION );
+
+    return iPhoNetSender->Send(
+        PN_MODEM_NETWORK,
+        aTraId,
+        NET_NEIGHBOUR_CELLS_REQ,
+        data );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::NetNeighbourCellsResp
+// This method breaks the NET_NEIGHBOUR_CELLS_RESP message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::NetNeighbourCellsResp(
+    const TIsiReceiveC& aIsiMessage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetNeighbourCellsResp");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_NETNEIGHBOURCELLSRESP, "CMmCustomMessHandler::NetNeighbourCellsResp" );
+
+    TECIDInfo tempECIDInfo;
+    TInt ret( KErrNone );
+
+    // Get the success code.
+    TUint8 successCode( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE +
+        NET_NEIGHBOUR_CELLS_RESP_OFFSET_SUCCESSCODE ) );
+
+    if ( NET_CAUSE_OK == successCode )
+        {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetNeighbourCellsResp - NET_CAUSE_OK");
+OstTrace0( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_NETNEIGHBOURCELLSRESP, "CMmCustomMessHandler::NetNeighbourCellsResp, NET_CAUSE_OK" );
+
+        TUint sbOffset( 0 );
+
+        if ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+            ISI_HEADER_SIZE + SIZE_NET_NEIGHBOUR_CELLS_RESP,
+            NET_ECID_GERAN_INFO,
+            EIsiSubBlockTypeId8Len8,
+            sbOffset ) )
+            {
+            // GSM cell info.
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetNeighbourCellsResp - NET_ECID_GERAN_INFO found");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_NETNEIGHBOURCELLSRESP, "CMmCustomMessHandler::NetNeighbourCellsResp - NET_ECID_GERAN_INFO found" );
+            // Set mode
+            tempECIDInfo.iCellInfo.iMode = RMmCustomAPI::TMmCellInfo::EGSM;
+
+            // Set Current MCC.
+            tempECIDInfo.iMCC = aIsiMessage.Get16bit(
+                sbOffset + NET_ECID_GERAN_INFO_OFFSET_CURRENTMCC );
+
+            // Set Current MNC.
+            tempECIDInfo.iMNC = aIsiMessage.Get16bit(
+                sbOffset + NET_ECID_GERAN_INFO_OFFSET_CURRENTMNC );
+
+            // Set Current LAC.
+            tempECIDInfo.iLAC = aIsiMessage.Get16bit(
+                sbOffset + NET_ECID_GERAN_INFO_OFFSET_CURRENTLAC );
+
+            // Set Current Cell ID.
+            tempECIDInfo.iCID = aIsiMessage.Get16bit(
+                sbOffset + NET_ECID_GERAN_INFO_OFFSET_CURRENTCELLID );
+
+            // Set Current TA.
+            TUint8 temp8bitUVal( aIsiMessage.Get8bit(
+                sbOffset + NET_ECID_GERAN_INFO_OFFSET_CURRENTTA ) );
+
+            if ( NET_ECID_TA_UNDEFINED != temp8bitUVal )
+                {
+                tempECIDInfo.iCellInfo.iGsmCellInfo.iTA = temp8bitUVal;
+                }
+            // No else.
+
+            // Get Number of Neighbours included.
+            TUint8 nmrCount( aIsiMessage.Get8bit(
+                sbOffset + NET_ECID_GERAN_INFO_OFFSET_NNMR ) );
+
+            // Set NMR list.
+            for ( TUint8 i = 0; i < nmrCount; i++ )
+                {
+                // Set Carrier number.
+                tempECIDInfo.iCellInfo.iGsmCellInfo.iNmr[ i ].iARFCN =
+                    aIsiMessage.Get16bit(
+                        sbOffset + NET_ECID_GERAN_INFO_OFFSET_GSMNMRLIST +
+                        ( i * SIZE_NET_GSM_NMR_LIST_SEQ ) +
+                        NET_GSM_NMR_LIST_SEQ_OFFSET_ARFCN );
+                // Set BSIC.
+                tempECIDInfo.iCellInfo.iGsmCellInfo.iNmr[ i ].iBSIC =
+                    aIsiMessage.Get8bit(
+                        sbOffset + NET_ECID_GERAN_INFO_OFFSET_GSMNMRLIST +
+                        ( i * SIZE_NET_GSM_NMR_LIST_SEQ ) +
+                        NET_GSM_NMR_LIST_SEQ_OFFSET_BSIC );
+                // Set RX level.
+                tempECIDInfo.iCellInfo.iGsmCellInfo.iNmr[ i ].iRxLEV =
+                    aIsiMessage.Get8bit(
+                        sbOffset + NET_ECID_GERAN_INFO_OFFSET_GSMNMRLIST +
+                        ( i * SIZE_NET_GSM_NMR_LIST_SEQ ) +
+                        NET_GSM_NMR_LIST_SEQ_OFFSET_RXLEVEL );
+                }
+            }
+        else if ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+            ISI_HEADER_SIZE + SIZE_NET_NEIGHBOUR_CELLS_RESP,
+            NET_ECID_UTRAN_FDD_INFO,
+            EIsiSubBlockTypeId8Len16,
+            sbOffset ) )
+            {
+            // WCDMA cell info.
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetNeighbourCellsResp - NET_ECID_UTRAN_FDD_INFO found");
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_NETNEIGHBOURCELLSRESP, "CMmCustomMessHandler::NetNeighbourCellsResp - NET_ECID_UTRAN_FDD_INFO found" );
+            // Set mode.
+            tempECIDInfo.iCellInfo.iMode = RMmCustomAPI::TMmCellInfo::EWCDMA;
+
+            // Set UCID.
+            tempECIDInfo.iCID = aIsiMessage.Get32bit(
+                sbOffset + NET_ECID_UTRAN_FDD_INFO_OFFSET_UCID );
+
+            // Set current MCC.
+            tempECIDInfo.iMCC = aIsiMessage.Get16bit(
+                sbOffset + NET_ECID_UTRAN_FDD_INFO_OFFSET_CURRENTMCC );
+
+            // Set current MNC.
+            tempECIDInfo.iMNC = aIsiMessage.Get16bit(
+                sbOffset + NET_ECID_UTRAN_FDD_INFO_OFFSET_CURRENTMNC );
+
+            // Set current LAC (new value not received here).
+            tempECIDInfo.iLAC = iECIDInfo.iLAC;
+
+            // Set primary scrambling code.
+            tempECIDInfo.iCellInfo.iWcdmaCellInfo.iPrimaryScrambilingCode =
+                aIsiMessage.Get16bit(
+                    sbOffset + NET_ECID_UTRAN_FDD_INFO_OFFSET_PRISCRAMBLING );
+
+            // Set Frequency Info.
+            // Set frequency Info (Uplink UARFCN and UARFCN-Nt not available)
+            // Downlink UARFCN.
+            tempECIDInfo.iCellInfo.iWcdmaCellInfo.iFrequencyInfo.iFddDL =
+                aIsiMessage.Get16bit(
+                    sbOffset + NET_ECID_UTRAN_FDD_INFO_OFFSET_UARFCNDL );
+
+            // Get number of neighbours included.
+            TUint8 nmrCount( aIsiMessage.Get8bit(
+                sbOffset + NET_ECID_UTRAN_FDD_INFO_OFFSET_NNMR ) );
+
+            // Set nmrListOffset to starting position of first NMR list.
+            TUint nmrListOffset(
+                sbOffset + NET_ECID_UTRAN_FDD_INFO_OFFSET_WCDMANMRLIST );
+
+            // Handle NMR lists.
+            for ( TUint8 i( 0 ); i < nmrCount; i++ )
+                {
+                // Set Frequency Info: Downlink UARFCN.
+                tempECIDInfo.iCellInfo.iWcdmaCellInfo.
+                    iNwkMeasureReport[i].iFrequencyInfo.iFddDL =
+                        aIsiMessage.Get16bit( nmrListOffset );
+
+                // Uplink UARFCN and UARFCN-Nt not available, set to -1.
+                tempECIDInfo.iCellInfo.iWcdmaCellInfo.
+                    iNwkMeasureReport[i].iFrequencyInfo.iFddUL = -1;
+                tempECIDInfo.iCellInfo.iWcdmaCellInfo.
+                    iNwkMeasureReport[i].iFrequencyInfo.iTddNt = -1;
+
+                // Set UTRA Carrier RSSI.
+                tempECIDInfo.iCellInfo.iWcdmaCellInfo.
+                    iNwkMeasureReport[i].iCarrierRSSI =
+                        aIsiMessage.Get8bit(
+                            nmrListOffset +
+                            NET_UTRAN_NEIGH_LIST_SEQ_OFFSET_UCRSSI );
+
+                // Get number of cells included.
+                TUint8 cellCount( aIsiMessage.Get8bit(
+                    nmrListOffset + NET_UTRAN_NEIGH_LIST_SEQ_OFFSET_NCELL ) );
+
+                // Set nmrListOffset to starting position of first 'detailed
+                // cell information'.
+                nmrListOffset += 4;
+
+                // Handle detailed cell information.
+                for ( TUint8 f( 0 ); f < cellCount; f++ )
+                    {
+                    // Set UCID.
+                    TUint32 temp32bitUVal(
+                        aIsiMessage.Get32bit( nmrListOffset ) );
+
+                    if ( NET_ECID_UCID_UNDEFINED != temp32bitUVal )
+                        {
+                        tempECIDInfo.iCellInfo.iWcdmaCellInfo.
+                            iNwkMeasureReport[i].iCellMeasuredResult[f].iCID =
+                                temp32bitUVal;
+                        }
+                    // No else.
+
+                    // Set Primary CPICH.
+                    tempECIDInfo.iCellInfo.iWcdmaCellInfo.
+                        iNwkMeasureReport[i].iCellMeasuredResult[f].
+                            iFddInfo.iPrimaryCPICH = aIsiMessage.Get16bit(
+                                nmrListOffset +
+                                    NET_UTRAN_CELL_LIST_SEQ_OFFSET_PCPICH );
+
+                    // Set CPICH Ec NO.
+                    TUint8 temp8bitUVal( aIsiMessage.Get8bit(
+                        nmrListOffset +
+                            NET_UTRAN_CELL_LIST_SEQ_OFFSET_CPICHECNO ) );
+
+                    if ( NET_ECID_CPICH_ECNO_UNDEFINED != temp8bitUVal )
+                        {
+                        tempECIDInfo.iCellInfo.iWcdmaCellInfo.
+                            iNwkMeasureReport[i].iCellMeasuredResult[f].
+                                iFddInfo.iCpichEcN0 = temp8bitUVal;
+                        }
+                    // No else.
+
+                    // Set CPICH RSCP.
+                    tempECIDInfo.iCellInfo.iWcdmaCellInfo.
+                        iNwkMeasureReport[i].iCellMeasuredResult[f].
+                            iFddInfo.iCpichRscp = aIsiMessage.Get8bit(
+                                nmrListOffset +
+                                    NET_UTRAN_CELL_LIST_SEQ_OFFSET_CPICHRSCP );
+
+                    // Set Pathloss.
+                    temp8bitUVal = aIsiMessage.Get8bit(
+                            nmrListOffset +
+                                NET_UTRAN_CELL_LIST_SEQ_OFFSET_PATHLOSS );
+
+                    if ( NET_ECID_PATHLOSS_UNDEFINED != temp8bitUVal )
+                        {
+                        tempECIDInfo.iCellInfo.iWcdmaCellInfo.
+                            iNwkMeasureReport[i].iCellMeasuredResult[f].
+                                iFddInfo.iPathloss = temp8bitUVal;
+                        }
+                    // No else.
+
+                    // Increase nmrListOffset to starting point of the next
+                    // element of 'detailed cell information'.
+                    nmrListOffset += SIZE_NET_UTRAN_CELL_LIST_SEQ;
+                    }
+                }
+            }
+        else
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::NetNeighbourCellsResp - No ECID data found");
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_NETNEIGHBOURCELLSRESP, "CMmCustomMessHandler::NetNeighbourCellsResp - No ECID data found" );
+            ret = KErrNotFound;
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::NetNeighbourCellsResp - NET Server Error, Success Code: %d", successCode);
+OstTraceExt1( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_NETNEIGHBOURCELLSRESP, "CMmCustomMessHandler::NetNeighbourCellsResp;NET Server Error, Success Code=%hhu", successCode );
+
+        // Map cause to symbian error value.
+        ret = CMmStaticUtility::CSCauseToEpocError(
+            PN_MODEM_NETWORK,
+            KTsyNetCauseCommon,
+            successCode );
+        }
+
+    // Complete get request.
+    if ( iECIDInfoRequested )
+        {
+        iECIDInfoRequested = EFalse;
+
+        // Complete with packed parameter.
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &tempECIDInfo.iCellInfo );
+
+        iMessageRouter->Complete(
+            ECustomGetCellInfoIPC,
+            &dataPackage,
+            ret );
+        }
+    // No else.
+
+    // If info received, save and complete change notification.
+    if ( KErrNone == ret )
+        {
+        if ( iECIDInfo.iCellInfo.iMode != tempECIDInfo.iCellInfo.iMode ||
+            iECIDInfo.iMCC != tempECIDInfo.iMCC ||
+            iECIDInfo.iMNC != tempECIDInfo.iMNC ||
+            iECIDInfo.iCID != tempECIDInfo.iCID ||
+            iECIDInfo.iLAC != tempECIDInfo.iLAC )
+            {
+            // Complete with packed parameter.
+            CMmDataPackage dataPackage;
+            dataPackage.PackData( &tempECIDInfo.iCellInfo );
+
+            iMessageRouter->Complete(
+                ECustomNotifyCellInfoChangeIPC,
+                &dataPackage,
+                KErrNone );
+            }
+        // No else.
+
+        // Save ECID information.
+        iECIDInfo = tempECIDInfo;
+        }
+    // No else.
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CheckECIDInfo
+// This method breaks received NET_MODEM_REG_STATUS_IND or
+// NET_MODEM_REG_STATUS_GET_RESP message and checks if enhanced cell
+// information is chaged ( => needs to be requested/updated ).
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::CheckECIDInfo(
+    const TIsiReceiveC& aIsiMessage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::CheckECIDInfo");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_CHECKECIDINFO, "CMmCustomMessHandler::CheckECIDInfo" );
+
+    TUint8 msgId( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) );
+
+    if ( NET_MODEM_REG_STATUS_IND == msgId ||
+        NET_MODEM_REG_STATUS_GET_RESP == msgId )
+        {
+        // Check if cell information needs to be updated.
+        TBool isNetRetStatusInd( NET_MODEM_REG_STATUS_IND == msgId );
+
+TFLOGSTRING("TSY:CMmCustomMessHandler::CheckECIDInfo - Find NET_MODEM_CURRENT_CELL_INFO SubBlock");
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_CHECKECIDINFO, "CMmCustomMessHandler::CheckECIDInfo - Find NET_MODEM_CURRENT_CELL_INFO SubBlock" );
+        // Get NET_MODEM_CURRENT_CELL_INFO sub block
+        // (should be always used when exists (coming when in 3G/RRC
+        // connected mode), otherwise NET_MODEM_GSM_REG_INFO is used).
+
+        TUint sbStartOffSet( 0 );
+        TInt retValue( KErrNone );
+
+        if ( isNetRetStatusInd )
+            {
+            retValue = aIsiMessage.FindSubBlockOffsetById(
+                ISI_HEADER_SIZE + SIZE_NET_MODEM_REG_STATUS_IND,
+                NET_MODEM_CURRENT_CELL_INFO,
+                EIsiSubBlockTypeId8Len8,
+                sbStartOffSet );
+            }
+        else
+            {
+            retValue = aIsiMessage.FindSubBlockOffsetById(
+                ISI_HEADER_SIZE + SIZE_NET_MODEM_REG_STATUS_GET_RESP,
+                NET_MODEM_CURRENT_CELL_INFO,
+                EIsiSubBlockTypeId8Len8,
+                sbStartOffSet );
+            }
+
+        // Get NET_MODEM_GSM_REG_INFO sub block.
+        if ( KErrNone != retValue )
+            {
+TFLOGSTRING("TSY:CMmCustomMessHandler::CheckECIDInfo - Find NET_MODEM_GSM_REG_INFO SubBlock");
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_CHECKECIDINFO, "CMmCustomMessHandler::CheckECIDInfo - Find NET_MODEM_GSM_REG_INFO SubBlock" );
+
+            sbStartOffSet = 0;
+
+            if ( isNetRetStatusInd )
+                {
+                retValue = aIsiMessage.FindSubBlockOffsetById(
+                    ISI_HEADER_SIZE + SIZE_NET_MODEM_REG_STATUS_IND,
+                    NET_MODEM_GSM_REG_INFO,
+                    EIsiSubBlockTypeId8Len8,
+                    sbStartOffSet );
+                }
+            else
+                {
+                retValue = aIsiMessage.FindSubBlockOffsetById(
+                    ISI_HEADER_SIZE + SIZE_NET_MODEM_REG_STATUS_GET_RESP,
+                    NET_MODEM_GSM_REG_INFO,
+                    EIsiSubBlockTypeId8Len8,
+                    sbStartOffSet );
+                }
+            }
+        // No else.
+
+        // If subblock found.
+        if ( KErrNone == retValue )
+            {
+TFLOGSTRING("TSY:CMmCustomMessHandler::CheckECIDInfo - SubBlock Found");
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_CHECKECIDINFO, "CMmCustomMessHandler::CheckECIDInfo, SubBlock Found" );
+            TUint tempMCC( 0 ); // Mobile Country Code.
+            TUint tempMNC( 0 ); // Mobile Network Code.
+            TUint tempCID( 0 ); // Cell identity.
+            TUint tempLAC( 0 ); // Location area code.
+
+            // Get the Location Area Code.
+            tempLAC = aIsiMessage.Get16bit(
+                sbStartOffSet +
+                NET_MODEM_CURRENT_CELL_INFO_OFFSET_CURRENTLAC );
+            // Get the Cell Id.
+            tempCID = aIsiMessage.Get32bit(
+                sbStartOffSet +
+                NET_MODEM_CURRENT_CELL_INFO_OFFSET_CURRENTCELLID );
+
+            // Get the operator code. Size is 3 bytes.
+            TPtrC8 operatorCode( aIsiMessage.GetData(
+                sbStartOffSet +
+                NET_MODEM_CURRENT_CELL_INFO_OFFSET_OPERATORCODE,
+                3 ) );
+
+            // Map the operator code to symbian values (MCC and MNC).
+            RMobilePhone::TMobilePhoneNetworkIdentity networkId;
+            RMobilePhone::TMobilePhoneNetworkCountryCode countryCode;
+            iNetMessHandler->MapOperatorAndCountryCode(
+                                 operatorCode,
+                                 networkId,
+                                 countryCode );
+            // Convert descriptor contained number to integer.
+            CMmStaticUtility::GetIntFromDescriptor(
+                tempMCC,
+                countryCode );
+            CMmStaticUtility::GetIntFromDescriptor(
+                tempMNC,
+                networkId );
+
+            // If changed, request new ECID information.
+            if ( iECIDInfo.iMCC != tempMCC ||
+                iECIDInfo.iMNC != tempMNC ||
+                iECIDInfo.iCID != tempCID ||
+                iECIDInfo.iLAC != tempLAC )
+                {
+                TUint8 transId( KCustomTransId );
+                NetNeighbourCellsReq( transId );
+                // Save current LAC.
+                // (not received in NetNeighbourCellsResp when in 3G).
+                iECIDInfo.iLAC = tempLAC;
+                }
+            // No else.
+            }
+        // No else.
+        }
+    // No else.
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::HandleError
+// Handles CMmCustomMessHandler's errors that comes
+// via PhoNetReceiver RunError method.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::HandleError
+    (
+      const TIsiReceiveC& aIsiMessage, TInt aError
+      )
+    {
+    TFLOGSTRING2( "TSY: CMmCustomMessHandler::HandleError - Error: %d", aError );
+OstTrace1( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_HANDLEERROR, "CMmCustomMessHandler::HandleError;aError=%d", aError );
+
+    TInt resource( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_RESOURCEID ) );
+    TInt messageId( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) );
+    TUint8 transId( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_TRANSID ) );
+    TUint8 serviceType( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_SUBMESSAGEID ) );
+
+    switch( resource )
+        {
+        default:
+            {
+            TFLOGSTRING("TSY: CMmCustomMessHandler::HandleError, switch resource - default.\n" );
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_HANDLEERROR, "CMmCustomMessHandler::HandleError, switch resource - default" );
+            // Nothing to do here.
+            break;
+            }
+        } // end switch ( resource )
+    }
+
+// not suppoted for S60 ver 3.2
+#if ( NCP_COMMON_S60_VERSION_SUPPORT != S60_VERSION_32 )
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::GssCsServiceSetBandReq
+// Creates and sends via phonet a GSS_CS_SERVICE_REQ including
+// selected band mode (ENetworkBandAny, ENetworkBandUmts850, ENetworkBandUmts2100).
+// Affects only in Umts or Dual mode.
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::GssCsServiceSetBandReq( TUint8 aTransId, // transaction Id
+        RMmCustomAPI::TNetworkModeCaps aNetworkModeCaps, // network mode caps
+        RMmCustomAPI::TBandSelection aBandSelection ) // band selection
+    {
+    TFLOGSTRING2( "TSY: CMmCustomMessHandler::GssCsServiceSetBandReq - aTransId: %d", aTransId );
+OstTraceExt1( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_GSSCSSERVICESETBANDREQ, "CMmCustomMessHandler::GssCsServiceSetBandReq;aTransId=%hhu", aTransId );
+
+    if ( RMmCustomAPI::KCapsNetworkModeUmts == aNetworkModeCaps ||
+         RMmCustomAPI::KCapsNetworkModeDual == aNetworkModeCaps )
+        {
+        TFLOGSTRING3( "TSY: CMmCustomMessHandler::GssCsServiceSetBandReq - NWModeCaps: %d - Band: %d",
+            aNetworkModeCaps, aBandSelection );
+OstTraceExt2( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_GSSCSSERVICESETBANDREQ, "CMmCustomMessHandler::GssCsServiceSetBandReq; - NWModeCaps=%d - Band=%d", aNetworkModeCaps, aBandSelection );
+
+        // create message data buffer
+        TBuf8< 20 > messageData;
+        messageData.Append( GSS_SELECTED_BANDS_WRITE ); // append service type
+        messageData.Append( 1 ); // number of subblocks
+
+        // subblock
+        messageData.Append( GSS_SELECTED_UMTS_BAND_INFO ); // append band info
+        messageData.Append( 0x08 ); // subblock length
+        messageData.Append( KCustomPadding );
+        messageData.Append( KCustomPadding );
+
+        if ( RMmCustomAPI::ENetworkBandUmts850 == aBandSelection )
+            {
+            messageData.Append( TUint8( GSS_UMTS_BAND_V_MASK >> 24 ) );
+            messageData.Append( TUint8( GSS_UMTS_BAND_V_MASK >> 16 ) );
+            messageData.Append( TUint8( GSS_UMTS_BAND_V_MASK >> 8 ) );
+            messageData.Append( TUint8( GSS_UMTS_BAND_V_MASK ) );
+            }
+        else if ( RMmCustomAPI::ENetworkBandUmts2100 == aBandSelection )
+            {
+            messageData.Append( TUint8( GSS_UMTS_BAND_I_MASK >> 24 ) );
+            messageData.Append( TUint8( GSS_UMTS_BAND_I_MASK >> 16 ) );
+            messageData.Append( TUint8( GSS_UMTS_BAND_I_MASK >> 8 ) );
+            messageData.Append( TUint8( GSS_UMTS_BAND_I_MASK ) );
+            }
+        else // ENetworkBandAny
+            {
+            messageData.Append( TUint8( GSS_UMTS_ALL_BANDS >> 24 ) );
+            messageData.Append( TUint8( GSS_UMTS_ALL_BANDS >> 16 ) );
+            messageData.Append( TUint8( GSS_UMTS_ALL_BANDS >> 8 ) );
+            messageData.Append( TUint8( GSS_UMTS_ALL_BANDS ) );
+            }
+
+        return iPhoNetSender->Send( PN_GSS, aTransId, GSS_CS_SERVICE_REQ, messageData );
+        }
+
+    return KErrNotSupported;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::GssCsServiceGetBandReq
+// Creates request to get current band.
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::GssCsServiceGetBandReq( TUint8 aTransId ) //transaction Id
+    {
+    TFLOGSTRING2( "TSY: CMmCustomMessHandler::GssCsServiceGetBandReq - aTransId: %d", aTransId );
+OstTraceExt1( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_GSSCSSERVICEGETBANDREQ, "CMmCustomMessHandler::GssCsServiceGetBandReq;aTransId=%hhu", aTransId );
+
+    // create message data buffer
+    TBuf8< 4 > messageData;
+    messageData.Append( GSS_SELECTED_BANDS_READ ); // append service type
+    messageData.Append( 0 ); // No subblocks
+
+    return iPhoNetSender->Send( PN_GSS, aTransId, GSS_CS_SERVICE_REQ, messageData );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::CompleteGetBandSelection
+// Completes and breaks Get band selection request via PhoNetReceiver method.
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::CompleteGetBandSelection( const TIsiReceiveC& aIsiMessage )
+    {
+    TFLOGSTRING("TSY: CMmCustomMessHandler::CompleteGetBandSelection");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_COMPLETEGETBANDSELECTION, "CMmCustomMessHandler::CompleteGetBandSelection" );
+
+    RMmCustomAPI::TNetworkModeCaps nwModeCaps; // network mode caps
+    RMmCustomAPI::TBandSelection bandSelection; // band selection
+    bandSelection = RMmCustomAPI::ENetworkBandAny; // set "any" as a default
+
+    TUint8 nrOfSubblocks ( aIsiMessage.Get8bit( ISI_HEADER_SIZE +
+        GSS_CS_SERVICE_RESP_OFFSET_NBROFSUBBLOCKS ) );
+
+    // first subblocks start from 'GSS_CS_SERVICE_RESP_OFFSET_NBROFSUBBLOCKS' + 1
+    TUint8 sbOffset ( ISI_HEADER_SIZE +
+        GSS_CS_SERVICE_RESP_OFFSET_NBROFSUBBLOCKS + 1 );
+
+    TUint8 firstSubblock ( aIsiMessage.Get8bit( sbOffset ) );
+
+    TFLOGSTRING2("TSY: CMmCustomMessHandler::CompleteGetBandSelection - ECustomGetBandSelectionIPC. NrOfSubblocks:%d", nrOfSubblocks);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_COMPLETEGETBANDSELECTION, "CMmCustomMessHandler::CompleteGetBandSelection;nrOfSubblocks=%hhu", nrOfSubblocks );
+
+    // In 2G only products only sub block GSS_SELECTED_GSM_BANDS_INFO is returned.
+    if ( 1 == nrOfSubblocks && firstSubblock == GSS_SELECTED_GSM_BAND_INFO )
+        {
+        nwModeCaps = RMmCustomAPI::KCapsNetworkModeGsm;
+        }
+    else // 1 < nrOfSubblocks || GSS_SELECTED_UMTS_BAND_INFO
+        {
+        //Band info offsets for reading
+        TUint8 gsmBandInfoOffset = 0;
+        TUint8 umtsBandInfoOffset = 0;
+
+        // first SB is GSS_SELECTED_GSM_BAND_INFO
+        if ( GSS_SELECTED_GSM_BAND_INFO == firstSubblock )
+            {
+            TFLOGSTRING("TSY: CMmCustomMessHandler::CompleteGetBandSelection - 1st SB = GSM BAND INFO");
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_COMPLETEGETBANDSELECTION, "CMmCustomMessHandler::CompleteGetBandSelection - 1st SB = GSM BAND INFO" );
+
+            // calculate offsets
+            gsmBandInfoOffset = sbOffset +
+                GSS_SELECTED_GSM_BAND_INFO_OFFSET_SELECTEDGSMBANDS;
+
+            // if there are more than one subblock read offset for second one
+            if ( 1 < nrOfSubblocks )
+                {
+                umtsBandInfoOffset = sbOffset +
+                    SIZE_GSS_SELECTED_GSM_BAND_INFO +
+                    GSS_SELECTED_UMTS_BAND_INFO_OFFSET_SELECTEDUMTSBANDS;
+                }
+            }
+        else if ( GSS_SELECTED_UMTS_BAND_INFO == firstSubblock )
+            {
+            TFLOGSTRING("TSY: CMmCustomMessHandler::CompleteGetBandSelection - 1st SB = UMTS BAND INFO");
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_COMPLETEGETBANDSELECTION, "CMmCustomMessHandler::CompleteGetBandSelection - 1st SB = UMTS BAND INFO" );
+
+            // calculate offsets
+            umtsBandInfoOffset = sbOffset +
+                GSS_SELECTED_UMTS_BAND_INFO_OFFSET_SELECTEDUMTSBANDS;
+
+            // if there are more than one subblock read offset for second one
+            if ( 1 < nrOfSubblocks )
+                {
+                gsmBandInfoOffset = sbOffset +
+                    SIZE_GSS_SELECTED_UMTS_BAND_INFO +
+                    GSS_SELECTED_GSM_BAND_INFO_OFFSET_SELECTEDGSMBANDS;
+                }
+            }
+
+        //If phone is forced to GSM, value in GSS_SELECTED_UMTS_BAND_INFO shall be GSS_UMTS_NO_BANDS
+        if ( GSS_UMTS_NO_BANDS == aIsiMessage.Get32bit( umtsBandInfoOffset ) ) // forced GSM
+            {
+            TFLOGSTRING("TSY: CMmCustomMessHandler::CompleteGetBandSelection - umtsBandInfo==GSS_UMTS_NO_BANDS => Forced GSM");
+OstTrace0( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_COMPLETEGETBANDSELECTION, "CMmCustomMessHandler::CompleteGetBandSelection - umtsBandInfo==GSS_UMTS_NO_BANDS => Forced GSM" );
+            nwModeCaps = RMmCustomAPI::KCapsNetworkModeGsm;
+            }
+        else
+            {
+            //If phone is forced to GSM, value in GSS_SELECTED_UMTS_BAND_INFO shall be GSS_UMTS_NO_BANDS.
+            if ( 0 < gsmBandInfoOffset && GSS_GSM_NO_BANDS == aIsiMessage.Get8bit( gsmBandInfoOffset ) ) // forced UMTS
+                {
+                TFLOGSTRING("TSY: CMmCustomMessHandler::CompleteGetBandSelection - gsmBandInfo==GSS_GSM_NO_BANDS => Forced UMTS");
+OstTrace0( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_COMPLETEGETBANDSELECTION, "CMmCustomMessHandler::CompleteGetBandSelection - gsmBandInfo==GSS_GSM_NO_BANDS => Forced UMTS" );
+                nwModeCaps = RMmCustomAPI::KCapsNetworkModeUmts;
+                }
+            else // dual mode
+                {
+                TFLOGSTRING("TSY: CMmCustomMessHandler::CompleteGetBandSelection - Dual mode");
+OstTrace0( TRACE_NORMAL, DUP6_CMMCUSTOMMESSHANDLER_COMPLETEGETBANDSELECTION, "CMmCustomMessHandler::CompleteGetBandSelection - Dual mode" );
+                nwModeCaps = RMmCustomAPI::KCapsNetworkModeDual;
+                }
+
+            // Set network band
+            if ( GSS_UMTS_BAND_V_MASK == aIsiMessage.Get32bit( umtsBandInfoOffset ) )
+                {
+                TFLOGSTRING("TSY: CMmCustomMessHandler::CompleteGetBandSelection - UMTS850");
+OstTrace0( TRACE_NORMAL, DUP7_CMMCUSTOMMESSHANDLER_COMPLETEGETBANDSELECTION, "CMmCustomMessHandler::CompleteGetBandSelection - UMTS850" );
+                bandSelection = RMmCustomAPI::ENetworkBandUmts850;
+                }
+            else if( GSS_UMTS_BAND_I_MASK == aIsiMessage.Get32bit( umtsBandInfoOffset ) )
+                {
+                TFLOGSTRING("TSY: CMmCustomMessHandler::CompleteGetBandSelection - UMTS2100");
+OstTrace0( TRACE_NORMAL, DUP8_CMMCUSTOMMESSHANDLER_COMPLETEGETBANDSELECTION, "CMmCustomMessHandler::CompleteGetBandSelection - UMTS2100" );
+                bandSelection = RMmCustomAPI::ENetworkBandUmts2100;
+                }
+            }
+        }
+
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &bandSelection, &nwModeCaps );
+    return iMessageRouter->Complete( ECustomGetBandSelectionIPC, &dataPackage, KErrNone );
+    }
+
+#endif // NCP_COMMON_S60_VERSION_SUPPORT
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ReadLifeTimerFromPermanentMemory
+// Constructs PERM_PM_RECORD_READ_REQ ISI message from input parameters and send
+// it through phonet.
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::ReadLifeTimerFromPermanentMemory
+        (
+        const TUint8 //aTransId
+        )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ReadLifeTimerFromPermanentMemory.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_READLIFETIMERFROMPERMANENTMEMORY, "CMmCustomMessHandler::ReadLifeTimerFromPermanentMemory" );
+
+    // Group ID 2 + Index 2 + Filler 2 + Offset 4 + Data amount to be read 4 = 14
+    TBuf8<14> data;
+
+    // Append Group ID
+    data.Append( static_cast<TUint8>( KPmmGroupNokiaTsy >> 8 ) );
+    data.Append( static_cast<TUint8>( KPmmGroupNokiaTsy ) );
+
+    // Append Call Life Timer Index
+    data.Append( static_cast<TUint8>( KCallLifeTimerPmmIndexValue >> 8 ) );
+    data.Append( static_cast<TUint8>( KCallLifeTimerPmmIndexValue ) );
+
+    // Append Filler
+    data.AppendFill( KCustomPadding, KTwo );
+
+    // Append Offset
+    data.AppendFill( KCustomPadding, KFour );
+
+    // Append Data amount to be read
+    data.Append( static_cast<TUint8>( KCallLifeTimerDataAmount >> 24 ) );
+    data.Append( static_cast<TUint8>( KCallLifeTimerDataAmount >> 16 ) );
+    data.Append( static_cast<TUint8>( KCallLifeTimerDataAmount >> 8 ) );
+    data.Append( static_cast<TUint8>( KCallLifeTimerDataAmount ) );
+
+    /* To be done in CPS
+    return iPhoNetSender->Send( PN_PERMANENT_DATA,
+        aTransId,
+        PERM_PM_RECORD_READ_REQ,
+        data );*/
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse
+// Breaks  PERM_PM_RECORD_READ_RESP message.
+// -----------------------------------------------------------------------------
+//
+/* To be done in CPS
+void CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse
+        (
+        const TIsiReceiveC& aIsiMessage    // an ISI message
+        )
+    {
+TFLOGSTRING("TSY: CCMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_LIFETIMERFROMPERMANENTMEMORYREADRESPONSE, "CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse" );
+
+    TInt ret( KErrNone );
+
+    TUint8 pmmStatus = aIsiMessage.Get8bit(
+               ISI_HEADER_SIZE +
+               PERM_PM_RECORD_READ_RESP_OFFSET_PMMSTATUS );
+
+    if ( PMM_OK == pmmStatus )
+        {
+        iPMMReadRetryCounter = 0; // NUL trial counter
+        TUint sbStartOffSet( 0 );
+        ret = aIsiMessage.FindSubBlockOffsetById(
+            ISI_HEADER_SIZE + SIZE_PERM_PM_RECORD_READ_RESP,
+            PERM_SB_PM_DATA,
+            EIsiSubBlockTypeId8Len8, sbStartOffSet );
+
+        if ( KErrNone == ret )
+            {
+            TUint32 dataSize( aIsiMessage.Get32bit( sbStartOffSet +
+                        PERM_SB_PM_DATA_OFFSET_SIZE ) );
+            // Timer value size in message is 4 bytes. If some else length
+            // has been returned error code KErrGeneral is set and
+            // assert is done.
+            if ( KCallLifeTimerDataAmount == dataSize )
+                {
+                iCallLifeTimer = aIsiMessage.Get32bit( sbStartOffSet +
+                                     PERM_SB_PM_DATA_OFFSET_DATA );
+TFLOGSTRING2( "TSY: CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse - iCallLifeTimer: %d", iCallLifeTimer );
+OstTrace1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_LIFETIMERFROMPERMANENTMEMORYREADRESPONSE, "CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse;iCallLifeTimer=%d", iCallLifeTimer );
+                }
+            else
+                {
+TFLOGSTRING2( "TSY: CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse - Incorrect data size: %d", dataSize );
+OstTrace1( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_LIFETIMERFROMPERMANENTMEMORYREADRESPONSE, "CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse - Incorrect data size=%u", dataSize );
+                TF_ASSERT( KCallLifeTimerDataAmount != dataSize );
+                ret = KErrGeneral;
+                }
+            }
+        }
+    else
+        {
+        if ( PMM_NOT_READY == pmmStatus )
+            {
+            // Send request again max 3 times
+TFLOGSTRING("TSY: CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse - PMM not ready. Send request again\n" );
+OstTrace0( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_LIFETIMERFROMPERMANENTMEMORYREADRESPONSE, "CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse - PMM not ready. Send request again" );
+            iPMMReadRetryCounter++;
+            if ( KMaxPMMReadRequests > iPMMReadRetryCounter )
+                {
+                ReadLifeTimerFromPermanentMemory ( KCustomTransId );
+                }
+            }
+        else if ( PMM_RECORD_NOT_FOUND == pmmStatus )
+            {
+            // The first boot of the phone.
+TFLOGSTRING("TSY: CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse - The first boot. Set iCallLifeTimer 0\n" );
+            OstTrace0( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_LIFETIMERFROMPERMANENTMEMORYREADRESPONSE, "CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse - The first boot. Set iCallLifeTimer 0" );
+            iCallLifeTimer = 0;
+            }
+        else
+            {
+TFLOGSTRING2( "TSY: CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse - PMM Status NOT OK: %d", pmmStatus );
+OstTraceExt1( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_LIFETIMERFROMPERMANENTMEMORYREADRESPONSE, "CMmCustomMessHandler::LifeTimerFromPermanentMemoryReadResponse - PMM Status NOT OK=%hhu", pmmStatus );
+            }
+        }
+    }*/
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::WriteLifeTimerToPermanentMemory
+// Constructs PERM_PM_RECORD_WRITE_REQ ISI message from input parameters and send
+// it through phonet.
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::WriteLifeTimerToPermanentMemory
+        (
+        const TUint8 /*aTransId*/,
+        TTimeIntervalSeconds aTime
+        )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::WriteLifeTimerToPermanentMemory.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_WRITELIFETIMERTOPERMANENTMEMORY, "CMmCustomMessHandler::WriteLifeTimerToPermanentMemory" );
+
+    // Group ID 2 + Index 2 + Filler 2 + Offset 4 + Data amount to be read 4 = 14
+    TBuf8<14> data;
+
+    // Append Group ID
+    data.Append( static_cast<TUint8>( KPmmGroupNokiaTsy >> 8 ) );
+    data.Append( static_cast<TUint8>( KPmmGroupNokiaTsy ) );
+
+    // Append Call Life Timer Index
+    data.Append( static_cast<TUint8>( KCallLifeTimerPmmIndexValue >> 8 ) );
+    data.Append( static_cast<TUint8>( KCallLifeTimerPmmIndexValue ) );
+
+    // Append Filler
+    data.AppendFill( KCustomPadding, KTwo );
+
+    // Append Data amount to be written
+    data.Append( static_cast<TUint8>( KCallLifeTimerDataAmount >> 24 ) );
+    data.Append( static_cast<TUint8>( KCallLifeTimerDataAmount >> 16 ) );
+    data.Append( static_cast<TUint8>( KCallLifeTimerDataAmount >> 8 ) );
+    data.Append( static_cast<TUint8>( KCallLifeTimerDataAmount ) );
+
+    if ( KCallLifeTimerNotSet == iCallLifeTimer )
+        {
+TFLOGSTRING( "TSY: CMmCustomMessHandler::WriteLifeTimerToPermanentMemory - Call Life Timer is not set from PMM ret KErrNotReady\n" );
+TFLOGSTRING("TSY: CMmCustomMessHandler::WriteLifeTimerToPermanentMemory - PERM_PM_RECORD_WRITE_REQ is NOT send\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_WRITELIFETIMERTOPERMANENTMEMORY, "CMmCustomMessHandler::WriteLifeTimerToPermanentMemory - Call Life Timer is not set from PMM ret KErrNotReady" );
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_WRITELIFETIMERTOPERMANENTMEMORY, "CMmCustomMessHandler::WriteLifeTimerToPermanentMemory - PERM_PM_RECORD_WRITE_REQ is NOT send" );
+
+        // Return request with KErrNotReady
+        return ( KErrNotReady );
+        }
+    else
+        {
+        // Update Life Timer Value
+        iCallLifeTimer += aTime.Int();
+
+        // Append Data
+        data.Append( static_cast<TUint8>( iCallLifeTimer >> 24 ) );
+        data.Append( static_cast<TUint8>( iCallLifeTimer >> 16 ) );
+        data.Append( static_cast<TUint8>( iCallLifeTimer >> 8 ) );
+        data.Append( static_cast<TUint8>( iCallLifeTimer ) );
+
+        /* To be done in CPS
+        return iPhoNetSender->Send( PN_PERMANENT_DATA,
+            aTransId,
+            PERM_PM_RECORD_WRITE_REQ,
+            data );*/
+        return KErrNone;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::LifeTimerToPermanentMemoryWriteResponse
+// Breaks  PERM_PM_RECORD_WRITE_RESP message.
+// -----------------------------------------------------------------------------
+//
+/* To be done in CPS
+void CMmCustomMessHandler::LifeTimerToPermanentMemoryWriteResponse
+        (
+        const TIsiReceiveC& aIsiMessage    // an ISI message
+        )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::LifeTimerToPermanentMemoryWriteResponse.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_LIFETIMERTOPERMANENTMEMORYWRITERESPONSE, "CMmCustomMessHandler::LifeTimerToPermanentMemoryWriteResponse" );
+
+    TInt ret( KErrNone );
+
+    TUint8 pmmStatus = aIsiMessage.Get8bit(
+               ISI_HEADER_SIZE +
+               PERM_PM_RECORD_WRITE_RESP_OFFSET_PMMSTATUS );
+TFLOGSTRING2( "TSY: CMmCustomMessHandler::LifeTimerToPermanentMemoryWriteResponse - pmmStatus: %d", pmmStatus );
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_LIFETIMERTOPERMANENTMEMORYWRITERESPONSE, "CMmCustomMessHandler::LifeTimerToPermanentMemoryWriteResponse;pmmStatus=%hhu", pmmStatus );
+
+    if ( PMM_OK != pmmStatus )
+        {
+        ret = KErrNotReady;
+        TF_ASSERT( PMM_OK != pmmStatus );
+TFLOGSTRING2( "TSY: CMmCustomMessHandler::LifeTimerToPermanentMemoryWriteResponse - Call Life Timer is not updated / error from PMM ret: %d", ret );
+OstTrace1( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_LIFETIMERTOPERMANENTMEMORYWRITERESPONSE, "CMmCustomMessHandler::LifeTimerToPermanentMemoryWriteResponse - Call Life Timer is not updated / error from PMM ret=%d", ret );
+        }
+
+    return iMessageRouter->Complete( EMmTsyUpdateLifeTimeIPC, ret );
+    }*/
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::GetTotalLifeTimerValue
+// Breaks  PERM_PM_RECORD_WRITE_RESP message.
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::GetTotalLifeTimerValue
+        (
+        )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::GetTotalLifeTimerValue.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_GETTOTALLIFETIMERVALUE, "CMmCustomMessHandler::GetTotalLifeTimerValue" );
+
+    TInt ret( KErrNone );
+    RMmCustomAPI::TLifeTimeData timeInfo;
+
+    timeInfo.iHours = 0;
+    timeInfo.iMinutes = 0;
+
+    if ( KCallLifeTimerNotSet == iCallLifeTimer )
+        {
+        ret = KErrNotReady;
+TFLOGSTRING( "TSY: CMmCustomMessHandler::GetTotalLifeTimerValue - PMM has not been able to be read ret: KErrNotReady\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_GETTOTALLIFETIMERVALUE, "CMmCustomMessHandler::GetTotalLifeTimerValue - PMM has not been able to be read ret: KErrNotReady" );
+        }
+    else
+        {
+        //set the data into timeInfo class, one hour is 3600 seconds.
+        timeInfo.iHours = iCallLifeTimer / KSecsInHour ;
+        timeInfo.iMinutes =
+            static_cast<TUint8>( ( iCallLifeTimer % KSecsInHour ) /
+                                   KMinsInHour );
+        //update the caps
+        timeInfo.iCaps |=
+            RMmCustomAPI::TLifeTimeData::ELifeTimeDataCapsLifeTime;
+TFLOGSTRING2( "TSY: TSY: CMmCustomMessHandler::GetTotalLifeTimerValue - iCallLifeTimer: %d", iCallLifeTimer );
+TFLOGSTRING2( "TSY: TSY: CMmCustomMessHandler::GetTotalLifeTimerValue - timeInfo.iHours: %d", timeInfo.iHours );
+TFLOGSTRING2( "TSY: TSY: CMmCustomMessHandler::GetTotalLifeTimerValue - timeInfo.iMinutes: %d", timeInfo.iMinutes );
+OstTrace1( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_GETTOTALLIFETIMERVALUE, "CMmCustomMessHandler::GetTotalLifeTimerValue;iCallLifeTimer=%d", iCallLifeTimer );
+OstTrace1( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_GETTOTALLIFETIMERVALUE, "CMmCustomMessHandler::GetTotalLifeTimerValue;timeInfo.iHours=%u", timeInfo.iHours );
+OstTraceExt1( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_GETTOTALLIFETIMERVALUE, "CMmCustomMessHandler::GetTotalLifeTimerValue;timeInfo.iMinutes=%hhu", timeInfo.iMinutes );
+        }
+
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &timeInfo );
+    iMessageRouter->Complete( ECustomGetLifeTimeIPC, &dataPackage, ret );
+
+    return( ret );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSimPowerOffReq
+// Disconnects UICC server from smartcard and activates UICC SAP APDU interface
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccSimPowerOffReq()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSimPowerOffReq.\n");
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMPOWEROFFREQ, "CMmCustomMessHandler::UiccSimPowerOffReq" );
+
+    iSapApduIfState = EUiccSapIfStatus1;
+    // Set parameters for UICC_CONNECTION_REQ message
+    TUiccParamsBase params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdSimPowerOff;
+    params.serviceType = UICC_DISCONNECT;
+
+    return iMmUiccMessHandler->CreateUiccConnectorReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSimPowerOffResp
+//
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccSimPowerOffResp( TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSimPowerOffResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMPOWEROFFRESP, "CMmCustomMessHandler::UiccSimPowerOffResp" );
+
+    TInt err ( KErrNone );
+
+    if( aStatus == UICC_STATUS_OK )
+        {
+        switch( iSapApduIfState )
+            {
+            case EUiccSapIfStatus1:
+                {
+                // Set parameters for UICC_APDU_REQ message
+                TUiccParamsApduReq params;
+                params.messHandlerPtr = static_cast<MUiccOperationBase*>(
+                    this );
+                params.trId = ETrIdSimPowerOff;
+                params.serviceType = UICC_APDU_CONTROL;
+                params.action = UICC_CONTROL_CARD_ACTIVATE;
+
+                err = iMmUiccMessHandler->CreateUiccApduReq( params );
+
+                iSapApduIfState = EUiccSapIfStatus2;
+                break;
+                }
+
+            case EUiccSapIfStatus2:
+                {
+                // No handling for UICC_APDU_RESP,
+                // wait for UICC_APDU_RESET_IND
+                iSapApduIfState = EUiccSapIfStatus3;
+                break;
+                }
+
+            case EUiccSapIfStatus3:
+                {
+                // UICC_APDU_RESET_IND, UICC_READY, SAP IF active
+                iMessageRouter->Complete( ECustomPowerSimOffIPC, err );
+                break;
+                }
+            }
+        }
+    else
+        {
+        if( aStatus == UICC_STATUS_SHUTTING_DOWN )
+            {
+            err = CMmStaticUtility::EpocErrorCode( KErrNotReady, KErrNotFound );
+            }
+        else
+            {
+            // UICC_STATUS_FAIL
+            err = CMmStaticUtility::EpocErrorCode( KErrGeneral, KErrNotFound );
+            }
+        iMessageRouter->Complete( ECustomPowerSimOffIPC, err );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSimWarmResetReq
+//
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccSimWarmResetReq()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSimWarmResetReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMWARMRESETREQ, "CMmCustomMessHandler::UiccSimWarmResetReq" );
+
+    TUiccParamsApduReq params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdSimWarmReset;
+    params.serviceType = UICC_APDU_CONTROL;
+    params.action = UICC_CONTROL_WARM_RESET;
+
+    return iMmUiccMessHandler->CreateUiccApduReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSimWarmResetResp
+//
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccSimWarmResetResp( TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSimWarmResetResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMWARMRESETRESP, "CMmCustomMessHandler::UiccSimWarmResetResp" );
+
+    TInt err ( KErrNone );
+
+    if( aStatus != UICC_STATUS_OK )
+        {
+        if( aStatus == UICC_STATUS_SHUTTING_DOWN )
+            {
+            err = CMmStaticUtility::EpocErrorCode( KErrNotReady, KErrNotFound );
+            }
+        else
+            {
+            // UICC_STATUS_FAIL
+            err = CMmStaticUtility::EpocErrorCode( KErrGeneral, KErrNotFound );
+            }
+        }
+    iMessageRouter->Complete( ECustomSimWarmResetIPC, err );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSimGetAtrReq
+//
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccSimGetAtrReq()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSimGetAtrReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMGETATRREQ, "CMmCustomMessHandler::UiccSimGetAtrReq" );
+
+    TUiccParamsApduReq params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdSimGetATR;
+    params.serviceType = UICC_APDU_ATR_GET;
+
+    return iMmUiccMessHandler->CreateUiccApduReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSimGetAtrResp
+//
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccSimGetAtrResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSimGetAtrResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMGETATRRESP, "CMmCustomMessHandler::UiccSimGetAtrResp" );
+
+    TInt err( KErrNone );
+    const TDesC8* dataPtr = &aFileData;
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &dataPtr );
+
+    if( aStatus != UICC_STATUS_OK )
+        {
+        if( aStatus == UICC_STATUS_SHUTTING_DOWN )
+            {
+            err = CMmStaticUtility::EpocErrorCode( KErrNotReady, KErrNotFound );
+            }
+        else
+            {
+            // UICC_STATUS_FAIL
+            err = CMmStaticUtility::EpocErrorCode( KErrGeneral, KErrNotFound );
+            }
+        }
+
+    iMessageRouter->Complete( ECustomGetATRIPC, &dataPackage, err );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSimPowerOnReq
+// Connects UICC server to smartcard and deactivates UICC SAP APDU interface
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccSimPowerOnReq()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSimPowerOnReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMPOWERONREQ, "CMmCustomMessHandler::UiccSimPowerOnReq" );
+
+    //Set APDU interface state
+    iSapApduIfState = EUiccSapIfStatus1;
+
+    // Set parameters for UICC_CONNECTION_REQ message
+    TUiccParamsBase params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdSimPowerOn;
+    params.serviceType = UICC_CONNECT;
+
+    return iMmUiccMessHandler->CreateUiccConnectorReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSimPowerOnResp
+//
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccSimPowerOnResp( TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSimPowerOnResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMPOWERONRESP, "CMmCustomMessHandler::UiccSimPowerOnResp" );
+
+    TInt err( KErrNone );
+
+    if( aStatus == UICC_STATUS_OK )
+        {
+        switch( iSapApduIfState )
+            {
+            case EUiccSapIfStatus1:
+                {
+                // No handling for UICC_CONNECTOR_RESP
+                // wait for UICC_APPLICATION_IND
+                iSapApduIfState = EUiccSapIfStatus2;
+                break;
+                }
+
+            case EUiccSapIfStatus2:
+                {
+                // UICC_APPLICATION_IND (UICC_APPL_ACTIVATED) received
+                // SAP IF deactivated
+                iMessageRouter->Complete( ECustomPowerSimOnIPC, err );
+                break;
+                }
+            }
+        }
+    else
+        {
+        if( aStatus == UICC_STATUS_SHUTTING_DOWN )
+            {
+            err = CMmStaticUtility::EpocErrorCode( KErrNotReady, KErrNotFound );
+            }
+        else
+            {
+            // UICC_STATUS_FAIL
+            err = CMmStaticUtility::EpocErrorCode( KErrGeneral, KErrNotFound );
+            }
+        iMessageRouter->Complete( ECustomPowerSimOnIPC, err );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSimSendAPDUReq
+//
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccSendAPDUReq(
+    const RMmCustomAPI::TApduParameters& aApduParameters,
+    TInt aTraId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSimSendAPDUReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMSENAPDUREQ, "CMmCustomMessHandler::UiccSendAPDUReq" );
+
+    TUiccParamsApduReq params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ( TUiccTrId )aTraId;
+    params.serviceType = UICC_APDU_SEND;
+    params.apduData.Append( aApduParameters.iCmdData );
+
+    return iMmUiccMessHandler->CreateUiccApduReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSendAPDUResp
+//
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccSendAPDUResp(
+    TInt aStatus,
+    const TDesC8& aFileData,
+    TInt aTraId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSendAPDUResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSIMSENAPDURESP, "CMmCustomMessHandler::UiccSendAPDUResp" );
+
+    TInt err( KErrNone );
+    const TDesC8* dataPtr = &aFileData;
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &dataPtr );
+
+    if( aStatus != UICC_STATUS_OK )
+        {
+        if( aStatus == UICC_STATUS_SHUTTING_DOWN )
+            {
+            err = CMmStaticUtility::EpocErrorCode( KErrNotReady, KErrNotFound );
+            }
+        else
+            {
+            // UICC_STATUS_FAIL
+            err = CMmStaticUtility::EpocErrorCode( KErrGeneral, KErrNotFound );
+            }
+        }
+
+    if( aTraId == ETrIdSendAPDUv2 )
+        {
+        iMessageRouter->Complete(
+            ECustomSendAPDUReqV2IPC,
+            &dataPackage,
+            err );
+        }
+    else
+        {
+        iMessageRouter->Complete(
+            ECustomSendAPDUReqIPC,
+            &dataPackage,
+            err );
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCardReaderStatusReq
+//
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccCardReaderStatusReq()
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCardReaderStatusReq.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCARDREADERSTATUSREQ, "CMmCustomMessHandler::UiccCardReaderStatusReq" );
+
+    TUiccParamsApduReq params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdCardReaderStatus;
+    params.serviceType = UICC_CARD_STATUS_GET;
+
+    // Current UICC IF implementatation does not support getting
+    // READER_STATUS_BYTE. However, apdu server uses hard coded values
+    // for READER STATUS BYTE bits 1 to 6
+    // and information contained in bits 7 and 8 can be acquired with
+    // UICC_CARD_REQ request.
+
+    return iMmUiccMessHandler->CreateUiccCardReq( params );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCardReaderStatusResp
+//
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCardReaderStatusResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCardReaderStatusResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCARDREADERSTATUSRESP, "CMmCustomMessHandler::UiccCardReaderStatusResp" );
+
+    TInt err ( KErrNone );
+    CMmDataPackage dataPackage;
+    TUint8 cardStatus( 0 );
+    TBuf8<1> statusByte;
+
+    cardStatus = aFileData[0];
+
+    if( aStatus == UICC_STATUS_OK )
+        {
+        switch( cardStatus )
+            {
+            case UICC_STATUS_CARD_READY:
+                {
+                // UICC Card Status: UICC_STATUS_CARD_READY ->
+                // Card reader status byte: B1101_0000
+                statusByte.Append(KUiccCardStatusCardPresentAndPoweredOn);
+                break;
+                }
+
+            case UICC_STATUS_CARD_DISCONNECTED:
+            case UICC_STATUS_CARD_NOT_PRESENT:
+                {
+                // UICC Card Status: UICC_STATUS_CARD_DISCONNECTED or
+                // UICC_STATUS_CARD_NOT_PRESENT ->
+                // Card reader status byte: B0001_0000
+                statusByte.Append(KUiccCardStatusCardNotPresentOrPoweredOff);
+                break;
+                }
+
+            default:
+                break;
+            }
+        dataPackage.PackData( &statusByte );
+
+        }
+    else
+        {
+        if( aStatus == UICC_STATUS_SHUTTING_DOWN )
+            {
+            err = CMmStaticUtility::EpocErrorCode( KErrNotReady, KErrNotFound );
+            }
+        else
+            {
+            // UICC_STATUS_FAIL
+            err = CMmStaticUtility::EpocErrorCode( KErrGeneral, KErrNotFound );
+            }
+        }
+
+        iMessageRouter->Complete(
+            ECustomGetSimCardReaderStatusIPC,
+            &dataPackage,
+            err );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCardInd
+// Breaks UICC_CARD_IND ISI-message and completes " Notify SimCard Status"
+// to CommonTSY.
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCardInd( const TIsiReceiveC& aIsiMessage )
+    {
+    // Get service type
+    TUint8 serviceType( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + UICC_IND_OFFSET_SERVICETYPE ) );
+
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccCardInd, service type: %d", serviceType );
+OstTraceExt1( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCIND, "CMmCustomMessHandler::UiccCardInd;serviceType=%hhu", serviceType );
+
+    RMmCustomAPI::TSIMCardStatus returnStatus;
+    returnStatus = RMmCustomAPI::SimCardUnknowError;
+
+    switch ( serviceType )
+        {
+        case UICC_CARD_READY :
+            {
+            returnStatus = RMmCustomAPI::SimCardInserted;
+            break;
+            }
+        case UICC_CARD_DISCONNECTED:
+            {
+            returnStatus = RMmCustomAPI::SimCardRemoved;
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &returnStatus );
+    iMessageRouter->Complete(
+        ECustomNotifySimCardStatusIPC,
+        &dataPackage,
+        KErrNone );
+   }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccSendAuthenticateApdu
+// Constructs and sends AUTHENTICATE APDU to the UICC server
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccSendAuthenticateApdu( 
+    const CMmDataPackage& aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSendAuthenticateApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCSENDAUTHENTICATEAPDU, "CMmCustomMessHandler::UiccSendAuthenticateApdu" );
+
+    TInt ret( KErrNone );
+    TBool apduSendNeeded( EFalse );
+
+    // Let's construct AUTHENTICATE APDU based on authenticate type
+    RMmCustomAPI::TSimAuthenticationBase authBase;
+    aDataPackage.UnPackData( authBase );
+    TUint8 simAuthType( authBase.ExtensionId() );
+
+    // Fill parameters to instance created from TUiccSendApdu
+    // needed for APDU sending
+    TUiccSendApdu params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.serviceType = UICC_APPL_APDU_SEND;
+    params.fileId = UICC_EF_ID_NOT_PRESENT;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+    TUint8 cardType( iMmUiccMessHandler->GetCardType() );
+    TBool serviceStatus( EFalse );
+
+    switch( simAuthType )
+        {
+        case RMmCustomAPI::TSimAuthenticationBase::EEapSim:
+            {
+            if( UICC_CARD_TYPE_ICC == cardType )
+                {
+                RMmCustomAPI::TSimAuthenticationEapSim eapSim;
+                aDataPackage.UnPackData( eapSim );
+
+                // In 2G we need to send command RUN GSM ALGORITHM to the ICC
+                UiccCreateRunGsmAlgorithmApdu( params, eapSim.iRandomParameters, ETrIdRunGsmAlgorithmSim );
+                apduSendNeeded = ETrue;
+                }
+            else if( UICC_CARD_TYPE_UICC == cardType )
+                {
+                // In 3G we need to send command AUTHENTICATE to the UICC
+                UiccCreateGsmSecurityContextApdu( params, aDataPackage );
+                apduSendNeeded = ETrue;
+                }
+            break;
+            }
+        case RMmCustomAPI::TSimAuthenticationBase::EEapAka:
+            {
+            RMmCustomAPI::TSimAuthenticationEapAka eapAka;
+            aDataPackage.UnPackData( eapAka );
+
+            if( UICC_CARD_TYPE_ICC == cardType )
+                {
+                // In 2G we need to send command RUN GSM ALGORITHM to the ICC
+                UiccCreateRunGsmAlgorithmApdu( params, eapAka.iRandomParameters, ETrIdRunGsmAlgorithmAka );
+                apduSendNeeded = ETrue;
+                }
+            else if( UICC_CARD_TYPE_UICC == cardType )
+                {
+                // In 3G we need to send command AUTHENTICATE to the UICC
+                UiccCreate3GSecurityContextApdu( 
+                    params, 
+                    eapAka.iRandomParameters, 
+                    eapAka.iAUTN,
+                    ETrIdEEapAkaAuthenticate );
+                apduSendNeeded = ETrue;
+                }
+            break;
+            }
+        case RMmCustomAPI::TSimAuthenticationBase::EGbaBootstrap:
+            {
+            serviceStatus = iMmUiccMessHandler->GetServiceStatus( KServiceGBA );
+
+            if( UICC_CARD_TYPE_UICC == cardType && 
+                EFalse != serviceStatus )
+                {
+                UiccCreateGBABootstrappingApdu( params, aDataPackage );
+                apduSendNeeded = ETrue;
+                }
+            else
+                {
+                // GBA not supported if card type is ICC or GBA not supported in EFust
+TFLOGSTRING3("TSY: CMmCustomMessHandler::UiccSendAuthenticateApdu: GBA not supported (card type: 0x%x, ss: 0x%x)\n", cardType, serviceStatus );
+OstTraceExt2( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICCSENDAUTHENTICATEAPDU, "CMmCustomMessHandler::UiccSendAuthenticateApdu: GBA not supported (card type: %x, ss: 0x%x)", cardType, serviceStatus );
+                ret = KErrGeneral;
+                }
+            break;
+            }
+        case RMmCustomAPI::TSimAuthenticationBase::EGbaBootstrapUpdate:
+            {
+            serviceStatus = iMmUiccMessHandler->GetServiceStatus( KServiceGBA );
+
+            if( UICC_CARD_TYPE_UICC == cardType && 
+                EFalse != serviceStatus )
+                {
+                UiccGBABootstrapUpdate( aDataPackage );
+                }
+            else
+                {
+                // GBA not supported if card type is ICC or GBA not supported in EFust
+TFLOGSTRING3("TSY: CMmCustomMessHandler::UiccSendAuthenticateApdu: GBA not supported (card type: 0x%x, ss: 0x%x)\n", cardType, serviceStatus );
+OstTraceExt2( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_UICCSENDAUTHENTICATEAPDU, "CMmCustomMessHandler::UiccSendAuthenticateApdu: GBA not supported (card type: 0x%x, ss: 0x%x)", cardType, serviceStatus );
+                ret = KErrGeneral;
+                }
+            break;
+              }
+        case RMmCustomAPI::TSimAuthenticationBase::EGbaBootstrapNafDerivation:
+            {
+            serviceStatus = iMmUiccMessHandler->GetServiceStatus( KServiceGBA );
+
+            if( UICC_CARD_TYPE_UICC == cardType && 
+                EFalse != serviceStatus )
+                {
+                UiccCreateGBABootstrapNafDerivationApdu( params, aDataPackage );
+                apduSendNeeded = ETrue;
+                }
+            else
+                {
+                // GBA not supported if card type is ICC or GBA not supported in EFust
+TFLOGSTRING3("TSY: CMmCustomMessHandler::UiccSendAuthenticateApdu: GBA not supported (card type: 0x%x, ss: 0x%x)\n", cardType, serviceStatus );
+OstTraceExt2( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_UICCSENDAUTHENTICATEAPDU, "CMmCustomMessHandler::UiccSendAuthenticateApdu: GBA not supported (card type: 0x%x, ss: 0x%x)", cardType, serviceStatus );
+                ret = KErrGeneral;
+                }
+            break;
+            }
+        case RMmCustomAPI::TSimAuthenticationBase::EMgvMskUpdate:
+            {
+            serviceStatus = iMmUiccMessHandler->GetServiceStatus( KServiceMBMSsecurity );
+
+            if( UICC_CARD_TYPE_UICC == cardType && 
+                EFalse != serviceStatus )
+                {
+                UiccCreateMbmsMskUpdateApdu( params, aDataPackage );
+                apduSendNeeded = ETrue;
+                }
+            else
+                {
+                // MBMS not supported if card type is ICC or MBMS not supported in EFust
+TFLOGSTRING3("TSY: CMmCustomMessHandler::UiccSendAuthenticateApdu: MBMS security not supported (card type: 0x%x, ss: 0x%x)\n", cardType, serviceStatus );
+OstTraceExt2( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_UICCSENDAUTHENTICATEAPDU, "CMmCustomMessHandler::UiccSendAuthenticateApdu: MBMS security not supported (card type: 0x%x, ss: 0x%x)", cardType, serviceStatus );
+                ret = KErrGeneral;
+                }
+            break;
+            }
+        case RMmCustomAPI::TSimAuthenticationBase::EMgvMtkGeneration:
+            {
+            serviceStatus = iMmUiccMessHandler->GetServiceStatus( KServiceMBMSsecurity );
+
+            if( UICC_CARD_TYPE_UICC == cardType && 
+                EFalse != serviceStatus )
+                {
+                UiccCreateMbmsMtkGenerationApdu( params, aDataPackage );
+                apduSendNeeded = ETrue;
+                }
+            else
+                {
+                // MBMS not supported if card type is ICC or MBMS not supported in EFust
+TFLOGSTRING3("TSY: CMmCustomMessHandler::UiccSendAuthenticateApdu: MBMS security not supported (card type: 0x%x, ss: 0x%x)\n", cardType, serviceStatus );
+OstTraceExt2( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_UICCSENDAUTHENTICATEAPDU, "CMmCustomMessHandler::UiccSendAuthenticateApdu: MBMS security not supported (card type: 0x%x, ss: 0x%x)", cardType, serviceStatus );
+                ret = KErrGeneral;
+                }
+            break;
+            }
+        case RMmCustomAPI::TSimAuthenticationBase::EMgvMskDeletion:
+            {
+            serviceStatus = iMmUiccMessHandler->GetServiceStatus( KServiceMBMSsecurity );
+
+            if( UICC_CARD_TYPE_UICC == cardType && 
+                EFalse != serviceStatus )
+                {
+                UiccCreateMbmsMskDeletionApdu( params, aDataPackage );
+                apduSendNeeded = ETrue;
+                }
+            else
+                {
+                // MBMS not supported if card type is ICC or MBMS not supported in EFust
+TFLOGSTRING3("TSY: CMmCustomMessHandler::UiccSendAuthenticateApdu: MBMS security not supported (card type: 0x%x, ss: 0x%x)\n", cardType, serviceStatus );
+OstTraceExt2( TRACE_NORMAL, DUP6_CMMCUSTOMMESSHANDLER_UICCSENDAUTHENTICATEAPDU, "CMmCustomMessHandler::UiccSendAuthenticateApdu: MBMS security not supported (card type: 0x%x, ss: 0x%x)", cardType, serviceStatus );
+                ret = KErrGeneral;
+                }
+            break;
+            }
+        default:
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSendAuthenticateApdu: Unknown APDU\n" );
+OstTrace0( TRACE_NORMAL, DUP7_CMMCUSTOMMESSHANDLER_UICCSENDAUTHENTICATEAPDU, "CMmCustomMessHandler::UiccSendAuthenticateApdu: Unknown APDU" );
+            break;
+            }
+        }
+
+    if( EFalse != apduSendNeeded )
+        {
+        // send the apdu to the UICC server
+        ret = iMmUiccMessHandler->CreateUiccApplCmdReq( params ); 
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccSendAuthenticateApdu: APDU not sent\n" );
+OstTrace0( TRACE_NORMAL, DUP8_CMMCUSTOMMESSHANDLER_UICCSENDAUTHENTICATEAPDU, "CMmCustomMessHandler::UiccSendAuthenticateApduu: APDU not sent" );
+        }
+    return ret;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCreateRunGsmAlgorithmApdu
+// Constructs GSM context AUTHENTICATE APDU
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCreateRunGsmAlgorithmApdu( 
+    TUiccSendApdu& aParams, 
+    const TDesC8& aRand,
+    TUiccTrId aTraId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCreateRunGsmAlgorithmApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCREATERUNGSMALGORITHMAPDU, "CMmCustomMessHandler::UiccCreateRunGsmAlgorithmApdu" );
+
+    aParams.trId = aTraId;
+    aParams.apdu.Append( KClaIcc );              // CLA
+    aParams.apdu.Append( KEvenInstructionCode ); // INS
+    aParams.apdu.Append( 0 ); // P1 is set to 0 in case of RUN GSM ALGORITH
+    aParams.apdu.Append( 0 ); // P2 is set to 0 in case of RUN GSM ALGORITH
+    aParams.apdu.Append( aRand.Size() );     // Lc
+    aParams.apdu.Append( aRand );            // Data
+    aParams.apdu.Append( KRunGsmAlgorithmRespLen ); // Le
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp
+// Handles response APDU for RUN GSM ALGORITHM
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp(
+    TInt aTraId,
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCRUNGSMALGORITHMAPDURESP, "CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp" );
+
+    TInt ret( KErrNone );
+    TInt ipc( ETrIdRunGsmAlgorithmIms == aTraId ? EMobilePhoneIMSAuthenticate : ECustomGetSimAuthenticationDataIPC );
+    RMmCustomAPI::TSimAuthenticationEapSim eapSim;
+    RMmCustomAPI::TSimAuthenticationEapAka eapAka;
+    RMobilePhone::TImsAuthenticateDataV5 ims;
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // get SW1 and SW2
+        TUint8 sw1( aFileData[aFileData.Length() - KSw1Position] );
+        TUint8 sw2( aFileData[aFileData.Length() - KSw2Position] );
+
+        TUint8 result( MapSw1Sw2ToAuthenticateResult( sw1, sw2 ) );
+
+        if( KNormalCommandEnding == result )
+            {
+            if( KApduOk == ValidateReceivedAuthenticateApdu( aTraId, aFileData ) )
+                {
+                // At the momen UICC server get the response from ICC, but in the
+                // future it may be removed from UICC. So then we should get the
+                // response from ICC.
+                TUint8 index = 0;
+
+                if( ETrIdRunGsmAlgorithmSim == aTraId ) // EAP SIM
+                    {
+                    // get the SRES
+                    eapSim.iSRES.Copy( aFileData.Mid(index, KLenOfSRes) );
+                    index += KLenOfSRes;
+
+                    // get the Kc
+                    eapSim.iKC.Copy( aFileData.Mid(index, KLenOfKc ) );
+                    }
+                else if( ETrIdRunGsmAlgorithmIms == aTraId ) // IMS
+                    {
+                    // get the SRES
+                    ims.iRES.Copy( aFileData.Mid(index, KLenOfSRes) );
+                    index += KLenOfSRes;
+
+                    // let's calculate ck and ik from kc
+                    DeriveCkFromKc( ims.iCK, aFileData.Mid(index, KLenOfKc ) );
+                    DeriveIkFromKc( ims.iIK, aFileData.Mid(index, KLenOfKc ) );
+                    }
+                else // EAP AKA
+                    {
+                    // get the SRES
+                    eapAka.iRES.Copy( aFileData.Mid(index, KLenOfSRes) );
+                    index += KLenOfSRes;
+
+                    // let's calculate ck and ik from kc
+                    DeriveCkFromKc( eapAka.iCK, aFileData.Mid(index, KLenOfKc ) );
+                    DeriveIkFromKc( eapAka.iIK, aFileData.Mid(index, KLenOfKc ) );
+                    }
+                }
+            else
+                {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp. APDU validation fails\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICCRUNGSMALGORITHMAPDURESP, "CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp. APDU validation fails" );
+                ret = KErrMMEtelAuthenticateFailed;
+                }
+            }
+        else if( KCmdNotAllowedSecurityStatusNotSatisfied == result )
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp: Security conditions not satisfied\n" );
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_UICCRUNGSMALGORITHMAPDURESP, "CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp: Security conditions not satisfied" );
+            ret = CMmStaticUtility::EpocErrorCode( 
+                KErrAccessDenied, 
+                KErrGsm0707SimPin1Required );
+            }
+        else
+            {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp. unknown result: 0x%X\n", result );
+OstTrace1( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_UICCRUNGSMALGORITHMAPDURESP, "CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp. unknown result: 0x%x", result );
+            ret = KErrMMEtelAuthenticateFailed;
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp: UICC status not ok: 0x%x\n", aStatus );
+OstTrace1( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_UICCRUNGSMALGORITHMAPDURESP, "CMmCustomMessHandler::UiccRunGsmAlgorithmApduResp: UICC status not ok: 0x%x", aStatus );
+        ret = KErrMMEtelAuthenticateFailed;
+        }
+
+    if( KErrNone != ret )
+        {
+        iMessageRouter->Complete(
+            ipc,
+            ret );
+        }
+    else
+        {
+        CMmDataPackage dataPackage;
+        if( ETrIdRunGsmAlgorithmSim == aTraId ) // EAP SIM
+            {
+            dataPackage.PackData( &eapSim );
+            }
+        else if( ETrIdRunGsmAlgorithmIms == aTraId )
+            {
+            dataPackage.PackData( &ims );
+            }
+        else
+            {
+            dataPackage.PackData( &eapAka );
+            }
+
+        iMessageRouter->Complete(
+            ipc,
+            &dataPackage,
+            ret );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCreateGsmSecurityContextApdu
+// Constructs GSM context AUTHENTICATE APDU
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCreateGsmSecurityContextApdu( 
+    TUiccSendApdu& params, 
+    const CMmDataPackage& aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCreateGsmSecurityContextApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCREATEGSMSECURITYCONTEXTAPDU, "CMmCustomMessHandler::UiccCreateGsmSecurityContextApdu" );
+
+    RMmCustomAPI::TSimAuthenticationEapSim eapSim;
+    aDataPackage.UnPackData( eapSim );
+
+    params.trId = ETrIdEEapSimAuthenticate;
+    params.apdu.Append( KClaNoSm );             // CLA
+    params.apdu.Append( KEvenInstructionCode ); // INS
+    params.apdu.Append( 0 ); // P1 is set to 0 in case of even instruction
+    params.apdu.Append( KGsmAuthenticationContext ); // P2
+    params.apdu.Append( eapSim.iRandomParameters.Size() + 1 ); // Lc
+    params.apdu.Append( eapSim.iRandomParameters.Size() );     // Data
+    params.apdu.Append( eapSim.iRandomParameters );            // Data
+    params.apdu.Append( KMaximumLenOfDataExpected );           // Le
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccGsmSecurityContextApduResp
+// Handles response APDU for GSM context AUTHENTICATE APDU
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccGsmSecurityContextApduResp(
+    TInt aTraId,
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGsmSecurityContextApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCGSMSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::UiccGsmSecurityContextApduResp" );
+
+    TInt ret( KErrNone );
+    RMmCustomAPI::TSimAuthenticationEapSim eapSim;
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // get SW1 and SW2
+        TUint8 sw1( aFileData[aFileData.Length() - KSw1Position] );
+        TUint8 sw2( aFileData[aFileData.Length() - KSw2Position] );
+
+        TUint8 result( MapSw1Sw2ToAuthenticateResult( sw1, sw2 ) );
+
+        if( KNormalCommandEnding == result )
+            {
+            if( KApduOk == ValidateReceivedAuthenticateApdu( aTraId, aFileData ) )
+                {
+                // get the SRES
+                TUint8 index( 0 );
+                TUint8 len( aFileData[index++] );
+                eapSim.iSRES.Copy( aFileData.Mid( index , len ) );
+                index += len;
+
+                // get the Kc
+                len = aFileData[index++];
+                eapSim.iKC.Copy( aFileData.Mid( index , len ) );
+                }
+            else
+                {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGsmSecurityContextApduResp: APDU validation failed\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICCGSMSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::UiccGsmSecurityContextApduResp: APDU validation failed" );
+                ret = KErrMMEtelAuthenticateFailed;
+                }
+            }
+        else
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGsmSecurityContextApduResp: unknown result\n" );
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_UICCGSMSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::UiccGsmSecurityContextApduResp: unknown result" );
+            ret = KErrMMEtelAuthenticateFailed;
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccGsmSecurityContextApduResp: UICC status not ok: 0x%x\n", aStatus );
+OstTrace1( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_UICCGSMSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::UiccGsmSecurityContextApduResp: UICC status not ok: 0x%x", aStatus );
+        ret = KErrMMEtelAuthenticateFailed;
+        }
+
+    if( KErrNone != ret )
+        {
+        iMessageRouter->Complete(
+            ECustomGetSimAuthenticationDataIPC,
+            ret );
+        }
+    else
+        {
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &eapSim );
+
+        iMessageRouter->Complete(
+            ECustomGetSimAuthenticationDataIPC,
+            &dataPackage,
+            ret );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCreate3GSecurityContextApdu
+// Constructs 3G security context AUTHENTICATE APDU
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCreate3GSecurityContextApdu( 
+    TUiccSendApdu& aParams, 
+    const TDesC8& aRand, 
+    const TDesC8& aAuth,
+    TUiccTrId aTraId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCreate3GSecurityContextApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCREATE3GSECURITYCONTEXTAPDU, "CMmCustomMessHandler::UiccCreate3GSecurityContextApdu" );
+
+    // len of data is sizeof RAND + sizeof AUTN + two length fields 
+    // (one for RAND len and one for AUTN len)
+    TUint8 lc( aRand.Size() + aAuth.Size() + 2 );
+
+    aParams.trId = aTraId;
+    aParams.apdu.Append( KClaNoSm );             // CLA
+    aParams.apdu.Append( KEvenInstructionCode ); // INS
+    aParams.apdu.Append( 0 ); // P1 is set to 0 in case of even instruction
+    aParams.apdu.Append( K3GAuthenticationContext ); // P2
+    aParams.apdu.Append( lc );                       // Lc 
+    aParams.apdu.Append( aRand.Size() ); // len of RAND
+    aParams.apdu.Append( aRand );        // RAND
+    aParams.apdu.Append( aAuth.Size() );             // len of AUTN
+    aParams.apdu.Append( aAuth );                    // AUTN
+    aParams.apdu.Append( KMaximumLenOfDataExpected );       // Le
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::Uicc3GSecurityContextApduResp
+// Handles response APDU for 3G security context AUTHENTICATE APDU
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::Uicc3GSecurityContextApduResp(
+         TInt aTraId,
+         TInt aStatus,
+         const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Uicc3GSecurityContextApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICC3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Uicc3GSecurityContextApduResp" );
+
+    TInt ret( KErrNone );
+    TInt ipc( ETrIdEEapAkaAuthenticateIms == aTraId ? EMobilePhoneIMSAuthenticate : ECustomGetSimAuthenticationDataIPC );
+    RMmCustomAPI::TSimAuthenticationEapAka eapAka;
+    RMobilePhone::TImsAuthenticateDataV5 ims;
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // get SW1 and SW2
+        TUint8 sw1( aFileData[aFileData.Length() - KSw1Position] );
+        TUint8 sw2( aFileData[aFileData.Length() - KSw2Position] );
+
+        TUint8 result( MapSw1Sw2ToAuthenticateResult( sw1, sw2 ) );
+
+        if( KNormalCommandEnding == result )
+            {
+            if( KApduOk == ValidateReceivedAuthenticateApdu( aTraId, aFileData ) )
+                {
+                TUint32 index( 0 );
+
+                if( KSuccessfull3GAuthTag == aFileData[index] )
+                    {
+                    index++;
+
+                    if( ETrIdEEapAkaAuthenticate == aTraId )
+                        {
+                        // get the RES
+                        TUint8 len( aFileData[index++] );
+                        eapAka.iRES.Copy( aFileData.Mid( index, len ) );
+                        index += len;
+
+                        // get the CK
+                        len = aFileData[index++];
+                        eapAka.iCK.Copy( aFileData.Mid( index, len ) );
+                        index += len;
+
+                        // get the IK
+                        len = aFileData[index++];
+                        eapAka.iIK.Copy( aFileData.Mid( index, len ) );
+                        index += len;
+
+                        // Kc is not supported at the moment because of 
+                        // RMmCustomAPI::TSimAuthenticationEapAka doesn't
+                        // have parameter for that
+                        }
+                    else
+                        {
+                        // get the RES
+                        TUint8 len( aFileData[index++] );
+                        ims.iRES.Copy( aFileData.Mid( index, len ) );
+                        index += len;
+
+                        // get the CK
+                        len = aFileData[index++];
+                        ims.iCK.Copy( aFileData.Mid( index, len ) );
+                        index += len;
+
+                        // get the IK
+                        len = aFileData[index++];
+                        ims.iIK.Copy( aFileData.Mid( index, len ) );
+                        index += len;
+                        }
+                    }
+                else if( KSyncFailureTag == aFileData[index] )
+                    {
+                    index++;
+
+                    if( ETrIdEEapAkaAuthenticate == aTraId )
+                        {
+                        // get the AUTS
+                        TUint8 len( aFileData[index++] );
+                        eapAka.iAUTS.Copy( aFileData.Mid( index, len ) );
+                        }
+                    else
+                        {
+                        // get the AUTS
+                        TUint8 len( aFileData[index++] );
+                        ims.iAUTS.Copy( aFileData.Mid( index, len ) );
+                        }
+                    ret = KErrMMEtelSqnVerificationFailed;
+                    }
+                }
+            else
+                {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Uicc3GSecurityContextApduResp: APDU validation failed\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICC3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Uicc3GSecurityContextApduResp: APDU validation failed" );
+                ret = KErrMMEtelAuthenticateFailed;
+                }
+            }            
+        else if( KAppAuthErrorIncorrectMac == result )
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Uicc3GSecurityContextApduResp: incorrect MAC\n" );
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_UICC3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Uicc3GSecurityContextApduResp: incorrect MAC" );
+            // no parameters in this case
+            ret = KErrMMEtelMacVerificationFailed;
+            }
+        else if( KCmdNotAllowedSecurityStatusNotSatisfied == result )
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Uicc3GSecurityContextApduResp: Security conditions not satisfied\n" );
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_UICC3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Uicc3GSecurityContextApduResp: Security conditions not satisfied" );
+            ret = CMmStaticUtility::EpocErrorCode( 
+                KErrAccessDenied, 
+                KErrGsm0707SimPin1Required );
+            }
+        else
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Uicc3GSecurityContextApduResp: unknown result\n" );
+OstTrace0( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_UICC3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Uicc3GSecurityContextApduResp: unknown result" );
+            ret = KErrMMEtelAuthenticateFailed;
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::Uicc3GSecurityContextApduResp: UICC status not ok: 0x%x\n", aStatus );
+OstTrace1( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_UICC3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Uicc3GSecurityContextApduResp: UICC status not ok: 0x%x", aStatus );
+        ret = ETrIdEEapAkaAuthenticateIms == aTraId ? KErrGeneral : KErrMMEtelAuthenticateFailed;
+        }
+
+    if( KErrNone == ret || 
+        KErrMMEtelSqnVerificationFailed == ret || 
+        KErrMMEtelMacVerificationFailed == ret )
+        {
+        CMmDataPackage dataPackage;
+
+        if( ETrIdEEapAkaAuthenticate == aTraId )
+            {
+            dataPackage.PackData( &eapAka );
+            }
+        else
+            {
+            dataPackage.PackData( &ims );
+            }
+
+        iMessageRouter->Complete(
+            ipc,
+            &dataPackage,
+            ret );	
+        }
+    else
+        {
+        iMessageRouter->Complete(
+            ipc,
+            ret );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCreateGBABootstrappingApdu
+// Constructs GBA security context AUTHENTICATE APDU (bootstrapping mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCreateGBABootstrappingApdu(
+    TUiccSendApdu& aParams, 
+    const CMmDataPackage& aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCreateGBABootstrappingApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCREATEGBABOOTSTRAPPINGAPDU, "CMmCustomMessHandler::UiccCreateGBABootstrappingApdu" );
+
+    RMmCustomAPI::TSimAuthenticationGbaBootstrap gbaBootstrap;
+    aDataPackage.UnPackData( gbaBootstrap );
+
+    // len of data is GBA bootstrapping mode tag (1 byte) + sizeof RAND 
+    // + sizeof AUTN + two length fields (one for RAND len and one for AUTN len)
+    TUint8 lc( 1 + gbaBootstrap.iRandomParameters.Size() + gbaBootstrap.iAUTN.Size() + 2 );
+
+    aParams.trId = ETrIdEGbaBootstrap;
+    aParams.apdu.Append( KClaNoSm );             // CLA
+    aParams.apdu.Append( KEvenInstructionCode ); // INS
+    aParams.apdu.Append( 0 ); // P1 is set to 0 in case of even instruction
+    aParams.apdu.Append( KGBAAuthenticationContext ); // P2
+    aParams.apdu.Append( lc );                        // Lc 
+    aParams.apdu.Append( KGBABootstappingModeTag );   // GBA bootstrapping mode tag
+    aParams.apdu.Append( gbaBootstrap.iRandomParameters.Size() ); // len of RAND
+    aParams.apdu.Append( gbaBootstrap.iRandomParameters );        // RAND
+    aParams.apdu.Append( gbaBootstrap.iAUTN.Size() );             // len of AUTN
+    aParams.apdu.Append( gbaBootstrap.iAUTN );                    // AUTN
+    aParams.apdu.Append( KMaximumLenOfDataExpected );             // Le
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccGBABootstrappingApduResp
+// Handles response APDU for GBA security context AUTHENTICATE APDU 
+// (bootstrapping mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccGBABootstrappingApduResp(
+    TInt aTraId,
+    TInt aStatus,
+     const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrappingApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPPINGAPDURESP, "CMmCustomMessHandler::UiccGBABootstrappingApduResp" );
+
+    TInt ret( KErrNone );
+    RMmCustomAPI::TSimAuthenticationGbaBootstrap gbaBootstrap;
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // get SW1 and SW2
+        TUint8 sw1( aFileData[aFileData.Length() - KSw1Position] );
+        TUint8 sw2( aFileData[aFileData.Length() - KSw2Position] );
+
+        TUint8 result( MapSw1Sw2ToAuthenticateResult( sw1, sw2 ) );
+
+        if( KNormalCommandEnding == result )
+            {
+            if( KApduOk == ValidateReceivedAuthenticateApdu( aTraId, aFileData ) )
+                {
+                TUint32 index( 0 );
+
+                if( KSuccessfull3GAuthTag == aFileData[index] )
+                    {
+                    index++;
+
+                    // get the RES
+                    TUint8 len( aFileData[index++] );
+                    gbaBootstrap.iRES.Copy( aFileData.Mid( index, len ) );
+                    }
+
+                else if( KSyncFailureTag == aFileData[index] )
+                    {
+                    index++;
+
+                    // get the AUTS
+                    TUint8 len( aFileData[index++] );
+                    gbaBootstrap.iAUTS.Copy( aFileData.Mid( index, len ) );
+
+                    ret = KErrMMEtelSqnVerificationFailed;
+                    }
+                }
+            else
+                {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrappingApduResp: APDU validation failed\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPPINGAPDURESP, "CMmCustomMessHandler::UiccGBABootstrappingApduResp: APDU validation failed" );
+                ret = KErrGeneral;
+                }
+            }
+        else if( KAppAuthErrorIncorrectMac == result )
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrappingApduResp: incorrect MAC\n" );
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPPINGAPDURESP, "CMmCustomMessHandler::UiccGBABootstrappingApduResp: incorrect MAC" );
+            // no parameters in this case
+            ret = KErrMMEtelMacVerificationFailed;
+            }
+        else
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrappingApduResp: unknown result\n" );
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPPINGAPDURESP, "CMmCustomMessHandler::UiccGBABootstrappingApduResp: unknown result" );
+            ret = KErrGeneral;
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccGBABootstrappingApduResp: UICC status not ok: 0x%x\n", aStatus );
+OstTrace1( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPPINGAPDURESP, "CMmCustomMessHandler::UiccGBABootstrappingApduResp: UICC status not ok: 0x%x", aStatus );
+        ret = KErrMMEtelAuthenticateFailed;
+        }
+
+    if( KErrNone == ret || 
+        KErrMMEtelSqnVerificationFailed == ret || 
+        KErrMMEtelMacVerificationFailed == ret )
+        {
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &gbaBootstrap );
+
+        iMessageRouter->Complete(
+            ECustomGetSimAuthenticationDataIPC,
+            &dataPackage,
+            ret );	
+        }
+    else
+        {
+        iMessageRouter->Complete(
+            ECustomGetSimAuthenticationDataIPC,
+            ret );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccGBABootstrapUpdate
+// starts GBA bootstrap update operation
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccGBABootstrapUpdate(
+    const CMmDataPackage& aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrapUpdate.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPUPDATE, "CMmCustomMessHandler::UiccGBABootstrapUpdate" );
+
+    // GBA bootstrap update is done by first reading of elementary file EFgba.
+    // After that RAND is stored temporarily and B-Tid and keylifetime is written
+    // to EFgba. After write operation, RAND is completed to the client.
+
+    RMmCustomAPI::TSimAuthenticationGbaBootstrapUpdate gbaBootstrapUpdate;
+    aDataPackage.UnPackData( gbaBootstrapUpdate );
+
+    iBTidBuf.Zero();
+    iKeyLifetimeBuf.Zero();
+
+    // Store B-TID temporarily
+    iBTidBuf.Append( gbaBootstrapUpdate.iBTid );
+
+    // Store Key lifetime temporarily
+    iKeyLifetimeBuf.Append( gbaBootstrapUpdate.iKeyLifeTime );
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccReadTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdEGbaBootstrapRead;
+
+    params.dataAmount = 0;
+    params.dataOffset = 0;
+    params.fileId = KElemGba;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.serviceType = UICC_APPL_READ_TRANSPARENT;
+
+    // File id path
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+    iMmUiccMessHandler->CreateUiccApplCmdReq( params ); 
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccGBABootstrapReadResp
+// Handles response to elementary file EFgba read operation
+// -----------------------------------------------------------------------------
+//  
+void CMmCustomMessHandler::UiccGBABootstrapReadResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrapReadResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPREADRESP, "CMmCustomMessHandler::UiccGBABootstrapReadResp" );
+
+    iRandBuf.Zero();
+
+    if( UICC_STATUS_OK == aStatus)
+        {
+        // Get the rand len
+        TUint32 index( 0 );
+        TUint8 randLen( aFileData[index++] );
+
+        if( aFileData.Length() >= randLen + 
+            iBTidBuf.Length() + 
+            iKeyLifetimeBuf.Length() + 
+            3 )
+            {
+            // store rand temporarily so that we can complete it
+            // when B-Tid and keylifetime is updated to the EFgba.
+            iRandBuf.Copy( aFileData.Mid( index, randLen ) );
+
+            // Set parameters for UICC_APPL_CMD_REQ message
+            TUiccWriteTransparent params;
+            params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+            params.trId = ETrIdEGbaBootstrapUpdate;
+            params.dataOffset = randLen + 1;
+            params.fileId = KElemGba;
+            params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+            params.serviceType = UICC_APPL_UPDATE_TRANSPARENT;
+
+            // File id path
+            params.filePath.Append( KMasterFileId >> 8 );
+            params.filePath.Append( KMasterFileId );
+            params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+            // fill file data
+            params.fileData.Append( iBTidBuf.Length() );
+            params.fileData.Append( iBTidBuf );
+            params.fileData.Append( iKeyLifetimeBuf.Length() );
+            params.fileData.Append( iKeyLifetimeBuf );
+
+            iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+            }
+        else
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrapReadResp. File too small for update\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPREADRESP, "CMmCustomMessHandler::UiccGBABootstrapReadResp. File too small for update" );
+            iMessageRouter->Complete(
+                ECustomGetSimAuthenticationDataIPC,
+                KErrArgument );
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccGBABootstrapReadResp. EFgba reading failed (0x%x)\n", aStatus );
+OstTrace1( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPREADRESP, "CMmCustomMessHandler::UiccGBABootstrapReadResp. EFgba reading failed (%x)", aStatus );
+        iMessageRouter->Complete(
+            ECustomGetSimAuthenticationDataIPC,
+            KErrMMEtelAuthenticateFailed );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccGBABootstrapUpdateResp
+// Handles response to elementary file EFgba write operation
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccGBABootstrapUpdateResp( TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrapUpdateResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCGBABOOTSTRAPUPDATERESP, "CMmCustomMessHandler::UiccGBABootstrapUpdateResp" );
+
+    TInt ret( KErrGeneral );
+    RMmCustomAPI::TSimAuthenticationGbaBootstrapUpdate gbaBootstrapUpdate;
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        ret = KErrNone;
+        gbaBootstrapUpdate.iRandomParameters.Copy( iRandBuf );
+        }
+    else
+        {
+        ret = KErrMMEtelAuthenticateFailed;
+        }
+
+    if( KErrNone == ret )
+        {
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &gbaBootstrapUpdate );
+        iMessageRouter->Complete(
+            ECustomGetSimAuthenticationDataIPC,
+            &dataPackage,
+            ret );
+        }
+    else
+        {
+        iMessageRouter->Complete(
+            ECustomGetSimAuthenticationDataIPC,
+            ret );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCreateGBABootstrapNafDerivationApdu
+// Constructs GBA security context AUTHENTICATE APDU (NAF derivation mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCreateGBABootstrapNafDerivationApdu(
+    TUiccSendApdu& aParams, 
+    const CMmDataPackage& aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCreateGBABootstrapNafDerivationApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCREATEGBABOOTSTRAPNAFDERIVATIONAPDU, "CMmCustomMessHandler::UiccCreateGBABootstrapNafDerivationApdu" );
+
+    RMmCustomAPI::TSimAuthenticationGbaNafDerivation gbaBootstrapNafDerivation;
+    aDataPackage.UnPackData( gbaBootstrapNafDerivation );
+
+    // len of data is GBA NAF derivation mode tag (1 byte) + sizeof NAFId 
+    // + sizeof IMPI + two length fields (one for NAFId len and one for IMPI len)
+    TUint8 lc( 1 + 
+               gbaBootstrapNafDerivation.iNafId.Size() + 
+               gbaBootstrapNafDerivation.iImpi.Size() + 
+               2 );
+
+    aParams.trId = ETrIdEGbaNafDerivation;
+    aParams.apdu.Append( KClaNoSm );             // CLA
+    aParams.apdu.Append( KEvenInstructionCode ); // INS
+    aParams.apdu.Append( 0 ); // P1 is set to 0 in case of even instruction
+    aParams.apdu.Append( KGBAAuthenticationContext ); // P2
+    aParams.apdu.Append( lc );                        // Lc 
+    aParams.apdu.Append( KGBANAFDerivationModeTag );   // GBA bootstrapping mode tag
+    aParams.apdu.Append( gbaBootstrapNafDerivation.iNafId.Size() ); // len of NAFId
+    aParams.apdu.Append( gbaBootstrapNafDerivation.iNafId );        // NAFId
+    aParams.apdu.Append( gbaBootstrapNafDerivation.iImpi.Size() );  // len of IMPI
+    aParams.apdu.Append( gbaBootstrapNafDerivation.iImpi );         // IMPI
+    aParams.apdu.Append( KMaximumLenOfDataExpected );               // Le
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccGBABootstrapNafDerivationApduResp
+// Handles response APDU for GBA security context AUTHENTICATE APDU 
+// (NAF derivation mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccGBANafDerivationApduResp(
+    TInt aTraId,
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrapNafDerivationApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCGBANAFDERIVATIONAPDURESP, "CMmCustomMessHandler::UiccGBANafDerivationApduResp" );
+
+    TInt ret( KErrNone );
+    RMmCustomAPI::TSimAuthenticationGbaNafDerivation gbaNafDerivation;
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // get SW1 and SW2
+        TUint8 sw1( aFileData[aFileData.Length() - KSw1Position] );
+        TUint8 sw2( aFileData[aFileData.Length() - KSw2Position] );
+
+        TUint8 result( MapSw1Sw2ToAuthenticateResult( sw1, sw2 ) );
+
+        if( KNormalCommandEnding == result )
+            {
+            if( KApduOk == ValidateReceivedAuthenticateApdu( aTraId, aFileData ) )
+                {
+                // Let's skip "Successful GBA operation" tag
+                // and start with Length of Length of Ks ext NAF 
+                TUint32 index( 1 );
+
+                // get the Ks ext NAF
+                TUint8 len( aFileData[index++] );
+                gbaNafDerivation.iKsExtNaf.Copy( aFileData.Mid( index, len ) );
+                }
+            else
+                {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrapNafDerivationApduResp: APDU validation failed\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICCGBANAFDERIVATIONAPDURESP, "CMmCustomMessHandler::UiccGBANafDerivationApduResp: APDU validation failed" );
+                ret = KErrGeneral;
+                }
+            }
+        else if( KCmdNotAllowedConditionsNotSatisfied == result )
+            {
+            ret = KErrNotSupported;
+            }
+        else
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccGBABootstrapNafDerivationApduResp: unknown result\n" );
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_UICCGBANAFDERIVATIONAPDURESP, "CMmCustomMessHandler::UiccGBANafDerivationApduResp: unknown result" );
+            ret = KErrGeneral;
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccGBABootstrapNafDerivationApduResp: UICC status not ok: 0x%x\n", aStatus );
+OstTrace1( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_UICCGBANAFDERIVATIONAPDURESP, "CMmCustomMessHandler::UiccGBANafDerivationApduResp: UICC status not ok: 0x%x", aStatus );
+        ret = KErrMMEtelAuthenticateFailed;
+        }
+
+    if( KErrNone == ret )
+        {
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &gbaNafDerivation );
+
+        iMessageRouter->Complete(
+            ECustomGetSimAuthenticationDataIPC,
+            &dataPackage,
+            ret );	
+        }
+    else
+        {
+        iMessageRouter->Complete(
+            ECustomGetSimAuthenticationDataIPC,
+            ret );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCreateMbmsMskUpdateApdu
+// Constructs MBMS security context AUTHENTICATE APDU (MSK Update Mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCreateMbmsMskUpdateApdu(
+    TUiccSendApdu& params, 
+    const CMmDataPackage& aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCreateMbmsMskUpdateApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCREATEMBMSMSKUPDATEAPDU, "CMmCustomMessHandler::UiccCreateMbmsMskUpdateApdu" );
+
+    // Note. MBMS functionality is not tested in real hardware and in real environmen
+    //  because of there is no users for this authentication type. So this is implemented
+    // with the best knowledge at the moment and it can contain some bugs which 
+    // can be found when this is tested in real environment.
+
+    RMmCustomAPI::TSimAuthenticationMgvMskUpdate mskUpdate;
+    aDataPackage.UnPackData( mskUpdate );
+
+    // len of data is MBMS Data Object tag (1 byte) +
+    // MBMS Data Object length (1 byte) +
+    // MBMS Security Context Mode (1 byte) + size of Mikey
+    TUint8 lc( 1 + 1 + 1 + mskUpdate.iMikey.Size() );
+
+    params.trId = ETrIdEMbmsMskUpdate;
+    params.apdu.Append( KClaNoSm );             // CLA
+    params.apdu.Append( KOddInstructionCode );  // INS
+    params.apdu.Append( KFirstBlockOfAuthenticationData ); // P1
+    params.apdu.Append( KMBMSAuthenticationContext ); // P2
+    params.apdu.Append( lc );                         // Lc 
+    params.apdu.Append( KMBMSDataObjectTag );          // MBMS Data object tag
+    params.apdu.Append( mskUpdate.iMikey.Size() + 1 ); // MBMS data obj len
+    params.apdu.Append( KMskUpdateMode );              // MBMS Security Context Mode
+    params.apdu.Append( mskUpdate.iMikey );            // Mikey
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccMbmsMskUpdateApduResp
+// Handles response APDU for MBMS security context AUTHENTICATE APDU 
+// (MSK Update Mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccMbmsMskUpdateApduResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccMbmsMskUpdateApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCMBMSMSKUPDATEAPDURESP, "CMmCustomMessHandler::UiccMbmsMskUpdateApduResp" );
+
+    // Note. MBMS functionality is not tested in real hardware and in real environment
+    // because of at the moment there is no users for this authentication type. 
+    // So this is implemented with the best knowledge at the moment and it can contain 
+    // some bugs which can be found when this is tested in real environment.
+
+    TInt ret( KErrGeneral );
+    RMmCustomAPI::TSimAuthenticationMgvMskUpdate mskUpdate;
+    TBool completeNeeded( ETrue );
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // get SW1 and SW2
+        TUint8 sw1( aFileData[aFileData.Length() - KSw1Position] );
+        TUint8 sw2( aFileData[aFileData.Length() - KSw2Position] );
+
+        TUint8 result( MapSw1Sw2ToAuthenticateResult( sw1, sw2 ) );
+
+        switch( result )
+            {
+            case KNormalCommandEnding:
+            case KWarningMoreDataAvailable:
+                {
+                TBuf8<KMaxApduSize> mbmsOperationData;
+
+                if( FindTlvObject( KMbmsOperationResponseTag53, aFileData.Mid( 0, aFileData.Length() - 2 ), mbmsOperationData ) ||
+                    FindTlvObject( KMbmsOperationResponseTag73, aFileData.Mid( 0, aFileData.Length() - 2 ), mbmsOperationData ) )
+                    {
+                    ret = KErrNone;
+                    mskUpdate.iMikey.Zero();
+                    if( KSuccessfullMbmsOperationTag == mbmsOperationData[0] )
+                        {
+                        UiccMskUpdateHandleMbmsOperationData( mskUpdate, mbmsOperationData );
+                        }
+                    else
+                        {
+                        UiccMskUpdateHandleOMABcastOperationData( mskUpdate, mbmsOperationData );
+                        }
+                    }
+                break;
+                }
+            case KWarningAuthRespAvailable:
+                {
+                UiccCreateFirstBlockOfAuthRespApdu( ETrIdEMbmsMskUpdate );
+                completeNeeded = EFalse;
+                break;
+                }
+            case KCmdNotAllowedConditionsNotSatisfied:
+                {
+                ret = KErrCustomSCCondOfuseNotSatisfied;
+                break;
+                }
+            case KAppErrorAuthMbmsOutOfMemMuk:
+                {
+                ret = KErrCustomSCNoMemSpaceAvailableMukAuthError;
+                break;
+                }
+            case KAppErrorAuthMbmsOutOfMemMsk:
+                {
+                ret = KErrCustomSCNoMemSpaceAvailableAuthError;
+                break;
+                }
+            case KAppAuthErrorIncorrectMac:
+                {
+                ret = KErrCustomSCIncorrectMACAuthError;
+                break;
+                }
+            case KWrongParametersDataNotFound:
+                {
+                ret = KErrCustomSCRefDataNotFound;
+                break;
+                }
+            default:
+                {
+                ret = KErrGeneral;
+                break;
+                }
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccMbmsMskUpdateApduResp: UICC status not ok: 0x%x\n", aStatus );
+OstTrace1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICCMBMSMSKUPDATEAPDURESP, "CMmCustomMessHandler::UiccMbmsMskUpdateApduResp: UICC status not ok: 0x%x", aStatus );
+        ret = KErrMMEtelAuthenticateFailed;
+        }
+
+    if( completeNeeded )
+        {
+        if( KErrNone == ret )
+            {
+            CMmDataPackage dataPackage;
+            dataPackage.PackData( &mskUpdate );
+
+            iMessageRouter->Complete(
+                ECustomGetSimAuthenticationDataIPC,
+                &dataPackage,
+                ret );	
+            }
+        else
+            {
+            iMessageRouter->Complete(
+                ECustomGetSimAuthenticationDataIPC,
+                ret );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccMskUpdateHandleMbmsOperationData
+// Handles MBMS operation data from MSK Update authenticate APDU
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccMskUpdateHandleMbmsOperationData(
+    RMmCustomAPI::TSimAuthenticationMgvMskUpdate& aMskUpdate,
+    TDesC8& aMbmsData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccMskUpdateHandleMbmsOperationData.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCMSKUPDATEHANDLEMBMSOPERATIONDATA, "CMmCustomMessHandler::UiccMskUpdateHandleMbmsOperationData" );
+
+    TUint8 index( 0 );
+    TUint32 objLen( aMbmsData.Length() );
+
+    if( KSuccessfullMbmsOperationTag == aMbmsData[index] &&
+        1 <= objLen && 
+        ( KMaxMbmsMikeyLen + 1 ) >= objLen  ) // + 1 for 0xDB TLV tag
+        {
+        index++;
+
+        // len of MIKEY is obj len - 1 because of 
+        // obj data contains 1 byte for 
+        // Successfull Mbms Operation Tag
+        TUint8 mikeyLen = objLen - 1;
+        if( 0 < mikeyLen )
+            {
+            aMskUpdate.iMikey.Copy( aMbmsData.Mid( index, mikeyLen ) );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccMskUpdateHandleMbmsOperationData
+// Handles OMA BCAST operation data from authenticate APDU
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccMskUpdateHandleOMABcastOperationData( 
+                RMmCustomAPI::TSimAuthenticationMgvMskUpdate& aMskUpdate,
+                TDesC8& aMbmsData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccMskUpdateHandleOMABcastOperationData.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCMSKUPDATEHANDLEOMABCASTOPERATIONDATA, "CMmCustomMessHandler::UiccMskUpdateHandleOMABcastOperationData" );
+
+    TBuf8<KMaxApduSize> omaBcastData;
+
+    if( FindTlvObject( KOMABcastOperationResponseTag, aMbmsData, omaBcastData ) )
+        {
+        TBuf8<KMaxApduSize> bcastManagementData;
+        TBuf8<KMaxParentalRatingDataSize> parentalRatingData;
+        TBuf8<KMaxSpeSize> speTypeNotSupportedData;
+        TBuf8<KMaxApduSize> mikeyData;
+
+        if( FindTlvObject( KBcastManagementDataTag, omaBcastData, bcastManagementData ) )
+            {
+            aMskUpdate.iBCASTManagement.Copy( bcastManagementData );
+            }
+        if( FindTlvObject( KParentalRatingDataTag, omaBcastData, parentalRatingData ) )
+            {
+            aMskUpdate.iParentalRating.Copy( parentalRatingData );
+            }
+        if( FindTlvObject( KSPETypeNotSupportedTag, omaBcastData, speTypeNotSupportedData ) )
+            {
+            aMskUpdate.iSecurityPolicyExt.Copy( speTypeNotSupportedData );
+            }
+
+        if( FindTlvObject( KMikeyMessageTag, omaBcastData, mikeyData ) )
+            {
+            aMskUpdate.iMikey.Copy( mikeyData );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCreateMbmsMtkGenerationApdu
+// Constructs MBMS security context AUTHENTICATE APDU (MTK Generation Mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCreateMbmsMtkGenerationApdu(
+    TUiccSendApdu& params, 
+    const CMmDataPackage& aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCreateMbmsMtkGenerationApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCREATEMBMSMTKGENERATIONAPDU, "CMmCustomMessHandler::UiccCreateMbmsMtkGenerationApdu" );
+
+    // Note. MBMS functionality is not tested in real hardware and in real environment
+    // because of at the moment there is no users for this authentication type. 
+    // So this is implemented with the best knowledge at the moment and it can contain 
+    // some bugs which can be found when this is tested in real environment.
+
+    RMmCustomAPI::TSimAuthenticationMgvMtkGeneration mtkGen;
+    aDataPackage.UnPackData( mtkGen );
+
+    // len of data is MBMS Data Object tag (1 byte) +
+    // MBMS Data Object length (1 byte) +
+    // MBMS Security Context Mode (1 byte) + size of Mikey
+    TUint8 lc( 1 + 1 + 1 + mtkGen.iMikey.Size() );
+
+    params.trId = ETrIdEMbmsMtkGeneration;
+    params.apdu.Append( KClaNoSm );             // CLA
+    params.apdu.Append( KOddInstructionCode );  // INS
+    params.apdu.Append( KFirstBlockOfAuthenticationData ); // P1
+    params.apdu.Append( KMBMSAuthenticationContext ); // P2
+    params.apdu.Append( lc );                         // Lc 
+    params.apdu.Append( KMBMSDataObjectTag );          // MBMS Data object tag
+    params.apdu.Append( mtkGen.iMikey.Size() + 1 ); // MBMS data obj len
+    params.apdu.Append( KMtkGenerationMode );          // MBMS Security Context Mode
+    params.apdu.Append( mtkGen.iMikey );            // Mikey
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccMbmsMtkGenerationApduResp
+// Handles response APDU for MBMS security context AUTHENTICATE APDU 
+// (MTK Generation Mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccMbmsMtkGenerationApduResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccMbmsMtkGenerationApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCMBMSMTKGENERATIONAPDURESP, "CMmCustomMessHandler::UiccMbmsMtkGenerationApduResp" );
+
+    // Note. MBMS functionality is not tested in real hardware and in real environment
+    // because of at the moment there is no users for this authentication type. 
+    // So this is implemented with the best knowledge at the moment and it can contain 
+    // some bugs which can be found when this is tested in real environment.
+
+    TInt ret( KErrGeneral );
+    RMmCustomAPI::TSimAuthenticationMgvMtkGeneration mtkGen;
+    TBool completeNeeded( ETrue );
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // get SW1 and SW2
+        TUint8 sw1( aFileData[aFileData.Length() - KSw1Position] );
+        TUint8 sw2( aFileData[aFileData.Length() - KSw2Position] );
+
+        TUint8 result( MapSw1Sw2ToAuthenticateResult( sw1, sw2 ) );
+
+        switch( result )
+            {
+            case KNormalCommandEnding:
+            case KWarningMoreDataAvailable:
+                {
+                TBuf8<KMaxApduSize> mbmsOperationData;
+
+                if( FindTlvObject( KMbmsOperationResponseTag53, aFileData.Mid( 0, aFileData.Length() - 2 ), mbmsOperationData ) || 
+                    FindTlvObject( KMbmsOperationResponseTag73, aFileData.Mid( 0, aFileData.Length() - 2 ), mbmsOperationData ) )
+                    {
+                    ret = KErrNone;
+                    if( KSuccessfullMbmsOperationTag == mbmsOperationData[0] )
+                        {
+                        UiccMtkGenHandleMbmsOperationData( mtkGen, mbmsOperationData );
+                        }
+                    else
+                        {
+                        UiccMtkGenHandleOMABcastOperationData( mtkGen, mbmsOperationData );
+                        }
+                    }
+                break;
+                }
+            case KWarningAuthRespAvailable:
+                {
+                UiccCreateFirstBlockOfAuthRespApdu( ETrIdEMbmsMtkGeneration );
+                completeNeeded = EFalse;
+                break;
+                }
+            case KCmdNotAllowedConditionsNotSatisfied:
+                {
+                ret = KErrCustomSCCondOfuseNotSatisfied;
+                break;
+                }
+            case KAppErrorAuthMbmsKeyFresh:
+                {
+                ret = KErrCustomSCKeyRefreshFail;
+                break;
+                }
+            case KAppAuthErrorIncorrectMac:
+                {
+                ret = KErrCustomSCIncorrectMACAuthError;
+                break;
+                }
+            case KWrongParametersDataNotFound:
+                {
+                ret = KErrCustomSCRefDataNotFound;
+                break;
+                }
+            default:
+                {
+                ret = KErrGeneral;
+                break;
+                }
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccMbmsMtkGenerationApduResp: UICC status not ok: 0x%x\n", aStatus );
+OstTrace1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICCMBMSMTKGENERATIONAPDURESP, "CMmCustomMessHandler::UiccMbmsMtkGenerationApduResp: UICC status not ok: 0x%x", aStatus );
+        ret = KErrMMEtelAuthenticateFailed;
+        }
+
+    if( completeNeeded )
+        {
+        if( KErrNone == ret )
+            {
+            CMmDataPackage dataPackage;
+            dataPackage.PackData( &mtkGen );
+
+            iMessageRouter->Complete(
+                ECustomGetSimAuthenticationDataIPC,
+                &dataPackage,
+                ret );	
+            }
+        else
+            {
+            iMessageRouter->Complete(
+                ECustomGetSimAuthenticationDataIPC,
+                ret );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccMtkGenHandleMbmsOperationData
+// Handles MBMS operation data from MTK Generation authenticate APDU
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccMtkGenHandleMbmsOperationData( 
+    RMmCustomAPI::TSimAuthenticationMgvMtkGeneration& aMtkGen,
+    TDesC8& aMbmsData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccMtkGenHandleMbmsOperationData.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCMTKGENHANDLEMBMSOPERATIONDATA, "CMmCustomMessHandler::UiccMtkGenHandleMbmsOperationData" );
+
+    TUint8 index( 0 );
+    TUint32 objLen( aMbmsData.Length() );
+
+    if( KSuccessfullMbmsOperationTag == aMbmsData[index] &&
+        1 <= objLen && 
+        ( KMaxMbmsSaltLen + 1 ) >= objLen  ) // + 1 for 0xDB TLV tag
+        {
+        index++;
+
+        // len of SALT is obj len - 1 because of 
+        // obj data contains 1 byte for 
+        // Successfull Mbms Operation Tag
+        TUint8 saltLen( objLen - 1 );
+        if( 0 < saltLen )
+            {
+            aMtkGen.iMtkSalt.Copy( aMbmsData.Mid( index, saltLen ) );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccMtkGenHandleOMABcastOperationData
+// Handles OMA BCAST operation data from authenticate APDU
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccMtkGenHandleOMABcastOperationData( 
+         RMmCustomAPI::TSimAuthenticationMgvMtkGeneration& aMtkGen,
+         TDesC8& aMbmsData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccMtkGenHandleOMABcastOperationData.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCMTKGENHANDLEOMABCASTOPERATIONDATA, "CMmCustomMessHandler::UiccMtkGenHandleOMABcastOperationData" );
+
+    TBuf8<KMaxApduSize> omaBcastData;
+
+    if( FindTlvObject( KOMABcastOperationResponseTag, aMbmsData, omaBcastData ) )
+        {
+        TBuf8<KMaxApduSize> bcastManagementData;
+        TBuf8<KMaxApduSize> tekData;
+        TBuf8<KMaxApduSize> saltData;
+        TBuf8<KMaxApduSize> parentalControlData;
+
+        if( FindTlvObject( KBcastManagementDataTag, omaBcastData, bcastManagementData ) )
+            {
+            aMtkGen.iBCASTManagement.Copy( bcastManagementData );
+            }
+        if( FindTlvObject( KTekDataTag, omaBcastData, tekData ) )
+            {
+            aMtkGen.iTrafficEncryptionKey.Copy( tekData );
+            }
+        if( FindTlvObject( KParentalControlTag, omaBcastData, parentalControlData ) )
+            {
+            // first parameter of parental control data is "key reference for second 
+            // application PIN defined for parental contol" but it's not supported 
+            // at the moment
+            aMtkGen.iParentalControl.Append( parentalControlData[1] ); // rating type
+            aMtkGen.iParentalControl.Append( parentalControlData[2] ); // rating value
+            aMtkGen.iParentalControl.Append( parentalControlData[3] ); // level granted value
+            }
+        if( FindTlvObject( KSaltDataTag, omaBcastData, saltData ) )
+            {
+            aMtkGen.iMtkSalt.Copy( saltData );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCreateMbmsMskDeletionApdu
+// Constructs MBMS security context AUTHENTICATE APDU (MSK Deletion Mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCreateMbmsMskDeletionApdu(
+    TUiccSendApdu& params, 
+    const CMmDataPackage& aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCreateMbmsMskDeletionApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCREATEMBMSMSKDELETIONAPDU, "CMmCustomMessHandler::UiccCreateMbmsMskDeletionApdu" );
+    
+    // Note. MBMS functionality is not tested in real hardware and in real environment
+    // because of at the moment there is no users for this authentication type. 
+    // So this is implemented with the best knowledge at the moment and it can contain 
+    // some bugs which can be found when this is tested in real environment.
+
+    RMmCustomAPI::TSimAuthenticationMgvMskDeletion mskDel;
+    aDataPackage.UnPackData( mskDel );
+
+    // len of data is MBMS Data Object tag (1 byte) +
+    // MBMS Data Object length (1 byte) +
+    // MBMS Security Context Mode (1 byte) + 
+    // size of Key Domain Id + size of Key Group Id Part
+    TUint8 lc( 1 + 
+               1 + 
+               1 + 
+               mskDel.iKeyDomainId.Size() + 
+               mskDel.iKeyGroupIdPart.Size() );
+
+    // data size in MBMS Data Object Tag is:
+    // MBMS Security Context Mode (1 byte) + 
+    // size of Key Domain Id + size of Key Group Id Part
+    TUint8 dataSize( 1 + 
+                     mskDel.iKeyDomainId.Size() + 
+                     mskDel.iKeyGroupIdPart.Size() );
+
+    params.trId = ETrIdEMbmsMskDeletion;
+    params.apdu.Append( KClaNoSm );             // CLA
+    params.apdu.Append( KOddInstructionCode );  // INS
+    params.apdu.Append( KFirstBlockOfAuthenticationData ); // P1
+    params.apdu.Append( KMBMSAuthenticationContext ); // P2
+    params.apdu.Append( lc );                         // Lc 
+    params.apdu.Append( KMBMSDataObjectTag );       // MBMS Data object tag
+    params.apdu.Append( dataSize );                 // MBMS data obj len
+    params.apdu.Append( KMskDeletionMode );         // MBMS Security Context Mode
+    params.apdu.Append( mskDel.iKeyDomainId );      // Key Domain Id
+    params.apdu.Append( mskDel.iKeyGroupIdPart );   // Key Group Id
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccMbmsMskDeletionApduResp
+// Handles response APDU for MBMS security context AUTHENTICATE APDU 
+// (MSK Deletion Mode)
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccMbmsMskDeletionApduResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccMbmsMskDeletionApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCMBMSMSKDELETIONAPDURESP, "CMmCustomMessHandler::UiccMbmsMskDeletionApduResp" );
+
+    // Note. MBMS functionality is not tested in real hardware and in real environment
+    // because of at the moment there is no users for this authentication type. 
+    // So this is implemented with the best knowledge at the moment and it can contain 
+    // some bugs which can be found when this is tested in real environment.
+
+    TInt ret( KErrGeneral );
+    RMmCustomAPI::TSimAuthenticationMgvMskDeletion mskDel;
+    TBool completeNeeded( ETrue );
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // get SW1 and SW2
+        TUint8 sw1( aFileData[aFileData.Length() - KSw1Position] );
+        TUint8 sw2(aFileData[aFileData.Length() - KSw2Position] );
+
+        TUint8 result( MapSw1Sw2ToAuthenticateResult( sw1, sw2 ) );
+
+        switch( result )
+            {
+            case KNormalCommandEnding:
+                {
+                TBuf8<KMaxApduSize> mbmsOperationData;
+
+                if( FindTlvObject( KMbmsOperationResponseTag53, aFileData.Mid( 0, aFileData.Length() - 2 ), mbmsOperationData ) )
+                    {
+                    if( KSuccessfullMbmsOperationTag == mbmsOperationData[0] )
+                        {
+                        ret = KErrNone;
+                        }
+                    }
+                break;
+                }
+            case KWarningAuthRespAvailable:
+                {
+                UiccCreateFirstBlockOfAuthRespApdu( ETrIdEMbmsMskDeletion );
+                completeNeeded = EFalse;
+                break;
+                }
+            case KWrongParametersDataNotFound:
+                {
+                ret = KErrCustomSCRefDataNotFound;
+                break;
+                }
+            default:
+                {
+                ret = KErrGeneral;
+                break;
+                }
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::UiccMbmsMskDeletionApduResp: UICC status not ok: 0x%x\n", aStatus );
+OstTrace1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_UICCMBMSMSKDELETIONAPDURESP, "CMmCustomMessHandler::UiccMbmsMskDeletionApduResp: UICC status not ok: 0x%x", aStatus );
+        ret = KErrMMEtelAuthenticateFailed;
+        }
+
+    if( completeNeeded )
+        {
+        if( KErrNone == ret )
+            {
+            CMmDataPackage dataPackage;
+            dataPackage.PackData( &mskDel );
+
+            iMessageRouter->Complete(
+                ECustomGetSimAuthenticationDataIPC,
+                &dataPackage,
+                ret );	
+            }
+        else
+            {
+            iMessageRouter->Complete(
+                ECustomGetSimAuthenticationDataIPC,
+                ret );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccCreateFirstBlockOfAuthRespApdu
+// Constructs APDU to get authenticate response data in case of odd ins code
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccCreateFirstBlockOfAuthRespApdu( TUiccTrId aTrId )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccCreateFirstBlockOfAuthRespApdu.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCCREATEFIRSTBLOCKOFAUTHRESPAPDU, "CMmCustomMessHandler::UiccCreateFirstBlockOfAuthRespApdu" );
+
+    // Fill parameters to instance created from TUiccSendApdu
+    // needed for APDU sending
+    TUiccSendApdu params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.serviceType = UICC_APPL_APDU_SEND;
+    params.fileId = UICC_EF_ID_NOT_PRESENT;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+    params.trId = aTrId;
+    params.apdu.Append( KClaNoSm );             // CLA
+    params.apdu.Append( KOddInstructionCode );  // INS
+    params.apdu.Append( KFirstBlockOfAuthenticationResponseData ); // P1
+    params.apdu.Append( 0x00 ); // P2
+    params.apdu.Append( 0x00 ); // Le 
+
+    iMmUiccMessHandler->CreateUiccApplCmdReq( params ); 
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::MapSw1Sw2ToAuthenticateResult
+// Maps sw1 and sw2 from response authenticate apdu to result 
+// -----------------------------------------------------------------------------
+//
+TUint8 CMmCustomMessHandler::MapSw1Sw2ToAuthenticateResult( TUint8 sw1, TUint8 sw2 )
+    {
+TFLOGSTRING3("TSY: CMmCustomMessHandler::MapSw1Sw2ToAuthenticateResult. sw1: 0x%x sw2: 0x%x\n", sw1, sw2 );
+OstTraceExt2( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_MAPSW1SW2TOAUTHENTICATERESULT, "CMmCustomMessHandler::MapSw1Sw2ToAuthenticateResult. sw1: 0x%x sw2: 0x%x", sw1, sw2 );
+
+    TUint8 ret( KUnknownCommandEnding );
+
+    switch( sw1 )
+        {
+        case 0x90:
+            {
+            if( 0x00 == sw2 )
+                {
+                ret = KNormalCommandEnding;
+                }
+            break;
+            }
+        case 0x62:
+            {
+            if( 0x00 == sw2 )
+                {
+                ret = KNormalCommandEnding;
+                }
+            else if( 0xF1 == sw2 || 
+                     0xF2 == sw2 )
+                {
+                ret = KWarningMoreDataAvailable;
+                }
+            else if( 0xF3 == sw2 )
+                {
+                ret = KWarningAuthRespAvailable;
+                }
+            break;
+            }
+        case 0x91:
+            {
+            ret = KNormalCommandEnding;
+            break;
+            }
+        case 0x98:
+            {
+            if( 0x62 == sw2 )
+                {
+                ret = KAppAuthErrorIncorrectMac;
+                }
+            else if( 0x65 == sw2 )
+                {
+                ret = KAppErrorAuthMbmsKeyFresh;
+                }
+            else if( 0x66 == sw2 )
+                {
+                ret = KAppErrorAuthMbmsOutOfMemMsk;
+                }
+            else if( 0x67 == sw2 )
+                {
+                ret = KAppErrorAuthMbmsOutOfMemMuk;
+                }
+            break;
+            }
+        case 0x69:
+            {
+            if( 0x82 == sw2 )
+                {
+                ret = KCmdNotAllowedSecurityStatusNotSatisfied;
+                }
+            else if( 0x85 == sw2 )
+                {
+                ret = KCmdNotAllowedConditionsNotSatisfied;
+                }
+            break;
+            }
+        case 0x6A:
+            {
+            if( 0x88 == sw2 )
+                {
+                ret = KWrongParametersDataNotFound;
+                }
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    return ret;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ValidateReceivedAuthenticateApdu
+// Validates received apdu
+// -----------------------------------------------------------------------------
+//
+TUint8 CMmCustomMessHandler::ValidateReceivedAuthenticateApdu( 
+    TInt aTraId, 
+    const TDesC8& aApdu )
+    {
+    TUint8 ret( KApduOk );
+
+    switch( aTraId )
+        {
+        case ETrIdEEapSimAuthenticate:
+            {
+            ret = ValidateGsmSecurityContextApduResp( aApdu );
+            break;
+            }
+        case ETrIdEEapAkaAuthenticate:
+        case ETrIdEEapAkaAuthenticateIms:
+            {
+            ret = Validate3GSecurityContextApduResp( aApdu );
+            break;
+            }
+        case ETrIdEGbaBootstrap:
+            {
+            ret = ValidateGBABootstrappingApduResp( aApdu );
+            break;
+            }
+       case ETrIdEGbaNafDerivation:
+            {
+            ret = ValidateGBANafDerivationApduResp( aApdu );
+            break;
+            }
+        case ETrIdRunGsmAlgorithmSim:
+        case ETrIdRunGsmAlgorithmAka:
+        case ETrIdRunGsmAlgorithmIms:
+            {
+            ret = ValidateRunGsmAlgorithmApduResp( aApdu );
+            break;
+            }
+        default:
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ValidateReceivedAuthenticateApdu: unknown APDU\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_VALIDATERECEIVEDAUTHENTICATEAPDU, "CMmCustomMessHandler::ValidateReceivedAuthenticateApdu: unknown APDU" );
+            ret = KApduNok;
+            break;
+            }
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ValidateGsmSecurityContextApduResp
+// Validates received apdu
+// -----------------------------------------------------------------------------
+//
+TUint8 CMmCustomMessHandler::ValidateGsmSecurityContextApduResp( const TDesC8& aApdu )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ValidateGsmSecurityContextApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_VALIDATEGSMSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::ValidateGsmSecurityContextApduResp" );
+    TUint8 ret( KApduNok );
+
+    // apdu len is len of aApdu - 2 (because of 
+    // aApdu contains sw1 and sw2)
+    TUint apduLen( aApdu.Length() - 2 );
+    TUint32 index( 0 );
+
+    index += aApdu[index] + 1;
+    TUint8 lenOfKc = aApdu[index++];
+
+    if( KLenOfKc == lenOfKc && index + lenOfKc == apduLen )
+        {
+        ret = KApduOk;
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::Validate3GSecurityContextApduResp
+// Validates received apdu
+// -----------------------------------------------------------------------------
+//
+TUint8 CMmCustomMessHandler::Validate3GSecurityContextApduResp( const TDesC8& aApdu )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Validate3GSecurityContextApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_VALIDATE3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Validate3GSecurityContextApduResp" );
+
+    TUint8 ret( KApduOk );
+
+    // Let's calculate total APDU data len in aApdu. Length is 
+    // decremented by 2 because of aApdu contains also sw1 and sw2
+    // and these are total 2 bytes long.
+    TUint8 apduLen( aApdu.Length() - 2 );
+    TUint32 index( 0 );
+    TUint8 tag( aApdu[index++] );
+
+    if( KSuccessfull3GAuthTag == tag  )
+        {
+        // check the len of RES
+        if( KMinLenOfRes > aApdu[index] || KMaxLenOfRes < aApdu[index] )
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid RES\n" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_VALIDATE3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid RES" );
+            ret = KApduNok;
+            }
+        else
+            {
+            // move pointer to field length of CK
+            index += aApdu[index] + 1;
+            }
+
+        // check the len of CK
+        if( KApduNok == ret ||
+            KLenOfCk != aApdu[index] )
+            {
+            if( KApduNok != ret )
+                {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid CK\n" );
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_VALIDATE3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid CK" );
+                ret = KApduNok;
+                }
+            }
+        else
+            {
+            // move pointer to field length of IK
+            index += aApdu[index] + 1;
+            }
+
+        // check the len of IK
+        if( KApduNok == ret ||
+            KLenOfIk != aApdu[index] )
+            {
+            if( KApduNok != ret )
+                {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid IK\n" );
+OstTrace0( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_VALIDATE3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid IK" );
+                ret = KApduNok;
+                }
+            }
+        else
+            {
+            // move pointer to end of IK
+            index += aApdu[index];
+            }
+
+        // check the len of Kc if present.
+        // This parameter is only present
+        // when service nro 27 is available
+        if( KApduOk == ret && index < apduLen - 1 )
+            {
+            // move pointer to field length of Kc
+            index++;
+
+            // check the len of Kc
+            if( KLenOfKc != aApdu[index] )
+                {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid Kc\n" );
+OstTrace0( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_VALIDATE3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid Kc" );
+                ret = KApduNok;
+                }
+            else
+                {
+                // move pointer to end of Kc
+                index += aApdu[index];
+                }
+            }
+
+        // let's check that pointer doesn't go over
+        // aApdu's limits.
+        if( KApduOk == ret && index > apduLen - 1 )
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Validate3GSecurityContextApduResp: error, APDU buffer overflow\n" );
+OstTrace0( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_VALIDATE3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Validate3GSecurityContextApduResp: error, APDU buffer overflow" );
+            ret = KApduNok;
+            }
+        }
+
+    else if(KSyncFailureTag == tag)
+        {
+        // check the len of AUTS
+        if( KLenOfAuts != aApdu[index])
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid AUTS\n" );
+OstTrace0( TRACE_NORMAL, DUP6_CMMCUSTOMMESSHANDLER_VALIDATE3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Validate3GSecurityContextApduResp: invalid AUTS" );
+            ret = KApduNok;
+            }
+        else
+            {
+            // move pointer to end of AUTS
+            index += aApdu[index];
+            }
+
+        // let's check that pointer doesn't go over
+        // aApdu's limits.
+        if( KApduOk == ret && index > apduLen - 1 )
+            {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Validate3GSecurityContextApduResp: error, APDU buffer overflow\n" );
+OstTrace0( TRACE_NORMAL, DUP7_CMMCUSTOMMESSHANDLER_VALIDATE3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Validate3GSecurityContextApduResp: error, APDU buffer overflow" );
+            ret = KApduNok;
+            }
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmCustomMessHandler::Validate3GSecurityContextApduResp: error, unknown tag\n" );
+OstTrace0( TRACE_NORMAL, DUP8_CMMCUSTOMMESSHANDLER_VALIDATE3GSECURITYCONTEXTAPDURESP, "CMmCustomMessHandler::Validate3GSecurityContextApduResp: error, unknown tag" );
+        ret = KApduNok;
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ValidateGBABootstrappingApduResp
+// Validates received apdu
+// -----------------------------------------------------------------------------
+//
+TUint8 CMmCustomMessHandler::ValidateGBABootstrappingApduResp( const TDesC8& aApdu )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ValidateGBABootstrappingApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_VALIDATEGBABOOTSTRAPPINGAPDURESP, "CMmCustomMessHandler::ValidateGBABootstrappingApduResp" );
+
+    TUint8 ret( KApduNok );
+
+    // Let's calculate total APDU data len in aApdu. Length is 
+    // decremented by 2 because of aApdu contains also sw1 and sw2
+    // and these are total 2 bytes long.
+    TUint8 apduLen( aApdu.Length() - 2 );
+    TUint32 index( 0 );
+    TUint8 tag( aApdu[index++] );
+
+    if( apduLen > 1 )
+        {
+        if( KSuccessfull3GAuthTag == tag ||
+            KSyncFailureTag == tag  )
+            {
+            if( apduLen >= aApdu[index] )
+                {
+                ret = KApduOk;
+                }
+            }
+        }
+    return ret;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ValidateGBANafDerivationApduResp
+// Validates received apdu
+// -----------------------------------------------------------------------------
+//
+TUint8 CMmCustomMessHandler::ValidateGBANafDerivationApduResp( const TDesC8& aApdu )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ValidateGBANafDerivationApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_VALIDATEGBANAFDERIVATIONAPDURESP, "CMmCustomMessHandler::ValidateGBANafDerivationApduResp" );
+
+    TUint8 ret = KApduNok;
+
+    // Let's calculate total APDU data len in aApdu. Length is 
+    // decremented by 2 because of aApdu contains also sw1 and sw2
+    // and these are total 2 bytes long.
+    TUint8 apduLen( aApdu.Length() - 2 );
+    TUint32 index( 0 );
+    TUint8 tag( aApdu[index++] );
+
+    if( apduLen > 1 )
+        {
+        if( KSuccessfull3GAuthTag == tag )
+            {
+            // response apdu contains only parameter Ks Ext NAF 
+            // so, let's check that apdu len contains parameter
+            // correctly. So apduLen should be len of Ks Ext NAF
+            // + 2 ("Successful GBA operation" field + 
+            // Length of Ks_ext_NAF field)
+            if( apduLen == aApdu[index] + 2 )
+                {
+                ret = KApduOk;
+                }
+            }
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::ValidateRunGsmAlgorithmApduResp
+// Validates received apdu
+// -----------------------------------------------------------------------------
+//
+TUint8 CMmCustomMessHandler::ValidateRunGsmAlgorithmApduResp( const TDesC8& aApdu )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::ValidateRunGsmAlgorithmApduResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_VALIDATERUNGSMALGORITHMAPDURESP, "CMmCustomMessHandler::ValidateRunGsmAlgorithmApduResp" );
+
+    TUint8 ret( KApduNok );
+
+    if( aApdu.Length() == KRunGsmAlgorithmRespLen + 2 )
+        {
+        ret = KApduOk;
+        }
+    return ret;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::FindTlvObject
+// Finds TLV object
+// -----------------------------------------------------------------------------
+//  
+TBool CMmCustomMessHandler::FindTlvObject(
+    TUint8 aTlvTag,
+    const TDesC8& aBerTlv,
+    TDes8& aTlvObject )
+    {
+TFLOGSTRING2("TSY: CMmCustomMessHandler::FindTlvObject (tag: 0x%x)\n", aTlvTag );
+OstTrace1( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_FINDTLVOBJECT, "CMmCustomMessHandler::FindTlvObject (tag: 0x%x)", aTlvTag );
+
+    TBool ret( EFalse );
+    TUint32 index( 0 );
+    TUint8 tag( 0 );
+    TUint32 tlvLength( 0 );
+
+    while( index + 2 < aBerTlv.Length() )
+        {
+        tag = aBerTlv[index++];
+        tlvLength = aBerTlv[index++];
+
+        // let's check if len of tlv object is coded
+        // with one or two bytes        
+        if( 0x81 == tlvLength ||
+            0x82 == tlvLength )
+            {
+            TUint8 byteCount( tlvLength & 0x7F );
+            TUint8 ind( 0 );
+            tlvLength = 0;
+            do
+                {
+                tlvLength = tlvLength << 8;
+                tlvLength = tlvLength + aBerTlv[index++];
+                ind++;
+                }
+            while ( ind < byteCount );
+            }
+
+        if( tag == aTlvTag )
+            {
+            if( index + tlvLength <= aBerTlv.Length() )
+                {
+                if( tlvLength <= aTlvObject.MaxSize() )
+                    {
+                    // tlv object found
+TFLOGSTRING2("TSY: CMmCustomMessHandler::FindTlvObject: tag: 0x%x found\n", aTlvTag );
+OstTrace1( TRACE_NORMAL, DUP1_CMMCUSTOMMESSHANDLER_FINDTLVOBJECT, "CMmCustomMessHandler::FindTlvObject: tag: 0x%x found", aTlvTag );
+                    aTlvObject.Copy( aBerTlv.Mid( index , tlvLength ) );
+                    ret = ETrue;
+                    }
+                else
+                    {
+TFLOGSTRING3("TSY: CMmCustomMessHandler::FindTlvObject: length of aTlvObject is not enough, needed: %d max size: %d \n", tlvLength, aTlvObject.MaxSize() );
+OstTrace0( TRACE_NORMAL, DUP2_CMMCUSTOMMESSHANDLER_FINDTLVOBJECT, "CMmCustomMessHandler::FindTlvObject: length of aTlvObject is not enough" );
+OstTrace1( TRACE_NORMAL, DUP3_CMMCUSTOMMESSHANDLER_FINDTLVOBJECT, "CMmCustomMessHandler::FindTlvObject: needed: %d", tlvLength );
+OstTrace1( TRACE_NORMAL, DUP4_CMMCUSTOMMESSHANDLER_FINDTLVOBJECT, "CMmCustomMessHandler::FindTlvObject: max size: %d", aTlvObject.MaxSize() );
+                    }
+                }
+            else
+                {
+TFLOGSTRING("TSY: CMmCustomMessHandler::FindTlvObject: buffer overflow \n" );
+OstTrace0( TRACE_NORMAL, DUP5_CMMCUSTOMMESSHANDLER_FINDTLVOBJECT, "CMmCustomMessHandler::FindTlvObject: buffer overflow" );
+                }
+            break;
+            }
+        else
+            {
+            index += tlvLength;
+            }
+        }
+
+    return ret;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::DeriveCkFromKc
+// derives Ck from Kc
+// -----------------------------------------------------------------------------
+//  
+void CMmCustomMessHandler::DeriveCkFromKc(
+    TDes8& aCk,
+    const TDesC8& aKc )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::DeriveCkFromKc.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_DERIVECKFROMKC, "CMmCustomMessHandler::DeriveCkFromKc" );
+
+    /* This operation calculates the UMTS Ciphering Key (CK) from the GSM
+       Ciphering Key (Kc). This is done by using the c4 algorithm defined in
+       3GPP TS 33.102 v3.8.0 (Release 1999).
+
+       c4: CK = Kc || Kc;
+       where || means concatination.
+
+       The resulting CK is as follows:
+       -----------------------------------------------------------------
+       |kc1|kc2|kc3|kc4|kc5|kc6|kc7|kc8|kc1|kc2|kc3|kc4|kc5|kc6|kc7|kc8|
+       ----------------------------------------------------------------- */
+    aCk.Copy( aKc );
+    aCk.Append( aKc );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::DeriveIkFromKc
+// derives Ck from Kc
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::DeriveIkFromKc(
+    TDes8& aIk,
+    const TDesC8& aKc )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::DeriveIkFromKc.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_DERIVEIKFROMKC, "CMmCustomMessHandler::DeriveIkFromKc" );
+
+    /* This operation derives the UMTS Integrity Key (IK) from the GSM
+       Ciphering Key (Kc). This is done by using the c5 algorithm defined in
+       3GPP TS 33.102 v3.8.0 (release 1999).
+
+       c5: IK = Kc1 xor Kc2 || Kc || Kc1 xor Kc2;
+       where Kc1 and Kc2 are both 4 bytes long and || means concatination.
+
+       |--------------> Kc 8 bytes <-----------|
+       -----------------------------------------
+       | B1 | B2 | B3 | B4 | B5 | B6 | B7 | B8 |
+       -----------------------------------------
+       |--> Kc1,4 bytes <--|--> Kc2,4 bytes <--|
+
+       Kx = Kc1 xor Kc2
+
+       The resulting IK is as follows:
+
+       |-----------------------> IK, 16 bytes <------------------------|
+       -----------------------------------------------------------------
+       |Kx1|Kx2|Kx3|Kx4|Kc1|Kc2|Kc3|Kc4|Kc5|Kc6|Kc7|Kc8|Kx1|Kx2|Kx3|Kx4|
+       -----------------------------------------------------------------
+       |----> Kx <-----|------------> Kc <-------------|-----> Kx <----| */
+
+    TBuf8<KLenOfKc> kc1;
+    TBuf8<KLenOfKc> kc2;
+    TBuf8<KLenOfKc> kx;
+
+    kc1.Copy( aKc.Mid( 0, 4 ) );
+    kc2.Copy( aKc.Mid( 4, 4 ) );
+
+    for ( TUint8 i = 0; i < 4; i++ )
+        {
+        kx.Append( kc1[i] ^ kc2[i] );
+        }
+
+    aIk.Append( kx );
+    aIk.Append( aKc );
+    aIk.Append( kx );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::DeriveIkFromKc
+// derives Ck from Kc
+// -----------------------------------------------------------------------------
+//
+TInt CMmCustomMessHandler::UiccHandleImsAuthentication( 
+    const CMmDataPackage& aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccHandleImsAuthentication.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCHANDLEIMSAUTHENTICATION, "CMmCustomMessHandler::UiccHandleImsAuthentication" );
+    TInt ret( KErrNone );
+
+    // IMS authentication:
+    // If card type is ICC, we just send the RUN GSM ALGORITHM to the ICC
+    // If card type is UICC, we check is ISIM application activated:
+    //     * If ISIM application is activated, we send 3G security context
+    //     to the ISIM application.
+    //     * If ISIM application is NOT activated, we try to activate it.
+    //         * If actication succeeded, we send 3G security context to the
+    //         ISIM application
+    //         * If activation fails, we send 3G security context to the USIM
+    //         application
+
+    RMobilePhone::TImsAuthenticateDataV5 authenticationData;
+    aDataPackage.UnPackData( authenticationData );
+
+    TUiccSendApdu params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.serviceType = UICC_APPL_APDU_SEND;
+    params.fileId = UICC_EF_ID_NOT_PRESENT;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+    TUint8 cardType( iMmUiccMessHandler->GetCardType() );
+
+    if( UICC_CARD_TYPE_ICC == cardType )
+        {
+        // no need to activate ISIM application, 
+        // let's just send the authentication APDU
+        UiccCreateRunGsmAlgorithmApdu(
+            params,
+            authenticationData.iRAND,
+            ETrIdRunGsmAlgorithmIms );
+
+        ret = iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+        }
+    else if( UICC_CARD_TYPE_UICC == cardType )
+        {
+        // let's store RAND and AUTN while we try to acticate
+        // ISIM application
+        RMobilePhone::TImsAuthenticateDataV5 authenticationData;
+        aDataPackage.UnPackData( authenticationData );
+
+        if( iMmUiccMessHandler->IsIsimApplicationFound() )
+            {
+            // let's check is ISIM application already tried to activate
+            if( iIsimApplActivated )
+                {
+                UiccCreate3GSecurityContextApdu( 
+                    params, 
+                    authenticationData.iRAND, 
+                    authenticationData.iAUTN,
+                    ETrIdEEapAkaAuthenticateIms );
+
+                ret = iMmUiccMessHandler->CreateUiccApplCmdReq( params, UICC_APPL_TYPE_UICC_ISIM );
+                }
+            else
+                {
+                iRandBuf.Zero();
+                iAutnBuf.Zero();
+
+                iRandBuf.Append( authenticationData.iRAND );
+                iAutnBuf.Append( authenticationData.iAUTN );
+
+                TUiccParamsBase activationParams;
+                activationParams.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+                activationParams.trId = ETrIdActivateIsimApplication;
+
+                ret = iMmUiccMessHandler->CreateUiccApplicationReq(
+                          activationParams,
+                          UICC_APPL_HOST_ACTIVATE,
+                          UICC_APPL_TYPE_UICC_ISIM );
+                }
+            }
+        else
+            {
+            // no ISim application, let's send authenticate apdu to the Uicc application
+            UiccCreate3GSecurityContextApdu(
+                    params,
+                    authenticationData.iRAND,
+                    authenticationData.iAUTN,
+                    ETrIdEEapAkaAuthenticateIms );
+
+            ret = iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+            }
+        }
+    else
+        {
+        ret = KErrGeneral;
+        }
+    return ret;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMmCustomMessHandler::UiccHandleIsimActivationResp
+// handles repsonse for ISim application activation
+// -----------------------------------------------------------------------------
+//
+void CMmCustomMessHandler::UiccHandleIsimActivationResp( TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmCustomMessHandler::UiccHandleIsimActivationResp.\n" );
+OstTrace0( TRACE_NORMAL, CMMCUSTOMMESSHANDLER_UICCHANDLEISIMACTIVATIONRESP, "CMmCustomMessHandler::UiccHandleIsimActivationResp" );
+
+    TUiccSendApdu params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.serviceType = UICC_APPL_APDU_SEND;
+    params.fileId = UICC_EF_ID_NOT_PRESENT;
+    params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+    params.filePath.Append( KMasterFileId >> 8 );
+    params.filePath.Append( KMasterFileId );
+    params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+    UiccCreate3GSecurityContextApdu( 
+        params, 
+        iRandBuf, 
+        iAutnBuf,
+        ETrIdEEapAkaAuthenticateIms );
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        iIsimApplActivated = ETrue;
+
+        // ISim application activated successfully, let's send authentication apdu
+        // to the ISim application
+        iMmUiccMessHandler->CreateUiccApplCmdReq( params, UICC_APPL_TYPE_UICC_ISIM );
+        }
+    else
+        {
+        // ISim application activation fails, le'ts send authentication apdu 
+        // to the USim application
+        iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+        }
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+    //None
+
+// End of File