vtengines/videoteleng/Src/Base/CVtEngCRProxy.cpp
changeset 0 ed9695c8bcbe
--- /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    <cvtlogger.h>
+
+// 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