diff -r 510c70acdbf6 -r 8ccc39f9d787 adaptationlayer/tsy/nokiatsy_dll/src/cmmphonebookoperationwrite.cpp --- /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 +#include +#include +#include +#include // For error code +#include // 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( 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( 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( 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 + ( iMmPhoneBookStoreMessHandler ); + cmdParams.filePath.Append( static_cast( MF_FILE >> 8 )); + cmdParams.filePath.Append( static_cast( MF_FILE )); + cmdParams.filePath.Append( APPL_FILE_ID>>8); + cmdParams.filePath.Append( APPL_FILE_ID); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK >> 8 )); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK )); + cmdParams.serviceType = UICC_APPL_UPDATE_LINEAR_FIXED; + cmdParams.fileId = aFileId; + cmdParams.trId = static_cast( 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 + ( iMmPhoneBookStoreMessHandler ); + cmdParams.filePath.Append( static_cast( MF_FILE >> 8 )); + cmdParams.filePath.Append( static_cast( MF_FILE )); + cmdParams.filePath.Append( APPL_FILE_ID>>8); + cmdParams.filePath.Append( APPL_FILE_ID); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK >> 8 )); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK )); + cmdParams.fileId = aFileIdExt; + cmdParams.serviceType = UICC_APPL_UPDATE_LINEAR_FIXED; + cmdParams.trId = static_cast( 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 + ( iMmPhoneBookStoreMessHandler ); + cmdParams.filePath.Append( static_cast( MF_FILE >> 8 )); + cmdParams.filePath.Append( static_cast( MF_FILE )); + cmdParams.filePath.Append( APPL_FILE_ID>>8); + cmdParams.filePath.Append( APPL_FILE_ID); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK >> 8 )); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK )); + + // Append transaction id + cmdParams.trId = static_cast( 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 + ( iMmPhoneBookStoreMessHandler ); + cmdParams.filePath.Append( static_cast( MF_FILE >> 8 )); + cmdParams.filePath.Append( static_cast( MF_FILE )); + cmdParams.filePath.Append( APPL_FILE_ID>>8); + cmdParams.filePath.Append( APPL_FILE_ID); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK >> 8 )); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK )); + cmdParams.trId = static_cast( 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 + ( iMmPhoneBookStoreMessHandler ); + cmdParams.filePath.Append( static_cast( MF_FILE >> 8 )); + cmdParams.filePath.Append( static_cast( MF_FILE )); + cmdParams.filePath.Append( APPL_FILE_ID>>8); + cmdParams.filePath.Append( APPL_FILE_ID); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK >> 8 )); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK )); + cmdParams.trId = static_cast( 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 + ( iMmPhoneBookStoreMessHandler ); + cmdParams.filePath.Append( static_cast( MF_FILE >> 8 )); + cmdParams.filePath.Append( static_cast( MF_FILE )); + cmdParams.filePath.Append( APPL_FILE_ID>>8); + cmdParams.filePath.Append( APPL_FILE_ID); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK >> 8 )); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK )); + cmdParams.trId = static_cast( 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 + ( iMmPhoneBookStoreMessHandler ); + cmdParams.filePath.Append( static_cast( MF_FILE >> 8 )); + cmdParams.filePath.Append( static_cast( MF_FILE )); + cmdParams.filePath.Append( APPL_FILE_ID>>8); + cmdParams.filePath.Append( APPL_FILE_ID); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK >> 8 )); + cmdParams.filePath.Append( static_cast( DF_PHONEBOOK )); + cmdParams.trId = static_cast( 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; iiLocation; + } + 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