adaptationlayer/tsy/nokiatsy_dll/src/cmmphonebookoperationdelete.cpp
changeset 5 8ccc39f9d787
child 6 942573423a60
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/adaptationlayer/tsy/nokiatsy_dll/src/cmmphonebookoperationdelete.cpp	Thu Jan 14 10:44:58 2010 +0200
@@ -0,0 +1,833 @@
+/*
+* Copyright (c) 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:   ?Description
+*
+*/
+
+//  INCLUDE FILES
+#include <etelmm.h>
+#include <tisi.h>
+#include <pn_const.h>
+#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
+#include "tsylogger.h"
+#include "cmmmessagerouter.h"
+#include "cmmphonebookoperationdelete.h"
+#include "osttracedefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cmmphonebookoperationdeletetraces.h"
+#endif
+
+// EXTERNAL DATA STRUCTURES
+    // None
+
+// EXTERNAL FUNCTION PROTOTYPES
+    // None
+
+// CONSTANTS
+
+
+// MACROS
+    // None
+
+// LOCAL CONSTANTS AND MACROS
+const TUint8 KExtensionDataBytes( 13 );
+const TUint8 KEfAdnDataBytes( 14 );
+const TUint8 KMaxAlphaStringBytes( 241 );
+
+// MODULE DATA STRUCTURES
+    // None
+
+// LOCAL FUNCTION PROTOTYPES
+    // None
+
+// ==================== LOCAL FUNCTIONS =====================================
+    // None
+
+
+// ================= MEMBER FUNCTIONS =======================================
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::CMmPhoneBookOperationDelete
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------
+//
+CMmPhoneBookOperationDelete::CMmPhoneBookOperationDelete()
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::CMmPhoneBookOperationDelete");
+OstTrace0( TRACE_NORMAL, CMmPhoneBookOperationDelete_CMmPhoneBookOperationDelete, "CMmPhoneBookOperationDelete::CMmPhoneBookOperationDelete" );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::~CMmPhoneBookOperationDelete
+// C++ destructor.
+// ---------------------------------------------------------------------------
+//
+CMmPhoneBookOperationDelete::~CMmPhoneBookOperationDelete()
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::~CMmPhoneBookOperationDelete");
+OstTrace0( TRACE_NORMAL, DUP1_CMmPhoneBookOperationDelete_CMmPhoneBookOperationDelete, "CMmPhoneBookOperationDelete::~CMmPhoneBookOperationDelete" );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::NewL
+// Creates a new CMmPhoneBookOperationDelete object instance.
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+
+CMmPhoneBookOperationDelete* CMmPhoneBookOperationDelete::NewL(
+    CMmPhoneBookStoreMessHandler* aMmPhoneBookStoreMessHandler,
+    CMmUiccMessHandler* aUiccMessHandler,
+    const CMmDataPackage* aDataPackage ) // Data
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::NewL");
+OstTrace0( TRACE_NORMAL, CMmPhoneBookOperationDelete_NEWL, "CMmPhoneBookOperationDelete::NewL" );
+
+    CMmPhoneBookOperationDelete* mmPhoneBookOperationDelete =
+        new( ELeave ) CMmPhoneBookOperationDelete();
+
+    const CPhoneBookDataPackage* phoneBookData =
+        static_cast<const CPhoneBookDataPackage*>( aDataPackage );
+
+    // Store phonebook name
+    TName phonebookTypeName;
+    phoneBookData->GetPhoneBookName( phonebookTypeName );
+    mmPhoneBookOperationDelete->iPhoneBookTypeName = phonebookTypeName;
+
+    mmPhoneBookOperationDelete->iMmPhoneBookStoreMessHandler =
+        aMmPhoneBookStoreMessHandler;
+
+    mmPhoneBookOperationDelete->iMmUiccMessHandler = aUiccMessHandler;
+
+    mmPhoneBookOperationDelete->iNumOfExtensions = 0;
+    mmPhoneBookOperationDelete->iFileIdExt = 0;
+    mmPhoneBookOperationDelete->iIndex = 0;
+    mmPhoneBookOperationDelete->iEntry.iEntryIndex = 0;
+    mmPhoneBookOperationDelete->iEntry.iEntryPresent = EFalse;
+    mmPhoneBookOperationDelete->iTransId = 0xFF;
+    mmPhoneBookOperationDelete->iArrayIndex = 0;
+    mmPhoneBookOperationDelete->iLocationFoundInPbList = EFalse;
+    mmPhoneBookOperationDelete->iExtRecordArrayToBeDelete.Reset();
+    mmPhoneBookOperationDelete->iNumOfEntries = 0;
+
+    return mmPhoneBookOperationDelete;
+    }
+
+// ---------------------------------------------------------------------------
+// TInt CMmPhoneBookOperationDelete::UICCCreateReq
+// Separate requests
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::UICCCreateReq(
+    TInt aIpc,
+    const CMmDataPackage* aDataPackage,
+    TUint8 aTransId )
+    {
+TFLOGSTRING2("TSY: CMmPhoneBookOperationDelete::UICCCreateReq Ipc: %d", aIpc);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMmPhoneBookOperationDelete_UICCCREATEREQ, "CMmPhoneBookOperationDelete::UICCCreateReq;aIpc=%hd", aIpc );
+
+    TInt ret( KErrNotSupported );
+    iIpc = aIpc;
+    iTransId = aTransId;
+    // Convert phone book name to file id
+    iFileId = ConvertToPBfileId( iPhoneBookTypeName, iFileIdExt );
+    // Find location from internal array
+    iArrayIndex = ConvertToConfArrayIndex( iFileId );
+
+    const CPhoneBookDataPackage* phoneBookData(
+        static_cast<const CPhoneBookDataPackage*>( aDataPackage ) );
+
+    switch( aIpc )
+        {
+        case EMmTsyPhoneBookStoreDeleteIPC:
+            {
+            phoneBookData->UnPackData( iIndex );
+
+            if( PB_MBDN_FID == iFileId )
+                {
+                // For MBDN PhoneBook first read MBI file 
+                // Check if the mailbox inidcation type is correct
+                if( iIndex <= iMmPhoneBookStoreMessHandler->
+                        iPBStoreConf[iArrayIndex].iMbiRecLen )
+                    {
+                    iCurrentDeletePhase = EPBDeletePhase_Read_MBI_profile;
+                    // read MBDN record number from MBI first record Profile number
+                    ret = UiccPbReqReadMBI();
+                    }
+                else
+                    {
+                    ret = KErrArgument;
+                    }
+                }
+            else
+                {
+                ret = UiccPbReqDelete();
+                }
+            break;
+            }
+        case EMmTsyPhoneBookStoreDeleteAllIPC:
+            {
+            iNumOfEntries = iMmPhoneBookStoreMessHandler->
+                iPBStoreConf[iArrayIndex].iNoOfRecords;
+            if ( iNumOfEntries )
+                {
+                // Start to delete entries from the last one
+                iIndex = iNumOfEntries;
+                ret = UiccPbReqDelete();
+                iNumOfEntries--;
+                }
+            break;
+            }
+#ifdef INTERNAL_RD_USIM_PHONEBOOK_GAS_AND_AAS
+        case ECustomDeleteAlphaStringIPC:
+            {
+            break;
+            }
+#endif // INTERNAL_RD_USIM_PHONEBOOK_GAS_AND_AAS
+        default:
+            {
+TFLOGSTRING2("TSY: CMmPhoneBookOperationDelete::CreateReq - Unknown IPC: %d", aIpc);
+OstTrace1( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONDELETE_CREATEREQ, "CMmPhoneBookOperationDelete::CreateReq;aIpc=%d", aIpc );
+            break;
+            }
+        }
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::UiccPbReqDelete
+// Constructs an ISI-message to read entry from SIM
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::UiccPbReqDelete()
+    {
+TFLOGSTRING3("TSY: CMmPhoneBookOperationDelete::UiccPbReqDelete, iTransId:%d,index:%d", iTransId, iIndex);
+OstTraceExt2( TRACE_NORMAL, CMmPhoneBookOperationDelete_UICCPBREQWRITEL, "CMmPhoneBookOperationDelete::UiccPbReqDelete;iTransId=%hhu;iIndex=%hd", iTransId, iIndex );
+
+    TInt ret( KErrNotSupported );
+
+    switch ( iFileId )
+        {
+        case PB_ADN_FID:
+        case PB_FDN_FID:
+        case PB_MBDN_FID:
+        case PB_VMBX_FID:
+            {
+            // Check if the location to be deleted is valid
+            if( iIndex <= iMmPhoneBookStoreMessHandler->
+                iPBStoreConf[iArrayIndex].iNoOfRecords )
+                {
+                // Check if entry can be found in list
+                if( iMmPhoneBookStoreMessHandler->IndexCheckInPBList(
+                    iIndex,
+                    iArrayIndex,
+                    iEntry ) )
+                    {
+                    iLocationFoundInPbList = ETrue;
+                    // Check if there are extension records for this entry
+                    iNumOfExtensions = iEntry.PBEntryExtRecord.Count();
+                    // Entry is present and there is at least one extension
+                    if( iEntry.iEntryPresent && iNumOfExtensions )
+                        {
+                        // Start to delete the last extension (write 'FF')
+                        iCurrentDeletePhase = EPBDeletePhaseDeleteExtension;
+                        TInt record(
+                            iEntry.PBEntryExtRecord[iNumOfExtensions - 1] );
+                        ret = UiccPbReqDeleteExt( record );
+                        iNumOfExtensions--;
+                        }
+                    // Entry is not present -> fill by 'FF' just in case
+                    // or entry is present but no extensions -> delete entry
+                    else
+                        {
+                        iCurrentDeletePhase = EPBDeletePhaseDeleteEntry;
+                        ret = UiccPbReqDeleteEntry();
+                        }
+                    }
+                // Index has not been read yet. At first it must be read to
+                // define number of possible extensions
+                else
+                    {
+                    iCurrentDeletePhase = EPBDeletePhaseReadEntry;
+                    ret = UiccPbReqReadEntry();
+                    }
+                }
+            }
+        default:
+            {
+            break;
+            }
+        }
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::UiccPBReqDeleteEntry
+// Constructs an ISI-message to Write main Entry data
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::UiccPbReqDeleteEntry()
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::UiccPBReqDeleteEntry");
+OstTrace0( TRACE_NORMAL, CMmPhoneBookOperationDelete_UICCPBREQWRITEENTRY, "CMmPhoneBookOperationDelete::UiccPBReqDeleteEntry" );
+
+    TUiccWriteLinearFixed cmdParams;
+    cmdParams.messHandlerPtr =
+        static_cast<MUiccOperationBase*>( iMmPhoneBookStoreMessHandler );
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE >> 8 ) );
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE ) );
+    cmdParams.filePath.Append( APPL_FILE_ID >> 8 );
+    cmdParams.filePath.Append( APPL_FILE_ID );
+    if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() )
+        {
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+        }
+
+    cmdParams.serviceType = UICC_APPL_UPDATE_LINEAR_FIXED;
+    cmdParams.fileId = iFileId;
+    cmdParams.trId = static_cast<TUiccTrId>( iTransId );
+
+    cmdParams.record = iIndex;
+    // Buffer for data to be written, max size is 241 bytes for alpha
+    // string and 14 mandatory data bytes. See 3GPP TS 51.011 V4.15.0
+    // Chapter 10.5.1
+    TBuf8<KEfAdnDataBytes+KMaxAlphaStringBytes> dataBuffer;
+    // Check if alphastring exists
+    TUint16 alphaStringLength( iMmPhoneBookStoreMessHandler->
+        iPBStoreConf[ iArrayIndex ].iAlphaStringlength );
+    // Filel buffer (alpha string bytes + mandatory bytes) by 'FF'
+    dataBuffer.AppendFill( 0xFF, alphaStringLength + KEfAdnDataBytes );
+    cmdParams.fileData.Append( dataBuffer );
+    return iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+        CreateUiccApplCmdReq( cmdParams );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::UiccPbReqDeleteExt
+// Constructs an ISI-message to delete extension record
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::UiccPbReqDeleteExt( TInt aExtRecordNum )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::UiccPbReqDeleteExt");
+OstTrace0( TRACE_NORMAL, CMmPhoneBookOperationDelete_UICCPBWRITEEXT, "CMmPhoneBookOperationDelete::UiccPbReqDeleteExt" );
+
+    TUiccWriteLinearFixed cmdParams;
+    cmdParams.messHandlerPtr =
+        static_cast<MUiccOperationBase*>( iMmPhoneBookStoreMessHandler );
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE >> 8 ));
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE ));
+    cmdParams.filePath.Append( APPL_FILE_ID >> 8);
+    cmdParams.filePath.Append( APPL_FILE_ID);
+
+    if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() )
+        {
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+        }
+
+    cmdParams.fileId = iFileIdExt;
+    cmdParams.serviceType = UICC_APPL_UPDATE_LINEAR_FIXED;
+    cmdParams.trId = static_cast<TUiccTrId>( iTransId );
+    cmdParams.record = aExtRecordNum;
+
+    // File Data
+    TBuf8<KExtensionDataBytes>extFileData;
+    extFileData.Append( 0x00 ); // Type of record ( 0x00 == unknown )
+    // Rest of data is set by 'FF'
+    extFileData.AppendFill( 0xFF, ( KExtensionDataBytes - 1 ) ); 
+    cmdParams.fileData.Append( extFileData );
+
+    return iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+        CreateUiccApplCmdReq( cmdParams );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::UiccPbReqReadEntry
+// Constructs an ISI-message to read main entry data
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::UiccPbReqReadEntry()
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::UiccPBReqDeleteEntry");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONDELETE_UICCPBREQREADENTRY, "CMmPhoneBookOperationDelete::UiccPbReqReadEntry" );
+
+    TUiccReadLinearFixed cmdParams;
+    cmdParams.messHandlerPtr =
+        static_cast<MUiccOperationBase*>( iMmPhoneBookStoreMessHandler );
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE >> 8 ) );
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE ) );
+    cmdParams.filePath.Append( APPL_FILE_ID >> 8 );
+    cmdParams.filePath.Append( APPL_FILE_ID );
+    if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() )
+        {
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+        }
+    
+    cmdParams.serviceType = UICC_APPL_READ_LINEAR_FIXED;
+    cmdParams.fileId = iFileId;
+    cmdParams.trId = static_cast<TUiccTrId>( iTransId );
+    cmdParams.record = iIndex;
+    
+    return iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+        CreateUiccApplCmdReq( cmdParams );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::UiccPbReqReadMBI
+// Constructs an ISI-message to Read MBI profile from first record 
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::UiccPbReqReadMBI( )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::UiccPbReqReadMBI");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONDELETE_UICCPBREQREADMBI, "CMmPhoneBookOperationDelete::UiccPbReqReadMBI" );
+        
+        TInt ret ( KErrNone );
+        TUiccReadLinearFixed cmdParams;
+        cmdParams.messHandlerPtr  = static_cast<MUiccOperationBase*> 
+                                   ( iMmPhoneBookStoreMessHandler );
+        cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE >> 8 ));
+        cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE ));
+        cmdParams.filePath.Append( APPL_FILE_ID>>8);
+        cmdParams.filePath.Append( APPL_FILE_ID);
+        
+        if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() )
+            {
+            cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+            cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+            }
+
+        cmdParams.trId = static_cast<TUiccTrId>( iTransId );
+        cmdParams.fileId = PB_MBI_FID;
+        cmdParams.serviceType =  UICC_APPL_READ_LINEAR_FIXED ;
+        cmdParams.dataAmount = 1;
+        cmdParams.dataOffset = iIndex;
+        cmdParams.record = 1;   // only first profile number is supported
+        
+        
+        if( KErrNone == ret )
+            {
+            ret = iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+                CreateUiccApplCmdReq( cmdParams );
+            }
+        return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::UiccPBReqDeleteMBIProfile
+// Send Request for MBBI Profile Write
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::UiccPBReqDeleteMBIProfile()
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::UiccPBReqWriteMBIProfile");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONDELETE_UICCPBREQDELETEMBIPROFILE, "CMmPhoneBookOperationDelete::UiccPBReqDeleteMBIProfile" );
+
+    TInt ret ( KErrNone );
+    
+    TUiccWriteLinearFixed cmdParams;
+    cmdParams.messHandlerPtr  = static_cast<MUiccOperationBase*> 
+                               ( iMmPhoneBookStoreMessHandler );
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE >> 8 ));
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE ));
+    cmdParams.filePath.Append( APPL_FILE_ID>>8);
+    cmdParams.filePath.Append( APPL_FILE_ID);
+    if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() )
+        {
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+        }
+    cmdParams.trId = static_cast<TUiccTrId>( iTransId );
+    cmdParams.fileId = PB_MBI_FID;
+    cmdParams.serviceType =  UICC_APPL_READ_LINEAR_FIXED ;
+    cmdParams.dataAmount = 1;
+    cmdParams.dataOffset = iIndex;
+    cmdParams.record = 1;   // only first profile number is supported
+
+    // Append FileData needs to be write
+    cmdParams.fileData.Append( 0 );
+    
+    
+    if( KErrNone == ret )
+        {
+        ret = iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+            CreateUiccApplCmdReq( cmdParams );
+        }
+
+    return ret;
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::HandleReadEntryResp
+// Handles phonebook entry data
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::HandleReadEntryResp(
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::HandleReadEntryResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONDELETE_HANDLEREADENTRYRESP, "CMmPhoneBookOperationDelete::HandleReadEntryResp" );
+
+    TInt ret( KErrNotFound );
+
+    // Check if alphastring exists
+    TUint16 alphaStringLength( iMmPhoneBookStoreMessHandler->
+        iPBStoreConf[ iArrayIndex ].iAlphaStringlength );
+
+    // File contains possible alpha string and 14 mandatory bytes
+    TUint8 index( alphaStringLength + KEfAdnDataBytes - 1 );
+
+    if ( index < aFileData.Length() )
+        {
+        TUint8 extRecord( aFileData[index] );
+        // Check if this entry has extension records
+        if ( 0xFF == extRecord ) // No extension records, just delete entry
+            {
+            iCurrentDeletePhase = EPBDeletePhaseDeleteEntry;
+            ret = UiccPbReqDeleteEntry();
+            }
+        else // Start to read extensions
+            {
+            iExtRecordArrayToBeDelete.Append( extRecord ); // Store records
+            iCurrentDeletePhase = EPBDeletePhaseReadExtensions;
+            ret = UiccPbReqReadExt( extRecord );
+            }
+        }
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::UiccPbReqDeleteExt
+// Constructs an ISI-message to delete extension record
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::UiccPbReqReadExt( TUint8 aExtRecordNum )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::UiccPbReqDeleteExt");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONDELETE_UICCPBREQREADEXT, "CMmPhoneBookOperationDelete::UiccPbReqReadExt" );
+
+    TUiccReadLinearFixed cmdParams;
+    cmdParams.messHandlerPtr =
+        static_cast<MUiccOperationBase*>( iMmPhoneBookStoreMessHandler );
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE >> 8 ));
+    cmdParams.filePath.Append( static_cast<TUint8>( MF_FILE ));
+    cmdParams.filePath.Append( APPL_FILE_ID >> 8);
+    cmdParams.filePath.Append( APPL_FILE_ID);
+    if( UICC_CARD_TYPE_UICC == iMmUiccMessHandler->GetCardType() )
+        {
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+        }
+
+    cmdParams.fileId = iFileIdExt;
+    cmdParams.serviceType = UICC_APPL_READ_LINEAR_FIXED;
+    cmdParams.trId = static_cast<TUiccTrId>( iTransId );
+    cmdParams.record = aExtRecordNum;
+
+    return iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+        CreateUiccApplCmdReq( cmdParams );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::HandleReadExtResp
+// Handles phonebook entry data
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::HandleReadExtResp(
+    const TDesC8& aFileData )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::HandleReadExtResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONDELETE_HANDLEREADEXTRESP, "CMmPhoneBookOperationDelete::HandleReadExtResp" );
+
+    TInt ret( KErrNotFound );
+
+    // Read next record
+    if ( KExtensionDataBytes == aFileData.Length() )
+        {
+        // Next record is located in the last byte
+        TUint8 nextRecord( aFileData[KExtensionDataBytes - 1] );
+        if ( 0xFF == nextRecord ) // No more extension records left
+            {
+            iCurrentDeletePhase = EPBDeletePhaseDeleteExtension;
+            iNumOfExtensions = iExtRecordArrayToBeDelete.Count();
+            if ( iNumOfExtensions )
+                {
+                // Start to delete extensions in reverse order
+                ret = UiccPbReqDeleteExt(
+                    iExtRecordArrayToBeDelete[iNumOfExtensions - 1] );
+                iExtRecordArrayToBeDelete.Remove( iNumOfExtensions - 1 );
+                iExtRecordArrayToBeDelete.Compress();
+                }
+            }
+        else // Read the next extension
+            {
+            iExtRecordArrayToBeDelete.Append( nextRecord );
+            ret = UiccPbReqReadExt( nextRecord );
+            }
+        }
+
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// TBool CMmPhoneBookOperationDelete::HandleWriteMBIReadResp
+// Handle write response for MBI profile read
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationDelete::HandleWriteMBIReadResp(
+        TInt aStatus,
+        TUint8 aDetails,
+        const TDesC8 &aFileData ) 
+    {
+    TInt ret ( KErrNone );
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::HandleWriteMBIReadResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONDELETE_HANDLEWRITEMBIREADRESP, "CMmPhoneBookOperationDelete::HandleWriteMBIReadResp" );
+
+    // Store MBI Profile
+    iMBIProfileType = iIndex;
+    if( UICC_STATUS_OK  == aStatus )
+        {
+        iIndex = aFileData[0];
+        ret = UiccPbReqDelete();
+        }
+    else
+        {
+        if( UICC_SECURITY_CONDITIONS_NOT_SATISFIED == aDetails )
+            {
+            ret = KErrAccessDenied;
+            }
+        else
+            {
+            ret = KErrArgument;
+            }
+        }
+    return ret;
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationDelete::HandleUICCPbRespL
+// Separate response
+// ---------------------------------------------------------------------------
+//
+TBool CMmPhoneBookOperationDelete::HandleUICCPbRespL(
+    TInt aStatus,
+    TUint8 aDetails,
+    const TDesC8& aFileData,
+    TInt /*aTransId*/ )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationDelete::HandleUICCPbRespL");
+OstTrace0( TRACE_NORMAL, CMmPhoneBookOperationDelete_HANDLEUICCPBRESPL, "CMmPhoneBookOperationDelete::HandleUICCPbRespL" );
+
+    TInt ret( KErrNone );
+    TBool complete( EFalse );
+
+    TInt maxNumLength( 0 );
+    TInt location( 0 );
+
+    if ( UICC_STATUS_OK == aStatus )
+        {
+        switch ( iCurrentDeletePhase )
+            {
+            case EPBDeletePhaseReadExtensions:
+                {
+                ret = HandleReadExtResp( aFileData );
+                break;
+                }
+            case EPBDeletePhaseReadEntry:
+                {
+                ret = HandleReadEntryResp( aFileData );
+                break;
+                }
+            case EPBDeletePhaseDeleteExtension:
+                {
+                // Entry was read earlier and extension records saved
+                if ( iLocationFoundInPbList )
+                    {
+                    // Check if there are extensions left, in that case
+                    // continue deleting extensions
+                    if ( iNumOfExtensions )
+                        {
+                        ret = UiccPbReqDeleteExt(
+                            iEntry.PBEntryExtRecord[iNumOfExtensions-1] );
+                        iNumOfExtensions--;
+                        }
+                    // All extensions were deleted, next delete the main entry
+                    else
+                        {
+                        iCurrentDeletePhase = EPBDeletePhaseDeleteEntry;
+                        ret = UiccPbReqDeleteEntry();
+                        }
+                    }
+                // Extensions were read from SIM and saved to internal buffer
+                else
+                    {
+                    iNumOfExtensions = iExtRecordArrayToBeDelete.Count();
+                    if ( iNumOfExtensions )
+                        {
+                        ret = UiccPbReqDeleteExt(
+                            iExtRecordArrayToBeDelete[iNumOfExtensions - 1] );
+                        iExtRecordArrayToBeDelete.Remove(
+                            iNumOfExtensions - 1 );
+                        iExtRecordArrayToBeDelete.Compress();
+                        }
+                    else // It is time to delete the main entry
+                        {
+                        iCurrentDeletePhase = EPBDeletePhaseDeleteEntry;
+                        ret = UiccPbReqDeleteEntry();
+                        }
+                    }
+                break;
+                }
+            case EPBDeletePhaseDeleteEntry:
+                {
+                if ( iLocationFoundInPbList ) // Entry already in list, reset
+                    {
+                    iMmPhoneBookStoreMessHandler->ResetEntryInPhoneBookList(
+                        iArrayIndex,
+                        iIndex );
+                    }
+                else
+                    {
+                    // This location has not been read earlier, add it to list
+                    TPBEntry* storeEntry = new ( ELeave ) TPBEntry();
+                    storeEntry->iEntryPresent = EFalse;
+                    storeEntry->iEntryIndex = iIndex;
+                    storeEntry->PBEntryExtRecord.Reset();
+                    iMmPhoneBookStoreMessHandler->StoreEntryToPhoneBookList(
+                        storeEntry,
+                        iArrayIndex );
+                    }
+
+                // If it is MBDN Phone Book then update MBI File also
+                if( PB_MBDN_FID == iFileId)
+                    {
+                    // Start Writing MBI file
+                    iCurrentDeletePhase = EPBDeletePhase_delete_MBI_profile;
+                    ret = UiccPBReqDeleteMBIProfile();
+                    }
+                else
+                    {
+                        // Ready for complete
+                        complete = ETrue;
+                        maxNumLength = iMmPhoneBookStoreMessHandler->
+                            iPBStoreConf[iArrayIndex].iNumlength;
+                    if ( EMmTsyPhoneBookStoreDeleteAllIPC == iIpc &&
+                        iNumOfEntries )
+                        {
+                        // Continue deleting entries
+                        iIndex = iNumOfEntries;
+                        ret = UiccPbReqDelete();
+                        iNumOfEntries--;
+                        }
+                    else
+                        {
+                        // Ready for complete
+                        complete = ETrue;
+                        maxNumLength = iMmPhoneBookStoreMessHandler->
+                            iPBStoreConf[iArrayIndex].iNumlength;
+                        // In case of delete all location is 0
+                        if ( EMmTsyPhoneBookStoreDeleteIPC == iIpc )
+                            {
+                            location = iIndex;
+                            }
+                        }
+                    }
+                break;
+                }
+            case EPBDeletePhase_Read_MBI_profile:
+                {
+                ret = HandleWriteMBIReadResp( aStatus, aDetails, aFileData );
+                break;
+                }
+            case EPBDeletePhase_delete_MBI_profile:
+                {
+                if( UICC_STATUS_OK  != aStatus )
+                    {
+                    if( UICC_SECURITY_CONDITIONS_NOT_SATISFIED == aDetails )
+                        {
+                        ret = KErrAccessDenied;
+                        }
+                    else
+                        {
+                        ret = KErrArgument;
+                        }
+                    }
+                else
+                    {
+                    // Ready for complete
+                    complete = ETrue;
+                    maxNumLength = iMmPhoneBookStoreMessHandler->
+                        iPBStoreConf[iArrayIndex].iNumlength;
+                    location = iMBIProfileType;
+                    }
+                break;
+                }
+            default:
+                {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleSimPbRespL - No such delete operation phase supported ");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONDELETE_HANDLEUICCPBRESPL, "CMmPhoneBookOperationDelete::HandleUICCPbRespL- No such delete operation phase supported" );
+                break;
+                }
+            } // End of switch( iCurrentDeletePhase )
+        } // End of if ( UICC_STATUS_OK == aStatus )
+    else // Request failed, complete and remove operation
+        {
+TFLOGSTRING2("TSY: CMmPhoneBookOperationDelete::HandleUICCPbRespL, Request failed, ret = %d", aStatus );
+OstTrace1( TRACE_NORMAL, CMMPHONEBOOKOPERATIONDELETE_HANDLEUICCPBRESPL, "CMmPhoneBookOperationDelete::HandleUICCPbRespL;aStatus=%d", aStatus );
+        complete = ETrue;
+        ret = KErrNotFound;
+        }
+
+    // Error occured in some phase, stop operation and complete
+    if ( ret != KErrNone )
+        {
+        complete = ETrue;
+        }
+
+    if ( complete )
+        {
+        TPBEntryInfo pbEntryInfo;
+        pbEntryInfo.iMaxNumLength = maxNumLength;
+        pbEntryInfo.iLocation = location;
+
+        CPhoneBookDataPackage phoneBookData;
+        phoneBookData.SetPhoneBookName( iPhoneBookTypeName );
+        phoneBookData.PackData( &pbEntryInfo );
+
+        iMmPhoneBookStoreMessHandler->MessageRouter()->Complete(
+            iIpc,
+            &phoneBookData,
+            ret );
+        }
+
+    return complete;
+    }
+
+
+// End of file