diff -r 35488577e233 -r 2fa1fa551b0b cbs/CbsServer/ServerSrc/CCbsDbImpSettings.cpp --- a/cbs/CbsServer/ServerSrc/CCbsDbImpSettings.cpp Mon Aug 23 15:50:31 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,476 +0,0 @@ -/* -* Copyright (c) 2003 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: This module contains the implementation of CCbsDbImpSettings class -* member functions. -* -* This class represents CBS settings stored in the database. -* A functionality is provided here to access, modify, store and restore -* settings. -* -*/ - - -// INCLUDE FILES -#include -#include "CbsServerPrivateCRKeys.h" -#include "MCbsDbSettingsObserver.H" -#include "CbsServerPanic.h" -#include "CCbsDbImpSettings.H" -#include "CbsDbConstants.h" -#include "CbsStreamHelper.h" -#include "CbsUtils.h" -#include "CbsLogger.h" - -// CONSTANTS -// Used if languages cannot be read from Shared Data. -const TInt8 KDefaultsLanguageSubscribedValue = '1'; - - -// ================= MEMBER FUNCTIONS ======================= - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::CCbsDbImpSettings -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CCbsDbImpSettings::CCbsDbImpSettings( - CCbsDbImp& aDatabase ) - : iDatabase( aDatabase ) - { - } - -// ----------------------------------------------------------------------------- -// CCbsDbImp::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::ConstructL() - { - // Create an array for settings event observers. - iObservers = new ( ELeave ) CArrayFixFlat< MCbsDbSettingsObserver* >( - KCbsDbObserverArraySize ); - - TRAPD( result, LoadSettingsL() ); - if ( result != KErrNone ) - { - User::Leave( result ); - } - - __TEST_INVARIANT; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CCbsDbImpSettings* CCbsDbImpSettings::NewL( CCbsDbImp& aDatabase ) - { - CCbsDbImpSettings* self = - new ( ELeave ) CCbsDbImpSettings( aDatabase ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } - -// Destructor -CCbsDbImpSettings::~CCbsDbImpSettings() - { - CBSLOGSTRING("CBSSERVER: >>> CCbsDbImpSettings::~CCbsDbImpSettings()"); - delete iObservers; - CBSLOGSTRING("CBSSERVER: <<< CCbsDbImpSettings::~CCbsDbImpSettings()"); - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::SetTopicDetectionStatusL -// Changes the topic detection status. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::SetTopicDetectionStatusL( - TBool aStatus ) - { - - // If the value does not change we do nothing but return - if ( aStatus != iSettings.iTopicDetectionStatus ) - { - // First we change the status value in cache. - iSettings.iTopicDetectionStatus = aStatus; - - // Now we try to save the modified settings to the store - if ( !SaveSettings() ) - { - // If an error occured, we leave the status unchanged. - if ( iSettings.iTopicDetectionStatus ) - { - iSettings.iTopicDetectionStatus = EFalse; - } - else - { - iSettings.iTopicDetectionStatus = ETrue; - } - - // and then leave again - User::Leave( KErrWrite ); - } - - // Inform observers about the changed status - TInt amountOfObservers( iObservers->Count() ); - for ( TInt i( 0 ); i < amountOfObservers; i++ ) - { - iObservers->At( i )->TopicDetectionStatusChangedIndL(); - } - } - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::SaveSettings -// Saves the settings to CenRep -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TBool CCbsDbImpSettings::SaveSettings() - { - __TEST_INVARIANT; - TBool result( ETrue ); - - // Try to save the settings. - TRAPD( error, DoSaveSettingsL() ); - if ( error != KErrNone ) - { - // Some kind of failure occurred. - __TEST_INVARIANT; - result = EFalse; - } - - __TEST_INVARIANT; - return result; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::DoSaveSettingsL -// Saves the settings to CenRep -// The method leaves in case the writing to the does not succeed. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::DoSaveSettingsL() - { - - TInt reception( iSettings.iReceptionStatus ); - TInt topicDetection( iSettings.iTopicDetectionStatus ); - - TBuf< ECbsCount > languages; - - for ( TInt i( 0 ); i < ECbsCount; i++ ) - { - languages.AppendNum( iSettings.iLanguageStatus.iLanguages[i] ); - } - - // Connecting and initialization - CRepository* repository = CRepository::NewL( KCRUidCellBroadcast ); - - // Get the values from Central Repository - repository->Set( KCbsReception, reception ); - repository->Set( KCbsTopicDetection, topicDetection ); - repository->Set( KCbsLanguages, languages ); - - // Closing the connection - delete repository; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::GetTopicDetectionStatus -// Returns the current value of the topic detection status. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::GetTopicDetectionStatus( - TBool& aStatus ) const - { - // We just give the asked status value from cache to aStatus - aStatus = iSettings.iTopicDetectionStatus; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::SetReceptionStatusL -// Changes the reception status. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::SetReceptionStatusL( - TBool aStatus ) - { - - // If the value does not change we do nothing but return - if ( aStatus != iSettings.iReceptionStatus ) - { - // First we change the status value in iSettings - iSettings.iReceptionStatus = aStatus; - - // Now we try to save the modified settings to the store - if ( !SaveSettings() ) - { - // If an error occured, we leave the status unchanged. - if ( iSettings.iReceptionStatus ) - { - iSettings.iReceptionStatus = EFalse; - } - else - { - iSettings.iReceptionStatus = ETrue; - } - - // and then leave. - User::Leave( KErrWrite ); - } - - // Inform observers about the changed status - TInt amountOfObservers( iObservers->Count() ); - for ( TInt i( 0 ); i < amountOfObservers; i++ ) - { - iObservers->At( i )->ReceptionStatusChangedIndL(); - } - } - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::GetReceptionStatus -// Returns the current value of the topic reception status. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::GetReceptionStatus( - TBool& aStatus ) const - { - // We just give the asked status value from cache to aStatus - aStatus = iSettings.iReceptionStatus; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::SetLanguagesL -// Changes the preferred languages. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::SetLanguagesL( - const TCbsDbLanguages& aLanguages ) - { - __TEST_INVARIANT; - - // Compare language settings. - if ( !IsLanguagesEqual( aLanguages, iSettings.iLanguageStatus ) ) - { - // We take a backup of the language status before changing the value. - TCbsDbLanguages oldLanguageStatus = iSettings.iLanguageStatus; - - // We change the language status value - iSettings.iLanguageStatus = aLanguages; - - // Now we try to save the modified settings struct to the store - if ( !SaveSettings() ) - { - // If an error occured, we leave the settings unchanged. - iSettings.iLanguageStatus = oldLanguageStatus; - User::Leave( KErrWrite ); - } - - // Inform observers about the changed status - TInt amountOfObservers( iObservers->Count() ); - for ( TInt i( 0 ); i < amountOfObservers; i++ ) - { - iObservers->At( i )->LanguagesChangedIndL(); - } - } - - __TEST_INVARIANT; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::GetLanguages -// Returns the preferred languages. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::GetLanguages( - TCbsDbLanguages& aLanguages ) const - { - // We just give the asked status value from cache to aLanguages - aLanguages = iSettings.iLanguageStatus; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::AddObserverL -// Adds an observer to the settings. -// Observers are notified when an event occurs on the settings. -// Panics on debug mode if aObserver is null. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::AddObserverL( - MCbsDbSettingsObserver* aObserver ) - { - __TEST_INVARIANT; - __ASSERT_DEBUG( aObserver!=0, CbsServerPanic( ECbsObserverNull ) ); - iObservers->AppendL( aObserver ); - __TEST_INVARIANT; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::RemoveObserver -// Removes database observer. -// The method will panic, if there is no such observer added -// or the given observer is null. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::RemoveObserver( - const MCbsDbSettingsObserver* aObserver ) - { - __ASSERT_DEBUG( aObserver != 0, CbsServerPanic( ECbsObserverNull ) ); - - // Find the observer to remove - TInt amountOfObservers( iObservers->Count() ); - TBool found( EFalse ); - - for ( TInt index( 0 ); ( index < amountOfObservers ) && !found; index++ ) - { - if ( aObserver == iObservers->At( index ) ) - { - iObservers->Delete( index ); - iObservers->Compress(); - found = ETrue; - } - } - - // Panic if the observer was not found - if ( !found ) - { - CbsServerPanic( ECbsObserverNotFound ); - } - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::LoadSettingsL -// Loads the settings, i.e. values for reception status, topic detection -// and language subscriptions. -// These values are retrieved from Central Repository, associated with -// the UID of CbsServer. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::LoadSettingsL() - { - CBSLOGSTRING("CBSSERVER: >>> CCbsDbImpSettings::LoadSettingsL()"); - - // Connecting and initialization - CRepository* repository = CRepository::NewL( KCRUidCellBroadcast ); - - TBuf< ECbsCount > languages; - languages.Zero(); - - TInt reception( 0 ); - TInt topicDetection( 0 ); - - // Get the values from Central Repository - repository->Get( KCbsReception, reception ); - repository->Get( KCbsTopicDetection, topicDetection ); - repository->Get( KCbsLanguages, languages ); - - // Closing the connection - delete repository; - - CBSLOGSTRING("CBSSERVER: CCbsDbImpSettings::LoadSettingsL(): Repository reading finished."); - - iSettings.iReceptionStatus = reception == 0 ? EFalse : ETrue; - iSettings.iTopicDetectionStatus = topicDetection == 0 ? EFalse : ETrue; - - if ( languages.Length() != ECbsCount ) - { - User::Leave( KErrCorrupt ); - } - - for ( TInt i( 0 ); i < ECbsCount; i++ ) - { - iSettings.iLanguageStatus.iLanguages[ i ] = - ( languages[ i ] == KDefaultsLanguageSubscribedValue ); - } - CBSLOGSTRING("CBSSERVER: <<< CCbsDbImpSettings::LoadSettingsL()"); - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::IsLanguagesEqual -// Determines whether the language settings are equal. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TBool CCbsDbImpSettings::IsLanguagesEqual( - const TCbsDbLanguages& aLanguage1, - const TCbsDbLanguages& aLanguage2 ) const - { - // Go through each language settings. - for ( TInt index( 0 ); index < ECbsCount; index++ ) - { - if ( aLanguage1.iLanguages[ index ] != aLanguage2.iLanguages[ index ] ) - { - return EFalse; - } - } - - // Equal. - return ETrue; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::SetDefaultLanguageSettings -// Sets default language settings. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::SetDefaultLanguageSettings( - TCbsDbLanguages& aLanguage ) const - { - // First, set all languages to false. - for ( TInt index( 0 ); index < ECbsAll; index++ ) - { - aLanguage.iLanguages[ index ] = EFalse; - } - - // And then set the "All"-choice to true. - aLanguage.iLanguages[ ECbsAll ] = ETrue; - } - -// ----------------------------------------------------------------------------- -// CCbsDbImpSettings::__DbgTestInvariant -// Checks that the object is in a valid state, and panics if it is not. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsDbImpSettings::__DbgTestInvariant() const - { -#if defined(_DEBUG) - if ( iSettings.iReceptionStatus < 0 || iSettings.iReceptionStatus > 1 || - iSettings.iTopicDetectionStatus < 0 || - iSettings.iTopicDetectionStatus > 1 || - iObservers == NULL ) - { - User::Invariant(); - } -#endif - } - -// ========================== OTHER EXPORTED FUNCTIONS ========================= -// End of File