adaptationlayer/tsy/nokiatsy_dll/src/cmmnetmesshandler.cpp
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/adaptationlayer/tsy/nokiatsy_dll/src/cmmnetmesshandler.cpp	Fri Nov 06 17:28:23 2009 +0000
@@ -0,0 +1,3284 @@
+/*
+* 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 "cmmnetmesshandler.h"
+#include "cmmnetoperatornamehandler.h"
+#include "toperatornames.h"
+#include "cmmphonetsender.h"
+#include "cmmstaticutility.h"
+#include "cmmmessagerouter.h"
+#include "cmmpacketmesshandlercontextlist.h"
+#include "cmmpacketservicemesshandler.h"
+#include "tsylogger.h" // Logging
+#include "cmmuiccmesshandler.h"
+
+#include <ctsy/serviceapi/mmgsmwcdmautils.h> // For mapping utilities
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include <ctsy/serviceapi/mmtsy_defaults.h> // KMmTsyNITZCaps needed
+#include <etelmm.h>
+#include <ctsy/serviceapi/gsmerror.h>
+#include <net_modemisi.h>
+#include <infoisi.h>
+#include <tisi.h>
+#include <gpdsisi.h>
+//#include <permisi.h> To be done in CPS
+#include <uiccisi.h>
+
+#include "osttracedefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cmmnetmesshandlertraces.h"
+#endif
+
+// EXTERNAL DATA STRUCTURES
+    //None
+
+// EXTERNAL FUNCTION PROTOTYPES
+    //None
+
+// CONSTANTS
+// Hard-coded transaction id for ISA messages
+const TUint8 KNetTransId = 4;
+// const TUint8 KNbImsSubBlocks = 3; Compiler warning removal
+
+// Default value for registered in another network in GSM
+const TUint8 KDefaultRegInAnotherNwGsm = 0;
+
+// Operator code for (MCC MNC): 262 07
+_LIT8( KO2NetworkId, "\x62\xF2\x70" );
+// HPLMN read from SIM (MCC MNC): 262 08
+_LIT8( KO2Hplmn, "\x62\xF2\x80" );
+
+#ifdef OST_TRACE_COMPILER_IN_USE
+const TUint8 KBufferForOSTTracing = 100;
+#endif
+#ifdef TF_LOGGING_ENABLED
+const TUint8 KBufferForTFLogging = 130;
+#endif
+
+// MACROS
+    //None
+
+// LOCAL CONSTANTS AND MACROS
+    //None
+
+// MODULE DATA STRUCTURES
+// limit values for mapping RSSI percentage to number of signal strength bars
+const TUint8 netRssiLimitsTable[KMaxSignalStrengthBars] =
+     {
+     1, 16, 33, 49, 66, 83, 99
+     };
+
+// LOCAL FUNCTION PROTOTYPES
+    //None
+
+// FORWARD DECLARATIONS
+    //None
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// TFLOG_PRINT_ISIMESSAGE
+// local function for printing queued Net message contents
+// -----------------------------------------------------------------------------
+//
+#if defined (TF_LOGGING_ENABLED) || defined (OST_TRACE_COMPILER_IN_USE)
+static void TFLOG_PRINT_ISIMESSAGE( const TDesC8& aBuf )
+    {
+    _LIT( KTraceSpace,           " " );
+
+    // Get the length of the ISI message.
+    TInt length = aBuf.Length();
+
+#ifdef TF_LOGGING_ENABLED
+    TBuf<KBufferForTFLogging> msg;
+    _LIT( KTraceQueuedMessage,  "TSY:Queued NET message:  [ " );
+    _LIT( KTraceBracketClose,    "]" );
+
+    msg.Append( KTraceQueuedMessage );
+
+    if ( 250 < length )
+        {
+        // Print only 250 first bytes.
+        length = 250;
+        }
+
+    for ( TInt i = 0; i < length; i++ )
+        {
+        msg.AppendNumFixedWidthUC( aBuf[i], EHex, 2 );
+        msg.Append( KTraceSpace );
+        if ( KLogSizeOfBuffer-10 < msg.Length() )
+            {
+            if ( i == ( length - 1 ) )
+                {
+                // Last number, append "]" character.
+                msg.Append( KTraceBracketClose );
+                }
+
+            TFLOGTEXT( msg );
+            msg.SetLength( 0 );
+            }
+        }
+
+    if ( 0 < msg.Length() )
+        {
+        // Buffer contains data. Print also last line.
+        msg.Append( KTraceBracketClose );
+        TFLOGTEXT( msg );
+        }
+#endif // TF_LOGGING_ENABLED
+
+    // Ost tracing.
+#ifdef OST_TRACE_COMPILER_IN_USE
+    TBuf8<KBufferForOSTTracing> trace_msg;
+    TUint8 counter = 1;
+    TBool firstTime = ETrue;
+
+    for ( TInt i = 0; i < length; i++ )
+        {
+        trace_msg.AppendNumFixedWidthUC( aBuf[i], EHex, 2 );
+        trace_msg.Append( KTraceSpace );
+
+        if ( ( counter > 24 ) ||     // 25 bytes / line.
+            ( ( i + 1 ) == length ) ) // All bytes collected.
+            {
+            if ( ( firstTime ) &&
+                ( ( i + 1 ) == length ) ) // All bytes collected and traced.
+                {
+                firstTime = EFalse;
+OstTraceExt1( TRACE_NORMAL, DUP6__TFLOG_PRINT_ISIMESSAGE, "TSY:Queued NET message: [ %s]", trace_msg );
+                trace_msg.SetLength( 0 );
+                }
+            else if ( firstTime ) // 1st line of the trace.
+                {
+                firstTime = EFalse;
+OstTraceExt1( TRACE_NORMAL, DUP7__TFLOG_PRINT_ISIMESSAGE, "TSY:Queued NET message: [ %s", trace_msg );
+                trace_msg.SetLength( 0 );
+                }
+            else if ( ( i + 1 ) == length ) // The last line.
+                {
+OstTraceExt1( TRACE_NORMAL, DUP8__TFLOG_PRINT_ISIMESSAGE, "TSY:Queued NET message:   %s]", trace_msg );
+                trace_msg.SetLength( 0 );
+                }
+            else // just print bytes.
+                {
+OstTraceExt1( TRACE_NORMAL, DUP9__TFLOG_PRINT_ISIMESSAGE, "TSY:Queued NET message:   %s", trace_msg );
+                trace_msg.SetLength( 0 );
+                }
+            counter = 0;
+            }
+        counter++;
+        }
+#endif // OST_TRACE_COMPILER_IN_USE
+    }
+
+#else // TF_LOGGING_ENABLED || OST_TRACE_COMPILER_IN_USE
+
+#define TFLOG_PRINT_ISIMESSAGE(x)
+
+#endif // TF_LOGGING_ENABLED || OST_TRACE_COMPILER_IN_USE
+
+// -----------------------------------------------------------------------------
+// CalculateNetworkInformationSbStartOffset
+// Calculates starting subblocks offset for NET_MODEM_REG_STATUS_IND,
+// NET_SET_RESP and NET_MODEM_REG_STATUS_GET_RESP
+// @param aIsiMessage ISI-message to process
+// @param aSbStartOffset subblock start offset to initialize
+// @return TInt KErrNone or KErrNotSupported
+// -----------------------------------------------------------------------------
+//
+static TInt CalculateNetworkInformationSbStartOffset(
+    const TIsiReceiveC& aIsiMessage,
+    TUint& aSbStartOffset
+    )
+    {
+    TInt ret( KErrNone );
+
+    TFLOGSTRING("TSY: CalculateNetworkInformationSbStartOffset");
+    OstTrace0( TRACE_NORMAL, _CALCULATENETWORKINFORMATIONSBSTARTOFFSET, "CalculateNetworkInformationSbStartOffset" );
+
+    TUint8 messageId = aIsiMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID );
+    if ( NET_MODEM_REG_STATUS_IND == messageId )
+        {
+        TFLOGSTRING("TSY: CalculateNetworkInformationSbStartOffset; NET_REG_STATUS_IND");
+        OstTrace0( TRACE_NORMAL, DUP1__CALCULATENETWORKINFORMATIONSBSTARTOFFSET, "CalculateNetworkInformationSbStartOffset; NET_REG_STATUS_IND" );
+        aSbStartOffset = SIZE_NET_MODEM_REG_STATUS_IND;
+        }
+    else if ( NET_MODEM_REG_STATUS_GET_RESP == messageId )
+        {
+        TFLOGSTRING("TSY: CalculateNetworkInformationSbStartOffset; NET_REG_STATUS_GET_RESP");
+        OstTrace0( TRACE_NORMAL, DUP2__CALCULATENETWORKINFORMATIONSBSTARTOFFSET, "CalculateNetworkInformationSbStartOffset; NET_REG_STATUS_GET_RESP" );
+        aSbStartOffset = SIZE_NET_MODEM_REG_STATUS_GET_RESP;
+        }
+    else if ( NET_SET_RESP == messageId )
+        {
+        TFLOGSTRING("TSY: CalculateNetworkInformationSbStartOffset; NET_SET_RESP");
+        OstTrace0( TRACE_NORMAL, DUP3__CALCULATENETWORKINFORMATIONSBSTARTOFFSET, "CalculateNetworkInformationSbStartOffset; NET_SET_RESP" );
+        aSbStartOffset = SIZE_NET_SET_RESP;
+        }
+    else
+        {
+        TFLOGSTRING2("TSY: CalculateNetworkInformationSbStartOffset;unknown messageId=%x", messageId);
+        OstTrace1( TRACE_NORMAL, DUP4__CALCULATENETWORKINFORMATIONSBSTARTOFFSET, "CalculateNetworkInformationSbStartOffset;unknown messageId=%x", messageId );
+        ret = KErrNotSupported;
+        }
+
+    return ret;
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::CMmNetMessHandler
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+CMmNetMessHandler::CMmNetMessHandler()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::CMmNetMessHandler() - Start");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_CMMNETMESSHANDLER, "CMmNetMessHandler::CMmNetMessHandler" );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMmNetMessHandler* CMmNetMessHandler::NewL
+        (
+        CMmPhoNetSender* aPhoNetSender, // Pointer to the phonet sender
+        CMmPhoNetReceiver* aPhoNetReceiver, // Pointer to the phonet receiver
+        CMmMessageRouter* aMessageRouter, // Pointer to the message router
+        CMmUiccMessHandler* aUiccMessHandler
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NewL");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NEWL, "CMmNetMessHandler::NewL" );
+
+    CMmNetMessHandler* netMessHandler = new ( ELeave ) CMmNetMessHandler();
+
+    CleanupStack::PushL( netMessHandler );
+
+    netMessHandler->iPhoNetSender = aPhoNetSender;
+    netMessHandler->iMessageRouter = aMessageRouter;
+    netMessHandler->iMmUiccMessHandler = aUiccMessHandler;
+    netMessHandler->ConstructL();
+
+    // NETWORK
+    aPhoNetReceiver->RegisterL(
+        netMessHandler,
+        PN_MODEM_NETWORK );
+    // GPDS
+    aPhoNetReceiver->RegisterL(
+        netMessHandler,
+        PN_GPDS,
+        GPDS_RADIO_ACTIVITY_IND );
+    aPhoNetReceiver->RegisterL(
+        netMessHandler,
+        PN_GPDS,
+        GPDS_CONTEXT_DEACTIVATE_IND );
+    // INFO
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+    aPhoNetReceiver->RegisterL(
+        netMessHandler,
+        PN_INFO,
+        INFO_PP_READ_RESP );
+#else /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+/*  To be replaced with INFO_PP_DATA_READ_RESP
+    aPhoNetReceiver->RegisterL(
+        netMessHandler,
+        PN_MODEM_INFO,
+        INFO_PP_READ_RESP );
+*/
+#endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+
+    // PERMANENT_DATA
+    /*aPhoNetReceiver->RegisterL(
+        netMessHandler,
+        PN_PERMANENT_DATA,
+        PERM_PM_RECORD_WRITE_RESP );
+    aPhoNetReceiver->RegisterL(
+        netMessHandler,
+        PN_PERMANENT_DATA,
+        PERM_PM_RECORD_READ_RESP ); To be done in CPS */
+
+    CleanupStack::Pop( netMessHandler );
+
+    return netMessHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::ConstructL
+// Symbian 2nd phase constructor. Initialises internal attributes.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::ConstructL()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::ConstructL()");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_CONSTRUCTL, "CMmNetMessHandler::ConstructL" );
+
+    iNetOperatorNameHandler = CMmNetOperatorNameHandler::NewL( this );
+
+    // Delay timer for completion of Packet transfer state
+    iDelayTimer = CDelayTimer::NewL( this );
+
+    // Selection method is at this point unknown
+    iSelectionMethod = NET_SELECT_MODE_UNKNOWN;
+
+    // No cancel request has been issued yet
+    iSelectNetworkCancelIssued = EFalse;
+    iSearchNetworkCancelIssued = EFalse;
+
+    // Initialize to EFalse
+    iImsPinVerifyRequired = EFalse;
+    iIsimUsed = EFalse;
+    iMNClength = 0;
+
+    iNetworkMode = RMobilePhone::ENetworkModeUnknown;
+    iNetworkAccess = RMobilePhone::ENetworkAccessUnknown;
+    iCell_DCH = EFalse;
+    iPacketTransfer = EFalse;
+
+    iNetMessageHandlingOngoing = EFalse;
+
+    // Request network signal strength (RSSI)
+    NetRssiGetReq();
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::~CMmNetMessHandler
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CMmNetMessHandler::~CMmNetMessHandler()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::~CMmNetMessHandler() - End");
+OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_CMMNETMESSHANDLER, "CMmNetMessHandler::~CMmNetMessHandler" );
+
+    delete iNetOperatorNameHandler;
+
+    for ( TInt i = 0; i < iNetMessageQueue.Count(); i++ )
+        {
+        delete iNetMessageQueue[i];
+        }
+
+    iNetMessageQueue.Close();
+
+    // Delete delay timer
+    if ( iDelayTimer )
+        {
+        delete iDelayTimer;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::ProcessUiccMsg
+// Handles data received from UICC server
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::ProcessUiccMsg(
+    TInt aTraId,
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING3("TSY: CMmNetMessHandler::ProcessUiccMsg, transaction ID: %d, status: %d", aTraId, aStatus );
+OstTraceExt2( TRACE_NORMAL, CMMNETMESSHANDLER_PROCESSUICCMSG, "CMmNetMessHandler::ProcessUiccMsg;aTraId=%d;aStatus=%d", aTraId, aStatus );
+
+    TInt ret( KErrNone );
+
+    switch( aTraId )
+        {
+        case ETrIdReadCipheringIndicatorStatus:
+            {
+            UiccReadCiResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdReadCsDataEhplmn:
+            {
+            UiccCsReadEhpmlnResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdReadCsDataHplmn:
+            {
+            UiccCsReadHpmlnResp( aStatus, aFileData );
+            break;
+            }
+        default:
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::ProcessUiccMsg - unknown transaction ID" );
+OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_PROCESSUICCMSG, "CMmNetMessHandler::ProcessUiccMsg - - unknown transaction ID" );
+            break;
+            }
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::ExtFuncL
+// Dispatches Etel requests to DOS level handlers
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::ExtFuncL
+        (
+        TInt aIpc, // Ipc number
+        const CMmDataPackage* aDataPackage // Packed data
+        )
+    {
+TFLOGSTRING2("TSY: CMmNetMessHandler::ExtFuncL - Ipc: %d", aIpc);
+OstTrace1( TRACE_NORMAL, CMMNETMESSHANDLER_EXTFUNCL, "CMmNetMessHandler::ExtFuncL;aIpc=%d", aIpc );
+
+    //*************************************************************//
+    // NOTE:
+    //
+    // LICENSEE SPECIFIC MESSAGE HANDLER IMPLEMENTATION STARTS HERE
+    //
+    //*************************************************************//
+
+    TInt ret( KErrNone );
+
+    TUint8 transId( KNetTransId );
+
+      switch ( aIpc )
+        {
+        case EMobilePhoneSetNetworkSelectionSetting:
+            {
+            // Unpack the parameters for this case
+            RMobilePhone::TMobilePhoneNetworkSelectionV1* networkSetting( NULL );
+            aDataPackage->UnPackData( &networkSetting );
+
+            // Forward the request to specific method
+            NetNetworkSelectModeSetReq( transId, *networkSetting );
+            break;
+            }
+        case EMobilePhoneSelectNetwork:
+            {
+            // Unpack parameters
+            TBool* isManual( NULL );
+            RMobilePhone::TMobilePhoneNetworkManualSelection* manualSelection( NULL );
+            aDataPackage->UnPackData( &isManual, &manualSelection );
+
+            // Forward the request to the specific method
+            NetSetReq( transId,
+                *isManual,
+                manualSelection->iNetwork.Left( 4 ), // Operator code
+                manualSelection->iCountry.Left( 3 ) ); // Country code
+            break;
+            }
+        case EMobilePhoneSelectNetworkCancel:
+            {
+            NetSetCancelReq( transId );
+            break;
+            }
+        case EMobilePhoneGetDetectedNetworksV2Phase1:
+            {
+            NetModemAvailableGetReq( transId );
+            break;
+            }
+        case EMobilePhoneGetDetectedNetworksCancel:
+            {
+            NetAvailableCancelReq( transId );
+            break;
+            }
+        case EMobilePhoneGetNetworkRegistrationStatus:
+            {
+            // We need to get the network mode before we get the registration
+            // status as this second message doesn't inform in which mode
+            // the network is working.
+            // The net server only serves one request at a time, so there won't
+            // be any race condition and mode will be available always in first
+            // place.
+            NetRatReq( transId );
+            NetModemRegStatusGetReq( transId );
+            break;
+            }
+        case EMobilePhoneGetHomeNetwork:
+            {
+            UiccCsReadReq();
+            break;
+            }
+        case EMobilePhoneGetCipheringIndicatorStatus:
+            {
+            UiccReadCiReq();
+            break;
+            }
+        default:
+            {
+TFLOGSTRING2("TSY: CMmNetMessHandler::ExtFuncL - Unknown IPC: %d", aIpc);
+OstTrace1( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_EXTFUNCL, "CMmNetMessHandler::ExtFuncL;Unknown IPC=%d", aIpc );
+            ret = KErrNotSupported;
+            break;
+            }
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::ReceiveMessageL
+// Called when an ISI message has been received.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::ReceiveMessageL
+        (
+        const TIsiReceiveC& aIsiMessage  // ISI-message received
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::ReceiveMessageL");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_RECEIVEMESSAGEL, "CMmNetMessHandler::ReceiveMessageL" );
+
+    // Resource and message id
+    TInt resource( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_RESOURCEID ) );
+    TInt messageId( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) );
+
+TFLOGSTRING3("TSY: CMmNetMessHandler::ReceiveMessageL - MessageId:%d. Resource: %d", messageId, resource);
+OstTraceExt2( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_RECEIVEMESSAGEL, "CMmNetMessHandler::ReceiveMessageL;messageId=%d;resource=%d", messageId, resource );
+
+    // Transaction id.
+    TUint8 transactId( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_TRANSID ) );
+
+    // NET functionality is implemented in NET server and SIM Server
+    switch ( resource )
+        {
+        case PN_MODEM_NETWORK:
+            {
+            switch( messageId )
+                {
+                case NET_MODEM_REG_STATUS_IND:
+                case NET_MODEM_REG_STATUS_GET_RESP:
+                case NET_SET_RESP:
+                    {
+                    QueueNetModemRegStatusMessagesL( aIsiMessage );
+                    break;
+                    }
+                case NET_MODEM_AVAILABLE_GET_RESP:
+                    {
+                    NetModemAvailableGetRespL( aIsiMessage );
+                    break;
+                    }
+                case NET_AVAILABLE_CANCEL_RESP:
+                    {
+                    NetAvailableCancelResp( aIsiMessage );
+                    break;
+                    }
+                case NET_SET_CANCEL_RESP:
+                    {
+                    NetSetCancelResp( aIsiMessage );
+                    break;
+                    }
+                case NET_RAT_IND:
+                    {
+                    NetRatInd( aIsiMessage );
+                    break;
+                    }
+                case NET_RAT_RESP:
+                    {
+                    NetRatResp( aIsiMessage );
+                    break;
+                    }
+                case NET_NETWORK_SELECT_MODE_SET_RESP:
+                    {
+                    NetNetworkSelectModeSetResp( aIsiMessage );
+                    break;
+                    }
+                case NET_RSSI_GET_RESP:
+                    {
+                    NetRssiGetResp( aIsiMessage );
+                    break;
+                    }
+                case NET_RSSI_IND:
+                    {
+                    NetRssiInd( aIsiMessage );
+                    break;
+                    }
+                case NET_TIME_IND:
+                    {
+                    NetTimeInd( aIsiMessage );
+                    break;
+                    }
+                case NET_CIPHERING_IND:
+                    {
+                    NetCipheringInd( aIsiMessage );
+                    break;
+                    }
+                case NET_RADIO_INFO_IND:
+                    {
+                    NetRadioInfoInd( aIsiMessage );
+                    break;
+                    }
+                case NET_NITZ_NAME_IND:
+                    {
+                    iNetOperatorNameHandler->NetNitzNameInd(
+                        aIsiMessage );
+                    break;
+                    }
+                default:
+                    {
+                    // No appropriate handler methods for ISI-message found.
+TFLOGSTRING("TSY: CMmNetMessHandler::ReceiveMessageL - no handler for the NETWORK message id");
+OstTrace0( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_RECEIVEMESSAGEL, "CMmNetMessHandler::ReceiveMessageL - no handler for the NETWORK message id" );
+                    // Server not known
+                    break;
+                    }
+                } // End switch ( messageId )
+            break; // End case PN_MODEM_NETWORK
+            }
+        case PN_GPDS:
+            {
+            if ( GPDS_RADIO_ACTIVITY_IND == messageId )
+                {
+                GpdsRadioActivityInd( aIsiMessage );
+                }
+            else if ( GPDS_CONTEXT_DEACTIVATE_IND == messageId )
+                {
+                GpdsContextDeactivateInd( aIsiMessage );
+                }
+            // No else
+            break;
+            }
+#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 ( messageId )
+                {
+#ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
+                // To be replaced with INFO_PP_DATA_READ_RESP
+                case INFO_PP_READ_RESP:
+                    {
+                    if ( KNetTransId == transactId )
+                        {
+                        iNetOperatorNameHandler->InfoPpReadResp(
+                            aIsiMessage );
+                        }
+                    break;
+                    }
+#endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
+                default:
+                    {
+                    // No appropriate handler methods for ISI-message found.
+TFLOGSTRING("TSY: CMmNetMessHandler::ReceiveMessageL - no handler for the INFO message id");
+OstTrace0( TRACE_NORMAL, DUP4_CMMNETMESSHANDLER_RECEIVEMESSAGEL, "CMmNetMessHandler::ReceiveMessageL - no handler for the INFO message id" );
+                    break;
+                    }
+                }
+            break;
+            }
+        /*case PN_PERMANENT_DATA:
+            {
+            switch ( messageId )
+                {
+                case PERM_PM_RECORD_WRITE_RESP:
+                    {
+                    if ( KNetTransId == transactId )
+                        {
+                        iNetOperatorNameHandler->PermPmRecordWriteResp(
+                            aIsiMessage );
+                        }
+                    break;
+                    }
+                case PERM_PM_RECORD_READ_RESP:
+                    {
+                    if ( KNetTransId == transactId )
+                        {
+                        iNetOperatorNameHandler->PermPmRecordReadResp(
+                            aIsiMessage );
+                        }
+                    break;
+                    }  
+                default:
+                    {
+                    // No appropriate handler methods for ISI-message found.
+TFLOGSTRING("TSY: CMmNetMessHandler::ReceiveMessageL - no handler for the PERMANENT_DATA message id");
+OstTrace0( TRACE_NORMAL, DUP5_CMMNETMESSHANDLER_RECEIVEMESSAGEL, "CMmNetMessHandler::ReceiveMessageL - no handler for the PERMANENT_DATA message id" );
+                    break;
+                    }
+                }
+            break;
+            } To be done in CPS */
+        default:
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::ReceiveMessageL - Switch resource case default");
+OstTrace0( TRACE_NORMAL, DUP6_CMMNETMESSHANDLER_RECEIVEMESSAGEL, "CMmNetMessHandler::ReceiveMessageL - Switch resource case default" );
+            break; // Server not known
+            }
+        } // End switch ( resource )
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetModemRegStatusInd
+// Breaks a NET_MODEM_REG_STATUS_IND ISI-message.
+// Completes NotifyCurrentNetworkChange, NotifyNetworkRegistrationStatusChange,
+// NotifyNetworkSelectionSettingChange notifications (if required information
+// is gathered) and EMobilePhoneSelectNetwork to SOS Tsy.
+// Handles also ECustomGetOperatorNameIPC and completes it.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetModemRegStatusInd
+        (
+        const TIsiReceiveC& aIsiMessage
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetModemRegStatusInd");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETMODEMREGSTATUSIND, "CMmNetMessHandler::NetModemRegStatusInd" );
+
+    // Assistant for packaging.
+    CMmDataPackage dataPackage;
+
+    RMobilePhone::TMobilePhoneNetworkInfoV5 networkInfo;
+    RMobilePhone::TMobilePhoneLocationAreaV1 locationArea;
+
+    // Buffer for Operator code, length is 3.
+    TBuf8<KBCDLength> operatorCode;
+
+    // Network type initialization.
+    TUint8 networkType( NET_GSM_NO_PLMN_AVAIL );
+
+    // Camped in HPLMN value initialization.
+    TBool campedInHplmn( EFalse );
+
+    TUint sbStartOffSet( 0 );
+
+    // Network mode received via NET_RAT_IND/NET_RAT_RESP.
+    networkInfo.iMode = iNetworkMode;
+        // look for subblock offset to get operator info from
+    TInt returnValue( FindOperatorInfoSubBlock(
+        aIsiMessage,
+        sbStartOffSet ) );
+
+    // If the returnValue is KErrNone then.
+    if ( KErrNone == returnValue )
+        {
+        // Get the Location Area Code.
+        locationArea.iLocationAreaCode = aIsiMessage.Get16bit(
+            sbStartOffSet + NET_MODEM_CURRENT_CELL_INFO_OFFSET_CURRENTLAC );
+        // Get the Cell ID.
+        locationArea.iCellId = aIsiMessage.Get32bit(
+            sbStartOffSet +
+            NET_MODEM_CURRENT_CELL_INFO_OFFSET_CURRENTCELLID );
+        // Area information is known.
+        locationArea.iAreaKnown = ETrue;
+        // Set status to current.
+        networkInfo.iStatus = RMobilePhone::ENetworkStatusCurrent;
+        // Band info is cdma specific.
+        networkInfo.iBandInfo = RMobilePhone::EBandUnknown;
+        // Sid is cdma specific, set it to default value.
+        networkInfo.iCdmaSID.Zero();
+        // Analog SID is cdma specific, set it to default value.
+        networkInfo.iAnalogSID.Zero();
+        // Get the operator code. Size is 3 bytes.
+        operatorCode = aIsiMessage.GetData(
+            sbStartOffSet + NET_MODEM_CURRENT_CELL_INFO_OFFSET_OPERATORCODE,
+            3 );
+            // Map the operator and country code to symbian values
+            MapOperatorAndCountryCode(
+                operatorCode,
+                networkInfo.iNetworkId,
+                networkInfo.iCountryCode );
+
+        // Access technology received via NET_RAT_IND/NET_RAT_RESP.
+        networkInfo.iAccess = iNetworkAccess;
+
+        // Network type.
+        networkType = aIsiMessage.Get8bit(
+            sbStartOffSet +
+            NET_MODEM_CURRENT_CELL_INFO_OFFSET_NETWORKTYPE );
+
+        // Camped in HPLMN.
+        campedInHplmn = aIsiMessage.Get8bit(
+            sbStartOffSet +
+            NET_MODEM_CURRENT_CELL_INFO_OFFSET_CAMPEDINHPLMN );
+
+        // HSDPA availability indicator.
+        // If TRUE then the cell supports HSDPA.
+        networkInfo.iHsdpaAvailableIndicator = aIsiMessage.Get8bit(
+            sbStartOffSet +
+            NET_MODEM_CURRENT_CELL_INFO_OFFSET_HSDPAAVAILABLEINCELL );
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetModemRegStatusInd, HSDPA Available Indicator = %d.", networkInfo.iHsdpaAvailableIndicator);
+OstTraceExt1( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_NETMODEMREGSTATUSIND, "CMmNetMessHandler::NetModemRegStatusInd, HSDPA Available Indicator=%hhu", networkInfo.iHsdpaAvailableIndicator );
+
+// This is done for SUB 403-7200: NokiaTSY: HSUPA Cell Indicator for S60 (S60 3.2.2 / S_CPR8.1).
+// This can be removed when actual implementation for HSUPA Cell Indicator is done.
+// CASW_HSXPA_INDICATOR_SUPPORTED flag.
+#if defined ( CASW_HSXPA_INDICATOR_SUPPORTED ) || defined ( INTERNAL_TESTING_CASW_HSXPA_INDICATOR_SUPPORT )
+
+        TBool hsdpaAvailableIndicator( EFalse );
+        TBool hsupaAvailableIndicator( EFalse );
+
+        hsdpaAvailableIndicator = aIsiMessage.Get8bit(
+            sbStartOffSet +
+            NET_MODEM_CURRENT_CELL_INFO_OFFSET_HSDPAAVAILABLEINCELL );
+
+        hsupaAvailableIndicator = aIsiMessage.Get8bit(
+            sbStartOffSet +
+            NET_MODEM_CURRENT_CELL_INFO_OFFSET_HSUPAAVAILABLEINCELL );
+
+        if ( hsdpaAvailableIndicator || hsupaAvailableIndicator )
+            {
+            networkInfo.iHsdpaAvailableIndicator = ETrue;
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetModemRegStatusInd, HSDPA Available Indicator (HSDPA or HSUPA available) = %d.", networkInfo.iHsdpaAvailableIndicator);
+OstTraceExt1( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_NETMODEMREGSTATUSIND, "CMmNetMessHandler::NetModemRegStatusInd, HSDPA Available Indicator (HSDPA or HSUPA available)=%hhu", networkInfo.iHsdpaAvailableIndicator );
+            }
+#endif // defined ( CASW_HSXPA_INDICATOR_SUPPORTED ) || defined ( INTERNAL_TESTING_CASW_HSXPA_INDICATOR_SUPPORT )
+        }
+
+    sbStartOffSet = 0;
+
+    TUint8 registrationStatus( 0 );
+    TInt retValue( ExtractNetworkRegistrationStatus(
+        aIsiMessage,
+        operatorCode,
+        registrationStatus,
+        sbStartOffSet ) );
+
+    if ( KErrNone == retValue )
+        {
+        RMobilePhone::TMobilePhoneRegistrationStatus regStatus;
+
+        // Map the selection mode to symbian values.
+        MapNWAndRegStatus(
+            registrationStatus,
+            regStatus,
+            networkInfo.iStatus );
+
+        // Get network selection mode. Will be handled after CAUSE EXTENSION
+        // handling.
+        TUint8 networkSelectionMode( aIsiMessage.Get8bit(
+            sbStartOffSet +
+            NET_MODEM_REG_INFO_COMMON_OFFSET_NETWORKSELECTIONMODE ) );
+
+        sbStartOffSet = 0;
+        // Check whether NET_MODEM_CAUSE_EXTENSION subblock exists and get
+        // the GSM specific error code from there.
+        if ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+            ISI_HEADER_SIZE + SIZE_NET_MODEM_REG_STATUS_IND,
+            NET_MODEM_CAUSE_EXTENSION,
+            EIsiSubBlockTypeId8Len8,
+            sbStartOffSet ) )
+            {
+            // Get the gsm specific error code.
+            TUint8 successCode ( aIsiMessage.Get8bit(
+                sbStartOffSet +
+                NET_MODEM_CAUSE_EXTENSION_OFFSET_REJECTCODE ) );
+
+            // Map ISA error to Symbian values.
+            retValue = CMmStaticUtility::CSCauseToEpocError(
+                PN_MODEM_NETWORK,
+                KTsyNetCauseGsm,
+                successCode );
+            }
+
+        // Pack the data for sending to the manager.
+        dataPackage.PackData( &regStatus, &networkInfo.iStatus );
+        // Inform the manager that the network selection mode has changed.
+        iMessageRouter->Complete(
+            EMobilePhoneNotifyNetworkRegistrationStatusChange,
+            &dataPackage,
+            retValue );
+
+        // Latest network selection mode saved and it will be used later,
+        // when making NET_SET_REQuest.
+        iSelectionMethod = networkSelectionMode;
+
+        RMobilePhone::TMobilePhoneNetworkSelectionV1 newSelection;
+
+        // Map the selection mode.
+        MapNWSelectionMode( networkSelectionMode, newSelection );
+
+        // Pack the data for sending to the manager.
+        dataPackage.PackData( &newSelection );
+        // Inform the manager that the network selection mode has changed.
+        iMessageRouter->Complete(
+            EMobilePhoneNotifyNetworkSelectionSettingChange,
+            &dataPackage,
+            retValue );
+
+        // Check registration status. If phone is registered some network
+        // then get correct operator name to show.
+        //
+        // Otherwise complete EMobilePhoneNotifyCurrentNetworkChange without
+        // operator names.
+        if ( ( NET_REG_STATUS_HOME == registrationStatus )
+            || ( NET_REG_STATUS_ROAM == registrationStatus ) )
+            {
+            // Get correct name to show.
+            iNetOperatorNameHandler->GetOperatorName(
+                campedInHplmn,
+                networkType,
+                operatorCode,
+                locationArea,
+                networkInfo );
+            }
+        else
+            {
+            // Phone is not registered to any network.
+            // Complete EMobilePhoneNotifyCurrentNetworkChange without
+            // operator names.
+            CompleteMobilePhoneNotifyCurrentNetworkChange(
+                locationArea,
+                networkInfo );
+            }
+        }
+    else
+        {
+        // No NET_MODEM_REG_INFO_COMMON subblock found,
+        // handling of message ends.
+
+        // Continue handling queued messages.
+        ContinueHandlingNetModemRegStatusMessages();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetModemRegStatusGetReq
+// Called by ExtFuncL to construct a NET_MODEM_REG_STATUS_GET_REQ ISI
+// message and send it to Phonet.
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::NetModemRegStatusGetReq
+        (
+        TUint8 aTransactionId // Transaction id
+        ) const
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetModemRegStatusGetReq");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETMODEMREGSTATUSGETREQ, "CMmNetMessHandler::NetModemRegStatusGetReq" );
+
+    // Data buffer length 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() );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetModemAvailableGetReq
+// Called by ExtFuncL to construct a NET_MODEM_AVAILABLE_GET_REQ ISI message
+// and send it to Phonet.
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::NetModemAvailableGetReq
+        (
+        TUint8 aTransactionId // Transaction id
+        ) const
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetModemAvailableGetReq");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETMODEMAVAILABLEGETREQ, "CMmNetMessHandler::NetModemAvailableGetReq" );
+
+    // Append data for ISI message. Has room for mode, num of subBlocks
+    // and NET_MODEM_GSM_BAND_INFO sb.
+    TBuf8<2 + SIZE_NET_MODEM_GSM_BAND_INFO> netModemAvailableGetReq;
+    netModemAvailableGetReq.Append( NET_MANUAL_SEARCH );
+
+    // 1 subBlock
+    netModemAvailableGetReq.Append( 1 );
+
+    // Data buffer for net gsm band info sb.
+    TBuf8<SIZE_NET_MODEM_GSM_BAND_INFO> netModemGsmBandInfoBuf( 0 );
+
+    TIsiSubBlock netModemGsmBandInfoSb(
+        netModemGsmBandInfoBuf,
+        NET_MODEM_GSM_BAND_INFO,
+        EIsiSubBlockTypeId8Len8 );
+
+    netModemGsmBandInfoBuf.Append( NET_GSM_BAND_ALL_SUPPORTED_BANDS );
+
+    netModemAvailableGetReq.Append( netModemGsmBandInfoSb.CompleteSubBlock() );
+
+    return iPhoNetSender->Send(
+        PN_MODEM_NETWORK,
+        aTransactionId,
+        NET_MODEM_AVAILABLE_GET_REQ,
+        netModemAvailableGetReq );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetModemAvailableGetRespL
+// Breaks a NET_MODEM_AVAILABLE_GET_RESP ISI-message.
+// Creates a CMobilePhoneNetworkListV2 with the information of the ISI and
+// completes EMobilePhoneGetDetectedNetworksV2Phase1 to SOS layer.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetModemAvailableGetRespL
+        (
+        const TIsiReceiveC& aIsiMessage
+        ) const
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetModemAvailableGetRespL");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETMODEMAVAILABLEGETRESPL, "CMmNetMessHandler::NetModemAvailableGetRespL" );
+
+    // Check the success of the operation.
+    TUint8 successCode( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + NET_MODEM_AVAILABLE_GET_RESP_OFFSET_SUCCESSCODE ) );
+
+    TUint8 nbOfSubBlocks( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + NET_MODEM_AVAILABLE_GET_RESP_OFFSET_SUBBLOCKCOUNT ) );
+
+    // Check if we have sub blocks in the message.
+    if ( 0 < nbOfSubBlocks && NET_CAUSE_OK == successCode )
+        {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetModemAvailableGetRespL - Success case");
+OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_NETMODEMAVAILABLEGETRESPL, "CMmNetMessHandler::NetModemAvailableGetRespL - Success case" );
+
+        // Handle NET_MODEM_AVAILABLE_GET_RESP ISI-message success case.
+        iNetOperatorNameHandler->HandleManualSearchSuccessCaseL( aIsiMessage );
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetModemAvailableGetRespL - Error case");
+OstTrace0( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_NETMODEMAVAILABLEGETRESPL, "CMmNetMessHandler::NetModemAvailableGetRespL - Error case" );
+
+        TInt epocError( KErrGeneral );
+
+        if ( !iSearchNetworkCancelIssued &&
+            NET_CAUSE_REQUEST_INTERRUPTED == successCode )
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetModemAvailableGetRespL - Error case - MT call during network search");
+OstTrace0( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_NETMODEMAVAILABLEGETRESPL, "CMmNetMessHandler::NetModemAvailableGetRespL - Error case - MT call during network search" );
+            // In case of MT call during network search, NET server can
+            // interrupt network search before client has chance to cancel
+            // the search request. Thus in this case we need to convert the
+            // error to more suitable like KErrAbort.
+            epocError = CMmStaticUtility::EpocErrorCode(
+                KErrAbort,
+                KErrGsmNetCauseCallActive );
+            }
+        else
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetModemAvailableGetRespL - Error case - Cancel or Other error");
+OstTrace0( TRACE_NORMAL, DUP4_CMMNETMESSHANDLER_NETMODEMAVAILABLEGETRESPL, "CMmNetMessHandler::NetModemAvailableGetRespL - Error case - Cancel or Other error" );
+            // If some other error or cancel is called, then complete
+            // with mapped error code.
+            epocError = CMmStaticUtility::CSCauseToEpocError(
+                PN_MODEM_NETWORK,
+                KTsyNetCauseCommon,
+                successCode );
+            }
+
+        // Complete client request.
+        iMessageRouter->Complete(
+            EMobilePhoneGetDetectedNetworksV2Phase1,
+            epocError );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetAvailableCancelReq
+// Called by ExtFuncL to construct a NET_AVAILABLE_CANCEL_REQ ISI
+// message and send it to Phonet. Enables the flag iSearchNetworkCancelIssued.
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::NetAvailableCancelReq
+        (
+        TUint8 aTransactionId // Transaction id
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetAvailableCancelReq");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETAVAILABLECANCELREQ, "CMmNetMessHandler::NetAvailableCancelReq" );
+
+    // Set the network search flag to ETrue.
+    iSearchNetworkCancelIssued = ETrue;
+
+    // Data buffer length is 2. Has room for transaction id and message id.
+    TBuf8<2> data;
+    data.Append( aTransactionId );
+    data.Append( NET_AVAILABLE_CANCEL_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() );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetAvailableCancelResp
+// Breaks a NET_AVAILABLE_CANCEL_RESP ISI. Completes
+// EMobilePhoneGetDetectedNetworksCancel to SOS layer. Disables the
+// iSearchNetworkCancelIssued flag.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetAvailableCancelResp
+        (
+        const TIsiReceiveC& aIsiMessage
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetAvailableCancelResp");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETAVAILABLECANCELRESP, "CMmNetMessHandler::NetAvailableCancelResp" );
+
+    // Get success code
+    TUint8 successCode( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + NET_AVAILABLE_CANCEL_RESP_OFFSET_SUCCESSCODE ) );
+
+    // Convert the error to Epoc Error
+    TInt error( CMmStaticUtility::CSCauseToEpocError(
+        PN_MODEM_NETWORK,
+        KTsyNetCauseCommon,
+        successCode ) );
+
+    iMessageRouter->Complete(
+        EMobilePhoneGetDetectedNetworksCancel,
+        error );
+
+    // The cancel has been completed,
+    // therefore set the cancel issued flag off.
+    iSearchNetworkCancelIssued = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetSetReq
+// Called by ExtFuncL to construct a NET_SET_REQ ISI
+// message and send it to Phonet. The correct selection mode is choosen
+// according to previous network selections. The network is selected by MNC/MCC
+// codes and not by index.
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::NetSetReq
+        (
+        TUint8 aTransactionId,
+        TBool aIsManual,
+        const TOperatorCode& aMnc,
+        const TCountryCode& aMcc
+        ) const
+    {
+    // NW selection mode: Manual or reselection. Initialise variable.
+    TUint8 networkSelectionMode( NET_SELECT_MODE_NO_SELECTION );
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetSetReq -- Manual NW selection(T/F): %d", aIsManual);
+OstTrace1( TRACE_NORMAL, CMMNETMESSHANDLER_NETSETREQ, "CMmNetMessHandler::NetSetReq;aIsManual=%d", aIsManual );
+
+TFLOGSTRING3("TSY: CMmNetMessHandler::NetSetReq -- MNC: %S MCC: %S", &aMnc, &aMcc);
+OstTraceExt2( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_NETSETREQ, "CMmNetMessHandler::NetSetReq;aMnc=%S;aMcc=%S", aMnc, aMcc );
+
+    // If NW selection mode is changed from manual to automatic
+    if ( NET_SELECT_MODE_MANUAL == iSelectionMethod
+        && !aIsManual )
+        {
+        networkSelectionMode = NET_SELECT_MODE_AUTOMATIC;
+        }
+    // If NW selection is set from automatic to automatic
+    else if ( !aIsManual )
+        {
+        networkSelectionMode = NET_SELECT_MODE_USER_RESELECTION;
+        }
+    // If NW selection mode is set manual
+    else if ( aIsManual )
+        {
+        networkSelectionMode = NET_SELECT_MODE_MANUAL;
+        }
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetSetReq -- NW Selection Mode: %d", networkSelectionMode);
+OstTraceExt1( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_NETSETREQ, "CMmNetMessHandler::NetSetReq;networkSelectionMode=%hhu", networkSelectionMode );
+
+    // Append data for ISI message.
+    // Has room for registered in another protocol, num of subBlocks,
+    // net operator info common sb and net gsm operator info sb.
+    TBuf8<2 + SIZE_NET_OPERATOR_INFO_COMMON + SIZE_NET_MODEM_GSM_OPERATOR_INFO>
+        netSetReqData;
+
+    // Registered in another protocol
+    // if network mode has just changed, this should be 1.
+    // GSM always 0.
+    netSetReqData.Append( KDefaultRegInAnotherNwGsm );
+
+    // Add number of Subblock
+    if ( NET_SELECT_MODE_USER_RESELECTION != networkSelectionMode )
+        {
+        // 2 subBlocks
+        netSetReqData.Append( 2 );
+        }
+    else
+        {
+        // 1 subBlock
+        netSetReqData.Append( 1 );
+        }
+
+    if ( NET_SELECT_MODE_USER_RESELECTION != networkSelectionMode )
+        {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetSetReq -- Adding NET_MODEM_GSM_OPERATOR_INFO SubBlock");
+OstTrace0( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_NETSETREQ, "CMmNetMessHandler::NetSetReq, Adding NET_MODEM_GSM_OPERATOR_INFO SubBlock" );
+        // We add NET_MODEM_GSM_OPERATOR_INFO subblock to ISI.
+        // The information about the Band is not send trough MM ETEL Api, thus
+        // the value is set to unknown
+
+        // Size is 3 bytes for operator code
+        TBuf8<3> operatorCode;
+        CMmStaticUtility::FormOperatorCode( operatorCode, &aMnc, &aMcc );
+
+        // Data buffer for NET_MODEM_GSM_OPERATOR_INFO sb.
+        TBuf8<SIZE_NET_MODEM_GSM_OPERATOR_INFO> netModemGsmOperatorInfoBuf;
+        TIsiSubBlock netModemGsmOperatorInfoSb( netModemGsmOperatorInfoBuf,
+            NET_MODEM_GSM_OPERATOR_INFO,
+            EIsiSubBlockTypeId8Len8 );
+
+        netModemGsmOperatorInfoBuf.Append( operatorCode );
+        netModemGsmOperatorInfoBuf.Append( NET_GSM_BAND_INFO_NOT_AVAIL );
+
+        netSetReqData.Append( netModemGsmOperatorInfoSb.CompleteSubBlock() );
+        }
+
+TFLOGSTRING("TSY: CMmNetMessHandler::NetSetReq -- Adding NET_OPERATOR_INFO_COMMON SubBlock");
+OstTrace0( TRACE_NORMAL, DUP4_CMMNETMESSHANDLER_NETSETREQ, "CMmNetMessHandler::NetSetReq, Adding NET_OPERATOR_INFO_COMMON SubBlock" );
+
+    // Data buffer for net operator info common sb.
+    TBuf8<SIZE_NET_OPERATOR_INFO_COMMON> operatorInfoCommonBuf;
+    TIsiSubBlock operatorInfoCommonSb( operatorInfoCommonBuf,
+        NET_OPERATOR_INFO_COMMON,
+        EIsiSubBlockTypeId8Len8 );
+
+    operatorInfoCommonBuf.Append( networkSelectionMode );
+    operatorInfoCommonBuf.Append( NET_INDEX_NOT_USED );
+    netSetReqData.Append( operatorInfoCommonSb.CompleteSubBlock() );
+
+    return iPhoNetSender->Send(
+        PN_MODEM_NETWORK,
+        aTransactionId,
+        NET_SET_REQ,
+        netSetReqData );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetSetCancelReq
+// Called by ExtFuncL to construct a NET_SET_CANCEL_REQ ISI
+// message and send it to Phonet. Enables the flag iSelectNetworkCancelIssued.
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::NetSetCancelReq
+        (
+        TUint8 aTransactionId
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetSetCancelReq");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETSETCANCELREQ, "CMmNetMessHandler::NetSetCancelReq" );
+
+    // Set the network select flag to ETrue.
+    // This flag is checked in NetSetCancelResp.
+    iSelectNetworkCancelIssued = ETrue;
+
+    // Data buffer length is 2.
+    // Has room for transaction id and message id.
+    TBuf8<2> data;
+    data.Append( aTransactionId );
+    data.Append( NET_SET_CANCEL_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() );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetSetCancelResp
+// Breaks a NET_SET_CANCEL_RESP ISI-message and completes
+// EMobilePhoneSelectNetworkCancel to SOS Layer. Disables the
+// iSelectNetworkCancelIssued flag.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetSetCancelResp
+        (
+        const TIsiReceiveC& aIsiMessage
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetSetCancelResp");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETSETCANCELRESP, "CMmNetMessHandler::NetSetCancelResp" );
+
+    // Get success code
+    TUint8 successCode( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + NET_SET_CANCEL_RESP_OFFSET_SUCCESSCODE ) );
+
+    // Get correct error code from utility
+    TInt errorCode( CMmStaticUtility::CSCauseToEpocError(
+        PN_MODEM_NETWORK,
+        KTsyNetCauseCommon,
+        successCode ) );
+
+    iMessageRouter->Complete( EMobilePhoneSelectNetworkCancel, errorCode );
+
+    // The cancel has been completed,
+    // therefore set the cancel issued flag off.
+    iSelectNetworkCancelIssued = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetRatInd
+// Breaks a NET_RAT_IND ISI-message.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetRatInd
+        (
+        const TIsiReceiveC& aIsiMessage
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRatInd");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETRATIND, "CMmNetMessHandler::NetRatInd" );
+
+    // Call NetRatResp to do the common job
+    NetRatResp( aIsiMessage );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetRatReq
+// Called by ExtFuncL to construct a NET_RAT_REQ ISI
+// message and send it to Phonet.
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::NetRatReq
+        (
+        TUint8 /* aTransactionId */
+        ) const
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRatReq");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETRATREQ, "CMmNetMessHandler::NetRatReq" );
+
+    // Message data size is 1
+    TBuf8<1> data;
+
+    // we need to know the current RAT
+    data.Append( NET_CURRENT_RAT );
+
+    // Create the message. NOTE: the transId is set to DC because of
+    // packet data is listening for the response to this message with that
+    // transId the CMmNetMessHandler doesn't make transaction ID checking
+    // anymore so this it's value is not relevant.
+    // Message sent via Phonet and return.
+    return iPhoNetSender->Send( PN_MODEM_NETWORK, 0xDC, NET_RAT_REQ, data );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetRatResp
+// Breaks a NET_RAT_RESP ISI-message. Fetches the access technnology
+// and sets the value in iNetworkMode and iNetworkAccess. Fetches the
+// network mode and completes EMobilePhoneNotifyModeChange to SOS Tsy.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetRatResp
+        (
+        const TIsiReceiveC& aIsiMessage
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRatResp");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETRATRESP, "CMmNetMessHandler::NetRatResp" );
+    TUint sbStartOffSet( 0 );
+
+    // NET_RAT_INFO sub block
+    TInt retValue( aIsiMessage.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_NET_RAT_RESP,
+        NET_RAT_INFO,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) );
+
+    // Check if NET_RAT_INFO sub block is present
+    if( KErrNone == retValue )
+        {
+        // Get ratName
+        TUint8 ratName( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_RAT_INFO_OFFSET_RATNAME ) );
+
+        switch ( ratName )
+            {
+            case NET_GSM_RAT:
+                {
+                iNetworkMode = RMobilePhone::ENetworkModeGsm;
+                iNetworkAccess = RMobilePhone::ENetworkAccessGsm;
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRatResp - network mode GSM");
+OstTrace0( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_NETRATRESP, "CMmNetMessHandler::NetRatResp - network mode GSM" );
+                break;
+                }
+            case NET_UMTS_RAT:
+                {
+                iNetworkMode = RMobilePhone::ENetworkModeWcdma;
+                iNetworkAccess = RMobilePhone::ENetworkAccessUtran;
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRatResp - network mode UMTS");
+OstTrace0( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_NETRATRESP, "CMmNetMessHandler::NetRatResp - network mode UMTS" );
+                break;
+                }
+            default:
+                {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRatResp. default network mode");
+OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_NETRATRESP, "CMmNetMessHandler::NetRatResp, default network mode" );
+                iNetworkMode = RMobilePhone::ENetworkModeUnknown;
+                iNetworkAccess = RMobilePhone::ENetworkAccessUnknown;
+                break;
+                }
+            }
+
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &iNetworkMode );
+
+        iMessageRouter->Complete(
+            EMobilePhoneNotifyModeChange,
+            &dataPackage,
+            KErrNone );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetNetworkSelectModeSetReq
+// Called by ExtFuncL to construct a NET_NETWORK_SELECT_MODE_SET_REQ ISI
+// message and send it to Phonet.
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::NetNetworkSelectModeSetReq
+        (
+        // Transaction id
+        TUint8 aTransactionId,
+        // Network selection
+        const RMobilePhone::TMobilePhoneNetworkSelectionV1& aNetworkSelection
+        ) const
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetNetworkSelectModeSetReq");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETNETWORKSELECTMODESETREQ, "CMmNetMessHandler::NetNetworkSelectModeSetReq" );
+
+    TInt ret( KErrNone );
+
+    // Check the selection Mode from the selection structure
+    TUint8 networkSelectionMode( NET_SELECT_MODE_UNKNOWN );
+
+    if ( RMobilePhone::ENetworkSelectionAutomatic ==
+        aNetworkSelection.iMethod )
+        {
+        networkSelectionMode = NET_SELECT_MODE_AUTOMATIC;
+        }
+    else if ( RMobilePhone::ENetworkSelectionManual ==
+        aNetworkSelection.iMethod )
+        {
+        networkSelectionMode = NET_SELECT_MODE_MANUAL;
+        }
+    else
+        {
+        // All other settings are not supported
+        ret = KErrNotSupported;
+        }
+
+    // Continue only if mode is correct
+    if ( KErrNone == ret )
+        {
+        // Create network select mode set request
+        // Message data size is 1 (network selection mode)
+        TBuf8<1> data;
+        data.Append( networkSelectionMode );
+
+        // Send message via Phonet
+        ret = iPhoNetSender->Send(
+            PN_MODEM_NETWORK,
+            aTransactionId,
+            NET_NETWORK_SELECT_MODE_SET_REQ,
+            data );
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetNetworkSelectModeSetResp
+// Breaks a NET_NETWORK_SELECT_MODE_SET_RESP ISI-message and completes
+// EMobilePhoneSetNetworkSelectionSetting to SOS layer
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetNetworkSelectModeSetResp
+        (
+        const TIsiReceiveC& aIsiMessage
+        ) const
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetNetworkSelectModeSetResp");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETNETWORKSELECTMODESETRESP, "CMmNetMessHandler::NetNetworkSelectModeSetResp" );
+
+    // Get success code
+    TUint8 successCode( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE +
+        NET_NETWORK_SELECT_MODE_SET_RESP_OFFSET_SUCCESSCODE ) );
+
+    // Convert the error to Epoc Error
+    TInt epocError( CMmStaticUtility::CSCauseToEpocError(
+        PN_MODEM_NETWORK,
+        KTsyNetCauseCommon,
+        successCode ) );
+
+    iMessageRouter->Complete(
+        EMobilePhoneSetNetworkSelectionSetting,
+        epocError );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetRssiGetReq
+// Constructs a NET_RSSI_GET_REQ ISI message and sends it to Phonet.
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::NetRssiGetReq() const
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRssiGetReq");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETRSSIGETREQ, "CMmNetMessHandler::NetRssiGetReq" );
+
+    // Data buffer length is 2 (message size minus transId, msgId)
+    TBuf8< SIZE_NET_RSSI_GET_REQ - 2 > reqData;
+    reqData.Append( NET_CS_GSM );            // CS type
+    reqData.Append( NET_CURRENT_CELL_RSSI ); // measurement type
+
+    return iPhoNetSender->Send(
+        PN_MODEM_NETWORK,
+        KNetTransId,
+        NET_RSSI_GET_REQ,
+        reqData );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetRssiGetResp
+// Breaks a NET_RSSI_GET_RESP ISI message and calls HandleRssi.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetRssiGetResp
+        (
+        const TIsiReceiveC& aIsiMessage
+        )
+    {
+    TUint8 successCode( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + NET_RSSI_GET_RESP_OFFSET_SUCCESSCODE ) );
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRssiGetResp, successcode=%d", successCode);
+OstTraceExt1( TRACE_NORMAL, CMMNETMESSHANDLER_NETRSSIGETRESP, "CMmNetMessHandler::NetRssiGetResp;successCode=%hhu", successCode );
+
+    if ( NET_CAUSE_OK == successCode )
+        {
+        TUint sbOffset( 0 );
+
+        if ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+            ISI_HEADER_SIZE + SIZE_NET_RSSI_GET_RESP,
+            NET_RSSI_CURRENT,
+            EIsiSubBlockTypeId8Len8,
+            sbOffset ) )
+            {
+            // Note: the unsigned value gathered from the ISI is percentages
+            TUint8 bars( aIsiMessage.Get8bit(
+                sbOffset + NET_RSSI_CURRENT_OFFSET_SIGNALBARS ) );
+
+            // Get RSSI in dBm with inverse sign
+            TUint8 rssiInDbm( aIsiMessage.Get8bit(
+                sbOffset + NET_RSSI_CURRENT_OFFSET_RSSIINDBM ) );
+
+            HandleRssi( bars, rssiInDbm );
+            }
+        } // No else, ignore missing RSSI data
+    // No else, ignore failed RSSI measurement
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetRssiInd
+// Breaks a NET_RSSI_IND ISI message and calls HandleRssi.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetRssiInd
+        (
+        const TIsiReceiveC& aIsiMessage
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRssiInd");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETRSSIIND, "CMmNetMessHandler::NetRssiInd" );
+
+    // Note: the unsigned value gathered from the ISI is percentages
+    TUint8 bars( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + NET_RSSI_IND_OFFSET_SIGNALSBAR ) );
+
+    // Get RSSI in dBm with inverse sign
+    TUint8 rssiInDbm( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + NET_RSSI_IND_OFFSET_RSSIINDBM ) );
+
+    HandleRssi( bars, rssiInDbm );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::HandleRssi
+// Completes EMobilePhoneNotifySignalStrengthChange to SOS layer
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::HandleRssi
+        (
+        TUint8 aBarsIsi, // Bar percentage (ISI value)
+        TUint8 aRSSIIsi // RSSI in dBm with inverse sign (ISI value)
+        ) const
+    {
+    TInt8 i;
+    TInt8 signalBars( 0 );
+
+    // Bar percentage (0-100%) is converted to number of signal strength bars
+    for ( i = KMaxSignalStrengthBars; i > 0; i-- )
+        {
+        if ( aBarsIsi >= netRssiLimitsTable[i-1] )
+            {
+            signalBars = i;
+            break;
+            }
+        }
+
+    // Copy RSSI in dBm into 32 bit integer
+    TInt32 rssiInDbm( aRSSIIsi );
+
+TFLOGSTRING3("TSY: CMmNetMessHandler::HandleRssi -- signalBars=%d rssiInDbm=%d", signalBars, aRSSIIsi);
+OstTraceExt2( TRACE_NORMAL, CMMNETMESSHANDLER_HANDLERSSI, "CMmNetMessHandler::HandleRssi;signalBars=%hhd;rssiInDbm=%hhu", signalBars, aRSSIIsi );
+
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &signalBars, &rssiInDbm );
+
+    iMessageRouter->Complete(
+        EMobilePhoneNotifySignalStrengthChange,
+        &dataPackage,
+        KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetTimeInd
+// Breaks a NET_TIME_IND ISI and completes EMobilePhoneNotifyNITZInfoChange
+// to SOS layer
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetTimeInd
+        (
+        const TIsiReceiveC& aIsiMessage
+        ) const
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetTimeInd");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETTIMEIND, "CMmNetMessHandler::NetTimeInd" );
+
+    TUint sbStartOffSet( 0 );
+
+    TInt ret( aIsiMessage.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_NET_TIME_IND,
+        NET_TIME_INFO,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) );
+
+    if ( KErrNone == ret )
+        {
+        // Get a year
+        TUint8 year( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_TIME_INFO_OFFSET_YEAR ) );
+        // Get a month
+        TUint8 month( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_TIME_INFO_OFFSET_MONTH ) );
+        // Get a day
+        TUint8 day( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_TIME_INFO_OFFSET_DAY ) );
+        // Get a hour
+        TUint8 hour( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_TIME_INFO_OFFSET_HOUR ) );
+        // Get a minute
+        TUint8 minute( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_TIME_INFO_OFFSET_MINUTE ) );
+        // Get a second
+        TUint8 second( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_TIME_INFO_OFFSET_SECOND ) );
+        // Get timezone
+        TUint8 timezone( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_TIME_INFO_OFFSET_TIMEZONE ) );
+        // Get daylight saving time (DTS)
+        TUint8 dst( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_TIME_INFO_OFFSET_DAYLIGHTSAVINGTIME ) );
+
+        // Symbian OS SDK: Using TDateTime
+        // When setting the day and month, subtract one because the ranges are
+        // offset from zero.
+        month--;
+        day--;
+        // Year value changing to four digits
+        const TInt KNitzYearOffset( 2000 ); // Adjusting the year value received
+        TInt totalYear; // Four digits year
+
+        totalYear = KNitzYearOffset + year;
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetTimeInd year: %d", totalYear );
+OstTrace1( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_NETTIMEIND, "CMmNetMessHandler::NetTimeInd;NetTimeInd year=%d", totalYear );
+
+        // NITZ information
+        RMobilePhone::TMobilePhoneNITZ timeDate;
+        // Default caps, will be updated below if not valid.
+        timeDate.iNitzFieldsUsed = KMmTsyNITZCaps;
+
+        // Use Set method instead of constructor as the constructor
+        // panics if data is incorrect. Set returns KErrGeneral in that case
+        TInt retValue( timeDate.Set(
+            totalYear,
+            ( TMonth )month,
+            day,
+            hour,
+            minute,
+            second,
+            0x00 ) ); // A micro second = 00
+
+        // Check result of set
+        if ( KErrNone != retValue )
+            {
+            // Set default values
+            timeDate.Set( 0x00, ( TMonth ) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 );
+            timeDate.iNitzFieldsUsed &= ~( RMobilePhone::KCapsTimeAvailable );
+            }
+        // If DST is valid, set it
+        if ( NET_DST_INFO_NOT_AVAIL != dst )
+            {
+            timeDate.iDST = dst;
+            }
+        // If not, reset DST and remove it from caps
+        else
+            {
+            timeDate.iDST = 0x00;
+            timeDate.iNitzFieldsUsed &= ~( RMobilePhone::KCapsDSTAvailable );
+            }
+
+        // If Time Zone is valid, set it.
+        // If the time zone is invalid or time zone is unknown,
+        // all bits are set to 1 (including B6).
+        if ( 0xFF != timezone )
+            {
+            timeDate.iTimeZone = timezone;
+            }
+        // If not, reset Time Zone and remove it from caps
+        else
+            {
+            timeDate.iTimeZone = 0x00;
+            timeDate.iNitzFieldsUsed &=
+                ~( RMobilePhone::KCapsTimezoneAvailable );
+            }
+
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &timeDate );
+
+        iMessageRouter->Complete(
+            EMobilePhoneNotifyNITZInfoChange,
+            &dataPackage,
+            retValue );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::MapNWAndRegStatus
+// Maps an ISA network registration status into a TMobilePhoneRegistrationStatus
+// and a TMobilePhoneNetworkStatus symbian types
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::MapNWAndRegStatus
+        (
+        TUint8 aISARegistrationStatus, // Isa network registration status
+        RMobilePhone::TMobilePhoneRegistrationStatus& aRegStatus, // Registration status
+        RMobilePhone::TMobilePhoneNetworkStatus& aNWStatus // Network status
+        )
+    {
+TFLOGSTRING2("TSY: CMmNetMessHandler::MapNWAndRegStatus. ISARegistrationStatus:%d", aISARegistrationStatus);
+OstTrace1( TRACE_NORMAL, CMMNETMESSHANDLER_MAPNWANDREGSTATUS, "CMmNetMessHandler::MapNWAndRegStatus;aRegStatus=%d", aRegStatus );
+
+     switch ( aISARegistrationStatus )
+        {
+        // Registered home
+        case NET_REG_STATUS_HOME:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusCurrent;
+            aRegStatus = RMobilePhone::ERegisteredOnHomeNetwork;
+            break;
+            }
+        // Registered roaming
+        case NET_REG_STATUS_ROAM:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusCurrent;
+            aRegStatus = RMobilePhone::ERegisteredRoaming;
+            break;
+            }
+        // Not in service
+        case NET_REG_STATUS_NOSERV:
+        case NET_REG_STATUS_NOSERV_SEARCHING:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusUnknown;
+            aRegStatus = RMobilePhone::ENotRegisteredSearching;
+            break;
+            }
+        // Not is service and not searching
+        case NET_REG_STATUS_NOSERV_NOTSEARCHING:
+        case NET_REG_STATUS_NSPS:
+        case NET_REG_STATUS_NSPS_NO_COVERAGE:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusUnknown;
+            aRegStatus = RMobilePhone::ENotRegisteredNoService;
+            break;
+            }
+        // Not in service and no sim card
+        case NET_REG_STATUS_NOSERV_NOSIM:
+        case NET_REG_STATUS_NOSERV_SIM_REJECTED_BY_NW:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusUnknown;
+            aRegStatus = RMobilePhone::ERegistrationDenied;
+            break;
+            }
+        // Power off
+        case NET_REG_STATUS_POWER_OFF:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusUnknown;
+            aRegStatus = RMobilePhone::ERegistrationUnknown;
+            break;
+            }
+        // Defaul case
+        default:
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::MapNWAndRegStatus. default registration status");
+OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_MAPNWANDREGSTATUS, "CMmNetMessHandler::MapNWAndRegStatus, default registration status" );
+            aNWStatus = RMobilePhone::ENetworkStatusUnknown;
+            aRegStatus = RMobilePhone::ERegistrationUnknown;
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::MapNWSelectionMode
+// Maps a ISA Network Selection mode into a TMobilePhoneNetworkSelectionV1
+// Symbian type
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::MapNWSelectionMode
+        (
+        TUint8 aISASelectionMode, // Isa network selection mode
+        RMobilePhone::TMobilePhoneNetworkSelectionV1& aSelectionMode // Network selection mode
+        )
+    {
+TFLOGSTRING2("TSY: CMmNetMessHandler::MapNWSelectionMode. ISA selectionmode:%d", aISASelectionMode);
+OstTraceExt1( TRACE_NORMAL, CMMNETMESSHANDLER_MAPNWSELECTIONMODE, "CMmNetMessHandler::MapNWSelectionMode;aISASelectionMode=%hhu", aISASelectionMode );
+
+    if ( NET_SELECT_MODE_AUTOMATIC == aISASelectionMode )
+        {
+        aSelectionMode.iMethod = RMobilePhone::ENetworkSelectionAutomatic;
+        }
+    else if ( NET_SELECT_MODE_MANUAL == aISASelectionMode )
+        {
+        aSelectionMode.iMethod = RMobilePhone::ENetworkSelectionManual;
+        }
+    else
+        {
+        aSelectionMode.iMethod = RMobilePhone::ENetworkSelectionUnknown;
+        }
+
+    // This is gsm specific function, set the default values for the CDMA
+    // specific parameters
+    aSelectionMode.iBandClass = RMobilePhone::ENetworkBandClassUnknown;
+    aSelectionMode.iOperationMode = RMobilePhone::ENetworkOperationUnknown;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::MapOperatorAndCountryCode
+// Maps a ISA operator code into a TMobilePhoneNetworkIdentity symbian type
+// -----------------------------------------------------------------------------
+//
+TBool CMmNetMessHandler::MapOperatorAndCountryCode
+        (
+        const TDesC8& aIsaOperatorAndCountryCode,
+        RMobilePhone::TMobilePhoneNetworkIdentity& aOperatorCode,
+        RMobilePhone::TMobilePhoneNetworkCountryCode& aCountryCode,
+        TInt aMNCLength
+        )
+    {
+    TFLOGSTRING2("TSY: CMmNetMessHandler::MapOperatorAndCountryCode - MNCLenght: %d",
+        aMNCLength);
+OstTrace1( TRACE_NORMAL, CMMNETMESSHANDLER_MAPOPERATORANDCOUNTRYCODE, "CMmNetMessHandler::MapOperatorAndCountryCode;aMNCLength=%d", aMNCLength );
+
+    // Country code mapping
+    TUint16 mcc1( 0 );
+    TUint16 mcc2( 0 );
+    TUint16 mcc3( 0 );
+
+    // Get the country code
+    CMmStaticUtility::GetMccCodes(
+        aIsaOperatorAndCountryCode,
+        &mcc1,
+        &mcc2,
+        &mcc3 );
+
+    if ( mcc1 < 10 ) //max one digit
+        {
+        aCountryCode.AppendNum( mcc1, EDecimal );
+        }
+    if ( mcc2 < 10 ) //max one digit
+        {
+        aCountryCode.AppendNum( mcc2, EDecimal );
+        }
+    if ( mcc3 < 10 ) //max one digit
+        {
+        aCountryCode.AppendNum( mcc3, EDecimal );
+        }
+
+    // Operator code mapping
+    TUint16 mnc1( 0 );
+    TUint16 mnc2( 0 );
+    TUint16 mnc3( 0 );
+
+    TBool networkCodeMapped( EFalse );
+
+    // Get the network code
+    CMmStaticUtility::GetMncCodes( aIsaOperatorAndCountryCode,
+        &mnc1,
+        &mnc2,
+        &mnc3 );
+
+   if ( mnc1 < 10 ) // Max one digit
+        {
+        aOperatorCode.AppendNum( mnc1, EDecimal );
+        }
+    if ( mnc2 < 10 && aMNCLength != 1 )
+        {
+        aOperatorCode.AppendNum( mnc2, EDecimal );
+        }
+    if ( mnc3 < 10 && aMNCLength != 1 && aMNCLength != 2 )
+        {
+        aOperatorCode.AppendNum( mnc3, EDecimal );
+        }
+    // This added due some operators in USA and Canada sends wrong
+    // MNC codes, using the F value when it should be 0
+    // e.g. anyone sends 17F instead of 170.
+    else if ( mnc3 == 0x0F )
+        {
+        // Put mcc codes together
+        TUint16 countryCode( (TUint16) ( 100 * mcc1 ) + ( 10 * mcc2 ) + mcc3 );
+
+        // Check if the country code is USA (310) or Canada (302)
+        if ( countryCode == 310 ||
+            countryCode == 302 )
+            {
+            // Add 0 into the end
+            aOperatorCode.AppendNum( 0, EDecimal );
+
+            networkCodeMapped = ETrue;
+            }
+        }
+    return networkCodeMapped;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::MapNwStatus
+// Maps a ISA network status value into a TMobilePhoneNetworkStatus Symbian
+// value.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::MapNwStatus
+        (
+        TUint8 aISANetworkStatus, // Isa network status value
+        RMobilePhone::TMobilePhoneNetworkStatus& aNWStatus // Network status
+        )
+    {
+TFLOGSTRING2("TSY: CMmNetMessHandler::MapNwStatus. ISANetworkStatus:%d", aISANetworkStatus);
+OstTraceExt1( TRACE_NORMAL, CMMNETMESSHANDLER_MAPNWSTATUS, "CMmNetMessHandler::MapNwStatus;aISANetworkStatus=%hhu", aISANetworkStatus );
+
+     switch ( aISANetworkStatus )
+        {
+        case NET_OPER_STATUS_UNKNOWN:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusUnknown;
+            break;
+            }
+        case NET_OPER_STATUS_AVAILABLE:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusAvailable;
+            break;
+            }
+        case NET_OPER_STATUS_CURRENT:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusCurrent;
+            break;
+            }
+        case NET_OPER_STATUS_FORBIDDEN:
+            {
+            aNWStatus = RMobilePhone::ENetworkStatusForbidden;
+            break;
+            }
+        default:
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::MapNwStatus. mapped default network status");
+OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_MAPNWSTATUS, "CMmNetMessHandler::MapNwStatus, mapped default network status" );
+            aNWStatus = RMobilePhone::ENetworkStatusUnknown;
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetCipheringInd
+// Breaks a NET_CIPHERING_IND ISI and completes
+// EMobileCallNotifyPrivacyConfirmation to SOS layer
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetCipheringInd
+        (
+        const TIsiReceiveC& aIsiMessage
+        ) const
+    {
+    RMobilePhone::TMobilePhonePrivacy status =
+        RMobilePhone::EPrivacyUnspecified;
+    RMobilePhone::TMobilePhoneNetworkSecurity securityLevel =
+        RMobilePhone::ECipheringOff;
+
+    TUint8 cipheringStatus( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + NET_CIPHERING_IND_OFFSET_CIPHERINGSTATUS ) );
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetCipheringInd. CipheringStatus:%d", cipheringStatus);
+OstTraceExt1( TRACE_NORMAL, CMMNETMESSHANDLER_NETCIPHERINGIND, "CMmNetMessHandler::NetCipheringInd;cipheringStatus=%hhu", cipheringStatus );
+
+    switch( cipheringStatus )
+        {
+        case NET_CIPHERING_INDICATOR_OFF:
+            {
+            status = RMobilePhone::EPrivacyOff;
+            //securityLevel is already initialized
+            break;
+            }
+        case NET_CIPHERING_INDICATOR_ON:
+            {
+            status = RMobilePhone::EPrivacyOn;
+            securityLevel = RMobilePhone::ECipheringGSM;
+            break;
+            }
+        default:
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetCipheringInd. no ciphering status");
+OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_NETCIPHERINGIND, "CMmNetMessHandler::NetCipheringInd, no ciphering status" );
+            break;
+            }
+        }
+
+    CMmDataPackage package;
+    package.PackData( &status );
+
+    iMessageRouter->Complete(
+        EMobileCallNotifyPrivacyConfirmation,
+        &package,
+        KErrNone );
+
+    package.PackData( &securityLevel );
+
+    iMessageRouter->Complete(
+        EMobilePhoneNotifyNetworkSecurityLevelChange,
+        &package,
+        KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::NetRadioInfoInd
+// Breaks a NET_RADIO_INFO_IND ISI message. Saves UTRAN radio state information
+// and completes NotifyCurrentNetworkChange if state changed.
+// Location info is invalid (=empty) during Cell_DCH state.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::NetRadioInfoInd
+        (
+        const TIsiReceiveC& aIsiMessage    // Received ISI message
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRadioInfoInd");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd" );
+
+    TBool oldCell_DCH = iCell_DCH;
+
+    // Find NET_UTRAN_RADIO_INFO sub block
+    TUint sbStartOffSet( 0 );
+
+    TInt err( aIsiMessage.FindSubBlockOffsetById(
+        ISI_HEADER_SIZE + SIZE_NET_RADIO_INFO_IND,
+        NET_UTRAN_RADIO_INFO,
+        EIsiSubBlockTypeId8Len8,
+        sbStartOffSet ) );
+
+    if ( KErrNone == err )
+        {
+        TUint8 radioState( aIsiMessage.Get8bit(
+            sbStartOffSet + NET_UTRAN_RADIO_INFO_OFFSET_RADIOSTATE ) );
+
+        // iCell_DCH is true if and only if UTRAN radio state is Cell_DCH
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRadioInfoInd, UTRAN radio state=%d.", radioState);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd;UTRAN radioState=%hhu", radioState );
+
+        iCell_DCH = ( ( NET_UTRAN_RADIO_CELL_DCH == radioState ) ?
+            ETrue : EFalse );
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmNetMessHandler::NetRadioInfoInd, no UTRAN radio state info.");
+OstTrace0( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd, no UTRAN radio state info" );
+        iCell_DCH = EFalse;
+        }
+
+    // State changed?
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRadioInfoInd, iCell_DCH = %d.", iCell_DCH);
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRadioInfoInd, oldCell_DCH = %d.", oldCell_DCH);
+OstTrace1( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd;oldCell_DCH=%d", oldCell_DCH );
+
+    if ( iCell_DCH != oldCell_DCH )
+        {
+        if ( iCell_DCH )
+            {
+            // State change Idle ==> Cell_DCH.
+            // Complete with empty location info.
+            RMobilePhone::TMobilePhoneLocationAreaV1 location;
+            location.iAreaKnown = EFalse;
+            location.iLocationAreaCode = iLastLocInfo.iLocationAreaCode;
+            location.iCellId = iLastLocInfo.iCellId;
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRadioInfoInd, location.iAreaKnown = %d.", location.iAreaKnown);
+OstTrace1( TRACE_NORMAL, DUP4_CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd;location.iAreaKnown=%d", location.iAreaKnown );
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRadioInfoInd, location.iLocationAreaCode = %d.", location.iLocationAreaCode);
+OstTrace1( TRACE_NORMAL, DUP5_CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd;location.iLocationAreaCode=%d", location.iLocationAreaCode );
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRadioInfoInd, location.iCellId = %d.", location.iCellId );
+OstTrace1( TRACE_NORMAL, DUP6_CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd;location.iCellId=%d", location.iCellId );
+
+            CMmDataPackage dataPackage;
+            dataPackage.PackData( &iLastNWInfo, &location );
+
+            iMessageRouter->Complete(
+                EMobilePhoneNotifyCurrentNetworkChange,
+                &dataPackage,
+                KErrNone );
+            }
+        else
+            {
+            // State change Cell_DCH ==> Idle.
+            // Complete with last saved location info.
+            CMmDataPackage dataPackage;
+            dataPackage.PackData( &iLastNWInfo, &iLastLocInfo );
+
+            iMessageRouter->Complete(
+                EMobilePhoneNotifyCurrentNetworkChange,
+                &dataPackage,
+                KErrNone );
+            }
+        }
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRadioInfoInd, iLastLocInfo.iAreaKnown = %d.", iLastLocInfo.iAreaKnown);
+OstTrace1( TRACE_NORMAL, DUP7_CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd;iLastLocInfo.iAreaKnown=%d", iLastLocInfo.iAreaKnown );
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRadioInfoInd, iLastLocInfo.iLocationAreaCode = %d.", iLastLocInfo.iLocationAreaCode);
+OstTrace1( TRACE_NORMAL, DUP8_CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd;iLastLocInfo.iLocationAreaCode=%d", iLastLocInfo.iLocationAreaCode );
+TFLOGSTRING2("TSY: CMmNetMessHandler::NetRadioInfoInd, iLastLocInfo.iCellId = %d.", iLastLocInfo.iCellId);
+OstTrace1( TRACE_NORMAL, DUP9_CMMNETMESSHANDLER_NETRADIOINFOIND, "CMmNetMessHandler::NetRadioInfoInd;iLastLocInfo.iCellId=%d", iLastLocInfo.iCellId );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::UiccReadCiReq
+// Read ciphering information status from UICC
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::UiccReadCiReq()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::UiccReadCiReq");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_UICCREADCIREQ, "CMmNetMessHandler::UiccReadCiReq" );
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccReadTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdReadCipheringIndicatorStatus;
+    // 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 );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::UiccReadCiResp
+// Complete ciphering indicator status
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::UiccReadCiResp( TInt aStatus, const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::UiccReadCiResp");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_UICCREADCIRESP, "CMmNetMessHandler::UiccReadCiResp" );
+
+    // Initialize ret value
+    TInt ret( KErrNone );
+
+    // Ciphering indicator information
+    RMobilePhone::TMobileCallCipheringIndicator cipherIndicatorStatus
+        ( RMobilePhone::ECipheringDisplayOff );
+
+    if( UICC_STATUS_OK == aStatus  )
+        {
+        // Get ciphering indicator info ( bit 0)
+        TUint8 cipheringIndicator(aFileData[0] & 0x01 );
+        if ( cipheringIndicator )
+            {
+            cipherIndicatorStatus = RMobilePhone::ECipheringDisplayOn;
+            }
+        }
+    else
+        {
+        ret = KErrNotFound;
+        }
+    CMmDataPackage package;
+    package.PackData( &cipherIndicatorStatus );
+
+    iMessageRouter->Complete( EMobilePhoneGetCipheringIndicatorStatus,
+        &package,
+        ret );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::UiccCsReadReq
+// Read EHPLMN/HPLMN
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::UiccCsReadReq()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::UiccCsReadReq");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_UICCCSREADREQ, "CMmNetMessHandler::UiccCsReadReq" );
+
+    // At first we try to read EHPLMN, SIM file '6FD9'
+    // When response is received and if EHPLMN is not supported
+    // we need to read HPLMN from IMSI (EF '6F07')
+
+    // Set parameters for UICC_APPL_CMD_REQ message
+    TUiccReadTransparent params;
+    params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+    params.trId = ETrIdReadCsDataEhplmn;
+    // Read EHPLMN, bytes 1-3 from '6FD9'
+    params.dataAmount = 3;
+    params.dataOffset = 0;
+    params.fileId = KElemFileEhplmn;
+    params.fileIdSfi = 0x1D;
+    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 );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::UiccCsReadEhpmlnResp
+// Complet EHPLMN
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::UiccCsReadEhpmlnResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::UiccCsReadEhpmlnResp");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_UICCCSREADEHPMLNRESP, "CMmNetMessHandler::UiccCsReadEhpmlnResp" );
+
+    // If status was OK, EHPLMN was supported
+    if ( KErrNone ==  aStatus )
+        {
+        iHplmn = aFileData;
+        }
+    else // EHPLMN was not supported, read HPLMN
+        {
+        TUiccReadTransparent params;
+        params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+        params.trId = ETrIdReadCsDataHplmn;
+        params.dataAmount = 4; // Bytes 2-5 contain MCC/MNC
+        params.dataOffset = 1; // Read from second byte
+        params.fileId = KElemFileImsi;
+        params.fileIdSfi = 7;
+        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 );
+        }
+
+    if ( 0 != iHplmn.Length() )
+        {
+        SetSimNetworkInfo();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::UiccCsReadHpmlnResp
+// Complete HPLMN
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::UiccCsReadHpmlnResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::UiccCsReadHpmlnResp");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_UICCCSREADHPMLNRESP, "CMmNetMessHandler::UiccCsReadHpmlnResp" );
+
+    if ( KErrNone ==  aStatus )
+        {
+        TUint8 tempByte( 0 );
+        // Coding of HPMLN is defined in TS 24.008
+        // First byte is MCC2|MCC1
+        tempByte = ( ( aFileData[1] & 0x0F ) << 4 ) |
+            ( ( aFileData[0] & 0xF0 ) >> 4 );
+        iHplmn.Append( tempByte );
+
+        // Second byte is MNC3|MCC3
+        tempByte = ( ( aFileData[3] & 0x0F ) << 4 ) |
+            ( ( aFileData[1] & 0xF0 ) >> 4 );
+        iHplmn.Append( tempByte );
+
+        // Third byte is MNC2|MNC1
+        tempByte = ( aFileData[2] & 0xF0 ) |
+            ( aFileData[2] & 0x0F ) ;
+        iHplmn.Append( tempByte );
+        }
+
+    if ( 0 != iHplmn.Length() )
+        {
+        SetSimNetworkInfo();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::SimNetworkInfo
+// Breaks home PLMN information and starts procedure for getting network name
+// information.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::SetSimNetworkInfo()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::SetSimNetworkInfo");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_SETSIMNETWORKINFO, "CMmNetMessHandler::SetSimNetworkInfo" );
+
+    // iHomeInfo is declared in cmmnetmesshandler.h (class private parameter
+    // to store the network information during the operator name is requested.
+
+    // Remember to zero-fill the buffers before appending.
+    iHomeInfo.iCountryCode.FillZ( 0 );
+    iHomeInfo.iNetworkId.FillZ( 0 );
+    iHomeInfo.iDisplayTag.FillZ( 0 );
+    iHomeInfo.iLongName.FillZ( 0 );
+    iHomeInfo.iShortName.FillZ( 0 );
+
+    // Fill the mode, RAT and status, always the default ones.
+    iHomeInfo.iMode = RMobilePhone::ENetworkModeGsm;
+    iHomeInfo.iAccess = RMobilePhone::ENetworkAccessUnknown;
+    iHomeInfo.iStatus = RMobilePhone::ENetworkStatusUnknown;
+
+    // Make sure that hplmn is not empty.
+    if ( 0 != iHplmn.Length() )
+        {
+        MapOperatorAndCountryCode(
+            iHplmn,
+            iHomeInfo.iNetworkId,
+            iHomeInfo.iCountryCode,
+            iMNClength );
+        }
+
+    // Initialize.
+    TUint mccNumber( 0 ); // Country Code.
+    TUint mncNumber( 0 ); // Network Code.
+
+    // Convert descriptor contained number to integer.
+    CMmStaticUtility::GetIntFromDescriptor(
+        mccNumber,
+        iHomeInfo.iCountryCode );
+    CMmStaticUtility::GetIntFromDescriptor(
+        mncNumber,
+        iHomeInfo.iNetworkId );
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::SetSimNetworkInfo - CountryCode: %S", &iHomeInfo.iCountryCode);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_SETSIMNETWORKINFO, "CMmNetMessHandler::SetSimNetworkInfo - CountryCode=%S", iHomeInfo.iCountryCode );
+TFLOGSTRING2("TSY: CMmNetMessHandler::SetSimNetworkInfo - NetworkId: %S", &iHomeInfo.iNetworkId);
+OstTraceExt1( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_SETSIMNETWORKINFO, "CMmNetMessHandler::SetSimNetworkInfo - NetworkId=%S", iHomeInfo.iNetworkId );
+
+    // Buffer for Display tag.
+    TBuf<KDisplayTagLength> alphaTag;
+
+    // Get Hard coded name from operators.h.
+    TOperatorNames::GetName(
+        mccNumber,
+        mncNumber,
+        alphaTag );
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::SetSimNetworkInfo - Name: %S", &alphaTag);
+OstTraceExt1( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_SETSIMNETWORKINFO, "CMmNetMessHandler::SetSimNetworkInfo - Name=%S", alphaTag );
+
+    // Copy hard coded name to iDisplayTag. Long and short names not handled
+    // in this case and they will left empty.
+    iHomeInfo.iDisplayTag.Copy( alphaTag );
+
+    // Complete.
+    CompleteMobilePhoneGetHomeNetwork();
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::HandleError
+// Handles CMmNetMessHandler's errors that comes via PhoNetReceiver RunError
+// method.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::HandleError
+        (
+        const TIsiReceiveC& /*aIsiMessage*/,    // Isi message
+        TInt /*aError*/    // Error code
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::HandleError");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_HANDLEERROR, "CMmNetMessHandler::HandleError" );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::GetImsPinVerifyStatus
+// Return status of SIM PIN verify
+// -----------------------------------------------------------------------------
+//
+TBool CMmNetMessHandler::GetImsPinVerifyStatus()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::GetImsPinVerifyStatus");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_GETIMSPINVERIFYSTATUS, "CMmNetMessHandler::GetImsPinVerifyStatus" );
+
+    return iImsPinVerifyRequired;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::GpdsRadioActivityInd
+// Breaks a GPDS_RADIO_ACTIVITY_IND ISI message.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::GpdsRadioActivityInd
+        (
+        const TIsiReceiveC& aIsiMessage // Received ISI message
+        )
+    {
+TFLOGSTRING2("TSY: CMmNetMessHandler::GpdsRadioActivityInd, NetworkMode = %d.", iNetworkMode);
+OstTrace1( TRACE_NORMAL, CMMNETMESSHANDLER_GPDSRADIOACTIVITYIND, "CMmNetMessHandler::GpdsRadioActivityInd;iNetworkMode=%d", iNetworkMode );
+
+    // Should be ignored in 3G (information not valid).
+    if ( RMobilePhone::ENetworkModeGsm == iNetworkMode )
+        {
+        TUint8 radioActivityStatus( aIsiMessage.Get8bit(
+            ISI_HEADER_SIZE + GPDS_RADIO_ACTIVITY_IND_OFFSET_STATUS ) );
+        // iPacketTransfer is true if and only
+        // if radio activity state is GPDS_RADIO_ON
+TFLOGSTRING2("TSY: CMmNetMessHandler::GpdsRadioActivityInd, radio activity state=%d.", radioActivityStatus);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_GPDSRADIOACTIVITYIND, "CMmNetMessHandler::GpdsRadioActivityInd;radio activity state=%hhu", radioActivityStatus );
+
+        TBool newPacketTransfer = ( ( GPDS_RADIO_ON == radioActivityStatus ) ?
+            ETrue : EFalse );
+
+        if ( GPDS_RADIO_OFF == radioActivityStatus )
+            {
+            // GPDS_RADIO_OFF => delayed completion
+            iDelayTimer->StartDelayTimer( newPacketTransfer,
+                KGPDSRAICompleteDelay );
+            }
+        else
+            {
+            // Cancel timer
+            iDelayTimer->Cancel();
+            // GPDS_RADIO_ON => complete
+            CompleteGpdsRadioActivityInd( newPacketTransfer );
+            }
+        }
+    else
+        {
+        // Cancel timer
+        iDelayTimer->Cancel();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::GpdsContextDeactivateInd
+// Breaks a GPDS_CONTEXT_DEACTIVATE_IND ISI message.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::GpdsContextDeactivateInd
+        (
+        const TIsiReceiveC& /*aIsiMessage*/
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::GpdsContextDeactivateInd");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_GPDSCONTEXTDEACTIVATEIND, "CMmNetMessHandler::GpdsContextDeactivateInd" );
+    // GPDS_RADIO_ACTIVITY_IND / RADIO_OFF is not received when
+    // last context is closed => iPacketTransfer remains to ETrue
+    // => simulate GPDS_RADIO_OFF from GPDS_CONTEXT_DEACTIVATE_IND.
+    //
+    // When PDP context is deactivated, it is still on the list at this point.
+    if ( 1 >= iMessageRouter->GetPacketServiceMessHandler()->
+        PacketContextList()->NumberOfContexts() )
+        {
+        iDelayTimer->StartDelayTimer( EFalse, KGPDSRAICompleteDelay );
+        }
+    // No else
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::CompleteGpdsRadioActivityInd
+// Saves GPDS radio activity information and
+// completes NotifyCurrentNetworkChange if state changed.
+// Location info is invalid (=empty) during Packet Transfer state.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::CompleteGpdsRadioActivityInd
+        (
+        TBool aNewPacketTrancferStatus
+        )
+    {
+    // State changed?
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteGpdsRadioActivityInd, NEW transfer status = %d.", aNewPacketTrancferStatus);
+OstTrace1( TRACE_NORMAL, CMMNETMESSHANDLER_COMPLETEGPDSRADIOACTIVITYIND, "CMmNetMessHandler::CompleteGpdsRadioActivityInd;NEW transfer status=%d", aNewPacketTrancferStatus );
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteGpdsRadioActivityInd, OLD transfer status = %d.", iPacketTransfer);
+OstTrace1( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_COMPLETEGPDSRADIOACTIVITYIND, "CMmNetMessHandler::CompleteGpdsRadioActivityInd;OLD transfer status=%d", iPacketTransfer );
+
+    if ( iPacketTransfer != aNewPacketTrancferStatus )
+        {
+        // Save new state
+        iPacketTransfer = aNewPacketTrancferStatus;
+
+        if ( iPacketTransfer )
+            {
+            // State change Packet Idle ==> Packet Transfer.
+            // Complete with empty location info.
+            RMobilePhone::TMobilePhoneLocationAreaV1 location;
+            location.iAreaKnown = EFalse;
+            location.iLocationAreaCode = iLastLocInfo.iLocationAreaCode;
+            location.iCellId = iLastLocInfo.iCellId;
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteGpdsRadioActivityInd, location.iAreaKnown = %d.", location.iAreaKnown);
+OstTrace1( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_COMPLETEGPDSRADIOACTIVITYIND, "CMmNetMessHandler::CompleteGpdsRadioActivityInd;location.iAreaKnown=%d", location.iAreaKnown );
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteGpdsRadioActivityInd, location.iLocationAreaCode = %d.", location.iLocationAreaCode);
+OstTrace1( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_COMPLETEGPDSRADIOACTIVITYIND, "CMmNetMessHandler::CompleteGpdsRadioActivityInd;location.iLocationAreaCode=%d", location.iLocationAreaCode );
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteGpdsRadioActivityInd, location.iCellId = %d.", location.iCellId);
+OstTrace1( TRACE_NORMAL, DUP4_CMMNETMESSHANDLER_COMPLETEGPDSRADIOACTIVITYIND, "CMmNetMessHandler::CompleteGpdsRadioActivityInd;location.iCellId=%d", location.iCellId );
+
+            CMmDataPackage dataPackage;
+            dataPackage.PackData( &iLastNWInfo, &location );
+            iMessageRouter->Complete(
+                EMobilePhoneNotifyCurrentNetworkChange,
+                &dataPackage,
+                KErrNone );
+            }
+        else
+            {
+            // State change Packet Transfer ==> Packet Idle.
+            // Complete with last saved location info.
+            CMmDataPackage dataPackage;
+            dataPackage.PackData( &iLastNWInfo, &iLastLocInfo );
+            iMessageRouter->Complete(
+                EMobilePhoneNotifyCurrentNetworkChange,
+                &dataPackage,
+                KErrNone );
+            }
+        }
+    // No else
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteGpdsRadioActivityInd, iLastLocInfo.iAreaKnown = %d.", iLastLocInfo.iAreaKnown);
+OstTrace1( TRACE_NORMAL, DUP5_CMMNETMESSHANDLER_COMPLETEGPDSRADIOACTIVITYIND, "CMmNetMessHandler::CompleteGpdsRadioActivityInd;iLastLocInfo.iAreaKnown=%d", iLastLocInfo.iAreaKnown );
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteGpdsRadioActivityInd, iLastLocInfo.iLocationAreaCode = %d.", iLastLocInfo.iLocationAreaCode);
+OstTrace1( TRACE_NORMAL, DUP6_CMMNETMESSHANDLER_COMPLETEGPDSRADIOACTIVITYIND, "CMmNetMessHandler::CompleteGpdsRadioActivityInd;iLastLocInfo.iLocationAreaCode=%d", iLastLocInfo.iLocationAreaCode );
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteGpdsRadioActivityInd, iLastLocInfo.iCellId = %d.", iLastLocInfo.iCellId);
+OstTrace1( TRACE_NORMAL, DUP7_CMMNETMESSHANDLER_COMPLETEGPDSRADIOACTIVITYIND, "CMmNetMessHandler::CompleteGpdsRadioActivityInd;iLastLocInfo.iCellId=%d", iLastLocInfo.iCellId );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork
+// This function completes EMobilePhoneGetHomeNetwork.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_COMPLETEMOBILEPHONEGETHOMENETWORK, "CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork" );
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork - Operator display tag: %S", &iHomeInfo.iDisplayTag);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_COMPLETEMOBILEPHONEGETHOMENETWORK, "CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork;Operator display tag=%S", iHomeInfo.iDisplayTag );
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork - Operator short name: %S", &iHomeInfo.iShortName);
+OstTraceExt1( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_COMPLETEMOBILEPHONEGETHOMENETWORK, "CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork;Operator short name=%S", iHomeInfo.iShortName );
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork - Operator long name: %S", &iHomeInfo.iLongName);
+OstTraceExt1( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_COMPLETEMOBILEPHONEGETHOMENETWORK, "CMmNetMessHandler::CompleteMobilePhoneGetHomeNetwork;Operator long name=%S", iHomeInfo.iLongName );
+
+    // Pack the data
+    CMmDataPackage package;
+    package.PackData( &iHomeInfo );
+
+    // Complete to DOS side
+    iMessageRouter->Complete(
+        EMobilePhoneGetHomeNetwork,
+        &package,
+        KErrNone );
+
+    iMNClength = 0;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::FindOperatorInfoSubBlock
+// Finds offset to NET_MODEM_GSM_REG_INFO or NET_MODEM_CURRENT_CELL_INFO
+// in NET_MODEM_REG_STATUS_IND, NET_SET_RESP or NET_MODEM_REG_STATUS_GET_RESP
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::FindOperatorInfoSubBlock(
+    const TIsiReceiveC& aIsiMessage,
+    TUint& aSbOffset
+    ) const
+    {
+    TUint sbStartOffSet( 0 );
+
+    TFLOGSTRING("TSY: CMmNetMessHandler::FindOperatorInfoSubBlock");
+    OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_FINDOPERATORINFOSUBBLOCK, "CMmNetMessHandler::FindOperatorInfoSubBlock" );
+
+    TInt ret( CalculateNetworkInformationSbStartOffset(
+        aIsiMessage, sbStartOffSet ) );
+
+    if ( KErrNone == ret )
+        {
+        // look for NET_MODEM_CURRENT_CELL_INFO subblock
+        ret = aIsiMessage.FindSubBlockOffsetById(
+            ISI_HEADER_SIZE + sbStartOffSet,
+            NET_MODEM_CURRENT_CELL_INFO,
+            EIsiSubBlockTypeId8Len8,
+            sbStartOffSet );
+        if ( KErrNone != ret )
+            { // look for NET_MODEM_GSM_REG_INFO subblock
+            OstTrace0( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_FINDOPERATORINFOSUBBLOCK, "CMmNetMessHandler::FindOperatorInfoSubBlock - NET_MODEM_CURRENT_CELL_INFO NOT FOUND" );
+            TFLOGSTRING("TSY: CMmNetMessHandler::FindOperatorInfoSubBlock - NET_MODEM_CURRENT_CELL_INFO NOT FOUND");
+            ret = aIsiMessage.FindSubBlockOffsetById(
+                ISI_HEADER_SIZE + sbStartOffSet,
+                NET_MODEM_GSM_REG_INFO,
+                EIsiSubBlockTypeId8Len8,
+                sbStartOffSet );
+            }
+        if ( KErrNone == ret )
+            {
+            aSbOffset = sbStartOffSet;
+            }
+        else
+            {
+            OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_FINDOPERATORINFOSUBBLOCK, "CMmNetMessHandler::FindOperatorInfoSubBlock - NOTHING FOUND!" );
+            TFLOGSTRING("TSY: CMmNetMessHandler::FindOperatorInfoSubBlock - NOTHING FOUND!");
+            }
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::ExtractNetworkRegistrationStatus
+// Extracts network registration status from NET_MODEM_REG_INFO_COMMON
+// subblock of NET_MODEM_REG_STATUS_IND, NET_SET_RESP or
+// NET_MODEM_REG_STATUS_GET_RESP.
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::ExtractNetworkRegistrationStatus(
+    const TIsiReceiveC& aIsiMessage,
+    const TDesC8& aOperatorCode,
+    TUint8& aRegistrationStatus,
+    TUint& aSbStartOffset
+    ) const
+    {
+    TFLOGSTRING("TSY: CMmNetMessHandler::ExtractNetworkRegistrationStatus");
+    OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_EXTRACTNETWORKREGISTRATIONSTATUS, "CMmNetMessHandler::ExtractNetworkRegistrationStatus" );
+    TUint sbStartOffSet( 0 );
+
+    TInt ret( CalculateNetworkInformationSbStartOffset(
+        aIsiMessage, sbStartOffSet ) );
+
+    if ( KErrNone == ret )
+        {
+        ret = aIsiMessage.FindSubBlockOffsetById(
+            ISI_HEADER_SIZE + sbStartOffSet,
+            NET_MODEM_REG_INFO_COMMON,
+            EIsiSubBlockTypeId8Len8,
+            sbStartOffSet );
+        }
+    if ( KErrNone == ret )
+        {
+        aSbStartOffset = sbStartOffSet;
+        aRegistrationStatus = aIsiMessage.Get8bit( sbStartOffSet +
+             NET_MODEM_REG_INFO_COMMON_OFFSET_REGISTRATIONSTATUS );
+        TFLOGSTRING2("TSY: CMmNetMessHandler::ExtractNetworkRegistrationStatus;registrationStatus=%d", aRegistrationStatus);
+        OstTraceExt1( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_EXTRACTNETWORKREGISTRATIONSTATUS, "CMmNetMessHandler::ExtractNetworkRegistrationStatus;registrationStatus=%hhu", aRegistrationStatus );
+        // patch registration status if this is SIM-card
+        if ( 0 < iHplmn.Length() )
+            {
+            if ( NET_REG_STATUS_ROAM == aRegistrationStatus &&
+                 aOperatorCode == KO2NetworkId &&
+                 iHplmn == KO2Hplmn
+                 )
+                {
+                TFLOGSTRING("TSY: CMmNetMessHandler::ExtractNetworkRegistrationStatus; NET_REG_STATUS_ROAM --> NET_REG_STATUS_HOME");
+                OstTrace0( TRACE_NORMAL, DUP4_CMMNETMESSHANDLER_EXTRACTNETWORKREGISTRATIONSTATUS, "CMmNetMessHandler::ExtractNetworkRegistrationStatus; NET_REG_STATUS_ROAM --> NET_REG_STATUS_HOME" );
+                aRegistrationStatus = NET_REG_STATUS_HOME;
+                }
+            }
+        else
+            {
+            TFLOGSTRING("TSY: CMmNetMessHandler::ExtractNetworkRegistrationStatus; cant patch, HPLMN is empty");
+            OstTrace0( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_EXTRACTNETWORKREGISTRATIONSTATUS, "CMmNetMessHandler::ExtractNetworkRegistrationStatus - cant patch, HPLMN is empty" );
+            }
+        }
+    else
+        {
+        TFLOGSTRING("TSY: CMmNetMessHandler::ExtractNetworkRegistrationStatus; NET_MODEM_REG_INFO_COMMON not found");
+        OstTrace0( TRACE_NORMAL, DUP5_CMMNETMESSHANDLER_EXTRACTNETWORKREGISTRATIONSTATUS, "CMmNetMessHandler::ExtractNetworkRegistrationStatus; NET_MODEM_REG_INFO_COMMON not found" );
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange
+// Completes EMobilePhoneNotifyCurrentNetworkChange and
+// EMobilePhoneGetNetworkRegistrationStatus IPCs.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange
+        (
+        const RMobilePhone::TMobilePhoneLocationAreaV1& aLocationAreaData, // LAC info
+        const RMobilePhone::TMobilePhoneNetworkInfoV5& aNetworkInfoData // Network info
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_COMPLETEMOBILEPHONENOTIFYCURRENTNETWORKCHANGE, "CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange" );
+
+    // Assistant for packaging.
+    CMmDataPackage dataPackage;
+
+    // Take possible Cell_DCH or packet transfer state into account
+    // when completing current network change.
+    iLastNWInfo = aNetworkInfoData;
+    iLastLocInfo = aLocationAreaData;
+
+    if ( iCell_DCH ||
+        ( iPacketTransfer &&
+        RMobilePhone::ENetworkModeGsm == iNetworkMode ) )
+        {
+        // Pack the data for sending to the manager,
+        // location info is invalid (empty).
+        RMobilePhone::TMobilePhoneLocationAreaV1 location;
+        location.iAreaKnown = EFalse;
+        location.iLocationAreaCode = iLastLocInfo.iLocationAreaCode;
+        location.iCellId = iLastLocInfo.iCellId;
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - location.iAreaKnown = %d", location.iAreaKnown);
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - location.iLocationAreaCode = %d", location.iLocationAreaCode);
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - location.iCellId = %d", location.iCellId);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_COMPLETEMOBILEPHONENOTIFYCURRENTNETWORKCHANGE, "CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - location.iAreaKnown=%hhu", location.iAreaKnown );
+OstTrace1( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_COMPLETEMOBILEPHONENOTIFYCURRENTNETWORKCHANGE, "CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - location.iLocationAreaCode=%u", location.iLocationAreaCode );
+OstTrace1( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_COMPLETEMOBILEPHONENOTIFYCURRENTNETWORKCHANGE, "CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - location.iCellId=%u", location.iCellId );
+
+        dataPackage.PackData( &iLastNWInfo, &location );
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - iLastLocInfo.iAreaKnown = %d", iLastLocInfo.iAreaKnown);
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - iLastLocInfo.iLocationAreaCode = %d", iLastLocInfo.iLocationAreaCode);
+TFLOGSTRING2("TSY: CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - iLastLocInfo.iCellId = %d", iLastLocInfo.iCellId);
+OstTraceExt1( TRACE_NORMAL, DUP4_CMMNETMESSHANDLER_COMPLETEMOBILEPHONENOTIFYCURRENTNETWORKCHANGE, "CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - iLastLocInfo.iAreaKnown=%hhu", iLastLocInfo.iAreaKnown );
+OstTrace1( TRACE_NORMAL, DUP5_CMMNETMESSHANDLER_COMPLETEMOBILEPHONENOTIFYCURRENTNETWORKCHANGE, "CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - iLastLocInfo.iLocationAreaCode=%u", iLastLocInfo.iLocationAreaCode );
+OstTrace1( TRACE_NORMAL, DUP7_CMMNETMESSHANDLER_COMPLETEMOBILEPHONENOTIFYCURRENTNETWORKCHANGE, "CMmNetMessHandler::CompleteMobilePhoneNotifyCurrentNetworkChange - iLastLocInfo.iCellId=%u", iLastLocInfo.iCellId );
+
+        // Pack the data for sending to the manager.
+        dataPackage.PackData( &iLastNWInfo, &iLastLocInfo );
+        }
+
+    // Inform that the network info has changed.
+    iMessageRouter->Complete(
+        EMobilePhoneNotifyCurrentNetworkChange,
+        &dataPackage,
+        KErrNone );
+
+    iMessageRouter->Complete(
+        EMobilePhoneGetNetworkRegistrationStatus,
+        KErrNone );
+
+    // Continue handling queued messages.
+    ContinueHandlingNetModemRegStatusMessages();
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::QueueNetModemRegStatusMessagesL
+// Queue functionality for NET_MODEM_REG_STATUS_IND,
+// NET_MODEM_REG_STATUS_GET_RESP and NET_SET_RESP ISI-messages.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::QueueNetModemRegStatusMessagesL
+        (
+        const TIsiReceiveC& aIsiMessage
+        )
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::QueueNetModemRegStatusMessagesL");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_QUEUENETMODEMREGSTATUSMESSAGESL, "CMmNetMessHandler::QueueNetModemRegStatusMessagesL" );
+
+    // Make a copy of received message. Allocate heap memory.
+    // Can leave if out of mem.
+    HBufC8* tempHBuf = HBufC8::NewL( aIsiMessage.GetBuffer().Length() );
+    // Copy data.
+    *tempHBuf = aIsiMessage.GetBuffer();
+    // Catch possible error in append.
+    TInt errValue( iNetMessageQueue.Append( tempHBuf ) );
+
+    // Check possible error.
+    if ( KErrNone == errValue )
+        {
+        // Start handling queued messages.
+        StartHandlingNetModemRegStatusMessages();
+        }
+    else
+        {
+        // There was error.
+        delete tempHBuf;
+        tempHBuf = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::StartHandlingNetModemRegStatusMessages
+// Start handling queued messages.
+// Can complete next IPCs if needed ECustomGetOperatorNameIPC,
+// EMobilePhoneGetNetworkRegistrationStatus and EMobilePhoneSelectNetwork.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::StartHandlingNetModemRegStatusMessages()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::StartHandlingNetModemRegStatusMessages");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_STARTHANDLINGNETMODEMREGSTATUSMESSAGES, "CMmNetMessHandler::StartHandlingNetModemRegStatusMessages" );
+
+    // Continue handling if there is messages in queue
+    // and handling not already ongoing.
+    if ( !iNetMessageHandlingOngoing
+        && 0 < iNetMessageQueue.Count() )
+        {
+TFLOGSTRING("TSY: CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - Start handling next queued message");
+OstTrace0( TRACE_NORMAL, DUP1_CMMNETMESSHANDLER_STARTHANDLINGNETMODEMREGSTATUSMESSAGES, "CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - Start handling next queued message" );
+
+        // Set flag ON as message handling start.
+        iNetMessageHandlingOngoing = ETrue;
+
+        // Copy message from array.
+        const TDesC8& message( *iNetMessageQueue[0] );
+
+        // Print message to log.
+        TFLOG_PRINT_ISIMESSAGE( message );
+
+        // Save buffer pointer.
+        HBufC8* tempHBuf = iNetMessageQueue[0];
+        // Remove used message from array and compress.
+        iNetMessageQueue.Remove( 0 );
+        iNetMessageQueue.Compress();
+
+        TIsiReceiveC isimessage( ( TIsiReceiveC ) message );
+
+        // Get message Id.
+        TInt messageId( isimessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) );
+
+        // Check message id.
+        if ( NET_MODEM_REG_STATUS_IND == messageId )
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_MODEM_REG_STATUS_IND");
+OstTrace0( TRACE_NORMAL, DUP2_CMMNETMESSHANDLER_STARTHANDLINGNETMODEMREGSTATUSMESSAGES, "CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_MODEM_REG_STATUS_IND" );
+
+            // Start handling NET_MODEM_REG_STATUS_IND message.
+            NetModemRegStatusInd( isimessage );
+            }
+        else if ( NET_MODEM_REG_STATUS_GET_RESP == messageId )
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_MODEM_REG_STATUS_GET_RESP");
+OstTrace0( TRACE_NORMAL, DUP3_CMMNETMESSHANDLER_STARTHANDLINGNETMODEMREGSTATUSMESSAGES, "CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_MODEM_REG_STATUS_GET_RESP" );
+
+            // Get the success code.
+            TUint8 successCode( isimessage.Get8bit(
+                ISI_HEADER_SIZE +
+                NET_MODEM_REG_STATUS_GET_RESP_OFFSET_SUCCESSCODE ) );
+
+            if ( NET_CAUSE_OK == successCode )
+                {
+                // Data to be read from the NET_MODEM_REG_STATUS_GET_RESP
+                // message is the same as in the NET_MODEM_REG_STATUS_IND
+                // indication.
+                NetModemRegStatusInd( isimessage );
+                }
+            else
+                {
+                // Map ISA error to symbian value.
+                TInt error( CMmStaticUtility::CSCauseToEpocError(
+                    PN_MODEM_NETWORK,
+                    KTsyNetCauseCommon,
+                    successCode ) );
+
+TFLOGSTRING2("TSY: CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_MODEM_REG_STATUS_GET_RESP - Error value: %d", error);
+OstTrace1( TRACE_NORMAL, DUP4_CMMNETMESSHANDLER_STARTHANDLINGNETMODEMREGSTATUSMESSAGES, "CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_MODEM_REG_STATUS_GET_RESP - Error value=%d", error );
+
+                // Initialize default return values to ECustomGetOperatorNameIPC
+                // complete.
+                RMmCustomAPI::TOperatorNameInfo operNameInfo;
+                operNameInfo.iType = RMmCustomAPI::EOperatorNameFlexiblePlmn;
+                operNameInfo.iName.Zero();
+
+                // Complete ECustomGetOperatorNameIPC with error.
+                // Packed parameter: a RMmCustomAPI::TOperatorNameInfo.
+                CMmDataPackage dataPackage;
+                dataPackage.PackData( &operNameInfo );
+
+                iMessageRouter->Complete(
+                    ECustomGetOperatorNameIPC,
+                    &dataPackage,
+                    error );
+
+                // Complete EMobilePhoneGetNetworkRegistrationStatus with error.
+                iMessageRouter->Complete(
+                    EMobilePhoneGetNetworkRegistrationStatus,
+                    error );
+
+                // Continue handling queued messages. As previous message has
+                // completed with error.
+                ContinueHandlingNetModemRegStatusMessages();
+                }
+            }
+        else if ( NET_SET_RESP == messageId )
+            {
+TFLOGSTRING("TSY: CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_SET_RESP");
+OstTrace0( TRACE_NORMAL, DUP5_CMMNETMESSHANDLER_STARTHANDLINGNETMODEMREGSTATUSMESSAGES, "CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_SET_RESP" );
+
+            // Check if the NW selection was done ok.
+            TUint8 successCode( isimessage.Get8bit(
+                ISI_HEADER_SIZE + NET_SET_RESP_OFFSET_SUCCESSCODE ) );
+
+            // Map ISA error to Symbian values.
+            TInt error( CMmStaticUtility::CSCauseToEpocError(
+                PN_MODEM_NETWORK,
+                KTsyNetCauseCommon,
+                successCode ) );
+
+            if ( KErrNone == error )
+                {
+                // Check subblocks.
+                if ( 0 < isimessage.Get8bit(
+                    ISI_HEADER_SIZE + NET_SET_RESP_OFFSET_SUBBLOCKCOUNT ) )
+                    {
+                    // Data to be read from the NET_SET_RESP message is the
+                    // same as in the NET_MODEM_REG_STATUS_IND indication.
+                    NetModemRegStatusInd( isimessage );
+
+                    // Inform that the network selection is completed.
+                    iMessageRouter->Complete(
+                        EMobilePhoneSelectNetwork,
+                        NULL,
+                        error );
+                    }
+                else
+                    {
+                    // If no subblocks, continue handling queued messages.
+                    ContinueHandlingNetModemRegStatusMessages();
+                    }
+                }
+            else
+                {
+TFLOGSTRING2("TSY: CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_SET_RESP - Error cause value: %d", successCode);
+OstTraceExt1( TRACE_NORMAL, DUP6_CMMNETMESSHANDLER_STARTHANDLINGNETMODEMREGSTATUSMESSAGES, "CMmNetMessHandler::StartHandlingNetModemRegStatusMessages - NET_SET_RESP - Error cause value=%hhu", successCode );
+
+                // SuccessCode is not ok, check also for GSM specific error code.
+
+                TUint sbStartOffSet( 0 );
+
+                // Check if interruption request is not already ongoing for the
+                // network selection.
+                if ( NET_CAUSE_REQUEST_INTERRUPTED != successCode
+                    && !iSelectNetworkCancelIssued )
+                    {
+                    // If the subblock exists.
+                    if ( KErrNone == isimessage.FindSubBlockOffsetById(
+                        ISI_HEADER_SIZE + SIZE_NET_SET_RESP,
+                        NET_MODEM_CAUSE_EXTENSION,
+                        EIsiSubBlockTypeId8Len8,
+                        sbStartOffSet ) )
+                        {
+                        // Get the gsm specific error code.
+                        successCode = isimessage.Get8bit(
+                            sbStartOffSet +
+                            NET_MODEM_CAUSE_EXTENSION_OFFSET_REJECTCODE );
+
+                        // Map ISA error to Symbian values.
+                        error = CMmStaticUtility::CSCauseToEpocError(
+                            PN_MODEM_NETWORK,
+                            KTsyNetCauseGsm,
+                            successCode );
+                        }
+
+                    // Inform that there was an error in
+                    // network selection.
+                    iMessageRouter->Complete(
+                        EMobilePhoneSelectNetwork,
+                        error );
+                    }
+                else if ( NET_CAUSE_REQUEST_INTERRUPTED == successCode )
+                    {
+                    iMessageRouter->Complete(
+                        EMobilePhoneSelectNetwork,
+                        NULL,
+                        KErrNone );
+                    }
+
+                // Continue handling queued messages. As previous message has
+                // completed with error.
+                ContinueHandlingNetModemRegStatusMessages();
+                }
+            }
+
+        // Delete used message.
+        delete tempHBuf;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::ContinueHandlingNetModemRegStatusMessages
+// Continue handling of queued messages if available.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::ContinueHandlingNetModemRegStatusMessages()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::ContinueHandlingNetModemRegStatusMessages - Continue handling queued messages");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_CONTINUEHANDLINGNETMODEMREGSTATUSMESSAGES, "CMmNetMessHandler::ContinueHandlingNetModemRegStatusMessages - Continue handling queued messages" );
+
+    // Message handling done.
+    // Reset flag to OFF as message handling is finished.
+    iNetMessageHandlingOngoing = EFalse;
+
+    // Start handling queued messages.
+    StartHandlingNetModemRegStatusMessages();
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::InitializeOnsAndOplReading
+// Starts reading Operator Name String and Operator PLMN List rules
+// when SIM is ready.
+// -----------------------------------------------------------------------------
+//
+void CMmNetMessHandler::InitializeOnsAndOplReading()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::InitializeOnsAndOplReading");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_INITIALIZEONSANDOPLREADING, "CMmNetMessHandler::InitializeOnsAndOplReading" );
+
+    // Set iNetMessageHandlingOngoing flag to ETrue.
+    iNetMessageHandlingOngoing = ETrue;
+
+    }
+
+// ---------------------------------------------------------------------------
+// CMmNetMessHandler::GetMessageRouter
+// Gets pointer to CMmMessageRouter object.
+// ---------------------------------------------------------------------------
+//
+CMmMessageRouter* CMmNetMessHandler::GetMessageRouter()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::GetMessageRouter");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_GETMESSAGEROUTER, "CMmNetMessHandler::GetMessageRouter" );
+    return iMessageRouter;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmNetMessHandler::GetPhoNetSender
+// Gets pointer to PhoNetSender object.
+// ---------------------------------------------------------------------------
+//
+CMmPhoNetSender* CMmNetMessHandler::GetPhoNetSender()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::GetPhoNetSender");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_GETPHONETSENDER, "CMmNetMessHandler::GetPhoNetSender" );
+    return iPhoNetSender;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmNetMessHandler::ExtractNetworkRegistrationStatus
+// Extracts network registration status from NET_MODEM_REG_STATUS_IND,
+// NET_SET_RESP or NET_MODEM_REG_STATUS_GET_RESP
+// -----------------------------------------------------------------------------
+//
+TInt CMmNetMessHandler::ExtractNetworkRegistrationStatus(
+    const TIsiReceiveC& aIsiMessage,
+    TUint8& aRegistrationStatus
+    ) const
+    {
+    OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_EXTRACTNETWORKREGISTRATIONSTATUS, "CMmNetMessHandler::ExtractNetworkRegistrationStatus" );
+    TFLOGSTRING("TSY: CMmNetMessHandler::ExtractNetworkRegistrationStatus");
+
+    TUint sbStartOffSet( 0 );
+    // find offset to subblock from which operator code can be read
+    TInt returnValue( FindOperatorInfoSubBlock(
+        aIsiMessage,
+        sbStartOffSet ) );
+
+    if ( KErrNone == returnValue )
+        {
+        TPtrC8 operatorCode( aIsiMessage.GetData(
+            sbStartOffSet + NET_MODEM_CURRENT_CELL_INFO_OFFSET_OPERATORCODE,
+            KBCDLength ) );
+        TUint8 registrationStatus( 0 );
+        returnValue = ExtractNetworkRegistrationStatus(
+            aIsiMessage,
+            operatorCode,
+            registrationStatus,
+            sbStartOffSet
+            );
+
+        if ( KErrNone == returnValue )
+            {
+            aRegistrationStatus = registrationStatus;
+            }
+        }
+
+    return returnValue;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmNetMessHandler::GetNetOperatorNameHandler
+// Gets pointer to NetOperatorNameHandler object.
+// ---------------------------------------------------------------------------
+//
+CMmNetOperatorNameHandler* CMmNetMessHandler::GetNetOperatorNameHandler()
+    {
+TFLOGSTRING("TSY: CMmNetMessHandler::GetNetOperatorNameHandler");
+OstTrace0( TRACE_NORMAL, CMMNETMESSHANDLER_GETNETOPERATORNAMEHANDLER, "CMmNetMessHandler::GetNetOperatorNameHandler" );
+    return iNetOperatorNameHandler;
+    }
+
+// =============================================================================
+// CDelayTimer: Used for delaying for completion of Packet transfer state
+// from GPDS_RADIO_AVTIVITY_IND.
+
+// -----------------------------------------------------------------------------
+// CDelayTimer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDelayTimer* CDelayTimer::NewL(
+    CMmNetMessHandler* aNetMessHandler )
+    {
+TFLOGSTRING("TSY: CDelayTimer::NewL");
+OstTrace0( TRACE_NORMAL, CDELAYTIMER_NEWL, "CDelayTimer::NewL" );
+
+    CDelayTimer* self = new( ELeave ) CDelayTimer();
+
+    CleanupStack::PushL( self );
+
+    self->iNetMessHandler = aNetMessHandler;
+    self->ConstructL();
+
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CDelayTimer::CDelayTimer()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CDelayTimer::CDelayTimer() : CTimer( CActive::EPriorityStandard )
+    {
+TFLOGSTRING("TSY: CDelayTimer::CDelayTimer");
+OstTrace0( TRACE_NORMAL, CDELAYTIMER_CDELAYTIMER, "CDelayTimer::CDelayTimer" );
+    }
+
+// -----------------------------------------------------------------------------
+// CDelayTimer::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDelayTimer::ConstructL()
+    {
+TFLOGSTRING("TSY: CDelayTimer::ConstructL");
+OstTrace0( TRACE_NORMAL, CDELAYTIMER_CONSTRUCTL, "CDelayTimer::ConstructL" );
+
+    iNewPacketTransferState = ETrue;
+
+    CTimer::ConstructL();
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CDelayTimer::~CDelayTimer()
+// Destructor, deletes all allocated resources.
+// -----------------------------------------------------------------------------
+//
+CDelayTimer::~CDelayTimer()
+    {
+TFLOGSTRING("TSY: CDelayTimer::~CDelayTimer");
+OstTrace0( TRACE_NORMAL, DUP1_CDELAYTIMER_CDELAYTIMER, "CDelayTimer::~CDelayTimer" );
+    Cancel();
+    }
+
+// -----------------------------------------------------------------------------
+// CDelayTimer::StartDelayTimer()
+// Start delay timer.
+// -----------------------------------------------------------------------------
+//
+void CDelayTimer::StartDelayTimer(
+    TBool aNewPacketTransferState, TInt aTimeOut )
+    {
+    if ( iNewPacketTransferState != aNewPacketTransferState )
+        {
+TFLOGSTRING("TSY: CDelayTimer::StartDelayTimer, Restart.");
+OstTrace0( TRACE_NORMAL, CDELAYTIMER_STARTDELAYTIMER, "CDelayTimer::StartDelayTimer,Restart" );
+        Cancel();
+        iNewPacketTransferState = aNewPacketTransferState;
+        After( aTimeOut );
+        }
+    // No else
+    }
+
+// -----------------------------------------------------------------------------
+// CDelayTimer::RunL()
+// Called when operation completes.
+// -----------------------------------------------------------------------------
+//
+void CDelayTimer::RunL()
+    {
+TFLOGSTRING2("TSY: CDelayTimer::RunL, status = %d.", iStatus.Int());
+OstTrace1( TRACE_NORMAL, CDELAYTIMER_RUNL, "CDelayTimer::RunL;iStatus.Int=%d", iStatus.Int() );
+
+    // Timer request has completed, so notify the timer's owner
+    if ( iStatus == KErrNone )
+        {
+        iNetMessHandler->CompleteGpdsRadioActivityInd(
+            iNewPacketTransferState );
+        }
+    // No else
+
+    iNewPacketTransferState = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CDelayTimer::DoCancel()
+// Called when operation is cancelled.
+// -----------------------------------------------------------------------------
+//
+void CDelayTimer::DoCancel()
+    {
+TFLOGSTRING("TSY: CDelayTimer::DoCancel");
+OstTrace0( TRACE_NORMAL, CDELAYTIMER_DOCANCEL, "CDelayTimer::DoCancel" );
+
+    CTimer::DoCancel();
+
+    iNewPacketTransferState = ETrue;
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+    //None
+
+//  End of File