adaptationlayer/tsy/nokiatsy_dll/src/cmmphonemesshandler.cpp
changeset 5 8ccc39f9d787
parent 0 63b37f68c1ce
child 8 6295dc2169f3
--- a/adaptationlayer/tsy/nokiatsy_dll/src/cmmphonemesshandler.cpp	Mon Nov 09 10:36:19 2009 +0000
+++ b/adaptationlayer/tsy/nokiatsy_dll/src/cmmphonemesshandler.cpp	Thu Jan 14 10:44:58 2010 +0200
@@ -11,7 +11,7 @@
 *
 * Contributors:
 *
-* Description: 
+* Description:
 *
 */
 
@@ -27,7 +27,7 @@
 #include "cmmnetmesshandler.h"
 #include "cmmnetoperatornamehandler.h"
 #include "tsylogger.h"
-#include "cmmuiccmesshandler.h"
+#include "cmmphonebookoperationinit.h"
 
 #include <call_modemisi.h>
 #include <ctsy/pluginapi/cmmdatapackage.h>
@@ -49,9 +49,9 @@
 #include <tisi.h>
 #include <uiccisi.h>
 
-#include "osttracedefinitions.h"
+#include "OstTraceDefinitions.h"
 #ifdef OST_TRACE_COMPILER_IN_USE
-#include "cmmphonemesshandlertraces.h"
+#include "cmmphonemesshandlerTraces.h"
 #endif
 
 // EXTERNAL DATA STRUCTURES
@@ -70,6 +70,11 @@
 const TUint8 KServiceProviderSize = 36;
 const TUint8 KSpnFileSize = 16;
 
+const TUint8 KServiceAcl( 35 );
+const TUint8 KAclStateMask( 4 );
+const TUint8 KNumOfApnsIndex( 0 );
+const TUint8 KApnDataIndex( 1 );
+
 // ------------------------------------------------------
 // --- Alternate Line Service (ALS)-related constants ---
 // ------------------------------------------------------
@@ -153,6 +158,16 @@
 #endif /* INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING */
         INFO_SERIAL_NUMBER_READ_RESP );
 
+    aPhoNetReceiver->RegisterL(
+        phoneMessHandler,
+        PN_UICC,
+        UICC_REFRESH_RESP );
+
+    aPhoNetReceiver->RegisterL(
+        phoneMessHandler,
+        PN_UICC,
+        UICC_REFRESH_IND );
+
     CleanupStack::Pop( phoneMessHandler );
 
     return phoneMessHandler;
@@ -180,7 +195,7 @@
 
     iCommonTSYRefreshPending = EFalse;
     iRefreshError = EFalse;
-
+    iCompleteRefresfDone = EFalse;
     iInternalRefreshFiles = 0;
 
     SubscribeEventsFromPhoNet();
@@ -284,6 +299,7 @@
         // UICC SERVER INDICATIONS
             PN_UICC, UICC_CARD_IND,
             PN_UICC, UICC_IND,
+            PN_UICC, UICC_REFRESH_IND,
 
 #ifdef INTERNAL_TESTING_OLD_IMPLEMENTATION_FOR_UICC_TESTING
         // MTC SERVER INDICATIONS
@@ -389,6 +405,148 @@
             ret = UiccReadServiceProviderName();
             break;
             }
+        case EMmTsySimRefreshDoneIPC:
+            {
+            iCommonTSYRefreshPending = EFalse;
+            TBool readError;
+            aDataPackage->UnPackData( readError );
+
+            if ( ! readError )
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::ExtFuncL: commontsy refresh successfully completed ==> REFRESH_DONE");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_EXTFUNCL, "CMmPhoneMessHandler::ExtFuncL: commontsy refresh successfully completed ==> REFRESH_DONE" );
+                ret = UiccRefreshReq( UICC_REFRESH_DONE );
+                }
+            else
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::ExtFuncL: commontsy refresh completed with an error ==> REFRESH_DONE");
+OstTrace0( TRACE_NORMAL, DUP2_CMMPHONEMESSHANDLER_EXTFUNCL, "CMmPhoneMessHandler::ExtFuncL: commontsy refresh completed with an error ==> REFRESH_DONE" );
+                ret = UiccRefreshReq( UICC_REFRESH_NOT_OK );
+                }
+            break;
+            }
+
+        case EMobilePhoneGetAPNControlListServiceStatus:
+            {
+            if( !iACLIsProgress )
+                {
+                iOngoingAclIpc = EMobilePhoneGetAPNControlListServiceStatus;
+                iACLIsProgress = ETrue;
+                ret = UiccReadEfEstReq();
+                }
+            else
+                {
+                ret = KErrInUse;
+                }
+            break;
+            }
+        case EMobilePhoneSetAPNControlListServiceStatus:
+            {
+            if( !iACLIsProgress )
+                {
+                iOngoingAclIpc = EMobilePhoneSetAPNControlListServiceStatus;
+                iACLIsProgress = ETrue;
+                aDataPackage->UnPackData( iAclStatus );
+                ret = UiccReadEfEstReq();
+                }
+            else
+                {
+                ret = KErrInUse;
+                }
+            break;
+            }
+        case EMobilePhoneDeleteAPNName:
+            {
+            if( !iACLIsProgress )
+                {
+                iACLIsProgress = ETrue;
+                iOngoingAclIpc = EMobilePhoneDeleteAPNName;
+                aDataPackage->UnPackData( iAPNReadOrDeleteIndex );
+                if( !iAPNList )
+                    {
+                    ret = UiccReadAclReq();
+                    }
+                else
+                    {
+                    ret = UiccDeleteApnEntry( iAPNReadOrDeleteIndex );
+                    }
+                }
+            else
+                {
+                ret = KErrInUse;
+                }
+            break;
+            }
+        case EMobilePhoneAppendAPNName:
+            {
+            if( !iACLIsProgress )
+                {
+                iACLIsProgress = ETrue;
+                iOngoingAclIpc = EMobilePhoneAppendAPNName;
+                RMobilePhone::TAPNEntryV3* apnEntryName( NULL );
+                aDataPackage->UnPackData( &apnEntryName );
+                iAPNDataBuffer =  *apnEntryName;
+
+                if( !iAPNList )
+                    {
+                    ret = UiccReadAclReq();
+                    }
+                else
+                    {
+                    iAPNList->AppendL( iAPNDataBuffer.iApn );
+                    ret = UiccWriteEfAclReq();
+                    }
+                }
+            else
+                {
+                ret = KErrInUse;
+                }
+            break;
+            }
+        case EMobilePhoneEnumerateAPNEntries:
+            {
+            if( !iAPNList )
+                {
+                if( !iACLIsProgress )
+                    {
+                    iACLIsProgress = ETrue;
+                    iOngoingAclIpc = EMobilePhoneEnumerateAPNEntries;
+                    ret = UiccReadAclReq();
+                    }
+                else
+                    {
+                    ret = KErrInUse;
+                    }
+                }
+            else
+                {
+                CompleteEnumerateAPNEntries();
+                }
+            break;
+            }
+        case EMobilePhoneGetAPNname:
+            {
+            aDataPackage->UnPackData( iAPNReadOrDeleteIndex );
+            if( !iAPNList )
+                {
+                if( !iACLIsProgress )
+                    {
+                    iACLIsProgress = ETrue;
+                    iOngoingAclIpc = EMobilePhoneGetAPNname;
+                    ret = UiccReadAclReq();
+                    }
+                else
+                    {
+                    ret = KErrInUse;
+                    }
+                }
+            else
+                {
+                CompleteGetAPNName( iAPNReadOrDeleteIndex );
+                }
+            break;
+            }
+
         default:
             {
 TFLOGSTRING2("TSY: CMmPhoneMessHandler::ExtFuncL - Unknown IPC: %d", aIpc);
@@ -442,6 +600,27 @@
                 }
             break; // end case PN_MODEM_INFO
             }
