phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CSatRefreshNotifier.cpp
branchRCL_3
changeset 20 f4a778e096c2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CSatRefreshNotifier.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,484 @@
+/*
+* 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:  A notifier that gets refresh events from the SAT server
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CSatRefreshNotifier.h"
+
+#include <rsatsession.h>
+#include <rsatrefresh.h>
+#include <VPbkDebug.h>
+#include "MSimRefreshObject.h"
+
+namespace VPbkSimStoreImpl {
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+namespace {
+// -----------------------------------------------------------------------------
+// ConvertFromSatFormat() Converts from SAT server format to own format
+// -----------------------------------------------------------------------------
+//
+TUint32 ConvertFromSatFormat(
+    const TSatRefreshFiles& aFiles )  // List of files which has been refreshed
+    {
+    FUNC_ENTRY();
+    TUint32 result = 0;
+		
+    // KAdnEf -> KADNRefresh
+    TChar ef( KAdnEf );
+    if ( aFiles.Locate( ef ) != KErrNotFound )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 1"));    
+        result |= KADNRefresh;
+        }
+        
+    // KExt1Ef -> KADNExtRefresh
+    ef = KExt1Ef;
+    if ( aFiles.Locate( ef ) != KErrNotFound )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 2"));    
+        result |= KADNExtRefresh;
+        }
+    
+    // KFdnEf -> KFDNRefresh
+    ef = KFdnEf;
+    if ( aFiles.Locate( ef ) != KErrNotFound )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 3"));    
+        result |= KFDNRefresh;
+        }
+    
+    // KExt2Ef -> KFDNExtRefresh
+    ef = KExt2Ef;
+    if ( aFiles.Locate( ef ) != KErrNotFound )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 4"));    
+        result |= KFDNExtRefresh;
+        }
+    
+    // KSdnEf -> KSDNRefresh
+    ef = KSdnEf;
+    if ( aFiles.Locate( ef ) != KErrNotFound )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 5"));    
+        result |= KSDNRefresh;
+        }
+    
+    // KExt3Ef -> KSDNExtRefresh
+    ef = KExt3Ef;
+    if ( aFiles.Locate( ef ) != KErrNotFound )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 6"));    
+        result |= KSDNExtRefresh;
+        }
+    
+    // KSstEf -> KSTRefresh
+    ef = KSstEf;
+    if ( aFiles.Locate( ef ) != KErrNotFound )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 7"));    
+        result |= KSTRefresh;
+        }
+        
+    // KMsisdnEf -> KONRefresh
+    ef = KMsisdnEf;
+    if ( aFiles.Locate( ef ) != KErrNotFound )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 8"));    
+        result |= KONRefresh;
+        }
+        
+    // KExt5Ef -> KONExtRefresh
+    ef = KExt5Ef;
+    if ( aFiles.Locate( ef ) != KErrNotFound )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 9"));    
+        result |= KONExtRefresh;
+        }
+        
+    // Check all 0x4FXX files     
+    const TInt count( aFiles.Length() );
+    for( TInt i(0); i < count; ++i )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat 10"));    
+        if ( !(0x4F ^ aFiles[i] >> 8 ) )
+            {
+            VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+                "VPbkSimStoreImpl: ConvertFromSatFormat 11"));    
+            // USIM ADN file updated
+            result |= KADNRefresh;
+            result |= KADNExtRefresh;
+            }
+        }        
+    FUNC_EXIT();
+    return result;    
+    }
+
+TUint32 ConvertFromSatFormat(
+    const TSatRefreshType& aType )  // List of files which has been refreshed
+    {
+    FUNC_ENTRY();
+    TUint result(0);
+
+    if( aType == ESimReset )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat ESimReset"));
+        result |= KSimReset;
+        }
+
+    if( aType == ESimInitFullFileChangeNotification )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat ESimInitFullFileChangeNotification"));
+        result |= KSimInitFullFileChangeNotification;
+        }
+
+    if( aType == EUsimApplicationReset )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat EUsimApplicationReset"));
+        result |= KUsimApplicationReset;
+        }
+
+    if( aType == E3GSessionReset )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat E3GSessionReset"));
+        result |= K3GSessionReset;
+        }
+
+    if( aType == ESimInit )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: ConvertFromSatFormat ESimInit"));
+        result |= KSimInit;
+        }
+
+    FUNC_EXIT();
+    return result;
+    }
+
+
+} // unnamed namespace
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+NONSHARABLE_CLASS(CSatRefreshNotifier::CSatSession) :    public CBase
+    {
+    public:  // Constructors and destructor
+        CSatSession( MSatRefreshObserver& aSatObserver );
+        ~CSatSession();
+
+    public: // New functions
+        /**
+        * Opens SAT session
+        */
+        void OpenL();
+        
+        /**
+        * Returns ETrue if session has been opened
+        */
+        TBool IsOpen();
+        
+        /**
+        * @return the refresh subsession
+        */
+        RSatRefresh& Refresh();
+        
+    private:    // Data
+        /// The main session to SAT server
+        RSatSession iSatSession;
+        /// The subsession that implements SAT refresh notifying
+        RSatRefresh iSatRefresh;
+        TBool iIsOpen;
+    };
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::CSatSession::CSatSession
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSatRefreshNotifier::CSatSession::CSatSession( MSatRefreshObserver& aSatObserver )
+:   iSatRefresh( aSatObserver )
+    {
+    }
+
+// Destructor
+CSatRefreshNotifier::CSatSession::~CSatSession()
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::~CSatSession,\
+        Cancel refresh h%d"),
+        iSatRefresh.SubSessionHandle() );
+    iSatRefresh.Cancel();
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::~CSatSession,\
+        Close refresh h%d"), 
+        iSatRefresh.SubSessionHandle() );
+    iSatRefresh.Close();
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::~CSatSession,\
+        Close session h%d"), 
+        iSatSession.Handle() );
+    iSatSession.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::CSatSession::OpenL
+// -----------------------------------------------------------------------------
+//
+void CSatRefreshNotifier::CSatSession::OpenL()
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::OpenL"));
+    iSatSession.ConnectL();
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::OpenL, Session Connected h%d"), 
+        iSatSession.Handle() );
+    iSatRefresh.OpenL( iSatSession );
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::CSatSession::OpenL, Refresh Opened h%d"), 
+        iSatRefresh.SubSessionHandle() );
+    iIsOpen = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::CSatSession::IsOpen
+// -----------------------------------------------------------------------------
+//
+TBool CSatRefreshNotifier::CSatSession::IsOpen()
+    {
+    return iIsOpen;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::CSatSession::Refresh
+// -----------------------------------------------------------------------------
+//
+RSatRefresh& CSatRefreshNotifier::CSatSession::Refresh()
+    {
+    return iSatRefresh;
+    }
+        
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::CSatRefreshNotifier
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSatRefreshNotifier::CSatRefreshNotifier()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSatRefreshNotifier::ConstructL()
+    {
+    iSatSession = new( ELeave ) CSatSession( *this );
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSatRefreshNotifier* CSatRefreshNotifier::NewL()
+    {
+    CSatRefreshNotifier* self = new( ELeave ) CSatRefreshNotifier;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+    
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::~CSatRefreshNotifier
+// -----------------------------------------------------------------------------
+//
+CSatRefreshNotifier::~CSatRefreshNotifier()
+    {
+    delete iSatSession;
+    iObjects.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::IsActive
+// -----------------------------------------------------------------------------
+//
+TBool CSatRefreshNotifier::IsActive()
+    {
+    return iSatSession->IsOpen();
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::ActivateL
+// -----------------------------------------------------------------------------
+//
+void CSatRefreshNotifier::ActivateL( MSimRefreshObject& aSimRefreshObject )
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::ActivateL"));
+        
+    // Open the session to SAT server if not opened
+    if ( !iSatSession->IsOpen() )
+        {
+        iSatSession->OpenL();
+        }
+    
+    // Listen to all changes
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::ActivateL: NotifyFileChangeL ALL"));
+    iSatSession->Refresh().NotifyFileChangeL();
+
+    if ( iObjects.Find( &aSimRefreshObject ) == KErrNotFound )
+        {
+        iObjects.AppendL( &aSimRefreshObject );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::DeActivate
+// -----------------------------------------------------------------------------
+//
+void CSatRefreshNotifier::DeActivate( MSimRefreshObject& aSimRefreshObject )
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::DeActivate"));
+        
+    TInt index = iObjects.Find( &aSimRefreshObject );
+    if ( index != KErrNotFound )
+        {
+        iObjects.Remove( index );
+        }
+        
+    // Cancel the request if session is open and this was the last object
+    if ( iSatSession->IsOpen() && iObjects.Count() == 0 )
+        {
+        iSatSession->Refresh().Cancel();        
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::AllowRefresh
+// -----------------------------------------------------------------------------
+//
+TBool CSatRefreshNotifier::AllowRefresh( TSatRefreshType aType, 
+    const TSatRefreshFiles& aFiles )
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::AllowRefresh:type=%d, aFiles=%S"), 
+        aType,&aFiles);
+    // First check files...
+    TUint32 flags = ConvertFromSatFormat( aFiles );
+    // ...and then refresh types
+    flags |= ConvertFromSatFormat( aType );
+
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::AllowRefresh:Converted flags=%x"), 
+        flags);
+    
+    TBool result = ETrue;
+    const TInt count = iObjects.Count();
+    for( TInt i = count - 1; i >= 0 && result; --i )
+        {
+        if ( !iObjects[i]->AllowRefresh( flags ) )
+            {
+            result = EFalse;
+            }
+        }
+
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::AllowRefresh:return %d"), 
+            result);
+    // The refresh doesn't necessary start
+    // because other clients or TSY can deny the refresh.
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::Refresh
+// -----------------------------------------------------------------------------
+//
+void CSatRefreshNotifier::Refresh( TSatRefreshType aType,
+    const TSatRefreshFiles& aFiles )
+    {
+    FUNC_ENTRY();
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::Refresh:type=%d, aFiles=%S"), 
+        aType,&aFiles);
+        
+    // Refresh has happened. Clients must update their content
+    iRefreshedObjects = 0;
+    iAdditionalEFsRead = EFalse;
+    // First check files... 
+    TUint32 flags = ConvertFromSatFormat( aFiles );
+    // ...and then refresh types
+    flags |= ConvertFromSatFormat( aType );
+
+    const TInt count = iObjects.Count();
+    for( TInt i = count - 1; i >= 0; --i )
+        {
+        iObjects[i]->SimRefreshed( flags, *this );
+        }
+    FUNC_EXIT();
+    }
+
+// -----------------------------------------------------------------------------
+// CSatRefreshNotifier::SatRefreshCompleted
+// -----------------------------------------------------------------------------
+//
+void CSatRefreshNotifier::SatRefreshCompleted( 
+        MSimRefreshObject& /*aSimRefreshObject*/,
+        TBool aReadAdditionalFiles )
+    {
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl:CSatRefreshNotifier::SatRefreshCompleted:total=%d,cur=%d"), 
+        iObjects.Count(), iRefreshedObjects + 1);
+        
+    ++iRefreshedObjects;
+    if ( aReadAdditionalFiles )
+        {
+        iAdditionalEFsRead = ETrue;
+        }
+    
+    // Complete refresh to SAT server when all the objects have completed
+    if ( iRefreshedObjects == iObjects.Count() )
+        {
+        iSatSession->Refresh().RefreshEFRead( iAdditionalEFsRead );
+        }
+    }
+} // namespace VPbkSimStoreImpl
+//  End of File