--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmstorage/cmmphonebookstoretsy.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,3213 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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 "cmmphonebookstoretsy.h"
+#include "cmmpblist.h"
+#include "cmmphonebookstoregsmext.h"
+#include "CMmCustomTsy.h"
+#include <ctsy/tflogger.h>
+#include <ctsy/rmmcustomapi.h>
+#include "cmmmessagemanagerbase.h"
+#include "cmmtsyreqhandlestore.h"
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
+#include "CMmCommonStaticUtility.h"
+#include <ctsy/serviceapi/gsmerror.h>
+
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmPhoneBookStoreTsy::CMmPhoneBookStoreTsy()
+ {
+ }
+
+void CMmPhoneBookStoreTsy::ConstructL( const TDesC& aName )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ConstructL - entered");
+#ifdef REQHANDLE_TIMER
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this,
+ iMmPhoneTsy,
+ EMmTsyNumOfStorageRequests,
+ iStorageReqHandles);
+#else
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
+ EMmTsyNumOfStorageRequests, iStorageReqHandles );
+
+#endif
+
+ // Get mode of current extension.
+ RMobilePhone::TMobilePhoneNetworkMode currentMode;
+ iMmPhoneTsy->GetStaticExtensionMode( ¤tMode );
+
+ // Reset all CMmPhoneBookStoreTsy variables
+ ResetVariables();
+
+
+ // Create GSM ENStore objects
+ iMmPhoneBookStoreExtInterface =
+ static_cast<CMmPhoneBookStoreExtInterface*>
+ (CMmPhoneBookStoreGsmExt::NewL( this ) );
+
+ // Set phonebook type by name
+ SetPhoneBookType( aName );
+ // Set extension mode
+ SetActivePBExtension( iMmPhoneBookStoreExtInterface );
+ // Set phonebookrelated name and number max values
+ SetMaxNameAndNumLenght();
+
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ConstructL - PB %S", &iPhoneBookName);
+
+ // Used entries is zero in the start
+ iUsedEntries = 0;
+
+ // Create bootState
+ CMmPhoneTsy::CNosBootState* bootState = iMmPhoneTsy->NosBootState();
+
+ //Create Read Store
+ iReadReqStore = new ( ELeave ) TReadRequestStore();
+ //Init
+ iRetFillBufferedDes = KErrNone;
+ iReadReqStore->iCaching = EFalse;
+ iRequestedOnPBRead = EFalse;
+ iIsPBInitCompleted = EFalse;
+
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ConstructL - iIsPhonebookInitialized: %i", iStoreInfoData->iIsPhonebookInitialized);
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ConstructL - iSIMReady: %i", bootState->iSIMReady);
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ConstructL - before initialization");
+ // Check if phonebook has been initialized
+ if ( !iMmPhoneTsy->IsPBInitActive()
+ && ( !iStoreInfoData->iIsPhonebookInitialized )
+ && bootState->iSIMReady)
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ConstructL - starting initialization");
+
+ // before phonebook requests, phonebook must be initialized
+ iMmPhoneBookStoreExtInterface->InitPhonebook(
+ EMmTsyPhoneBookStoreInitIPC, iPhoneBookName );
+
+ iMmPhoneTsy->SetPBInitActiveStatus( ETrue );
+ }
+
+ if ( bootState->iSIMReady && iStoreInfoData->iIsPhonebookInitialized
+ && ( iPhoneBookType == KADNPhoneBook
+ || iPhoneBookType == KFDNPhoneBook ) )
+ {
+ // Set initialization flag
+ iIsPBInitCompleted = ETrue;
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ConstructL - starting caching");
+ // Call CacheEntries method to read entries from SIM.
+ CacheEntriesL();
+ }
+ }
+
+CMmPhoneBookStoreTsy* CMmPhoneBookStoreTsy::NewL(
+ CMmPhoneTsy* aMmPhone,
+ const TDesC& aName )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::NewL - entered");
+
+ CMmPhoneBookStoreTsy* mmPhoneBookStoreTsy =
+ new ( ELeave ) CMmPhoneBookStoreTsy();
+
+ CleanupClosePushL( *mmPhoneBookStoreTsy );
+
+ mmPhoneBookStoreTsy->iMmPhoneTsy = aMmPhone;
+ mmPhoneBookStoreTsy->iPhoneBookName = aName;
+ mmPhoneBookStoreTsy->ConstructL( aName );
+
+ CleanupStack::Pop( mmPhoneBookStoreTsy );
+
+ return mmPhoneBookStoreTsy;
+ }
+
+
+CMmPhoneBookStoreTsy::~CMmPhoneBookStoreTsy()
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::~CMmPhoneBookStoreTsy - PB %S", &iPhoneBookName);
+
+ if ( iMmPhoneTsy )
+ {
+ CMmPhoneTsy::CNosBootState* bootState = iMmPhoneTsy->NosBootState();
+
+ if ( iMmPhoneTsy->GetCustomTsy() )
+ {
+ RMmCustomAPI::TPndCacheStatus fdnCacheStatus =
+ iMmPhoneTsy->GetCustomTsy()->GetPhonebookCacheStatus( KFDNPhoneBook );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::~CMmPhoneBookStoreTsy - FDN cachestatus %d", fdnCacheStatus);
+
+ RMmCustomAPI::TPndCacheStatus adnCacheStatus =
+ iMmPhoneTsy->GetCustomTsy()->GetPhonebookCacheStatus( KADNPhoneBook );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::~CMmPhoneBookStoreTsy - ADN cachestatus %d", adnCacheStatus);
+
+ // Check if the caching is active
+ if ( bootState->iCachingActive )
+ {
+ // Check if the phonebook type is either ADN or FDN
+ if ( KFDNPhoneBook == iPhoneBookType
+ || KADNPhoneBook == iPhoneBookType )
+ {
+ // Check if the cache status is either failed or not ready
+ if ( RMmCustomAPI::ECacheNotReady == fdnCacheStatus
+ || RMmCustomAPI::ECacheFailed == fdnCacheStatus
+ || RMmCustomAPI::ECacheNotReady == adnCacheStatus
+ || RMmCustomAPI::ECacheFailed == adnCacheStatus )
+ {
+ //Create package
+ CPhoneBookDataPackage package;
+ // Set package data
+ package.SetPhoneBookName( iPhoneBookName );
+ TRAP_IGNORE( iMmPhoneTsy->MessageManager()->HandleRequestL(
+ EMmTsyPhoneBookStoreCacheCancelIPC, &package ); );
+ TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::~CMmPhoneBookStoreTsy - CacheCancel for %d", iPhoneBookType);
+ TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::~CMmPhoneBookStoreTsy - CachingActive = EFalse");
+
+ bootState->iCachingActive = EFalse;
+ }
+ }
+
+ if ( (( RMmCustomAPI::ECacheNotReady == fdnCacheStatus
+ || RMmCustomAPI::ECacheFailed == fdnCacheStatus ) && (KADNPhoneBook == iPhoneBookType) )
+ || (( RMmCustomAPI::ECacheNotReady == adnCacheStatus
+ || RMmCustomAPI::ECacheFailed == adnCacheStatus )) && (KFDNPhoneBook == iPhoneBookType) )
+
+ {
+ TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::~CMmPhoneBookStoreTsy - CachingActive = ETrue");
+ // Set the caching back to active
+ bootState->iCachingActive = ETrue;
+ }
+ }
+ }
+ }
+ if ( iTsyReqHandleStore )
+ {
+ delete iTsyReqHandleStore;
+ iTsyReqHandleStore = NULL;
+ }
+
+ if ( iMmPhoneTsy )
+ {
+ // Remove this phonebook from the list of PB's
+ iMmPhoneTsy->PBList()->RemoveObject( this );
+ }
+
+ // Delete PhoneBookStoreGsmExt
+ if ( iMmPhoneBookStoreExtInterface )
+ {
+ delete iMmPhoneBookStoreExtInterface;
+ iMmPhoneBookStoreExtInterface = NULL;
+ }
+
+ // Delete phonebook write entry
+ if ( iWriteEntry )
+ {
+ delete iWriteEntry;
+ iWriteEntry = NULL;
+ }
+
+ // Delete phonebook delete entry
+ if ( iDeleteEntry )
+ {
+ delete iDeleteEntry;
+ iDeleteEntry = NULL;
+ }
+
+ // Delete cache
+ if ( iPBStoreCache )
+ {
+ /*
+ * When using the NON-DISPATCHER version, CTSY copies overthe contents of the LTSYs Phonebook Store Cache.
+ * This is becasue the LTSY Phonebook Store Cache is destroyed when the complete request of the phonebook
+ * store read cache is finished. CTSY needs this information to stay alive longer. The problem doesn't exist
+ * when using the dispatcher as this information is contained within it for the lifetime of the dispatcher
+ * or until it's destroyed but CTSY is aware of this.
+ */
+#ifndef USING_CTSY_DISPATCHER
+ iPBStoreCache->ResetAndDestroy();
+ delete iPBStoreCache;
+#endif //USING_CTSY_DISPATCHER
+ iPBStoreCache = NULL;
+ }
+
+ //if new cache was requested on Read, Store must be deleted here
+ if ( iReadReqStore )
+ {
+ delete iReadReqStore;
+ iReadReqStore = NULL;
+ }
+
+ // Set cache ready status to Not Ready
+ ResetCacheReady();
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::Phone
+// Returns pointer to the Multimode Phone object. For internal use.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPhoneTsy* CMmPhoneBookStoreTsy::Phone()
+ {
+ return iMmPhoneTsy;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::Init
+// Initialisation method that is called from ETel Server.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::Init()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::OpenNewObjectByNameL
+// This method is not supported.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmPhoneBookStoreTsy::OpenNewObjectByNameL( const TDesC& )
+ {
+ User::Leave( KErrNotSupported );
+
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::OpenNewObjectL
+// This method is not supported.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmPhoneBookStoreTsy::OpenNewObjectL( TDes& )
+ {
+ User::Leave( KErrNotSupported );
+
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ReqModeL
+// ReqModeL is called from the server's CTelObject::ReqAnalyserL
+// in order to check the type of request it has.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmPhoneBookStoreTsy::ReqModeL(
+ const TInt aIpc )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ReqModeL IPC:%d", aIpc);
+
+ CTelObject::TReqMode ret = 0;
+ switch ( aIpc )
+ {
+ // Flow Controlled Services
+ case EMobilePhoneStoreDelete:
+ case EMobilePhoneStoreDeleteAll:
+ ret=KReqModeFlowControlObeyed;
+ break;
+ // Multiple Completion Services with Immediate Server Repost
+ // (Usually Notifications)
+ case EMobilePhoneStoreNotifyStoreEvent:
+ ret = KReqModeMultipleCompletionEnabled |
+ KReqModeRePostImmediately;
+ break;
+
+ // Methods that can propably take a long time and cannot therefore be
+ // flow controlled. Solution: All these methods must check req handle
+ // table before handling the request. In case that the request table
+ // indicates that same method has been called and has not been
+ // completed, the method should return KErrServerBusy.
+ case EMobilePhoneBookStoreRead:
+ case EMobilePhoneBookStoreWrite:
+ ret = 0;
+ break;
+ // Methods that are using DOS but have own flow control system
+ case EMobilePhoneStoreGetInfo:
+ ret = 0;
+ break;
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::RegisterNotification
+// RegisterNotification is called when the server recognises
+// that this notification is being posted for the first time on this
+// sub-session object. It enables the TSY to "turn on" any regular
+// notification messages that it may receive from DOS. Currently does not
+// really do anything but returns KErrNone to ETel server in case of known
+// notification request type.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::RegisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreNotifyStoreEvent:
+ // KErrNone
+ break;
+ default:
+ // Unknown or invalid IPC
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::DeregisterNotification
+// DeregisterNotification is called when the server recognises
+// that this notification will not be posted again because the last client
+// to have a handle on this sub-session object has just closed the handle.
+// It enables the TSY to "turn off" any regular notification messages that
+// it may receive from DOS. Currently does not really do anything but returns
+// KErrNone to ETel server in case of known notification request type.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::DeregisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreNotifyStoreEvent:
+ // KErrNone
+ break;
+ default:
+ // Unknown or invalid IPC
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::NumberOfSlotsL
+// NumberOfSlotsL is called by the server when it is registering a
+// new NOTIFICATION. It enables the TSY to tell the server
+// how many buffer slots to allocate for "repost immediately" notifications
+// that may trigger before clients collect them.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::NumberOfSlotsL(
+ const TInt aIpc )
+ {
+ TInt numberOfSlots = 1; // number of slots
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreNotifyStoreEvent:
+ numberOfSlots = KMmPhoneStoreNotifyStoreEventSlots;
+ break;
+ default:
+ // Unknown or invalid Storage IPC
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ return numberOfSlots;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CancelService
+// CancelService is called by the server when it is
+// "cleaning-up" any still outstanding asynchronous requests before closing
+// a client's sub-session. This will happen if a client closes its R-class
+// handle without cancelling outstanding asynchronous requests. Only
+// Mobile API requests are handled here.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::CancelService(
+ const TInt aIpc,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING3("TSY: CMmPhoneBookStoreTsy::CancelService IPC:%d Handle:%d", aIpc, aTsyReqHandle);
+
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreGetInfo:
+ ret = GetInfoCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneBookStoreRead:
+ ret = ReadCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneStoreDelete:
+ case EMobilePhoneBookStoreWrite:
+ case EMobilePhoneStoreDeleteAll:
+ // These request can't be cancelled, because no
+ // functionality for cancelling. So everything
+ // to do, is let the request continue and return KErrNone.
+ ret = KErrNone;
+ break;
+ case EMobilePhoneStoreNotifyStoreEvent:
+ ret = NotifyStoreEventCancel( aTsyReqHandle );
+ break;
+ default:
+ break;
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CancelService return: %d", ret);
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ExtFunc
+// Dispatches extension function requests. All functions that are not
+// part of the core function set, are routed via the ExtFunc method.
+// At the beginning of this method, packaged pointers are unpacked. Then
+// the correct function is selected using the IPC number.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::ExtFunc(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING3("TSY: CMmPhoneBookStoreTsy::ExtFunc IPC:%d Handle:%d", aIpc, aTsyReqHandle);
+
+ TInt ret = KErrNone;
+ TInt trapError = KErrNone;
+
+ // Reset last tsy request type
+ iReqHandleType = EMultimodePhoneBookStoreReqHandleUnknown;
+
+ TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ); );
+
+ if ( KErrNone != trapError )
+ {
+ ReqCompleted( aTsyReqHandle, trapError );
+ }
+ else if ( KErrNone != ret )
+ {
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+
+ // Save request handle
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != iReqHandleType )
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, aTsyReqHandle );
+#endif
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::DoExtFuncL
+// ExtFunc is called by the server when it has a "extended",
+// i.e. non-core ETel request for the TSY. To process a request handle,
+// request type and request data are passed to the TSY.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::DoExtFuncL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING3("TSY: CMmPhoneBookStoreTsy::DoExtFuncL IPC:%d Handle:%d", aIpc, aTsyReqHandle);
+
+ TAny* dataPtr=aPackage.Ptr1();
+ TAny* dataPtr2=aPackage.Ptr2();
+ TInt result(KErrNotSupported);
+
+ switch ( aIpc )
+ {
+ //
+ // PhoneBook Storage Requests
+ //
+ case EMobilePhoneStoreRead:
+ case EMobilePhoneStoreWrite:
+ ReqCompleted( aTsyReqHandle, KErrNotSupported );
+ result = KErrNone;
+ break;
+ case EMobilePhoneBookStoreRead:
+ result = ReadL( aTsyReqHandle,
+ REINTERPRET_CAST(
+ RMobilePhoneBookStore::TPBIndexAndNumEntries*, dataPtr),
+ aPackage.Des2n() );
+ break;
+ case EMobilePhoneBookStoreWrite:
+ result = WriteL( aTsyReqHandle, aPackage.Des1n(),
+ REINTERPRET_CAST( TInt*, dataPtr2 ) );
+ break;
+ case EMobilePhoneStoreDelete:
+ result = DeleteL( aTsyReqHandle,
+ REINTERPRET_CAST( TInt*, dataPtr ) );
+ break;
+ case EMobilePhoneStoreDeleteAll:
+ result = DeleteAllL( aTsyReqHandle );
+ break;
+ case EMobilePhoneStoreGetInfo:
+ result = GetInfoL( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ case EMobilePhoneStoreNotifyStoreEvent:
+ result = NotifyStoreEvent( REINTERPRET_CAST(
+ RMobilePhoneStore::TMobileStoreEvent*, dataPtr ),
+ REINTERPRET_CAST( TInt*, dataPtr2 ) );
+ break;
+ default:
+ result = KErrNotSupported;
+ }
+ return result;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::PhoneBookName
+// This method returns the phonebook name of the
+// current storage object.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TName* CMmPhoneBookStoreTsy::PhoneBookName()
+ {
+ return &iPhoneBookName;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::SetPhoneBookType
+// This method sets the phonebook type by the name of the
+// current storage object.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::SetPhoneBookType(
+ const TDesC& aName )
+ {
+ if ( !aName.CompareF( KETelIccAdnPhoneBook ) )
+ {
+ iPhoneBookType = KADNPhoneBook; //ADN
+ }
+ else if ( !aName.CompareF( KETelIccBdnPhoneBook ) )
+ {
+ iPhoneBookType = KBDNPhoneBook; //BDN
+ }
+ else if ( !aName.CompareF( KETelIccSdnPhoneBook ) )
+ {
+ iPhoneBookType = KSDNPhoneBook; //SDN
+ }
+ else if ( !aName.CompareF( KETelIccFdnPhoneBook ) )
+ {
+ iPhoneBookType = KFDNPhoneBook; //FDN
+ }
+ else if ( !aName.CompareF( KETelIccVoiceMailBox ) )
+ {
+ iPhoneBookType = KVMBXPhoneBook; //VMBX
+ }
+ else if ( !aName.CompareF( KETelIccMbdnPhoneBook ) )
+ {
+ iPhoneBookType = KMBDNPhoneBook; //MBDN
+ }
+TFLOGSTRING2( "TSY: CMmPhoneBookStoreTsy::SetPhoneBookType - Type: %d", iPhoneBookType);
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CompletePBStoreInitializationL
+// Completes Phonebook initialization
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CompletePBStoreInitializationL(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompletePBStoreInitializationL - Result: %i",aResult );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompletePBStoreInitializationL - PhoneBookType: %u",iPhoneBookType );
+ // Set initialization flag
+ iIsPBInitCompleted = ETrue;
+
+ // If initialization made successfully
+ // fill phonebook related static data
+ if ( KErrNone == aResult )
+ {
+ // Response information
+ CStorageInfoData* pbInitResp;
+ //unpack data
+ aDataPackage->UnPackData( &pbInitResp );
+
+ // Set data got from phonebook initialization
+ *iStoreInfoData = *pbInitResp;
+ // Reset initialization value
+ iStoreInfoData->iIsPhonebookInitialized = ETrue;
+ iStoreInfoData->iIsPhonebookInitializeFailed = EFalse;
+ // Set max name & number length for the current phonebook
+ SetMaxNameAndNumLenght();
+ // Just in case here, if cache request has been come
+ // before initialization is finished.
+ CacheEntriesL();
+ }
+ else
+ //Initialisation has failed
+ {
+ CMmCustomTsy* mmCustom = iMmPhoneTsy->GetCustomTsy();
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::CompletePBStoreInitializationL has failed" );
+
+ if ( NULL != mmCustom )
+ {
+ //complete
+ mmCustom->CompleteNotifyPhoneBookCacheReady
+ ( iPhoneBookName, KErrGeneral );
+
+ //Update cache status with the right "cache value"
+ mmCustom->UpdateCacheStatus( RMmCustomAPI::ECacheFailed,
+ iPhoneBookName );
+
+ // Even if PB initialization has failed, set the member variable
+ // to ETrue. Certain processes like FDN cache does not start if
+ // this is EFalse.
+ iStoreInfoData->iIsPhonebookInitialized = ETrue;
+
+ // Initializing should be tried again later
+ iStoreInfoData->iIsPhonebookInitializeFailed = ETrue;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::SetMaxNameAndNumLenght
+// Sets maximum name & number length for the current phonebook
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::SetMaxNameAndNumLenght()
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::SetMaxNameAndNumLenght");
+ switch ( iPhoneBookType )
+ {
+ case KADNPhoneBook:
+ iMaxNumLen = iStoreInfoData->iADNNumberLengthMax;
+ iMaxTextLen = iStoreInfoData->iADNTextLengthMax;
+ iMultipleReadPosTo = iStoreInfoData->iADNNumOfEntries;
+ break;
+ case KFDNPhoneBook:
+ iMaxNumLen = iStoreInfoData->iFDNNumberLengthMax;
+ iMaxTextLen = iStoreInfoData->iFDNTextLengthMax;
+ iMultipleReadPosTo = iStoreInfoData->iFDNNumOfEntries;
+ break;
+ case KSDNPhoneBook:
+ iMaxNumLen = iStoreInfoData->iSDNNumberLengthMax;
+ iMaxTextLen = iStoreInfoData->iSDNTextLengthMax;
+ iMultipleReadPosTo = iStoreInfoData->iSDNNumOfEntries;
+ break;
+ case KVMBXPhoneBook:
+ iMaxNumLen = iStoreInfoData->iVMBXNumberLengthMax;
+ iMaxTextLen = iStoreInfoData->iVMBXTextLengthMax;
+ iMultipleReadPosTo = iStoreInfoData->iVMBXNumOfEntries;
+ break;
+ case KMBDNPhoneBook:
+ iMaxNumLen = iStoreInfoData->iMBDNNumberLengthMax;
+ iMaxTextLen = iStoreInfoData->iMBDNTextLengthMax;
+ iMultipleReadPosTo = iStoreInfoData->iMBDNNumOfEntries;
+ break;
+ case KBDNPhoneBook:
+ default:
+ iMaxNumLen = 0;
+ iMaxTextLen = 0;
+ iMultipleReadPosTo = 0;
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ReadL
+// This method reads one or more entries from the
+// current storage.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::ReadL(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobilePhoneBookStore::TPBIndexAndNumEntries* aIndexAndEntries,
+ TDes8* aPBData, TBool aContinuedRead )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL");
+
+ // Initialise ret to KErrServerBusy
+ TInt ret = KErrServerBusy;
+
+ // Check if request handle already exists
+ TTsyReqHandle phoneBookStoreReadHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodePhoneBookStoreRead );
+
+ // If phoneBookStoreReadHandle is already set, it means that a read request is in progress.
+ // New (second simultaneous) read request is blocked and KErrServerBusy is returned.
+ // When read is requested after unsuccessful sim refresh registration, ReadL function is called
+ // as call back from ContinueReadL. In this case, phoneBookStoreReadHandle check should be ignored
+ // since the handle will already be set. This is done by checking the value of aContinuedRead which
+ // is set ETrue when ReadL is invoked from ContinueReadL.
+ if ( !aContinuedRead && EMultimodePhoneBookStoreReqHandleUnknown != phoneBookStoreReadHandle )
+ {
+ // If request handle already exists return KErrServerBusy
+ TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL - Handle already exists");
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ // check the buffer size
+ else if ( sizeof(CPhoneBookStoreEntry) > aPBData->MaxLength() )
+ {
+ ReqCompleted( aTsyReqHandle, KErrArgument );
+ }
+ //Caching needs to be done only in case of ADN or FDN phonebook.
+ else if( !iMmPhoneTsy->GetSimRefreshRegister() &&
+ !( iReadReqStore->iCaching ) &&
+ (KADNPhoneBook == iPhoneBookType || KFDNPhoneBook == iPhoneBookType))
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL - SIM refresh registration failed Cache info can be corrupted - ");
+
+ //Store Read req params for new request
+ iReadReqStore->iReqHandle = aTsyReqHandle;
+ iReadReqStore->iIndexAndEntries = aIndexAndEntries;
+ iReadReqStore->iPBData = aPBData;
+ iReadReqStore->iCaching = ETrue;
+
+ //Start new cache
+ ret = iMmPhoneTsy->StartNewCacheL( iPhoneBookType );
+ iRequestedOnPBRead = ETrue;
+ //Store req handle
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EMultimodePhoneBookStoreRead, aTsyReqHandle );
+ }
+
+ else
+ {
+ if ( ( KADNPhoneBook == iPhoneBookType ||
+ KFDNPhoneBook == iPhoneBookType ) &&
+ ( !iStoreInfoData->iIsPhonebookInitialized || !iCacheReady ) )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL - Initiliszation ongoing -> Read not possible");
+ // If phonebook initialisation is not ready for AND and FDN phonebooks,
+ // complete with KErrInUse. This is done becauce TSY can not handle
+ // multible simultaneously request to certain phonebook.
+ // (No dynamic transaktion Ids)
+ ret = KErrInUse;
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ ret = KErrNone;
+ TBool isOneEntryRequest = ETrue;
+ iNumEntriesFilled = 0;
+ iIndexAndEntries = aIndexAndEntries;
+ TBool cacheRequest = EFalse;
+
+ iIndexToRead = aIndexAndEntries->iIndex;
+
+ // If user supplies index which is less than 0, complete with
+ // KErrArgument each record are numbered from 0 to maximum
+ // number of records.
+ if ( ( 1 > iIndexToRead ) || ( 1 > aIndexAndEntries->iNumSlots ) )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL - Index is less than 1 or aIndexAndEntries->iNumSlots is less then 1" );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ReadL - Index %i ", iIndexToRead);
+ iIndexAndEntries = NULL;
+ iIndexToRead = 0;
+ ReqCompleted( aTsyReqHandle, KErrArgument );
+ }
+ else if ( KBDNPhoneBook != iPhoneBookType &&
+ aIndexAndEntries->iNumSlots > iMultipleReadPosTo )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ReadL - iPhoneBookType %i: ", iPhoneBookType);
+TFLOGSTRING3("TSY: CMmPhoneBookStoreTsy::ReadL - iNumSlots: %i > iMultipleReadPosTo: %i", aIndexAndEntries->iNumSlots, iMultipleReadPosTo );
+ iIndexAndEntries = NULL;
+ iIndexToRead = 0;
+ ReqCompleted( aTsyReqHandle, KErrNotFound );
+ }
+ else
+ {
+ iNumEntriesToRead = aIndexAndEntries->iNumSlots;
+
+ if ( iNumEntriesToRead > 1 )
+ {
+ isOneEntryRequest = EFalse;
+ }
+
+ iBufferToRead = aPBData;
+
+ // If not cache request
+ if ( ( isOneEntryRequest ) || ( KBDNPhoneBook == iPhoneBookType
+ || KSDNPhoneBook == iPhoneBookType
+ || KVMBXPhoneBook == iPhoneBookType
+ || KMBDNPhoneBook == iPhoneBookType ) )
+ {
+ ret = iMmPhoneBookStoreExtInterface->ReadL(
+ EMmTsyPhoneBookStoreReadIPC, iPhoneBookName,
+ aIndexAndEntries);
+ }
+ // If cache request, but cache is not yet ready
+ else if ( ( NULL == iPBStoreCache ) || !iCacheReady )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL - Cache is not yet ready" );
+ ret = KErrNotReady;
+ }
+ // Set cache request for completion handling
+ else
+ {
+ cacheRequest = ETrue;
+
+ if ( ( iNumEntriesToRead ) > iMultipleReadPosTo )
+ {
+ ret = KErrArgument;
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL - KErrArgument" );
+ }
+ }
+
+ // Error when doing Read -request or error in parameters
+ if ( KErrNone != ret )
+ {
+ // Null CTSYs pointer to LTSY owned array
+ iPBStoreReadEntries = NULL;
+
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ // Set request type and handle type for non-cached request
+ else if ( EFalse == cacheRequest )
+ {
+ // Save tsy req handle type
+ // if not store at new cache request
+ if( !iReadReqStore->iCaching )
+ {
+ iReqHandleType = EMultimodePhoneBookStoreRead;
+ }
+ }
+ // Handle cached request
+ else
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ReadL - iIndexToRead %i ", iIndexToRead);
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ReadL - iNumSlots %i ", iNumEntriesToRead);
+ ReadEntriesFromArrayL( EPBStoreCacheArray );
+ aIndexAndEntries->iNumSlots = iNumEntriesFilled;
+ //This condition will arise when client has sent a buffer insufficient to
+ //hold even one entry. KErrArgument has to be returned in this case.
+ if ( ( iRetFillBufferedDes == KErrOverflow ) && ( iNumEntriesFilled == 0 ) )
+ {
+ TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL - Insufficient buffer to hold even 1 entry." );
+ ret = KErrArgument;
+ }
+ else if ( 0 == iNumEntriesFilled )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL - iNumEntriesFilled is 0 " );
+ ret = KErrNotFound;
+ }
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+ }
+ //New cache is done and read is done
+ if( !(KErrOverflow == iRetFillBufferedDes ) )
+ {
+ //Reset caching info for Read req store
+ iReadReqStore->iCaching = EFalse;
+ }
+
+ //If sim refresh registration is failed try to register
+ if( !iMmPhoneTsy->GetSimRefreshRegister() )
+ {
+ iMmPhoneTsy->SimRefreshRegisterL();
+ }
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CompleteReadL
+// This method completes read -request when a entry has been read
+// from the (U)SIM
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CompleteReadL(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteReadL - aResult: %i",aResult );
+
+ TInt errCode = aResult;
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneBookStoreRead );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ // Fill buffered data with entry if no errors
+ if ( KErrNone == aResult )
+ {
+ aDataPackage->UnPackData(iPBStoreReadEntries);
+ ReadEntriesFromArrayL( EPBStoreReadEntriesArray );
+ //This condition will arise when client has sent a buffer insufficient to
+ //hold even one entry. KErrArgument has to be returned in this case.
+ if ( ( iRetFillBufferedDes == KErrOverflow ) && ( iNumEntriesFilled == 0 ) )
+ {
+ TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::CompleteReadL - Insufficient buffer to hold even 1 entry." );
+ errCode = KErrArgument;
+ }
+ }
+ iIndexAndEntries->iNumSlots = iNumEntriesFilled;
+ }
+
+ // Reset class variables for read request
+ iIndexToRead = 0;
+ iNumEntriesToRead = 0;
+ iNumEntriesFilled = 0;
+ iIndexAndEntries = NULL;
+ iBufferToRead = NULL;
+
+ // Complete only if request is not cancelled or handle is valid
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ ReqCompleted( reqHandle, errCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CountEntriesL
+// This method is part of GetInfo functionality, and it is used
+// to count the num of used entries for SDN and VMBX.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::CountEntriesL()
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::CountEntriesL called");
+
+ // before phonebook requests, phonebook must be initialized
+ TInt returnValue( KErrNone );
+ returnValue = iMmPhoneBookStoreExtInterface->
+ CountPhonebookEntriesL( EMmTsyPhoneBookStoreGetInfoIPC,
+ iPhoneBookName );
+
+ return returnValue;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CompleteCountEntries
+// This method is part of GetInfo functionality, and it is used
+// to complete count the num of used entries for SDN and VMBX.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CompleteCountEntries(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteCountEntries - Result: %i", aResult );
+ TInt numOfEntries( 0 );
+
+ //reset request handle. Returns the deleted req handle.
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneStoreGetInfo );
+
+ if ( KErrNone == aResult && EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ // Fill if no errors and reqHandle is valid
+ aDataPackage->UnPackData( numOfEntries );
+ iUsedEntries = numOfEntries;
+ iPhoneBookInfoChanged->iUsedEntries = iUsedEntries;
+ iIsUsedEntriesCounted = ETrue;
+ }
+
+ // Complete if request is not cancelled or handle is valid
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CacheEntriesL
+// This method activates phonebook entry caching.
+// if phonebook initialization is not done, it is done first.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+
+
+#ifndef USING_CTSY_DISPATCHER
+
+
+void CMmPhoneBookStoreTsy::CacheEntriesL()
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::CacheEntriesL - entered");
+ // Get Phonebook related DLL -static data
+
+ // Check if phonebook has been initialized successfully. Caching of ADN
+ // entries does not work if phonebook initialize have been failed.
+ if ( iStoreInfoData->iIsPhonebookInitialized &&
+ ( EFalse == iStoreInfoData->iIsPhonebookInitializeFailed ||
+ KADNPhoneBook != iPhoneBookType ) )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CacheEntriesL - Cache PB %S ", &iPhoneBookName);
+
+ TInt ret = KErrNone;
+ CMmPhoneTsy::CNosBootState* bootState = iMmPhoneTsy->NosBootState();
+
+ if ( !iCacheReady )
+ {
+ // Check if SIM is ready, and SMS has been cached already
+ if ( ( KADNPhoneBook == iPhoneBookType ) ||
+ ( KFDNPhoneBook == iPhoneBookType ) &&
+ ( EFalse != bootState->iSIMReady ) )
+ {
+ // Cache must be reseted after the boot
+ if ( NULL != iPBStoreCache )
+ {
+ iPBStoreCache->ResetAndDestroy();
+ delete iPBStoreCache;
+ iPBStoreCache = NULL;
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::CacheEntriesL - Old cache deleted");
+ }
+
+ //Inform phonebook that the cache is not ready for refresh
+ ResetCacheReady();
+
+ bootState->iCachingActive = ETrue;
+ TRAP( ret, ReadToCacheL();)
+ }
+ }
+ else if ( iCacheReady )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CacheEntriesL - PB %S cache entries ready", &iPhoneBookName);
+ }
+ if ( KErrNone != ret)
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CacheEntriesL - PB %S caching failed!", &iPhoneBookName);
+ }
+ }
+ // Phonebook not initialized -> let's do it before caching
+ else if ( ( !iStoreInfoData->iIsPhonebookInitialized
+ || iStoreInfoData->iIsPhonebookInitializeFailed )
+ && !iMmPhoneTsy->IsPBInitActive() )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CacheEntriesL - Starting initialization PB: %S", &iPhoneBookName);
+ // before phonebook requests, phonebook must be initialized
+ iMmPhoneBookStoreExtInterface->InitPhonebook(
+ EMmTsyPhoneBookStoreInitIPC, iPhoneBookName );
+ iMmPhoneTsy->SetPBInitActiveStatus( ETrue );
+ }
+ }
+
+#endif //USING_CTSY_DISPATCHER
+
+
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CompleteCachingL
+// This method completes caching from sim server to TSY
+// After the caching cache status is updated.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CompleteCachingL(
+ TInt aResult, CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteCachingL - PB %S Caching completed", &iPhoneBookName);
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteCachingL - Result: %i",aResult );
+
+#ifdef USING_CTSY_DISPATCHER
+ aDataPackage->UnPackData(iPBStoreCache);
+#else
+ CArrayPtrSeg<CPhoneBookStoreEntry>* entryData;
+ aDataPackage->UnPackData(entryData);
+ CopyLtsyCacheToCtsyCache(entryData);
+#endif
+
+ CMmPhoneTsy::CNosBootState* bootState = iMmPhoneTsy->NosBootState();
+
+ // If cache were successfully generated, update
+ // the number of used entries
+ if ( KErrNone == aResult )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteCachingL - iPBStoreCache->Count: %i",iPBStoreCache->Count() );
+ iUsedEntries = iPBStoreCache->Count();
+ //Set the caching ready only if request is successfull.
+ //when FDN is on, the ADN caching is not successful. Meanwhile the FDN
+ //is on, the ADN list is not available, so this is not a problem.
+ //When the user turns the FDN back to off the tsy will
+ //cache the FDN list
+ //again
+ iCacheReady = ETrue;
+ }
+
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteCachingL - iUsedEntries: %i",iUsedEntries );
+
+ bootState->iCachingActive = EFalse;
+
+ CMmCustomTsy* mmCustom = iMmPhoneTsy->GetCustomTsy();
+
+ // Check if client has requested caching before completing
+ if ( NULL != mmCustom && !iMmPhoneTsy->IsRefreshOngoing() )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::CompleteCachingL - Client refresh req complete" );
+ if ( KErrNone == aResult )
+ {
+ mmCustom->UpdateCacheStatus( RMmCustomAPI::ECacheReady,
+ iPhoneBookName );
+
+ mmCustom->CompleteNotifyPhoneBookCacheReady(
+ iPhoneBookName, KErrNone );
+
+ if( iRequestedOnPBRead )
+ {
+ ContinueReadL();
+ }
+ }
+ //in all other cases, RMmCustomAPI::ECacheFailed is used
+ else
+ {
+ mmCustom->UpdateCacheStatus( RMmCustomAPI::ECacheFailed,
+ iPhoneBookName );
+
+ mmCustom->CompleteNotifyPhoneBookCacheReady(
+ iPhoneBookName, KErrGeneral );
+ }
+ }
+ // Otherwise caching has been originated from SIM and completion goes
+ // through refresh
+ else
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::CompleteCachingL - SIM refresh req complete" );
+
+ // Check for which phonebook the caching must be completed
+ if ( !iPhoneBookName.CompareF( KETelIccAdnPhoneBook ) )
+ {
+ iMmPhoneTsy->CompleteCacheSimL( KCacheAdn, aResult );
+ }
+ else if ( !iPhoneBookName.CompareF( KETelIccFdnPhoneBook ) )
+ {
+ iMmPhoneTsy->CompleteCacheSimL( KCacheFdn, aResult );
+ }
+ //NOTIFY THE PHONEBOOK that the cache is ready
+ if ( NULL != mmCustom )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::CompleteCachingL, mmCustom->UpdateCacheStatus" );
+ if ( KErrNone == aResult )
+ {
+ mmCustom->UpdateCacheStatus(
+ RMmCustomAPI::ECacheReady, iPhoneBookName );
+ }
+ else
+ {
+ mmCustom->UpdateCacheStatus(
+ RMmCustomAPI::ECacheFailed, iPhoneBookName );
+ }
+ mmCustom->CompleteNotifyPhoneBookCacheReady(
+ iPhoneBookName, aResult );
+ }
+ }
+ // Get current status of FDN and ADN
+ if (mmCustom != NULL)
+ {
+ RMmCustomAPI::TPndCacheStatus fdnCacheStatus =
+ mmCustom->GetPhonebookCacheStatus( KFDNPhoneBook );
+ RMmCustomAPI::TPndCacheStatus adnCacheStatus =
+ mmCustom->GetPhonebookCacheStatus( KADNPhoneBook );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteCachingL - FDN cachestatus %d", fdnCacheStatus);
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteCachingL - ADN cachestatus %d", adnCacheStatus);
+
+ // Set caching back to active if either FDN or ADN is caching
+ if ( RMmCustomAPI::ECacheNotReady == fdnCacheStatus
+ || RMmCustomAPI::ECacheNotReady == adnCacheStatus )
+ {
+ bootState->iCachingActive = ETrue;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ReadEntriesFromArrayL
+// Fills client's multiple read request from cached entries or enty array
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::ReadEntriesFromArrayL(
+ TPBArrayTypeToRead aArrayType )
+ {
+ CArrayPtrSeg<CPhoneBookStoreEntry>* ptrToArray = NULL;
+
+ if ( EPBStoreCacheArray == aArrayType )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ReadEntriesFromCache %S, iPBStoreCache", &iPhoneBookName);
+ ptrToArray = iPBStoreCache;
+ }
+ else if ( EPBStoreReadEntriesArray == aArrayType )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ReadEntriesFromEntryArray %S, iPBStoreReadEntries", &iPhoneBookName);
+ ptrToArray = iPBStoreReadEntries;
+ }
+ else
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadEntriesFromEntryArray invalid aArrayType");
+ User::Leave(KErrNotSupported);
+ }
+
+ CPhoneBookStoreEntry* cacheEntry = NULL;
+
+ for ( TInt locationIndex = 0; locationIndex < ptrToArray->Count();
+ locationIndex++ )
+ {
+
+ // Check if location matches into location required
+ if ( ( ptrToArray->At( locationIndex ) )->iLocation >= iIndexToRead &&
+ ( ptrToArray->At( locationIndex ) )->
+ iLocation < iIndexToRead + iNumEntriesToRead )
+ {
+ cacheEntry = ptrToArray->At( locationIndex );
+
+ TInt ret = FillBufferedDesL( cacheEntry );
+ if ( KErrNone != ret )
+ {
+ locationIndex = ptrToArray->Count();
+ }
+ }
+
+ cacheEntry = NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ReadToCacheL
+// Starts caching operation. Cache array is given as
+// a one parameter that is filled by DOS -side.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::ReadToCacheL()
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadToCacheL");
+
+ // Call ReadL from GSM extension
+ iMmPhoneBookStoreExtInterface->ReadToCacheL(
+ EMmTsyPhoneBookStoreCacheIPC,
+ iPhoneBookName);
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::UpdateCacheL
+// This method updates cache and it is used when
+// Write- and Delete requests are succesfully completed.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::UpdateCacheL(
+ CPhoneBookStoreEntry* aEntry,
+ TBool aDeleteEntry )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::UpdateCacheL");
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - iPBStoreCache->Count(): %i ", iPBStoreCache->Count() );
+
+ if(aEntry == NULL)
+ {
+ if(aDeleteEntry == EFalse)
+ {
+ delete iWriteEntry;
+ iWriteEntry = NULL;
+ }
+
+ User::Leave(KErrArgument);
+ }
+
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - aEntry->Location(): %i ", aEntry->iLocation );
+
+ TInt result( KErrNotFound );
+ TInt updateIndex( 0 );
+
+ for ( TInt index = 0; index < iPBStoreCache->Count() &&
+ result == KErrNotFound; index++ )
+ {
+ if ( ( iPBStoreCache->At( index ) )->iLocation == aEntry->iLocation )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - iPBStoreCache->iLocation: %i ", aEntry->iLocation);
+ updateIndex = index;
+ result = KErrNone;
+ }
+ }
+
+ // Case: <Add new entry into cache>
+ if ( KErrNotFound == result )
+ {
+ // Update write entry into cache
+ if ( aDeleteEntry == EFalse)
+ {
+ // Append new entry into cache
+ // Sort array for PBClient
+ iPBStoreCache->AppendL( aEntry );
+ TKeyArrayPtr sortKey( _FOFF( CPhoneBookStoreEntry, iLocation ),
+ ECmpTUint16 );
+ iPBStoreCache->Sort( sortKey );
+ // Append the number or used entries
+ iUsedEntries++;
+ // For notification purpose
+ iMobilePhoneBookStoreEvent = RMobilePhoneStore::KStoreEntryAdded;
+ // Reset pointer to PB object. It is stored in iPBStoreCache array
+ iWriteEntry = NULL;
+ }
+ else
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::UpdateCacheL, Deleted entry is not in cache! ");
+ }
+ }
+ // Entry found
+ else
+ {
+ // Case: <Change existing entry in cache>
+ if ( aEntry->iText || aEntry->iNumber ||
+ ( aEntry->iAnr && aEntry->iAnr->MdcaCount() > 0 ) ||
+ ( aEntry->iEmail && aEntry->iEmail->MdcaCount() > 0 ) ||
+ ( aEntry->iSne && aEntry->iSne->MdcaCount() > 0 ) )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - Change existing entry");
+ // Every update/deletion of an existing phonebook entry or the
+ // addition of a new phone book entry, incremements the
+ // iChangeCounter.
+ iPhoneBookInfo.iChangeCounter++;
+ // Append updated entry to cache
+
+ // Delete current entry
+ CPhoneBookStoreEntry* entryToDelete =
+ iPBStoreCache->At( updateIndex );
+ if ( entryToDelete == iDeleteEntry )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - entryToDelete == iDeleteEntry");
+ // reset iDeleteEntry member
+ iDeleteEntry = NULL;
+ }
+ if ( entryToDelete == iWriteEntry )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - entryToDelete == iWriteEntry");
+ // reset iWriteEntry member
+ iWriteEntry = NULL;
+ }
+ delete entryToDelete;
+ entryToDelete = NULL;
+ iPBStoreCache->Delete( updateIndex );
+ iPBStoreCache->InsertL( updateIndex, aEntry );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - updateIndex: %i", updateIndex);
+ if ( aEntry == iWriteEntry )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - aEntry == iWriteEntry");
+ // reset iWriteEntry member
+ iWriteEntry = NULL;
+ }
+ // Compress cache
+ iPBStoreCache->Compress();
+ // Complete notify store event
+ iMobilePhoneBookStoreEvent = (
+ RMobilePhoneStore::KStoreEntryChanged );
+ }
+ // Case: <Delete entry from cache>
+ else
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - Delete entry");
+ // decrease iUsedEntries
+ iUsedEntries--;
+
+ // Every update/deletion of an existing phonebook entry or the
+ // addition of a new phone book entry incremements the
+ // iChangeCounter.
+ iPhoneBookInfo.iChangeCounter++;
+ CPhoneBookStoreEntry* entryToDelete =
+ iPBStoreCache->At( updateIndex );
+ if ( entryToDelete == iDeleteEntry )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - entryToDelete == iDeleteEntry");
+ // reset iDeleteEntry member
+ iDeleteEntry = NULL;
+ }
+ else
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::UpdateCacheL - iWriteEntry = NULL");
+ // reset iWriteEntry member
+ iWriteEntry = NULL;
+ }
+
+ delete entryToDelete;
+ entryToDelete = NULL;
+ iPBStoreCache->Delete( updateIndex );
+ // Compress cache
+ iPBStoreCache->Compress();
+
+ // Complete notify store event
+ iMobilePhoneBookStoreEvent = (
+ RMobilePhoneStore::KStoreEntryDeleted );
+
+ if ( !iPBStoreCache->Count() )
+ {
+ // Store is empty
+ // Complete notify store event
+ iMobilePhoneBookStoreEvent = (
+ RMobilePhoneStore::KStoreEmpty );
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::FillBufferedDesL
+// This method fills the buffered descriptor by client with
+// the entry. Data to be filled must contain at least one valid field.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::FillBufferedDesL(
+ CPhoneBookStoreEntry* aPhoneBookStoreResp )
+ {
+ TInt ret( KErrNone );
+
+ // Create pbBuffer
+ CPhoneBookBuffer* pbBuffer = new( ELeave ) CPhoneBookBuffer();
+
+ CleanupStack::PushL(pbBuffer);
+
+ // Set buffered descriptor
+ pbBuffer->Set( iBufferToRead );
+
+ // Initialize variable for while -loop
+ TInt marked( 0 );
+ // The number 6 is the number of the loops. Every number
+ // has its own functionality within loop, beginging
+ // from "AddNewEntry" to "Append Sne"
+ while ( KErrNone == ret && 7 > marked )
+ {
+ // Append new entry
+ if ( 0 == marked )
+ {
+ ret = pbBuffer->AddNewEntryTag();
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::FillBufferedDesL - 0, ret: %i ", ret);
+ }
+ // Append Index
+ else if ( 1 == marked )
+ {
+ ret = pbBuffer->PutTagAndValue(
+ RMobilePhoneBookStore::ETagPBAdnIndex, (TUint16)(
+ aPhoneBookStoreResp->iLocation ) );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::FillBufferedDesL - 1, ret: %i ", ret);
+ }
+ // Append Name
+ else if ( 2 == marked )
+ {
+ if ( aPhoneBookStoreResp->iText &&
+ aPhoneBookStoreResp->iText->Size() > 0 )
+ {
+ ret = pbBuffer->PutTagAndValue(
+ RMobilePhoneBookStore::ETagPBText,
+ aPhoneBookStoreResp->iText->Des() );
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::FillBufferedDesL - 2, ret: %i ", ret);
+ }
+ // Append Number
+ else if ( 3 == marked )
+ {
+ if ( aPhoneBookStoreResp->iNumber &&
+ aPhoneBookStoreResp->iNumber->Size() > 0 )
+ {
+ ret = pbBuffer->PutTagAndValue(
+ RMobilePhoneBookStore::ETagPBNumber,
+ aPhoneBookStoreResp->iNumber->Des() );
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::FillBufferedDesL - 3, ret: %i ", ret);
+ }
+ // Append Email
+ else if ( 4 == marked )
+ {
+ for ( TInt numEmails = 0;
+ numEmails < aPhoneBookStoreResp->iEmail->MdcaCount();
+ ++numEmails )
+ {
+ ret = pbBuffer->PutTagAndValue(
+ RMobilePhoneBookStore::ETagPBEmailAddress,
+ aPhoneBookStoreResp->iEmail->MdcaPoint( numEmails ) );
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::FillBufferedDesL - 4, ret: %i ", ret);
+ }
+ // Append Sne
+ else if ( 5 == marked )
+ {
+ for ( TInt numSnes = 0;
+ numSnes < aPhoneBookStoreResp->iSne->MdcaCount();
+ ++numSnes )
+ {
+ ret = pbBuffer->PutTagAndValue(
+ RMobilePhoneBookStore::ETagPBSecondName,
+ aPhoneBookStoreResp->iSne->MdcaPoint( numSnes ) );
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::FillBufferedDesL - 5, ret: %i ", ret);
+ }
+ // Append Anr
+ else if ( 6 == marked )
+ {
+ for ( TInt numAnrs = 0;
+ numAnrs < aPhoneBookStoreResp->iAnr->MdcaCount();
+ ++numAnrs )
+ {
+ pbBuffer->AddNewNumberTag();
+ ret = pbBuffer->PutTagAndValue(
+ RMobilePhoneBookStore::ETagPBNumber,
+ aPhoneBookStoreResp->iAnr->MdcaPoint( numAnrs ) );
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::FillBufferedDesL - 6, ret: %i ", ret);
+ }
+
+ marked++;
+ }
+
+ // If error occurs after the "new entry" has been filled, corrupted
+ // entry will be destroyed from pbbuffer. If appending new tag causes
+ // error, RemovePartialEntry -function will not be used, because nothing
+ // is yet inside pbbuffer related to this entry.
+ if ( KErrNone != ret && 1 < marked )
+ {
+ pbBuffer->RemovePartialEntry();
+ }
+
+ // Increase the class variable which holds
+ // the number of entries filled to buffered data
+ if ( KErrNone == ret && 4 <= marked )
+ {
+ iNumEntriesFilled++;
+ }
+
+ CleanupStack::PopAndDestroy(pbBuffer);
+
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::FillBufferedDesL - returnvalue: %i ", ret);
+
+ //If simrefresh registration is failed prevent new cache
+ if( KErrOverflow == ret && !( iMmPhoneTsy->GetSimRefreshRegister() ) )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ReadL - Prevent new cache" );
+ iReadReqStore->iCaching = ETrue;
+ }
+
+ iRetFillBufferedDes = ret;
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ReadCancel
+// Cancels reading a entry from the Phonebook if the request is
+// still outstanding.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::ReadCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::ReadCancel - Handle:%d", aTsyReqHandle );
+
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneBookStoreRead );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ // Reset class variables
+ iIndexToRead = 0;
+ iNumEntriesToRead = 0;
+ iNumEntriesFilled = 0;
+ iIndexAndEntries = NULL;
+ iBufferToRead = NULL;
+ // Complete with KErrCancel
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::WriteL
+// This method writes the entry supplied within the entry
+// parameter into the store, at an index specified by entry index. If the
+// client specifies an index of -1, then the TSY will store the entry in the
+// first free location and then return this location within an entry index
+// when it will be completed
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::WriteL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDesC8* aPBData,
+ TInt* aIndex )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::WriteL - EtelIndex: %i",*aIndex );
+
+ //SDN phonebook can't be updated by user.
+ if (iPhoneBookType == KSDNPhoneBook)
+ {
+ TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::WriteL - SDN phonebook entry can't be updated");
+ ReqCompleted( aTsyReqHandle, KErrAccessDenied );
+ }
+ else
+ {
+ // Check if request handle already exists
+ TTsyReqHandle writePhoneBookStoreHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodePhoneBookStoreWrite );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown
+ != writePhoneBookStoreHandle )
+ {
+ // If request handle already exists return KErrServerBusy
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ // Save pointer to data
+ iPBData = aPBData;
+ // Save pointer to index
+ iWriteIndexToReturn = aIndex;
+
+ TInt ret( KErrArgument );
+
+ // If user supplies index which is less than -1 or 0, complete with
+ // KErrArgument
+ if ( -1 > *aIndex || 0 == *aIndex )
+ {
+ iPBData = NULL;
+ iWriteIndexToReturn = 0;
+ }
+ // Write by location at SIM card
+ else
+ {
+ // Straight write-forwarding to SIM server,
+ TInt index = *aIndex;
+
+ TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::WriteL - Straight write-forwarding to SIM");
+ ret = WriteByIndexL( index );
+ }
+
+ // Check error while processing write
+ if ( KErrNone != ret )
+ {
+ iPBData = NULL;
+ iWriteIndexToReturn = NULL;
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ // Save tsy req handle type
+ iReqHandleType = EMultimodePhoneBookStoreWrite;
+ }
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::WriteByIndexL
+// This method writes the entry to the (U)SIM, specified by the
+// location index at SIM Card.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::WriteByIndexL(
+ TInt aIndex )
+ {
+ TInt ret( KErrNone );
+
+ // Separate PhoneBook data, get
+ // - Name to write
+ // - Number to write
+ // - Email address
+ // - SNE
+ // - ANR/AAS
+ // - GRP
+
+ // NOTE: when this entry is created, it is always
+ // put on the cache in succesfull case.
+ iWriteEntry = new( ELeave )CPhoneBookStoreEntry();
+ iWriteEntry->ConstructL();
+
+ ret = SeparatePBDataL( iPBData, iWriteEntry );
+
+ if ( KErrNone == ret )
+ {
+ // Forward request to GSM extension
+ ret = iMmPhoneBookStoreExtInterface->WriteL(
+ EMmTsyPhoneBookStoreWriteIPC, // Ipc
+ iPhoneBookName, // PhoneBook name
+ aIndex, // Write index
+ iWriteEntry );
+ }
+
+ if ( KErrNone != ret )
+ {
+ delete iWriteEntry;
+ iWriteEntry = NULL;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CompleteWriteL
+// This method completes writing an entry.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CompleteWriteL(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteWriteL - Result: %i",aResult );
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneBookStoreWrite );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ //Create a TPBEntryInfo struct
+ TPBEntryInfo pbEntryInfo;
+
+ //initialise variables of the structure to 0
+ pbEntryInfo.iLocation = 0;
+ pbEntryInfo.iMaxNumLength = 0;
+
+ if ( ( KErrNone == aResult) ||
+ ( KErrGsmSimServSneFull == aResult ) ||
+ ( KErrGsmSimServAnrFull == aResult ) ||
+ ( KErrGsmSimServEmailFull == aResult ) )
+ {
+ aDataPackage->UnPackData( pbEntryInfo );
+ // For VMBX, set KStoreEntryAdded always event for a Write-request
+ iMobilePhoneBookStoreEvent = RMobilePhoneStore::KStoreEntryAdded;
+
+ // Update cache for ADN and FDN
+ if ( ( KADNPhoneBook == iPhoneBookType )
+ || ( KFDNPhoneBook == iPhoneBookType ) )
+ {
+ if ( KErrGsmSimServSneFull == aResult )
+ {
+ iWriteEntry->iSne->Reset();
+ }
+ else if ( KErrGsmSimServAnrFull == aResult )
+ {
+ iWriteEntry->iAnr->Reset();
+ }
+ else if ( KErrGsmSimServEmailFull == aResult )
+ {
+ iWriteEntry->iEmail->Reset();
+ }
+ iWriteEntry->iLocation =
+ static_cast<TUint16>( pbEntryInfo.iLocation );
+ UpdateCacheL( iWriteEntry, EFalse );
+ }
+
+ if ( KADNPhoneBook == iPhoneBookType )
+ {
+ //Update Adn Max Num Length
+ iStoreInfoData->iADNNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteWriteL: pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+ else if ( KFDNPhoneBook == iPhoneBookType )
+ {
+ //Update Fdn Max Num Length
+ iStoreInfoData->iFDNNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteWriteL:FDN pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+ else if ( KVMBXPhoneBook == iPhoneBookType )
+ {
+ //Update VMBX Max Num Length
+ if ( 0 < pbEntryInfo.iMaxNumLength )
+ {
+ iStoreInfoData->iVMBXNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteWriteL:VMBX pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+ else if ( KMBDNPhoneBook == iPhoneBookType )
+ {
+ //Update MBDN Max Num Length
+ if ( 0 < pbEntryInfo.iMaxNumLength )
+ {
+ iStoreInfoData->iMBDNNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteWriteL:MBDN pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+ CompleteNotifyStoreEvent( pbEntryInfo.iLocation );
+ }
+ if ( ( KErrNone == aResult ) ||
+ ( KErrGsmSimServSneFull == aResult ) ||
+ ( KErrGsmSimServAnrFull == aResult ) ||
+ ( KErrGsmSimServEmailFull == aResult ) &&
+ ( -1 == *iWriteIndexToReturn ) )
+ {
+ *iWriteIndexToReturn = pbEntryInfo.iLocation;
+ }
+
+ ReqCompleted( reqHandle, aResult );
+ }
+
+ // Writing was done unsuccesfully and we could not
+ // put iWriteEntry into cache, so we can delete it.
+ if ( ( KErrNone != aResult ) && iWriteEntry )
+ {
+ if ( ( KErrGsmSimServSneFull== aResult ) ||
+ ( KErrGsmSimServAnrFull == aResult ) ||
+ ( KErrGsmSimServEmailFull == aResult ) )
+ {
+ // Do Nothing
+ }
+ else
+ {
+ delete iWriteEntry;
+ iWriteEntry = NULL;
+ }
+ }
+ iPBData = NULL;
+ iWriteIndexToReturn = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::SeparatePBDataL
+// This fuction separates a byte stream formatted data, which
+// is passed across the ETel API.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::SeparatePBDataL(
+ TDesC8* aPBData,
+ CPhoneBookStoreEntry* aWriteData )
+ {
+ TInt ret( KErrNone );
+ TInt returnValue( KErrNone );
+ TUint8 tmpTagValue;
+ TUint8 tagValue;
+ CPhoneBookBuffer::TPhBkTagType tagType;
+ TUint8 newEntryTag;
+ newEntryTag = RMobilePhoneBookStore::ETagPBNewEntry;
+ TPtrC16 textPtr;
+ TPtrC16 numPtr;
+ TPtrC16 emailPtr;
+ TPtrC16 snePtr;
+ TPtrC16 anrPtr;
+
+ // Create pbBuffer
+ CPhoneBookBuffer* pbBuffer = new( ELeave ) CPhoneBookBuffer();
+ CleanupStack::PushL(pbBuffer);
+
+ // Set pointer to constant descriptor
+ TPtr8 dataToSeparate( NULL, 0, 0 );
+ dataToSeparate.Set( (TUint8*)aPBData->Ptr(),
+ aPBData->Length(), aPBData->Length() );
+
+ // Init and get entry info
+ pbBuffer->Set( &dataToSeparate );
+ pbBuffer->StartRead();
+ ret = pbBuffer->GetTagAndType( tmpTagValue, tagType );
+
+ // Ensure, that there is new entry containing data
+ if ( KErrNone == ret && tmpTagValue == newEntryTag )
+ {
+ // Get the first value from TLV data
+ ret = pbBuffer->GetTagAndType( tagValue, tagType );
+
+ while ( KErrNone == ret )
+ {
+ switch ( tagValue )
+ {
+ // Get name
+ case RMobilePhoneBookStore::ETagPBText:
+ ret = pbBuffer->GetValue( textPtr );
+ if ( iMaxTextLen < textPtr.Length() )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::SeparatePBDataL - Text length is more than KPBStoreTextSize " );
+ ret = CMmCommonStaticUtility::EpocErrorCode(
+ KErrTooBig, KErrGsm0707TextStringTooLong );
+ }
+ else
+ {
+ if ( 0 < textPtr.Length() )
+ {
+ aWriteData->iText =
+ HBufC::NewLC( textPtr.Length() );
+ aWriteData->iText->Des() = textPtr;
+ CleanupStack::Pop();
+ }
+ }
+ break;
+ // Get number
+ case RMobilePhoneBookStore::ETagPBNumber:
+ ret = pbBuffer->GetValue( numPtr );
+ aWriteData->iNumber = HBufC::NewLC( numPtr.Length() );
+ aWriteData->iNumber->Des() = numPtr;
+ CleanupStack::Pop();
+ break;
+ // Skip index, it has been supplied as a parameter
+ case RMobilePhoneBookStore::ETagPBAdnIndex:
+ pbBuffer->SkipValue( CPhoneBookBuffer::EPhBkTypeInt16 );
+ break;
+ // Skip TON, not needed
+ case RMobilePhoneBookStore::ETagPBTonNpi:
+ pbBuffer->SkipValue( CPhoneBookBuffer::EPhBkTypeInt8 );
+ break;
+ // Get Email(s)
+ case RMobilePhoneBookStore::ETagPBEmailAddress:
+ ret = pbBuffer->GetValue( emailPtr );
+ if ( iStoreInfoData->
+ iEmailTextLengthMax < emailPtr.Length() )
+ {
+ ret = KErrArgument;
+ }
+ else
+ {
+ aWriteData->iEmail->AppendL( emailPtr );
+ }
+ break;
+ // Get Sne(s)
+ case RMobilePhoneBookStore::ETagPBSecondName:
+ ret = pbBuffer->GetValue( snePtr );
+ if ( iStoreInfoData->iSNETextLengthMax < snePtr.Length() )
+ {
+ ret = KErrArgument;
+ }
+ else
+ {
+ aWriteData->iSne->AppendL( snePtr );
+ }
+ break;
+ // Get Anr(s)
+ case RMobilePhoneBookStore::ETagPBAnrStart:
+ {
+ ret = pbBuffer->GetTagAndType( tagValue, tagType );
+ switch ( tagValue )
+ {
+ case RMobilePhoneBookStore::ETagPBNumber:
+ ret = pbBuffer->GetValue( anrPtr );
+
+ if ( iStoreInfoData->iANRNumLengthMax <
+ anrPtr.Length() )
+ {
+ ret = CMmCommonStaticUtility::EpocErrorCode(
+ KErrTooBig, KErrGsm0707DialStringTooLong );
+ }
+ else
+ {
+ aWriteData->iAnr->AppendL( anrPtr );
+ }
+ break;
+ case RMobilePhoneBookStore::ETagPBText:
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::SeparatePBDataL - RMobilePhoneBookStore::ETagPBAnrStart ETagPBText" );
+ break;
+ case RMobilePhoneBookStore::ETagPBTonNpi:
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::SeparatePBDataL - RMobilePhoneBookStore::ETagPBAnrStart ETagPBTonNpi" );
+ break;
+ default:
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::SeparatePBDataL - RMobilePhoneBookStore::ETagPBAnrStart KErrArgument" );
+ ret = KErrArgument;
+ break;
+ }
+ }
+ break;
+ // Unknown Tag, complete with KErrArgument
+ default:
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::SeparatePBDataL - Unknown Tag " );
+ ret = KErrArgument;
+ break;
+ }
+ // Get the new field if no errors
+
+ if ( KErrNone == ret )
+ {
+ ret = pbBuffer->GetTagAndType( tagValue, tagType );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::SeparatePBDataL - RMobilePhoneBookStore::GetNewField tagValue: %d ", tagValue);
+ }
+ }
+ if ( KErrNotFound != ret )
+ {
+ returnValue = ret;
+ }
+ }
+ // Bad descriptor, no new entry found
+ else
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::SeparatePBDataL - Bad descriptor " );
+ returnValue = KErrArgument;
+ }
+
+ CleanupStack::PopAndDestroy(pbBuffer);
+
+ return returnValue;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::DeleteL
+// This method deletes the entry in the slot specified by the
+// index parameter from the store.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::DeleteL(
+ const TTsyReqHandle aTsyReqHandle,
+ TInt* aIndex )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::DeleteL - aIndex: %i",*aIndex );
+
+ //SDN phonebook can't be updated by user.
+ if (iPhoneBookType == KSDNPhoneBook)
+ {
+ TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::DeleteL - SDN phonebook entry can't be updated");
+ ReqCompleted( aTsyReqHandle, KErrAccessDenied );
+ }
+ else
+ {
+ TInt ret( KErrNone );
+
+ // If user supplies index which is less than 0, complete with KErrArgument,
+ // each record is numbered from 1 to 255 (or maximum number of records).->
+ // /Multimode ETel API Definition Document 4.06/
+ // NOTE! TSY does not take the responsibility, if the location number is
+ // greater than total numbers of records in this PBStore.
+ if ( 0 > *aIndex )
+ {
+ ReqCompleted( aTsyReqHandle, KErrArgument );
+ }
+ else
+ {
+ // These are done for updating cache
+ iDeleteEntry = new ( ELeave ) CPhoneBookStoreEntry;
+ iDeleteEntry->ConstructL();
+ iDeleteEntry->iLocation = static_cast<TUint16>( *aIndex );
+
+ // Forward Delete request to extension
+ ret = iMmPhoneBookStoreExtInterface->DeleteL(
+ EMmTsyPhoneBookStoreDeleteIPC,
+ iPhoneBookName,
+ iDeleteEntry->iLocation );
+
+ // Request returned error
+ if ( KErrNone != ret )
+ {
+ delete iDeleteEntry;
+ iDeleteEntry = NULL;
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ // Save tsy req handle type
+ iReqHandleType = EMultimodePhoneStoreDelete;
+ }
+ }
+ }
+
+ return KErrNone;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CompleteDeleteL
+// Completes deleting an entry from the (U)SIM
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CompleteDeleteL(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteDeleteL - Result: %i",aResult );
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneStoreDelete );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ // If aResult is KErrNone
+ if ( KErrNone == aResult )
+ {
+ //Create a TPBEntryInfo struct
+ TPBEntryInfo pbEntryInfo;
+
+ //initialise variables of the structure to 0
+ pbEntryInfo.iLocation = 0;
+ pbEntryInfo.iMaxNumLength = 0;
+
+ //Unpack data
+ aDataPackage->UnPackData( pbEntryInfo );
+
+ // For VMBX, set KStoreEntryDeleted(or KStoreEmpty) for a Delete-request
+ iMobilePhoneBookStoreEvent = RMobilePhoneStore::KStoreEntryDeleted;
+ if(iStoreInfoData->iVMBXNumOfEntries <= 0)
+ {
+ iMobilePhoneBookStoreEvent = RMobilePhoneStore::KStoreEmpty;
+ }
+
+ //Update cache only if iPhoneBookType is ADN or FDN
+ if ( KADNPhoneBook == iPhoneBookType ||
+ KFDNPhoneBook == iPhoneBookType )
+ {
+ // Call UpdateCacheL with iDeleteEntry
+ UpdateCacheL( iDeleteEntry, ETrue );
+ }
+
+ // Complete notify store event
+ CompleteNotifyStoreEvent( iDeleteEntry->iLocation );
+
+ if ( KADNPhoneBook == iPhoneBookType )
+ {
+ //Update Adn Max Num Length
+ iStoreInfoData->iADNNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteDeleteL: pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+ else if ( KFDNPhoneBook == iPhoneBookType )
+ {
+ //Update Fdn Max Num Length
+ iStoreInfoData->iFDNNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteDeleteL:FDN pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+ else if ( KVMBXPhoneBook == iPhoneBookType )
+ {
+ //Update VMBX Max Num Length
+ if ( 0 < pbEntryInfo.iMaxNumLength )
+ {
+ iStoreInfoData->iVMBXNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteDeleteL:VMBX pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+ }
+
+#ifdef USING_CTSY_DISPATCHER
+
+ //set the VMB phonebook maximum number length, from the code above it appears to be a defect as the
+ //VMB phonebook maximum number length can never be set due to it being behind the guard that the phonebook
+ //has to be either ADN or FDN
+ if((aResult == KErrNone) && (iPhoneBookType == KVMBXPhoneBook))
+ {
+ TPBEntryInfo* pbEntryInfo = NULL;
+ aDataPackage->UnPackData(&pbEntryInfo);
+ __ASSERT_DEBUG(pbEntryInfo, User::Invariant());
+ if(pbEntryInfo->iMaxNumLength >= 0)
+ {
+ iStoreInfoData->iVMBXNumberLengthMax = pbEntryInfo->iMaxNumLength;
+ }
+ }
+#endif //USING_CTSY_DISPATCHER
+
+ // Delete now unnecessary iDeleteEntry
+ delete iDeleteEntry;
+ iDeleteEntry = NULL;
+
+ // Complete with error
+ ReqCompleted( reqHandle, aResult );
+ }
+ else
+ {
+ if ( iDeleteEntry )
+ {
+ delete iDeleteEntry;
+ iDeleteEntry = NULL;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::DeleteAllL
+// This method deletes all entries from the store by overwriting
+// the number and the name fields within SIM.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::DeleteAllL(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::DeleteAllL - Handle:%d", aTsyReqHandle );
+
+ //SDN phonebook can't be updated by user.
+ if (iPhoneBookType == KSDNPhoneBook)
+ {
+ TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::DeleteAllL - SDN phonebook entry can't be updated");
+ ReqCompleted( aTsyReqHandle, KErrAccessDenied );
+ }
+ else
+ {
+ TInt ret( KErrNone );
+
+ // Forwarded function call
+ ret = iMmPhoneBookStoreExtInterface->DeleteAllL(
+ EMmTsyPhoneBookStoreDeleteAllIPC, iPhoneBookName );
+
+ if ( KErrNone != ret )
+ {
+ // Complete with error
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ // Save tsy req handle type
+ iReqHandleType = EMultimodePhoneStoreDeleteAll;
+ }
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CompleteDeleteAll
+// Completes delete all entries from the Phonebook store. If
+// no error value occurred, store event can be set to KStoreEmpty.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CompleteDeleteAll(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteDeleteAll - Result: %i",aResult );
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneStoreDeleteAll );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ // If deletion done succesfully, complete notify store event
+ // that all entries has deleted at once.
+ if ( KErrNone == aResult )
+ {
+ if ( ( KADNPhoneBook == iPhoneBookType )
+ || ( KFDNPhoneBook == iPhoneBookType ) )
+ {
+ ResetCache();
+ }
+
+ //Create a TPBEntryInfo struct
+ TPBEntryInfo pbEntryInfo;
+
+ //initialise variables of the structure to 0
+ pbEntryInfo.iLocation = 0;
+ pbEntryInfo.iMaxNumLength = 0;
+
+ //Unpack data
+ aDataPackage->UnPackData( pbEntryInfo );
+
+ if ( KADNPhoneBook == iPhoneBookType )
+ {
+ //Update Adn Max Num Length
+ iStoreInfoData->iADNNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteDeleteAll: pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+ else if ( KFDNPhoneBook == iPhoneBookType )
+ {
+ //Update Fdn Max Num Length
+ iStoreInfoData->iFDNNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteDeleteAll:FDN pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+ else if ( KVMBXPhoneBook == iPhoneBookType )
+ {
+ //Update VMBX Max Num Length
+ if ( 0 < pbEntryInfo.iMaxNumLength )
+ {
+ iStoreInfoData->iVMBXNumberLengthMax =
+ pbEntryInfo.iMaxNumLength;
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteDeleteAll:VMBX pbEntryInfo.iMaxNumLength:%d", pbEntryInfo.iMaxNumLength);
+ }
+
+ // Complete notify store event
+ iMobilePhoneBookStoreEvent = RMobilePhoneStore::KStoreEmpty;
+ CompleteNotifyStoreEvent( -1 ); // DeleteAll->index -1
+ }
+
+ // Complete with error
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::GetInfoL
+// This method returns information about the phonebookstore.
+// This information includes the store's name, the type of thing it stores,
+// the total number of storage slots and the number of used slots. It does
+// not give information about which slots are filled and which are empty.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::GetInfoL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aInfo )
+ {
+
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL Handle:%d", aTsyReqHandle);
+
+ TInt ret( KErrNone );
+ TTsyReqHandle getInfoHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EMultimodePhoneStoreGetInfo );
+
+ if ( 0 < getInfoHandle )
+ {
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation.
+ ret = KErrServerBusy;
+ }
+ else if ( sizeof( RMobilePhoneBookStore::TMobilePhoneBookInfoV1 ) >
+ aInfo->MaxLength() )
+ {
+ // aInfo can not contain TMobilePhoneBookInfoV1 object.
+ ret = KErrArgument;
+ }
+ else
+ {
+ RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg* infoPckg =
+ reinterpret_cast<RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg*>(
+ aInfo );
+ iPhoneBookInfoChanged = &( ( *infoPckg )() );
+
+ TBool completeRequest( ETrue );
+
+ // Reset info
+ SetInfo();
+
+ // BDN is not supported feature. Request will be completed later on
+ // this method with KErrNone and hard coded BDN storage information
+ // will be delivered to the client.
+ if ( KBDNPhoneBook == iPhoneBookType )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL - BDN" );
+ }
+ // If PB type is ADN, total entries and used entries already read
+ else if ( KADNPhoneBook == iPhoneBookType )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL - ADN" );
+ ret = KErrNotReady;
+
+ //if cache is ready, set information and get name length
+ if ( EFalse != iCacheReady )
+ {
+ ret = KErrNone;
+
+ // The maximum length for the number in a phonebook entry
+ iPhoneBookInfoChanged->iMaxNumLength =
+ iStoreInfoData->iADNNumberLengthMax;
+
+ // The maximum length for the text tag in a phonebook entry
+ iPhoneBookInfoChanged->iMaxTextLength =
+ iStoreInfoData->iADNTextLengthMax;
+
+ // The total number of entries
+ iPhoneBookInfoChanged->iTotalEntries =
+ iStoreInfoData->iADNNumOfEntries;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - total entries: %i",iStoreInfoData->iADNNumOfEntries );
+
+ // Check if Email, SNE & ANR Caps are supported + GRP
+
+ if ( iStoreInfoData->iEmailNumOfEntriesPerEntry > 0 )
+ {
+ iPhoneBookInfoChanged->iCaps =
+ iPhoneBookInfoChanged->iCaps |
+ RMobilePhoneBookStore::KCapsEmailAddressUsed;
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL ADN -> Email supported" );
+ }
+ if ( iStoreInfoData->iSNENumOfEntriesPerEntry > 0 )
+ {
+ iPhoneBookInfoChanged->iCaps =
+ iPhoneBookInfoChanged->iCaps |
+ RMobilePhoneBookStore::KCapsSecondNameUsed;
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL ADN -> SNE supported" );
+ }
+ if ( iStoreInfoData->iANRNumOfEntriesPerEntry > 0 )
+ {
+ iPhoneBookInfoChanged->iCaps =
+ iPhoneBookInfoChanged->iCaps |
+ RMobilePhoneBookStore::KCapsAdditionalNumUsed;
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL ADN -> ANR supported" );
+ }
+ }
+ }
+ // If PB type is FDN, total entries and used entries already read
+ else if ( KFDNPhoneBook == iPhoneBookType )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL - FDN" );
+ ret = KErrNotReady;
+
+ //if cache is ready, set information and get name length
+ if ( EFalse != iCacheReady )
+ {
+ ret = KErrNone;
+
+ // The maximum length for the number in a phonebook entry
+ iPhoneBookInfoChanged->iMaxNumLength =
+ iStoreInfoData->iFDNNumberLengthMax;
+
+ // The maximum length for the text tag in a phonebook entry
+ iPhoneBookInfoChanged->iMaxTextLength =
+ iStoreInfoData->iFDNTextLengthMax;
+
+ // The total number of entries
+ iPhoneBookInfoChanged->iTotalEntries =
+ iStoreInfoData->iFDNNumOfEntries;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - total entries: %i",iStoreInfoData->iFDNNumOfEntries );
+
+ // Set caps by phonebook name
+ iPhoneBookInfoChanged->iCaps = KPBTypeFDNCaps;
+ }
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - iMaxNumLength: %i",iPhoneBookInfoChanged->iMaxNumLength );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - iMaxTextLength: %i",iPhoneBookInfoChanged->iMaxTextLength );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - iTotalEntries: %i",iPhoneBookInfoChanged->iTotalEntries );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - iUsedEntries: %i",iPhoneBookInfoChanged->iUsedEntries );
+ }
+ else if ( KSDNPhoneBook == iPhoneBookType )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL - SDN" );
+ ret = KErrNone;
+
+ // The maximum length for the number in a phonebook entry
+ iPhoneBookInfoChanged->iMaxNumLength =
+ iStoreInfoData->iSDNNumberLengthMax;
+
+ // The maximum length for the text tag in a phonebook entry
+ iPhoneBookInfoChanged->iMaxTextLength =
+ iStoreInfoData->iSDNTextLengthMax;
+
+ // The total number of entries
+ iPhoneBookInfoChanged->iTotalEntries =
+ iStoreInfoData->iSDNNumOfEntries;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - total entries: %i",iStoreInfoData->iSDNNumOfEntries );
+
+ if ( !iIsUsedEntriesCounted )
+ {
+ // Check first that SIM server is ready before doing this
+ if ( !iIsUsedEntriesCounted &&
+ iMmPhoneTsy->NosBootState()->iSIMReady &&
+ iStoreInfoData->iIsPhonebookInitialized )
+ {
+ // GetInfo -request cannot be completed
+ // before used entries are counted
+ completeRequest = EFalse;
+ ret = CountEntriesL();
+ }
+ else
+ {
+ iPhoneBookInfoChanged = NULL;
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL, not ready to perform CountEntriesL()");
+ ret = KErrNotReady;
+ }
+ }
+ }
+ //VMBX need to read total and used entries
+ else if ( KVMBXPhoneBook == iPhoneBookType )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL - VMBX" );
+ ret = KErrNone;
+
+ // The maximum length for the number in a phonebook entry
+ iPhoneBookInfoChanged->iMaxNumLength =
+ iStoreInfoData->iVMBXNumberLengthMax;
+
+ // The maximum length for the text tag in a phonebook entry
+ iPhoneBookInfoChanged->iMaxTextLength =
+ iStoreInfoData->iVMBXTextLengthMax;
+
+ // The total number of entries
+ iPhoneBookInfoChanged->iTotalEntries =
+ iStoreInfoData->iVMBXNumOfEntries;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - total entries: %i",iStoreInfoData->iVMBXNumOfEntries );
+
+ // Set caps by the store info data
+ iPhoneBookInfoChanged->iCaps = iStoreInfoData->iVMBXCaps;
+
+ if ( !iIsUsedEntriesCounted )
+ {
+ completeRequest = EFalse;
+ // Check first that SIM server is ready before doing this
+ if ( !iIsUsedEntriesCounted &&
+ iMmPhoneTsy->NosBootState()->iSIMReady &&
+ iStoreInfoData->iIsPhonebookInitialized )
+ {
+ completeRequest = EFalse;
+ ret = CountEntriesL();
+ }
+ else
+ {
+ iPhoneBookInfoChanged = NULL;
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL, not ready to perform CountEntriesL()");
+ ret = KErrNotReady;
+ }
+ }
+ }
+ //MBDN
+ else if ( KMBDNPhoneBook == iPhoneBookType )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::GetInfoL - MBDN" );
+ ret = KErrNone;
+
+ // The maximum length for the number in a phonebook entry
+ iPhoneBookInfoChanged->iMaxNumLength =
+ iStoreInfoData->iMBDNNumberLengthMax;
+
+ // The maximum length for the text tag in a phonebook entry
+ iPhoneBookInfoChanged->iMaxTextLength =
+ iStoreInfoData->iMBDNTextLengthMax;
+
+ // The total number of entries
+ iPhoneBookInfoChanged->iTotalEntries =
+ iStoreInfoData->iMBDNNumOfEntries;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - total entries: %i",iPhoneBookInfoChanged->iTotalEntries );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - iMaxNumLength: %i",iPhoneBookInfoChanged->iMaxNumLength );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoL - iMaxTextLength: %i",iPhoneBookInfoChanged->iMaxTextLength );
+
+ // Set caps by the store info data
+ iPhoneBookInfoChanged->iCaps = iStoreInfoData->iMBDNCaps;
+ }
+ if ( completeRequest )
+ {
+ // All data got, complete request
+ ReqCompleted( aTsyReqHandle, ret );
+
+ // Request completed here. Set ret to KErrNone. In otherwise request
+ // will be completed second time in CMmPhoneBookStoreTsy::ExtFunc.
+ ret = KErrNone;
+ }
+ else if ( KErrNone == ret )
+ {
+ // Save tsy req handle type
+ iReqHandleType = EMultimodePhoneStoreGetInfo;
+ }
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CompleteGetInfo
+// Completes GetInfo -request.
+// GetInfo method needed info is got mainly in initial -phase.
+// In case of SDN and VMBX used entries must be conted.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CompleteGetInfo(
+ TInt aError )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteGetInfo - Result: %i", aError );
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneStoreGetInfo );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ // Complete request with error
+ ReqCompleted( reqHandle, aError );
+ }
+
+ // NULL class parameter
+ iPhoneBookInfoChanged = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::SetInfo
+// This method resets the info parameter from the client before
+// the request is done to the extension.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::SetInfo()
+ {
+ // The name of the phone-side store
+ iPhoneBookInfoChanged->iName = iPhoneBookName;
+
+ // The maximum number of characters for the number in a phonebook entry
+ iPhoneBookInfoChanged->iMaxNumLength = KNoInfoAvail;
+
+ // The maximum number of characters for the text tag in a phonebook entry
+ iPhoneBookInfoChanged->iMaxTextLength = KNoInfoAvail;
+
+ // The memory location of this phonebook
+ // BDN not supported, location set to unknown
+ if ( !iPhoneBookName.CompareF( KETelIccBdnPhoneBook ) )
+ {
+ iPhoneBookInfoChanged->iLocation =
+ RMobilePhoneBookStore::ELocationUnknown;
+ }
+ // Location SIM
+ else
+ {
+ iPhoneBookInfoChanged->iLocation =
+ RMobilePhoneBookStore::ELocationIccMemory;
+ }
+
+ // The type of entry in the phone-side store
+ iPhoneBookInfoChanged->iType = RMobilePhoneStore::EPhoneBookStore;
+
+ // Set change counter
+ iPhoneBookInfoChanged->iChangeCounter = iPhoneBookInfo.iChangeCounter;
+
+ // Set caps by phonebook name
+ if ( !iPhoneBookName.CompareF( KETelIccAdnPhoneBook ) )
+ {
+ iPhoneBookInfoChanged->iCaps = KPBTypeADNCaps;
+ }
+ else if ( !iPhoneBookName.CompareF( KETelIccFdnPhoneBook ) )
+ {
+ iPhoneBookInfoChanged->iCaps = KPBTypeFDNCaps;
+ }
+ else if ( !iPhoneBookName.CompareF( KETelIccVoiceMailBox ) )
+ {
+ iPhoneBookInfoChanged->iCaps = KPBTypeVMBXCaps;
+ }
+ else if ( !iPhoneBookName.CompareF( KETelIccSdnPhoneBook ) )
+ {
+ iPhoneBookInfoChanged->iCaps = KPBTypeSDNCaps;
+ }
+ else if ( !iPhoneBookName.CompareF( KETelIccBdnPhoneBook ) )
+ {
+ iPhoneBookInfoChanged->iCaps = KPBTypeBDNCaps;
+ }
+ else if ( !iPhoneBookName.CompareF( KETelIccMbdnPhoneBook ) )
+ {
+ iPhoneBookInfoChanged->iCaps = KPBTypeMBDNCaps;
+ }
+
+ // Indicates the current number of entries that may be held in this store
+ iPhoneBookInfoChanged->iUsedEntries = iUsedEntries;
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::SetInfo - used entries: %i",iUsedEntries );
+
+ // Indicates the total number of entries
+ iPhoneBookInfoChanged->iTotalEntries = KNoInfoAvail;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::GetInfoCancel
+// This method cancels get store information request if it
+// is still outstanding.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::GetInfoCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::GetInfoCancel - Handle:%d", aTsyReqHandle );
+
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneStoreGetInfo );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ // Reset class attribute
+ iPhoneBookInfoChanged = NULL;
+ // Complete with KErrCancel
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::NotifyStoreEvent
+// This method activates notifying of phonebookstore events.
+//
+// This method allows a client to be notified when one of the events
+// defined in TMobilePhoneStoreEvent occurs to the store. These events
+// allow a client to know the overall status of a store (full, empty etc)
+// and also when a slot within a store changes. A slot could change because
+// another client or the phone has created, updated or deleted an entry.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::NotifyStoreEvent(
+ RMobilePhoneStore::TMobileStoreEvent *aEvent,
+ TInt* aIndex )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::NotifyStoreEvent - called" );
+
+ TTsyReqHandle requestHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodePhoneStoreNotifyStoreEvent );
+
+ // If request is not running
+ if ( 0 == requestHandle )
+ {
+ // Set variables to notify
+ iNotifyPhoneBookStoreEventPtr = aEvent;
+ iNotifyPhoneBookStoreEventIndexPtr = aIndex;
+
+ // Save tsy req handle type
+ iReqHandleType = EMultimodePhoneStoreNotifyStoreEvent;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::NotifyStoreEventCancel
+// This method cancels notifying of phonebookstore events.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::NotifyStoreEventCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::NotifyStoreEventCancel - called" );
+
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneStoreNotifyStoreEvent );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ // Complete with cancel
+ iNotifyPhoneBookStoreEventPtr = NULL;
+ iNotifyPhoneBookStoreEventIndexPtr = NULL;
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CompleteNotifyStoreEvent
+// This method is called when PhoneBookStore related event happens
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CompleteNotifyStoreEvent(
+ TInt aLocation )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::CompleteNotifyStoreEvent - Called" );
+
+ //reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePhoneStoreNotifyStoreEvent );
+
+ if ( EMultimodePhoneBookStoreReqHandleUnknown != reqHandle )
+ {
+ RMobilePhoneStore::TMobileStoreEvent* phoneBookStoreEvent =
+ REINTERPRET_CAST( RMobilePhoneStore::TMobileStoreEvent*,
+ iNotifyPhoneBookStoreEventPtr );
+
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteNotifyStoreEvent - StoreEvent %i ", iMobilePhoneBookStoreEvent );
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::CompleteNotifyStoreEvent - location %i ", aLocation );
+ // Fill notify information
+ *phoneBookStoreEvent = iMobilePhoneBookStoreEvent;
+ *iNotifyPhoneBookStoreEventIndexPtr = aLocation;
+
+ ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::SetActivePBExtension
+// Sets pointer to active extension.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPhoneBookStoreTsy::SetActivePBExtension(
+ CMmPhoneBookStoreExtInterface* aMmPBExt )
+ {
+ TInt ret = KErrGeneral;
+
+ if ( aMmPBExt )
+ {
+ iMmPhoneBookStoreExtInterface = aMmPBExt;
+ ret = KErrNone;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ActivePBExtension
+// Returns a pointer to the active extension.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPhoneBookStoreExtInterface* CMmPhoneBookStoreTsy::ActivePBExtension()
+ {
+ return iMmPhoneBookStoreExtInterface;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ResetVariables
+// Reset all used variables.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::ResetVariables()
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ResetVariables" );
+
+ // Reset phonebooktype
+ iPhoneBookType = 0;
+
+ // Cache variables
+ iPBStoreCache = NULL;
+ iMultipleReadPosTo = 1000;
+ iCacheReady = EFalse;
+
+ // Read variables
+ iNumEntriesToRead = 0;
+ iBufferToRead = NULL;
+ iIndexToRead = 0;
+ iNumEntriesFilled = 0;
+ iIndexAndEntries = NULL;
+ iPBStoreReadEntries = NULL;
+
+ // Write variables
+ iPBData = NULL;
+ iWriteIndexToReturn = NULL;
+
+ // GetInfo variables
+ iPhoneBookInfoChanged = NULL;
+
+ // NotifyStoreEvent
+ iNotifyPhoneBookStoreEventIndexPtr = NULL;
+ iNotifyPhoneBookStoreEventPtr = NULL;
+
+ // Initialization
+ iStoreInfoData = iMmPhoneTsy->PhoneBookState();
+
+ // Count SDN and VMBX used entries
+ iIsUsedEntriesCounted = EFalse;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ResetCache
+// Resets cache
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::ResetCache()
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ResetCache" );
+
+ // SDN and VMBX do not have cache. Skip reset if the cache pointer is null.
+ if ( NULL != iPBStoreCache )
+ {
+
+ iPBStoreCache->ResetAndDestroy();
+ iPhoneBookInfo.iChangeCounter++;
+ iUsedEntries = 0;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ResetCacheReady
+// Resets iCacheReady flag
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::ResetCacheReady()
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ResetCacheReady" );
+ iCacheReady = EFalse;
+ CMmCustomTsy* mmCustom = NULL;
+
+ if( iMmPhoneTsy )
+ {
+ mmCustom = iMmPhoneTsy->GetCustomTsy();
+ }
+
+ if ( NULL != mmCustom )
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ResetCacheReady, mmCustom->UpdateCacheStatus - not ready" );
+ mmCustom->UpdateCacheStatus( RMmCustomAPI::ECacheNotReady,
+ iPhoneBookName );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ResetInitialisationStatus
+// Resets iIsPhonebookInitialized flag
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::ResetInitialisationStatus()
+ {
+ iStoreInfoData->iIsPhonebookInitialized = EFalse;
+ iStoreInfoData->iIsPhonebookInitializeFailed = EFalse;
+ }
+
+
+#ifdef TF_LOGGING_ENABLED
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ReqCompleted
+// Overrides CTelObject::ReqCompleted for test logging purposes.
+// It prints the aTsyReqHandle and aError variable in the log file and then
+// calls CTelObject::ReqCompleted.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::ReqCompleted(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aError )
+ {
+TFLOGSTRING3("TSY: CMmPhoneBookStoreTsy::ReqCompleted - Handle:%d Error:%d", aTsyReqHandle, aError);
+ CTelObject::ReqCompleted( aTsyReqHandle, aError );
+ }
+
+#endif
+
+
+#ifdef REQHANDLE_TIMER
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::SetTypeOfResponse
+// Sets the type of response for a given Handle. Automatic
+// mode includes an automatic response in case of no response
+// from the DOS in a specified time
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::SetTypeOfResponse(
+ const TInt aReqHandleType,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING3("TSY: CMmPhoneBookStoreTsy::SetTypeOfResponse - Handle:%d Type:%d", aTsyReqHandle, aReqHandleType );
+
+ TInt timeOut( 0 );
+
+ //example switch
+ switch ( aReqHandleType )
+ {
+ case EMultimodePhoneBookStoreRead:
+ timeOut = KMmPBStoreReadTimeOut;
+ break;
+ case EMultimodePhoneBookStoreWrite:
+ timeOut = KMmPBStoreWriteTimeOut;
+ break;
+ case EMultimodePhoneStoreDelete:
+ timeOut = KMmPBDeleteTimeOut;
+ break;
+ case EMultimodePhoneStoreDeleteAll:
+ timeOut = KMmPBDeleteAllTimeOut;
+ break;
+ case EMultimodePhoneStoreGetInfo:
+ timeOut = KMmPBGetInfoTimeOut;
+ break;
+
+ //Must not use timer:
+ // - all notifications
+ //case EMultimodePhoneStoreNotifyStoreEvent:
+
+ default:
+ //does not use timer
+ iTsyReqHandleStore->SetTsyReqHandle(
+ aReqHandleType,
+ aTsyReqHandle );
+ break;
+ }
+
+ if ( 0 < timeOut )
+ {
+ //the timeout parameter is given in seconds.
+ iTsyReqHandleStore->SetTsyReqHandle(
+ aReqHandleType,
+ aTsyReqHandle,
+ timeOut );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::Complete
+// Completes the request due timer expiration.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::Complete(
+ TInt aReqHandleType,
+ TInt aError )
+ {
+ // Catch possible leave. If leave happens, there is nothing we can do.
+ TRAP_IGNORE(
+ //All possible TSY req handle types are listed in the
+ //switch case below.
+ switch( aReqHandleType )
+ {
+ case EMultimodePhoneBookStoreRead:
+ CompleteReadL( aError, NULL );
+ break;
+ case EMultimodePhoneBookStoreWrite:
+ CompleteWriteL( aError, NULL );
+ break;
+ case EMultimodePhoneStoreDelete:
+ CompleteDeleteL( aError, NULL );
+ break;
+ case EMultimodePhoneStoreDeleteAll:
+ CompleteDeleteAll( aError, NULL );
+ break;
+ case EMultimodePhoneStoreGetInfo:
+ CompleteGetInfo( aError );
+ break;
+
+ //Can't use timer:
+ // - all notifications
+ //case EMultimodePhoneStoreNotifyStoreEvent:
+
+ default:
+ ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle(
+ aReqHandleType ), aError );
+ break;
+ }
+ ); // end trap
+ }
+
+#endif
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::ContinueReadL
+// Continues ReadL method
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::ContinueReadL()
+ {
+TFLOGSTRING("TSY: CMmPhoneBookStoreTsy::ContinueReadL ");
+
+ iRequestedOnPBRead = EFalse;
+ //Reguest Read with stored parameters
+ if( iReadReqStore )
+ {
+ ReadL(iReadReqStore->iReqHandle,iReadReqStore->iIndexAndEntries,
+ iReadReqStore->iPBData, ETrue ); // ETrue means that Read is a continued-read.
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::IsPBInitDone
+// Is PB initialization done.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmPhoneBookStoreTsy::IsPBInitDone()
+ {
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::IsPBInitDone: - PB %S", &iPhoneBookName);
+TFLOGSTRING2("TSY: CMmPhoneBookStoreTsy::IsPBInitDone: - PB iIsPBInitCompleted = %d ", iIsPBInitCompleted );
+
+ return iIsPBInitCompleted;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::GetPhonebookType
+// Return phonebook type.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TUint8 CMmPhoneBookStoreTsy::GetPhonebookType()
+ {
+TFLOGSTRING2( "TSY: CMmPhoneBookStoreTsy::GetPhonebookType - iPhoneBookType: %d", iPhoneBookType);
+ return iPhoneBookType;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPhoneBookStoreTsy::CopyLtsyCacheToCtsyCache
+// This method copies Ltsy Cache to Ctsy Cache
+// This is only done when NOT using the dispatcher as the Ltsy creates the array and destroys
+// the memory before CTSY is completely done with it. It now has to be copied over to CTSY domain
+// to make sure the Ltsy does not delete before Ctsy is finished. This is not the case using Ctsy Dispatcher
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPhoneBookStoreTsy::CopyLtsyCacheToCtsyCache( CArrayPtrSeg<CPhoneBookStoreEntry>* aEntryData )
+ {
+ if (iPBStoreCache!=NULL)
+ {
+ iPBStoreCache->ResetAndDestroy();
+ delete iPBStoreCache;
+ iPBStoreCache = NULL;
+ }
+ if (aEntryData->Count() > 0)
+ {
+ iPBStoreCache = new(ELeave) CArrayPtrSeg<CPhoneBookStoreEntry>(aEntryData->Count());
+
+ for(TInt count=0; count < (aEntryData)->Count(); count++)
+ {
+ CPhoneBookStoreEntry* phoneBookStoreEntry = new( ELeave )CPhoneBookStoreEntry();
+ CleanupStack::PushL( phoneBookStoreEntry );
+ phoneBookStoreEntry->ConstructL();
+
+ CPhoneBookStoreEntry* pbsePtr = (*aEntryData)[count];
+
+ phoneBookStoreEntry->iLocation = pbsePtr->iLocation;
+
+ if((pbsePtr->iText)!=NULL)
+ {
+ phoneBookStoreEntry->iText = HBufC16::NewL((pbsePtr->iText)->Size());
+ *(phoneBookStoreEntry->iText)=(*(pbsePtr->iText));
+ }
+
+ if((pbsePtr->iNumber)!=NULL)
+ {
+ phoneBookStoreEntry->iNumber = HBufC16::NewL((pbsePtr->iNumber)->Size());
+ *(phoneBookStoreEntry->iNumber)=(*(pbsePtr->iNumber));
+ }
+
+ if((pbsePtr->iEmail)!=NULL)
+ {
+ CDesC16Array* email = pbsePtr->iEmail;
+ for(TInt emailCount = 0; emailCount<(email->Count()); emailCount++)
+ {
+ (phoneBookStoreEntry->iEmail)->AppendL((*email)[emailCount]);
+ }
+ }
+
+ if((pbsePtr->iSne)!=NULL)
+ {
+ CDesC16Array* sne = pbsePtr->iSne;
+ for(TInt sneCount = 0; sneCount<(sne->Count()); sneCount++)
+ {
+ (phoneBookStoreEntry->iSne)->AppendL((*sne)[sneCount]);
+ }
+ }
+
+ if((pbsePtr->iAnr)!=NULL)
+ {
+ CDesC16Array* anr = pbsePtr->iAnr;
+ for(TInt anrCount = 0; anrCount<(anr->Count()); anrCount++)
+ {
+ (phoneBookStoreEntry->iAnr)->AppendL((*anr)[anrCount]);
+ }
+ }
+
+ iPBStoreCache->AppendL(phoneBookStoreEntry);
+ CleanupStack::Pop( phoneBookStoreEntry );
+ }
+ }
+ else
+ {
+ iPBStoreCache = new(ELeave) CArrayPtrSeg<CPhoneBookStoreEntry>(1);
+ }
+ }
+
+
+
+// End of File