telephonyserverplugins/common_tsy/commontsy/src/mmstorage/cmmenstoretsy.cpp
changeset 0 3553901f7fa8
child 14 7ef16719d8cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmstorage/cmmenstoretsy.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,969 @@
+// 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 "cmmenstoretsy.h"
+#include "cmmtsyreqhandlestore.h"
+#include "CMmPrivateUtility.h"
+#include "MmTsy_numberOfSlots.h"
+#include "MmTsy_timeoutdefs.h"
+#include "cmmmessagemanagerbase.h"
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmENStoreTsy::CMmENStoreTsy()
+    {
+    }
+
+void CMmENStoreTsy::ConstructL()
+    {
+#ifdef REQHANDLE_TIMER
+    // Create req handle store
+    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this,
+        iMmPhone,
+        KMmTsyNumOfENStoreRequests,
+        iStorageReqHandles );
+#else
+    // Create req handle store
+    iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( 
+        KMmTsyNumOfENStoreRequests,
+        iStorageReqHandles );
+
+#endif
+
+    // Create GSM ENStore objects
+    iMmENStoreGsmExt = static_cast<CMmENStoreExtInterface*>(
+        CMmENStoreGsmExt::NewL( this ) );
+
+    // Set mode GSM
+    iMmENStoreExtInterface = iMmENStoreGsmExt;
+
+    // Construct ReadAllArray
+    iENStoreReadAllArray =
+        new ( ELeave ) CArrayPtrFlat<CListReadAllAttempt>( 1 );
+
+    //register conference call tsy in the message manager
+    iMmPhone->MessageManager()->RegisterTsyObject( 
+        CMmMessageManagerBase::EENStoreTsy, this );
+    }
+
+CMmENStoreTsy* CMmENStoreTsy::NewL(
+    CMmPhoneTsy* aMmPhone )
+    {
+    // Create EN store
+    CMmENStoreTsy* aMmENStoreTsy = new( ELeave ) CMmENStoreTsy();
+    CleanupClosePushL( *aMmENStoreTsy );
+
+    // Set MM Phone and phonet sender pointers
+    aMmENStoreTsy->iMmPhone = aMmPhone;
+
+    // Call construct
+    aMmENStoreTsy->ConstructL();
+    CleanupStack::Pop();
+
+    return aMmENStoreTsy;
+    }
+
+CMmENStoreTsy::~CMmENStoreTsy()
+    {
+TFLOGSTRING("TSY: CMmENStoreTsy::~CMmENStoreTsy");
+
+    if (iMmPhone )
+        {
+        // deregister tsy object from message manager
+        iMmPhone->MessageManager()->DeregisterTsyObject( this );
+        }
+
+    // Delete TSY request handle store if it exist
+    if ( NULL != iTsyReqHandleStore )
+        {
+        delete iTsyReqHandleStore;
+        iTsyReqHandleStore = NULL;
+        }
+
+    // Delete ENStoreGsmExt
+    delete iMmENStoreGsmExt;
+    iMmENStoreGsmExt = NULL;
+
+    // Delete ENStoreReadAll array
+    iENStoreReadAllArray->ResetAndDestroy();
+    delete iENStoreReadAllArray;
+    iENStoreReadAllArray = NULL;
+
+    iReadENStoreEntryPtr = 0;
+    iENStoreInfoChanged = 0;
+    iNotifyENStoreEventPtr = 0;
+    iNotifyENStoreEventIndexPtr = 0;
+    iReadAllBufSizePtr = 0;
+    iMmPhone = 0;
+    iMmENStoreExtInterface = 0;
+    iTsyReqHandleStore = 0;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::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 CMmENStoreTsy::Init()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::OpenNewObjectByNameL
+// This method opens extendable sub-sessions.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmENStoreTsy::OpenNewObjectByNameL(
+    const TDesC& )
+    {
+    // Not supported
+    User::Leave( KErrNotSupported );
+    //lint -e{527} "unreachable code"
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::OpenNewObjectL
+// This method opens extendable sub-sessions.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmENStoreTsy::OpenNewObjectL(
+    TDes& )
+    {
+    // Not supported
+    User::Leave( KErrNotSupported );
+    //lint -e{527} "unreachable code"
+    
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::ReqModeL
+// To ask what type of flow control is used for the IPC number.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmENStoreTsy::ReqModeL(
+    const TInt aIpc )
+    {
+    CTelObject::TReqMode ret = 0;
+
+    // Match the request IPC
+    switch ( aIpc )
+        {
+        // Non Flow controlled services
+        case EMobilePhoneStoreReadAllPhase2:
+            break;
+        // Flow Controlled Services
+        case EMobilePhoneStoreRead:
+        case EMobilePhoneStoreWrite:
+        case EMobilePhoneStoreDelete:
+        case EMobilePhoneStoreDeleteAll:
+        case EMobilePhoneStoreReadAllPhase1:
+        case EMobilePhoneStoreGetInfo:
+            ret = KReqModeFlowControlObeyed;
+            break;
+        // Multiple Completion Services with Immediate Server Repost
+        // (Usually Notifications)
+        case EMobilePhoneStoreNotifyStoreEvent:
+            ret = KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+            break;
+        // Cancel Requests
+        // Listed here just for reference
+        // case EMobilePhoneStoreGetInfoCancel:
+        // case EMobilePhoneStoreReadCancel:
+        // case EMobilePhoneStoreWriteCancel:
+        // case EMobilePhoneStoreDeleteCancel:
+        // case EMobilePhoneStoreDeleteAllCancel:
+        // case EMobilePhoneStoreReadAllCancel:
+        // case EMobilePhoneStoreNotifyStoreEventCancel:
+        default:
+            User::Leave( KErrNotSupported );
+        }
+        
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::RegisterNotification
+// Enables the TSY to "turn on" any regular notification.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::RegisterNotification(
+    const TInt aIpc )
+    {
+    // Initalize ret value
+    TInt ret( KErrNotSupported );
+
+    // Match the request IPC
+    switch ( aIpc )
+        {
+        // Not supported, but for possible future use
+        case EMobilePhoneStoreNotifyStoreEvent:
+            ret = KErrNone;
+            break;
+
+        default:
+            // Unknown or invalid IPC.
+            // ret already initialized KErrNotSupported,
+            // do nothing
+            break;
+        }
+        
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::DeregisterNotification
+// Enables the TSY to "turn off" any regular notification.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::DeregisterNotification(
+    const TInt aIpc )
+    {
+    // Initalize ret value
+    TInt ret( KErrNotSupported );
+
+    // Match the request IPC
+    switch ( aIpc )
+        {
+        // Not supported, but for possible future use
+        case EMobilePhoneStoreNotifyStoreEvent:
+            ret = KErrNone;
+            break;
+
+        default:
+            // Unknown or invalid IPC.
+            // ret already initialized KErrNotSupported,
+            // do nothing
+            break;
+        }
+        
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::NumberOfSlotsL
+// To ask the TSY how big buffer it wants.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::NumberOfSlotsL(
+    const TInt aIpc )
+    {
+    // Initialize number of slots to one
+    TInt numberOfSlots = 1;
+
+    // Match IPC
+    switch ( aIpc )
+        {
+        // Not supported, but for possible future use
+        case EMobilePhoneStoreNotifyStoreEvent:
+            numberOfSlots = KMmENStoreNotifyStoreEventSlots;
+            break;
+
+        default:
+            // Unknown or invalid EN storage IPC
+            User::Leave( KErrNotSupported );
+            break;
+        }
+        
+    return numberOfSlots;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::ExtFunc
+// Handling of extended requests.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::ExtFunc(
+    const TTsyReqHandle aTsyReqHandle,
+    const TInt aIpc,
+    const TDataPackage& aPackage )
+    {
+    // Initialize ret and trap error
+    TInt ret = KErrNone;
+    TInt trapError = KErrNone;
+
+    // Reset last tsy request type
+    iReqHandleType = EMultimodeENStoreReqHandleUnknown;
+
+    // Trap and call function that dispatches function requests
+    TRAP ( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ); );
+
+    // Check was there an error
+    if ( trapError != KErrNone )
+        {
+        // Complete with error if trap error
+        ReqCompleted( aTsyReqHandle, trapError );
+        }
+    else if ( ret != KErrNone )
+        {
+        // Complete with error if return value error
+        ReqCompleted( aTsyReqHandle, ret );
+        }
+
+    // Save request handle
+    if ( EMultimodeENStoreReqHandleUnknown != iReqHandleType )
+        {
+#ifdef REQHANDLE_TIMER
+        SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
+#else
+        iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, aTsyReqHandle );
+#endif
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::DoExtFuncL
+// Dispatches extension function requests.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::DoExtFuncL(
+    const TTsyReqHandle aTsyReqHandle,
+    const TInt aIpc,
+    const TDataPackage& aPackage )
+    {
+
+    // Initialize return value
+    TInt ret( KErrNotSupported );
+
+    TAny* dataPtr = aPackage.Ptr1();
+    TAny* dataPtr2 = aPackage.Ptr2();
+
+    switch ( aIpc )
+        {
+        case EMobilePhoneStoreRead:
+            ret = Read( aTsyReqHandle, aPackage.Des1n() );
+            break;
+        case EMobilePhoneStoreGetInfo:
+            ret = GetInfo(
+                REINTERPRET_CAST( RMobilePhoneStore::TMobilePhoneStoreInfoV1*,
+                dataPtr ) );
+            break;
+        case EMobilePhoneStoreReadAllPhase1:
+            ret = ReadAllPhase1( aTsyReqHandle,
+                REINTERPRET_CAST( RMobilePhone::TClientId*, dataPtr ),
+                REINTERPRET_CAST( TInt*, dataPtr2 ) );
+            break;
+        case EMobilePhoneStoreReadAllPhase2:
+            ret = ReadAllPhase2( aTsyReqHandle,
+                REINTERPRET_CAST( RMobilePhone::TClientId*, dataPtr ),
+                aPackage.Des2n() );
+            break;
+
+        // Not supported functions completes here
+        // EMobilePhoneStoreWrite
+        // EMobilePhoneStoreDelete
+        // EMobilePhoneStoreDeleteAll
+        // EMobilePhoneStoreNotifyStoreEvent
+        default:
+            // Do nothing, ret already set KErrNotSupported
+            break;
+        }
+        
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::CancelService
+// To cancel any extension requests.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::CancelService(
+    const TInt aIpc,
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    // Initialize return value
+    TInt ret( KErrGeneral );
+
+    // Match cancel request using IPC
+    switch ( aIpc )
+        {
+        case EMobilePhoneStoreGetInfo:
+            ret = GetInfoCancel( aTsyReqHandle );
+            break;
+        case EMobilePhoneStoreRead:
+            ret = ReadCancel( aTsyReqHandle );
+            break;
+        case EMobilePhoneStoreReadAllPhase1:
+        case EMobilePhoneStoreReadAllPhase2:
+            ret = ReadAllCancel( aTsyReqHandle );
+            break;
+        // Not possible to call cancel functions below because
+        // request function is not supported, and returns immediately.
+        // these functions will never even called. Added here just to
+        // possible future purpose.
+        // case EMobilePhoneStoreWrite:
+        // case EMobilePhoneStoreDelete:
+        // case EMobilePhoneStoreDeleteAll:
+        // case EMobilePhoneStoreNotifyStoreEvent:
+        default:
+            // Do nothing, ret initialized KErrGeneral
+            break;
+        }
+        
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::Read
+// Read one entry from EN store.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::Read(
+    const TTsyReqHandle aTsyReqHandle,
+    TDes8* aEntry )
+    {
+    TInt ret( KErrArgument );
+
+    // Unpack entry parameters
+    RMobileENStore::TMobileENEntryV1Pckg* entryPckg = REINTERPRET_CAST
+        ( RMobileENStore::TMobileENEntryV1Pckg*, aEntry );
+    RMobileENStore::TMobileENEntryV1& entry = ( *entryPckg )();
+
+    // Check that client uses valid location index
+    if ( 0 < entry.iIndex )
+        {
+        // Forward request to GSM Extension
+        ret = iMmENStoreExtInterface->Read( 
+            EMmTsyENStoreReadIPC, entry.iIndex );        
+        }
+
+    // ISI message construction failed or phonet sender returned error
+    if ( KErrNone != ret )
+        {
+        ReqCompleted( aTsyReqHandle, ret );
+        }
+    else
+        {
+        // Save tsy req handle type
+        iReqHandleType = EMultimodeENStoreRead;
+        
+        // Set internal EN entry pointer
+        iReadENStoreEntryPtr = aEntry;        
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::CompleteRead
+// Complete read one entry from EN store
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmENStoreTsy::CompleteRead(
+    TInt aResult,
+    CMmDataPackage* aDataPackage )
+    {
+    // Reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeENStoreRead );
+
+    // Check that request handle was valid
+    if ( EMultimodeENStoreReqHandleUnknown != reqHandle )
+        {
+        if ( KErrNone == aResult )
+            {
+            // Response information
+            TENStoreResponse* enStoreResp = NULL;
+            
+            //unpack data
+            if ( aDataPackage )
+                {
+                aDataPackage->UnPackData( &enStoreResp );
+                }
+
+            // Get entry
+            RMobileENStore::TMobileENEntryV1Pckg* entryPckg =
+                REINTERPRET_CAST( RMobileENStore::TMobileENEntryV1Pckg*,
+                iReadENStoreEntryPtr );
+            RMobileENStore::TMobileENEntryV1& entry = ( *entryPckg )();
+
+            // Fill TMobileENEntryV1 entry
+            // OBS! iCountryCode, iIdentity
+            // iAlphaId cannot be filled, no info from SIM Server
+            entry.iNetworkSpecific = EFalse;
+            entry.iMode = RMobilePhone::ENetworkModeUnknown;
+            
+            if ( &enStoreResp )
+                {
+                entry.iNumber.Copy( enStoreResp->iECCNumber );
+                entry.iIndex = enStoreResp->iLocation;
+                }
+
+            //Complete request to success
+            ReqCompleted( reqHandle, KErrNone );
+            }
+        else
+            {
+            // Complete with error
+            ReqCompleted( reqHandle, aResult );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::ReadCancel
+// Cancel read one entry from EN store
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::ReadCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeENStoreRead );
+
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::GetInfo
+// Get EN store info (capabilities)
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::GetInfo(
+    RMobilePhoneStore::TMobilePhoneStoreInfoV1* aInfo )
+    {
+    // Initialize ret value
+    TInt ret( KErrNone );
+    
+    // if aInfo is not correct type, complete request with KErrArgument
+    if( RMobilePhoneStore::KETelMobilePhoneStoreV1 != aInfo->ExtensionId() )
+        {
+        ret = KErrArgument;
+        }
+
+    else
+        {
+        // Set get info internal pointer
+        iENStoreInfoChanged = aInfo;
+
+        // Request to GSM extension, get used entries,
+        // -1 as a index param-> specified location param not needed
+        ret = iMmENStoreExtInterface->Read( EMmTsyENStoreGetInfoIPC, -1 );
+
+        if ( ret == KErrNone )
+            {
+            iReqHandleType = EMultimodeENStoreGetInfo;
+            }
+        
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::CompleteGetInfo
+// Complete get EN store info (capabilities)
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmENStoreTsy::CompleteGetInfo(
+    TInt aResult,
+    CMmDataPackage* aDataPackage )
+    {
+    // Reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeENStoreGetInfo );
+
+    // Request handle was valid
+    if ( EMultimodeENStoreReqHandleUnknown != reqHandle )
+        {
+        // No errors
+        if ( KErrNone == aResult )
+            {
+            // The number of used entries
+            TInt usedEntries( 0 );
+            
+            // Unpack data
+            if ( aDataPackage )
+                {
+                aDataPackage->UnPackData( usedEntries );
+                }
+            
+            // The name of the store
+            iENStoreInfoChanged->iName = KETelEmergencyNumberStore;
+
+            // The type of entry in the phone-side store
+            iENStoreInfoChanged->iType =
+                RMobilePhoneStore::EEmergencyNumberStore;
+
+            // Indicates the capabilities of the store
+            // EN store can be only read one entry at time or whole store.
+            // Write and delete is prohibited.
+            iENStoreInfoChanged->iCaps = KENStoreCaps;
+
+            // Indicates the current number of used entries
+            iENStoreInfoChanged->iUsedEntries = usedEntries;
+
+            // Indicates the total numbetr of entries, GSM 11.11
+            iENStoreInfoChanged->iTotalEntries = KEccStorageNumberMaxCount;
+            }
+
+        ReqCompleted( reqHandle, aResult );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::GetInfoCancel
+// Cancel get EN store info (capabilities)
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::GetInfoCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeENStoreGetInfo );
+
+    // Complete with KErrCancel
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::ReadAllPhase1
+// Read all EN store entries, first phase
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::ReadAllPhase1(
+    const TTsyReqHandle aTsyReqHandle,
+    const RMobilePhone::TClientId* aId,
+    TInt* aBufSize )
+    {
+    // Initialize ret value
+    TInt ret( KErrNone );
+
+    // Set buffer size and client ID
+    iReadAllBufSizePtr = aBufSize;
+    iReadAllId = *aId;
+
+    // Request to GSM extension
+    ret = iMmENStoreExtInterface->Read( EMmTsyENStoreReadAllPhase1IPC, -1 );
+
+    // error returned
+    if ( KErrNone != ret )
+        {
+        ReqCompleted( aTsyReqHandle, ret );
+        }
+    else
+        {
+        // Save tsy req handle type
+        iReqHandleType = EMultimodeENStoreReadAll;
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::CompleteReadAllPhase1L
+// Read all EN store entries, complete first phase
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::CompleteReadAllPhase1L(
+    TInt aResult,
+    CMmDataPackage* aDataPackage )
+    {
+    // EN number array
+    CArrayPtrFlat<TENStoreResponse>* ECCArray = NULL;
+    //unpack data
+    // Reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeENStoreReadAll );
+
+    // Check that the request is still ongoing
+    if ( EMultimodeENStoreReqHandleUnknown != reqHandle )
+        {
+        // Check aError is KErrNone and aECCArray contains entries
+        if ( KErrNone == aResult )
+            {
+            aDataPackage->UnPackData( ECCArray );
+
+            // Read the list, store its content and then return size of this
+            // buffer to client
+            CMobilePhoneENList* list = CMobilePhoneENList::NewL();
+            CleanupStack::PushL( list );
+
+            // Create an entry variable to fill ENStore list
+            RMobileENStore::TMobileENEntryV1 entry;
+
+            //Reset iCountryCode, iIdentity and iAlphaId. We can't provide
+            //this information
+            entry.iCountryCode.Zero();
+            entry.iIdentity.Zero();
+            entry.iAlphaId.Zero();
+
+            entry.iNetworkSpecific = ETrue;
+            entry.iMode = RMobilePhone::ENetworkModeGsm;
+
+            // Loop until TSY's internal ENStorage is empty
+            while ( !( 0 == ECCArray->Count() ) )
+                {
+                // Used entry is always deleted at the end of this loop, and
+                // then compressed. Therefore first item always red.
+                TENStoreResponse* enStoreMsg = ECCArray->At( 0 );
+
+                entry.iNumber.SetLength( 0 ); //Set length to 0 before copying
+                entry.iNumber.Copy( enStoreMsg->iECCNumber );
+                entry.iIndex = enStoreMsg->iLocation;
+
+                // Add to ENStore list
+                list->AddEntryL( entry );
+
+                // Delete internal list member
+                delete enStoreMsg;
+                ECCArray->Delete( 0 );
+                ECCArray->Compress();
+                }
+
+            // Store the streamed list and the client ID
+            CListReadAllAttempt* read =
+                CListReadAllAttempt::NewL( &iReadAllId );
+            CleanupStack::PushL( read );
+
+            // Set list
+            read->iListBuf = list->StoreLC();
+            CleanupStack::Pop(); // Pop the CBufFlat allocated by StoreLC
+
+            // Append list EN entry array
+            iENStoreReadAllArray->AppendL( read );
+            CleanupStack::Pop( read ); // Pop the CListReadAllAttempt
+
+            // Return the CBufFlat’s size to client
+            *iReadAllBufSizePtr = ( read->iListBuf )->Size();
+
+            // Complete first phase of list retrieval
+            ReqCompleted( reqHandle, KErrNone );
+            CleanupStack::PopAndDestroy( list ); // Pop & destroy list
+            }
+        // PMM store doesn't contain emergency numbers
+        else
+            {
+            ReqCompleted( reqHandle, aResult );
+            }
+        }
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::ReadAllPhase2
+// Read all EN store entries, second phase
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::ReadAllPhase2(
+    TTsyReqHandle aTsyReqHandle,
+    const RMobilePhone::TClientId* aId,
+    TDes8* aBuffer )
+    {
+    // 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 < iENStoreReadAllArray->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 = iENStoreReadAllArray->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;
+            iENStoreReadAllArray->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 for read all phase 1
+        iENStoreReadAllArray->ResetAndDestroy();
+        ReqCompleted( aTsyReqHandle, ret );
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::ReadAllCancel
+// Cancel read all EN store entries
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmENStoreTsy::ReadAllCancel(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    // Reset req handle. Returns the deleted req handle
+    iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeENStoreReadAll );
+
+    // Remove the read all attempt
+    CListReadAllAttempt* read = NULL;
+
+    // Check that read all array does not contain any data.
+    // If it does, delete it.
+    // NOTE: functions request mode "Flow control obeyed" currently blocks
+    // request so that only one client can request data at the time.
+    // Therefore, loop-functionality is not needed.
+    // Just check that is there
+    if ( iENStoreReadAllArray->Count() > 0x0 )
+        {
+        read = iENStoreReadAllArray->At( 0 );
+        delete read;
+        iENStoreReadAllArray->Delete( 0 );
+        }
+
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+
+    return KErrNone;
+    }
+
+#ifdef REQHANDLE_TIMER
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::SetTypeOfResponse
+// Gets the type of response for a given Handle.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmENStoreTsy::SetTypeOfResponse(
+    const TInt aReqHandleType,
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    TInt timeOut( 0 );
+
+    //example switch
+    switch ( aReqHandleType )
+        {
+        case EMultimodeENStoreRead:
+            timeOut = KMmENStoreReadTimeOut;
+            break;
+        case EMultimodeENStoreGetInfo:
+            timeOut = KMmENGetInfoTimeOut;
+            break;
+
+        //Must not use timer:
+        // - all notifications
+            //case EMultimodeENStoreNotifyStoreEvent:
+        // - 2nd phase methods (when two phase lists are used)
+            //case EMultimodeENStoreReadAll
+        default:
+            //does not use timer
+            iTsyReqHandleStore->SetTsyReqHandle(
+                aReqHandleType,
+                aTsyReqHandle );
+            break;
+        }
+
+    if ( timeOut > 0 )
+        {
+        //the timeout parameter is given in seconds.
+        iTsyReqHandleStore->SetTsyReqHandle(
+            aReqHandleType,
+            aTsyReqHandle,
+            timeOut );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::Complete
+// Completes the request due timer expiration
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmENStoreTsy::Complete(
+    TInt aReqHandleType,
+    TInt aError )
+    {
+    //All possible TSY req handle types are listed in the
+    //switch case below.
+    switch( aReqHandleType )
+        {
+        case EMultimodeENStoreRead:
+            CompleteRead( aError, NULL );
+            break;
+        case EMultimodeENStoreGetInfo:
+            CompleteGetInfo( aError, NULL );
+            break;
+
+        //Can't use timer:
+        // - all notifications
+            //case EMultimodeENStoreNotifyStoreEvent:
+        // - 2nd phase methods (when two phase lists are used)
+            //case EMultimodeENStoreReadAll
+        default:
+            ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle(
+                            aReqHandleType ), aError );
+            break;
+        }
+    }
+#endif // REQHANDLE_TIMER
+
+// ---------------------------------------------------------------------------
+// CMmENStoreTsy::Phone
+// Returns pointer to CMmPhoneTsy object
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPhoneTsy* CMmENStoreTsy::Phone()
+    {
+    return iMmPhone;
+    }
+
+//  End of File