phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CStoreBase.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CStoreBase.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,797 @@
+/*
+* Copyright (c) 2002-2007 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:  The base class for sim stores
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CStoreBase.h"
+
+// From VPbkSimStoreImpl namespace
+#include "CPhone.h"
+#include "CContactArray.h"
+#include "CETelStoreNotification.h"
+#include "CSequentialCompositeCmd.h"
+#include "CDeleteCmd.h"
+#include "CGetInfoCmd.h"
+#include "CServiceTableCmd.h"
+#include "CNumberMatchOperation.h"
+#include "CFindOperation.h"
+#include "CSimPhoneNumberIndex.h"
+#include "CSatRefreshNotifier.h"
+#include "TStoreParams.h"
+#include "CBtSapNotification.h"
+#include "CSharedViewArray.h"
+
+// From Virtual Phonebook
+#include <CVPbkSimContactView.h>
+#include <CVPbkSimCommandStore.h>
+#include <CVPbkETelCntConverter.h>
+#include <CVPbkSimContact.h>
+#include <CVPbkSimCntField.h>
+#include <CVPbkAsyncOperation.h>
+#include <CVPbkAsyncCallback.h>
+#include <CVPbkSimFieldTypeFilter.h>
+#include <MVPbkSimCommand.h>
+#include <MVPbkSimContactObserver.h>
+#include <MVPbkSimStoreObserver.h>
+#include <TVPbkSimStoreProperty.h>
+#include <VPbkSimStoreTemplateFunctions.h>
+#include <VPbkSimStoreImplError.h>
+
+// System includes
+#include <etelmm.h>
+
+#include <VPbkDebug.h>
+
+namespace VPbkSimStoreImpl {
+
+// ============================ LOCAL FUNCTIONS =============================
+
+// --------------------------------------------------------------------------
+// ConvertETelStoreCaps
+// Converts the ETel store caps to own caps
+// --------------------------------------------------------------------------
+//
+TUint32 ConvertETelStoreCaps( TUint32 aETelStoreCaps )
+    {
+    TUint32 caps = 0;
+
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsReadAccess )
+        {
+        caps |= VPbkSimStoreImpl::KReadAccess;
+        }
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsWriteAccess )
+        {
+        caps |= VPbkSimStoreImpl::KWriteAccess;
+        }
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsDeleteAll )
+        {
+        caps |= VPbkSimStoreImpl::KDeleteAll;
+        }
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsNotifyEvent )
+        {
+        caps |= VPbkSimStoreImpl::KNotifyEvent;
+        }
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsRestrictedWriteAccess )
+        {
+        caps |= VPbkSimStoreImpl::KRestrictedWriteAccess;
+        }
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsSecondNameUsed )
+        {
+        caps |= VPbkSimStoreImpl::KSecondNameUsed;
+        }
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsAdditionalNumUsed )
+        {
+        caps |= VPbkSimStoreImpl::KAdditionalNumUsed;
+        }
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsGroupingUsed )
+        {
+        caps |= VPbkSimStoreImpl::KGroupingUsed;
+        }
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsEmailAddressUsed )
+        {
+        caps |= VPbkSimStoreImpl::KEmailAddressUsed;
+        }
+    if ( aETelStoreCaps & RMobilePhoneBookStore::KCapsEntryControlUsed )
+        {
+        caps |= VPbkSimStoreImpl::KEntryControlUsed;
+        }
+    return caps; 
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// --------------------------------------------------------------------------
+// CStoreBase::CStoreBase
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// --------------------------------------------------------------------------
+//
+CStoreBase::CStoreBase( TStoreParams& aParams )
+    : iIdentifier( aParams.iId ),
+      iPhone( aParams.iPhone ),
+      iSatNotifier( aParams.iSatNotifier ),
+      iBtSapNotifier( aParams.iBtSapNotifier ),
+      iSimStateInfo( aParams.iSimStateInfo ),
+      iSystemMaxPhoneNumberLength( aParams.iSystemPhoneNumberMaxLength )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ConstructL
+// Symbian 2nd phase constructor can leave.
+// --------------------------------------------------------------------------
+//
+void CStoreBase::ConstructL()
+    {
+    iCmdStore = CVPbkSimCommandStore::NewL( ETrue );
+    iContactArray = new( ELeave ) CContactArray;
+    iOpenOp = CVPbkAsyncObjectOperation<MVPbkSimStoreObserver>::NewL();
+    iCntConverter = CVPbkETelCntConverter::NewL();
+    // Leave shared views alive to offer an efficient view building
+    // for S60 all contacts views.
+    iSharedViewArray = CSharedViewArray::NewL( 
+            CSharedViewArray::EDestroyViewWhenArrayIsDestroyed ); 
+    // Initialize the BtSap status.
+    iIsBtSapActivated = EFalse;
+    }
+    
+// Destructor
+CStoreBase::~CStoreBase()
+    {
+    delete iSharedViewArray;
+    delete iCntConverter;
+    delete iOpenOp;
+    iStoreObservers.Close();
+    delete iETelNotification;
+    delete iPhoneNumberIndex;
+    delete iCmdStore;
+    delete iContactArray;
+    }
+// --------------------------------------------------------------------------
+// CStoreBase::Identifier
+// --------------------------------------------------------------------------
+// 
+TBool CStoreBase::AllowOpeningL()
+    {
+    TBool result = ETrue;
+
+    // If BtSap is activated, not allow the sim server to open the sim store.
+    if( iIsBtSapActivated )
+       {
+       result = EFalse;
+       }
+    
+    return result;
+    }    
+// --------------------------------------------------------------------------
+// CStoreBase::Identifier
+// --------------------------------------------------------------------------
+//
+TVPbkSimStoreIdentifier CStoreBase::Identifier() const
+    {
+    return iIdentifier;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::OpenL
+// --------------------------------------------------------------------------
+//
+void CStoreBase::OpenL( MVPbkSimStoreObserver& aObserver )
+    {
+    TBool sendStoreUnavailableEvent = EFalse;
+    switch ( iStoreState )
+        {
+        case EStoreNotOpen:
+            {
+            // Check if subclass doesn't allow to open store
+            if ( AllowOpeningL() )
+                {
+                ConstructStoreL();    
+                }
+            else
+                {
+                // Send store not available
+                sendStoreUnavailableEvent = ETrue;
+                }
+            break;
+            }
+        case EStoreOpen:
+            {
+            CVPbkAsyncObjectCallback<MVPbkSimStoreObserver>* callback =
+                VPbkEngUtils::CreateAsyncObjectCallbackLC(
+                    *this, 
+                    &CStoreBase::DoStoreOpenCallbackL, 
+                    &CStoreBase::DoStoreErrorCallback, 
+                    aObserver);
+            iOpenOp->CallbackL( callback );
+            CleanupStack::Pop( callback );
+            break;
+            }
+        case EStoreNotAvailable:
+            {
+            // Send store not available
+            //sendStoreUnavailableEvent = ETrue;
+            
+            if ( AllowOpeningL() )
+                {
+                // If the store is not allowed to open, no need to reset the store.
+                // So move the function into the if branch.
+                ResetStore();
+                ConstructStoreL();    
+                }
+            else
+                {
+                // Send store not available
+                sendStoreUnavailableEvent = ETrue;
+                }
+            
+            break;
+            }
+        case EStoreIsOpening: // FALLTHROUGH
+        default:
+            {
+            // Do nothing
+            break;
+            }
+        }
+
+    if ( sendStoreUnavailableEvent )
+        {
+        CVPbkAsyncObjectCallback<MVPbkSimStoreObserver>* callback =
+            VPbkEngUtils::CreateAsyncObjectCallbackLC(
+                *this, 
+                &CStoreBase::DoStoreUnavailableCallbackL, 
+                &CStoreBase::DoStoreErrorCallback, 
+                aObserver);
+        iOpenOp->CallbackL( callback );
+        CleanupStack::Pop( callback );    
+        }
+    
+    iStoreObservers.AppendL( &aObserver );
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::Close
+// --------------------------------------------------------------------------
+//
+void CStoreBase::Close( MVPbkSimStoreObserver& aObserver )
+    {
+    iOpenOp->CancelCallback( &aObserver );
+    
+    const TInt pos = iStoreObservers.Find( &aObserver );
+    if ( pos != KErrNotFound )
+        {
+        iStoreObservers.Remove( pos );
+        if ( iStoreObservers.Count() == 0 )
+            {
+            // Close handles to ETel etc.
+            ResetStore();
+            // Remove from SAT notifier list
+            iSatNotifier.DeActivate( *this );
+            // Remove from BT SAP notifier list
+            iBtSapNotifier.RemoveObserver( *this );
+            // Change state to not open
+            iStoreState = EStoreNotOpen;
+            }
+        }    
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::CreateViewL
+// --------------------------------------------------------------------------
+//
+MVPbkSimCntView* CStoreBase::CreateViewL( 
+        const RVPbkSimFieldTypeArray& aSortOrder,
+        TVPbkSimViewConstructionPolicy aConstructionPolicy,
+        const TDesC& aViewName,
+        CVPbkSimFieldTypeFilter* aFilter )
+    {
+    CleanupStack::PushL( aFilter );
+    
+    MVPbkSimCntView* view = NULL;
+    // Filter is not used if it doesn't contain any filtering criteria.
+   	TBool filterDefined = ( aFilter && 
+   	    aFilter->FilteringCriteria() != 
+   	        CVPbkSimFieldTypeFilter::ESimFilterCriteriaNoFiltering );
+       	        
+    if ( aViewName.Length() > 0 && !filterDefined )
+        {
+        view = iSharedViewArray->CreateNewHandleL( aSortOrder,
+                aConstructionPolicy, *this, aViewName );
+        CleanupStack::PopAndDestroy( aFilter );
+        }
+    else
+        {
+        CVPbkSimContactView* tmp = CVPbkSimContactView::NewLC( aSortOrder, 
+                aConstructionPolicy, *this, KNullDesC, aFilter );
+        CleanupStack::Pop( tmp );
+        CleanupStack::Pop( aFilter );
+        view = tmp;
+        }
+    
+    return view;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::AtL
+// --------------------------------------------------------------------------
+//
+const TDesC8* CStoreBase::AtL( TInt aSimIndex )
+    {
+    const TDesC8* etelContact = NULL;
+    const MVPbkSimContact* contact = ContactAtL( aSimIndex );
+    if ( contact )
+        {
+        etelContact = &contact->ETelContactL();
+        }
+    return etelContact;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ContactAtL
+// --------------------------------------------------------------------------
+//
+const MVPbkSimContact* CStoreBase::ContactAtL( TInt aSimIndex )
+    {
+    const MVPbkSimContact* contact = NULL;
+    if ( aSimIndex > 0 && aSimIndex <= iContactArray->Size() )
+        {
+        contact = iContactArray->At( aSimIndex );
+        }
+    return contact;
+    }
+    
+// --------------------------------------------------------------------------
+// CStoreBase::ContactConverter
+// --------------------------------------------------------------------------
+//
+const CVPbkETelCntConverter& CStoreBase::ContactConverter() const
+    {
+    return *iCntConverter;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::CreateMatchPhoneNumberOperationL
+// --------------------------------------------------------------------------
+//
+MVPbkSimStoreOperation* CStoreBase::CreateMatchPhoneNumberOperationL( 
+    const TDesC& aPhoneNumber, TInt aMaxMatchDigits, 
+    MVPbkSimFindObserver& aObserver )
+    {
+    CNumberMatchOperation* op = CNumberMatchOperation::NewL( aObserver, 
+        *iPhoneNumberIndex, aPhoneNumber, aMaxMatchDigits, *this );
+    op->Execute();
+    return op;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::CreateFindOperationL
+// --------------------------------------------------------------------------
+//
+MVPbkSimStoreOperation* CStoreBase::CreateFindOperationL( 
+    const TDesC& aStringToFind, RVPbkSimFieldTypeArray& aFieldTypes,
+    MVPbkSimFindObserver& aObserver )
+    {
+    CFindOperation* op = 
+        CFindOperation::NewL( aObserver, *this, aStringToFind, aFieldTypes );
+    op->Execute();
+    return op;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::SystemPhoneNumberMaxLength
+// --------------------------------------------------------------------------
+//
+TInt CStoreBase::SystemPhoneNumberMaxLength() const
+    {
+    return iSystemMaxPhoneNumberLength;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ETelStoreChanged
+// --------------------------------------------------------------------------
+//
+TBool CStoreBase::ETelStoreChanged( TInt aSimIndex, TUint32 /*aEvents*/ )
+    {
+    TRAPD( res, HandleStoreEventL( aSimIndex ) );
+    if ( res != KErrNone )
+        {
+        // Store update failed -> all clients should close store
+        SendStoreErrorEvent( res );
+        }
+    return ETrue;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ETelStoreChangeError
+// --------------------------------------------------------------------------
+//
+TBool CStoreBase::ETelStoreChangeError( TInt aError )
+    {
+    SendStoreErrorEvent( aError );
+    return ETrue;    
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ContactAdded
+// --------------------------------------------------------------------------
+//
+void CStoreBase::ContactAdded( MVPbkSimContact& aSimContact )
+    {
+    SendObserverMessageVV( iStoreObservers, 
+        &MVPbkSimStoreObserver::StoreContactEvent, 
+        MVPbkSimStoreObserver::EContactAdded, 
+        aSimContact.SimIndex() );    
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ContactRemoved
+// --------------------------------------------------------------------------
+//
+void CStoreBase::ContactRemoved( MVPbkSimContact& aRemovedContact )
+    {
+    SendObserverMessageVV( iStoreObservers, 
+        &MVPbkSimStoreObserver::StoreContactEvent,
+        MVPbkSimStoreObserver::EContactDeleted, 
+        aRemovedContact.SimIndex() );    
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ContactChanged
+// --------------------------------------------------------------------------
+//
+void CStoreBase::ContactChanged( MVPbkSimContact& /*aOldContact*/,
+    MVPbkSimContact& aNewContact )
+    {
+    SendObserverMessageVV( iStoreObservers, 
+        &MVPbkSimStoreObserver::StoreContactEvent,
+        MVPbkSimStoreObserver::EContactChanged,
+        aNewContact.SimIndex() );    
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::CancelRequests
+// --------------------------------------------------------------------------
+//
+void CStoreBase::CancelRequests()
+    {
+    if ( iETelNotification )
+        {
+        iETelNotification->Cancel();
+        }
+    if ( iCmdStore ) 
+        {
+        iCmdStore->CancelAll();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::AddGetInfoCmdToChainL
+// --------------------------------------------------------------------------
+//
+void CStoreBase::AddGetInfoCmdToChainL( CCompositeCmdBase& aCmdChain )
+    {
+    CGetInfoCmd* getInfoCmd = CGetInfoCmd::NewLC( *this );
+    aCmdChain.AddSubCommandL( getInfoCmd );
+    CleanupStack::Pop( getInfoCmd );
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ResetStore
+// --------------------------------------------------------------------------
+//
+void CStoreBase::ResetStore()
+    {
+    VPBK_DEBUG_PRINT(
+        VPBK_DEBUG_STRING("CPbkSimStoreImpl:CStoreBase::ResetStore"));
+    
+    CancelRequests();
+    CloseETelStore();
+    if ( iPhoneNumberIndex )
+        {
+        iContactArray->RemoveObserver( *iPhoneNumberIndex );
+        }
+    iContactArray->RemoveObserver( *this );
+    iContactArray->DeleteAll();
+    iStoreState = EStoreNotOpen;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ConstructStoreL
+// --------------------------------------------------------------------------
+//
+void CStoreBase::ConstructStoreL()
+    {
+    OpenETelStoreL();
+    MVPbkSimCommand* initCmd = CreateInitCommandL( *this );
+    // Store takes the ownership of the command
+    iCmdStore->AddAndExecuteCommandL( initCmd );
+    iStoreState = EStoreIsOpening;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::SendStoreReadyEvent
+// --------------------------------------------------------------------------
+//
+void CStoreBase::SendStoreReadyEvent()
+    {
+    // Cancel all async open operations
+    iOpenOp->Purge();
+    iStoreState = EStoreOpen;
+    SendObserverMessageR( iStoreObservers, 
+        &MVPbkSimStoreObserver::StoreReady, *this );
+    }
+        
+// --------------------------------------------------------------------------
+// CStoreBase::SendStoreUnavailableEvent
+// --------------------------------------------------------------------------
+//
+void CStoreBase::SendStoreUnavailableEvent()
+    {
+    // Cancel all async open operations
+    iOpenOp->Purge();
+    iStoreState = EStoreNotAvailable;
+    SendObserverMessageR( iStoreObservers, 
+        &MVPbkSimStoreObserver::StoreNotAvailable, *this );
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::SendStoreErrorEvent
+// --------------------------------------------------------------------------
+//
+void CStoreBase::SendStoreErrorEvent( TInt aError )
+    {
+    // Cancel all async open operations
+    iOpenOp->Purge();
+    iStoreState = EStoreNotAvailable;
+    SendObserverMessageRV( iStoreObservers, 
+        &MVPbkSimStoreObserver::StoreError, *this, aError );
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::CommandDone
+// --------------------------------------------------------------------------
+//
+void CStoreBase::CommandDone( MVPbkSimCommand& /*aCommand*/ )
+    {
+    if ( iSimRefreshCompletion )
+        {
+        CompleteSATRefresh( *iSimRefreshCompletion );
+        iSimRefreshCompletion = NULL;
+        }
+
+    TRAPD( result, PostConstructStoreL() );
+    if ( result != KErrNone )
+        {
+        ResetStore();
+        SendStoreErrorEvent( result );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::CommandError
+// --------------------------------------------------------------------------
+//
+void CStoreBase::CommandError( MVPbkSimCommand& /*aCommand*/, 
+    TInt aError )
+    {
+    if ( iSimRefreshCompletion )
+        {
+        CompleteSATRefresh( *iSimRefreshCompletion );
+        iSimRefreshCompletion = NULL;
+        }
+
+    ResetStore();
+    SendStoreErrorEvent( aError );
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::SimRefreshed
+// --------------------------------------------------------------------------
+//
+void CStoreBase::SimRefreshed( TUint32 aSimRefreshFlags, 
+        MSimRefreshCompletion& aSimRefreshCompletion )
+    {
+    VPBK_DEBUG_PRINT(
+        VPBK_DEBUG_STRING("CPbkSimStoreImpl:CStoreBase::SimRefreshed"));
+    
+    if ( aSimRefreshFlags & ElementaryFiles() )
+        {
+        ResetStore();
+        TRAPD( res, ConstructStoreL() );
+        if ( res == KErrNone )
+            {
+            SendStoreUnavailableEvent();
+            }
+        else
+            {
+            SendStoreErrorEvent( res );
+            }
+        iSimRefreshCompletion = &aSimRefreshCompletion;
+        }
+    else
+        {
+        // Must always complete.
+        aSimRefreshCompletion.SatRefreshCompleted( *this, EFalse );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::AllowRefresh
+// --------------------------------------------------------------------------
+//
+TBool CStoreBase::AllowRefresh( TUint32 aSimRefreshFlags )
+    {
+    if ( iCmdStore->Executing() && aSimRefreshFlags & ElementaryFiles() )
+        {
+        // Don't allow refresh if there is a command running
+        return EFalse;
+        }
+    return ETrue;
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::ElementaryFiles
+// --------------------------------------------------------------------------
+//
+TUint32 CStoreBase::ElementaryFiles()
+    {
+    // base class returns 0, sub class overwrites and returns files it uses
+    return 0;
+    }
+    
+// --------------------------------------------------------------------------
+// CStoreBase::BtSapActivated
+// --------------------------------------------------------------------------
+//
+void CStoreBase::BtSapActivated()
+    {
+    iIsBtSapActivated = ETrue;
+    if ( iStoreState == EStoreOpen || iStoreState == EStoreIsOpening )
+        {
+        SendStoreUnavailableEvent();
+        ResetStore();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::BtSapDeactivated
+// --------------------------------------------------------------------------
+//
+void CStoreBase::BtSapDeactivated()
+    {
+    iIsBtSapActivated = EFalse;
+    TRAPD( res, HandleBtSapDeactivationL() );
+    if ( res != KErrNone )
+        {
+        SendStoreErrorEvent( res );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::BtSapNotificationError
+// --------------------------------------------------------------------------
+//
+void CStoreBase::BtSapNotificationError( TInt aError )
+    {
+    SendStoreErrorEvent( aError );
+    }
+        
+// --------------------------------------------------------------------------
+// CStoreBase::PostConstructStoreL
+// --------------------------------------------------------------------------
+//
+void CStoreBase::PostConstructStoreL()
+    {
+    // Reserve memory for contacts
+    iContactArray->ReserveL( ETelStoreInfo().iTotalEntries );
+    // Start listen to contact array events
+    iContactArray->AddObserverL( *this );
+    
+    // Create or rebuild the phone number index that is used for 
+    // number matching
+    if ( !iPhoneNumberIndex )
+        {
+        iPhoneNumberIndex = CSimPhoneNumberIndex::NewL( *this );
+        }
+    else
+        {
+        iPhoneNumberIndex->ReBuildL();
+        }
+    // Set number index to listen contact array events
+    iContactArray->AddObserverL( *iPhoneNumberIndex );
+    
+    // Create an ETel store notifier if the ETel store supports it.
+    if ( !iETelNotification )
+        {
+        TVPbkGsmStoreProperty prop;
+        GetGsmStoreProperties( prop );
+        if ( prop.iCaps & KNotifyEvent )
+            {
+            iETelNotification = new( ELeave ) CETelStoreNotification( *this );
+            iETelNotification->Activate();
+            }
+        }
+    else
+        {
+        iETelNotification->Activate();
+        }
+    
+    // Start listen to SIM application toolkit (SAT) refresh events
+    iSatNotifier.ActivateL( *this );
+    // Start listen to Bluetoot SIM Access profile (BT SAP) events
+    iBtSapNotifier.AddObserverL( *this );
+    
+    // Postconstruction done -> store is ready for use
+    SendStoreReadyEvent();
+    }
+    
+// --------------------------------------------------------------------------
+// CStoreBase::HandleStoreEventL
+// --------------------------------------------------------------------------
+//
+void CStoreBase::HandleStoreEventL( TInt aSimIndex )
+    {
+    MVPbkSimCommand* updateCmd = CreateUpdateCommandL( aSimIndex );
+    // Store takes the ownership of the command and executes it.
+    iCmdStore->AddAndExecuteCommandL( updateCmd );
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::HandleBtSapDeactivationL
+// --------------------------------------------------------------------------
+//        
+void CStoreBase::HandleBtSapDeactivationL()
+    {
+    if ( iStoreState == EStoreNotOpen ||
+         iStoreState == EStoreNotAvailable  )
+        {
+        ConstructStoreL();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::DoStoreOpenCallbackL
+// --------------------------------------------------------------------------
+//        
+void CStoreBase::DoStoreOpenCallbackL( MVPbkSimStoreObserver& aObserver )
+    {
+    aObserver.StoreReady( *this );
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::DoStoreUnavailableCallbackL
+// --------------------------------------------------------------------------
+//        
+void CStoreBase::DoStoreUnavailableCallbackL( 
+        MVPbkSimStoreObserver& aObserver )
+    {
+    aObserver.StoreNotAvailable( *this );
+    }
+
+// --------------------------------------------------------------------------
+// CStoreBase::DoStoreErrorCallback
+// --------------------------------------------------------------------------
+//            
+void CStoreBase::DoStoreErrorCallback( MVPbkSimStoreObserver& aObserver, 
+        TInt aError )
+    {
+    aObserver.StoreError( *this, aError );
+    }
+} // namespace VPbkSimStoreImpl
+//  End of File