radioengine/utils/src/cradiorepositorymanagerimp.cpp
changeset 13 46974bebc798
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/radioengine/utils/src/cradiorepositorymanagerimp.cpp	Fri Mar 19 09:29:04 2010 +0200
@@ -0,0 +1,454 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "cradiorepositoryentity.h"
+#include "cradiorepositorymanager.h"
+#include "cradiorepositorymanagerimp.h"
+#include "radioengineutils.h"
+
+const TInt KVRRepositoryObserverArrayGranularity = 2;
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Panics the application.
+// ---------------------------------------------------------------------------
+//
+void Panic( TInt aReason )
+    {
+    _LIT( category, "CRadioRepositoryManagerImp" );
+    User::Panic( category, aReason );
+    }
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CRadioRepositoryManagerImp* CRadioRepositoryManagerImp::NewL( TInt aGranularity )
+    {
+    CRadioRepositoryManagerImp* self = new ( ELeave ) CRadioRepositoryManagerImp( aGranularity );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::ConstructL()
+    {
+    RadioEngineUtils::InitializeL();
+    CheckRepositoryKeysL();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CRadioRepositoryManagerImp::CRadioRepositoryManagerImp( TInt aGranularity )
+    : iObservers( KVRRepositoryObserverArrayGranularity )
+    , iEntities( aGranularity )
+    , iEnableSave( ETrue )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CRadioRepositoryManagerImp::~CRadioRepositoryManagerImp()
+    {
+    iObservers.Close();
+    iEntities.ResetAndDestroy();
+    RadioEngineUtils::Release();
+    }
+
+// ---------------------------------------------------------------------------
+// Adds observer
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::AddObserverL( MRadioRepositoryEntityObserver* aObserver )
+    {
+    iObservers.AppendL( aObserver );
+    }
+
+// ---------------------------------------------------------------------------
+// Removes observer
+// ---------------------------------------------------------------------------
+//
+ void CRadioRepositoryManagerImp::RemoveObserver( MRadioRepositoryEntityObserver* aObserver )
+    {
+    TInt objectIndex = iObservers.Find( aObserver );
+
+    if ( objectIndex != KErrNotFound )
+        {
+        iObservers.Remove( objectIndex );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Enables or disables the saving of entities.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::EnableSave( TBool aEnable )
+    {
+    iEnableSave = aEnable;
+    }
+
+// ---------------------------------------------------------------------------
+// Adds an entity.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::AddEntityL( const TUid& aUid, TUint32 aKey, TRadioEntityType aType )
+    {
+    CRadioRepositoryEntityBase* entity = NULL;
+
+    switch ( aType )
+        {
+        case ERadioEntityInt:
+            entity = CRadioRepositoryEntity<TInt>::NewL( aUid, aKey, *this );
+            break;
+        case ERadioEntityReal:
+            entity = CRadioRepositoryEntity<TReal>::NewL( aUid, aKey, *this );
+            break;
+        case ERadioEntityDes8:
+            entity = CRadioRepositoryEntity<TRadioEntityBuf8>::NewL( aUid, aKey, *this );
+            break;
+        case ERadioEntityDes16:
+            entity = CRadioRepositoryEntity<TRadioEntityBuf16>::NewL( aUid, aKey, *this );
+            break;
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+
+    CleanupStack::PushL( entity );
+    iEntities.AppendL( entity );
+    CleanupStack::Pop( entity );
+    }
+
+// ---------------------------------------------------------------------------
+// Removes an entity.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::RemoveEntity( const TUid& aUid, TUint32 aKey )
+    {
+    TInt idx = EntityIndex( aUid, aKey );
+
+    if ( idx >= 0 )
+        {
+        CRadioRepositoryEntityBase* entity = iEntities[idx];
+        iEntities.Remove( idx );
+        iEntities.GranularCompress();
+        delete entity;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Sets an entity's value.
+// ---------------------------------------------------------------------------
+//
+TInt CRadioRepositoryManagerImp::SetEntityValue( const TUid& aUid, TUint32 aKey, TInt aValue )
+    {
+    return DoSetEntityValue<TInt>( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets an entity's value.
+// ---------------------------------------------------------------------------
+//
+TInt CRadioRepositoryManagerImp::SetEntityValue( const TUid& aUid, TUint32 aKey, const TReal& aValue )
+    {
+    return DoSetEntityValue<TReal>( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets an entity's value.
+// ---------------------------------------------------------------------------
+//
+TInt CRadioRepositoryManagerImp::SetEntityValue( const TUid& aUid, TUint32 aKey, const TDesC8& aValue )
+    {
+    return DoSetEntityValue<TRadioEntityBuf8>( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets an entity's value.
+// ---------------------------------------------------------------------------
+//
+TInt CRadioRepositoryManagerImp::SetEntityValue( const TUid& aUid, TUint32 aKey, const TDesC16& aValue )
+    {
+    return DoSetEntityValue<TRadioEntityBuf16>( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns an entity's value.
+// ---------------------------------------------------------------------------
+//
+TInt CRadioRepositoryManagerImp::EntityValueInt( const TUid& aUid, TUint32 aKey ) const
+    {
+    return DoEntityValue<TInt>( aUid, aKey );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns an entity's value.
+// ---------------------------------------------------------------------------
+//
+const TReal& CRadioRepositoryManagerImp::EntityValueReal( const TUid& aUid, TUint32 aKey ) const
+    {
+    return DoEntityValue<TReal>( aUid, aKey );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns an entity's value.
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CRadioRepositoryManagerImp::EntityValueDes8( const TUid& aUid, TUint32 aKey ) const
+    {
+    return DoEntityValue<TDesC8>( aUid, aKey );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns an entity's value.
+// ---------------------------------------------------------------------------
+//
+const TDesC16& CRadioRepositoryManagerImp::EntityValueDes16( const TUid& aUid, TUint32 aKey ) const
+    {
+    return DoEntityValue<TDesC16>( aUid, aKey );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets the value of a repository key.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::SetRepositoryValueL( const TUid& aUid, TUint32 aKey, TInt aValue )
+    {
+    DoSetRepositoryValueL( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets the value of a repository key.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::SetRepositoryValueL( const TUid& aUid, TUint32 aKey, const TReal& aValue )
+    {
+    DoSetRepositoryValueL( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets the value of a repository key.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::SetRepositoryValueL( const TUid& aUid, TUint32 aKey, const TDesC8& aValue )
+    {
+    DoSetRepositoryValueL( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets the value of a repository key.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::SetRepositoryValueL( const TUid& aUid, TUint32 aKey, const TDesC16& aValue )
+    {
+    DoSetRepositoryValueL( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the value of a repository key.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::GetRepositoryValueL( const TUid& aUid, TUint32 aKey, TInt& aValue )
+    {
+    DoGetRepositoryValueL( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the value of a repository key.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::GetRepositoryValueL( const TUid& aUid, TUint32 aKey, TReal& aValue )
+    {
+    DoGetRepositoryValueL( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the value of a repository key.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::GetRepositoryValueL( const TUid& aUid, TUint32 aKey, TDes8& aValue )
+    {
+    DoGetRepositoryValueL( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the value of a repository key.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::GetRepositoryValueL( const TUid& aUid, TUint32 aKey, TDes16& aValue )
+    {
+    DoGetRepositoryValueL( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets an entity's value.
+// ---------------------------------------------------------------------------
+//
+template <typename T>
+TInt CRadioRepositoryManagerImp::DoSetEntityValue( const TUid& aUid, TUint32 aKey, const T& aValue )
+    {
+    TInt idx = EntityIndex( aUid, aKey );
+
+    // If the entity could not be found, panic the application.
+    __ASSERT_ALWAYS( idx >= 0, ::Panic( KErrArgument ) );
+
+    return static_cast<CRadioRepositoryEntity<T>*>( iEntities[idx] )->SetValue( aValue, iEnableSave );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns an entity's value.
+// ---------------------------------------------------------------------------
+//
+template <typename T>
+const T& CRadioRepositoryManagerImp::DoEntityValue( const TUid& aUid, TUint32 aKey ) const
+    {
+    TInt idx = EntityIndex( aUid, aKey );
+
+    // If the entity could not be found, panic the application.
+    __ASSERT_ALWAYS( idx >= 0, ::Panic( KErrArgument ) );
+
+    return static_cast<CRadioRepositoryEntity<T>*>( iEntities[idx] )->Value();
+    }
+
+// ---------------------------------------------------------------------------
+// Sets a key's value in the repository.
+// ---------------------------------------------------------------------------
+//
+template <typename T>
+void CRadioRepositoryManagerImp::DoSetRepositoryValueL( const TUid& aUid, TUint32 aKey, const T& aValue )
+    {
+    CRepository* repository = CRepository::NewLC( aUid );
+    User::LeaveIfError( repository->Set( aKey, aValue ) );
+    CleanupStack::PopAndDestroy( repository );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns a key's value in the repository.
+// ---------------------------------------------------------------------------
+//
+template <typename T>
+void CRadioRepositoryManagerImp::DoGetRepositoryValueL( const TUid& aUid, TUint32 aKey, T& aValue )
+    {
+    CRepository* repository = CRepository::NewLC( aUid );
+    User::LeaveIfError( repository->Get( aKey, aValue ) );
+    CleanupStack::PopAndDestroy( repository );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns the entity's index that matches the supplied arguments.
+// ---------------------------------------------------------------------------
+//
+TInt CRadioRepositoryManagerImp::EntityIndex( const TUid& aUid, TUint32 aKey ) const
+    {
+    TInt idx = KErrNotFound;
+
+    for ( TInt i = 0; i < iEntities.Count(); i++ )
+        {
+        CRadioRepositoryEntityBase* entity = iEntities[i];
+        if ( entity->Uid() == aUid && entity->Key() == aKey )
+            {
+            idx = i;
+            break;
+            }
+        }
+
+    return idx;
+    }
+
+// ---------------------------------------------------------------------------
+// SIS installation does not update central repository, this checks that the new keys are in the repository.
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::CheckRepositoryKeysL()
+    {
+    // After adding a new cenrep key to radiointernalcrkeys.h, add it also here with a default value
+    /*
+    CRepository* repository = CRepository::NewLC( KVRCRUid );
+
+    TInt ret = repository->Create( KVRCRNewValue, TInt( 123 ) );
+    if ( ret != KErrAlreadyExists )
+        {
+        User::LeaveIfError( ret );
+        }
+
+    CleanupStack::PopAndDestroy( repository );
+    */
+    }
+
+// ---------------------------------------------------------------------------
+// Forwards the repository value changes
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::HandleRepositoryValueChangeL( const TUid& aUid,
+        TUint32 aKey, TInt aValue, TInt aError )
+    {
+    for ( TInt i = 0; i < iObservers.Count(); i++ )
+        {
+        iObservers[i]->HandleRepositoryValueChangeL( aUid, aKey, aValue, aError );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Forwards the repository value changes
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::HandleRepositoryValueChangeL( const TUid& aUid,
+        TUint32 aKey, const TReal& aValue, TInt aError )
+    {
+    for ( TInt i = 0; i < iObservers.Count(); i++ )
+        {
+        iObservers[i]->HandleRepositoryValueChangeL( aUid, aKey, aValue, aError );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Forwards the repository value changes
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::HandleRepositoryValueChangeL( const TUid& aUid,
+        TUint32 aKey, const TDesC8& aValue, TInt aError )
+    {
+    for ( TInt i = 0; i < iObservers.Count(); i++ )
+        {
+        iObservers[i]->HandleRepositoryValueChangeL( aUid, aKey, aValue, aError );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Forwards the repository value changes
+// ---------------------------------------------------------------------------
+//
+void CRadioRepositoryManagerImp::HandleRepositoryValueChangeL( const TUid& aUid,
+        TUint32 aKey, const TDesC16& aValue, TInt aError )
+    {
+    for ( TInt i = 0; i < iObservers.Count(); i++ )
+        {
+        iObservers[i]->HandleRepositoryValueChangeL( aUid, aKey, aValue, aError );
+        }
+    }