messagingfw/alwaysonline/AlwaysOnlineManager/src/AOCenRepControl.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/alwaysonline/AlwaysOnlineManager/src/AOCenRepControl.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,465 @@
+/*
+* Copyright (c) 2006 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: AlwaysOnline server Central Repository controller
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <centralrepository.h>
+#include <cenrepnotifyhandler.h>
+#include <CoreApplicationUIsSDKCRKeys.h>   // Offline key
+
+#include "AOCenRepControl.h"
+#include "AOInternalCRKeys.h"
+#include "AlwaysOnlineManagerLogging.h"
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+const TUint32 KDisabledPluginsBaseKey = 0x00000100;
+const TUint32 KDisabledPluginsLastKey = 0x000001FF;
+const TUint32 KCoreAppUiRepository = 0x101F876C;
+
+#ifdef _DEBUG   // Just to make compiler happy!
+_LIT( KAOSetPanic, "AO cenrep set" );
+_LIT( KAOGetPanic, "AO cenrep get" );
+_LIT( KAODelPanic, "AO cenrep del" );
+#endif
+
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::CAOCenRepControl()
+// ----------------------------------------------------------------------------
+//
+CAOCenRepControl::CAOCenRepControl( CAlwaysOnlineManager& aCallBack ) : 
+    iCallBack( aCallBack )
+    {
+    KAOMANAGER_LOGGER_FN1("CAOCenRepControl::CAOCenRepControl()");
+    KAOMANAGER_LOGGER_FN2("CAOCenRepControl::CAOCenRepControl()");
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::~CAOCenRepControl()
+// ----------------------------------------------------------------------------
+//
+CAOCenRepControl::~CAOCenRepControl()
+    {
+    if ( iCoreAppUiCenRepNotifier )
+        {
+        iCoreAppUiCenRepNotifier->StopListening();
+        }
+    
+    delete iCoreAppUiCenRepNotifier;
+    iCoreAppUiCenRepNotifier = NULL;
+    
+    delete iCoreAppUiCenRepSession;    
+    iCoreAppUiCenRepSession = NULL;
+    
+    delete iAoServerCenRepSession;
+    iAoServerCenRepSession = NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CAOCenRepControl::ConstructL()
+    {
+    // Create Core App Ui Central Repository session and notifier
+    CreateCoreAppUiCenRepSessionL();
+    
+    // Create AoServer Central Repository session
+    CreateAoServerCenRepSessionL();
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::NewL()
+// ----------------------------------------------------------------------------
+//
+CAOCenRepControl* CAOCenRepControl::NewL( CAlwaysOnlineManager& aCallBack )
+    {
+    CAOCenRepControl* self = NewLC( aCallBack );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::NewLC()
+// ----------------------------------------------------------------------------
+//
+CAOCenRepControl* CAOCenRepControl::NewLC( CAlwaysOnlineManager& aCallBack )
+    {
+    CAOCenRepControl* self = new ( ELeave ) CAOCenRepControl( aCallBack );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+    
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::CreateAoServerCenRepSessionL()
+// ----------------------------------------------------------------------------    
+//   
+void CAOCenRepControl::CreateAoServerCenRepSessionL()
+    {
+    KAOMANAGER_LOGGER_FN1("CAOCenRepControl::CreateAoServerCenRepSessionL()");
+    
+    // Create the session if not yet exist.
+    if ( !iAoServerCenRepSession )
+        {
+        iAoServerCenRepSession = CRepository::NewL( KCRUidAOSettings );
+        }
+    
+    KAOMANAGER_LOGGER_FN2("CAOCenRepControl::CreateAoServerCenRepSessionL()");
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::SetCenRepKey()
+// ----------------------------------------------------------------------------    
+//   
+TInt CAOCenRepControl::SetCenRepKey( 
+    const TUid& aRepository, const TUint32 aKeyId, TInt aValue )
+    {
+    TInt result = KErrNotFound;
+    
+    switch ( aRepository.iUid )
+        {
+        case KCRAOSettings:
+            result = iAoServerCenRepSession->Set( aKeyId, aValue );
+            break;
+        case KCoreAppUiRepository:
+            result = iCoreAppUiCenRepSession->Set( aKeyId, aValue );
+            break;
+        default:
+            __ASSERT_DEBUG( EFalse, User::Panic( KAOSetPanic, KErrNotSupported ) );
+            break;
+        }
+        
+    return result;
+    }
+    
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::GetCenRepKey()
+// ----------------------------------------------------------------------------    
+//   
+TInt CAOCenRepControl::GetCenRepKey(
+    const TUid& aRepository, const TUint32 aKeyId, TInt& aValue )
+    {
+    TInt result = KErrNotFound;
+    
+    switch ( aRepository.iUid )
+        {
+        case KCRAOSettings:
+            result = iAoServerCenRepSession->Get( aKeyId, aValue );
+            break;
+        case KCoreAppUiRepository:
+            result = iCoreAppUiCenRepSession->Get( aKeyId, aValue );
+            break;
+        default:
+            __ASSERT_DEBUG( EFalse, User::Panic( KAOGetPanic, KErrNotSupported ) );
+            break;
+        }
+    
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::DelCenRepKey()
+// ----------------------------------------------------------------------------    
+//   
+TInt CAOCenRepControl::DelCenRepKey( 
+    const TUid& aRepository, 
+    const TUint32 aKeyId )
+    {
+    TInt result = KErrNotFound;
+    
+    switch ( aRepository.iUid )
+        {
+        case KCRAOSettings:
+            result = iAoServerCenRepSession->Delete( aKeyId );
+            break;
+        case KCoreAppUiRepository:
+            result = iCoreAppUiCenRepSession->Delete( aKeyId );
+            break;
+        default:
+            __ASSERT_DEBUG( EFalse, User::Panic( KAODelPanic, KErrNotSupported ) );
+            break;
+        }
+    
+    return result;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::CreateCoreAppUiCenRepSessionL()
+// ----------------------------------------------------------------------------    
+//   
+void CAOCenRepControl::CreateCoreAppUiCenRepSessionL()
+    {
+    KAOMANAGER_LOGGER_FN1("CAOCenRepControl::CreateCoreAppUiCenRepSessionL()");
+    // Create the session
+    iCoreAppUiCenRepSession = CRepository::NewL( KCRUidCoreApplicationUIs );
+    
+    // Create the notifer
+    iCoreAppUiCenRepNotifier = 
+        CCenRepNotifyHandler::NewL( 
+            iCallBack, *iCoreAppUiCenRepSession, CCenRepNotifyHandler::EIntKey,
+            KCoreAppUIsNetworkConnectionAllowed  );
+            
+    // Start listening
+    iCoreAppUiCenRepNotifier->StartListeningL();
+    
+    KAOMANAGER_LOGGER_FN2("CAOCenRepControl::CreateCoreAppUiCenRepSessionL()");        
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::ReCreateCoreAppUiCenRepSessionL()
+// ----------------------------------------------------------------------------    
+//   
+void CAOCenRepControl::ReCreateCoreAppUiCenRepSessionL()
+    {
+    KAOMANAGER_LOGGER_FN1("CAOCenRepControl::ReCreateCoreAppUiCenRepSessionL()");
+    // Remove session and notifier
+    if ( iCoreAppUiCenRepNotifier )
+        {
+        iCoreAppUiCenRepNotifier->StopListening();
+        }
+    
+    delete iCoreAppUiCenRepNotifier;
+    iCoreAppUiCenRepNotifier = NULL;
+    
+    delete iCoreAppUiCenRepSession;    
+    iCoreAppUiCenRepSession = NULL;
+    
+    // Create new session
+    CreateCoreAppUiCenRepSessionL();
+    
+    KAOMANAGER_LOGGER_FN2("CAOCenRepControl::ReCreateCoreAppUiCenRepSessionL()");
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::UpdateDisabledPluginsUids()
+// ----------------------------------------------------------------------------    
+//   
+void CAOCenRepControl::UpdateDisabledPluginsUids( 
+    CArrayFixFlat<TUid>& aDisabledPluginUidsArray )
+    {
+    KAOMANAGER_LOGGER_FN1("CAOCenRepControl::UpdateDisabledPluginsUids()");
+    // Reset to original state
+    aDisabledPluginUidsArray.Reset();
+
+    // Key #1 indicates the number of disabled plugin
+    TInt count = 0;
+    TInt result = GetCenRepKey(
+        KCRUidAOSettings,
+        KAODisabledPluginsCount, 
+        count );
+    
+    KAOMANAGER_LOGGER_WRITE_FORMAT("CAOCenRepControl::UpdateDisabledPluginsUids() Disabled plugins count: %d", count);
+    
+    // Is there any disabled plugins?
+    if ( count > 0 )
+        {
+        TInt value = 0;
+        TInt error = KErrNone;
+        TUint32 key = KDisabledPluginsBaseKey;
+        
+        for ( ; key <= KDisabledPluginsLastKey; key++ )
+            {
+            error = GetCenRepKey(
+                KCRUidAOSettings,
+                key,
+                value );
+                
+            // If no errors, then index have an UID and it can be appended
+            // to disabled plugins array.
+            if ( error == KErrNone && value != KErrNotFound )
+                {
+                TRAPD( err, aDisabledPluginUidsArray.AppendL( TUid::Uid( value ) ) )
+                // If AppendL returns error (most propably memory full) then we
+                // don't set plugin as disabled. Delete the key from cenrep.
+                if ( err != KErrNone )
+                    {
+                    KAOMANAGER_LOGGER_WRITE_FORMAT("CAOCenRepControl::UpdateDisabledPluginsUids() AppendL failed, err =  %d", err);
+                    // Enable plugin
+                    SetPluginStatus( TUid::Uid( value ), EFalse );
+                    }
+                KAOMANAGER_LOGGER_WRITE_FORMAT("CAOCenRepControl::UpdateDisabledPluginsUids() found disabled plugin, UID: 0x%x", TUid::Uid( value ));
+                }
+            // Have we found all the disabled plugins?
+            if ( aDisabledPluginUidsArray.Count() == count )
+                {
+                // We already found all the UIDs of the disabled plugins,
+                // so we can jump out from the loop.
+                break;
+                }
+            }
+        }
+        
+    KAOMANAGER_LOGGER_FN2("CAOCenRepControl::UpdateDisabledPluginsUids()");
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::SetPluginStatus()
+// ----------------------------------------------------------------------------    
+//  
+void CAOCenRepControl::SetPluginStatus( const TUid& aPlugin, TBool aDisable )
+    {
+    KAOMANAGER_LOGGER_FN1("CAOCenRepControl::SetPluginStatus()");
+    KAOMANAGER_LOGGER_WRITE_FORMAT("CAOCenRepControl::SetPluginStatus() aPlugin: 0x%x", aPlugin);
+    KAOMANAGER_LOGGER_WRITE_FORMAT("CAOCenRepControl::SetPluginStatus() aDisable: %d", aDisable);
+    
+    TInt result = KErrNone;
+    TUint32 key;
+    
+    if ( aDisable )
+        {
+        // Get first free key for disabled plugins UIDs
+        if ( GetFirstFreeKey( key ) )
+            {
+            // Set aPlugin to first free key
+            result = SetCenRepKey( KCRUidAOSettings, key, aPlugin.iUid );
+            }
+            
+        // Update disabled plugins count
+        if ( result == KErrNone )
+            {
+            UpdateDisabledPluginsCount( ETrue );
+            }
+        }
+    else
+        {
+        // Find correct cenrep key, which have value aPlugin as a value.
+        if ( GetKeyWithValue( aPlugin, key ) )
+            {
+            // Delete the found cenrep key
+            result = DelCenRepKey( KCRUidAOSettings, key );
+            }
+            
+        // Update disabled plugins count
+        if ( result == KErrNone )
+            {
+            UpdateDisabledPluginsCount( EFalse );
+            }
+        }
+    
+    KAOMANAGER_LOGGER_FN2("CAOCenRepControl::SetPluginStatus()");
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::GetFirstFreeKey()
+// ----------------------------------------------------------------------------    
+//  
+TBool CAOCenRepControl::GetFirstFreeKey( TUint32& aFreeKey )
+    {
+    TInt error = KErrNone;
+    TInt value = 0;
+    TBool found = EFalse;
+    TInt key = KDisabledPluginsBaseKey;
+    
+    while( !found && key <= KDisabledPluginsLastKey )
+        {
+        error = GetCenRepKey( 
+            KCRUidAOSettings, 
+            key, 
+            value );
+            
+        if ( error == KErrNotFound )
+            {
+            aFreeKey = key;
+            found = ETrue;
+            KAOMANAGER_LOGGER_WRITE_FORMAT("CAOCenRepControl::GetFirstFreeKey() aFreeKey: 0x%x", aFreeKey);
+            }
+            
+        key++;
+        }
+    
+    return found;
+    }
+
+// ----------------------------------------------------------------------------
+// CAOCenRepControl::GetKeyWithValue()
+// ----------------------------------------------------------------------------    
+// 
+TBool CAOCenRepControl::GetKeyWithValue( 
+    const TUid& aValue, 
+    TUint32& aKey )
+    {
+    TInt error = KErrNone;
+    TInt value = 0;
+    TBool found = EFalse;
+    TInt loopKey = KDisabledPluginsBaseKey;
+    
+    KAOMANAGER_LOGGER_WRITE_FORMAT("CAOCenRepControl::GetKeyWithValue() Searching value: 0x%x", aValue);
+    
+    while ( !found && loopKey <= KDisabledPluginsLastKey )
+        {
+        error = GetCenRepKey( 
+            KCRUidAOSettings, 
+            loopKey, 
+            value );
+            
+        if ( error == KErrNone && aValue.iUid == value )
+            {
+            aKey = loopKey;
+            found = ETrue;
+            KAOMANAGER_LOGGER_WRITE_FORMAT("CAOCenRepControl::GetKeyWithValue() Found in key: 0x%x", aKey);
+            }
+        loopKey++;
+        value = 0;
+        }
+
+    return found;
+    }
+ 
+ // ----------------------------------------------------------------------------
+// CAOCenRepControl::UpdateDisabledPluginsCount()
+// ----------------------------------------------------------------------------    
+//    
+TInt CAOCenRepControl::UpdateDisabledPluginsCount( TBool aIncrease )
+    {
+    KAOMANAGER_LOGGER_FN1("CAOCenRepControl::UpdateDisabledPluginsCount()");
+    TInt count = 0;
+    TInt result = GetCenRepKey(
+        KCRUidAOSettings,
+        KAODisabledPluginsCount, 
+        count );
+
+    if ( result == KErrNone )
+        {
+        aIncrease ? count++ : count--;
+        
+        result = SetCenRepKey( 
+            KCRUidAOSettings, 
+            KAODisabledPluginsCount, 
+            count );
+            
+        KAOMANAGER_LOGGER_WRITE_FORMAT("CAOCenRepControl::UpdateDisabledPluginsCount() count: %d", count);
+        }
+
+    KAOMANAGER_LOGGER_FN2("CAOCenRepControl::UpdateDisabledPluginsCount()");
+    
+    return result;
+    }
+// End of File