cbs/CbsServer/ServerSrc/CCbsDbImpSettings.cpp
changeset 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbs/CbsServer/ServerSrc/CCbsDbImpSettings.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,476 @@
+/*
+* 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 <centralrepository.h>
+#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