diff -r 000000000000 -r 8e480a14352b messagingfw/alwaysonline/AlwaysOnlineManager/src/AOCenRepControl.cpp --- /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 +#include +#include +#include // 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& 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