--- a/telephonyserverplugins/common_tsy/commontsy/src/mmstorage/cmmonstoretsy.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmstorage/cmmonstoretsy.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,2073 +1,2073 @@
-// 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 "cmmonstoretsy.h"
-#include "cmmtsyreqhandlestore.h"
-#include "CMmPrivateUtility.h"
-#include "MmTsy_numberOfSlots.h"
-#include "MmTsy_timeoutdefs.h"
-#include "cmmmessagemanagerbase.h"
-#include "cmmpblist.h"
-#include "cmmphonebookstoretsy.h"
-#include <ctsy/pluginapi/cmmdatapackage.h>
-#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
-
-// ======== MEMBER FUNCTIONS ========
-
-CMmONStoreTsy::CMmONStoreTsy()
- {
- }
-
-void CMmONStoreTsy::ConstructL()
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::ConstructL");
-
-#ifdef REQHANDLE_TIMER
- // Create req handle store
- iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone,
- EMmTsyNumOfONStoreRequests, iStorageReqHandles );
-#else // REQHANDLE_TIMER
- // Create req handle store
- iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
- EMmTsyNumOfONStoreRequests, iStorageReqHandles );
-#endif // REQHANDLE_TIMER
-
- //get mode of current extension.
- RMobilePhone::TMobilePhoneNetworkMode currentMode;
- iMmPhone->GetStaticExtensionMode( ¤tMode );
-
- // Reset phonebooktype and servicetype
- ResetVariables();
-
- // Create GSM ONStore objects
- iMmONStoreGsmExt = static_cast<CMmONStoreExtInterface*>(
- CMmONStoreGsmExt::NewL( this ) );
- // Set mode GSM
- iMmONStoreExtInterface = iMmONStoreGsmExt;
-
-
- //if current mode is GSM
- if ( RMobilePhone::ENetworkModeGsm == currentMode )
- {
- // Set phonebook type and servicetype
- iPhoneBookType = KSimMsisdn; // MSISDN
- }
-
- // Construct ReadAllList
- iONStoreListArray = new (ELeave) CArrayFixFlat<TONStoreMsg>(1);
-
- // Construct ReadAllArray
- iONStoreReadAllArray = new (ELeave) CArrayPtrFlat<CListReadAllAttempt>(1);
-
- //register ON Store tsy in the message manager
- iMmPhone->MessageManager()->RegisterTsyObject(
- CMmMessageManagerBase::EONStoreTsy, this );
-
- // Reset info to fill with ini values
- SetInfo();
- }
-
-CMmONStoreTsy* CMmONStoreTsy::NewL(
- CMmPhoneTsy* aMmPhone )
- {
- CMmONStoreTsy* aMmONStoreTsy = new( ELeave ) CMmONStoreTsy();
- CleanupClosePushL( *aMmONStoreTsy );
-
- aMmONStoreTsy->iMmPhone = aMmPhone;
-
- aMmONStoreTsy->ConstructL();
- CleanupStack::Pop();
-
- return aMmONStoreTsy;
- }
-
-CMmONStoreTsy::~CMmONStoreTsy()
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::~CMmONStoreTsy");
-
- if (iMmPhone )
- {
- // deregister tsy object from message manager
- iMmPhone->MessageManager()->DeregisterTsyObject(this);
- }
-
- if ( NULL != iTsyReqHandleStore )
- {
- delete iTsyReqHandleStore;
- iTsyReqHandleStore = NULL;
- }
-
- // Delete ONStoreGsmExt
- delete iMmONStoreGsmExt;
- iMmONStoreGsmExt = NULL;
-
- // Delete TSY's internal ONStore list
- delete iONStoreListArray;
- iONStoreListArray = NULL;
-
- // Delete ONStoreReadAll array
- iONStoreReadAllArray->ResetAndDestroy();
- delete iONStoreReadAllArray;
- iONStoreReadAllArray = NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::Init
-// Initialisation method that is called from ETel Server.
-// This is an initialization method for the class functionality.
-// Generally initization method inits e.g. class attributes.
-// In this case, this method is not needed.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::Init()
- {
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::OpenNewObjectByNameL
-// This method opens extendable sub-sessions
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmONStoreTsy::OpenNewObjectByNameL(
- const TDesC& )
- {
- User::Leave( KErrNotSupported );
- //lint -e{527} "unreachable code"
-
- return NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::OpenNewObjectL
-// This method opens extendable sub-sessions
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmONStoreTsy::OpenNewObjectL(
- TDes& )
- {
- User::Leave( KErrNotSupported );
- //lint -e{527} "unreachable code"
-
- return NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::ReqModeL
-// To ask what type of flow control is used for the IPC number.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject::TReqMode CMmONStoreTsy::ReqModeL(
- const TInt aIpc )
- {
-TFLOGSTRING2("TSY: CMmONStoreTsy::ReqModeL IPC %d", aIpc);
- CTelObject::TReqMode ret=0;
- switch ( aIpc )
- {
- // Flow Controlled Services
- case EMobilePhoneStoreRead:
- case EMobilePhoneStoreWrite:
- case EMobilePhoneStoreDelete:
- case EMobilePhoneStoreDeleteAll:
- case EMobilePhoneStoreReadAllPhase1:
- case EMobilePhoneStoreReadAllPhase2:
- case EMobilePhoneStoreGetInfo:
- case EMobileONStoreStoreAll:
- ret=KReqModeFlowControlObeyed;
- break;
- // Multiple Completion Services with Immediate Server Repost
- // (Usually Notifications)
- case EMobilePhoneStoreNotifyStoreEvent:
- ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
- break;
- default:
- User::Leave(KErrNotSupported);
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::RegisterNotification
-// Enables the TSY to "turn on" any regular notification
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::RegisterNotification(
- const TInt aIpc )
- {
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- case EMobilePhoneStoreNotifyStoreEvent:
- // KErrNone
- break;
- default:
- // Unknown or invalid IPC
- ret = KErrNotSupported;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::DeregisterNotification
-// Enables the TSY to "turn off" any regular notification
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::DeregisterNotification(
- const TInt aIpc )
- {
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- case EMobilePhoneStoreNotifyStoreEvent:
- // KErrNone
- break;
- default:
- // Unknown or invalid IPC
- ret = KErrNotSupported;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::NumberOfSlotsL
-// To ask the TSY how big buffer it wants
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::NumberOfSlotsL(
- const TInt aIpc )
- {
- TInt numberOfSlots = 1;
-
- switch ( aIpc )
- {
- case EMobilePhoneStoreNotifyStoreEvent:
- numberOfSlots = KMmONStoreNotifyStoreEventSlots;
- break;
- default:
- // Unknown or invalid Phone IPC
- User::Leave( KErrNotSupported );
- break;
- }
-
- return numberOfSlots;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::ExtFunc
-// Handling of extended requests
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::ExtFunc(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aIpc,
- const TDataPackage& aPackage )
- {
-TFLOGSTRING3("TSY: CMmONStoreTsy::ExtFunc - IPC:%d Handle:%d", aIpc, aTsyReqHandle);
-
- TInt ret = KErrNone;
- TInt trapError = KErrNone;
-
- // Reset last tsy request type
- iReqHandleType = EMultimodeONStoreReqHandleUnknown;
-
- TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ); );
-
- if ( KErrNone != trapError )
- {
- ReqCompleted( aTsyReqHandle, trapError );
- }
- else if ( KErrNone != ret )
- {
- ReqCompleted( aTsyReqHandle, ret );
- }
-
- // Save request handle
- if ( EMultimodeONStoreReqHandleUnknown != iReqHandleType )
- {
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
-#else // REQHANDLE_TIMER
- iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::DoExtFuncL
-// Dispatches extension function requests
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::DoExtFuncL(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aIpc,
- const TDataPackage& aPackage )
- {
-TFLOGSTRING3("TSY: CMmONStoreTsy::DoExtFuncL - IPC:%d Handle:%d", aIpc, aTsyReqHandle);
-
- TAny* dataPtr=aPackage.Ptr1();
- TAny* dataPtr2=aPackage.Ptr2();
-
- // Create unique transaction id
-
- switch (aIpc)
- {
- case EMobilePhoneStoreRead:
- return ReadL( aPackage.Des1n() );
-
- case EMobilePhoneStoreWrite:
- return WriteL( aTsyReqHandle, aPackage.Des1n() );
-
- case EMobilePhoneStoreDelete:
- return DeleteL( aTsyReqHandle,
- REINTERPRET_CAST( TInt*, dataPtr ) );
-
- case EMobilePhoneStoreDeleteAll:
- return DeleteAllL( aTsyReqHandle );
-
- case EMobilePhoneStoreGetInfo:
- return GetInfoL( aTsyReqHandle,
- REINTERPRET_CAST( RMobileONStore::TMobileONStoreInfoV1*,
- dataPtr ) );
-
- case EMobilePhoneStoreReadAllPhase1:
- return ReadAllPhase1L( aTsyReqHandle,
- REINTERPRET_CAST( RMobilePhone::TClientId*, dataPtr ),
- REINTERPRET_CAST( TInt*, dataPtr2 ) );
-
- case EMobilePhoneStoreReadAllPhase2:
- return ReadAllPhase2( aTsyReqHandle,
- REINTERPRET_CAST( RMobilePhone::TClientId*, dataPtr ),
- aPackage.Des2n() );
-
- case EMobilePhoneStoreNotifyStoreEvent:
- return NotifyStoreEvent(
- REINTERPRET_CAST( RMobilePhoneStore::TMobileStoreEvent*,
- dataPtr ), REINTERPRET_CAST( TInt*, dataPtr2 ) );
-
- case EMobileONStoreStoreAll:
- return StoreAllL( aTsyReqHandle,aPackage.Des1n() );
-
- default:
- return KErrNotSupported;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CancelService
-// To cancel any extension requests
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::CancelService(
- const TInt aIpc,
- const TTsyReqHandle aTsyReqHandle )
- {
- switch ( aIpc )
- {
- case EMobilePhoneStoreGetInfo:
- return GetInfoCancel( aTsyReqHandle );
- case EMobilePhoneStoreRead:
- return ReadCancel( aTsyReqHandle );
- case EMobilePhoneStoreWrite:
- return WriteCancel( aTsyReqHandle );
- case EMobilePhoneStoreDelete:
- // There is no change to cancel this request, so only thing to do,
- // is let the request continue and return KErrNone.
- return KErrNone;
- case EMobilePhoneStoreDeleteAll:
- return DeleteAllCancel( aTsyReqHandle );
- case EMobilePhoneStoreReadAllPhase1:
- case EMobilePhoneStoreReadAllPhase2:
- return ReadAllCancel( aTsyReqHandle );
- case EMobilePhoneStoreNotifyStoreEvent:
- return NotifyStoreEventCancel( aTsyReqHandle );
- case EMobileONStoreStoreAll:
- return StoreAllCancel( aTsyReqHandle );
- default:
- return KErrGeneral;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::SetActiveONStoreExtension
-// Sets pointer to active extension
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::SetActiveONStoreExtension(
- CMmONStoreExtInterface* aMmONStoreExt )
- {
- TInt ret = KErrGeneral;
-
- if ( aMmONStoreExt )
- {
- iMmONStoreExtInterface = aMmONStoreExt;
- ret = KErrNone;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::Returns a pointer to the active extension
-// Sets pointer to active extension
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmONStoreExtInterface* CMmONStoreTsy::ActiveONExtension()
- {
- return iMmONStoreExtInterface;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::ReadL
-// Read one ON store entry using index
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::ReadL( TDes8* aEntry )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::ReadL");
- // Initialize ret value
- TInt ret( KErrArgument );
-
- if( sizeof( RMobileONStore::TMobileONEntryV1 ) <= aEntry->MaxLength() )
- {
-
- // Unpack entry parameter
- RMobileONStore::TMobileONEntryV1Pckg* entryPckg =
- REINTERPRET_CAST
- ( RMobileONStore::TMobileONEntryV1Pckg*, aEntry );
- RMobileONStore::TMobileONEntryV1& entry = ( *entryPckg )();
-
- // Check index
- if ( (-1) <= entry.iIndex )
- {
- // Forward request to GSM Extension
- ret = iMmONStoreExtInterface->ReadL( EMmTsyONStoreReadIPC, entry.iIndex );
- }
-
- if ( KErrNone == ret )
- {
- // Save entry pointer
- iReadONStoreEntryPtr = aEntry;
-
- // Save tsy req handle type
- iReqHandleType = EMultimodeONStoreRead;
- }
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteRead
-// Completes reading a entry from the ONStore
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::CompleteRead(
- TInt aResult,
- CMmDataPackage* aDataPackage )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteRead");
- // Response information
- TONStoreMsg* ONStoreResp = NULL;
- // unpack data if exists
- if ( aDataPackage )
- {
- //unpack data
- aDataPackage->UnPackData( ONStoreResp );
- }
- else if ( KErrNone == aResult )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteRead result is KErrNone and aDataPackage is NULL!");
- aResult = KErrArgument;
- }
-
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreRead );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
-
- if ( KErrNone == aResult )
- {
-
- // Get entry
- RMobileONStore::TMobileONEntryV1Pckg* entryPckg =
- REINTERPRET_CAST( RMobileONStore::TMobileONEntryV1Pckg*,
- iReadONStoreEntryPtr );
- RMobileONStore::TMobileONEntryV1& entry = ( *entryPckg )();
-
- // Fill entry
- // Map iIndex to client world (increase value by one)
- entry.iIndex = ONStoreResp->iLocation;
- entry.iText.Copy( ONStoreResp->iName );
- entry.iNumber.iTelNumber.Copy( ONStoreResp->iTelNumber );
-
- // SIM_PN_READ_RESP response
- entry.iMode = RMobilePhone::ENetworkModeUnknown;
- /*ENetworkModeUnknown,
- ENetworkModeUnregistered,
- ENetworkModeGsm,
- ENetworkModeAmps,
- ENetworkModeCdma,
- ENetworkModeWcdma
- */
- entry.iService = RMobilePhone::EServiceUnspecified;
- /*EServiceUnspecified,
- EVoiceService,
- EAuxVoiceService,
- ECircuitDataService,
- EPacketDataService,
- EFaxService,
- EShortMessageService,
- EAllServices
- */
-
- // Complete request to success
- ReqCompleted( reqHandle, KErrNone );
- }
- else
- {
- // Failure
- ReqCompleted( reqHandle, aResult );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::ReadCancel
-// Cancel read one ON store entry using index
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::ReadCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::ReadCancel");
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreRead );
-
- // Check that request handle was valid
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- // Complete with KErrCancel
- ReqCompleted( aTsyReqHandle, KErrCancel );
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::WriteL
-// Writes the entry supplied within the entry parameter into the store
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::WriteL(
- const TTsyReqHandle aTsyReqHandle,
- TDesC8* aEntry )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::WriteL");
-
- // Unpack entry param to get the location
- RMobileONStore::TMobileONEntryV1Pckg* entryPckg =
- REINTERPRET_CAST
- ( RMobileONStore::TMobileONEntryV1Pckg*, aEntry );
- RMobileONStore::TMobileONEntryV1& entry = ( *entryPckg )();
-
- // Return value
- TInt ret( KErrArgument );
-
- // Check Parameters
- if( (-1) > entry.iIndex || sizeof( RMobileONStore::TMobileONEntryV1 ) != aEntry->Size() )
- {
- return ret;
- }
-
- // Save tsy req handle type
- iReqHandleType = EMultimodeONStoreWrite;
-
- iWriteONStoreEntryPtr = aEntry;
- iWriteIndexToReturn = entry.iIndex;
-
- // It is not possible to cancel write request anymore...
- iIsWriteCancellingPossible = EFalse;
-
-
- ret = iMmONStoreExtInterface->
- WriteL(
- EMmTsyONStoreWriteIPC,
- aEntry );
-
- // Check error while processing write
- if ( KErrNone != ret )
- {
- iWriteIndexToReturn = 0;
- iWriteONStoreEntryPtr = NULL;
- ReqCompleted( aTsyReqHandle, ret );
- }
- else
- {
- // Save tsy req handle type
- iReqHandleType = EMultimodeONStoreWrite;
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteWrite
-// Completes writing a entry to the phonebookstore
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::CompleteWrite(
- TInt aResult,
- CMmDataPackage* aDataPackage )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteWrite");
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreWrite );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- if ( KErrNone == aResult )
- {
- TInt location = 0;
-
- if ( aDataPackage )
- {
- aDataPackage->UnPackData( location );
- }
-
- // Complete notify store event
- iMobileONStoreEvent = ( RMobilePhoneStore::KStoreEntryAdded );
-
- // Return index within entry.iIndex, if needed
- if ( -1 == iWriteIndexToReturn )
- {
- // Unpack entry param
- RMobileONStore::TMobileONEntryV1Pckg* entryPckg =
- ( RMobileONStore::TMobileONEntryV1Pckg*
- )iWriteONStoreEntryPtr;
- RMobileONStore::TMobileONEntryV1& entry = ( *entryPckg )();
-
- // Set the correct entry index
- entry.iIndex = location;
- }
-
- CompleteNotifyStoreEvent( location );
- }
-
- // Complete with error
- ReqCompleted( reqHandle, aResult );
- }
-
- iWriteIndexToReturn = 0;
- iWriteONStoreEntryPtr = NULL;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::WriteCancel
-// Cancels an outstanding Write method
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::WriteCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::WriteCancel");
- // Check if cancelling is possible. If not, return KErrNone
- if ( iIsWriteCancellingPossible )
- {
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreWrite );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- iWriteIndexToReturn = 0;
- iWriteONStoreEntryPtr = NULL;
- ReqCompleted( aTsyReqHandle, KErrCancel );
- }
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::DeleteL
-// Deletes one ON entry by index supplied as a parameter
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::DeleteL(
- const TTsyReqHandle aTsyReqHandle,
- TInt* aIndex )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::DeleteL");
- // Initialize ret value
- TInt ret( KErrGeneral );
-
- // Get index and decrease value (CS uses indexes '0' ->, SOS '1' ->)
- iDeleteONStoreIndex = *aIndex;
-
- // Check that entry index value is greater than zero
- if ( 0 < iDeleteONStoreIndex )
- {
- // Forward Delete request to gsm extension. Use Write function
- // to "erase" ON store entry
- ret = iMmONStoreExtInterface->DeleteL( EMmTsyONStoreDeleteIPC,
- iDeleteONStoreIndex );
- }
-
- // Message construction failed or phonet sender returned error
- if ( KErrNone != ret )
- {
- ReqCompleted( aTsyReqHandle, ret );
- }
- else
- {
- // Save tsy request handle type
- iReqHandleType = EMultimodeONStoreDelete;
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteDelete
-// Complete delete one ON entry by index
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::CompleteDelete(
- TInt aResult )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDelete");
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreDelete );
-
- // Check that request was valid
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- // Complete with CS return value
- ReqCompleted( reqHandle, aResult );
-
- // If deletetion done succesfully, complete notify store event
- if ( KErrNone == aResult )
- {
- // Complete notify store event
- iMobileONStoreEvent = ( RMobilePhoneStore::KStoreEntryDeleted );
- CompleteNotifyStoreEvent( iDeleteONStoreIndex );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::DeleteAllL
-// Delete all ON store entries
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::DeleteAllL (
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::DeleteAllL");
- // Init variable for DeleteAllPhase1
- iDeleteAllContinue = ETrue;
-
- // Forwarded extension call
- TInt ret = iMmONStoreExtInterface->DeleteAllL(
- EMmTsyONStoreDeleteAllIPC );
-
- // Check is return value valid
- if ( KErrNone != ret )
- {
- // Complete with error
- ReqCompleted( aTsyReqHandle, ret );
- }
- else
- {
- // Save TSY request handle type
- iReqHandleType = EMultimodeONStoreDeleteAll;
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteDeleteAllPhase1L
-// Complete delete all ON store entries phase 1
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::CompleteDeleteAllPhase1L(
- TInt aResult )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDeleteAllPhase1L");
- // Check that DeleteAll was called
- if ( iDeleteAllContinue )
- {
- if ( KErrNone == aResult )
- {
- // Empty variables in order to call Write-function
- TBuf<1> name;
- TBuf<1> telNumber;
-
-#ifdef REQHANDLE_TIMER
- // Set the new terminate time for deleting new entries from
- // ONStore. About 300ms/entry => about (15s)/(50entries) ->
- // x2 -> 30sec.
- iTsyReqHandleStore->PostponeTimeout( EMultimodeONStoreDeleteAll,
- 30 );
-#endif // REQHANDLE_TIMER
-
- // Forward Delete request to gsm extension. Use Write function
- // to start process to erase all ON store entries.
- // '0' means that first location will be deleted first
- }
- // If error from SIM Server
- else
- {
- CompleteDeleteAll( aResult );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteDeleteAll
-// Complete delete all ON store entries
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::CompleteDeleteAll(
- TInt aResult )
- {
- // Reset request handle. Returns the deleted request handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreDeleteAll );
-
- // Check that deleted request handle was valid
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDeleteAll");
- // Complete with error
- ReqCompleted( reqHandle, aResult );
-
- // If deletion done succesfully, complete notify store event
- // Notify will complete if it was requested
- if ( KErrNone == aResult )
- {
- // Set notify reason, whole ON store deleted. Store empty.
- iMobileONStoreEvent = ( RMobilePhoneStore::KStoreEmpty );
- // Complete notify store event, with '-1' due that more than one
- // entries deleted.
- CompleteNotifyStoreEvent( -1 );
- }
- }
- else if(EMultimodeONStoreReqHandleUnknown !=
- iTsyReqHandleStore->GetTsyReqHandle(EMultimodeONStoreStoreAll ))
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDeleteAll requested by StoreAllL.");
- TInt ret (aResult);
-
- if(KErrNone == ret)
- {
- // ON store is now empty. Let's begin with reading store size to actually store all entries.
- TInt writeAllIndex = -1; // Store index when writing all entries
- TRAPD(err, ret = iMmONStoreExtInterface->ReadL(
- EMmTsyONStoreWriteSizeIPC, writeAllIndex ));
- if(err != KErrNone)
- {
- ret = err;
- }
- }
- if(KErrNone != ret)
- {
- CompleteStoreAll( ret );
- }
- }
- else
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDeleteAll - the request has been cancelled or bad req handle");
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::DeleteAllCancel
-// This method cancels an outstanding DeleteAll -request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::DeleteAllCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::DeleteAllCancel");
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreDeleteAll );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- // Prevent DeleteAllPhase1
- iDeleteAllContinue = EFalse;
- // Complete with KErrCancel
- ReqCompleted( aTsyReqHandle, KErrCancel );
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::GetInfoL
-// This method returns information about the ONStore
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::GetInfoL(
- const TTsyReqHandle aTsyReqHandle,
- RMobileONStore::TMobileONStoreInfoV1* aInfo )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL");
-
- TInt ret( KErrNone );
-
- TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeONStoreGetInfo );
- if(reqHandle != EMultimodeONStoreReqHandleUnknown)
- {
- ReqCompleted( aTsyReqHandle, KErrServerBusy );
- return ret;
- }
- // if aInfo is not correct type, send KErrArgument to client and return
- if( RMobilePhoneStore::KETelMobileONStoreV1 != aInfo->ExtensionId() )
- {
- ReqCompleted( aTsyReqHandle, KErrArgument );
- return ret;
- }
-
- // Don't send request if pb init is still ongoing
- // instead create an ADN book store and wait for it to initilize
-
-TFLOGSTRING2( "TSY: CMmONStoreTsy::GetInfoL iPBList->GetNumberOfObjects() = %d", iMmPhone->PBList()->GetNumberOfObjects());
- CMmPhoneBookStoreTsy* pbStore = NULL;
- for( TInt i = 0; (i < iMmPhone->PBList()->GetNumberOfObjects()) && (NULL == pbStore) ; i++ )
- {
- pbStore = iMmPhone->PBList()->GetMmPBByIndex( i );
-TFLOGSTRING2( "TSY: CMmONStoreTsy::GetInfoL index = %d", i);
- if( (pbStore->GetPhonebookType() != KADNPhoneBook) && (pbStore->GetPhonebookType() != KFDNPhoneBook ) )
- {
- pbStore = NULL;
- }
- else
- {
-
-TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL - found ADN or FDN store");
- }
- }
- if(NULL == pbStore)
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL - no ADN nor FDN store- creating ADN");
- pbStore = CMmPhoneBookStoreTsy::NewL( iMmPhone, KETelIccAdnPhoneBook );
- TInt addPBSucceeded = iMmPhone->PBList()->AddObject( pbStore );
- if(addPBSucceeded != KErrNone)
- {
- delete pbStore;
- ReqCompleted( aTsyReqHandle, addPBSucceeded );
- return KErrNone;
- }
- }
-
- // Set get info internal pointer
- iONStoreInfoChanged = aInfo;
-
- if ( !pbStore->IsPBInitDone())
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL - waiting for phone book to be initilized");
- // Save tsy req handle type
- iReqHandleType = EMultimodeONStoreGetInfo;
- return KErrNone;
- }
-
-TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL - PBInit done, complete");
-
- // Request to GSM extension, get used entries,
- // -1 as a index param-> specified location param not needed
- ret = iMmONStoreExtInterface->ReadL(EMmTsyONStoreGetInfoIPC, -1);
-
- if (KErrNone != ret) // Message sending failed
- {
- ReqCompleted(aTsyReqHandle, ret);
- }
- else
- {
- // Save tsy req handle type
- iReqHandleType = EMultimodeONStoreGetInfo;
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteGetInfo
-// Completes GetInfo -request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::CompleteGetInfo(
- TInt aResult,
- CMmDataPackage* aDataPackage )
- {
-TFLOGSTRING2("TSY: CMmONStoreTsy::CompleteGetInfo - Result: %d", aResult );
-
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreGetInfo );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
-
- // If request was not cancelled or no error from SIM
- // give info to client
- if ( KErrNone == aResult )
- {
- // The number of used entries
- TServiceType serviceType;
- //unpack data
- aDataPackage->UnPackData( serviceType );
-
- iONStoreInfo.iTotalEntries = serviceType.iNumOfEntries;
- iONStoreInfo.iUsedEntries = serviceType.iUsedEntries;
- iONStoreInfo.iNumberLen = serviceType.iNumLen;
- iONStoreInfo.iTextLen = serviceType.iNameLen;
-
- *iONStoreInfoChanged = iONStoreInfo;
-
-TFLOGSTRING3("TSY: CMmONStoreTsy::CompleteGetInfo - Name: %S, Type: %d", &iONStoreInfoChanged->iName, iONStoreInfoChanged->iType );
-TFLOGSTRING3("TSY: CMmONStoreTsy::CompleteGetInfo - Total entries: %d, Used entries: %d", iONStoreInfoChanged->iTotalEntries, iONStoreInfoChanged->iUsedEntries );
-TFLOGSTRING3("TSY: CMmONStoreTsy::CompleteGetInfo - Max Number length: %d, Max Name length: %d", iONStoreInfoChanged->iNumberLen, iONStoreInfoChanged->iTextLen );
- }
-
- // NULL the pointer to info supplied to TSY from the client
- iONStoreInfoChanged = NULL;
-
- // Complete with error
- ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::SetInfo
-// This method initializes ONStore internal info parameters
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::SetInfo()
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::SetInfo");
- // The name of the store
- iONStoreInfo.iName = KETelOwnNumberStore;
-
- // The maximum number of characters for the number in a phonebook entry
- iONStoreInfo.iNumberLen = KNoInfoAvail;
-
- // The maximum number of characters for the text tag in a phonebook entry
- iONStoreInfo.iTextLen = KMaxTextLength;
-
- // The type of entry in the phone-side store
- iONStoreInfo.iType = RMobilePhoneStore::EOwnNumberStore;
-
- // Indicates the capabilities of the store
- iONStoreInfo.iCaps = KONStoreCaps;
-
- // Indicates the current number of entries that may be held in this store
- iONStoreInfo.iUsedEntries = KNoInfoAvail;
-
- // Indicates the total numbetr of entries
- iONStoreInfo.iTotalEntries = KNoInfoAvail;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::GetInfoCancel
-// This method cancels an outstanding GetInfo -request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::GetInfoCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoCancel");
-
- iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeONStoreGetInfo );
-
- // Complete with KErrCancel
- ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::NotifyStoreEvent
-// This method activates notifying of ONStore events
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::NotifyStoreEvent(
- RMobilePhoneStore::TMobileStoreEvent* aEvent,
- TInt* aIndex )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::NotifyStoreEvent");
- TTsyReqHandle requestHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeONStoreNotifyStoreEvent );
-
- // If request is not running
- if ( 0 == requestHandle )
- {
- // Set variables to notify
- iNotifyONStoreEventPtr = aEvent;
- iNotifyONStoreEventIndexPtr = aIndex;
-
- // Save tsy req handle type
- iReqHandleType = EMultimodeONStoreNotifyStoreEvent;
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteNotifyStoreEvent
-// This method is called when some of ONStore event happens
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::CompleteNotifyStoreEvent(
- TInt aLocation )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteNotifyStoreEvent");
- // Reset request handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreNotifyStoreEvent );
-
- // If request handle is valid
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- RMobilePhoneStore::TMobileStoreEvent* ONStoreEvent =
- REINTERPRET_CAST( RMobilePhoneStore::TMobileStoreEvent*,
- iNotifyONStoreEventPtr );
-
- // Fill notify information
- *ONStoreEvent = iMobileONStoreEvent;
- *iNotifyONStoreEventIndexPtr = aLocation;
-
- ReqCompleted( reqHandle, KErrNone );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::NotifyStoreEventCancel
-// This method cancels an outstanding NotifyStoreEvent -request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::NotifyStoreEventCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::NotifyStoreEventCancel");
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreNotifyStoreEvent );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- // Reset variables and complete with KErrCancel
- iNotifyONStoreEventPtr = NULL;
- iNotifyONStoreEventIndexPtr = NULL;
- ReqCompleted( aTsyReqHandle, KErrCancel );
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::ReadAllPhase1L
-// This method starts the two-phased ReadAll -request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::ReadAllPhase1L(
- const TTsyReqHandle aReqHandle,
- const RMobilePhone::TClientId* aId,
- TInt* aBufSize )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::ReadAllPhase1L");
- // Init return value
- TInt ret( KErrNone );
-
- // Store index when reading all entries
- TInt readAllIndex = -1;
-
- iReadAllBufSizePtr = aBufSize;
- iReadAllId = *aId;
-
- iReadAllONStoreIndex = 0;
- ret = iMmONStoreExtInterface->
- ReadL( EMmTsyONStoreReadSizeIPC, readAllIndex );
-
- // Increase PhoneBookStoreIndex by 1.
- iReadAllONStoreIndex++;
-
- // Unsuccess request for read entry
- if ( KErrNone != ret )
- {
- // Complete with error from Phonet Sender
- ReqCompleted( aReqHandle, ret );
- }
- else
- {
- // Save tsy req handle type
- iReqHandleType = EMultimodeONStoreReadAll;
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::InternalRetrieveONListReadSizeL
-// This method is part of ReadAll -request, purposed to get
-// the ONStore size and continue request with reading the whole ONStore
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::InternalRetrieveONListReadSizeL(
- TInt aError,
- CMmDataPackage* aDataPackage )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::InternalRetrieveONListReadSizeL");
- if ( KErrNone == aError )
- {
- TInt size;
- aDataPackage->UnPackData( size );
-TFLOGSTRING2("TSY: CMmONStoreTsy::InternalRetrieveONListReadSizeL size=%d",size);
- if( 0 < size )
- {
- *iReadAllBufSizePtr = size;
- iReadAllONStoreSize = size;
- MakeInternalRetrieveONListReadReqL();
- }
- else
- {
-TFLOGSTRING2("TSY: CMmONStoreTsy::InternalRetrieveONListReadSizeL size is %d", size);
- CompleteReadAllPhase1Req( KErrNotFound );
- }
- }
- else
- {
- CompleteReadAllPhase1Req( aError );
- }
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::MakeInternalRetrieveONListReadReqL
-// This method is part of ReadAll -request, purposed to read
-// entries from ONStore and handle the ONStoreTSY's internal read all -index.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::MakeInternalRetrieveONListReadReqL()
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::MakeInternalRetrieveONListReadReqL");
- // Read one entry from the PhoneBook.
- TInt ret = iMmONStoreExtInterface->
- ReadL( EMmTsyONStoreReadEntryIPC,iReadAllONStoreIndex );
-
- // Increase PhoneBookStoreIndex by 1.
- iReadAllONStoreIndex++;
-
- // Unsuccess request for read entry
- if ( KErrNone != ret )
- {
- // Complete with error from Phonet Sender
- CompleteReadAllPhase1Req( ret );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::InternalRetrieveONListReadEntryL
-// This method is part of ReadAll -request, purposed to get the read response
-// and complete ReadAllPhase1 -request, if all the entries have been read.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::InternalRetrieveONListReadEntryL(
- TInt aError,
- CMmDataPackage* aDataPackage)
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::InternalRetrieveONListReadEntryL");
- if ( KErrNone == aError )
- {
- // Check if there is data to save
- if ( aDataPackage )
- {
- TONStoreMsg onStoreMsg;
- aDataPackage->UnPackData( onStoreMsg );
- // Add entry to the TSY's internal storage array
- iONStoreListArray->AppendL( onStoreMsg );
- }
- // Check if all entries read, complete if so
- if ( iReadAllONStoreIndex > iReadAllONStoreSize )
- {
- TInt leaveCode( KErrNone );
-
- TRAP( leaveCode, CompleteReadAllPhase1L(); );
- // Memory allocation failed
- // TRAP is used here, because if memory allocation
- // failed, list array elements must be destroyed
- if ( leaveCode != KErrNone )
- {
- DeleteONStoreListArrayElements();
- CompleteReadAllPhase1Req( leaveCode );
- }
- }
- // There is more entries to read
- else
- {
- MakeInternalRetrieveONListReadReqL();
- }
- }
- else
- {
- CompleteReadAllPhase1Req( aError );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteReadAllPhase1L
-// Completes internal retrieving entries from the ONStore
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::CompleteReadAllPhase1L()
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteReadAllPhase1L");
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeONStoreReadAll );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- // Check that ONStoreList array contains ONStore entries
- if( 0 < iONStoreListArray->Count() )
- {
- // read the list, store its content and then return size of this
- // buffer to client
- CMobilePhoneONList* list = CMobilePhoneONList::NewL();
- CleanupStack::PushL( list );
-
- RMobileONStore::TMobileONEntryV1 entry;
-
- // Loop until TSY's internal ONStorage is empty
- while( !iONStoreListArray->Count() == 0 )
- {
- TONStoreMsg& ONStoreMsg = iONStoreListArray->At(0);
-
- // Fill TMobileONEntryV1 information
- entry.iMode = RMobilePhone::ENetworkModeUnknown;
- entry.iService = RMobilePhone::EServiceUnspecified;
- entry.iIndex = ( ONStoreMsg.iLocation );
- // from SIM
- entry.iNumber.iTypeOfNumber = RMobilePhone::EUnknownNumber;
- entry.iNumber.iNumberPlan =
- RMobilePhone::EUnknownNumberingPlan;
- entry.iNumber.iTelNumber.Copy( ONStoreMsg.iTelNumber );
- entry.iText.Copy( ONStoreMsg.iName );
-
- // Add to PhoneBook list
- list->AddEntryL( entry );
-
- // Delete list member
- iONStoreListArray->Delete(0);
- iONStoreListArray->Compress();
- }
-
- // Store the streamed list and the client ID
- CListReadAllAttempt* read = CListReadAllAttempt::NewL(
- &iReadAllId );
- CleanupStack::PushL( read );
-
- read->iListBuf = list->StoreLC();
- CleanupStack::Pop(); // Pop the CBufFlat allocated by StoreLC
-
- iONStoreReadAllArray->AppendL( read );
- CleanupStack::Pop(); // Pop the CListReadAllAttempt
-
- // Return the CBufFlat’s size to client
- *iReadAllBufSizePtr = ( read->iListBuf )->Size();
-
- // Complete first phase of list retrieval
- CompleteReadAllPhase1Req( KErrNone );
- CleanupStack::PopAndDestroy(); // Pop&destroy list
-
- return KErrNone;
- }
- else // Store was empty
- {
- CompleteReadAllPhase1Req( KErrNotFound );
- }
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteReadAllPhase1Req
-// Completes ReadAll phase1 -request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::CompleteReadAllPhase1Req(
- TInt aResult )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::CompleteReadAllPhase1Req");
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreReadAll );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- // If this request is completed with error,
- // delete ReadAll -arrays
- if ( KErrNone != aResult )
- {
- // Delete ONStore array
- iONStoreReadAllArray->ResetAndDestroy();
- // Delete ONStoreList array
- DeleteONStoreListArrayElements();
- }
-
- ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::DeleteONStoreListArrayElements
-// Deletes ONStore elements that are stored to an array
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::DeleteONStoreListArrayElements()
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::DeleteONStoreListArrayElements");
- while( 0 == !iONStoreListArray->Count() )
- {
- // Delete list member
- iONStoreListArray->Delete(0);
- iONStoreListArray->Compress();
- }
-
- // Delete pointers to elements from array
- iONStoreListArray->Reset();
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::ReadAllPhase2
-// Read all ONStore entries, second phase
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::ReadAllPhase2(
- TTsyReqHandle aTsyReqHandle,
- const RMobilePhone::TClientId* aId,
- TDes8* aBuffer )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::ReadAllPhase2");
- // Initialize ret value
- TInt ret( KErrCorrupt );
-
- // Set read pointer to NULL
- CListReadAllAttempt* read = NULL;
-
- // Find the read attempt from this client
- for ( TInt i=0; ( i<iONStoreReadAllArray->Count() ) &&
- ( KErrCorrupt == ret ); ++i )
- {
- // Get and set item from array
- // This is not deleted later on within this function if session
- // handle and subsession handle does not match.
- // Someone else 'owns' this data.
- read = iONStoreReadAllArray->At( i );
-
- // Check that session and client are rigth ones
- if ( ( read->iClient.iSessionHandle == aId->iSessionHandle ) &&
- ( read->iClient.iSubSessionHandle == aId->iSubSessionHandle ) )
- {
- // Set pointer to list buffer
- TPtr8 bufPtr( ( read->iListBuf )->Ptr( 0 ) );
- // Copy the streamed list to the client
- aBuffer->Copy( bufPtr );
-
- // Delete read and item from internal array
- delete read;
- iONStoreReadAllArray->Delete( i );
-
- // Complete request
- ReqCompleted( aTsyReqHandle, KErrNone );
- // Set ret to KErrNone so that loop can exit
- ret = KErrNone;
- }
- }
-
- // Check ret value
- if ( KErrCorrupt == ret )
- {
- // Doesn't found the matching client from read all phase 1
- iONStoreReadAllArray->ResetAndDestroy();
- ReqCompleted( aTsyReqHandle, KErrCorrupt);
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::ReadAllCancel
-// Cancels an outstanding ReadAll -request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::ReadAllCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::ReadAllCancel");
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreReadAll );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- // Delete ONStore array
- iONStoreReadAllArray->ResetAndDestroy();
- // Delete ONStoreList elements
- DeleteONStoreListArrayElements();
- // Complete with KErrCancel
- ReqCompleted( aTsyReqHandle, KErrCancel );
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::StoreAllL
-// This method stores the whole ONStore in one go
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::StoreAllL(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* aBuffer )
- {
-TFLOGSTRING("TSY: CMmONStoreTsy::StoreAllL");
- // Init return value
- TInt ret( KErrNone );
-
- // Set pointer to descrptor
- iStoreAllBuffer = aBuffer;
-
- // Create ONList and push it to cleanup stack
- CMobilePhoneONList* aONList=CMobilePhoneONList::NewL();
- CleanupStack::PushL(aONList);
- aONList->RestoreL(*aBuffer);
-
- // Get the size of ONList
- // Note: If this list does not contain any data, all the entries
- // will be deleted from ONStore!!
- iStoreAllONListSize = aONList->Enumerate();
-
- // StoreAll overwrites ON phone store. So, first delete all store.
- ret = iMmONStoreExtInterface->DeleteAllL(
- EMmTsyONStoreDeleteAllIPC );
-TFLOGSTRING2("CMmONStoreTsy::StoreAllL - DeleteAllL() ret: %d", ret);
-
- // Message construction failed or phonet sender returned error
- if ( KErrNone != ret )
- {
- ReqCompleted( aTsyReqHandle, ret );
- }
- else
- {
- // Save tsy req handle type
- iReqHandleType = EMultimodeONStoreStoreAll;
- }
-
- CleanupStack::PopAndDestroy(); // aONList
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::InternalStoreAllGetSizeL
-// This method is part of StoreAll -request, purposed to get
-// the ONStore size and continue request with writing the whole ONStore
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::InternalStoreAllGetSizeL(
- TInt aError,
- CMmDataPackage* aDataPackage )
- {
-TFLOGSTRING2("CMmONStoreTsy::InternalStoreAllGetSizeL %d",aError);
- if ( KErrNone == aError )
- {
- TInt size;
- aDataPackage->UnPackData( size );
-
-TFLOGSTRING2("CMmONStoreTsy::InternalStoreAllGetSizeL size %d", size);
- // Check the size of ONStore and the ONList size from Client
- // Client's ONList size should not be greater than ONStore size
- if ( size > 0 && size >= iStoreAllONListSize )
- {
- TTsyReqHandle storeAllRequestHandle =
- iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeONStoreStoreAll );
- // Check if request has been cancelled or bad req. handle
- if ( EMultimodeONStoreReqHandleUnknown != storeAllRequestHandle )
- {
- // Ok, set the class attribute iReadAllPhoneBookStoreIndex
- // with the size of the ONStore
- iStoreAllONStoreSize =
- size;
- iStoreAllONStoreIndex = 0;
- MakeInternalStoreAllWriteReqL();
- }
- }
- // Error occurs, when the size of the ONStore is not > 0
- // or ONList size is greater that ONStore
- else
- {
- CompleteStoreAll( KErrTooBig );
- }
- }
- // Error from SIM Server
- else
- {
- CompleteStoreAll( aError );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::MakeInternalStoreAllWriteReqL
-// This method is part of StoreAll -request, purposed to make
-// a write request by storeall index and an entry from ONList
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::MakeInternalStoreAllWriteReqL()
- {
-TFLOGSTRING("CMmONStoreTsy::MakeInternalStoreAllWriteReqL ");
- // Create ONList and push it to cleanup stack
- CMobilePhoneONList* aONList=CMobilePhoneONList::NewL();
- CleanupStack::PushL(aONList);
-
- // Check the existance of buffered ONlist
- if ( iStoreAllBuffer )
- {
- aONList->RestoreL(*iStoreAllBuffer);
-
- // Initialize ONStore entry
- RMobileONStore::TMobileONEntryV1 entry;
- TInt ret( KErrNone );
-
- // Loop until all entriest written
- if( iStoreAllONStoreIndex < iStoreAllONStoreSize )
- {
- // Get entry from ONList from clinet, if list contains
- // entries
- if ( iStoreAllONStoreIndex < iStoreAllONListSize )
- {
- // Get entry from ONStore list
- entry = aONList->GetEntryL( iStoreAllONStoreIndex );
- }
- // List does not contain entries anymore!!
- // Destroy rest of the entries by overwriting Nam&Num with zero
- else
- {
- entry.iText.Zero();
- entry.iNumber.iTelNumber.Zero();
- }
-
-#ifdef REQHANDLE_TIMER
- // Set 10 sec. terminate time for writing a new entry
- iTsyReqHandleStore->PostponeTimeout(
- EMultimodeONStoreStoreAll, 10 );
-#endif // REQHANDLE_TIMER
- CMmDataPackage dataPckg;
- dataPckg.PackData( &entry );
- // Forward request to GSM Extension
- ret = iMmONStoreExtInterface->WriteAllL(
- EMmTsyONStoreWriteEntryIPC, &dataPckg );
-
- if ( KErrNone != ret )
- {
- CompleteStoreAll( ret );
- }
- iStoreAllONStoreIndex++;
- }
- // All entries written; complete with KErrNone
- else
- {
- CompleteStoreAll( KErrNone );
- }
- }
- // List not found
- else
- {
- CompleteStoreAll( KErrCorrupt );
- }
-
- CleanupStack::PopAndDestroy(); // aONList
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::InternalStoreAllWriteEntryL
-// This function is part of StoreAll -request purposed to get
-// the error value from write one ONStore entry -request. This method
-// continues StoreAll -request if the error is KErrNone supplied as
-// a parameter.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::InternalStoreAllWriteEntryL(
- TInt aResult )
- {
-TFLOGSTRING2("CMmONStoreTsy::InternalStoreAllWriteEntryL %d",aResult);
-
- TTsyReqHandle storeAllRequestHandle =
- iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodeONStoreStoreAll );
-
- if ( EMultimodeONStoreReqHandleUnknown == storeAllRequestHandle )
- {
- // The request has been cancelled or bad req handle
-TFLOGSTRING("The ON store request has been cancelled or bad req handle");
- return;
- }
-
- if ( KErrNone == aResult )
- {
- MakeInternalStoreAllWriteReqL();
- }
- // Error from SIM Server, complete with an error
- else
- {
- CompleteStoreAll( aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::CompleteStoreAll
-// This method completes StoreAll -request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::CompleteStoreAll(
- TInt aResult )
- {
-TFLOGSTRING2("CMmONStoreTsy::CompleteStoreAll %d",aResult);
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreStoreAll );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
-
- if ( KErrNone == aResult )
- {
- // Set notify reason, whole ON store stored. Do refresh.
- iMobileONStoreEvent = ( RMobilePhoneStore::KStoreDoRefresh );
-
- // Complete notify store event, with '-1' due that whole
- // store has been changed
- CompleteNotifyStoreEvent( -1 );
- }
-
- // Reset class attributes
- iStoreAllBuffer = NULL;
- iStoreAllONStoreSize = 0;
- iStoreAllONStoreIndex = 0;
- iStoreAllONListSize = 0;
-
- // Complete request
- ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::StoreAllCancel
-// This method cancels an outstanding StoreAll -request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmONStoreTsy::StoreAllCancel(
- TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("CMmONStoreTsy::StoreAllCancel");
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeONStoreStoreAll );
-
- if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- // Reset class attributes
- iStoreAllBuffer = NULL;
- iStoreAllONStoreSize = 0;
- iStoreAllONStoreIndex = 0;
- iStoreAllONListSize = 0;
-
- // Complete with KErrCancel
- ReqCompleted( aTsyReqHandle, KErrCancel );
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::ResetVariables
-// Reset all used variables
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::ResetVariables()
- {
- iPhoneBookType = KSimNoServiceType;
- iServiceType.iNumOfEntries = KNoInfoAvail;
- iServiceType.iNameLen = KNoInfoAvail;
- iServiceType.iNumLen = KNoInfoAvail;
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::Phone
-// Returns CMmPhoneTsy object
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmPhoneTsy* CMmONStoreTsy::Phone()
- {
- return iMmPhone;
- }
-
-#ifdef TF_LOGGING_ENABLED
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::ReqCompleted
-// Overrides CTelObject::ReqCompleted for test logging purposes.
-// It prints the aTsyReqHandle and aError variable in the log file and then
-// calls CTelObject::ReqCompleted.
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::ReqCompleted(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aError )
- {
-TFLOGSTRING3("TSY: CMmONStoreTsy::ReqCompleted Completed - Handle:%d Error:%d", aTsyReqHandle, aError);
-
- CTelObject::ReqCompleted( aTsyReqHandle, aError );
- }
-
-#endif // TF_LOGGING_ENABLED
-
-#ifdef REQHANDLE_TIMER
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::SetTypeOfResponse
-// Sets the type of response for a given Handle
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::SetTypeOfResponse(
- const TInt aReqHandleType,
- const TTsyReqHandle aTsyReqHandle )
- {
- TInt timeOut( 0 );
-
- //example switch
- switch ( aReqHandleType )
- {
-
- case EMultimodeONStoreRead:
- timeOut = KMmONStoreReadTimeOut;
- break;
- case EMultimodeONStoreWrite:
- // Set time for writing first empty location
- if ( iIsWriteCancellingPossible )
- {
- timeOut = KMmONStoreWriteToFirstEmptyLocTimeOut;
- }
- // Set time for normal write request
- else
- {
- timeOut = KMmONStoreWriteTimeOut;
- }
- break;
- case EMultimodeONStoreDelete:
- timeOut = KMmONDeleteTimeOut;
- break;
- case EMultimodeONStoreDeleteAll:
- timeOut = KMmONDeleteAllTimeOut;
- break;
- case EMultimodeONStoreGetInfo:
- timeOut = KMmONGetInfoTimeOut;
- break;
- case EMultimodeONStoreReadAll:
- case EMultimodeONStoreStoreAll:
- timeOut = KMmONStoreAllTimeOut;
- break;
-
- //Must not use timer:
- // - all notifications
- //case EMultimodePhoneStoreNotifyStoreEvent:
- // - 2nd phase methods (when two phase lists are used)
- //case EMultimodeONStoreReadAll:
-
- 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 );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::Complete
-// Completes the request due timer expiration
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::Complete(
- TInt aReqHandleType,
- TInt aError )
- {
-TFLOGSTRING3( "TSY: CMmONStoreTsy::Complete - ReqHandleType: %d Error: %d", aReqHandleType, aError );
- //All possible TSY req handle types are listed in the
- //switch case below.
- switch( aReqHandleType )
- {
- case EMultimodeONStoreRead:
- CompleteRead( aError, NULL );
- break;
- case EMultimodeONStoreWrite:
- CompleteWrite( aError, NULL );
- break;
- case EMultimodeONStoreDelete:
- CompleteDelete( aError );
- break;
- case EMultimodeONStoreDeleteAll:
- CompleteDeleteAll( aError );
- break;
- case EMultimodeONStoreGetInfo:
- CompleteGetInfo( aError, 0 );
- break;
- case EMultimodeONStoreStoreAll:
- CompleteStoreAll( aError );
- break;
-
- //Can't use timer:
- // - all notifications
- //case EMultimodeONStoreNotifyStoreEvent:
- // - 2nd phase methods (when two phase lists are used)
- //case EMultimodeONStoreReadAll:
-
- default:
- ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle(
- aReqHandleType ), aError );
- break;
- }
- }
-
-#endif
-
-// ---------------------------------------------------------------------------
-// CMmONStoreTsy::PhoneBookStoreInitCompleteL
-// Phone book store initilization was complete
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmONStoreTsy::PhoneBookStoreInitCompleteL(TInt aError)
- {
- TFLOGSTRING("TSY: CMmONStoreTsy::PhoneBookStoreInitCompleteL ");
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeONStoreGetInfo );
- if( EMultimodeONStoreReqHandleUnknown != reqHandle )
- {
- if( KErrNone != aError )
- {
-
- ReqCompleted(reqHandle, aError);
- return;
- }
- iReqHandleType = EMultimodeONStoreReqHandleUnknown;
- TInt ret = GetInfoL(reqHandle, iONStoreInfoChanged);
- if (ret == KErrNone)
- {
- if (iReqHandleType != EMultimodeONStoreReqHandleUnknown)
- {
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse(iReqHandleType, reqHandle);
-#else // REQHANDLE_TIMER
- iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, reqHandle );
-#endif // REQHANDLE_TIMER
- }
- }
- else
- {
- ReqCompleted(reqHandle, ret);
- }
- }
-
- }
-
-// End of File
+// 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 "cmmonstoretsy.h"
+#include "cmmtsyreqhandlestore.h"
+#include "CMmPrivateUtility.h"
+#include "MmTsy_numberOfSlots.h"
+#include "MmTsy_timeoutdefs.h"
+#include "cmmmessagemanagerbase.h"
+#include "cmmpblist.h"
+#include "cmmphonebookstoretsy.h"
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmONStoreTsy::CMmONStoreTsy()
+ {
+ }
+
+void CMmONStoreTsy::ConstructL()
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::ConstructL");
+
+#ifdef REQHANDLE_TIMER
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this, iMmPhone,
+ EMmTsyNumOfONStoreRequests, iStorageReqHandles );
+#else // REQHANDLE_TIMER
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
+ EMmTsyNumOfONStoreRequests, iStorageReqHandles );
+#endif // REQHANDLE_TIMER
+
+ //get mode of current extension.
+ RMobilePhone::TMobilePhoneNetworkMode currentMode;
+ iMmPhone->GetStaticExtensionMode( ¤tMode );
+
+ // Reset phonebooktype and servicetype
+ ResetVariables();
+
+ // Create GSM ONStore objects
+ iMmONStoreGsmExt = static_cast<CMmONStoreExtInterface*>(
+ CMmONStoreGsmExt::NewL( this ) );
+ // Set mode GSM
+ iMmONStoreExtInterface = iMmONStoreGsmExt;
+
+
+ //if current mode is GSM
+ if ( RMobilePhone::ENetworkModeGsm == currentMode )
+ {
+ // Set phonebook type and servicetype
+ iPhoneBookType = KSimMsisdn; // MSISDN
+ }
+
+ // Construct ReadAllList
+ iONStoreListArray = new (ELeave) CArrayFixFlat<TONStoreMsg>(1);
+
+ // Construct ReadAllArray
+ iONStoreReadAllArray = new (ELeave) CArrayPtrFlat<CListReadAllAttempt>(1);
+
+ //register ON Store tsy in the message manager
+ iMmPhone->MessageManager()->RegisterTsyObject(
+ CMmMessageManagerBase::EONStoreTsy, this );
+
+ // Reset info to fill with ini values
+ SetInfo();
+ }
+
+CMmONStoreTsy* CMmONStoreTsy::NewL(
+ CMmPhoneTsy* aMmPhone )
+ {
+ CMmONStoreTsy* aMmONStoreTsy = new( ELeave ) CMmONStoreTsy();
+ CleanupClosePushL( *aMmONStoreTsy );
+
+ aMmONStoreTsy->iMmPhone = aMmPhone;
+
+ aMmONStoreTsy->ConstructL();
+ CleanupStack::Pop();
+
+ return aMmONStoreTsy;
+ }
+
+CMmONStoreTsy::~CMmONStoreTsy()
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::~CMmONStoreTsy");
+
+ if (iMmPhone )
+ {
+ // deregister tsy object from message manager
+ iMmPhone->MessageManager()->DeregisterTsyObject(this);
+ }
+
+ if ( NULL != iTsyReqHandleStore )
+ {
+ delete iTsyReqHandleStore;
+ iTsyReqHandleStore = NULL;
+ }
+
+ // Delete ONStoreGsmExt
+ delete iMmONStoreGsmExt;
+ iMmONStoreGsmExt = NULL;
+
+ // Delete TSY's internal ONStore list
+ delete iONStoreListArray;
+ iONStoreListArray = NULL;
+
+ // Delete ONStoreReadAll array
+ iONStoreReadAllArray->ResetAndDestroy();
+ delete iONStoreReadAllArray;
+ iONStoreReadAllArray = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::Init
+// Initialisation method that is called from ETel Server.
+// This is an initialization method for the class functionality.
+// Generally initization method inits e.g. class attributes.
+// In this case, this method is not needed.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::Init()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::OpenNewObjectByNameL
+// This method opens extendable sub-sessions
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmONStoreTsy::OpenNewObjectByNameL(
+ const TDesC& )
+ {
+ User::Leave( KErrNotSupported );
+ //lint -e{527} "unreachable code"
+
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::OpenNewObjectL
+// This method opens extendable sub-sessions
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmONStoreTsy::OpenNewObjectL(
+ TDes& )
+ {
+ User::Leave( KErrNotSupported );
+ //lint -e{527} "unreachable code"
+
+ return NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::ReqModeL
+// To ask what type of flow control is used for the IPC number.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmONStoreTsy::ReqModeL(
+ const TInt aIpc )
+ {
+TFLOGSTRING2("TSY: CMmONStoreTsy::ReqModeL IPC %d", aIpc);
+ CTelObject::TReqMode ret=0;
+ switch ( aIpc )
+ {
+ // Flow Controlled Services
+ case EMobilePhoneStoreRead:
+ case EMobilePhoneStoreWrite:
+ case EMobilePhoneStoreDelete:
+ case EMobilePhoneStoreDeleteAll:
+ case EMobilePhoneStoreReadAllPhase1:
+ case EMobilePhoneStoreReadAllPhase2:
+ case EMobilePhoneStoreGetInfo:
+ case EMobileONStoreStoreAll:
+ ret=KReqModeFlowControlObeyed;
+ break;
+ // Multiple Completion Services with Immediate Server Repost
+ // (Usually Notifications)
+ case EMobilePhoneStoreNotifyStoreEvent:
+ ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+ break;
+ default:
+ User::Leave(KErrNotSupported);
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::RegisterNotification
+// Enables the TSY to "turn on" any regular notification
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::RegisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreNotifyStoreEvent:
+ // KErrNone
+ break;
+ default:
+ // Unknown or invalid IPC
+ ret = KErrNotSupported;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::DeregisterNotification
+// Enables the TSY to "turn off" any regular notification
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::DeregisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreNotifyStoreEvent:
+ // KErrNone
+ break;
+ default:
+ // Unknown or invalid IPC
+ ret = KErrNotSupported;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::NumberOfSlotsL
+// To ask the TSY how big buffer it wants
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::NumberOfSlotsL(
+ const TInt aIpc )
+ {
+ TInt numberOfSlots = 1;
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreNotifyStoreEvent:
+ numberOfSlots = KMmONStoreNotifyStoreEventSlots;
+ break;
+ default:
+ // Unknown or invalid Phone IPC
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ return numberOfSlots;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::ExtFunc
+// Handling of extended requests
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::ExtFunc(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING3("TSY: CMmONStoreTsy::ExtFunc - IPC:%d Handle:%d", aIpc, aTsyReqHandle);
+
+ TInt ret = KErrNone;
+ TInt trapError = KErrNone;
+
+ // Reset last tsy request type
+ iReqHandleType = EMultimodeONStoreReqHandleUnknown;
+
+ TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ); );
+
+ if ( KErrNone != trapError )
+ {
+ ReqCompleted( aTsyReqHandle, trapError );
+ }
+ else if ( KErrNone != ret )
+ {
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+
+ // Save request handle
+ if ( EMultimodeONStoreReqHandleUnknown != iReqHandleType )
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
+#else // REQHANDLE_TIMER
+ iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::DoExtFuncL
+// Dispatches extension function requests
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::DoExtFuncL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING3("TSY: CMmONStoreTsy::DoExtFuncL - IPC:%d Handle:%d", aIpc, aTsyReqHandle);
+
+ TAny* dataPtr=aPackage.Ptr1();
+ TAny* dataPtr2=aPackage.Ptr2();
+
+ // Create unique transaction id
+
+ switch (aIpc)
+ {
+ case EMobilePhoneStoreRead:
+ return ReadL( aPackage.Des1n() );
+
+ case EMobilePhoneStoreWrite:
+ return WriteL( aTsyReqHandle, aPackage.Des1n() );
+
+ case EMobilePhoneStoreDelete:
+ return DeleteL( aTsyReqHandle,
+ REINTERPRET_CAST( TInt*, dataPtr ) );
+
+ case EMobilePhoneStoreDeleteAll:
+ return DeleteAllL( aTsyReqHandle );
+
+ case EMobilePhoneStoreGetInfo:
+ return GetInfoL( aTsyReqHandle,
+ REINTERPRET_CAST( RMobileONStore::TMobileONStoreInfoV1*,
+ dataPtr ) );
+
+ case EMobilePhoneStoreReadAllPhase1:
+ return ReadAllPhase1L( aTsyReqHandle,
+ REINTERPRET_CAST( RMobilePhone::TClientId*, dataPtr ),
+ REINTERPRET_CAST( TInt*, dataPtr2 ) );
+
+ case EMobilePhoneStoreReadAllPhase2:
+ return ReadAllPhase2( aTsyReqHandle,
+ REINTERPRET_CAST( RMobilePhone::TClientId*, dataPtr ),
+ aPackage.Des2n() );
+
+ case EMobilePhoneStoreNotifyStoreEvent:
+ return NotifyStoreEvent(
+ REINTERPRET_CAST( RMobilePhoneStore::TMobileStoreEvent*,
+ dataPtr ), REINTERPRET_CAST( TInt*, dataPtr2 ) );
+
+ case EMobileONStoreStoreAll:
+ return StoreAllL( aTsyReqHandle,aPackage.Des1n() );
+
+ default:
+ return KErrNotSupported;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CancelService
+// To cancel any extension requests
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::CancelService(
+ const TInt aIpc,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ switch ( aIpc )
+ {
+ case EMobilePhoneStoreGetInfo:
+ return GetInfoCancel( aTsyReqHandle );
+ case EMobilePhoneStoreRead:
+ return ReadCancel( aTsyReqHandle );
+ case EMobilePhoneStoreWrite:
+ return WriteCancel( aTsyReqHandle );
+ case EMobilePhoneStoreDelete:
+ // There is no change to cancel this request, so only thing to do,
+ // is let the request continue and return KErrNone.
+ return KErrNone;
+ case EMobilePhoneStoreDeleteAll:
+ return DeleteAllCancel( aTsyReqHandle );
+ case EMobilePhoneStoreReadAllPhase1:
+ case EMobilePhoneStoreReadAllPhase2:
+ return ReadAllCancel( aTsyReqHandle );
+ case EMobilePhoneStoreNotifyStoreEvent:
+ return NotifyStoreEventCancel( aTsyReqHandle );
+ case EMobileONStoreStoreAll:
+ return StoreAllCancel( aTsyReqHandle );
+ default:
+ return KErrGeneral;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::SetActiveONStoreExtension
+// Sets pointer to active extension
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::SetActiveONStoreExtension(
+ CMmONStoreExtInterface* aMmONStoreExt )
+ {
+ TInt ret = KErrGeneral;
+
+ if ( aMmONStoreExt )
+ {
+ iMmONStoreExtInterface = aMmONStoreExt;
+ ret = KErrNone;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::Returns a pointer to the active extension
+// Sets pointer to active extension
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmONStoreExtInterface* CMmONStoreTsy::ActiveONExtension()
+ {
+ return iMmONStoreExtInterface;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::ReadL
+// Read one ON store entry using index
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::ReadL( TDes8* aEntry )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::ReadL");
+ // Initialize ret value
+ TInt ret( KErrArgument );
+
+ if( sizeof( RMobileONStore::TMobileONEntryV1 ) <= aEntry->MaxLength() )
+ {
+
+ // Unpack entry parameter
+ RMobileONStore::TMobileONEntryV1Pckg* entryPckg =
+ REINTERPRET_CAST
+ ( RMobileONStore::TMobileONEntryV1Pckg*, aEntry );
+ RMobileONStore::TMobileONEntryV1& entry = ( *entryPckg )();
+
+ // Check index
+ if ( (-1) <= entry.iIndex )
+ {
+ // Forward request to GSM Extension
+ ret = iMmONStoreExtInterface->ReadL( EMmTsyONStoreReadIPC, entry.iIndex );
+ }
+
+ if ( KErrNone == ret )
+ {
+ // Save entry pointer
+ iReadONStoreEntryPtr = aEntry;
+
+ // Save tsy req handle type
+ iReqHandleType = EMultimodeONStoreRead;
+ }
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteRead
+// Completes reading a entry from the ONStore
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::CompleteRead(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteRead");
+ // Response information
+ TONStoreMsg* ONStoreResp = NULL;
+ // unpack data if exists
+ if ( aDataPackage )
+ {
+ //unpack data
+ aDataPackage->UnPackData( ONStoreResp );
+ }
+ else if ( KErrNone == aResult )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteRead result is KErrNone and aDataPackage is NULL!");
+ aResult = KErrArgument;
+ }
+
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreRead );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+
+ if ( KErrNone == aResult )
+ {
+
+ // Get entry
+ RMobileONStore::TMobileONEntryV1Pckg* entryPckg =
+ REINTERPRET_CAST( RMobileONStore::TMobileONEntryV1Pckg*,
+ iReadONStoreEntryPtr );
+ RMobileONStore::TMobileONEntryV1& entry = ( *entryPckg )();
+
+ // Fill entry
+ // Map iIndex to client world (increase value by one)
+ entry.iIndex = ONStoreResp->iLocation;
+ entry.iText.Copy( ONStoreResp->iName );
+ entry.iNumber.iTelNumber.Copy( ONStoreResp->iTelNumber );
+
+ // SIM_PN_READ_RESP response
+ entry.iMode = RMobilePhone::ENetworkModeUnknown;
+ /*ENetworkModeUnknown,
+ ENetworkModeUnregistered,
+ ENetworkModeGsm,
+ ENetworkModeAmps,
+ ENetworkModeCdma,
+ ENetworkModeWcdma
+ */
+ entry.iService = RMobilePhone::EServiceUnspecified;
+ /*EServiceUnspecified,
+ EVoiceService,
+ EAuxVoiceService,
+ ECircuitDataService,
+ EPacketDataService,
+ EFaxService,
+ EShortMessageService,
+ EAllServices
+ */
+
+ // Complete request to success
+ ReqCompleted( reqHandle, KErrNone );
+ }
+ else
+ {
+ // Failure
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::ReadCancel
+// Cancel read one ON store entry using index
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::ReadCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::ReadCancel");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreRead );
+
+ // Check that request handle was valid
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ // Complete with KErrCancel
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::WriteL
+// Writes the entry supplied within the entry parameter into the store
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::WriteL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDesC8* aEntry )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::WriteL");
+
+ // Unpack entry param to get the location
+ RMobileONStore::TMobileONEntryV1Pckg* entryPckg =
+ REINTERPRET_CAST
+ ( RMobileONStore::TMobileONEntryV1Pckg*, aEntry );
+ RMobileONStore::TMobileONEntryV1& entry = ( *entryPckg )();
+
+ // Return value
+ TInt ret( KErrArgument );
+
+ // Check Parameters
+ if( (-1) > entry.iIndex || sizeof( RMobileONStore::TMobileONEntryV1 ) != aEntry->Size() )
+ {
+ return ret;
+ }
+
+ // Save tsy req handle type
+ iReqHandleType = EMultimodeONStoreWrite;
+
+ iWriteONStoreEntryPtr = aEntry;
+ iWriteIndexToReturn = entry.iIndex;
+
+ // It is not possible to cancel write request anymore...
+ iIsWriteCancellingPossible = EFalse;
+
+
+ ret = iMmONStoreExtInterface->
+ WriteL(
+ EMmTsyONStoreWriteIPC,
+ aEntry );
+
+ // Check error while processing write
+ if ( KErrNone != ret )
+ {
+ iWriteIndexToReturn = 0;
+ iWriteONStoreEntryPtr = NULL;
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ // Save tsy req handle type
+ iReqHandleType = EMultimodeONStoreWrite;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteWrite
+// Completes writing a entry to the phonebookstore
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::CompleteWrite(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteWrite");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreWrite );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ if ( KErrNone == aResult )
+ {
+ TInt location = 0;
+
+ if ( aDataPackage )
+ {
+ aDataPackage->UnPackData( location );
+ }
+
+ // Complete notify store event
+ iMobileONStoreEvent = ( RMobilePhoneStore::KStoreEntryAdded );
+
+ // Return index within entry.iIndex, if needed
+ if ( -1 == iWriteIndexToReturn )
+ {
+ // Unpack entry param
+ RMobileONStore::TMobileONEntryV1Pckg* entryPckg =
+ ( RMobileONStore::TMobileONEntryV1Pckg*
+ )iWriteONStoreEntryPtr;
+ RMobileONStore::TMobileONEntryV1& entry = ( *entryPckg )();
+
+ // Set the correct entry index
+ entry.iIndex = location;
+ }
+
+ CompleteNotifyStoreEvent( location );
+ }
+
+ // Complete with error
+ ReqCompleted( reqHandle, aResult );
+ }
+
+ iWriteIndexToReturn = 0;
+ iWriteONStoreEntryPtr = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::WriteCancel
+// Cancels an outstanding Write method
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::WriteCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::WriteCancel");
+ // Check if cancelling is possible. If not, return KErrNone
+ if ( iIsWriteCancellingPossible )
+ {
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreWrite );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ iWriteIndexToReturn = 0;
+ iWriteONStoreEntryPtr = NULL;
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::DeleteL
+// Deletes one ON entry by index supplied as a parameter
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::DeleteL(
+ const TTsyReqHandle aTsyReqHandle,
+ TInt* aIndex )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::DeleteL");
+ // Initialize ret value
+ TInt ret( KErrGeneral );
+
+ // Get index and decrease value (CS uses indexes '0' ->, SOS '1' ->)
+ iDeleteONStoreIndex = *aIndex;
+
+ // Check that entry index value is greater than zero
+ if ( 0 < iDeleteONStoreIndex )
+ {
+ // Forward Delete request to gsm extension. Use Write function
+ // to "erase" ON store entry
+ ret = iMmONStoreExtInterface->DeleteL( EMmTsyONStoreDeleteIPC,
+ iDeleteONStoreIndex );
+ }
+
+ // Message construction failed or phonet sender returned error
+ if ( KErrNone != ret )
+ {
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ // Save tsy request handle type
+ iReqHandleType = EMultimodeONStoreDelete;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteDelete
+// Complete delete one ON entry by index
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::CompleteDelete(
+ TInt aResult )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDelete");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreDelete );
+
+ // Check that request was valid
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ // Complete with CS return value
+ ReqCompleted( reqHandle, aResult );
+
+ // If deletetion done succesfully, complete notify store event
+ if ( KErrNone == aResult )
+ {
+ // Complete notify store event
+ iMobileONStoreEvent = ( RMobilePhoneStore::KStoreEntryDeleted );
+ CompleteNotifyStoreEvent( iDeleteONStoreIndex );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::DeleteAllL
+// Delete all ON store entries
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::DeleteAllL (
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::DeleteAllL");
+ // Init variable for DeleteAllPhase1
+ iDeleteAllContinue = ETrue;
+
+ // Forwarded extension call
+ TInt ret = iMmONStoreExtInterface->DeleteAllL(
+ EMmTsyONStoreDeleteAllIPC );
+
+ // Check is return value valid
+ if ( KErrNone != ret )
+ {
+ // Complete with error
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ // Save TSY request handle type
+ iReqHandleType = EMultimodeONStoreDeleteAll;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteDeleteAllPhase1L
+// Complete delete all ON store entries phase 1
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::CompleteDeleteAllPhase1L(
+ TInt aResult )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDeleteAllPhase1L");
+ // Check that DeleteAll was called
+ if ( iDeleteAllContinue )
+ {
+ if ( KErrNone == aResult )
+ {
+ // Empty variables in order to call Write-function
+ TBuf<1> name;
+ TBuf<1> telNumber;
+
+#ifdef REQHANDLE_TIMER
+ // Set the new terminate time for deleting new entries from
+ // ONStore. About 300ms/entry => about (15s)/(50entries) ->
+ // x2 -> 30sec.
+ iTsyReqHandleStore->PostponeTimeout( EMultimodeONStoreDeleteAll,
+ 30 );
+#endif // REQHANDLE_TIMER
+
+ // Forward Delete request to gsm extension. Use Write function
+ // to start process to erase all ON store entries.
+ // '0' means that first location will be deleted first
+ }
+ // If error from SIM Server
+ else
+ {
+ CompleteDeleteAll( aResult );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteDeleteAll
+// Complete delete all ON store entries
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::CompleteDeleteAll(
+ TInt aResult )
+ {
+ // Reset request handle. Returns the deleted request handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreDeleteAll );
+
+ // Check that deleted request handle was valid
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDeleteAll");
+ // Complete with error
+ ReqCompleted( reqHandle, aResult );
+
+ // If deletion done succesfully, complete notify store event
+ // Notify will complete if it was requested
+ if ( KErrNone == aResult )
+ {
+ // Set notify reason, whole ON store deleted. Store empty.
+ iMobileONStoreEvent = ( RMobilePhoneStore::KStoreEmpty );
+ // Complete notify store event, with '-1' due that more than one
+ // entries deleted.
+ CompleteNotifyStoreEvent( -1 );
+ }
+ }
+ else if(EMultimodeONStoreReqHandleUnknown !=
+ iTsyReqHandleStore->GetTsyReqHandle(EMultimodeONStoreStoreAll ))
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDeleteAll requested by StoreAllL.");
+ TInt ret (aResult);
+
+ if(KErrNone == ret)
+ {
+ // ON store is now empty. Let's begin with reading store size to actually store all entries.
+ TInt writeAllIndex = -1; // Store index when writing all entries
+ TRAPD(err, ret = iMmONStoreExtInterface->ReadL(
+ EMmTsyONStoreWriteSizeIPC, writeAllIndex ));
+ if(err != KErrNone)
+ {
+ ret = err;
+ }
+ }
+ if(KErrNone != ret)
+ {
+ CompleteStoreAll( ret );
+ }
+ }
+ else
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteDeleteAll - the request has been cancelled or bad req handle");
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::DeleteAllCancel
+// This method cancels an outstanding DeleteAll -request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::DeleteAllCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::DeleteAllCancel");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreDeleteAll );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ // Prevent DeleteAllPhase1
+ iDeleteAllContinue = EFalse;
+ // Complete with KErrCancel
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::GetInfoL
+// This method returns information about the ONStore
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::GetInfoL(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobileONStore::TMobileONStoreInfoV1* aInfo )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL");
+
+ TInt ret( KErrNone );
+
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeONStoreGetInfo );
+ if(reqHandle != EMultimodeONStoreReqHandleUnknown)
+ {
+ ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ return ret;
+ }
+ // if aInfo is not correct type, send KErrArgument to client and return
+ if( RMobilePhoneStore::KETelMobileONStoreV1 != aInfo->ExtensionId() )
+ {
+ ReqCompleted( aTsyReqHandle, KErrArgument );
+ return ret;
+ }
+
+ // Don't send request if pb init is still ongoing
+ // instead create an ADN book store and wait for it to initilize
+
+TFLOGSTRING2( "TSY: CMmONStoreTsy::GetInfoL iPBList->GetNumberOfObjects() = %d", iMmPhone->PBList()->GetNumberOfObjects());
+ CMmPhoneBookStoreTsy* pbStore = NULL;
+ for( TInt i = 0; (i < iMmPhone->PBList()->GetNumberOfObjects()) && (NULL == pbStore) ; i++ )
+ {
+ pbStore = iMmPhone->PBList()->GetMmPBByIndex( i );
+TFLOGSTRING2( "TSY: CMmONStoreTsy::GetInfoL index = %d", i);
+ if( (pbStore->GetPhonebookType() != KADNPhoneBook) && (pbStore->GetPhonebookType() != KFDNPhoneBook ) )
+ {
+ pbStore = NULL;
+ }
+ else
+ {
+
+TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL - found ADN or FDN store");
+ }
+ }
+ if(NULL == pbStore)
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL - no ADN nor FDN store- creating ADN");
+ pbStore = CMmPhoneBookStoreTsy::NewL( iMmPhone, KETelIccAdnPhoneBook );
+ TInt addPBSucceeded = iMmPhone->PBList()->AddObject( pbStore );
+ if(addPBSucceeded != KErrNone)
+ {
+ delete pbStore;
+ ReqCompleted( aTsyReqHandle, addPBSucceeded );
+ return KErrNone;
+ }
+ }
+
+ // Set get info internal pointer
+ iONStoreInfoChanged = aInfo;
+
+ if ( !pbStore->IsPBInitDone())
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL - waiting for phone book to be initilized");
+ // Save tsy req handle type
+ iReqHandleType = EMultimodeONStoreGetInfo;
+ return KErrNone;
+ }
+
+TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoL - PBInit done, complete");
+
+ // Request to GSM extension, get used entries,
+ // -1 as a index param-> specified location param not needed
+ ret = iMmONStoreExtInterface->ReadL(EMmTsyONStoreGetInfoIPC, -1);
+
+ if (KErrNone != ret) // Message sending failed
+ {
+ ReqCompleted(aTsyReqHandle, ret);
+ }
+ else
+ {
+ // Save tsy req handle type
+ iReqHandleType = EMultimodeONStoreGetInfo;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteGetInfo
+// Completes GetInfo -request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::CompleteGetInfo(
+ TInt aResult,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("TSY: CMmONStoreTsy::CompleteGetInfo - Result: %d", aResult );
+
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreGetInfo );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+
+ // If request was not cancelled or no error from SIM
+ // give info to client
+ if ( KErrNone == aResult )
+ {
+ // The number of used entries
+ TServiceType serviceType;
+ //unpack data
+ aDataPackage->UnPackData( serviceType );
+
+ iONStoreInfo.iTotalEntries = serviceType.iNumOfEntries;
+ iONStoreInfo.iUsedEntries = serviceType.iUsedEntries;
+ iONStoreInfo.iNumberLen = serviceType.iNumLen;
+ iONStoreInfo.iTextLen = serviceType.iNameLen;
+
+ *iONStoreInfoChanged = iONStoreInfo;
+
+TFLOGSTRING3("TSY: CMmONStoreTsy::CompleteGetInfo - Name: %S, Type: %d", &iONStoreInfoChanged->iName, iONStoreInfoChanged->iType );
+TFLOGSTRING3("TSY: CMmONStoreTsy::CompleteGetInfo - Total entries: %d, Used entries: %d", iONStoreInfoChanged->iTotalEntries, iONStoreInfoChanged->iUsedEntries );
+TFLOGSTRING3("TSY: CMmONStoreTsy::CompleteGetInfo - Max Number length: %d, Max Name length: %d", iONStoreInfoChanged->iNumberLen, iONStoreInfoChanged->iTextLen );
+ }
+
+ // NULL the pointer to info supplied to TSY from the client
+ iONStoreInfoChanged = NULL;
+
+ // Complete with error
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::SetInfo
+// This method initializes ONStore internal info parameters
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::SetInfo()
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::SetInfo");
+ // The name of the store
+ iONStoreInfo.iName = KETelOwnNumberStore;
+
+ // The maximum number of characters for the number in a phonebook entry
+ iONStoreInfo.iNumberLen = KNoInfoAvail;
+
+ // The maximum number of characters for the text tag in a phonebook entry
+ iONStoreInfo.iTextLen = KMaxTextLength;
+
+ // The type of entry in the phone-side store
+ iONStoreInfo.iType = RMobilePhoneStore::EOwnNumberStore;
+
+ // Indicates the capabilities of the store
+ iONStoreInfo.iCaps = KONStoreCaps;
+
+ // Indicates the current number of entries that may be held in this store
+ iONStoreInfo.iUsedEntries = KNoInfoAvail;
+
+ // Indicates the total numbetr of entries
+ iONStoreInfo.iTotalEntries = KNoInfoAvail;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::GetInfoCancel
+// This method cancels an outstanding GetInfo -request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::GetInfoCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::GetInfoCancel");
+
+ iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeONStoreGetInfo );
+
+ // Complete with KErrCancel
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::NotifyStoreEvent
+// This method activates notifying of ONStore events
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::NotifyStoreEvent(
+ RMobilePhoneStore::TMobileStoreEvent* aEvent,
+ TInt* aIndex )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::NotifyStoreEvent");
+ TTsyReqHandle requestHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeONStoreNotifyStoreEvent );
+
+ // If request is not running
+ if ( 0 == requestHandle )
+ {
+ // Set variables to notify
+ iNotifyONStoreEventPtr = aEvent;
+ iNotifyONStoreEventIndexPtr = aIndex;
+
+ // Save tsy req handle type
+ iReqHandleType = EMultimodeONStoreNotifyStoreEvent;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteNotifyStoreEvent
+// This method is called when some of ONStore event happens
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::CompleteNotifyStoreEvent(
+ TInt aLocation )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteNotifyStoreEvent");
+ // Reset request handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreNotifyStoreEvent );
+
+ // If request handle is valid
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ RMobilePhoneStore::TMobileStoreEvent* ONStoreEvent =
+ REINTERPRET_CAST( RMobilePhoneStore::TMobileStoreEvent*,
+ iNotifyONStoreEventPtr );
+
+ // Fill notify information
+ *ONStoreEvent = iMobileONStoreEvent;
+ *iNotifyONStoreEventIndexPtr = aLocation;
+
+ ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::NotifyStoreEventCancel
+// This method cancels an outstanding NotifyStoreEvent -request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::NotifyStoreEventCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::NotifyStoreEventCancel");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreNotifyStoreEvent );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ // Reset variables and complete with KErrCancel
+ iNotifyONStoreEventPtr = NULL;
+ iNotifyONStoreEventIndexPtr = NULL;
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::ReadAllPhase1L
+// This method starts the two-phased ReadAll -request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::ReadAllPhase1L(
+ const TTsyReqHandle aReqHandle,
+ const RMobilePhone::TClientId* aId,
+ TInt* aBufSize )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::ReadAllPhase1L");
+ // Init return value
+ TInt ret( KErrNone );
+
+ // Store index when reading all entries
+ TInt readAllIndex = -1;
+
+ iReadAllBufSizePtr = aBufSize;
+ iReadAllId = *aId;
+
+ iReadAllONStoreIndex = 0;
+ ret = iMmONStoreExtInterface->
+ ReadL( EMmTsyONStoreReadSizeIPC, readAllIndex );
+
+ // Increase PhoneBookStoreIndex by 1.
+ iReadAllONStoreIndex++;
+
+ // Unsuccess request for read entry
+ if ( KErrNone != ret )
+ {
+ // Complete with error from Phonet Sender
+ ReqCompleted( aReqHandle, ret );
+ }
+ else
+ {
+ // Save tsy req handle type
+ iReqHandleType = EMultimodeONStoreReadAll;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::InternalRetrieveONListReadSizeL
+// This method is part of ReadAll -request, purposed to get
+// the ONStore size and continue request with reading the whole ONStore
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::InternalRetrieveONListReadSizeL(
+ TInt aError,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::InternalRetrieveONListReadSizeL");
+ if ( KErrNone == aError )
+ {
+ TInt size;
+ aDataPackage->UnPackData( size );
+TFLOGSTRING2("TSY: CMmONStoreTsy::InternalRetrieveONListReadSizeL size=%d",size);
+ if( 0 < size )
+ {
+ *iReadAllBufSizePtr = size;
+ iReadAllONStoreSize = size;
+ MakeInternalRetrieveONListReadReqL();
+ }
+ else
+ {
+TFLOGSTRING2("TSY: CMmONStoreTsy::InternalRetrieveONListReadSizeL size is %d", size);
+ CompleteReadAllPhase1Req( KErrNotFound );
+ }
+ }
+ else
+ {
+ CompleteReadAllPhase1Req( aError );
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::MakeInternalRetrieveONListReadReqL
+// This method is part of ReadAll -request, purposed to read
+// entries from ONStore and handle the ONStoreTSY's internal read all -index.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::MakeInternalRetrieveONListReadReqL()
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::MakeInternalRetrieveONListReadReqL");
+ // Read one entry from the PhoneBook.
+ TInt ret = iMmONStoreExtInterface->
+ ReadL( EMmTsyONStoreReadEntryIPC,iReadAllONStoreIndex );
+
+ // Increase PhoneBookStoreIndex by 1.
+ iReadAllONStoreIndex++;
+
+ // Unsuccess request for read entry
+ if ( KErrNone != ret )
+ {
+ // Complete with error from Phonet Sender
+ CompleteReadAllPhase1Req( ret );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::InternalRetrieveONListReadEntryL
+// This method is part of ReadAll -request, purposed to get the read response
+// and complete ReadAllPhase1 -request, if all the entries have been read.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::InternalRetrieveONListReadEntryL(
+ TInt aError,
+ CMmDataPackage* aDataPackage)
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::InternalRetrieveONListReadEntryL");
+ if ( KErrNone == aError )
+ {
+ // Check if there is data to save
+ if ( aDataPackage )
+ {
+ TONStoreMsg onStoreMsg;
+ aDataPackage->UnPackData( onStoreMsg );
+ // Add entry to the TSY's internal storage array
+ iONStoreListArray->AppendL( onStoreMsg );
+ }
+ // Check if all entries read, complete if so
+ if ( iReadAllONStoreIndex > iReadAllONStoreSize )
+ {
+ TInt leaveCode( KErrNone );
+
+ TRAP( leaveCode, CompleteReadAllPhase1L(); );
+ // Memory allocation failed
+ // TRAP is used here, because if memory allocation
+ // failed, list array elements must be destroyed
+ if ( leaveCode != KErrNone )
+ {
+ DeleteONStoreListArrayElements();
+ CompleteReadAllPhase1Req( leaveCode );
+ }
+ }
+ // There is more entries to read
+ else
+ {
+ MakeInternalRetrieveONListReadReqL();
+ }
+ }
+ else
+ {
+ CompleteReadAllPhase1Req( aError );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteReadAllPhase1L
+// Completes internal retrieving entries from the ONStore
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::CompleteReadAllPhase1L()
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteReadAllPhase1L");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeONStoreReadAll );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ // Check that ONStoreList array contains ONStore entries
+ if( 0 < iONStoreListArray->Count() )
+ {
+ // read the list, store its content and then return size of this
+ // buffer to client
+ CMobilePhoneONList* list = CMobilePhoneONList::NewL();
+ CleanupStack::PushL( list );
+
+ RMobileONStore::TMobileONEntryV1 entry;
+
+ // Loop until TSY's internal ONStorage is empty
+ while( !iONStoreListArray->Count() == 0 )
+ {
+ TONStoreMsg& ONStoreMsg = iONStoreListArray->At(0);
+
+ // Fill TMobileONEntryV1 information
+ entry.iMode = RMobilePhone::ENetworkModeUnknown;
+ entry.iService = RMobilePhone::EServiceUnspecified;
+ entry.iIndex = ( ONStoreMsg.iLocation );
+ // from SIM
+ entry.iNumber.iTypeOfNumber = RMobilePhone::EUnknownNumber;
+ entry.iNumber.iNumberPlan =
+ RMobilePhone::EUnknownNumberingPlan;
+ entry.iNumber.iTelNumber.Copy( ONStoreMsg.iTelNumber );
+ entry.iText.Copy( ONStoreMsg.iName );
+
+ // Add to PhoneBook list
+ list->AddEntryL( entry );
+
+ // Delete list member
+ iONStoreListArray->Delete(0);
+ iONStoreListArray->Compress();
+ }
+
+ // Store the streamed list and the client ID
+ CListReadAllAttempt* read = CListReadAllAttempt::NewL(
+ &iReadAllId );
+ CleanupStack::PushL( read );
+
+ read->iListBuf = list->StoreLC();
+ CleanupStack::Pop(); // Pop the CBufFlat allocated by StoreLC
+
+ iONStoreReadAllArray->AppendL( read );
+ CleanupStack::Pop(); // Pop the CListReadAllAttempt
+
+ // Return the CBufFlat’s size to client
+ *iReadAllBufSizePtr = ( read->iListBuf )->Size();
+
+ // Complete first phase of list retrieval
+ CompleteReadAllPhase1Req( KErrNone );
+ CleanupStack::PopAndDestroy(); // Pop&destroy list
+
+ return KErrNone;
+ }
+ else // Store was empty
+ {
+ CompleteReadAllPhase1Req( KErrNotFound );
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteReadAllPhase1Req
+// Completes ReadAll phase1 -request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::CompleteReadAllPhase1Req(
+ TInt aResult )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::CompleteReadAllPhase1Req");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreReadAll );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ // If this request is completed with error,
+ // delete ReadAll -arrays
+ if ( KErrNone != aResult )
+ {
+ // Delete ONStore array
+ iONStoreReadAllArray->ResetAndDestroy();
+ // Delete ONStoreList array
+ DeleteONStoreListArrayElements();
+ }
+
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::DeleteONStoreListArrayElements
+// Deletes ONStore elements that are stored to an array
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::DeleteONStoreListArrayElements()
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::DeleteONStoreListArrayElements");
+ while( 0 == !iONStoreListArray->Count() )
+ {
+ // Delete list member
+ iONStoreListArray->Delete(0);
+ iONStoreListArray->Compress();
+ }
+
+ // Delete pointers to elements from array
+ iONStoreListArray->Reset();
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::ReadAllPhase2
+// Read all ONStore entries, second phase
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::ReadAllPhase2(
+ TTsyReqHandle aTsyReqHandle,
+ const RMobilePhone::TClientId* aId,
+ TDes8* aBuffer )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::ReadAllPhase2");
+ // Initialize ret value
+ TInt ret( KErrCorrupt );
+
+ // Set read pointer to NULL
+ CListReadAllAttempt* read = NULL;
+
+ // Find the read attempt from this client
+ for ( TInt i=0; ( i<iONStoreReadAllArray->Count() ) &&
+ ( KErrCorrupt == ret ); ++i )
+ {
+ // Get and set item from array
+ // This is not deleted later on within this function if session
+ // handle and subsession handle does not match.
+ // Someone else 'owns' this data.
+ read = iONStoreReadAllArray->At( i );
+
+ // Check that session and client are rigth ones
+ if ( ( read->iClient.iSessionHandle == aId->iSessionHandle ) &&
+ ( read->iClient.iSubSessionHandle == aId->iSubSessionHandle ) )
+ {
+ // Set pointer to list buffer
+ TPtr8 bufPtr( ( read->iListBuf )->Ptr( 0 ) );
+ // Copy the streamed list to the client
+ aBuffer->Copy( bufPtr );
+
+ // Delete read and item from internal array
+ delete read;
+ iONStoreReadAllArray->Delete( i );
+
+ // Complete request
+ ReqCompleted( aTsyReqHandle, KErrNone );
+ // Set ret to KErrNone so that loop can exit
+ ret = KErrNone;
+ }
+ }
+
+ // Check ret value
+ if ( KErrCorrupt == ret )
+ {
+ // Doesn't found the matching client from read all phase 1
+ iONStoreReadAllArray->ResetAndDestroy();
+ ReqCompleted( aTsyReqHandle, KErrCorrupt);
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::ReadAllCancel
+// Cancels an outstanding ReadAll -request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::ReadAllCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::ReadAllCancel");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreReadAll );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ // Delete ONStore array
+ iONStoreReadAllArray->ResetAndDestroy();
+ // Delete ONStoreList elements
+ DeleteONStoreListArrayElements();
+ // Complete with KErrCancel
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::StoreAllL
+// This method stores the whole ONStore in one go
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::StoreAllL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aBuffer )
+ {
+TFLOGSTRING("TSY: CMmONStoreTsy::StoreAllL");
+ // Init return value
+ TInt ret( KErrNone );
+
+ // Set pointer to descrptor
+ iStoreAllBuffer = aBuffer;
+
+ // Create ONList and push it to cleanup stack
+ CMobilePhoneONList* aONList=CMobilePhoneONList::NewL();
+ CleanupStack::PushL(aONList);
+ aONList->RestoreL(*aBuffer);
+
+ // Get the size of ONList
+ // Note: If this list does not contain any data, all the entries
+ // will be deleted from ONStore!!
+ iStoreAllONListSize = aONList->Enumerate();
+
+ // StoreAll overwrites ON phone store. So, first delete all store.
+ ret = iMmONStoreExtInterface->DeleteAllL(
+ EMmTsyONStoreDeleteAllIPC );
+TFLOGSTRING2("CMmONStoreTsy::StoreAllL - DeleteAllL() ret: %d", ret);
+
+ // Message construction failed or phonet sender returned error
+ if ( KErrNone != ret )
+ {
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ // Save tsy req handle type
+ iReqHandleType = EMultimodeONStoreStoreAll;
+ }
+
+ CleanupStack::PopAndDestroy(); // aONList
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::InternalStoreAllGetSizeL
+// This method is part of StoreAll -request, purposed to get
+// the ONStore size and continue request with writing the whole ONStore
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::InternalStoreAllGetSizeL(
+ TInt aError,
+ CMmDataPackage* aDataPackage )
+ {
+TFLOGSTRING2("CMmONStoreTsy::InternalStoreAllGetSizeL %d",aError);
+ if ( KErrNone == aError )
+ {
+ TInt size;
+ aDataPackage->UnPackData( size );
+
+TFLOGSTRING2("CMmONStoreTsy::InternalStoreAllGetSizeL size %d", size);
+ // Check the size of ONStore and the ONList size from Client
+ // Client's ONList size should not be greater than ONStore size
+ if ( size > 0 && size >= iStoreAllONListSize )
+ {
+ TTsyReqHandle storeAllRequestHandle =
+ iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeONStoreStoreAll );
+ // Check if request has been cancelled or bad req. handle
+ if ( EMultimodeONStoreReqHandleUnknown != storeAllRequestHandle )
+ {
+ // Ok, set the class attribute iReadAllPhoneBookStoreIndex
+ // with the size of the ONStore
+ iStoreAllONStoreSize =
+ size;
+ iStoreAllONStoreIndex = 0;
+ MakeInternalStoreAllWriteReqL();
+ }
+ }
+ // Error occurs, when the size of the ONStore is not > 0
+ // or ONList size is greater that ONStore
+ else
+ {
+ CompleteStoreAll( KErrTooBig );
+ }
+ }
+ // Error from SIM Server
+ else
+ {
+ CompleteStoreAll( aError );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::MakeInternalStoreAllWriteReqL
+// This method is part of StoreAll -request, purposed to make
+// a write request by storeall index and an entry from ONList
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::MakeInternalStoreAllWriteReqL()
+ {
+TFLOGSTRING("CMmONStoreTsy::MakeInternalStoreAllWriteReqL ");
+ // Create ONList and push it to cleanup stack
+ CMobilePhoneONList* aONList=CMobilePhoneONList::NewL();
+ CleanupStack::PushL(aONList);
+
+ // Check the existance of buffered ONlist
+ if ( iStoreAllBuffer )
+ {
+ aONList->RestoreL(*iStoreAllBuffer);
+
+ // Initialize ONStore entry
+ RMobileONStore::TMobileONEntryV1 entry;
+ TInt ret( KErrNone );
+
+ // Loop until all entriest written
+ if( iStoreAllONStoreIndex < iStoreAllONStoreSize )
+ {
+ // Get entry from ONList from clinet, if list contains
+ // entries
+ if ( iStoreAllONStoreIndex < iStoreAllONListSize )
+ {
+ // Get entry from ONStore list
+ entry = aONList->GetEntryL( iStoreAllONStoreIndex );
+ }
+ // List does not contain entries anymore!!
+ // Destroy rest of the entries by overwriting Nam&Num with zero
+ else
+ {
+ entry.iText.Zero();
+ entry.iNumber.iTelNumber.Zero();
+ }
+
+#ifdef REQHANDLE_TIMER
+ // Set 10 sec. terminate time for writing a new entry
+ iTsyReqHandleStore->PostponeTimeout(
+ EMultimodeONStoreStoreAll, 10 );
+#endif // REQHANDLE_TIMER
+ CMmDataPackage dataPckg;
+ dataPckg.PackData( &entry );
+ // Forward request to GSM Extension
+ ret = iMmONStoreExtInterface->WriteAllL(
+ EMmTsyONStoreWriteEntryIPC, &dataPckg );
+
+ if ( KErrNone != ret )
+ {
+ CompleteStoreAll( ret );
+ }
+ iStoreAllONStoreIndex++;
+ }
+ // All entries written; complete with KErrNone
+ else
+ {
+ CompleteStoreAll( KErrNone );
+ }
+ }
+ // List not found
+ else
+ {
+ CompleteStoreAll( KErrCorrupt );
+ }
+
+ CleanupStack::PopAndDestroy(); // aONList
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::InternalStoreAllWriteEntryL
+// This function is part of StoreAll -request purposed to get
+// the error value from write one ONStore entry -request. This method
+// continues StoreAll -request if the error is KErrNone supplied as
+// a parameter.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::InternalStoreAllWriteEntryL(
+ TInt aResult )
+ {
+TFLOGSTRING2("CMmONStoreTsy::InternalStoreAllWriteEntryL %d",aResult);
+
+ TTsyReqHandle storeAllRequestHandle =
+ iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodeONStoreStoreAll );
+
+ if ( EMultimodeONStoreReqHandleUnknown == storeAllRequestHandle )
+ {
+ // The request has been cancelled or bad req handle
+TFLOGSTRING("The ON store request has been cancelled or bad req handle");
+ return;
+ }
+
+ if ( KErrNone == aResult )
+ {
+ MakeInternalStoreAllWriteReqL();
+ }
+ // Error from SIM Server, complete with an error
+ else
+ {
+ CompleteStoreAll( aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::CompleteStoreAll
+// This method completes StoreAll -request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::CompleteStoreAll(
+ TInt aResult )
+ {
+TFLOGSTRING2("CMmONStoreTsy::CompleteStoreAll %d",aResult);
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreStoreAll );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+
+ if ( KErrNone == aResult )
+ {
+ // Set notify reason, whole ON store stored. Do refresh.
+ iMobileONStoreEvent = ( RMobilePhoneStore::KStoreDoRefresh );
+
+ // Complete notify store event, with '-1' due that whole
+ // store has been changed
+ CompleteNotifyStoreEvent( -1 );
+ }
+
+ // Reset class attributes
+ iStoreAllBuffer = NULL;
+ iStoreAllONStoreSize = 0;
+ iStoreAllONStoreIndex = 0;
+ iStoreAllONListSize = 0;
+
+ // Complete request
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::StoreAllCancel
+// This method cancels an outstanding StoreAll -request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmONStoreTsy::StoreAllCancel(
+ TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("CMmONStoreTsy::StoreAllCancel");
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeONStoreStoreAll );
+
+ if ( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ // Reset class attributes
+ iStoreAllBuffer = NULL;
+ iStoreAllONStoreSize = 0;
+ iStoreAllONStoreIndex = 0;
+ iStoreAllONListSize = 0;
+
+ // Complete with KErrCancel
+ ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::ResetVariables
+// Reset all used variables
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::ResetVariables()
+ {
+ iPhoneBookType = KSimNoServiceType;
+ iServiceType.iNumOfEntries = KNoInfoAvail;
+ iServiceType.iNameLen = KNoInfoAvail;
+ iServiceType.iNumLen = KNoInfoAvail;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::Phone
+// Returns CMmPhoneTsy object
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPhoneTsy* CMmONStoreTsy::Phone()
+ {
+ return iMmPhone;
+ }
+
+#ifdef TF_LOGGING_ENABLED
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::ReqCompleted
+// Overrides CTelObject::ReqCompleted for test logging purposes.
+// It prints the aTsyReqHandle and aError variable in the log file and then
+// calls CTelObject::ReqCompleted.
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::ReqCompleted(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aError )
+ {
+TFLOGSTRING3("TSY: CMmONStoreTsy::ReqCompleted Completed - Handle:%d Error:%d", aTsyReqHandle, aError);
+
+ CTelObject::ReqCompleted( aTsyReqHandle, aError );
+ }
+
+#endif // TF_LOGGING_ENABLED
+
+#ifdef REQHANDLE_TIMER
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::SetTypeOfResponse
+// Sets the type of response for a given Handle
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::SetTypeOfResponse(
+ const TInt aReqHandleType,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ TInt timeOut( 0 );
+
+ //example switch
+ switch ( aReqHandleType )
+ {
+
+ case EMultimodeONStoreRead:
+ timeOut = KMmONStoreReadTimeOut;
+ break;
+ case EMultimodeONStoreWrite:
+ // Set time for writing first empty location
+ if ( iIsWriteCancellingPossible )
+ {
+ timeOut = KMmONStoreWriteToFirstEmptyLocTimeOut;
+ }
+ // Set time for normal write request
+ else
+ {
+ timeOut = KMmONStoreWriteTimeOut;
+ }
+ break;
+ case EMultimodeONStoreDelete:
+ timeOut = KMmONDeleteTimeOut;
+ break;
+ case EMultimodeONStoreDeleteAll:
+ timeOut = KMmONDeleteAllTimeOut;
+ break;
+ case EMultimodeONStoreGetInfo:
+ timeOut = KMmONGetInfoTimeOut;
+ break;
+ case EMultimodeONStoreReadAll:
+ case EMultimodeONStoreStoreAll:
+ timeOut = KMmONStoreAllTimeOut;
+ break;
+
+ //Must not use timer:
+ // - all notifications
+ //case EMultimodePhoneStoreNotifyStoreEvent:
+ // - 2nd phase methods (when two phase lists are used)
+ //case EMultimodeONStoreReadAll:
+
+ 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 );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::Complete
+// Completes the request due timer expiration
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::Complete(
+ TInt aReqHandleType,
+ TInt aError )
+ {
+TFLOGSTRING3( "TSY: CMmONStoreTsy::Complete - ReqHandleType: %d Error: %d", aReqHandleType, aError );
+ //All possible TSY req handle types are listed in the
+ //switch case below.
+ switch( aReqHandleType )
+ {
+ case EMultimodeONStoreRead:
+ CompleteRead( aError, NULL );
+ break;
+ case EMultimodeONStoreWrite:
+ CompleteWrite( aError, NULL );
+ break;
+ case EMultimodeONStoreDelete:
+ CompleteDelete( aError );
+ break;
+ case EMultimodeONStoreDeleteAll:
+ CompleteDeleteAll( aError );
+ break;
+ case EMultimodeONStoreGetInfo:
+ CompleteGetInfo( aError, 0 );
+ break;
+ case EMultimodeONStoreStoreAll:
+ CompleteStoreAll( aError );
+ break;
+
+ //Can't use timer:
+ // - all notifications
+ //case EMultimodeONStoreNotifyStoreEvent:
+ // - 2nd phase methods (when two phase lists are used)
+ //case EMultimodeONStoreReadAll:
+
+ default:
+ ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle(
+ aReqHandleType ), aError );
+ break;
+ }
+ }
+
+#endif
+
+// ---------------------------------------------------------------------------
+// CMmONStoreTsy::PhoneBookStoreInitCompleteL
+// Phone book store initilization was complete
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmONStoreTsy::PhoneBookStoreInitCompleteL(TInt aError)
+ {
+ TFLOGSTRING("TSY: CMmONStoreTsy::PhoneBookStoreInitCompleteL ");
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeONStoreGetInfo );
+ if( EMultimodeONStoreReqHandleUnknown != reqHandle )
+ {
+ if( KErrNone != aError )
+ {
+
+ ReqCompleted(reqHandle, aError);
+ return;
+ }
+ iReqHandleType = EMultimodeONStoreReqHandleUnknown;
+ TInt ret = GetInfoL(reqHandle, iONStoreInfoChanged);
+ if (ret == KErrNone)
+ {
+ if (iReqHandleType != EMultimodeONStoreReqHandleUnknown)
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse(iReqHandleType, reqHandle);
+#else // REQHANDLE_TIMER
+ iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, reqHandle );
+#endif // REQHANDLE_TIMER
+ }
+ }
+ else
+ {
+ ReqCompleted(reqHandle, ret);
+ }
+ }
+
+ }
+
+// End of File