adaptationlayer/tsy/nokiatsy_dll/src/cmmphonebookoperationwrite.cpp
changeset 5 8ccc39f9d787
child 7 fa67e03b87df
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/adaptationlayer/tsy/nokiatsy_dll/src/cmmphonebookoperationwrite.cpp	Thu Jan 14 10:44:58 2010 +0200
@@ -0,0 +1,1762 @@
+/*
+* 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:
+*
+*/
+
+
+//  INCLUDE FILES
+#include <etelmm.h>
+#include <tisi.h>
+#include <pn_const.h>
+#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
+#include <etelmmerr.h>      // For error code
+#include <ctsy/serviceapi/gsmerror.h>       // For error code
+#include "tsylogger.h"
+#include "cmmmessagerouter.h"
+#include "cmmphonebookoperationwrite.h"
+#include "cmmphonebookalphastring.h"
+#include "osttracedefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cmmphonebookoperationwritetraces.h"
+#endif
+
+// EXTERNAL DATA STRUCTURES
+    // None
+
+// EXTERNAL FUNCTION PROTOTYPES
+    // None
+
+// CONSTANTS
+
+// MACROS
+    // None
+
+// LOCAL CONSTANTS AND MACROS
+    // None
+
+// MODULE DATA STRUCTURES
+    // None
+
+// LOCAL FUNCTION PROTOTYPES
+    // None
+
+// ==================== LOCAL FUNCTIONS =====================================
+    // None
+
+
+// ================= MEMBER FUNCTIONS =======================================
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::CMmPhoneBookOperationWrite
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------
+//
+CMmPhoneBookOperationWrite::CMmPhoneBookOperationWrite()
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::\
+        CMmPhoneBookOperationWrite");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_CMMPHONEBOOKOPERATIONWRITE, "CMmPhoneBookOperationWrite::CMmPhoneBookOperationWrite" );
+    iPhoneBookEntry = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::~CMmPhoneBookOperationWrite
+// C++ destructor.
+// ---------------------------------------------------------------------------
+//
+CMmPhoneBookOperationWrite::~CMmPhoneBookOperationWrite()
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::\
+        ~CMmPhoneBookOperationWrite");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONWRITE_CMMPHONEBOOKOPERATIONWRITE, "CMmPhoneBookOperationWrite::~CMmPhoneBookOperationWrite" );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::NewL
+// Creates a new CMmPhonebookOperationWrite object instance.
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+
+CMmPhoneBookOperationWrite* CMmPhoneBookOperationWrite::NewL(
+    CMmPhoneBookStoreMessHandler* aMmPhoneBookStoreMessHandler,
+    const CMmDataPackage* aDataPackage ) // Data
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::NewL");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_NEWL, "CMmPhoneBookOperationWrite::NewL" );
+
+    TName phonebookTypeName;
+
+    CMmPhoneBookOperationWrite* mmPhoneBookOperationWrite =
+        new( ELeave ) CMmPhoneBookOperationWrite();
+
+    const CPhoneBookDataPackage* phoneBookData =
+        static_cast<const CPhoneBookDataPackage*>( aDataPackage );
+
+    phoneBookData->GetPhoneBookName( phonebookTypeName );
+    // Store phonebook name 
+    mmPhoneBookOperationWrite->iPhoneBookTypeName = phonebookTypeName;
+
+    mmPhoneBookOperationWrite->iMmPhoneBookStoreMessHandler =
+        aMmPhoneBookStoreMessHandler;
+
+    return mmPhoneBookOperationWrite;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::ConstructL
+// Initialises object attributes.
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookOperationWrite::ConstructL()
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::ConstructL");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_CONSTRUCTL, "CMmPhoneBookOperationWrite::ConstructL" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// TInt CMmPhoneBookOperationWrite::CreateReq
+// Separate request
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::UICCCreateReq
+        (
+        TInt aIpc,
+        const CMmDataPackage* aDataPackage,
+        TUint8 aTransId
+        )
+    {
+TFLOGSTRING2("TSY: CMmPhoneBookOperationWrite::UICCCreateReq Ipc: %d", aIpc);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONWRITE_UICCCREATEREQ, "CMmPhoneBookOperationWrite::UICCCreateReq;aIpc=%hd", aIpc );
+    
+    TInt ret (KErrNone);
+    const CPhoneBookDataPackage* phoneBookData =
+        static_cast<const CPhoneBookDataPackage*>( aDataPackage );
+
+        if( aIpc == EMmTsyPhoneBookStoreWriteIPC )
+            {
+                TInt16 index( 0 );
+                // Store Entry to the operation which needs to be write in SIM
+                phoneBookData->UnPackData( index, iPhoneBookEntry );
+
+                if ( iPhoneBookEntry )
+                    {
+                    // get the index Number needs to be write
+                    iPhoneBookEntry->iLocation = static_cast<TUint16>( index );
+                    
+                    // Convert Phone Book name to file id
+                    TUint16 fileIdExt ( UICC_ILLEGAL_FILE_ID );
+                    TUint16 pbFileId = ConvertToPBfileId( iPhoneBookTypeName, fileIdExt );
+                    TUint8 pbArrayIndex ( ConvertToConfArrayIndex( pbFileId ) );
+
+                    if( PB_MBDN_FID == pbFileId )
+                        {
+                        // For MBDN PhoneBook first read MBI file 
+                        // Check if the mailbox inidcation type is correct
+                        if( index <= iMmPhoneBookStoreMessHandler->
+                                iPBStoreConf[pbArrayIndex].iMbiRecLen )
+                            {
+                            iCurrentWritePhase = EPBWritePhase_Read_MBI_profile;
+                            // read MBDN record number from MBI first record Profile number
+                            ret = UiccPbReqReadMBI( index, aTransId );
+                            }
+                        else
+                            {
+                            ret = KErrArgument;
+                            }
+                        }
+                    else
+                        {
+                        ret = UiccPbReqWriteL( aTransId, index, *iPhoneBookEntry );
+                        }
+                    }
+            }
+        else
+            {
+TFLOGSTRING2("TSY: CMmPhoneBookOperationWrite::UICCCreateReq Unknown Ipc: %d", aIpc);
+OstTraceExt1( TRACE_NORMAL, DUP2_CMMPHONEBOOKOPERATIONWRITE_UICCCREATEREQ, "CMmPhoneBookOperationWrite::UICCCreateReq;Unknown aIpc =%hd", aIpc );
+            }
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::UiccPbReqWriteL
+// Constructs an ISI-message to read entry from SIM
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::UiccPbReqWriteL(
+        TUint8 aTransId,
+        TInt16 aIndex,
+        CPhoneBookStoreEntry& aDataToWrite )
+    {
+TFLOGSTRING3("TSY: CMmPhoneBookOperationWrite::SimPbReqWriteL, aTransId:%d,index:%d", aTransId,  aIndex);
+OstTraceExt2( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEL, "CMmPhoneBookOperationWrite::UiccPbReqWriteL;aTransId=%hhu;aIndex=%hd", aTransId, aIndex );
+    
+    TInt ret( KErrNone );
+    // Check for no of EXT records required for Writing this Entry
+    TUint8 extRecordNo ( 0 ); 
+
+    if( UICC_EF_FDN_NO_EXT_NUM_LEN < iPhoneBookEntry->iNumber->Length() )
+        {
+        extRecordNo++;
+        TInt extDataLength = iPhoneBookEntry->iNumber->Length() - 
+                             UICC_EF_FDN_NO_EXT_NUM_LEN;
+        while ( extDataLength > UICC_EF_EXT_REC_NUM_LEN)
+            {
+            extRecordNo++;
+            extDataLength = extDataLength - UICC_EF_EXT_REC_NUM_LEN;
+            }
+        }
+        
+    // reserve Space for ext record no
+    iExtRecordArrayToBeWrite.ReserveL( extRecordNo );
+    // File reserved memory with 0
+    for( TInt count = 0; count < extRecordNo; count++ )
+        {
+        iExtRecordArrayToBeWrite.Insert( 0 , count );
+        }
+
+    // Convert Phone Book name to file id
+    TUint16 fileIdExt ( UICC_ILLEGAL_FILE_ID );
+    TUint16 pbFileId = ConvertToPBfileId( iPhoneBookTypeName, fileIdExt );
+
+    if( UICC_ILLEGAL_FILE_ID != pbFileId )
+        {
+        TUint8 pbArrayIndex ( ConvertToConfArrayIndex( pbFileId ) );
+
+        // Check if the index To read is valid
+        if(  aIndex <= iMmPhoneBookStoreMessHandler->
+                iPBStoreConf[pbArrayIndex].iNoOfRecords )
+            {
+            // if Entry present in list Store it locally
+            TPBEntry entry;
+            if( 0 < aIndex )
+                {
+                // Check for index present the store list
+                if( iMmPhoneBookStoreMessHandler->IndexCheckInPBList(
+                        aIndex,
+                        pbArrayIndex,
+                        entry ) )
+                    {
+                    // Check if Entry is present or not 
+                    if( entry.iEntryPresent )
+                        {
+                        // Check if no if ext records are sufficient from previous Entry
+                        if( extRecordNo  > entry.PBEntryExtRecord.Count() )
+                            {
+                            // Update old record number which needs to be updated by new entry
+                            if( entry.PBEntryExtRecord.Count() > 0 )
+                                {
+                                for( TInt i=0; i <  entry.PBEntryExtRecord.Count(); i++ )
+                                    {
+                                    // Append record number to be write from old Entry
+                                    iExtRecordArrayToBeWrite.Append( 
+                                            entry.PBEntryExtRecord[i] );
+                                    iExtRecordArrayToBeDelete.Append( 
+                                            entry.PBEntryExtRecord[i] );
+                                    }
+                                }
+                            // Search for more free records
+                            iCurrentWritePhase = EPBWritePhase_Search_Ext_Entry;
+                            
+                            // Send request to read first entry in Ext
+                            iExtRecordNo = 1 ;
+                            ret = UiccPbReqWriteReadExt(
+                                    pbFileId,
+                                    fileIdExt,
+                                    iExtRecordNo,
+                                    aTransId);
+                            }
+                        else  // when reocrds to be delete and write are 0 or to be write record less
+                            {
+                            // Check of both records are 0
+                            if( ( extRecordNo == 0 ) && 
+                                    ( entry.PBEntryExtRecord.Count() == 0 ))
+                                {
+                                // Start Writing Entry
+                                iCurrentWritePhase = EPBWritePhase_Write_Entry;
+                                ret = UiccPBReqWriteEntry( 
+                                        pbFileId,
+                                        aIndex,
+                                        aTransId,
+                                        aDataToWrite );
+                                }
+                            else
+                                {
+                                // Start copy Ext record number to be write array
+                                for( TInt i=0; i <  extRecordNo; i++ )
+                                    {
+                                    // Append record number to be write from old Entry
+                                    iExtRecordArrayToBeWrite.Append(
+                                            entry.PBEntryExtRecord[i]);
+                                    iExtRecordArrayToBeDelete.Append(
+                                            entry.PBEntryExtRecord[i]);
+                                    }
+                                // Update records needs to be deleted
+                                // From old Entry
+                                for( TInt i=extRecordNo; i <  entry.PBEntryExtRecord.Count(); i++ )
+                                    {
+                                    // Append record number to be deleted from old Entry
+                                    iExtRecordArrayToBeDelete.Append( 
+                                            entry.PBEntryExtRecord[i]);
+                                    }
+                                // Start Deleting the EXT Records
+                                iCurrentWritePhase = EPBWritePhase_Write_Ext_Entry;
+                                iExtDeleteOperation = ETrue;
+                                TUint8 index ( iExtRecordArrayToBeDelete[0] );
+                                // Send request to Write main Entry
+                                ret = UiccPbReqWriteExtDelete(
+                                        pbFileId,
+                                        fileIdExt,
+                                        index,
+                                        aTransId );
+                                }
+                            }
+                        }
+                    else
+                        {
+                        // If entry not present
+                        // Check if EXT Records are needed for Entry to be written
+                        if( 0 < extRecordNo )
+                            {
+                            // Search for free ext records 
+                            iCurrentWritePhase = EPBWritePhase_Search_Ext_Entry;
+                            
+                            // Send request To read First EXT record
+                            iExtRecordNo = 1;
+                            ret = UiccPbReqWriteReadExt(
+                                    pbFileId,
+                                    fileIdExt,
+                                    iExtRecordNo,
+                                    aTransId );
+                            }
+                        else
+                            {
+                            // Start Writting Entry
+                            iCurrentWritePhase = EPBWritePhase_Write_Entry;
+                            TUint8 indexToWrite = iPhoneBookEntry->iLocation;
+                            ret = UiccPBReqWriteEntry(
+                                    pbFileId,
+                                    indexToWrite,
+                                    aTransId,
+                                    aDataToWrite );
+                            }
+                        }
+                    }   // end of if Entry is present in the list
+                else
+                    {
+                    // First Read that Entry from SIM and then delete that entry with EXT records if there are Any
+                    iCurrentWritePhase = EPBWritePhase_Read_Entry;
+                    ret = UiccPbReqWriteRead( pbFileId, aIndex, aTransId );
+                    
+                    // read Main entry with given index number
+                    }
+                }
+            else
+                {
+                // Start Serching For first free Entry in the Stored list
+                TInt index = iMmPhoneBookStoreMessHandler->
+                EmptyEntryCheckInPBList( pbArrayIndex );
+                if( 0 < index )
+                    {
+                    //Check if EXT records Are needed or not
+                    if( 0 < extRecordNo )
+                        {
+                        // Start Serching for EXT records
+                        // Search for free ext records 
+                        iCurrentWritePhase = EPBWritePhase_Search_Ext_Entry;
+                            
+                        // Send request To read First EXT record
+                        iExtRecordNo = 1;
+                        ret = UiccPbReqWriteReadExt(
+                                pbFileId,
+                                fileIdExt,
+                                iExtRecordNo,
+                                aTransId );
+                        }
+                    else
+                        {
+                        // Start Writing Entry on given Index
+                        // Start Writting Entry
+                        iCurrentWritePhase = EPBWritePhase_Write_Entry;
+                        ret = UiccPBReqWriteEntry(
+                                pbFileId,
+                                index,
+                                aTransId,
+                                aDataToWrite );
+                        }
+                    }
+                else
+                    {
+                    // Start searching for first free Entry from SIM
+                    iCurrentWritePhase = EPBWritePhase_Read_Entry;
+                    iLocationSearch = ETrue;
+                    iEntryToWrite = 1;
+                    ret = UiccPbReqWriteRead(
+                            pbFileId,
+                            iEntryToWrite,
+                            aTransId );
+                    }
+                }
+            }
+        else
+            {
+            ret = KErrArgument;
+            }            
+        }
+    else
+        {
+        ret = KErrArgument;
+        }
+    return ret;
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::UiccPBReqWriteEntry
+// Constructs an ISI-message to Write main Entry data
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::UiccPBReqWriteEntry( TUint16 aFileId, TUint8 aIndex, TUint8 aTransId, CPhoneBookStoreEntry& aDataToWrite )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::UiccPBReqWriteEntry");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEENTRY, "CMmPhoneBookOperationWrite::UiccPBReqWriteEntry" );
+
+    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);
+    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 = aFileId;
+    cmdParams.trId = static_cast<TUiccTrId>( aTransId );
+    // Check for valid record number
+    TUint8 arrayIndex ( ConvertToConfArrayIndex( aFileId ) );
+    if( aIndex <= iMmPhoneBookStoreMessHandler->iPBStoreConf[arrayIndex].iNoOfRecords )
+        {
+        cmdParams.record = aIndex;
+        }
+    else
+        {
+        ret = KErrArgument;
+        }
+    
+    
+    TBuf8<241>nameBuf;
+    
+    TPtr16 ptrToName = aDataToWrite.iText->Des();
+    // Convert the Entry Name from ASCII format to UCS2
+    CMmStaticUtility::ConvertUcs2ToGsmUcs2Data( ptrToName, nameBuf );
+    if( nameBuf.Length() < iMmPhoneBookStoreMessHandler->
+                           iPBStoreConf[ arrayIndex ].iAlphaStringlength )
+        {
+        // Fill rest of the Bytes 
+        for( TInt count = nameBuf.Length(); count < ( iMmPhoneBookStoreMessHandler->
+                      iPBStoreConf[ arrayIndex ].iAlphaStringlength ); count++ )
+            {
+            nameBuf.Append( KTagUnusedbyte );
+            }
+        }
+    TBuf8<300>numberBuf;
+    TPtr16 ptrToNumber = aDataToWrite.iNumber->Des();
+    iMmPhoneBookStoreMessHandler->ConvertToBCDFromUCS2(
+                                  ptrToNumber,
+                                  numberBuf,
+                                  aFileId );
+    
+    // Store number length
+    TUint8 numLength ( numberBuf.Length() );
+    
+    if( numberBuf.Length() < UICC_EF_EXT_REC_NUM_LEN )
+        {
+        // fill  rest of the bytes
+        for( TInt count = numberBuf.Length(); count < UICC_EF_EXT_REC_NUM_LEN; count++)
+            {
+            numberBuf.Append( KTagUnusedbyte );
+            }
+        }
+    
+    TBuf8<200>fileDataWrite;
+    fileDataWrite.Append( nameBuf.Mid( 0, iMmPhoneBookStoreMessHandler->
+                          iPBStoreConf[ arrayIndex ].iAlphaStringlength ) );
+    fileDataWrite.Append( numLength );
+    fileDataWrite.Append( numberBuf.Mid( 0, UICC_EF_EXT_REC_NUM_LEN ) );
+    // Append Capability configuration byte as not used
+    fileDataWrite.Append( KTagUnusedbyte );
+
+    // Chekc for EXT Data is present or not
+    if( 0 < iExtRecordArrayToBeWrite.Count() )
+        {
+        // Append Extension recorNo from iExtRecordArray to be write
+        fileDataWrite.Append( iExtRecordArrayToBeWrite[0] );
+        }
+    else
+        {
+        // there is no EXT record
+        fileDataWrite.Append( KTagUnusedbyte );
+        }
+    
+    // Append 
+    cmdParams.fileData.Append( fileDataWrite );
+    
+    if( KErrNone == ret )
+        {
+        ret = iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+            CreateUiccApplCmdReq( cmdParams );
+TFLOGSTRING2("TSY: CreateUiccApplCmdReq returns %d", ret);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEENTRY, "CMmPhoneBookOperationWrite::UiccPBReqWriteEntry;ret=%hd", ret );
+        
+        }
+
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::UiccPbReqWriteExt
+// Constructs an ISI-message to Write EXT Data 
+// ---------------------------------------------------------------------------
+//
+
+TInt CMmPhoneBookOperationWrite::UiccPbReqWriteExt(
+        TUint8 aTransId,
+        TUint8 aIndex,
+        TUint16 aFileId,
+        TUint16 aFileIdExt,
+        CPhoneBookStoreEntry& aDataToWrite )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::UiccPbReqWriteExt");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_UICCPBWRITEEXT, "CMmPhoneBookOperationWrite::UiccPbReqWriteExt" );
+    
+    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);
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+    cmdParams.fileId = aFileIdExt;
+    cmdParams.serviceType = UICC_APPL_UPDATE_LINEAR_FIXED;
+    cmdParams.trId = static_cast<TUiccTrId>( aTransId );
+    
+    // File Data
+    TBuf8<255>numBuf;
+    TBuf8<13>extFileData;
+    TPtr16 ptrToNumber = aDataToWrite.iNumber->Des();
+
+    iMmPhoneBookStoreMessHandler->ConvertToBCDFromUCS2(
+                                  ptrToNumber,
+                                  numBuf,
+                                  aFileId );
+    
+        if( numBuf.Length() > ( 10 + ( iExtRecordWritten* 11 ) ))
+            {
+            // form EXt file Data
+            // Append Record type
+            extFileData.Append( 0x02 );
+            // Append Data
+            extFileData.Append( numBuf.Mid( 11 + ( iExtRecordWritten* 11 ), 
+                     ( numBuf.Length() - ( 11 + ( iExtRecordWritten* 11 ) ) ) ) );
+            // Check if Data ids less than 11
+            if( extFileData.Length() < 12 )
+                {
+                extFileData.AppendFill( 0xFF, ( 12 - extFileData.Length() ) );
+                }
+            // Check if there is more Ext Record to be write
+            if( iExtRecordArrayToBeWrite.Count() > 0 )
+                {
+                // Append record Number
+                extFileData.Append( iExtRecordArrayToBeWrite[0] );
+                }
+            else
+                {
+                extFileData.Append( 0xFF );
+                }
+            }
+        else
+            {
+            // Append Record type
+            extFileData.Append( 0x02 );
+            // Append Data
+            extFileData.Append( numBuf.Mid( 11 + ( iExtRecordWritten* 11 ), 11 ) );
+            
+            // Check if there is more Ext Record to be write
+            if( iExtRecordArrayToBeWrite.Count() > 0 )
+                {
+                // Append record Number
+                extFileData.Append( iExtRecordArrayToBeWrite[0] );
+                }
+            else
+                {
+                extFileData.Append( 0xFF );
+                }
+            }
+        
+        cmdParams.fileData.Append( extFileData );
+
+    TUint8 arrayIndex ( ConvertToConfArrayIndex( aFileId ));
+    if( aIndex <= iMmPhoneBookStoreMessHandler->iPBStoreConf[arrayIndex].iExtNoOfRec )
+        {
+        cmdParams.record = aIndex;
+        }
+    else
+        {
+        ret = KErrGeneral;
+        }
+    
+    if( KErrNone == ret )
+        {
+        ret = iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+            CreateUiccApplCmdReq( cmdParams );
+TFLOGSTRING2("TSY: CreateUiccApplCmdReq returns %d", ret);
+OstTraceExt1( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEEXT, "CMmPhoneBookOperationWrite::UiccPbReqWriteExt;ret=%hd", ret );
+        }
+    
+    return ret;
+    }
+
+
+
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::UiccPbReqWriteReadExt
+// Constructs an ISI-message to Read The existing Entry EXT record
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::UiccPbReqWriteReadExt(
+             TUint16 aFileId,
+             TUint16 aFileIdExt,
+             TUint8 aIndex,
+             TUint8 aTransId)
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::UiccPbReqWriteEXTDelete");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEREADEXT, "CMmPhoneBookOperationWrite::UiccPbReqWriteReadExt" );
+    
+    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);
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+    
+    // Append transaction id 
+    cmdParams.trId = static_cast<TUiccTrId>( aTransId );
+    
+    // Append File id
+    cmdParams.fileId = aFileIdExt;
+    
+    // Append serviceType
+    cmdParams.serviceType = UICC_APPL_READ_LINEAR_FIXED;
+    
+    
+    TUint8 arrayIndex( ConvertToConfArrayIndex( aFileId ) );
+    // Check for the valid index neds to be read
+    if( aIndex <= iMmPhoneBookStoreMessHandler->iPBStoreConf[arrayIndex].iExtNoOfRec )
+        {
+        // Append recor number
+        cmdParams.record = aIndex;
+        }
+    else
+        {
+        ret = KErrGeneral;
+        }
+    
+    if( KErrNone == ret )
+        {
+        ret = iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+            CreateUiccApplCmdReq( cmdParams );
+TFLOGSTRING2("TSY: CreateUiccApplCmdReq returns %d", ret);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEREADEXT, "CMmPhoneBookOperationWrite::UiccPbReqWriteReadExt;ret=%hd", ret );
+        }
+
+    return ret;
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::UiccPbReqWriteRead
+// Constructs an ISI-message to Read The existing Entry
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::UiccPbReqWriteRead(
+                     TUint16 aFileId,
+                     TUint8 aIndex,
+                     TUint8 aTransId )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::UiccPbReqWriteRead");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEREAD, "CMmPhoneBookOperationWrite::UiccPbReqWriteRead" );
+    
+    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);
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+    cmdParams.trId = static_cast<TUiccTrId>( aTransId );
+    cmdParams.fileId = aFileId;
+    cmdParams.serviceType =  UICC_APPL_READ_LINEAR_FIXED ;
+    TUint8 arrayIndex ( ConvertToConfArrayIndex( aFileId ) );
+    if( aIndex <= iMmPhoneBookStoreMessHandler->iPBStoreConf[arrayIndex].iNoOfRecords )
+        {
+        cmdParams.record = aIndex;
+        }
+    else
+        {
+        ret = KErrOverflow;
+        }
+    
+    if( KErrNone == ret )
+        {
+        ret = iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+            CreateUiccApplCmdReq( cmdParams );
+TFLOGSTRING2("TSY: CreateUiccApplCmdReq returns %d", ret);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEREAD, "CMmPhoneBookOperationWrite::UiccPbReqWriteRead;ret=%hd", ret );
+        }
+
+    return ret;
+
+    }
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::UiccPbReqWriteEXTDelete
+// Constructs an ISI-message to delete EXT File Data
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::UiccPbReqWriteExtDelete(
+                  TUint16 aFileId,
+                  TUint16 aFileIdExt,
+                  TUint8 aIndex,
+                  TUint8 aTransId )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::UiccPbReqWriteEXTDelete");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEEXTDELETE, "CMmPhoneBookOperationWrite::UiccPbReqWriteEXTDelete" );
+    
+    TInt ret ( KErrNone );
+    TBuf8<13>deleteEntryData;
+    
+    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);
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+    cmdParams.trId = static_cast<TUiccTrId>( aTransId );
+    cmdParams.fileId = aFileIdExt;
+    cmdParams.serviceType =  UICC_APPL_UPDATE_LINEAR_FIXED ;
+    
+    TUint8 arrayIndex ( ConvertToConfArrayIndex( aFileId ) );
+
+    
+    if( aIndex <= iMmPhoneBookStoreMessHandler->iPBStoreConf[arrayIndex].iExtNoOfRec)
+        {
+        cmdParams.record = aIndex;
+        }
+    else
+        {
+        ret = KErrGeneral;
+        }
+    
+    
+    // Append record Type Byte
+    deleteEntryData.Append( 0x00 );
+    // Fill Empty record Data
+    deleteEntryData.AppendFill( 0xFF, 11 );
+    // Fill the next record number
+    deleteEntryData.Append( 0xFF );
+    
+    cmdParams.fileData.Append( deleteEntryData );
+
+    if( KErrNone == ret )
+        {
+        ret = iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+            CreateUiccApplCmdReq( cmdParams );
+TFLOGSTRING2("TSY: CreateUiccApplCmdReq returns %d", ret);
+OstTraceExt1( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEEXTDELETE, "CMmPhoneBookOperationWrite::UiccPbReqWriteExtDelete;ret=%hd", ret );
+        }
+
+    return ret ;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::UiccPbReqReadMBI
+// Constructs an ISI-message to Read MBI profile from first record 
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::UiccPbReqReadMBI( TUint8 aIndex, TUint8 aTransId )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::UiccPbReqReadMBI");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONWRITE_UICCPBREQREADMBI, "CMmPhoneBookOperationWrite::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);
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+        cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+        cmdParams.trId = static_cast<TUiccTrId>( aTransId );
+        cmdParams.fileId = PB_MBI_FID;
+        cmdParams.serviceType =  UICC_APPL_READ_LINEAR_FIXED ;
+        cmdParams.dataAmount = 1;
+        cmdParams.dataOffset = aIndex;
+        cmdParams.record = 1;   // only first profile number is supported
+        
+        
+        if( KErrNone == ret )
+            {
+            ret = iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+                CreateUiccApplCmdReq( cmdParams );
+            }
+        return ret;
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::UiccPBReqWriteMBIProfile
+// Send Request for MBBI Profile Write
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::UiccPBReqWriteMBIProfile( 
+        TUint8 aTransId,
+        TUint8 aIndex,
+        TUint8 aOperationType)
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::UiccPBReqWriteMBIProfile");
+OstTrace0( TRACE_FATAL, CMMPHONEBOOKOPERATIONWRITE_UICCPBREQWRITEMBIPROFILE, "CMmPhoneBookOperationWrite::UiccPBReqWriteMBIProfile" );
+
+    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);
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK >> 8 ));
+    cmdParams.filePath.Append( static_cast<TUint8>( DF_PHONEBOOK ));
+    cmdParams.trId = static_cast<TUiccTrId>( aTransId );
+    cmdParams.fileId = PB_MBI_FID;
+    cmdParams.serviceType =  UICC_APPL_READ_LINEAR_FIXED ;
+    cmdParams.dataAmount = 1;
+    cmdParams.dataOffset = aIndex;
+    cmdParams.record = 1;   // only first profile number is supported
+    
+    if( KOperationDelete == aOperationType )
+        {
+        cmdParams.fileData.Append( 0 );
+        }
+    else
+        {
+        cmdParams.fileData.Append( iEntryToWrite );
+        }
+    
+    
+    if( KErrNone == ret )
+        {
+        ret = iMmPhoneBookStoreMessHandler->UiccMessHandler()->
+            CreateUiccApplCmdReq( cmdParams );
+        }
+
+    return ret;
+    
+    }
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::HandleUICCPbRespL
+// Separate response
+// ---------------------------------------------------------------------------
+//
+TBool CMmPhoneBookOperationWrite::HandleUICCPbRespL(
+    TInt aStatus,
+    TUint8 aDetails,
+    const TDesC8& aFileData,
+    TInt aTransId )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleUICCPbRespL");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_HANDLEUICCPBRESPL, "CMmPhoneBookOperationWrite::HandleUICCPbRespL" );
+    
+    TBool complete ( EFalse );
+    TInt ret ( KErrNone );
+    
+    TUint16 fileIdExt ( 0x0000 );
+    TUint16 fileId = ConvertToPBfileId( iPhoneBookTypeName, fileIdExt );
+    //// Check for PhoenBook Index for which needs to checked
+    TUint8 pbArrayIndex = ConvertToConfArrayIndex( fileId );
+
+    switch( iCurrentWritePhase )
+        {
+        case EPBWritePhase_Read_Entry:
+            {
+            ret = HandleWriteReadEntryResp(
+                  aStatus,
+                  aFileData,
+                  aTransId,
+                  fileId,
+                  fileIdExt,
+                  pbArrayIndex );
+            break;
+            }
+        case EPBWritePhase_Read_Ext_Entry:
+            {
+            ret = HandleWriteReadExtEntryResp(
+                  aStatus,
+                  aFileData,
+                  aTransId,
+                  fileId,
+                  fileIdExt );
+            break;
+            }
+        case EPBWritePhase_Search_Ext_Entry:
+            {
+            ret = HandleWriteSearchExtEntryResp(
+                  aStatus,
+                  aFileData,
+                  aTransId,
+                  fileId,
+                  fileIdExt );
+            break;
+            }
+        case EPBWritePhase_Write_Entry:
+            {
+            ret = HandleWriteEntryResp(
+                  aStatus,
+                  aTransId,
+                  fileId,
+                  fileIdExt );
+            break;
+            }
+        case EPBWritePhase_Write_Ext_Entry:
+            {
+            ret = HandleWriteExtEntryResp(
+                  aStatus,
+                  aTransId,
+                  fileId,
+                  fileIdExt );
+            break;
+            }
+        case EPBWritePhase_Read_MBI_profile:
+            {
+            ret = HandleWriteMBIReadResp(
+                    aStatus,
+                    aDetails,
+                    aTransId,
+                    aFileData );
+            break;
+            }
+        case EPBWritePhase_Write_MBI_profile:
+            {
+            ret = HandleWriteMBIWriteResp(
+                    aStatus,
+                    aDetails);
+            break;
+            }
+        default:
+            {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleSimPbRespL - NO such Write operation Phase supported ");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONWRITE_HANDLEUICCPBRESPL, "CMmPhoneBookOperationWrite::HandleUICCPbRespL - No such write operation phase supported" );
+            break;
+            }
+        }
+    
+    if( ( KErrNone != ret ) || ( iCurrentWritePhase == EPBWritePhase_complete ))
+        {
+        // Complete the to common TSY
+        CPhoneBookDataPackage phoneBookData;
+
+        //create a struct
+        TPBEntryInfo pbEntryInfo;
+        // Set the structure as it has failed, we don't care of following
+        // information so set to 0
+        pbEntryInfo.iMaxNumLength = 0;
+        pbEntryInfo.iLocation = 0;
+        if( KErrNone == ret )
+            {
+            pbEntryInfo.iLocation = iPhoneBookEntry->iLocation;
+            }
+        // For EXT file Errors need not to pass to commontsy
+        if( KErrGeneral == ret )
+            {
+            ret = KErrNone;
+            }
+        phoneBookData.SetPhoneBookName( iPhoneBookTypeName );
+
+        //Pack Data and complete
+        phoneBookData.PackData( &pbEntryInfo );
+        iMmPhoneBookStoreMessHandler->MessageRouter()->Complete(
+            EMmTsyPhoneBookStoreWriteIPC,
+            &phoneBookData,
+            ret );
+
+        // set flag to indicate that we can remove this operation from array
+        complete = ETrue;
+        }
+    return complete;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::HandleWriteReadEntryResp
+// Handle response for Read Entry Phase
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::HandleWriteReadEntryResp(
+    TInt aStatus,
+    const TDesC8& aFileData,
+    TUint8 aTransId,
+    TUint16 aFileId,
+    TUint16 aFileIdExt,
+    TUint8 aArrayIndex )
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleWriteReadEntryResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_HANDLEWRITEREADENTRYRESP, "CMmPhoneBookOperationWrite::HandleWriteReadEntryResp" );
+    TInt ret ( KErrNone );
+    
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // Check for Emtry Entry
+        if( KErrNone == EmptyEntryCheck( aFileData ) )
+            {
+            // if entry is present
+            // Check if its a location search
+            if( !iLocationSearch )
+                {
+                
+                // Check for Ext data present or not
+                if( 0xFF == aFileData[iMmPhoneBookStoreMessHandler->
+                            iPBStoreConf[aArrayIndex].iAlphaStringlength+ 13] )
+                    {
+                    // No EXT Records 
+                    // Check if EXT reords needed for Entry to be write
+                    if( ( KErrNotFound != iExtRecordArrayToBeWrite.Find( 0 ) ))
+                        {
+                        // Start Search for Ext record
+                        // Search for more free records
+                        iCurrentWritePhase = EPBWritePhase_Search_Ext_Entry;
+                        
+                        // Send request to read first entry in Ext
+                        iExtRecordNo = 1;
+                        ret = UiccPbReqWriteReadExt(
+                              aFileId,
+                              aFileIdExt,
+                              iExtRecordNo,
+                              aTransId );
+                        }
+                    else
+                        {
+                        // Start Write main Entry
+                        iCurrentWritePhase = EPBWritePhase_Write_Entry;
+                        TUint8 indexToWrite ( 0 );
+                        if( PB_MBDN_FID == aFileId )
+                            {
+                            indexToWrite = iEntryToWrite;
+                            }
+                        else
+                            {
+                            indexToWrite = iPhoneBookEntry->iLocation;
+                            }
+                        ret = UiccPBReqWriteEntry(
+                              aFileId,
+                              indexToWrite,
+                              aTransId,
+                              *iPhoneBookEntry );
+                        }
+                    }
+                else
+                    {
+                    // Append this Record number to be Delete record Array
+                    iExtRecordArrayToBeDelete.Append(
+                                    iMmPhoneBookStoreMessHandler->
+                                    iPBStoreConf[aArrayIndex].iAlphaStringlength+ 13 );
+                    
+                    // Start Reading EXT Record
+                    iCurrentWritePhase = EPBWritePhase_Read_Ext_Entry;
+                    TUint8 indexToRead = iMmPhoneBookStoreMessHandler->
+                               iPBStoreConf[aArrayIndex].iAlphaStringlength+ 13;
+                    ret = UiccPbReqWriteReadExt(
+                          aFileId,
+                          aFileIdExt,
+                          indexToRead,
+                          aTransId );
+                    }
+                }
+            else
+                {
+                // Serach for next location
+                // Start searching for first free Entry
+                iCurrentWritePhase = EPBWritePhase_Read_Entry;
+                iEntryToWrite++;
+                ret = UiccPbReqWriteRead(
+                      aFileId,
+                      iEntryToWrite,
+                      aTransId );
+                }
+            }
+        else
+            {
+            // entry not found and
+            // Check if EXT reords needed for Entry to be write
+            iLocationSearch = EFalse;
+            if( 0 < iExtRecordArrayToBeWrite.Count() )
+                {
+                // Start Search for Ext record
+                // Search for more free records
+                iCurrentWritePhase = EPBWritePhase_Search_Ext_Entry;
+                
+                // Send request to read first entry in Ext
+                iExtRecordNo = 1;
+                ret = UiccPbReqWriteReadExt(
+                      aFileId,
+                      aFileIdExt,
+                      iExtRecordNo,
+                      aTransId);
+                }
+            else
+                {
+                // For MBDN PhoneBook First update MBI File
+                
+                // Start Write Entry
+                iCurrentWritePhase = EPBWritePhase_Write_Entry;
+                TUint8 index ( 0 ); 
+                if( ( PB_MBDN_FID == aFileId )|| ( 0 == iPhoneBookEntry->iLocation ))
+                    {
+                    index = iEntryToWrite; 
+                    }
+                else
+                    {
+                    index = iPhoneBookEntry->iLocation;
+                    }
+                ret = UiccPBReqWriteEntry(
+                        aFileId,
+                        index,
+                        aTransId,
+                        *iPhoneBookEntry );
+                }
+            }
+        }
+    else
+        {
+        ret = KErrGeneral;
+        }
+
+    return ret;
+    }
+
+
+
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::HandleWriteReadExtEntryResp
+// Handle Read EXt fiel response
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::HandleWriteReadExtEntryResp(
+    TInt aStatus,
+    const TDesC8& aFileData,
+    TUint8 aTransId,
+    TUint16 aFileId,
+    TUint16 aFileIdExt)
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleWriteReadExtEntryResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_HANDLEWRITEREADEXTENTRYRESP, "CMmPhoneBookOperationWrite::HandleWriteReadExtEntryResp" );
+    TInt ret ( KErrNone );
+    
+    if( UICC_STATUS_OK == aStatus )
+        {
+        // Check if There is further records for this Entry
+        if( 0xFF == aFileData[UICC_EXT_REC_NO_OFFSET] )
+            {
+            // There is no Further records
+            if( 0 < iExtRecordArrayToBeWrite.Count() )
+                {
+                // Check if to be delete records are sufficient to write new entry
+                if( iExtRecordArrayToBeWrite.Count() <= 
+                    iExtRecordArrayToBeDelete.Count())
+                    {
+                    // NO need to search for new records
+                    // Copy record nos
+                    for( TInt i = 0; i<iExtRecordArrayToBeWrite.Count(); i++)
+                        {
+                        iExtRecordArrayToBeWrite[i] = iExtRecordArrayToBeDelete[i];
+                        }
+                    // Start Deleting Ext data
+                    iCurrentWritePhase = EPBWritePhase_Write_Ext_Entry;
+                    iExtDeleteOperation= ETrue;
+                    //last index
+                    TUint8 index = iExtRecordArrayToBeDelete[ iExtRecordArrayToBeDelete.Count() -1 ];
+                    ret = UiccPbReqWriteExtDelete(
+                          aFileId,
+                          aFileIdExt,
+                          index,
+                          aTransId );
+                    }
+                else
+                    {
+                    // Copy the records
+                    for( TInt i = 0; i<iExtRecordArrayToBeDelete.Count(); i++)
+                        {
+                        iExtRecordArrayToBeWrite[i] = iExtRecordArrayToBeDelete[i];
+                        }
+                    // Start Searching for remaining records
+                    iCurrentWritePhase = EPBWritePhase_Search_Ext_Entry;
+                    // Start Searching for first location
+                    iExtRecordNo = 1;
+                    ret = UiccPbReqWriteReadExt(
+                          aFileId,
+                          aFileIdExt,
+                          iExtRecordNo,
+                          aTransId );
+                    }
+                }
+            else
+                {
+                // Start Writing EXT Data delete
+                if( 0 < iExtRecordArrayToBeDelete.Count() )
+                    {
+                    // Start Writing Ext data
+                    iCurrentWritePhase = EPBWritePhase_Write_Ext_Entry;
+                    iExtDeleteOperation = ETrue;
+                    //last index
+                    TUint8 index = 
+                      iExtRecordArrayToBeDelete[ iExtRecordArrayToBeDelete.Count() -1 ];
+                    ret = UiccPbReqWriteExtDelete(
+                          aFileId,
+                          aFileIdExt,
+                          index,
+                          aTransId );
+                    }
+                else
+                    {
+                    // Start Writing main Entry
+                    iCurrentWritePhase = EPBWritePhase_Write_Entry;
+                    //last index
+                    TUint8 index (0 );
+                    if( PB_MBDN_FID == aFileId )
+                        {
+                        index = iEntryToWrite;
+                        }
+                    else
+                        {
+                        index = iPhoneBookEntry->iLocation;
+                        }
+                    ret = UiccPBReqWriteEntry(
+                          aFileId,
+                          index,
+                          aTransId,
+                          *iPhoneBookEntry );
+                    }
+                }
+            }
+        else
+            {
+            // Append Current record no to the Array
+            iExtRecordArrayToBeDelete.Append( aFileData[UICC_EXT_REC_NO_OFFSET] );
+            // Raed Next 
+            iCurrentWritePhase = EPBWritePhase_Read_Ext_Entry;
+            ret = UiccPbReqWriteReadExt(
+                  aFileId,
+                  aFileIdExt,
+                  aFileData[UICC_EXT_REC_NO_OFFSET],
+                  aTransId );
+            }
+        }
+    else
+        {
+            ret = KErrGeneral;
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookOperationWrite::HandleWriteSearchExtEntryResp
+// Handle Search for Ext record response
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::HandleWriteSearchExtEntryResp(
+    TInt aStatus,
+    const TDesC8& aFileData,
+    TUint8 aTransId,
+    TUint16 aFileId,
+    TUint16 aFileIdExt)
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleWriteSearchExtEntryResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_HANDLEWRITESEARCHEXTENTRYRESP, "CMmPhoneBookOperationWrite::HandleWriteSearchExtEntryResp" );
+    TInt ret ( KErrNone );
+    TUint8 arrayIndex ( ConvertToConfArrayIndex( aFileId ) );
+    
+    if( UICC_STATUS_OK == aStatus)
+        {
+        // Check if Entry is Free
+        if( KErrNotFound == EmptyEntryCheck( aFileData ) )
+            {
+            TInt location ( iExtRecordArrayToBeWrite.Find ( 0 ) );
+            // Append this Record no in Array
+            iExtRecordArrayToBeWrite[location] = iExtRecordNo;
+            // Check if there is any record no 0 in to be write record array
+            if( KErrNotFound == iExtRecordArrayToBeWrite.Find ( 0 ) )
+                {
+                // Start Writing to EXT records
+                // first do the delete records
+                if( iExtRecordArrayToBeDelete.Count() > 0 )
+                    {
+                    // Start Writing or deleting the Entry
+                    iCurrentWritePhase = EPBWritePhase_Write_Ext_Entry;
+                    iExtDeleteOperation = ETrue;
+                    TUint8 index = 
+                    iExtRecordArrayToBeDelete[ iExtRecordArrayToBeDelete.Count() -1 ];
+                    ret = UiccPbReqWriteExtDelete( 
+                            aFileId,
+                            aFileIdExt,
+                            index,
+                            aTransId );
+                    iExtRecordArrayToBeDelete.Remove( 
+                            iExtRecordArrayToBeDelete.Count() -1 );
+                    iExtRecordArrayToBeDelete.Compress();
+                    }
+                else 
+                    {
+                    // Start Writing the Entry
+                    iCurrentWritePhase = EPBWritePhase_Write_Entry;
+                    TUint8 index ( 0 );
+                        // Start writing main Entry
+                    if( ( iPhoneBookEntry->iLocation == 0 )||( PB_MBDN_FID == aFileId ) )
+                        {
+                        index = iEntryToWrite;
+                        }
+                    else
+                        {
+                        index = iPhoneBookEntry->iLocation;
+                        }
+                    if( 0 < index )
+                        {
+                        ret = UiccPBReqWriteEntry(
+                                aFileId,
+                                index,
+                                aTransId,
+                                *iPhoneBookEntry );
+                        }
+                    else
+                        {
+                        ret = KErrNotFound;
+                        }
+                    }
+                }
+            else
+                {
+                // further search for free records
+                iCurrentWritePhase = EPBWritePhase_Search_Ext_Entry;
+                TUint8 index = iExtRecordNo++;
+                if( index < iMmPhoneBookStoreMessHandler->
+                            iPBStoreConf[ arrayIndex ].iExtNoOfRec )
+                    {
+                    ret = UiccPbReqWriteReadExt(
+                          aFileId,
+                          aFileIdExt,
+                          index,
+                          aTransId );
+                    }
+                else
+                    {
+                    ret = KErrGeneral;
+                    }
+                }
+            }
+        else
+            {
+            // further search for free records
+            iCurrentWritePhase = EPBWritePhase_Search_Ext_Entry;
+            TUint8 index = iExtRecordNo++;
+            if( index < iMmPhoneBookStoreMessHandler->
+                        iPBStoreConf[ arrayIndex ].iExtNoOfRec )
+                {
+                ret = UiccPbReqWriteReadExt(
+                      aFileId,
+                      aFileIdExt,
+                      index,
+                      aTransId );
+                }
+            else
+                {
+                ret = KErrGeneral;
+                }
+            }
+        }
+    else
+        {
+        ret = KErrGeneral;
+        }
+
+    return ret;
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// TBool CMmPhoneBookOperationWrite::HandleWriteEntryResp
+// Handle write response for EXT part of Entry
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::HandleWriteEntryResp(
+    TInt aStatus,
+    TUint8 aTransId,
+    TUint16 aFileId,
+    TUint16 aFileIdExt) 
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleWriteEntryResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_HANDLEWRITEENTRYRESP, "CMmPhoneBookOperationWrite::HandleWriteEntryResp" );
+    TInt ret ( KErrNone );
+    TUint8 arrayIndex ( ConvertToConfArrayIndex( aFileId ));
+    
+    if( UICC_STATUS_OK == aStatus )
+        {
+        iEntryToUpdateInList = new ( ELeave ) TPBEntry();
+        
+        // Update the Entry needs to be Stored
+        if( ( 0 == iPhoneBookEntry->iLocation )|| ( PB_MBDN_FID == aFileId ) )
+            {
+            iEntryToUpdateInList->iEntryIndex = iEntryToWrite;
+            iEntryToUpdateInList->iEntryPresent = ETrue;
+            }
+        else
+            {
+            iEntryToUpdateInList->iEntryIndex = iPhoneBookEntry->iLocation;
+            iEntryToUpdateInList->iEntryPresent = ETrue;
+            }
+
+        // Check there is ant EXT Data to be Write or Delete
+        if( iExtRecordArrayToBeWrite.Count() > 0 )
+            {
+            // Update Entry
+            iEntryToUpdateInList->PBEntryExtRecord.Append( iExtRecordArrayToBeWrite[0] );
+            iCurrentWritePhase = EPBWritePhase_Write_Ext_Entry;
+            // Start Writing to EXT records
+            TUint8 index = iExtRecordArrayToBeWrite[0];
+            ret = UiccPbReqWriteExt(
+                    aTransId,
+                    index,
+                    aFileId,
+                    aFileIdExt,
+                    *iPhoneBookEntry );
+            }
+        else
+            {
+            // Remove old Entry from the list 
+            TInt index = iMmPhoneBookStoreMessHandler->
+                         GetIndexForPresentEntry( iPhoneBookEntry->iLocation, arrayIndex );
+            if( 0 <= index )
+                {
+                iMmPhoneBookStoreMessHandler->UpdateEntryFromList( iEntryToUpdateInList, index, arrayIndex );
+                }
+            else
+                {
+                // Append the Entry to the List
+                iMmPhoneBookStoreMessHandler->StoreEntryToPhoneBookList( iEntryToUpdateInList, arrayIndex );
+                }
+            // If it is MBDN Phone Book then update MBI File also
+            if( PB_MBDN_FID == aFileId)
+                {
+                // Start Writing MBI file
+                iCurrentWritePhase = EPBWritePhase_Write_MBI_profile;
+                ret = UiccPBReqWriteMBIProfile( 
+                        aTransId,
+                        iPhoneBookEntry->iLocation,
+                        KOperationWrite);
+                iMBIOperation = KOperationWrite;
+                }
+            else
+                {
+                iCurrentWritePhase = EPBWritePhase_complete;
+                }
+            }
+        }
+    else
+        {
+        // If it is a MBDN PhoneBook Then delete MBI profile by writin 0
+        if( PB_MBDN_FID == aFileId)
+            {
+            // Start Writing MBI file
+            iCurrentWritePhase = EPBWritePhase_Write_MBI_profile;
+            ret = UiccPBReqWriteMBIProfile( 
+                    aTransId,
+                    iPhoneBookEntry->iLocation,
+                    KOperationDelete );
+            iMBIOperation = KOperationDelete;
+            }
+        else
+            {
+            ret = KErrArgument;
+            }
+        }
+    return ret;
+    
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// TBool CMmPhoneBookOperationWrite::HandleWriteExtEntryResp
+// Handle write response for EXT part of Entry
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::HandleWriteExtEntryResp(
+    TInt aStatus,
+    TUint8 aTransId,
+    TUint16 aFileId,
+    TUint16 aFileIdExt) 
+    {
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleWriteExtEntryResp");
+OstTrace0( TRACE_NORMAL, CMMPHONEBOOKOPERATIONWRITE_HANDLEWRITEEXTENTRYRESP, "CMmPhoneBookOperationWrite::HandleWriteExtEntryResp" );
+    TInt ret ( KErrNone );
+    TUint8 arrayIndex ( ConvertToConfArrayIndex( aFileId ));
+    
+    if( UICC_STATUS_OK  == aStatus )
+        {
+        if( iExtDeleteOperation )
+            {
+            if( iExtRecordArrayToBeDelete.Count() > 0 )
+                {
+                // remove the Entry Which has been deleted
+                iExtRecordArrayToBeDelete.Remove(
+                                          iExtRecordArrayToBeDelete.Count() - 1 );
+                iExtRecordArrayToBeDelete.Compress();
+                }
+            // Remove old Entry from the list 
+            TInt index = iMmPhoneBookStoreMessHandler->GetIndexForPresentEntry( iPhoneBookEntry->iLocation, arrayIndex );
+            if( 0 <= index )
+                {
+                iMmPhoneBookStoreMessHandler->RemoveExtEntryFromList( index, arrayIndex);
+                }
+            
+            if( iExtRecordArrayToBeDelete.Count() > 0 )
+                {
+                iCurrentWritePhase = EPBWritePhase_Write_Ext_Entry;
+                iExtDeleteOperation = ETrue;
+                TUint8 index = iExtRecordArrayToBeDelete[
+                               iExtRecordArrayToBeDelete.Count() -1 ];
+                ret = UiccPbReqWriteExtDelete( aFileId, aFileIdExt, index, aTransId );
+                }
+            else
+                {
+                // Start Writing the Entry
+                iCurrentWritePhase = EPBWritePhase_Write_Entry;
+                TUint8 index ( 0 );
+                // Start writing main Entry
+                if( ( iPhoneBookEntry->iLocation == 0 )||( PB_MBDN_FID == aFileId ) )
+                    {
+                    index = iEntryToWrite;
+                    }
+                else
+                    {
+                    index = iPhoneBookEntry->iLocation;
+                    }
+                if( 0 < index )
+                    {
+                    ret = UiccPBReqWriteEntry(
+                          aFileId,
+                          index,
+                          aTransId,
+                          *iPhoneBookEntry );
+                    }
+                else
+                    {
+                    ret = KErrNotFound;
+                    }
+                }
+            }
+        else
+            {
+            // Append the record number to the Entry
+            iEntryToUpdateInList->PBEntryExtRecord.Append( iExtRecordArrayToBeWrite[0] );
+            // remove the Entry Which has been Written
+            iExtRecordArrayToBeWrite.Remove( 0 );
+            iExtRecordArrayToBeWrite.Compress();
+            
+            // Start Writing to EXT records
+            // first do the delete records
+            if( iExtRecordArrayToBeWrite.Count() > 0 )
+                {
+                iEntryToUpdateInList->PBEntryExtRecord.Append( iExtRecordArrayToBeWrite[0] );
+                TUint8 index = iExtRecordArrayToBeWrite[0];
+                ret = UiccPbReqWriteExt(
+                      aTransId,
+                      index,
+                      aFileId,
+                      aFileIdExt,
+                      *iPhoneBookEntry );
+                }
+            else
+                {
+                // Overwrite old Entry from the list 
+                TInt index = iMmPhoneBookStoreMessHandler->
+                             GetIndexForPresentEntry( iPhoneBookEntry->iLocation, arrayIndex );
+                if( 0 <= index )
+                    {
+                    iMmPhoneBookStoreMessHandler->UpdateEntryFromList( iEntryToUpdateInList, index, arrayIndex );
+                    }
+                else
+                    {
+                    // Append the Entry to the List
+                    iMmPhoneBookStoreMessHandler->StoreEntryToPhoneBookList( iEntryToUpdateInList, arrayIndex );
+                    }
+                // If it is MBDN PhoenBook then update MBI Profile also
+                if( PB_MBDN_FID == aFileId)
+                    {
+                    // Start Writing MBI file
+                    iCurrentWritePhase = EPBWritePhase_Write_MBI_profile;
+                    ret = UiccPBReqWriteMBIProfile( 
+                            aTransId,
+                            iPhoneBookEntry->iLocation,
+                            KOperationWrite);
+                    iMBIOperation = KOperationWrite;
+                    }
+                else
+                    {
+                    // Complete the Task
+                    iCurrentWritePhase = EPBWritePhase_complete;
+                    }
+                }
+            }
+        }
+    else
+        {
+        if( PB_MBDN_FID == aFileId )
+            {
+            // Start Writing MBI File
+            iCurrentWritePhase = EPBWritePhase_Write_MBI_profile;
+            ret = UiccPBReqWriteMBIProfile( 
+                    aTransId,
+                    iPhoneBookEntry->iLocation,
+                    KOperationWrite);
+            iMBIOperation = KOperationWrite;
+            }
+        else
+            {
+            ret = KErrGeneral;
+            }
+        }
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// TBool CMmPhoneBookOperationWrite::HandleWriteMBIReadResp
+// Handle write response for MBI profile read
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::HandleWriteMBIReadResp(
+        TInt aStatus,
+        TUint8 aDetails,
+        TUint8 aTransId,
+        const TDesC8 &aFileData ) 
+    {
+    TInt ret ( KErrNone );
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleWriteMBIReadResp");
+OstTrace0( TRACE_NORMAL, DUP1_CMMPHONEBOOKOPERATIONWRITE_HANDLEWRITEMBIREADRESP, "CMmPhoneBookOperationWrite::HandleWriteMBIReadResp" );
+
+
+    if( UICC_STATUS_OK  == aStatus )
+        {
+        iEntryToWrite = aFileData[0];
+        ret = UiccPbReqWriteL( aTransId, iEntryToWrite, *iPhoneBookEntry );
+        }
+    else
+        {
+        if( UICC_SECURITY_CONDITIONS_NOT_SATISFIED == aDetails )
+            {
+            ret = KErrAccessDenied;
+            }
+        else
+            {
+            ret = KErrArgument;
+            }
+        }
+
+
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// TBool CMmPhoneBookOperationWrite::HandleWriteMBIWriteResp
+// Handle write response for MBI profile write
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookOperationWrite::HandleWriteMBIWriteResp(
+        TInt aStatus,
+        TUint8 aDetails )
+    {
+    TInt ret ( KErrNone );
+TFLOGSTRING("TSY: CMmPhoneBookOperationWrite::HandleWriteMBIWriteResp");
+OstTrace0( TRACE_FATAL, CMMPHONEBOOKOPERATIONWRITE_HANDLEWRITEMBIWRITERESP, "CMmPhoneBookOperationWrite::HandleWriteMBIWriteResp" );
+
+    if( UICC_STATUS_OK  == aStatus )
+        {
+        // Check for Which operation this response was 
+        if ( KOperationDelete == iMBIOperation )
+            {
+            ret = KErrAccessDenied;
+            }
+        // Send Request to write entry on MBDN file        
+        iCurrentWritePhase = EPBWritePhase_complete;
+        }
+    else
+        {
+        if( UICC_SECURITY_CONDITIONS_NOT_SATISFIED == aDetails )
+            {
+            ret = KErrAccessDenied;
+            }
+        else
+            {
+            ret = KErrArgument;
+            }
+        }
+
+
+    return ret;
+    }
+
+// End of file