--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/customization/ThemesAdapter/src/ThemesAdapter.cpp Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,1276 @@
+/*
+* Copyright (c) 2002 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: DM Themes Adapter
+*
+*/
+
+
+/*
+
+./Customization -+--> Themes -+--> AvailableThemes -+--> <X> * -+--> ID
+ | |
+ | |--> Name
+ | |
+ | |--> Version
+ | |
+ | |--> Data
+ | |
+ | |--> InstallOptions
+ |
+ |--> ActiveTheme
+
+*/
+
+
+#include <badesca.h>
+#include <fbs.h>
+#include <imcvcodc.h>
+#include "debug.h"
+#include "ThemesAdapter.h"
+#include "ThemesList.h"
+#include "nsmldmuri.h"
+#include <implementationproxy.h> // For TImplementationProxy definition
+#include <f32file.h>
+#include <e32def.h>
+#include "FileCoderB64.h"
+#include "aminstalloptions.h"
+#include "AknsSrvClient.h"
+#include <AknSkinsInternalCRKeys.h>
+#include <centralrepository.h>
+#include <utf.h>
+//#ifdef __SAP_POLICY_MANAGEMENT
+#include <PolicyEngineXACML.h>
+#include <SettingEnforcementInfo.h>
+//#endif
+#include <featmgr.h>
+
+
+_LIT( KThemesAdapterTmpInstallPath, "c:\\system\\temp\\DMTheme.sis" );
+_LIT8(KOpenBrace, "(");
+_LIT8(KCloseBrace, ")");
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter* CThemesAdapter::NewL( )
+// ------------------------------------------------------------------------------------------------
+CThemesAdapter* CThemesAdapter::NewL( MSmlDmCallback* aDmCallback )
+ {
+ RDEBUG("CThemesAdapter::NewL(): begin");
+
+ CThemesAdapter* self = NewLC( aDmCallback );
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter* CThemesAdapter::NewLC( )
+// ------------------------------------------------------------------------------------------------
+CThemesAdapter* CThemesAdapter::NewLC( MSmlDmCallback* aDmCallback )
+ {
+ RDEBUG("CThemesAdapter::NewLC(): begin");
+ CThemesAdapter* self = new( ELeave ) CThemesAdapter( aDmCallback );
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ return self;
+ }
+
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::CThemesAdapter()
+// ------------------------------------------------------------------------------------------------
+CThemesAdapter::CThemesAdapter( MSmlDmCallback* aDmCallback )
+ : CTARMDmAdapter( aDmCallback )
+ , iCallBack( aDmCallback )
+ , iThemes( 0 )
+ {
+ RDEBUG("CThemesAdapter::CThemesAdapter(): begin");
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::ConstructL()
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::ConstructL( )
+ {
+ TRAPD( errf, FeatureManager::InitializeLibL() );
+ if( errf != KErrNone )
+ {
+ User::Leave(errf);
+ }
+
+ if(FeatureManager::FeatureSupported(KFeatureIdSapThemesAdapter))
+ {
+ RDEBUG("CThemesAdapter::ConstructL(): begin");
+ iThemes = CThemesList::NewL();
+ }
+ else
+ {
+ FeatureManager::UnInitializeLib();
+ User::Leave( KErrNotSupported );
+ }
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::~CThemesAdapter()
+// ------------------------------------------------------------------------------------------------
+
+
+CThemesAdapter::~CThemesAdapter()
+ {
+ RDEBUG("CThemesAdapter::~CThemesAdapter(): begin");
+
+ FeatureManager::UnInitializeLib();
+ delete iThemes;
+ delete iActiveTheme;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::DDFVersionL()
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::DDFVersionL( CBufBase& aDDFVersion )
+ {
+ RDEBUG("CThemesAdapter::DDFVersionL(): begin");
+ aDDFVersion.InsertL( 0, KThemesAdapterDDFVersion );
+ }
+
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::DDFStructureL()
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::DDFStructureL( MSmlDmDDFObject& aDDF )
+ {
+ RDEBUG( "CThemesAdapter::DDFStructureL(): begin" );
+
+ TSmlDmAccessTypes accessTypesGet;
+ accessTypesGet.SetGet();
+
+ TSmlDmAccessTypes accessTypesAddGet;
+ accessTypesAddGet.SetAdd();
+ accessTypesAddGet.SetGet();
+
+ TSmlDmAccessTypes accessTypesGetReplace;
+ accessTypesGetReplace.SetGet();
+ accessTypesGetReplace.SetReplace();
+
+ TSmlDmAccessTypes accessTypesDeleteGetReplace;
+ accessTypesDeleteGetReplace.SetDelete();
+ accessTypesDeleteGetReplace.SetGet();
+ accessTypesDeleteGetReplace.SetReplace();
+//sf- For testing:
+ accessTypesDeleteGetReplace.SetAdd();
+//sf- For testing ends.
+
+ TSmlDmAccessTypes accessTypesReplace;
+ accessTypesReplace.SetReplace();
+
+ /*
+ Node: ./Customization
+ This interior node is the common parent to all customization..
+ Status: Required
+ Occurs: One
+ Format: Node
+ Access Types: Get
+ Values: N/A
+ */
+ // Customization
+ MSmlDmDDFObject& customization = aDDF.AddChildObjectL( KThemesAdapterCustomization );
+ FillNodeInfoL(customization, accessTypesGet, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::ENode, KThemesAdapterCustomizationD, ETrue );
+
+ /*
+ Node: ./Customization/Themes
+
+ Status: Required
+ Occurs: One
+ Format: Node
+ Access Types: Get
+ Values: N/A
+ */
+ MSmlDmDDFObject& themes = customization.AddChildObjectL( KThemesAdapterThemes );
+ FillNodeInfoL( themes, accessTypesGet, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::ENode, KThemesAdapterThemesD, ETrue );
+
+ /*
+ Node: ./Customization/Themes/AvailableThemes
+
+ Status: Required
+ Occurs: One
+ Format: Node
+ Access Types: Add, Get
+ Values: N/A
+ */
+ MSmlDmDDFObject& availableThemes = themes.AddChildObjectL( KThemesAdapterAvailableThemes);
+ FillNodeInfoL( availableThemes, accessTypesAddGet, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::ENode, KThemesAdapterAvailableThemesD, ETrue );
+
+ /*
+ Node: ./Customization/Themes/AvailableThemes/<X>
+
+ Status: Required
+ Occurs: Zero or more
+ Format: Node
+ Access Types: Delete, Get, Replace
+ Values: N/A
+ */
+ MSmlDmDDFObject& oneCurTheme = availableThemes.AddChildObjectGroupL();
+ FillNodeInfoL( oneCurTheme, accessTypesDeleteGetReplace, MSmlDmDDFObject::EZeroOrMore, MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::ENode, KThemesAdapterDynamicNodeD, ETrue );
+
+ /*
+ Node: ./Customization/Themes/AvailableThemes/<X>/ID
+
+ Status: Required
+ Occurs: One
+ Format: Chr
+ Access Types: Get
+ Values: N/A
+ */
+ MSmlDmDDFObject& id = oneCurTheme.AddChildObjectL( KThemesAdapterXId );
+ FillNodeInfoL( id, accessTypesGet, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::EChr, KThemesAdapterXIdD, ETrue );
+
+ /*
+ Node: ./Customization/Themes/AvailableThemes/<X>/Name
+
+ Status: Optional
+ Occurs: One
+ Format: Chr
+ Access Types: Get, Replace
+ Values: N/A
+ */
+ MSmlDmDDFObject& name = oneCurTheme.AddChildObjectL( KThemesAdapterXName );
+ FillNodeInfoL( name, accessTypesGetReplace, MSmlDmDDFObject::EZeroOrOne, MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::EChr, KThemesAdapterXNameD, ETrue );
+
+ /*
+ Node: ./Customization/Themes/AvailableThemes/<X>/Version
+
+ Status: Optional
+ Occurs: One
+ Format: Chr
+ Access Types: Get, Replace
+ Values: N/A
+ */
+ MSmlDmDDFObject& version = oneCurTheme.AddChildObjectL( KThemesAdapterXVersion );
+ FillNodeInfoL( version, accessTypesGetReplace, MSmlDmDDFObject::EZeroOrOne, MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::EChr, KThemesAdapterXVersionD, ETrue );
+
+ /*
+ Node: ./Customization/Themes/AvailableThemes/<X>/Data
+
+ Status: Required
+ Occurs: One
+ Format: Chr
+ Access Types: Get
+ Values: N/A
+ */
+ MSmlDmDDFObject& data = oneCurTheme.AddChildObjectL( KThemesAdapterXData );
+ FillNodeInfoL( data, accessTypesReplace, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::EBin, KThemesAdapterXDataD, ETrue );
+
+
+ /*
+ Node: ./Customization/Themes/AvailableThemes/<X>/InstallOptions
+
+ Status: ?
+ Occurs: One
+ Format: Chr
+ Access Types: Get
+ Values: N/A
+ */
+ MSmlDmDDFObject& installOptions = oneCurTheme.AddChildObjectL( KThemesAdapterXInstallOptions );
+ FillNodeInfoL( installOptions, accessTypesReplace, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::EXml, KThemesAdapterXInstallOptionsD, ETrue );
+
+
+ /*
+ Node: ./Customization/Themes/ActiveTheme
+
+ Status: Required
+ Occurs: One
+ Format: Chr
+ Access Types: Get, Replace
+ Values: N/A
+ */
+ MSmlDmDDFObject& activeTheme = themes.AddChildObjectL( KThemesAdapterActiveTheme );
+ FillNodeInfoL( activeTheme, accessTypesGetReplace, MSmlDmDDFObject::EOne, MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::EChr, KThemesAdapterActiveThemeD, ETrue );
+
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::UpdateLeafObjectL()
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_UpdateLeafObjectL( const TDesC8& aURI, const TDesC8& /*aLUID*/, const TDesC8& aObject, const TDesC8& /*aType*/, const TInt aStatusRef )
+ {
+ RDEBUG( "CThemesAdapter::UpdateLeafObjectL(): begin" );
+
+ TError ret = EOk ;
+
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
+ TNodeId nodeId = NodeId( uriPtrc );
+#else
+ TNodeId nodeId = NodeId( aURI );
+#endif
+
+ switch( nodeId )
+ {
+ case ENodeXName:
+ if (aObject.Length() > 0)
+ {
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ iCallBack->SetMappingL( uriPtrc, aObject );
+#else
+ iCallBack->SetMappingL( aURI, aObject );
+#endif
+ }
+ else
+ {
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ iCallBack->SetMappingL( uriPtrc, _L8(" ") );
+#else
+ iCallBack->SetMappingL( aURI, _L8(" ") );
+#endif
+ }
+ break;
+
+ case ENodeXVersion:
+ if (aObject.Length() > 0)
+ {
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ iCallBack->SetMappingL( uriPtrc, aObject );
+#else
+ iCallBack->SetMappingL( aURI, aObject );
+#endif
+ }
+ else
+ {
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ iCallBack->SetMappingL( uriPtrc, _L8(" ") );
+#else
+ iCallBack->SetMappingL( aURI, _L8(" ") );
+#endif
+ }
+ break;
+
+ case ENodeXData:
+ {
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL( fs );
+
+ TFileCoderB64 decoder;
+ TPtrC fileName( KThemesAdapterTmpInstallPath );
+
+ TBool isEncoded = TFileCoderB64::CheckB64Encode( aObject );
+ if( isEncoded )
+ {
+ decoder.DecodeToL( aObject, fileName );
+ }
+ else
+ {
+ // aData is original data, save it to fileName
+ RFile file;
+ User::LeaveIfError( file.Replace( fs, fileName, EFileWrite));
+ CleanupClosePushL( file );
+ file.Write( aObject );
+
+ CleanupStack::PopAndDestroy(); // file
+ }
+
+ TBuf8<KMaxUidName+20> sisPkgUid;
+ TBuf8<KAknsPkgIDDesSize> themePkgId;
+
+ // Install using options if given and otherwise with default options
+ ret = iThemes->InstallThemeL( fileName, sisPkgUid, themePkgId );
+
+ // Set LUIDs for theme and theme/id
+ if (ret == KErrNone)
+ {
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 parentURI = NSmlDmURI::ParentURI( uriPtrc );
+#else
+ TPtrC8 parentURI = NSmlDmURI::ParentURI( aURI );
+#endif
+ HBufC8* dataURI = HBufC8::NewLC( parentURI.Length() + KThemesAdapterXData().Length() + 1 );
+ HBufC8* idURI = HBufC8::NewLC( parentURI.Length() + KThemesAdapterXId().Length() + 1 );
+ dataURI->Des().Copy( parentURI );
+ dataURI->Des().Append( KSlash );
+ dataURI->Des().Append( KThemesAdapterXData );
+ idURI->Des().Copy( parentURI );
+
+ iCallBack->SetMappingL( *dataURI, sisPkgUid );
+ iCallBack->SetMappingL( *idURI, themePkgId );
+
+ CleanupStack::PopAndDestroy( idURI );
+ CleanupStack::PopAndDestroy( dataURI );
+
+ if( iActiveTheme != NULL )
+ {
+ TPtrC8 pid = NSmlDmURI::LastURISeg( *iActiveTheme );
+ HBufC8* themeRef = HBufC8::NewLC( KThemesAdapterActiveThemeRef().Length() + pid.Length() + 1 );
+ themeRef->Des().Copy( KThemesAdapterActiveThemeRef );
+ themeRef->Des().Append( pid );
+ HBufC8* luid = iCallBack->GetLuidAllocL( *themeRef );
+ CleanupStack::PushL( luid );
+
+ if (luid->Length() > 1)
+ {
+ pid.Set( *luid );
+ ret = iThemes->SetActiveThemeL( pid );
+ delete iActiveTheme;
+ iActiveTheme = NULL;
+ }
+
+ CleanupStack::PopAndDestroy( luid );
+ CleanupStack::PopAndDestroy( themeRef );
+
+ }
+
+ }
+
+ // Remove temporary installations file
+ fs.Delete( fileName );
+ CleanupStack::PopAndDestroy( &fs );
+ }
+ break;
+
+ case ENodeXInstallOptions:
+ ret = iThemes->SetInstallOptionsL( aObject );
+ break;
+
+ case ENodeActiveTheme:
+ {
+ if( iActiveTheme != NULL )
+ {
+ delete iActiveTheme;
+ iActiveTheme = NULL;
+ }
+ iActiveTheme = aObject.AllocL();
+ TPtrC8 pid = NSmlDmURI::LastURISeg( aObject );
+ HBufC8* themeRef = HBufC8::NewLC( KThemesAdapterActiveThemeRef().Length() + pid.Length() + 1 );
+ themeRef->Des().Copy( KThemesAdapterActiveThemeRef );
+ themeRef->Des().Append( pid );
+ HBufC8* luid = iCallBack->GetLuidAllocL( *themeRef );
+ CleanupStack::PushL( luid );
+
+ if (luid->Length() > 1)
+ {
+ pid.Set( *luid );
+ }
+ ret = iThemes->SetActiveThemeL( pid );
+ if( ret == MSmlDmAdapter::EOk )
+ {
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ iCallBack->SetMappingL( uriPtrc, *themeRef );
+#else
+ iCallBack->SetMappingL( aURI, *themeRef );
+#endif
+ }
+ else
+ {
+ ret = EError;
+ }
+
+ delete iActiveTheme;
+ iActiveTheme = NULL;
+
+ CleanupStack::PopAndDestroy( luid );
+ CleanupStack::PopAndDestroy( themeRef );
+ }
+ break;
+
+ default:
+ ret = EError;
+ break;
+ }
+
+ iCallBack->SetStatusL( aStatusRef, ret );
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_UpdateLeafObjectL( const TDesC8& /*aURI*/, const TDesC8& /*aLUID*/, RWriteStream*& /*aStream*/, const TDesC8& /*aType*/, TInt aStatusRef )
+ {
+ RDEBUG( "CThemesAdapter::UpdateLeafObjectL(...RWriteStream...): begin" );
+ TError ret = EError ;
+ iCallBack->SetStatusL( aStatusRef, ret );
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::DeleteObjectL( const TDesC& aURI, const TDesC& aLUID )
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_DeleteObjectL( const TDesC8& aURI, const TDesC8& /*aLUID*/, const TInt aStatusRef)
+ {
+ RDEBUG( "CThemesAdapter::DeleteObjectL(): begin" );
+
+ TError ret = EOk ;
+
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
+ TNodeId nodeId = NodeId( uriPtrc );
+#else
+ TNodeId nodeId = NodeId( aURI );
+#endif
+
+ switch( nodeId )
+ {
+ case ENodeX:
+ {
+ TUint pkgUid = 0;
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ HBufC8* dataURI = HBufC8::NewLC( uriPtrc.Length() + KThemesAdapterXData().Length() + 1 );
+ dataURI->Des().Append( uriPtrc );
+#else
+ HBufC8* dataURI = HBufC8::NewLC( aURI.Length() + KThemesAdapterXData().Length() + 1 );
+ dataURI->Des().Append( aURI );
+#endif
+
+ HBufC8* themeId = iCallBack->GetLuidAllocL( *dataURI );
+ CleanupStack::PushL( themeId );
+
+ dataURI->Des().Append( KSlash );
+ dataURI->Des().Append( KThemesAdapterXData );
+ HBufC8* luid = iCallBack->GetLuidAllocL( *dataURI );
+ CleanupStack::PushL( luid );
+
+ if (luid->CompareF(KNullDesC8) == 0 )
+ {
+ ret = ENotFound;
+ CleanupStack::PopAndDestroy( 3 ); //luid, themeId, dataURI
+ break;
+ }
+
+ TLex8 parser( *luid );
+ if ((parser.Get() == '[') &&
+ (parser.Val( pkgUid, EHex ) == KErrNone) &&
+ (parser.Get() == ']'))
+ {
+ //luid for getting index
+ ret = iThemes->DeleteThemeL( *themeId, TUid::Uid( pkgUid ),luid);
+ }
+ else
+ {
+ ret = ENotAllowed;
+ }
+
+ CleanupStack::PopAndDestroy( 3 );
+
+ }
+ break;
+
+ default:
+ ret = EError;
+ break;
+ }
+
+ iCallBack->SetStatusL( aStatusRef, ret );
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::GetLeafObjectL( const TDesC& aURI, const TDesC& aLUID, const TDesC& aType, CBufBase& aObject, TError& aRet )
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::GetLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, const TDesC8& /*aType*/, CBufBase& aResult, TError& aRet )
+ {
+ RDEBUG("CThemesAdapter::GetLeafObjectL(): begin");
+ aRet = EOk;
+
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
+ TNodeId nodeId = NodeId( uriPtrc );
+ TPtrC8 parentURI = NSmlDmURI::ParentURI( uriPtrc );
+#else
+ TNodeId nodeId = NodeId( aURI );
+ TPtrC8 parentURI = NSmlDmURI::ParentURI( aURI );
+#endif
+
+ TPtrC8 pid = NSmlDmURI::LastURISeg( parentURI );
+
+ HBufC8* parentLUID = iCallBack->GetLuidAllocL(parentURI);
+ CleanupStack::PushL(parentLUID);
+
+ //Check for Active theme; if it is not, then only check for DM installed parent node
+ if (nodeId != ENodeActiveTheme && parentLUID->CompareF(KNullDesC8) == 0)
+ {
+ aRet = ENotFound;
+ }
+
+ if (aRet == EOk)
+ {
+ HBufC8* trimmedLUID = aLUID.AllocL();
+ CleanupStack::PushL(trimmedLUID);
+ trimmedLUID->Des().Trim();
+
+ switch (nodeId)
+ {
+ case ENodeXId:
+ if (trimmedLUID->Length() > 0 && *trimmedLUID != *parentLUID)
+ {
+ aResult.InsertL(aResult.Size(), aLUID);
+ }
+ else
+ {
+ if (parentLUID->Length() > 1)
+ {
+ pid.Set(*parentLUID);
+ }
+ aRet = iThemes->GetThemeIdL(pid, aResult);
+ }
+ break;
+
+ case ENodeXName:
+ {
+
+ if (trimmedLUID->Length() > 0 && *trimmedLUID != *parentLUID)
+ {
+ aResult.InsertL(aResult.Size(), aLUID);
+ }
+ if (parentLUID->Length() > 1)
+ {
+ pid.Set(*parentLUID);
+ aResult.InsertL(aResult.Size(), KOpenBrace);
+ aRet = iThemes->GetThemeNameL(pid, aResult);
+ aResult.InsertL(aResult.Size(), KCloseBrace);
+ }
+ }
+ break;
+
+ case ENodeXVersion:
+ if (trimmedLUID->Length() > 0 && *trimmedLUID != *parentLUID)
+ {
+ aResult.InsertL(aResult.Size(), aLUID);
+ }
+ else
+ {
+ if (parentLUID->Length() > 1)
+ {
+ pid.Set(*parentLUID);
+ }
+ aRet = iThemes->GetThemeVersionL(pid, aResult);
+ }
+ break;
+
+ case ENodeActiveTheme:
+ {
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
+ HBufC8* luid = iCallBack->GetLuidAllocL( uriPtrc );
+#else
+ HBufC8* luid = iCallBack->GetLuidAllocL(aURI);
+#endif
+ CleanupStack::PushL(luid);
+
+ HBufC8* themePID = iCallBack->GetLuidAllocL(aLUID);
+ CleanupStack::PushL(themePID);
+ // Get the current active theme UID
+ TAknsPkgIDBuf buf;
+ CRepository* skinsRepository = CRepository::NewLC(
+ KCRUidPersonalisation);
+ TInt errCode = skinsRepository->Get(KPslnActiveSkinUid, buf);
+
+ HBufC16* themePID16 = HBufC16::NewLC(themePID->Length());
+ themePID16->Des().Copy(themePID->Des());
+
+ if (themePID16->Compare(buf) == 0)
+ {
+ RDEBUG("CThemesAdapter::GetLeafObjectL(): UIDs MATCH ");
+ aResult.InsertL(aResult.Size(), *luid);
+ aResult.InsertL(aResult.Size(), KOpenBrace);
+ aRet = iThemes->GetThemeNameL(*themePID, aResult);
+ aResult.InsertL(aResult.Size(), KCloseBrace);
+ }
+ else
+ {
+ //means Active theme set by DM server is changed to some other theme
+ //manually from settings
+ RDEBUG(
+ "CThemesAdapter::GetLeafObjectL(): UIDs Doesn't MATCH ");
+ HBufC8* buf8 = HBufC8::NewLC(KAknsPkgIDDesSize);
+ buf8->Des().Copy(buf);
+ aRet = iThemes->GetThemeNameL(*buf8, aResult);
+ CleanupStack::PopAndDestroy(buf8);
+ }
+ CleanupStack::PopAndDestroy(themePID16);
+ CleanupStack::PopAndDestroy(skinsRepository);
+ CleanupStack::PopAndDestroy(themePID);
+ CleanupStack::PopAndDestroy(luid);
+ }
+ break;
+
+ default:
+ aRet = EError;
+ break;
+ }
+
+ CleanupStack::PopAndDestroy(trimmedLUID);
+ }
+ CleanupStack::PopAndDestroy( parentLUID );
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::FetchLeafObjectL( const TDesC& aURI, const TDesC& aLUID, const TDesC& aType, CBufBase& aObject )
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_FetchLeafObjectL( const TDesC8& aURI, const TDesC8& aLUID, const TDesC8& aType, const TInt aResultsRef, const TInt aStatusRef )
+ {
+ RDEBUG("CThemesAdapter::FetchLeafObjectL(): begin");
+
+ TError ret = EOk ;
+
+ CBufBase *result = CBufFlat::NewL( 128 );
+ CleanupStack::PushL( result );
+
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
+ GetLeafObjectL( uriPtrc, aLUID, aType, *result, ret );
+#else
+ GetLeafObjectL( aURI, aLUID, aType, *result, ret );
+#endif
+
+ if (ret == EOk)
+ {
+ iCallBack->SetResultsL( aResultsRef, *result, KThemesAdapterTextPlain() );
+ }
+
+ iCallBack->SetStatusL( aStatusRef, ret );
+
+ CleanupStack::PopAndDestroy( result );
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_FetchLeafObjectSizeL( const TDesC8& aURI, const TDesC8& aLUID, const TDesC8& aType, TInt aResultsRef, TInt aStatusRef )
+ {
+ RDEBUG("CThemesAdapter::FetchLeafObjectSizeL(): begin");
+
+ TError ret = EOk ;
+
+ CBufBase *result = CBufFlat::NewL( 128 );
+ CleanupStack::PushL( result );
+
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
+ GetLeafObjectL( uriPtrc, aLUID, aType, *result, ret );
+#else
+ GetLeafObjectL( aURI, aLUID, aType, *result, ret );
+#endif
+
+ if (ret == EOk)
+ {
+ TBuf8<20> len;
+ len.AppendNum( result->Size() );
+ result->Reset();
+ result->InsertL( 0, len );
+
+ iCallBack->SetResultsL( aResultsRef, *result, KThemesAdapterTextPlain() );
+ }
+
+ iCallBack->SetStatusL( aStatusRef, ret );
+
+ CleanupStack::PopAndDestroy( result );
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::ChildURIListL( const TDesC& aURI, const TDesC& aParentLUID, const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList, CArrayFix<TPtrC>& aCurrentURISegmentList )
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_ChildURIListL( const TDesC8& aURI, const TDesC8& /*aLUID*/, const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList, const TInt aResultsRef, const TInt aStatusRef )
+ {
+ RDEBUG("CThemesAdapter::ChildURIListL(): begin");
+
+ TError ret = EOk ;
+
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
+ TNodeId nodeId = NodeId( uriPtrc );
+#else
+ TNodeId nodeId = NodeId( aURI );
+#endif
+
+ CBufBase *currentList = CBufFlat::NewL( 128 );
+ CleanupStack::PushL( currentList );
+
+
+
+
+ switch (nodeId)
+ {
+ case ENodeCustomization:
+ currentList->InsertL(currentList->Size(), KThemesAdapterThemes);
+ break;
+
+ case ENodeThemes:
+ currentList->InsertL(currentList->Size(),
+ KThemesAdapterAvailableThemes);
+ currentList->InsertL(currentList->Size(), KSlash);
+ currentList->InsertL(currentList->Size(),
+ KThemesAdapterActiveTheme);
+ break;
+
+ case ENodeAvailableThemes:
+ {
+ CDesC8ArrayFlat* newThemes = new (ELeave) CDesC8ArrayFlat(16);
+ CleanupStack::PushL(newThemes);
+
+ CDesC8ArrayFlat* themes = new (ELeave) CDesC8ArrayFlat(32);
+ CleanupStack::PushL(themes);
+
+ iThemes->GetInstalledPIDListL(aPreviousURISegmentList, *themes,
+ *newThemes);
+
+ SyncWithAvkonSkinDB(*themes);
+ //get actual theme names and send to DM server
+ TInt i = 0;
+ TPtrC8 pid;
+ for (i = 0; i < themes->Count(); i++)
+ {
+
+ HBufC8* themeRef = HBufC8::NewLC(
+ KThemesAdapterActiveThemeRef().Length()
+ + (*themes)[i].Length() + 1);
+ themeRef->Des().Copy(KThemesAdapterActiveThemeRef);
+ themeRef->Des().Append((*themes)[i]);
+ HBufC8* luid = iCallBack->GetLuidAllocL(*themeRef);
+ CleanupStack::PushL(luid);
+
+ if (luid->Length() > 1)
+ {
+ if (currentList->Size() > 0)
+ {
+ currentList->InsertL(currentList->Size(), KSlash);
+ }
+ pid.Set(*luid);
+ currentList->InsertL(currentList->Size(), (*themes)[i]);
+ currentList->InsertL(currentList->Size(), KOpenBrace);
+ TInt ret = iThemes->GetThemeNameL(pid, *currentList);
+ currentList->InsertL(currentList->Size(), KCloseBrace);
+ }
+ CleanupStack::PopAndDestroy(luid);
+ CleanupStack::PopAndDestroy(themeRef);
+ }
+ for (i = 0; i < newThemes->Count(); i++)
+ {
+ if (currentList->Size() > 0)
+ {
+ currentList->InsertL(currentList->Size(), KSlash);
+ }
+ pid.Set((*newThemes)[i]);
+ TInt ret = iThemes->GetThemeNameL(pid, *currentList);
+ }
+
+ CleanupStack::PopAndDestroy(themes);
+ CleanupStack::PopAndDestroy(newThemes);
+ }
+ break;
+
+ case ENodeX:
+ {
+ //Determine whether the node is DM installed node
+ HBufC8* lUID = iCallBack->GetLuidAllocL(aURI);
+
+ if (lUID->CompareF(KNullDesC8) == 0)
+ {
+ ret = ENotFound;
+ }
+
+ delete lUID;
+
+ if (ret == EOk)
+ {
+ currentList->InsertL(currentList->Size(), KThemesAdapterXId);
+ currentList->InsertL(currentList->Size(), KSlash);
+ currentList->InsertL(currentList->Size(), KThemesAdapterXName);
+ currentList->InsertL(currentList->Size(), KSlash);
+ currentList->InsertL(currentList->Size(),
+ KThemesAdapterXVersion);
+ currentList->InsertL(currentList->Size(), KSlash);
+ currentList->InsertL(currentList->Size(), KThemesAdapterXData);
+ currentList->InsertL(currentList->Size(), KSlash);
+ currentList->InsertL(currentList->Size(),
+ KThemesAdapterXInstallOptions);
+ }
+
+ break;
+ }
+
+ case ENodeXId:
+ // No children, leave list empty
+ break;
+
+ case ENodeXName:
+ // No children, leave list empty
+ break;
+
+ case ENodeXVersion:
+ // No children, leave list empty
+ break;
+
+ case ENodeXData:
+ // No children, leave list empty
+ break;
+
+ case ENodeXInstallOptions:
+ // No children, leave list empty
+ break;
+
+ case ENodeActiveTheme:
+ // No children, leave list empty
+ break;
+
+ case ENodeUnknown:
+ ret = ENotFound;
+ break;
+
+ default:
+ break;
+ }
+ if( ret == EOk )
+ {
+ iCallBack->SetResultsL( aResultsRef, *currentList, KNullDesC8 );
+ }
+
+ iCallBack->SetStatusL(aStatusRef, ret);
+
+ CleanupStack::PopAndDestroy(currentList); //currentList
+ }
+
+
+// ------------------------------------------------------------------------------------------------
+// CThemesAdapter::AddNodeObjectL( const TDesC& aURI, const TDesC& aParentLUID )
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_AddNodeObjectL( const TDesC8& aURI, const TDesC8& /*aParentLUID*/, const TInt aStatusRef )
+ {
+ RDEBUG("CThemesAdapter::AddNodeObjectL(): begin");
+
+ TError ret = EOk ;
+
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
+ TPtrC8 parentURI = NSmlDmURI::ParentURI( uriPtrc );
+#else
+ TPtrC8 parentURI = NSmlDmURI::ParentURI( aURI );
+#endif
+
+ TNodeId parentNodeId = NodeId( parentURI );
+
+
+ HBufC8* parentLUID = iCallBack->GetLuidAllocL( parentURI );
+ CleanupStack::PushL( parentLUID );
+
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ HBufC8* trimmedLUID = iCallBack->GetLuidAllocL( uriPtrc );
+#else
+ HBufC8* trimmedLUID = iCallBack->GetLuidAllocL( aURI );
+#endif
+
+ CleanupStack::PushL( trimmedLUID );
+ trimmedLUID->Des().Trim();
+
+ switch( parentNodeId )
+ {
+ case ENodeAvailableThemes:
+ // Set LUID mapping to make this new node permanent
+ if ( trimmedLUID->Length() > 0 && *trimmedLUID != *parentLUID)
+ {
+ ret = EAlreadyExists;
+ }
+ else
+ {
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ iCallBack->SetMappingL( uriPtrc, _L8(" ") );
+#else
+ iCallBack->SetMappingL( aURI, _L8(" ") );
+#endif
+ }
+ break;
+
+ default:
+ ret = EError;
+ break;
+ }
+
+ // Cleanup
+ CleanupStack::Pop( trimmedLUID );
+ CleanupStack::Pop( parentLUID );
+
+ iCallBack->SetStatusL( aStatusRef, ret );
+ }
+
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_ExecuteCommandL( const TDesC8& /*aURI*/, const TDesC8& /*aLUID*/, const TDesC8& /*aArgument*/, const TDesC8& /*aType*/, TInt aStatusRef )
+ {
+ RDEBUG("CThemesAdapter::ExecuteCommandL(): begin");
+ //Not supported
+ TError ret = EError;
+ iCallBack->SetStatusL( aStatusRef, ret );
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_ExecuteCommandL( const TDesC8& /*aURI*/, const TDesC8& /*aLUID*/, RWriteStream*& /*aStream*/, const TDesC8& /*aType*/, TInt aStatusRef )
+ {
+ RDEBUG("CThemesAdapter::ExecuteCommandL(...RWriteStream...): begin");
+ //Not supported
+ TError ret = EError;
+ iCallBack->SetStatusL( aStatusRef, ret );
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::_CopyCommandL( const TDesC8& /*aTargetURI*/, const TDesC8& /*aTargetLUID*/, const TDesC8& /*aSourceURI*/, const TDesC8& /*aSourceLUID*/, const TDesC8& /*aType*/, TInt aStatusRef )
+ {
+ RDEBUG("CThemesAdapter::CopyCommandL(): begin");
+ //Not supported
+ TError ret = EError;
+ iCallBack->SetStatusL( aStatusRef, ret );
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::StartAtomicL()
+ {
+ RDEBUG("CThemesAdapter::StartAtomicL(): begin");
+ //Not supported
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::CommitAtomicL()
+ {
+ RDEBUG("CThemesAdapter::CommitAtomicL(): begin");
+ //Not supported
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::RollbackAtomicL()
+ {
+ RDEBUG("CThemesAdapter::RollbackAtomicL(): begin");
+ //Not supported
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+TBool CThemesAdapter::StreamingSupport( TInt& /*aItemSize*/ )
+ {
+ RDEBUG("CThemesAdapter::StreamingSupport(): begin");
+ return EFalse;
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+void CThemesAdapter::StreamCommittedL( RWriteStream& /*aStream*/ )
+#else
+void CThemesAdapter::StreamCommittedL()
+#endif
+ {
+ RDEBUG("CThemesAdapter::StreamCommittedL(): begin");
+ RDEBUG("CThemesAdapter::StreamCommittedL(): end");
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+void CThemesAdapter::CompleteOutstandingCmdsL()
+ {
+ RDEBUG("CThemesAdapter::CompleteOutstandingCmdsL(): begin");
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+//#ifdef __SAP_POLICY_MANAGEMENT
+TPtrC8 CThemesAdapter::PolicyRequestResourceL( const TDesC8& /*aURI*/ )
+ {
+ if(!FeatureManager::FeatureSupported(KFeatureIdSapPolicyManagement ))
+ {
+ User::Leave(KErrNotSupported);
+ }
+ RDEBUG("CThemesAdapter::PolicyRequestResourceL(): begin");
+ return PolicyEngineXACML::KCustomizationManagement();
+ }
+//#endif
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+CThemesAdapter::TNodeId CThemesAdapter::NodeId( const TDesC8& aURI )
+ {
+ TNodeId id = ENodeUnknown;
+
+#ifdef __TARM_SYMBIAN_CONVERGENCY
+ TPtrC8 uriPtrc = NSmlDmURI::RemoveDotSlash( aURI );
+ TInt cnt( NSmlDmURI::NumOfURISegs( uriPtrc ) );
+ TPtrC8 app( NSmlDmURI::LastURISeg( uriPtrc ) );
+#else
+ TInt cnt( NSmlDmURI::NumOfURISegs( aURI ) );
+ TPtrC8 app( NSmlDmURI::LastURISeg( aURI ) );
+#endif
+
+ if ( cnt == 1 )
+ {
+ // /Customization (G)
+ if (app == KThemesAdapterCustomization)
+ {
+ id = ENodeCustomization;
+ }
+ }
+ else if ( cnt == 2 )
+ {
+ // /Customization/Themes (G)
+ if (app == KThemesAdapterThemes)
+ {
+ id = ENodeThemes;
+ }
+ }
+ else if ( cnt == 3 )
+ {
+ // /Customization/Themes/AvailableThemes (AG)
+ // /Customization/Themes/ActiveTheme (GR)
+ if (app == KThemesAdapterAvailableThemes)
+ {
+ id = ENodeAvailableThemes;
+ }
+ else if (app == KThemesAdapterActiveTheme)
+ {
+ id = ENodeActiveTheme;
+ }
+ }
+ else if (cnt == 4)
+ {
+ // /Customization/Themes/CurrentThemes/<X> (DGR)
+ id = ENodeX;
+ }
+ else if (cnt == 5)
+ {
+ // /Customization/Themes/CurrentThemes/<X>/ID (G)
+ // /Customization/Themes/CurrentThemes/<X>/Name (GR)
+ // /Customization/Themes/CurrentThemes/<X>/Version (GR)
+ // /Customization/Themes/CurrentThemes/<X>/Data (R)
+ // /Customization/Themes/CurrentThemes/<X>/InstallOptions (R)
+ if (app == KThemesAdapterXId)
+ {
+ id = ENodeXId;
+ }
+ else if (app == KThemesAdapterXName)
+ {
+ id = ENodeXName;
+ }
+ else if (app == KThemesAdapterXVersion)
+ {
+ id = ENodeXVersion;
+ }
+ else if (app == KThemesAdapterXData)
+ {
+ id = ENodeXData;
+ }
+ else if (app == KThemesAdapterXInstallOptions)
+ {
+ id = ENodeXInstallOptions;
+ }
+ }
+
+ return id;
+ }
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+const TImplementationProxy ImplementationTable[] =
+ {
+ { {KThemesAdapterImplUid}, (TProxyNewLPtr)CThemesAdapter::NewL }
+ };
+
+// ------------------------------------------------------------------------------------------------
+//
+// ------------------------------------------------------------------------------------------------
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+ {
+ aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+ return ImplementationTable;
+ }
+
+// -------------------------------------------------------------------------------------
+// CThemesAdapter::FillNodeInfoL()
+// Fills the node info in ddf structure
+// -------------------------------------------------------------------------------------
+void CThemesAdapter::FillNodeInfoL( MSmlDmDDFObject& aNode,TSmlDmAccessTypes aAccTypes,
+ MSmlDmDDFObject::TOccurence aOccurrence, MSmlDmDDFObject::TScope aScope,
+ MSmlDmDDFObject::TDFFormat aFormat,const TDesC8& aDescription,TBool /*aObjectGroup*/)
+ {
+ aNode.SetAccessTypesL(aAccTypes);
+ aNode.SetOccurenceL(aOccurrence);
+ aNode.SetScopeL(aScope);
+ aNode.SetDFFormatL(aFormat);
+ if(aFormat!=MSmlDmDDFObject::ENode)
+ {
+ aNode.AddDFTypeMimeTypeL(KThemesAdapterTextPlain);
+ }
+ aNode.SetDescriptionL(aDescription);
+ }
+
+// -------------------------------------------------------------------------------------
+// CThemesAdapter::IsImage()
+// Checks whether the given mime type is image format (that we support)
+// -------------------------------------------------------------------------------------
+TBool CThemesAdapter::IsImage(const TDesC& aMime)
+ {
+
+ if (aMime == _L("image/jpeg") || aMime == _L("image/gif"))
+ {
+ return ETrue;
+ }
+ return ETrue ;
+ //return EFalse;
+ }
+void CThemesAdapter::SyncWithAvkonSkinDB(CDesC8ArrayFlat& themes)
+ {
+ TInt i = 0;
+ TPtrC8 pid;
+ for (i=0; i<themes.Count(); i++)
+ {
+ HBufC8* themeRef = HBufC8::NewLC(KThemesAdapterActiveThemeRef().Length() + themes[i].Length() + 1);
+ themeRef->Des().Copy(KThemesAdapterActiveThemeRef);
+ themeRef->Des().Append(themes[i]);
+ HBufC8* luid = iCallBack->GetLuidAllocL( *themeRef);
+ CleanupStack::PushL(luid);
+
+ if (luid->Length() > 1)
+ {
+ pid.Set( *luid);
+ }
+ CBufBase *themeName = CBufFlat::NewL( 128);
+ CleanupStack::PushL(themeName);
+ TInt ret = iThemes->GetThemeNameL(pid, *themeName);
+ if (themeName->Size()== 0)
+ {
+ iCallBack->SetMappingL( *themeRef, KNullDesC8);
+ }
+ CleanupStack::PopAndDestroy(themeName);
+ CleanupStack::PopAndDestroy(luid);
+ CleanupStack::PopAndDestroy(themeRef);
+ }
+ }