--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/radioengine/utils/src/cradiorepositorymanagerimp.cpp Fri Jun 04 10:21:36 2010 +0100
@@ -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 );
+ }
+ }