diff -r 000000000000 -r 3ce708148e4d customization/ThemesAdapter/src/ThemesList.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/customization/ThemesAdapter/src/ThemesList.cpp Thu Dec 17 08:40:12 2009 +0200 @@ -0,0 +1,803 @@ +/* +* 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 List +* +*/ + + +#include "ThemesList.h" + +#include +#include // For TImplementationProxy definition +#include +#include +#include +#include +#include + +#include "FileCoderB64.h" +#include "aminstalloptions.h" +#include "debug.h" + +#ifdef RD_MULTIPLE_DRIVE +#include +#endif //RD_MULTIPLE_DRIVEs + +_LIT8( KSlash, "/" ); +_LIT8(KCol,":"); +const TInt KPostTimeOut = 10000000; // 10 seconds + + +// ------------------------------------------------------------------------------------------------ +// CThemesList* CThemesList::NewL( ) +// ------------------------------------------------------------------------------------------------ +CThemesList* CThemesList::NewL( ) //sf-MSmlDmCallback* aDmCallback ) + { + RDEBUG("CThemesList::NewL(): begin"); + + CThemesList* self = NewLC(); + CleanupStack::Pop(); + return self; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList* CThemesList::NewLC( ) +// ------------------------------------------------------------------------------------------------ +CThemesList* CThemesList::NewLC( ) //sf-MSmlDmCallback* aDmCallback ) + { + CThemesList* self = new( ELeave ) CThemesList(); + CleanupStack::PushL( self ); + self->ConstructL( ); + return self; + } + + +// ------------------------------------------------------------------------------------------------ +// CThemesList::CThemesList() +// ------------------------------------------------------------------------------------------------ +CThemesList::CThemesList( ) //sf-MSmlDmCallback* aDmCallback ) +//sf- : iCallBack( aDmCallback ) + : iDirty( ETrue ) + , iAknsSrv( ) + , iSkins( 0 ) + , iInstallOptions() + { + GetDefaultInstallOptions( iInstallOptions ); + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::ConstructL() +// ------------------------------------------------------------------------------------------------ +void CThemesList::ConstructL( ) + { + User::LeaveIfError( iAknsSrv.Connect() ); + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::~CThemesList() +// ------------------------------------------------------------------------------------------------ +CThemesList::~CThemesList() + { + if (iSkins) + { + iSkins->ResetAndDestroy(); + delete iSkins; + } + iAknsSrv.Close(); + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::GetInstalledPIDListL() +// ------------------------------------------------------------------------------------------------ + +MSmlDmAdapter::TError CThemesList::GetInstalledPIDListL( const CArrayFix& aPreviousList, CDesC8ArrayFlat& themes, CDesC8Array& aNewThemes ) + { + TInt i = 0; + TInt pos = 0; + + CheckUpdatesL(); + + CDesC8ArrayFlat* luids = new (ELeave) CDesC8ArrayFlat( 32 ); + CleanupStack::PushL( luids ); + + // Create list of existing themes + for (i = 0 ; i < aPreviousList.Count() ; i++) + { + themes.AppendL( aPreviousList[i].iURISeg ); + luids->AppendL( aPreviousList[i].iURISegLUID ); + } + + // Find and add missing themes + + for (i = 0 ; i < iSkins->Count() ; i++) + { + TAknsPkgIDBuf pidBuf; + TBuf8 name; + + TAknsPkgID pid = (*iSkins)[i]->PID(); + pid.CopyToDes( pidBuf ); + name.Copy( pidBuf ); + + if (luids->Find( name, pos ) != 0) + { + // not found + // Check that current "name" is not in use + if (themes.Find( name, pos ) != 0) + { + // not found + // add it to both current and new themes + // themes->AppendL( name ); + aNewThemes.AppendL( name ); + } + } + } + + // Fill result +#if 0 + for (i = 0 ; i < themes->Count() ; i++) + { + if (i > 0) + { + aList.InsertL( aList.Size(), KSlash ); + } + aList.InsertL( aList.Size(), (*themes)[i] ); + } + +#endif + // Cleanup + CleanupStack::PopAndDestroy( luids ); + //CleanupStack::PopAndDestroy( themes ); + + return MSmlDmAdapter::EOk; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::GetThemeIdL() +// ------------------------------------------------------------------------------------------------ +MSmlDmAdapter::TError CThemesList::GetThemeIdL( const TDesC8& aPID, CBufBase& aResult ) + { + MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound; + + CAknsSrvSkinInformationPkg* theme = FindThemeL( aPID ); + if (theme != 0) + { + TAknsPkgIDBuf pid; + theme->PID().CopyToDes( pid ); + TBuf8 pid8; + pid8.Copy( pid ); + aResult.InsertL( aResult.Size(), pid8 ); + ret = MSmlDmAdapter::EOk; + } + + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::GetThemeNameL() +// ------------------------------------------------------------------------------------------------ +MSmlDmAdapter::TError CThemesList::GetThemeNameL( const TDesC8& aPID, CBufBase& aResult ) + { + MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound; + + CAknsSrvSkinInformationPkg* theme = FindThemeL( aPID ); + if (theme != 0) + { + TDesC& name = theme->Name(); + HBufC8* buf = HBufC8::NewLC( name.Length() ); + buf->Des().Copy( name ); + aResult.InsertL( aResult.Size(), *buf ); + CleanupStack::PopAndDestroy( buf ); + ret = MSmlDmAdapter::EOk; + } + + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::GetThemeVersionL() +// ------------------------------------------------------------------------------------------------ +MSmlDmAdapter::TError CThemesList::GetThemeVersionL( const TDesC8& aPID, CBufBase& /*aResult*/ ) + { + MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound; + + CAknsSrvSkinInformationPkg* theme = FindThemeL( aPID ); + if (theme != 0) + { + // Empty version, not supported (yet?) + ret = MSmlDmAdapter::EOk; + } + + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::GetActiveThemeL() +// ------------------------------------------------------------------------------------------------ +MSmlDmAdapter::TError CThemesList::GetActiveThemeL( CBufBase& aResult ) + { + MSmlDmAdapter::TError ret = MSmlDmAdapter::EOk; + TInt errCode = KErrNone; + TAknsPkgID pid = KAknsNullPkgID; + TAknsPkgIDBuf buf; + + CRepository* skinsRepository = CRepository::NewLC( KCRUidPersonalisation ); + + errCode = skinsRepository->Get( KPslnActiveSkinUid, buf ); + if( errCode == KErrNone ) + { + TRAP( errCode, pid.SetFromDesL( buf ) ); + } + if( errCode != KErrNone ) + { +//sf- pid.Set( KAknsPIDDefaultSystemSkin ); +//sf- changes to KAknsPIDS60DefaltSystemSkin and +//sf- to KAknsPIDProductDefaultSystemSkin +//sf- and the product default should be used (because variation might be done). +//sf- Starting from S60 3.1 wk50 or wk52 +//sf- But: CenRep key should always hold a value so this code is not necessary. + } + + pid.CopyToDes( buf ); + + CleanupStack::PopAndDestroy( skinsRepository ); + skinsRepository = 0; + + TBuf8 buf8; + buf8.Copy( buf ); + + aResult.InsertL( aResult.Size(), buf8 ); + + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::SetActiveThemeL() +// ------------------------------------------------------------------------------------------------ +MSmlDmAdapter::TError CThemesList::SetActiveThemeL( const TDesC8& aPID ) + { + MSmlDmAdapter::TError ret = MSmlDmAdapter::EOk; + TInt errCode = KErrNone; + + CAknsSrvSkinInformationPkg* theme = FindThemeL( aPID ); + if (theme == 0) + { + errCode = KErrNotFound; + } + if (errCode == KErrNone) + { + errCode = iAknsSrv.SetAllDefinitionSets( theme->PID() ); + } + if (errCode == KErrNone) + { + // Save settings to repository + TAknsPkgIDBuf pidBuf; + theme->PID().CopyToDes( pidBuf ); + + TAknSkinSrvSkinPackageLocation location = + LocationFromPath( theme->IniFileDirectory() ); + + CRepository* skinsRepository = CRepository::NewLC( KCRUidPersonalisation ); + + errCode = skinsRepository->Set( KPslnActiveSkinUid, pidBuf ); + errCode = skinsRepository->Set( KPslnActiveSkinLocation, location ); + + CleanupStack::PopAndDestroy( skinsRepository ); + } + + if (errCode != KErrNone) + { + ret = MSmlDmAdapter::EError; + } + + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::SetInstallOptionsL() +// ------------------------------------------------------------------------------------------------ +MSmlDmAdapter::TError CThemesList::SetInstallOptionsL( const TDesC8& aOptions ) + { + MSmlDmAdapter::TError ret = MSmlDmAdapter::EOk; + TInt errCode = KErrNone; + + GetDefaultInstallOptions( iInstallOptions ); + + if (aOptions.Length() > 0) + { + TRAP( errCode, InstallOptionsParser::ParseOptionsL( aOptions, iInstallOptions ) ); + } + if (errCode != KErrNone) + { + ret = MSmlDmAdapter::EError; + } + + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::InstallThemeL() +// ------------------------------------------------------------------------------------------------ +MSmlDmAdapter::TError CThemesList::InstallThemeL( const TDesC& aFileName, TDes8& aSisPkgUid, TDes8& aThemePkgId ) + { + MSmlDmAdapter::TError ret = MSmlDmAdapter::EOk; + TInt errCode = KErrNone; + + CDesC8Array* pkgUidsOrg = InstalledPackagesL( ); + CleanupStack::PushL( pkgUidsOrg ); + CDesC8Array* thmPidsOrg = InstalledThemesL( ); + CleanupStack::PushL( thmPidsOrg ); + + // Install using options if given and otherwise with default options + SwiUI::RSWInstLauncher installer; + User::LeaveIfError( installer.Connect() ); + CleanupClosePushL( installer ); + + SwiUI::TInstallOptionsPckg optPckg( iInstallOptions ); + errCode = installer.SilentInstall( aFileName, optPckg ); + CleanupStack::PopAndDestroy( &installer ); + + // Retrieve new list of installed packages and themes + CDesC8Array* pkgUidsNew = InstalledPackagesL( ); + CleanupStack::PushL( pkgUidsNew ); + CDesC8Array* thmPidsNew = InstalledThemesL( ); + CleanupStack::PushL( thmPidsNew ); + + // Try to find sis package uid and theme package id + CDesC8Array* pkgUidsDif = FindNewItemsL( *pkgUidsOrg, *pkgUidsNew ); + CleanupStack::PushL( pkgUidsDif ); + + CDesC8Array* thmPidsDif = FindNewItemsL( *thmPidsOrg, *thmPidsNew ); + CleanupStack::PushL( thmPidsDif ); + + if (pkgUidsDif->Count() == 1) + { + aSisPkgUid = (*pkgUidsDif)[0]; + } + if (thmPidsDif->Count() > 0) + { + aThemePkgId = (*thmPidsDif)[0]; + } + RDEBUG_2( " CThemesList::InstallThemeL : SISPKGUID %X", &(aSisPkgUid) ); + RDEBUG_2( " CThemesList::InstallThemeL : THEMEPKGUID %X", &(aThemePkgId) ); + + // Cleanup + CleanupStack::PopAndDestroy( thmPidsDif ); + CleanupStack::PopAndDestroy( pkgUidsDif ); + CleanupStack::PopAndDestroy( thmPidsNew ); + CleanupStack::PopAndDestroy( pkgUidsNew ); + CleanupStack::PopAndDestroy( thmPidsOrg ); + CleanupStack::PopAndDestroy( pkgUidsOrg ); + + // Convert error code + if (errCode != KErrNone) + { + ret = MSmlDmAdapter::EError; + } + + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::DeleteThemeL() +// ------------------------------------------------------------------------------------------------ +MSmlDmAdapter::TError CThemesList::DeleteThemeL( const TDesC8& aThemeId, const TUid& aPkgUid,HBufC8* aLuid) + { + MSmlDmAdapter::TError ret = MSmlDmAdapter::EOk; + TInt errCode = KErrNone; + + CAknsSrvSkinInformationPkg* theme = FindThemeL( aThemeId ); + if (theme != NULL) + { + // Save settings to repository + TAknsPkgIDBuf pidBuf; + TAknsPkgID themepid = theme->PID(); + themepid.CopyToDes(pidBuf); + + CRepository* skinsRepository = CRepository::NewLC( + KCRUidPersonalisation); + + TAknsPkgIDBuf repBuf; + errCode = skinsRepository->Get(KPslnActiveSkinUid, repBuf); + if (errCode == KErrNone) + { + TAknsPkgID activepid = KAknsNullPkgID; + activepid.SetFromDesL(repBuf); + + //Comparing the UIds of the active theme and the theme to be deleted + if (themepid.Uid() == activepid.Uid()) + { + // deleted theme is active theme, deactive it first + TInt count = iSkins->Count(); + if (count > 1) + { + pidBuf.Zero(); + CAknsSrvSkinInformationPkg* defaultTheme = (*iSkins)[0]; + defaultTheme->PID().CopyToDes(pidBuf); + TBuf8 pidBuf8; + pidBuf8.Copy(pidBuf); + errCode = SetActiveThemeL(pidBuf8); + + if (errCode == KErrNone) + { + TRequestStatus timeoutStatus /*= KRequestPending*/; + + RTimer timeout; + User::LeaveIfError(timeout.CreateLocal()); + CleanupClosePushL(timeout); + timeout.After(timeoutStatus, KPostTimeOut); + + User::WaitForRequest(timeoutStatus); + + if (timeoutStatus.Int() == KRequestPending) + { + timeout.Cancel(); + User::WaitForRequest(timeoutStatus); + } + CleanupStack::PopAndDestroy(&timeout); + } + } + else + { + errCode = KErrGeneral; + } + } + + CleanupStack::PopAndDestroy(skinsRepository); + } + + } + else + { + errCode = KErrNotFound; + } + + + if( errCode == KErrNone ) + { + iDirty = ETrue; + + // Uninstall silent + SwiUI::RSWInstLauncher installer; + User::LeaveIfError( installer.Connect() ); + CleanupClosePushL( installer ); + + //Silent uninstall not working because of getting wrong package name + //So we used SilentCustomUninstall which uses index and pkgUid to get correct package name + + TInt idx( KErrNotFound ); + SwiUI::TOpUninstallIndexParam params; + params.iUid = aPkgUid; + TPtrC8 ptr1 = aLuid->Des(); + idx= ptr1.Find(KCol); + if(idx != KErrNotFound) + { + TPtrC8 ptr = ptr1.Right((ptr1.Length()-idx)-1); + TLex8 lex(ptr); + lex.Val(params.iIndex); + } + else + { + ret = MSmlDmAdapter::ENotFound; + } + + SwiUI::TOpUninstallIndexParamPckg pckg( params ); + SwiUI::TOperation operation( SwiUI::EOperationUninstallIndex ); + + SwiUI::TUninstallOptions uninstallOptions; + SwiUI::TUninstallOptionsPckg optPckg( uninstallOptions ); + + errCode = installer.SilentCustomUninstall( operation, optPckg, pckg,SwiUI::KSisxMimeType() ); + RDEBUG_2("CThemesList::DeleteThemeL Uninstall silent : errCode %X",errCode ); + + CleanupStack::PopAndDestroy( &installer ); + } + + if (errCode == KErrNotFound) + { + ret = MSmlDmAdapter::ENotFound; + } + else if (errCode != KErrNone) + { + ret = MSmlDmAdapter::EError; + } + + return ret; + } + + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Internal methods +// +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +// ------------------------------------------------------------------------------------------------ +// CThemesList::CheckUpdatesL() +// ------------------------------------------------------------------------------------------------ +void CThemesList::CheckUpdatesL() + { + if (iDirty) + { + LoadSkinsL(); + iDirty = EFalse; + } + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::LoadSkinsL() +// ------------------------------------------------------------------------------------------------ +void CThemesList::LoadSkinsL() + { + // Cleanup old list + if (iSkins) + { + iSkins->ResetAndDestroy(); + delete iSkins; + iSkins = 0; + } + + // Drives z and c case EAknsSrvPhone: + // drive e case EAknsSrvMMC: + // all drives case EAknsSrvAll: + iSkins = iAknsSrv.EnumerateSkinPackagesL( EAknsSrvAll ); + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList:: +// ------------------------------------------------------------------------------------------------ +CAknsSrvSkinInformationPkg* CThemesList::FindThemeL( const TDesC8& aPID ) + { + CheckUpdatesL(); + + CAknsSrvSkinInformationPkg* theme = 0; + TInt i = 0; + TAknsPkgID pid = KAknsNullPkgID; + + TAknsPkgIDBuf pidBuf; + pidBuf.Copy( aPID ); + + TRAPD( err, pid.SetFromDesL( pidBuf ) ); + + if (err == KErrNone) + { + for (i = 0 ; i < iSkins->Count() ; i++) + { + if ((*iSkins)[i]->PID() == pid) + { + theme = (*iSkins)[i]; + break; + } + } + } + + return theme; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList::GetDefaultInstallOptions() +// ------------------------------------------------------------------------------------------------ +void CThemesList::GetDefaultInstallOptions( SwiUI::TInstallOptions &aOptions ) + { + SwiUI::TInstallOptions defaultOptions; + + // Return options + aOptions = defaultOptions; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList:: +// ------------------------------------------------------------------------------------------------ +TAknSkinSrvSkinPackageLocation CThemesList::LocationFromPath( const TDesC& aPath ) + { +#ifndef RD_MULTIPLE_DRIVE + TBuf<1> driveLetterBuf; + driveLetterBuf.CopyUC( aPath.Left(1) ); + if( driveLetterBuf.Compare( _L("E") ) == 0 ) + { + return EAknsSrvMMC; + } + return EAknsSrvPhone; +#else + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + TInt drive = EDriveC; + TUint driveStatus = 0; + TInt err = RFs::CharToDrive( aPath[0], drive ); + err = DriveInfo::GetDriveStatus( fs, drive, driveStatus ); + CleanupStack::PopAndDestroy(); // fs + if ( driveStatus & DriveInfo::EDriveExternallyMountable ) + { + RDEBUG("CThemesList::LocationFromPath(): from MMC"); + return EAknsSrvMMC; + } + + + RDEBUG("CThemesList::LocationFromPath(): from Phone"); + return EAknsSrvPhone; + +#endif //RD_MULTIPLE_DRIVE + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList:: +// ------------------------------------------------------------------------------------------------ +CDesC8Array* CThemesList::InstalledPackagesL( ) + { + CDesC8ArrayFlat* packages = new (ELeave) CDesC8ArrayFlat( 32 ); + CleanupStack::PushL( packages ); + + RArray< TUid > uids; + CleanupClosePushL( uids ); + + RPointerArray< Swi::CSisRegistryPackage > pkgs; + CleanupClosePushL( pkgs ); + + Swi::RSisRegistrySession reg; + User::LeaveIfError( reg.Connect() ); + CleanupClosePushL( reg ); + + reg.InstalledUidsL( uids ); + reg.InstalledPackagesL( pkgs ); + + TInt i = 0; + TInt count = uids.Count(); + for (i = 0 ; i < count ; i++) + { + TBuf8 uidBuf8; + uidBuf8.Copy( uids[i].Name() ); + + RDEBUG8_3( "uid[%d]=%S", i, &uidBuf8 ); + } + + count = pkgs.Count(); + for (i = 0 ; i < count ; i++) + { + TPtrC uidName = pkgs[i]->Uid().Name(); + TPtrC name = pkgs[i]->Name(); + TPtrC vendor = pkgs[i]->Vendor(); + + RDEBUG_5( "pkg[%d]: uid=%S, idx=%d, name=%S", i, + &uidName, + pkgs[i]->Index(), + &name ); + + + TBuf uidBuf; + uidBuf = pkgs[i]->Uid().Name(); + uidBuf.Append( _L(":") ); + uidBuf.AppendNum( pkgs[i]->Index() ); + + TBuf8 uidBuf8; + uidBuf8.Copy( uidBuf ); + + packages->AppendL( uidBuf8 ); + } + + CleanupStack::PopAndDestroy( ® ); + + pkgs.ResetAndDestroy(); + CleanupStack::PopAndDestroy( &pkgs ); + CleanupStack::PopAndDestroy( &uids ); + + CleanupStack::Pop( packages ); + return packages; + } + + +// ------------------------------------------------------------------------------------------------ +// CThemesList:: +// ------------------------------------------------------------------------------------------------ +CDesC8Array* CThemesList::InstalledThemesL( ) + { + LoadSkinsL(); + + CDesC8ArrayFlat* themes = new (ELeave) CDesC8ArrayFlat( 32 ); + CleanupStack::PushL( themes ); + + TInt i = 0; + TInt count = iSkins->Count(); + + for (i = 0 ; i < count ; i++) + { + TAknsPkgIDBuf pidBuf; + TBuf8 pidBuf8; + + TAknsPkgID pid = (*iSkins)[i]->PID(); + pid.CopyToDes( pidBuf ); + pidBuf8.Copy( pidBuf ); + + themes->AppendL( pidBuf8 ); + + TPtrC directory = (*iSkins)[i]->Directory(); + TPtrC iniFileDirectory = (*iSkins)[i]->IniFileDirectory(); + TPtrC name = (*iSkins)[i]->Name(); + TPtrC idleStateWallPaperImageFileName = (*iSkins)[i]->IdleStateWallPaperImageFileName(); + TPtrC pinboarWallPaperImageFileName = (*iSkins)[i]->PinboarWallPaperImageFileName(); + TInt idleStateWallPaperImageIndex = (*iSkins)[i]->IdleStateWallPaperImageIndex(); + TInt pinboardWallPaperImageIndex = (*iSkins)[i]->PinboardWallPaperImageIndex(); + TBool isDeletable = (*iSkins)[i]->IsDeletable(); + TBool isCopyable = (*iSkins)[i]->IsCopyable(); + TAknsPkgID colorSchemePID = (*iSkins)[i]->ColorSchemePID(); + TBool hasIconset = (*iSkins)[i]->HasIconset(); + TAknsSkinSrvSkinProtectionType protectionType = (*iSkins)[i]->ProtectionType(); + TBool isCorrupted = (*iSkins)[i]->IsCorrupted(); + TDesC& fullName = (*iSkins)[i]->FullName(); + + + TAknsPkgIDBuf colorSchemeBuf; + colorSchemePID.CopyToDes( colorSchemeBuf ); + + RDEBUG_4( "skin[%d]: pid=%S, name=%S", i, &pidBuf, &name ); + RDEBUG_2( " directory=%S", &directory ); + RDEBUG_2( " iniFileDirectory=%S", &iniFileDirectory ); + RDEBUG_2( " name=%S", &name ); + RDEBUG_2( " idleStateWallPaperImageFileName=%S", &idleStateWallPaperImageFileName ); + RDEBUG_2( " pinboarWallPaperImageFileName=%S", &pinboarWallPaperImageFileName ); + RDEBUG_2( " idleStateWallPaperImageIndex=%d", idleStateWallPaperImageIndex ); + RDEBUG_2( " pinboardWallPaperImageIndex=%d", pinboardWallPaperImageIndex ); + RDEBUG_2( " isDeletable=%d", isDeletable ); + RDEBUG_2( " isCopyable=%d", isCopyable ); + RDEBUG_2( " colorSchemePID=%S", &colorSchemeBuf ); + RDEBUG_2( " hasIconset=%d", hasIconset ); + RDEBUG_2( " protectionType=%d", protectionType ); + RDEBUG_2( " isCorrupted=%d", isCorrupted ); + RDEBUG_2( " fullName=%S", &fullName ); + } + + themes->Sort(); + + CleanupStack::Pop( themes ); + return themes; + } + +// ------------------------------------------------------------------------------------------------ +// CThemesList:: +// ------------------------------------------------------------------------------------------------ +CDesC8Array* CThemesList::FindNewItemsL( const CDesC8Array& aItemsOrg, const CDesC8Array& aItemsNew ) + { + CDesC8Array* result = new (ELeave) CDesC8ArrayFlat( 16 ); + CleanupStack::PushL( result ); + + TInt i = 0; + TInt count = aItemsNew.Count(); + for (i = 0 ; i < count ; i++) + { + result->AppendL( aItemsNew[ i ] ); + } + + result->Sort(); + + count = aItemsOrg.Count(); + for (i = 0 ; i < count ; i++) + { + TInt idx = -1; + if (result->FindIsq( aItemsOrg[ i ], idx, ECmpNormal ) == 0) + { + result->Delete( idx ); + } + } + + result->Compress( ); + + CleanupStack::Pop( result ); + return result; + } + +// ------------------------------------------------------------------------------------------------ +// EOF +// ------------------------------------------------------------------------------------------------