phoneapp/phoneuiutils/src/cphonecenrepproxy.cpp
changeset 0 5f000ab63145
child 21 92ab7f8d0eab
child 61 41a7f70b3818
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneuiutils/src/cphonecenrepproxy.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,730 @@
+/*
+* Copyright (c) 2005 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    <e32std.h>
+#include    <e32def.h>
+#include    <e32base.h>
+#include    <telinternalcrkeys.h>
+#include    <pslninternalcrkeys.h>
+#include    <LogsDomainCRKeys.h>
+#include    <accessoriescrkeys.h>
+#include    <settingsinternalcrkeys.h>
+#include    <UiklafInternalCRKeys.h>
+#include    <ProfileEngineDomainCRKeys.h>
+#include    <DRMHelperServerInternalCRKeys.h>
+#include    <AknFepInternalCRKeys.h>
+#include    <AvkonInternalCRKeys.h>
+#include    <btengdomaincrkeys.h> 
+#include    <utf.h>
+
+#include    "phoneui.pan"
+#include    "cphonecenrepproxy.h"
+#include    "mphonecenrepobserver.h"
+#include    "cphonecenrepeventhandler.h"
+#include    "phoneconstants.h"
+#include    "phonelogger.h"
+#include    "telprivatecrkeys.h"
+#include    "tphonecmdparamappinfo.h"
+
+//CONSTANTS
+const TInt KMaxParamLength = 1024;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::Instance
+// Initializes the singleton object
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C CPhoneCenRepProxy* CPhoneCenRepProxy::Instance()
+    {
+    CPhoneCenRepProxy* instance = static_cast<CPhoneCenRepProxy*> 
+        ( CCoeEnv::Static ( KUidCenRepProxySingleton ) );
+    
+    if( !instance )
+        {
+        TRAPD( err, instance = CPhoneCenRepProxy::NewL() );
+        if ( err )
+            {
+            Panic( EPhoneUtilsCouldNotCreateSingleton );    
+            }
+        }
+    return instance;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::CancelAllNotifies
+// Cancel the notification if the singleton still exists.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPhoneCenRepProxy::CancelAllNotifies( 
+    MPhoneCenRepObserver* aObserver )
+    {
+    CPhoneCenRepProxy* instance = static_cast<CPhoneCenRepProxy*> 
+        ( CCoeEnv::Static( KUidCenRepProxySingleton ) );
+    
+    // Ignore the call since the singleton has already been destroyed and the
+    // notifications removed
+    if( instance != NULL )
+        {
+        instance->CancelAllObserverNotifies( aObserver );
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::NewL
+// ---------------------------------------------------------
+//
+CPhoneCenRepProxy* CPhoneCenRepProxy::NewL()
+    {
+    CPhoneCenRepProxy* self = 
+        new (ELeave) CPhoneCenRepProxy();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::~CPhoneCenRepProxy
+// ---------------------------------------------------------
+//
+EXPORT_C CPhoneCenRepProxy::~CPhoneCenRepProxy()
+    {
+    // The Cancel should be always called before destroy the object
+    CancelAllNotifies();
+    
+    delete iCenRepAccessoryEventHandler;
+    delete iCenRepNetworkEventHandler;
+    delete iCenRepThemesEventHandler;
+    delete iCenRepLanguageEventHandler;
+    delete iCenRepQwertyEventHandler;
+    delete iCenRepKDRMHelperEventHandler;
+    delete iObserverArray;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::CPhoneCenRepProxy
+// ---------------------------------------------------------
+//
+CPhoneCenRepProxy::CPhoneCenRepProxy() :
+    CCoeStatic( KUidCenRepProxySingleton, EThread )
+    {
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::ConstructL
+// ---------------------------------------------------------
+//
+void CPhoneCenRepProxy::ConstructL()
+    {
+    iObserverArray = new ( ELeave ) CArrayFixFlat<TCenRepObserverTag>( 
+        KPhoneCenRepObserversGranularity );
+
+    iTelephonyVariantReadOnlyValues = KPhoneVariantReadOnlyDefaultValue;
+    iPhoneUIVariantReadOnlyValues = KPhoneVariantReadOnlyDefaultValue;
+    
+    User::LeaveIfError( GetTelephonyVariantData() );
+    User::LeaveIfError( GetPhoneUIVariantData() );
+
+    iCenRepAccessoryEventHandler = CPhoneCenRepEventHandler::NewL( 
+        KCRUidAccessorySettings );
+    iCenRepNetworkEventHandler = CPhoneCenRepEventHandler::NewL( 
+        KCRUidNetworkSettings );
+    iCenRepThemesEventHandler = CPhoneCenRepEventHandler::NewL( 
+        KCRUidThemes );
+    iCenRepLanguageEventHandler = CPhoneCenRepEventHandler::NewL( 
+        KCRUidAknFep );
+    iCenRepQwertyEventHandler = CPhoneCenRepEventHandler::NewL( 
+        KCRUidAvkon );
+    iCenRepKDRMHelperEventHandler = CPhoneCenRepEventHandler::NewL( 
+        KCRUidDRMHelperServer );
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::HandleNotifyL
+// ---------------------------------------------------------
+//
+void CPhoneCenRepProxy::HandleNotify( 
+    const TUid& aUid, 
+    const TUint aId )
+    {
+    TInt index = FindByUidId( aUid, aId, 0 );
+    while ( index != KErrNotFound )
+        {
+        __ASSERT_DEBUG( index < iObserverArray->Count(), 
+            Panic( EPhoneUtilsIndexOutOfBounds ) );
+        const TCenRepObserverTag& observerTag = iObserverArray->At( index );
+        TRAP_IGNORE( observerTag.iObserver->HandleCenRepChangeL( aUid, aId ) );
+        index = FindByUidId( aUid, aId, index+1 );
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::SetInt
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPhoneCenRepProxy::SetInt( 
+    const TUid& aUid, 
+    const TUint aId,
+    const TInt aValue )
+    {
+    CRepository* repository = NULL;
+    TRAPD( err, repository = CRepository::NewL( aUid ) );
+    if ( err == KErrNone )
+        {
+        err = repository->Set( aId, aValue );
+        }
+    delete repository;
+
+    if ( err != KErrNone )
+        {
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhoneCenRepProxy::SetInt() error: %d", 
+            err );
+        __ASSERT_DEBUG( EFalse, Panic( EPhoneUtilsInvariant ) );
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::SetString
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPhoneCenRepProxy::SetString( 
+    const TUid& aUid, 
+    const TUint aId,
+    const TDesC& aValue )
+    {
+    CRepository* repository = NULL;
+    TRAPD( err, repository = CRepository::NewL( aUid ) );
+    if ( err == KErrNone )
+        {
+        err = repository->Set( aId, aValue );
+        }
+    delete repository;
+
+    if ( err != KErrNone )
+        {
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhoneCenRepProxy::SetString() error: %d", 
+            err );
+        __ASSERT_DEBUG( EFalse, Panic( EPhoneUtilsInvariant ) );
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::SetReal
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPhoneCenRepProxy::SetReal( 
+    const TUid& aUid, 
+    const TUint aId,
+    const TReal aValue )
+    {
+    CRepository* repository = NULL;
+    TRAPD( err, repository = CRepository::NewL( aUid ) );
+    if ( err == KErrNone )
+        {
+        err = repository->Set( aId, aValue );
+        }
+    delete repository;
+
+    if ( err != KErrNone )
+        {
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhoneCenRepProxy::SetReal() error: %d", 
+            err );
+        __ASSERT_DEBUG( EFalse, Panic( EPhoneUtilsInvariant ) );
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::GetInt
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPhoneCenRepProxy::GetInt( 
+    const TUid& aUid, 
+    const TUint aId,
+    TInt& aValue ) const
+    {
+    CRepository* repository = NULL;
+    TRAPD( err, repository = CRepository::NewL( aUid ) );
+    if ( err == KErrNone )
+        {
+        err = repository->Get( aId, aValue );
+        delete repository;
+        }
+
+    if ( err != KErrNone)
+        {
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhoneCenRepProxy::GetInt() error: %d", 
+            err );
+        __ASSERT_DEBUG( EFalse, Panic( EPhoneUtilsInvariant ) );
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::GetString
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPhoneCenRepProxy::GetString( 
+    const TUid& aUid, 
+    const TUint aId,
+    TDes& aValue ) const
+    {
+    CRepository* repository = NULL;
+    TRAPD( err, repository = CRepository::NewL( aUid ) );
+    if ( err == KErrNone )
+        {
+        err = repository->Get( aId, aValue );
+        delete repository;
+        }
+
+    if ( err != KErrNone)
+        {
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhoneCenRepProxy::GetString() error: %d", 
+            err );
+        __ASSERT_DEBUG( EFalse, Panic( EPhoneUtilsInvariant ) );
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::GetReal
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPhoneCenRepProxy::GetReal( 
+    const TUid& aUid, 
+    const TUint aId,
+    TReal& aValue ) const
+    {
+    CRepository* repository = NULL;
+    TRAPD( err, repository = CRepository::NewL( aUid ) );
+    if ( err == KErrNone )
+        {
+        err = repository->Get( aId, aValue );
+        delete repository;
+        }
+
+    if ( err != KErrNone)
+        {
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhoneCenRepProxy::GetReal() error: %d", 
+            err );
+        __ASSERT_DEBUG( EFalse, Panic( EPhoneUtilsInvariant ) );
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::NotifyChangeL
+// ---------------------------------------------------------
+//
+EXPORT_C void CPhoneCenRepProxy::NotifyChangeL( 
+    const TUid& aUid, 
+    const TUint aId, 
+    MPhoneCenRepObserver* aObserver )
+    {
+    // Make sure this request hasn't been request by this observer yet
+    if ( FindByUidIdObserver( aUid, aId, aObserver ) == KErrNotFound )
+        {
+        TCenRepObserverTag tag;
+        tag.iUid = aUid;
+        tag.iId = aId;
+        tag.iObserver = aObserver;
+    
+        iObserverArray->AppendL( tag );
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::CancelNotify
+// ---------------------------------------------------------
+//
+EXPORT_C void CPhoneCenRepProxy::CancelNotify( 
+    MPhoneCenRepObserver* aObserver, 
+    const TUint aId )
+    {
+    TInt index = FindByObserverId( aObserver, aId );
+    // This class may be destroyded by CCoeEnv::DestroyEnvironmentStatic() 
+    // before CancelNotifys are called.
+    if( index == KErrNotFound )
+        {
+        return;            
+        }
+    
+    __ASSERT_DEBUG( index < iObserverArray->Count(),
+        Panic( EPhoneUtilsIndexOutOfBounds ) );
+        
+    TCenRepObserverTag observerTag = iObserverArray->At( index );
+    iObserverArray->Delete( index );
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::CancelAllObserverNotifies
+// ---------------------------------------------------------
+//
+void CPhoneCenRepProxy::CancelAllObserverNotifies( 
+    MPhoneCenRepObserver* aObserver )
+    {
+    const TInt count = iObserverArray->Count();
+    for ( TInt i = count-1; i >=0; i-- )
+        {
+        const TCenRepObserverTag& observerTag = iObserverArray->At( i );
+        if ( observerTag.iObserver == aObserver )
+            {
+            iObserverArray->Delete( i );
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::CancelAllNotifies
+// ---------------------------------------------------------
+//
+void CPhoneCenRepProxy::CancelAllNotifies()
+    {
+    const TInt count = iObserverArray->Count();
+    for ( TInt i = count-1; i >=0; i-- )
+        {
+        const TCenRepObserverTag& observerTag = iObserverArray->At( i );
+        iObserverArray->Delete( i );
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::FindByUidId
+// ---------------------------------------------------------
+//
+TInt CPhoneCenRepProxy::FindByUidId( 
+    const TUid& aUid,
+    const TUint aId, 
+    TInt aFromIndex )
+    {
+    const TInt count = iObserverArray->Count();
+    TInt result = KErrNotFound;
+    for ( TInt i = aFromIndex; i < count; i++ )
+        {
+        const TCenRepObserverTag& observerTag = iObserverArray->At( i );
+        if ( observerTag.iUid == aUid  && observerTag.iId == aId ) 
+            {
+            result = i;
+            break;
+            }
+        }
+    return result;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::FindByObserverId
+// ---------------------------------------------------------
+//
+TInt CPhoneCenRepProxy::FindByObserverId( 
+    const MPhoneCenRepObserver* aObserver,
+    const TUint aId )
+    {
+    const TInt count = iObserverArray->Count();
+    TInt result = KErrNotFound;
+    for ( TInt i = 0; i < count; i++ )
+        {
+        const TCenRepObserverTag& observerTag = iObserverArray->At( i );
+        if ( observerTag.iObserver == aObserver && observerTag.iId == aId ) 
+            {
+            result = i;
+            break;
+            }
+        }
+    return result;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::FindByUidIdObserver
+// ---------------------------------------------------------
+//
+TInt CPhoneCenRepProxy::FindByUidIdObserver( 
+    const TUid& aUid, 
+    const TUint aId, 
+    MPhoneCenRepObserver* aObserver )
+    {
+    TInt pos = FindByUidId( aUid, aId, 0 );
+    TInt result = KErrNotFound;
+    while ( pos != KErrNotFound )
+        {
+        __ASSERT_DEBUG( pos < iObserverArray->Count(), 
+            Panic( EPhoneUtilsIndexOutOfBounds ) );
+        const TCenRepObserverTag& observerTag = iObserverArray->At( pos );
+        if ( observerTag.iObserver == aObserver )
+            {
+            result = pos;
+            break;
+            }
+
+        pos++;
+        pos = FindByUidId( aUid, aId, pos );
+        }
+
+    return result;
+    }   
+
+// -----------------------------------------------------------------------------
+// CPhoneCenRepProxy::IsTelephonyFeatureSupported
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CPhoneCenRepProxy::IsTelephonyFeatureSupported( 
+    const TInt aFeatureId )
+    {
+    return ( aFeatureId & iTelephonyVariantReadOnlyValues );
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneCenRepProxy::GetTelephonyVariantData
+// -----------------------------------------------------------------------------
+//
+TInt CPhoneCenRepProxy::GetTelephonyVariantData()
+    {
+    TInt err = KErrNone;
+
+    // Variation data should be unchangable during run-time, 
+    // therefore, if once succesfully read, later reads are
+    // not allowed.
+    if( iTelephonyVariantReadOnlyValues == KPhoneVariantReadOnlyDefaultValue )
+        {
+        err = GetInt( 
+            KCRUidTelVariation, 
+            KTelVariationFlags, 
+            iTelephonyVariantReadOnlyValues );
+        }
+
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneCenRepProxy::IsPhoneUIFeatureSupported
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CPhoneCenRepProxy::IsPhoneUIFeatureSupported( 
+    const TInt aFeatureId )
+    {
+    return ( aFeatureId & iPhoneUIVariantReadOnlyValues );
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneCenRepProxy::GetPhoneUIVariantData
+// -----------------------------------------------------------------------------
+//
+TInt CPhoneCenRepProxy::GetPhoneUIVariantData()
+    {
+    TInt err = KErrNone;
+/*
+    // Variation data should be unchangable during run-time, 
+    // therefore, if once succesfully read, later reads are
+    // not allowed.
+    if ( iPhoneUIVariantReadOnlyValues == KPhoneVariantReadOnlyDefaultValue )
+        {
+        err = GetInt( 
+            KCRUidPhoneAppS60Variation, 
+            KPhoneAppS60VariationFlags, 
+            iPhoneAppS60VariantReadOnlyValues );
+        }
+*/
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CPhoneCenRepProxy::Find
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPhoneCenRepProxy::Find(
+    const TUid& aUid,
+    const TUint32 aPartial, 
+    const TUint32 aMask,
+    RArray<TUint32>& aValues ) const
+    {
+    CRepository* repository = NULL;
+    TRAPD( err, repository = CRepository::NewL( aUid ) );
+    if ( err == KErrNone )
+        {
+        TRAP( err, repository->FindL( aPartial, aMask, aValues ) );
+        delete repository;
+        }
+
+    if ( err != KErrNone)
+        {
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhoneCenRepProxy::GetInt() error: %d", 
+            err );
+        __ASSERT_DEBUG( EFalse, Panic( EPhoneUtilsInvariant ) );
+        }
+
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneCenRepProxy::FetchValuesFromCenRepL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CPhoneCenRepProxy::FetchValuesFromCenRepL( 
+                                                TPhoneCmdParamAppInfo& aAppInfo,
+                                                TKeyCode aCode, 
+                                                HBufC8* aAppParam,
+                                                TBool& aValuesFetched )
+    {
+    const TUint32     KPartialKey = 0xFF0000;
+    const TUint32   KLaunchGroupIdMask = 0x00FF00;
+    const TUint32   KLaunchPlaceIdMask = 0x0000FF;
+    const TUint32     KIdmask = 0xFF0000;
+    
+    const TUint32   KLaunchGroupIdShift = 8;
+    const TInt      KUidId = 2;
+    const TInt      KParamId = 3;
+
+    RArray<TUint32> foundKeys;
+    CleanupClosePushL( foundKeys );    
+    
+    CRepository* repository = NULL;
+    repository = CRepository::NewL( KCRUidTelPrivateVariation );
+    
+    TInt err( KErrNone );
+    
+    if ( repository )
+        {
+        CleanupStack::PushL( repository );
+        err = repository->FindL( KPartialKey, KIdmask, foundKeys );
+        }
+
+    if ( KErrNone != err )
+        {
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhoneCenRepProxy::FetchValuesFromCenRepL() error: %d", 
+            err );
+        User::Leave( err );
+        }        
+    
+    TInt uid(0);
+    TInt code(0);
+    HBufC* param = HBufC::NewL( KMaxParamLength );
+    TPtr paramPtr = param->Des();
+    CleanupStack::PushL( param );
+    
+    for ( TInt i = 0; i < foundKeys.Count(); i++ )
+        {
+        User::LeaveIfError( repository->Get(
+                foundKeys[i], code ) );       
+        
+        //peekIndex is used to check if foundKeys-array has a next 
+        //element. For this reason (i+1) is used.
+        TInt peekIndex(i+1);
+        TInt peekGroupId(0);
+        TInt launchGroupID 
+            = ( foundKeys[i] & KLaunchGroupIdMask ) >> KLaunchGroupIdShift;        
+        
+        if( peekIndex < foundKeys.Count() && code == aCode )
+            {
+            peekGroupId =
+            ( foundKeys[peekIndex] & KLaunchGroupIdMask ) 
+                    >> KLaunchGroupIdShift;
+        
+            // Check that group Id is the same as for the key fetched earlier
+            // (KKeyId) and the key id for this key is (KUidId).
+            if( launchGroupID == peekGroupId &&
+                KUidId == ( foundKeys[peekIndex] & KLaunchPlaceIdMask ) )  
+                {
+                User::LeaveIfError( repository->Get(
+                        foundKeys[++i], uid ) );
+                }
+            
+            peekIndex = i+1; // peekIndex update. The actual value is dependant on
+                              // whether variable i was incremented or not in previous if.
+
+            if( peekIndex < foundKeys.Count() )
+                {
+                peekGroupId = 
+                       ( foundKeys[peekIndex] & KLaunchGroupIdMask ) 
+                               >> KLaunchGroupIdShift;
+                // Check that group Id is still the same as for the keys fetched 
+                // earlier (KKeyId and KUidId)
+                // and the key id for this key is (KParamId).
+                if( launchGroupID == peekGroupId &&
+                        KParamId == ( foundKeys[peekIndex] & KLaunchPlaceIdMask ) )
+                    {                
+                    User::LeaveIfError( repository->Get( 
+                            foundKeys[++i], paramPtr ) );
+                    break;
+                    }
+                }
+            }
+        else
+            {
+            i++; // skip uid index (wrong code)
+            i++; // skip parameter index (wrong code)
+            }
+        }
+    
+    if ( uid != 0 )
+        {
+        aAppInfo.SetAppUid( TUid::Uid( uid ) );
+        // TDesc16 to TDesc8 conversion. Central repository supports only
+        // 16 bit buffers, setParam function in TPhoneCmdParamAppInfo wants
+        // 8 bit.
+        TPtr8 eightBitParamPtr = aAppParam->Des();
+        CnvUtfConverter::ConvertFromUnicodeToUtf8( eightBitParamPtr, 
+                paramPtr );         
+        
+        aAppInfo.SetParam( eightBitParamPtr );
+        aValuesFetched = ETrue;
+        }
+    
+    CleanupStack::PopAndDestroy( param ); 
+    CleanupStack::PopAndDestroy( repository );
+    CleanupStack::PopAndDestroy( &foundKeys );
+    }
+
+//  End of File