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