diff -r 000000000000 -r ed9695c8bcbe vtengines/videoteleng/Src/Base/CVtEngCRProxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/CVtEngCRProxy.cpp Mon Nov 23 14:47:47 2009 +0200 @@ -0,0 +1,441 @@ +/* +* Copyright (c) 2004-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: Central repository proxy. +* +*/ + + + +// INCLUDE FILES +#include "CVtEngCRObserverItem.h" +#include "CVtEngCRProxy.h" +#include "MVtEngCRSettingObserver.h" +#include + +// CONSTANTS + +const TInt KVtEngCRProxyObsGranularity = 5; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::CVtEngCRProxy +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy::CVtEngCRProxy() : iObserverItems( KVtEngCRProxyObsGranularity ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy* CVtEngCRProxy::NewL( ) + { + __VTPRINTENTER( "CRProxy.NewL" ) + CVtEngCRProxy* self = new( ELeave ) CVtEngCRProxy; + __VTPRINTEXIT( "CRProxy.NewL" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::~CVtEngCRProxy +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy::~CVtEngCRProxy() + { + __VTPRINTENTER( "CRProxy.~" ) + RemoveAllObservers(); + RemoveSessions(); + __VTPRINTEXIT( "CRProxy.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::FindItem +// Finds observer item. +// ----------------------------------------------------------------------------- +// +CVtEngCRObserverItem* CVtEngCRProxy::FindItem( + const TUid& aUid, + const TUint32 aKey, + TInt& aIndex ) const + { + TInt count( iObserverItems.Count() ); + CVtEngCRObserverItem* item = NULL; + TBool found( EFalse ); + while ( count-- && !found ) + { + item = iObserverItems[ count ]; + if ( item->Offer( aUid, aKey ) ) + { + aIndex = count; + found = ETrue; + } + } + + // Just NULL the item if not found + if ( !found ) + { + item = NULL; + } + return item; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::FindItem +// Finds observer item. +// ----------------------------------------------------------------------------- +// +CVtEngCRObserverItem* CVtEngCRProxy::FindItem( + const TUint32 aKey, TInt& aIndex ) const + { + TInt count( iObserverItems.Count() ); + CVtEngCRObserverItem* item = NULL; + if ( aIndex < 0 ) + { + return NULL; + } + + for ( ; aIndex < count; aIndex++ ) + { + item = iObserverItems[ aIndex ]; + if ( item->Offer( aKey ) ) + { + break; + } + } + return item; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::RemoveInterested +// Removes a cent rep listener. +// ----------------------------------------------------------------------------- +// +void CVtEngCRProxy::RemoveInterested( CVtEngCRObserverItem& aObserver ) + { + __VTPRINTENTER( "CRProxy.RemoveInterested" ) + TInt index ( 0 ); + CVtEngCRObserverItem* item = FindItem( aObserver.Uid(), + aObserver.Key(), index ); + if ( !item ) + { + // Should not be possible. + __VTPRINTEXITR( "CRProxy.RemoveInterested %d", 0 ) + return; + } + + delete item; + iObserverItems.Remove( index ); + __VTPRINTEXITR( "CRProxy.RemoveInterested %d", 1 ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::NewCRSessionL +// New Central repository-uid pairing. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy::CCRSession* CVtEngCRProxy::NewCRSessionL( TUid aUid ) + { + __VTPRINTENTER( "CRProxy.NewCRSessionL" ) + CRepository* crSession = CRepository::NewL( aUid ); + CleanupStack::PushL( crSession ); + CCRSession* csSession = new ( ELeave ) CCRSession; + csSession->iSession = crSession; + csSession->iUid = aUid; + CleanupStack::Pop( crSession ); + __VTPRINTEXIT( "CRProxy.NewCRSessionL" ) + return csSession; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::RegisterInterested +// New Central repository listener. +// ----------------------------------------------------------------------------- +// +void CVtEngCRProxy::RegisterInterestedL( CVtEngCRObserverItem* aObserver ) + { + __VTPRINTENTER( "CRProxy.RegisterInterestedL" ) + CRepository* crSession = MapUidToCR( aObserver->Uid() ); + CCRSession* csSession = NULL; + if( !crSession ) + { + csSession = NewCRSessionL( aObserver->Uid() ); + CleanupStack::PushL( csSession ); + crSession = csSession->iSession; + iCRSessions.AppendL( csSession ); + CleanupStack::Pop( csSession ); + } + + CCenRepNotifyHandler* notifier = + CCenRepNotifyHandler::NewL( *aObserver, *crSession, + aObserver->Type(), aObserver->Key() ); + //notifier ownership transfered + aObserver->SetCenRepNotifier( notifier ); + notifier->StartListeningL(); + iObserverItems.AppendL ( aObserver ); + __VTPRINTEXIT( "CRProxy.RegisterInterestedL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::MapUidToCR +// Maps a given UID to a Central repository session. +// ----------------------------------------------------------------------------- +// +CRepository* CVtEngCRProxy::MapUidToCR( const TUid aUid ) + { + __VTPRINTENTER( "CRProxy.Map" ) + CCRSession* csSession = NULL; + TBool found( EFalse ); + TInt count( iCRSessions.Count() ); + for ( TInt i = 0 ; i < count; i++ ) + { + csSession = iCRSessions[ i ]; + if ( csSession->iUid == aUid ) + { + i = count; // break loop + found = ETrue; + } + } + CRepository* session = NULL; + // Only return something when found. + if ( found ) + { + session = csSession->iSession; + } + __VTPRINTEXITR( "CRProxy.Map %d", (TInt) session ) + return session; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::RemoveAllObservers +// All observers off they go. +// ----------------------------------------------------------------------------- +// +void CVtEngCRProxy::RemoveAllObservers() + { + __VTPRINTENTER( "CRProxy.RemoveAll" ) + iObserverItems.ResetAndDestroy(); + iObserverItems.Close(); + __VTPRINTEXIT( "CRProxy.RemoveAll" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::RemoveSessions +// Removes all Central repository sessions. +// ----------------------------------------------------------------------------- +// +void CVtEngCRProxy::RemoveSessions() + { + __VTPRINTENTER( "CRProxy.RemoveAllS" ) + iCRSessions.ResetAndDestroy(); + iCRSessions.Close(); + __VTPRINTEXIT( "CRProxy.RemoveAllS" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::GetSession +// Gets an existing or a new Central repository session for a UID. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::GetSessionL( const TUid aUid, CRepository*& crSession ) + { + TInt err( KErrNone ); + crSession = MapUidToCR( aUid ); + if ( !crSession ) + { + CCRSession* session = NULL; + session = NewCRSessionL( aUid ); + if ( session ) + { + CleanupStack::PushL( session ); + iCRSessions.AppendL( session ); + CleanupStack::Pop( session ); + crSession = session->iSession; + } + else + { + err = KErrNotFound; + } + } + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Get +// Gets integer value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Get( const TUid aUid, const TUint32 aId, TInt& aVal ) + { + __VTPRINTENTER( "CRProxy.GetInt" ) + __VTPRINT3( DEBUG_GEN, "UID=%d,key=%d", aUid.iUid, (TInt) aId ); + + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Get( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.GetInt %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Get +// Gets real value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Get( const TUid aUid, const TUint32 aId, TReal& aVal ) + { + __VTPRINTENTER( "CRProxy.GetReal" ) + __VTPRINT3( DEBUG_GEN, "UID=%d,key=%d", aUid.iUid, (TInt) aId ); + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Get( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.GetR %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Get +// Gets binary value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Get( const TUid aUid, const TUint32 aId, TDes8& aVal ) + { + __VTPRINTENTER( "CRProxy.GetD8" ) + __VTPRINT3( DEBUG_GEN, "UID=%d,key=%d", aUid.iUid, (TInt) aId ); + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Get( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.GetD8 %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Get +// Gets string value. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Get( const TUid aUid, const TUint32 aId, TDes16& aVal ) + { + __VTPRINTENTER( "CRProxy.GetD16" ) + __VTPRINT3( DEBUG_GEN, "UID=%d,key=%d", aUid.iUid, (TInt) aId ); + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Get( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.GetD16 %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Set +// Sets integer value to Central Repository. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Set( const TUid aUid, const TUint32 aId, TInt aVal ) + { + __VTPRINTENTER( "CRProxy.SetInt" ) + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Set( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.SetInt %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Set +// Sets real value to Central Repository. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Set( const TUid aUid, const TUint32 aId, const TReal& aVal ) + { + __VTPRINTENTER( "CRProxy.SetR" ) + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Set( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.SetR %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Set +// Sets binary value to Central Repository. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Set( const TUid aUid, const TUint32 aId, const TDesC8& aVal ) + { + __VTPRINTENTER( "CRProxy.SetD8" ) + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Set( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.SetD8 %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::Set +// Sets string value to Central Repository. +// ----------------------------------------------------------------------------- +// +TInt CVtEngCRProxy::Set( + const TUid aUid, const TUint32 aId, const TDesC16& aVal ) + { + __VTPRINTENTER( "CRProxy.SetD16" ) + CRepository* crSession = NULL; + TRAPD( err, GetSessionL( aUid, crSession ) ); + if ( err == KErrNone ) + { + err = crSession->Set( aId, aVal ); + } + __VTPRINTEXITR( "CRProxy.SetD16 %d", err ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCRProxy::CCRSession::~CCRSession +// Destructor. +// ----------------------------------------------------------------------------- +// +CVtEngCRProxy::CCRSession::~CCRSession() + { + __VTPRINTENTER( "CRProxy.~" ) + delete iSession; + __VTPRINTEXIT( "CRProxy.~" ) + } + +// end of file