+        case PN_UICC:
+            {
+            switch( messageId )
+                {
+                case UICC_REFRESH_IND:
+                    {
+                    UiccRefreshInd( aIsiMessage );
+                    break;
+                    }
+                case UICC_REFRESH_RESP:
+                    {
+                    UiccRefreshResp( aIsiMessage );
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            break;
+            }
         default:
             {
 TFLOGSTRING("TSY: CMmPhoneMessHandler::ReceiveMessageL, switch resource - default.\n" );
@@ -966,6 +1145,7 @@
 TInt CMmPhoneMessHandler::ProcessUiccMsg(
     TInt aTraId,
     TInt aStatus,
+    TUint8 /*aDetails*/,
     const TDesC8& aFileData )
     {
 TFLOGSTRING3("TSY: CMmPhoneMessHandler::ProcessUiccMsg, transaction ID: %d, status %d", aTraId, aStatus );
@@ -1002,6 +1182,33 @@
             UiccWriteDynamicFlagsResp( aStatus );
             break;
             }
+        case ETrIdAclStatusReadEfEst:
+            {
+            if( EMobilePhoneGetAPNControlListServiceStatus == iOngoingAclIpc )
+                {
+                UiccGetAclStatusReadEfEstResp( aStatus, aFileData );
+                }
+            else if( EMobilePhoneSetAPNControlListServiceStatus == iOngoingAclIpc )
+                {
+                UiccSetAclStatusReadEfEstResp( aStatus, aFileData );
+                }
+            break;
+            }
+        case ETrIdAclStatusWriteEfEst:
+            {
+            UiccSetAclStatusWriteEfEstResp( aStatus );
+            break;
+            }
+        case ETrIdAclReadEfAcl:
+            {
+            UiccReadAclResp( aStatus, aFileData );
+            break;
+            }
+        case ETrIdAclWriteEfAcl:
+            {
+            UiccWriteEfAclResp( aStatus );
+            break;
+            }
         default:
             {
 TFLOGSTRING("TSY: CMmPhoneMessHandler::ProcessUiccMsg - unknown transaction ID" );
@@ -1214,4 +1421,1087 @@
     iServiceProviderName.iPLMNField.Zero();
     }
 
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccRefreshInd
+//
+// --------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::UiccRefreshInd( const TIsiReceiveC &aIsiMessage )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccRefreshInd");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCREFRESHIND, "CMmPhoneMessHandler::UiccRefreshInd" );
+    TUint8 serviceType( aIsiMessage.Get8bit(
+        ISI_HEADER_SIZE + UICC_REFRESH_IND_OFFSET_SERVICETYPE ) );
+    if ( UICC_REFRESH_PERMISSION == serviceType )
+        {
+        UiccRefreshReq( UICC_REFRESH_OK );
+        }
+    else if ( UICC_REFRESH_NOW == serviceType )
+        {
+        HandleUiccRefresh( aIsiMessage );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccRefreshResp
+//
+// --------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::UiccRefreshResp( const TIsiReceiveC &aIsiMessage )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccRefreshResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCREFRESHRESP, "CMmPhoneMessHandler::UiccRefreshResp" );
+    if ( iCompleteRefresfDone )
+        {
+        TUint8 status( aIsiMessage.Get8bit(
+            ISI_HEADER_SIZE + UICC_REFRESH_RESP_OFFSET_STATUS ) );
+        TInt err( KErrNone );
+        if ( UICC_STATUS_OK != status )
+            {
+            err = KErrGeneral;
+            }
+        iMessageRouter->Complete( EMmTsySimRefreshDoneIPC, err );
+        iCompleteRefresfDone = EFalse;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccRefreshReq
+//
+// --------------------------------------------------------------------------
+//
+TInt CMmPhoneMessHandler::UiccRefreshReq( TUint8 aStatus )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccRefreshReq");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCREFRESHREQ, "CMmPhoneMessHandler::UiccRefreshReq" );
+    TInt ret( KErrNone );
+
+    // If there was error in cacheing some file, set internal flag
+    if ( UICC_REFRESH_NOT_OK == aStatus )
+        {
+        iRefreshError = ETrue;
+        }
+
+    // If NTSY or CTSY cacheing is ongoing, message is not sent
+    if ( ! iCommonTSYRefreshPending && ! iInternalRefreshFiles )
+        {
+        if ( iRefreshError ) // Some cacheing was failed, set error status
+            {
+            aStatus = UICC_REFRESH_NOT_OK;
+            }
+
+        TIsiSend isiMsg( iPhoNetSender->SendBufferDes() );
+        isiMsg.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_UICC );
+        isiMsg.Set8bit( ISI_HEADER_OFFSET_TRANSID, KPhoneTransId );
+        isiMsg.Set8bit( ISI_HEADER_OFFSET_MESSAGEID, UICC_REFRESH_REQ );
+        isiMsg.Set8bit( ISI_HEADER_SIZE + UICC_REFRESH_REQ_OFFSET_SERVICETYPE,
+            UICC_REFRESH_STATUS );
+        isiMsg.Set8bit( ISI_HEADER_SIZE + UICC_REFRESH_REQ_OFFSET_STATUS,
+            aStatus );
+        isiMsg.Set8bit( ISI_HEADER_SIZE + UICC_REFRESH_REQ_OFFSET_CLIENTID,
+            iMmUiccMessHandler->GetUiccClientId() );
+        isiMsg.Set16bit( ISI_HEADER_SIZE + UICC_REFRESH_REQ_OFFSET_FILLERBYTE1,
+            KPadding );
+        isiMsg.Set8bit( ISI_HEADER_SIZE + UICC_REFRESH_REQ_OFFSET_NSB,
+            0 ); // No subblocks
+
+        ret = iPhoNetSender->Send( isiMsg.Complete() );
+        iRefreshError = EFalse;
+
+        // When NTSY/CTSY refresh was performed, set iCompleteRefresfDone flag
+        // that IPC EMmTsySimRefreshDoneIPC will be completed to CTSY
+        if ( UICC_REFRESH_DONE == aStatus || UICC_REFRESH_NOT_OK == aStatus )
+            {
+            iCompleteRefresfDone = ETrue;
+            }
+        }
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::HandleUiccRefresh
+//
+// --------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::HandleUiccRefresh( const TIsiReceiveC &aIsiMessage )
+    {
+TFLOGSTRING("TSY:CMmPhoneMessHandler::HandleUiccRefresh" );
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh" );
+
+    TUint16 refreshFiles( 0 );
+    TBool enabledServicesChanged( EFalse );
+    TUint startIndex( ISI_HEADER_SIZE + SIZE_UICC_REFRESH_IND );
+
+    // There is one subblock UICC_SB_APPL_PATH per refreshed file
+    TUint uiccSbApplPathOffset( 0 );
+    while ( KErrNone == aIsiMessage.FindSubBlockOffsetById(
+        startIndex,
+        UICC_SB_APPL_PATH,
+        EIsiSubBlockTypeId16Len16,
+        uiccSbApplPathOffset ) )
+        {
+        TUint16 sbLen( aIsiMessage.Get16bit(
+            uiccSbApplPathOffset + UICC_SB_APPL_PATH_OFFSET_SBLEN ) );
+
+        // Get file id
+        TUint16 fileId( aIsiMessage.Get16bit(
+            uiccSbApplPathOffset + UICC_SB_APPL_PATH_OFFSET_EF ) );
+
+        switch( fileId )
+            {
+            case KElemFileSmsParams: // 6F42, SMS parameters
+                {
+TFLOGSTRING("TSY:CMmPhoneMessHandler::HandleUiccRefresh: SMSP refresh.");
+OstTrace0( TRACE_NORMAL, DUP2_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: SMSP refresh" );
+                refreshFiles |= KCacheSmsParams;
+                break;
+                }
+            case KElemFileFixedDiallingNumbers: // 6F3B, Storage FDN
+                {
+TFLOGSTRING("TSY:CMmPhoneMessHandler::HandleUiccRefresh: FDN refresh");
+OstTrace0( TRACE_NORMAL, DUP3_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: FDN refresh" );
+                refreshFiles |= KCacheFdn;
+                break;
+                }
+            case KElemSimServiceTable: // 6F38, Service table
+                {
+TFLOGSTRING("TSY:CMmPhoneMessHandler::HandleUiccRefresh: ServiceTable refresh");
+OstTrace0( TRACE_NORMAL, DUP4_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: ServiceTable refresh" );
+                refreshFiles |= KCacheServiceTable;
+                // Also internal service table cacheing is needed. EFalse means
+                // no complete to CTSY.
+                iInternalRefreshFiles |= KRefreshServiceTable;
+                iMmUiccMessHandler->InitializeSimServiceTableCache( EFalse );
+                break;
+                }
+            case KElemFileDynFlagsOrange: // 6F9F, ALS
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::HandleUiccRefresh: ALS line refresh");
+OstTrace0( TRACE_NORMAL, DUP5_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: ALS line." );
+                refreshFiles |= KCacheALSline;
+                break;
+                }
+            case KElemFileShortMessages: // 6F3C, SMS
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::HandleUiccRefresh: SMS refresh");
+OstTrace0( TRACE_NORMAL, DUP6_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: SMS refresh" );
+                iInternalRefreshFiles |= KRefreshSms;
+                iMessageRouter->GetSmsMessHandler()->InitializeSmsCache();
+                break;
+                }
+            case KElemFileAcl: // 6F57, ACL
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::HandleUiccRefresh: APN refresh");
+OstTrace0( TRACE_NORMAL, DUP7_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: APN refresh" );
+                iMessageRouter->Complete(
+                    EMobilePhoneNotifyAPNListChanged,
+                    KErrNone );
+
+                // Clear and delete cache
+                if ( iAPNList )
+                    {
+                    iAPNList->Reset();
+                    delete iAPNList;
+                    iAPNList = NULL;
+                    }
+                break;
+                }
+            case KElemEst: // 6F56, Enabled service table
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::HandleUiccRefresh: ServiceTable enabled");
+OstTrace0( TRACE_NORMAL, DUP8_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: ServiceTable enabled" );
+                enabledServicesChanged = ETrue;
+                break;
+                }
+            case KElemFileCallFwdFlagsCphs:
+            case KElemFileCallFwdIndicationStatus:
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::HandleUiccRefresh: Call forwarding flags refresh ");
+OstTrace0( TRACE_NORMAL, DUP9_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: Call forwarding flags refresh" );
+                // Re-read call forwarding flags
+                iInternalRefreshFiles |= KRefreshCallForwardingFlags;
+
+                iMessageRouter->GetSupplServHandler()->ExtFuncL(
+                    ECustomNotifyIccCallForwardingStatusChangeIPC,
+                    NULL );
+                break;
+                }
+            case KElemFileOpl: // 6FC6, Operator PLMN List
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::HandleUiccRefresh: OPL list refresh");
+OstTrace0( TRACE_NORMAL, DUP10_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: OPL list refresh" );
+
+                iInternalRefreshFiles |= KRefreshOplRules;
+
+                iMessageRouter->
+                    GetNetMessHandler()->
+                    GetNetOperatorNameHandler()->
+                    UiccReadOplRecordCount();
+                break;
+                }
+            case KElemFilePlmnNetworkName: // 6FC5, PLMN Network Name
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::HandleUiccRefresh: PNN refresh");
+OstTrace0( TRACE_NORMAL, DUP11_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: PNN refresh" );
+
+                iInternalRefreshFiles |= KRefreshPnnRecord;
+
+                // Get PNN record to be cached.
+                TUint8 pnnIdentifier(
+                    iMessageRouter->
+                    GetNetMessHandler()->
+                    GetNetOperatorNameHandler()->
+                    GetPnnRecordIdentifierValue() );
+
+                iMessageRouter->
+                    GetNetMessHandler()->
+                    GetNetOperatorNameHandler()->
+                    UiccOperatorReqReadPnn( pnnIdentifier );
+                break;
+                }
+            case KElemFileOperatorName: // 6F14, Operator name
+                {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::HandleUiccRefresh: ONS name refresh");
+OstTrace0( TRACE_NORMAL, DUP12_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: ONS name refresh" );
+
+                iInternalRefreshFiles |= KRefreshOnsName;
+
+                iMessageRouter->
+                    GetNetMessHandler()->
+                    GetNetOperatorNameHandler()->
+                    UiccOperatorReq();
+                break;
+                }
+            default:
+                {
+TFLOGSTRING2("TSY:CMmPhoneMessHandler::HandleUiccRefresh:Unknown type: 0x%x", fileId);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh;fileId=%hu", fileId );
+                break;
+                }
+            }
+
+        // Abbreviated dialling numbers, EFadn 4FXX
+        if ( 0x4F == ( fileId >> 8 ) )
+            {
+TFLOGSTRING("TSY:CMmPhoneMessHandler::HandleUiccRefresh: ADN refresh.");
+OstTrace0( TRACE_NORMAL, DUP13_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh: ADN refresh" );
+
+            refreshFiles |= KCacheAdn;
+            }
+
+        startIndex = uiccSbApplPathOffset + sbLen;
+        }
+
+    // If Enabled Services table has been changed during the refresh,
+    // we need to make phonebook init phase 1 to enable UICC to send
+    // indication about FDN.
+    if ( enabledServicesChanged )
+        {
+        // In case of ADN or FDN phonebook refresh, CommonTSY is
+        // responsible of making phonebook initialization. => No need for
+        // internal initialization.
+        if ( !( refreshFiles & KCacheAdn )
+            && !( refreshFiles & KCacheFdn ) )
+            {
+            // Creating buffer for phonebook's name
+            TName phonebookName;
+            phonebookName.Copy( KInternalPhoneBookType );
+
+            CPhoneBookDataPackage package;
+            package.SetPhoneBookName( phonebookName );
+
+            iMessageRouter->PhoneBookStoreMessHandler()->ExtFuncL(
+                EMmTsyPhoneBookStoreInitIPC,
+                &package );
+            }
+        }
+
+    // Check if we have any files to refresh in CommonTSY.
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::HandleUiccRefresh: refreshFiles = %d", refreshFiles );
+OstTraceExt1( TRACE_NORMAL, DUP14_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh;refreshFiles=%hu", refreshFiles );
+    if ( 0 < refreshFiles )
+        {
+        iCommonTSYRefreshPending = ETrue;
+
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::HandleUiccRefresh: CommonTSY Refresh Pending = %d", iCommonTSYRefreshPending );
+OstTrace1( TRACE_NORMAL, DUP15_CMMPHONEMESSHANDLER_HANDLEUICCREFRESH, "CMmPhoneMessHandler::HandleUiccRefresh;iCommonTSYRefreshPending=%d", iCommonTSYRefreshPending );
+
+        // Packed parameter: List of files needed to be refreshed.
+        CMmDataPackage dataPackage;
+        dataPackage.PackData( &refreshFiles );
+
+        // Complete. This will start the cache update process.
+        iMessageRouter->Complete(
+            EMmTsySimRefreshNowIPC,
+            &dataPackage,
+            KErrNone );
+        }
+
+    // Send refresh done to UICC only if there's no CTSY/NTSY
+    // caching ongoing.
+    if ( ! iCommonTSYRefreshPending && ! iInternalRefreshFiles )
+        {
+        UiccRefreshReq( UICC_REFRESH_DONE );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::SmsCachingCompleted
+// Checks if "Refresh Done" will be sent to UICC now or later.
+// Counterpart is CMmPhoneMessHandler::ExtFuncL, case
+// EMmTsySimRefreshDoneIPC.
+// --------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::SmsCachingCompleted( TInt aError )
+    {
+    iInternalRefreshFiles ^= KRefreshSms;
+
+    if ( KErrNone == aError )
+        {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::SmsCachingCompleted: nokiatsy sms caching completed");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_SMSCACHINGCOMPLETED, "CMmPhoneMessHandler::SmsCachingCompleted: nokiatsy sms caching completed" );
+        UiccRefreshReq( UICC_REFRESH_DONE );
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::SmsCachingCompleted: nokiatsy sms caching completed with error %d", aError);
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_SMSCACHINGCOMPLETED, "CMmPhoneMessHandler::SmsCachingCompleted: nokiatsy sms caching completed with error" );
+        UiccRefreshReq( UICC_REFRESH_NOT_OK );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::ServiceTableCachingCompleted
+// Checks if "Refresh Done" will be sent to UICC now or later.
+// --------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::ServiceTableCachingCompleted( TInt aError )
+    {
+    iInternalRefreshFiles ^= KRefreshServiceTable;
+
+    if ( UICC_STATUS_OK == aError )
+        {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::ServiceTableCachingCompleted: nokiatsy service table caching completed");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_SERVICETABLECACHINGCOMPLETED, "CMmPhoneMessHandler::ServiceTableCachingCompleted: nokiatsy service table caching completed" );
+        UiccRefreshReq( UICC_REFRESH_DONE );
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::ServiceTableCachingCompleted: nokiatsy service table caching completed with error %d", aError);
+OstTrace1( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_SERVICETABLECACHINGCOMPLETED, "CMmPhoneMessHandler::ServiceTableCachingCompleted: nokiatsy service table caching completed with error;aError=%d", aError );
+        UiccRefreshReq( UICC_REFRESH_NOT_OK );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::CallForwFlagsCachingCompleted
+// Checks if "Refresh Done" will be sent to UICC.
+// Counterpart is CMmPhoneMessHandler::ExtFuncL, case
+// EMmTsySimRefreshDoneIPC.
+// ----------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::CallForwFlagsCachingCompleted( TUint aError )
+    {
+    iInternalRefreshFiles ^= KRefreshCallForwardingFlags;
+
+    if ( UICC_STATUS_OK == aError )
+        {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::CallForwFlagsCachingCompleted: nokiatsy refresh successfully completed ==> REFRESH_DONE");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_CALLFORWFLAGSCACHINGCOMPLETED, "CMmPhoneMessHandler::CallForwFlagsCachingCompleted: nokiatsy refresh successfully completed" );
+        UiccRefreshReq( UICC_REFRESH_DONE );
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::CallForwFlagsCachingCompleted: nokiatsy refresh completed with error %d ==> REFRESH_DONE", aError);
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_CALLFORWFLAGSCACHINGCOMPLETED, "CMmPhoneMessHandler::CallForwFlagsCachingCompleted: nokiatsy refresh completed with error" );
+        UiccRefreshReq( UICC_REFRESH_NOT_OK );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::OplRulesCachingCompleted
+// Checks if "Refresh Done" will be sent to UICC.
+// ----------------------------------------------------------------------------
+//
+TBool CMmPhoneMessHandler::OplRulesCachingCompleted( TInt aError )
+    {
+    // Initialize OPL refresh ongoing value.
+    TBool oplRefreshOngoing( EFalse );
+
+    // Check if refresh is ongoing.
+    if ( iInternalRefreshFiles & KRefreshOplRules )
+        {
+        iInternalRefreshFiles ^= KRefreshOplRules;
+
+        oplRefreshOngoing = ETrue;
+
+        if ( KErrNone == aError )
+            {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::OplRulesCachingCompleted: nokiatsy refresh successfully completed ==> REFRESH_DONE");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_OPLRULESCACHINGCOMPLETED, "CMmPhoneMessHandler::OplRulesCachingCompleted: nokiatsy refresh successfully completed ==> REFRESH_DONE" );
+            UiccRefreshReq( UICC_REFRESH_DONE );
+            }
+        else
+            {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::OplRulesCachingCompleted: nokiatsy refresh completed with error %d ==> REFRESH_DONE", aError);
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_OPLRULESCACHINGCOMPLETED, "CMmPhoneMessHandler::OplRulesCachingCompleted: nokiatsy refresh completed with error" );
+            UiccRefreshReq( UICC_REFRESH_NOT_OK );
+            }
+        }
+
+    return oplRefreshOngoing;
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::PnnRecordCachingCompleted
+// Checks if "Refresh Done" will be sent to UICC.
+// ----------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::PnnRecordCachingCompleted( TUint8 aError )
+    {
+    // Check if refresh is ongoing.
+    if ( iInternalRefreshFiles & KRefreshPnnRecord )
+        {
+        iInternalRefreshFiles ^= KRefreshPnnRecord;
+
+        if ( UICC_STATUS_OK == aError )
+            {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::PnnRecordCachingCompleted: nokiatsy refresh successfully completed ==> REFRESH_DONE");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_PNNRECORDCACHINGCOMPLETED, "CMmPhoneMessHandler::PnnRecordCachingCompleted: nokiatsy refresh successfully completed ==> REFRESH_DONE" );
+            UiccRefreshReq( UICC_REFRESH_DONE );
+            }
+        else
+            {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::PnnRecordCachingCompleted: nokiatsy refresh completed with error %d ==> REFRESH_DONE", aError);
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_PNNRECORDCACHINGCOMPLETED, "CMmPhoneMessHandler::PnnRecordCachingCompleted: nokiatsy refresh completed with error" );
+            UiccRefreshReq( UICC_REFRESH_NOT_OK );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::OnsNameCachingCompleted
+// Checks if "Refresh Done" will be sent to SIMSON.
+// ----------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::OnsNameCachingCompleted( TUint8 aError )
+    {
+    // Check if refresh is ongoing.
+    if ( iInternalRefreshFiles & KRefreshOnsName )
+        {
+        iInternalRefreshFiles ^= KRefreshOnsName;
+
+        if ( UICC_STATUS_OK == aError )
+            {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::OnsNameCachingCompleted: nokiatsy refresh successfully completed ==> REFRESH_DONE");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_ONSNAMECACHINGCOMPLETED, "CMmPhoneMessHandler::OnsNameCachingCompleted: nokiatsy refresh successfully completed ==> REFRESH_DONE" );
+            UiccRefreshReq( UICC_REFRESH_DONE );
+            }
+        else
+            {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::OnsNameCachingCompleted: nokiatsy refresh completed with error %d ==> REFRESH_DONE", aError);
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_ONSNAMECACHINGCOMPLETED, "CMmPhoneMessHandler::OnsNameCachingCompleted: nokiatsy refresh completed with error" );
+            UiccRefreshReq( UICC_REFRESH_NOT_OK );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccReadEfEstReq
+// reads EFest
+// ----------------------------------------------------------------------------
+//
+TInt CMmPhoneMessHandler::UiccReadEfEstReq()
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccReadEfEstReq");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCREADEFESTREQ, "CMmPhoneMessHandler::UiccReadEfEstReq" );
+
+    TInt ret( KErrNone );
+
+    if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() &&
+        iMmUiccMessHandler->GetServiceStatus( KServiceAcl ) )
+        {
+        // Set parameters for UICC_APPL_CMD_REQ message
+        TUiccReadTransparent params;
+        params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+        params.trId = ETrIdAclStatusReadEfEst;
+        params.dataAmount = 0;
+        params.dataOffset = 0;
+        params.fileId = KElemEst;
+        params.fileIdSfi = 0x05;
+        params.serviceType = UICC_APPL_READ_TRANSPARENT;
+
+        // File id path
+        params.filePath.Append( KMasterFileId >> 8 );
+        params.filePath.Append( KMasterFileId );
+        params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+        ret = iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccReadEfEstReq: card type is NOT UICC or ACL not supported in EFust");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_UICCREADEFESTREQ, "CMmPhoneMessHandler::UiccReadEfEstReq: card type is NOT UICC or ACL not supported in EFust" );
+        iACLIsProgress = EFalse;
+        ret = KErrNotFound;
+        }
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccGetAclStatusReadEfEstResp
+// Handles EFest read response in case of getting ACL status
+// ----------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::UiccGetAclStatusReadEfEstResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccGetAclStatusReadEfEstResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCGETACLSTATUSREADEFESTRESP, "CMmPhoneMessHandler::UiccGetAclStatusReadEfEstResp" );
+
+    TInt ret( KErrNone );
+    RMobilePhone::TAPNControlListServiceStatus aclStatus;
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        TUint8 aclState( aFileData[0] & KAclStateMask );
+        if( aclState )
+            {
+            aclStatus = RMobilePhone::EAPNControlListServiceEnabled;
+            }
+        else
+            {
+            aclStatus = RMobilePhone::EAPNControlListServiceDisabled;
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::UiccGetAclStatusReadEfEstResp: EFest reading failed: 0x%x", aStatus);
+OstTrace1( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_UICCGETACLSTATUSREADEFESTRESP, "CMmPhoneMessHandler::UiccGetAclStatusReadEfEstResp: EFest reading failed: 0x%x", aStatus );
+        ret = KErrAccessDenied;
+        }
+
+    // complete with packed parameter
+    CMmDataPackage dataPackage;
+
+    if( KErrNone == ret )
+        {
+        dataPackage.PackData( &aclStatus );
+        }
+
+    iACLIsProgress = EFalse; //set ACL flag
+    iMessageRouter->Complete(
+        EMobilePhoneGetAPNControlListServiceStatus,
+        &dataPackage,
+        ret );
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp
+// Handles EFest read response in case of setting ACL status
+// ----------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCSETACLSTATUSREADEFESTRESP, "CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp" );
+
+    TInt ret( KErrNone );
+    TBool completeNeeded( ETrue );
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        TUint8 aclState( aFileData[0] );
+        if( aclState & KAclStateMask )
+            {
+            if( RMobilePhone::EAPNControlListServiceDisabled == iAclStatus )
+                {
+                // ACL state is enabled and we need to set it to disabled .
+                // So EFest needs to be updated
+                completeNeeded = EFalse;
+                UiccSetAclStatusWriteEfEstReq( aclState );
+                }
+            else
+                {
+                // ACL status already correct, let's complete
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp: ACL status already correct, let's complete");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_UICCSETACLSTATUSREADEFESTRESP, "CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp: ACL status already correct, let's complete" );
+                }
+            }
+        else
+            {
+            if( RMobilePhone::EAPNControlListServiceEnabled == iAclStatus )
+                {
+                // EFest needs to be updated
+                completeNeeded = EFalse;
+                UiccSetAclStatusWriteEfEstReq( aclState );
+                }
+            else
+                {
+                // ACL status already correct, let's complete
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp: ACL status already correct, let's complete");
+OstTrace0( TRACE_NORMAL, DUP2_CMMPHONEMESSHANDLER_UICCSETACLSTATUSREADEFESTRESP, "CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp: ACL status already correct, let's complete" );
+                }
+            }
+        }
+    else
+        {
+        // EFest reading failed
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp: EFest reading failed: 0x%x", aStatus );
+OstTrace1( TRACE_NORMAL, DUP3_CMMPHONEMESSHANDLER_UICCSETACLSTATUSREADEFESTRESP, "CMmPhoneMessHandler::UiccSetAclStatusReadEfEstResp: EFest reading failed: 0x%x", aStatus );
+        ret = KErrAccessDenied;
+        }
+
+    if( completeNeeded )
+        {
+        // set flag and complete
+        iACLIsProgress = EFalse; //set ACL flag
+        iMessageRouter->Complete(
+            EMobilePhoneSetAPNControlListServiceStatus,
+            ret );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstReq
+// Writes ACL status to EFest
+// ----------------------------------------------------------------------------
+//
+TInt CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstReq(  TUint8 aOldAclState )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstReq");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCSETACLSTATUSWRITEEFESTREQ, "CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstReq" );
+
+    TInt ret( KErrNone );
+    TUint8 newState;
+    if( RMobilePhone::EAPNControlListServiceDisabled == iAclStatus )
+        {
+        // ACL status is going to be disabled and status is in 3rd
+        // bit of 1st byte, so let's set 3rd bit in 1st byte to 0
+        newState = aOldAclState & 0xFB;
+        }
+    else
+        {
+        // ACL status is going to be enabled and status is in 3rd
+        // bit of 1st byte, so let's set 3rd bit in 1st byte to 1
+        newState = aOldAclState + 0x04;
+        }
+
+    if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() &&
+        iMmUiccMessHandler->GetServiceStatus( KServiceAcl ) )
+        {
+        TUiccWriteTransparent params;
+        params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+        params.trId = ETrIdAclStatusWriteEfEst;
+        params.dataOffset = 0;
+        params.dataAmount = 1; // only one byte is update
+        params.fileId = KElemEst;
+        params.fileIdSfi = 0x05;
+        params.serviceType = UICC_APPL_UPDATE_TRANSPARENT;
+        // File id path
+        params.filePath.Append( KMasterFileId >> 8 );
+        params.filePath.Append( KMasterFileId );
+        params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+        params.fileData.Append( newState );
+
+        ret = iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstReq: card type is NOT UICC or ACL not supported in EFust");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_UICCSETACLSTATUSWRITEEFESTREQ, "CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstReq: card type is NOT UICC or ACL not supported in EFust" );
+        iACLIsProgress = EFalse;
+        ret = KErrGeneral;
+        }
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstResp
+// Handles EFest write response in case of setting ACL status
+// ----------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstResp(
+    TInt aStatus )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCSETACLSTATUSWRITEEFESTRESP, "CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstResp" );
+    TInt ret( KErrAccessDenied );
+
+    if( UICC_STATUS_OK == aStatus )
+        {
+        ret = KErrNone;
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstResp: writing failed: 0x%x", aStatus);
+OstTrace1( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_UICCSETACLSTATUSWRITEEFESTRESP, "CMmPhoneMessHandler::UiccSetAclStatusWriteEfEstResp: writing failed: 0x%x", aStatus );
+        }
+
+    iACLIsProgress = EFalse; //set ACL flag
+    iMessageRouter->Complete(
+        EMobilePhoneSetAPNControlListServiceStatus,
+        ret );
+
+    if ( KErrNone == ret )
+        {
+        iMessageRouter->Complete(
+            EMobilePhoneNotifyAPNControlListServiceStatusChange,
+            KErrNone );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccReadAclReq
+// reads ACL list from EFacl
+// ----------------------------------------------------------------------------
+//
+TInt CMmPhoneMessHandler::UiccReadAclReq()
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccReadAclReq");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCREADACLREQ, "CMmPhoneMessHandler::UiccReadAclReq" );
+
+    TInt ret( KErrNone );
+
+    if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() &&
+        iMmUiccMessHandler->GetServiceStatus( KServiceAcl ) )
+        {
+        // Set parameters for UICC_APPL_CMD_REQ message
+        TUiccReadTransparent params;
+        params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+        params.trId = ETrIdAclReadEfAcl;
+        params.dataAmount = 0;
+        params.dataOffset = 0;
+        params.fileId = KElemFileAcl;
+        params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+        params.serviceType = UICC_APPL_READ_TRANSPARENT;
+
+        // File id path
+        params.filePath.Append( KMasterFileId >> 8 );
+        params.filePath.Append( KMasterFileId );
+        params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+        ret = iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccReadAclReq: card type is NOT UICC or ACL not supported in EFust");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_UICCREADACLREQ, "CMmPhoneMessHandler::UiccReadAclReq: card type is NOT UICC or ACL not supported in EFust" );
+        iACLIsProgress = EFalse;
+        ret = KErrNotFound;
+        }
+
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccReadAclResp
+// Handles response for ACL list reading from EFacl
+// ----------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::UiccReadAclResp(
+    TInt aStatus,
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccReadAclResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCREADACLRESP, "CMmPhoneMessHandler::UiccReadAclResp" );
+    TInt ret( KErrNone );
+    if( UICC_STATUS_OK == aStatus )
+        {
+        if( iAPNList )
+            {
+            delete iAPNList;
+            iAPNList = 0;
+            }
+
+        TPtrC8 dataPoint;
+        dataPoint.Set( &aFileData[KApnDataIndex], aFileData.Length() - 1 );
+        iAPNList = DecodeACL( dataPoint, aFileData[KNumOfApnsIndex] );
+
+        switch( iOngoingAclIpc )
+            {
+            case EMobilePhoneEnumerateAPNEntries:
+                {
+                CompleteEnumerateAPNEntries();
+                break;
+                }
+            case EMobilePhoneGetAPNname:
+                {
+                CompleteGetAPNName( iAPNReadOrDeleteIndex );
+                break;
+                }
+            case EMobilePhoneDeleteAPNName:
+                {
+                ret = UiccDeleteApnEntry( iAPNReadOrDeleteIndex );
+                break;
+                }
+            case EMobilePhoneAppendAPNName:
+                {
+                iAPNList->AppendL( iAPNDataBuffer.iApn );
+                ret = UiccWriteEfAclReq();
+                break;
+                }
+            default:
+                {
+TFLOGSTRING2( "TSY: CMmPhoneMessHandler::UiccReadAclResp: unknown IPC (%d)", iOngoingAclIpc );
+OstTrace1( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_UICCREADACLRESP, "CMmPhoneMessHandler::UiccReadAclResp: unknown IPC (%d)", iOngoingAclIpc );
+                iACLIsProgress = EFalse;
+                break;
+                }
+            }
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::UiccReadAclResp: reading failed: 0x%x", aStatus);
+OstTrace1( TRACE_NORMAL, DUP2_CMMPHONEMESSHANDLER_UICCREADACLRESP, "CMmPhoneMessHandler::UiccReadAclResp: reading failed: 0x%x", aStatus );
+        ret = KErrAccessDenied;
+        }
+
+    if( KErrNone != ret )
+        {
+        iACLIsProgress = EFalse;
+        iMessageRouter->Complete( iOngoingAclIpc, ret );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::DecodeACL
+// Encrypt from ACL to CDesC8ArrayFlat
+// --------------------------------------------------------------------------
+//
+CDesC8ArrayFlat* CMmPhoneMessHandler::DecodeACL
+        (
+        const TDesC8& aTlv,
+        TInt aTotalEntries
+        ) const
+    {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::DecodeACL. Number of total entries: %d", aTotalEntries);
+OstTrace1( TRACE_NORMAL, CMMPHONEMESSHANDLER_DECODEACL, "CMmPhoneMessHandler::DecodeACL. Number of total entries: %d", aTotalEntries );
+
+    // allocate new array, 1 is granularity
+    CDesC8ArrayFlat* apnList = new( ELeave ) CDesC8ArrayFlat( 1 );
+    CleanupStack::PushL( apnList );
+
+    TInt offset( 0 );
+
+    //check length before using
+    if ( 0 < aTlv.Length() )
+        {
+        // decode TLV entries to CDesC8ArrayFlat
+        for ( TInt i = 0; i < aTotalEntries; i++ )
+            {
+            TInt tag( aTlv[offset++] );
+
+            // spec: The tag value of the APN-TLV shall be 'DD'
+            TF_ASSERT( tag == 0xdd );
+
+            TInt len( aTlv[offset++] );
+            TF_ASSERT( len <= 100 );   // spec: APN max length is 100
+
+            TPtrC8 data = aTlv.Mid( offset, len );
+            apnList->InsertL( i, data );
+
+            offset += len; // advance to next TLV
+            }
+        }
+
+    CleanupStack::Pop( apnList );
+    return apnList;
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::CompleteEnumerateAPNEntries
+// send number of ACL index to the client.
+// --------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::CompleteEnumerateAPNEntries()
+    {
+    TInt indexCount( iAPNList->MdcaCount() );
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::CompleteEnumerateAPNEntries. Number of APN's: %d",indexCount);
+OstTrace1( TRACE_NORMAL, CMMPHONEMESSHANDLER_COMPLETEENUMERATEAPNENTRIES, "CMmPhoneMessHandler::CompleteEnumerateAPNEntries. Number of APN's: %d", indexCount );
+
+    //package index of TLV's to the client
+    CMmDataPackage dataPackage;
+    dataPackage.PackData( &indexCount );
+
+    // set flag and complete
+    iACLIsProgress = EFalse; //set ACL flag
+    iMessageRouter->Complete(
+        EMobilePhoneEnumerateAPNEntries,
+        &dataPackage,
+        KErrNone );
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::CompleteGetAPNName
+// send APN name to the client.
+// --------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::CompleteGetAPNName( TUint8 aIndex )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::CompleteGetAPNName ");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_COMPLETEGETAPNNAME, "CMmPhoneMessHandler::CompleteGetAPNName" );
+
+    CMmDataPackage dataPackage;
+    RMobilePhone::TAPNEntryV3 aclEntry;
+    TInt err( KErrNone );
+
+    //check if index is valid or not.
+    if ( iAPNList->MdcaCount() <= aIndex )
+        {
+        err = KErrOverflow;
+        }
+    else
+        {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::CompleteGetAPNName. Copy entry from index %d",aIndex);
+OstTrace1( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_COMPLETEGETAPNNAME, "CMmPhoneMessHandler::CompleteGetAPNName. Copy entry from index %d", aIndex );
+        aclEntry.iApn.Copy( iAPNList->MdcaPoint( aIndex ) );
+        }
+
+    dataPackage.PackData( &aclEntry );
+
+    // set flag and complete
+    iACLIsProgress = EFalse; //set ACL flag
+    iMessageRouter->Complete( EMobilePhoneGetAPNname, &dataPackage, err );
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccDeleteApnEntry
+// Deletes APN entry from internal cache and writes the change to EFacl
+// --------------------------------------------------------------------------
+//
+TInt CMmPhoneMessHandler::UiccDeleteApnEntry( TInt aIndex )
+    {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccDeleteApnEntry ");
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCDELETEAPNENTRY, "CMmPhoneMessHandler::UiccDeleteApnEntry" );
+
+    TInt ret;
+    //check if aIndex is valid or not.
+    if ( iAPNList->MdcaCount() <= aIndex )
+        {
+        //error occurs
+        ret = KErrOverflow;
+        }
+    else
+        {
+        //data is valid
+        //delete data from cache
+        iAPNList->Delete( aIndex );
+        iAPNList->Compress();
+
+        //write new list to the SIM
+        ret = UiccWriteEfAclReq();
+        }
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccWriteEfAclReq
+// Writes APN entries from internal cache to the EFAcl
+// --------------------------------------------------------------------------
+//
+TInt CMmPhoneMessHandler::UiccWriteEfAclReq()
+    {
+TFLOGSTRING( "TSY: CMmPhoneMessHandler::UiccWriteEfAclReq" );
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCWRITEEFACLREQ, "CMmPhoneMessHandler::UiccWriteEfAclReq" );
+
+    TInt ret( KErrNone );
+
+    if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() &&
+        iMmUiccMessHandler->GetServiceStatus( KServiceAcl ) )
+        {
+        TInt dataLen( ACLLength( iAPNList ) );
+        TUint8 apnCount( iAPNList->MdcaCount() );
+
+        TUiccWriteTransparent params;
+        params.messHandlerPtr = static_cast<MUiccOperationBase*>( this );
+        params.trId = ETrIdAclWriteEfAcl;
+        params.dataOffset = 0;
+        params.dataAmount = dataLen;
+        params.fileId = KElemFileAcl;
+        params.fileIdSfi = UICC_SFI_NOT_PRESENT;
+        params.serviceType = UICC_APPL_UPDATE_TRANSPARENT;
+        // File id path
+        params.filePath.Append( KMasterFileId >> 8 );
+        params.filePath.Append( KMasterFileId );
+        params.filePath.Append( iMmUiccMessHandler->GetApplicationFileId() );
+
+        params.fileData.Append( apnCount );
+        for ( TInt i = 0; i < apnCount; i++ )
+            {
+            TPtrC8 apn = iAPNList->MdcaPoint( i );
+            // spec: The tag value of the APN-TLV shall be 'DD'
+            params.fileData.Append( 0xdd );
+            params.fileData.Append( apn.Length() );
+            params.fileData.Append( apn );
+            }
+
+        ret = iMmUiccMessHandler->CreateUiccApplCmdReq( params );
+        }
+    else
+        {
+TFLOGSTRING("TSY: CMmPhoneMessHandler::UiccWriteEfAclReq: card type is NOT UICC or ACL not supported in EFust");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_UICCWRITEEFACLREQ, "CMmPhoneMessHandler::UiccWriteEfAclReq: card type is NOT UICC or ACL not supported in EFust" );
+        iACLIsProgress = EFalse;
+        ret = KErrNotFound;
+        }
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::UiccWriteEfAclResp
+// Handles response for EFAcl writing
+// --------------------------------------------------------------------------
+//
+void CMmPhoneMessHandler::UiccWriteEfAclResp( TInt aStatus )
+    {
+TFLOGSTRING( "TSY: CMmPhoneMessHandler::UiccWriteEfAclResp" );
+OstTrace0( TRACE_NORMAL, CMMPHONEMESSHANDLER_UICCWRITEEFACLRESP, "CMmPhoneMessHandler::UiccWriteEfAclResp" );
+
+    TInt ret( KErrNone );
+    if( UICC_STATUS_OK != aStatus )
+        {
+TFLOGSTRING2( "TSY: CMmPhoneMessHandler::UiccWriteEfAclResp: EFacl writing failed: 0x%x", aStatus );
+OstTrace1( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_UICCWRITEEFACLRESP, "CMmPhoneMessHandler::UiccWriteEfAclResp: EFacl writing failed: 0x%x", aStatus );
+
+        ret = KErrAccessDenied;
+        }
+
+    iACLIsProgress = EFalse; //set ACL flag
+    iMessageRouter->Complete(
+        iOngoingAclIpc,
+        ret );
+    }
+
+// --------------------------------------------------------------------------
+// CMmPhoneMessHandler::ACLLength
+// calculate total length of ACL
+// --------------------------------------------------------------------------
+//
+TUint16 CMmPhoneMessHandler::ACLLength( CDesC8ArrayFlat* aApnList ) const
+    {
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::ACLLength. Count: %d", aApnList->MdcaCount());
+OstTrace1( TRACE_NORMAL, CMMPHONEMESSHANDLER_ACLLENGTH, "CMmPhoneMessHandler::ACLLength. Count: %d", aApnList->MdcaCount() );
+
+    TUint16 length( 0 );
+
+    for ( TInt i = 0; i < aApnList->MdcaCount(); i++ )
+        {
+        TPtrC8 apn = aApnList->MdcaPoint( i );
+        length += apn.Length() + 2;
+        }
+
+    // result is incremented by one because of EFacl contains number of tlv objects
+    // as first byte of the file data
+    length++;
+
+TFLOGSTRING2("TSY: CMmPhoneMessHandler::ACLLength. ACL len: %d", length);
+OstTrace1( TRACE_NORMAL, DUP1_CMMPHONEMESSHANDLER_ACLLENGTH, "CMmPhoneMessHandler::ACLLength. ACL len: %d", length );
+
+    return length;
+    }
+
 // End of file