--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/customization/ScreenSaverAdapter/src/ScreenSaverList.cpp Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,943 @@
+/*
+* 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 ScreenSaver List
+*
+*/
+
+
+#include "ScreenSaverList.h"
+
+#include <implementationproxy.h> // For TImplementationProxy definition
+#include <e32def.h>
+#include <centralrepository.h>
+#include <ScreensaverpluginIntDef.h>
+#include <mmfcontrollerpluginresolver.h> // For CleanupResetAndDestroyPushL
+#include "aminstalloptions.h"
+#include <ScreensaverInternalCRKeys.h>
+#include <ScreensaverInternalPSKeys.h>
+#include "debug.h"
+#include "ScreenSaverClient.h"
+#include <e32property.h>
+_LIT8( KSlash, "/" );
+#include <e32cmn.h>
+_LIT( KPslnScreenSaverTypeDateTime, "DateTime" );
+_LIT( KPslnScreenSaverTypeText, "Text" );
+
+const TInt KPslnMaxNumberOfScreenSaverText = 15;
+const TInt KPostTimeOut = 10000000; // 10 seconds
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList* CScreenSaverList::NewL( )
+// ------------------------------------------------------------------------------------------------
+CScreenSaverList* CScreenSaverList::NewL( )
+ {
+ RDEBUG("CScreenSaverList::NewL(): begin");
+
+ CScreenSaverList* self = NewLC( );
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList* CScreenSaverList::NewLC( )
+// ------------------------------------------------------------------------------------------------
+CScreenSaverList* CScreenSaverList::NewLC( )
+ {
+ CScreenSaverList* self = new( ELeave ) CScreenSaverList( );
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ return self;
+ }
+
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::CScreenSaverList()
+// ------------------------------------------------------------------------------------------------
+CScreenSaverList::CScreenSaverList( )
+ : iDirty( ETrue )
+ , iScreenSavers( 0 )
+ , iInstallOptions()
+ {
+ GetDefaultInstallOptions( iInstallOptions );
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::ConstructL()
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverList::ConstructL( )
+ {
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::~CScreenSaverList()
+// ------------------------------------------------------------------------------------------------
+CScreenSaverList::~CScreenSaverList()
+ {
+ if (iScreenSavers)
+ {
+ iScreenSavers->ResetAndDestroy();
+ delete iScreenSavers;
+ }
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::GetScreenSaverListL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::GetScreenSaverListL( const CArrayFix<TSmlDmMappingInfo>& aPreviousList, CBufBase& aList )
+ {
+ CheckUpdatesL();
+
+ CDesC8ArrayFlat* names = new (ELeave) CDesC8ArrayFlat( 32 );
+ CleanupStack::PushL( names );
+
+ CDesC8ArrayFlat* luids = new (ELeave) CDesC8ArrayFlat( 32 );
+ CleanupStack::PushL( luids );
+
+ TInt i = 0;
+
+ // Create list of previous screen savers
+ for (i = 0 ; i < aPreviousList.Count() ; i++)
+ {
+ TPtrC8 screenSaverId = ScreenSaverIdFromLUID( aPreviousList[i].iURISegLUID );
+
+ names->AppendL( aPreviousList[i].iURISeg );
+ luids->AppendL( screenSaverId );
+ }
+
+ // Find and add missing screen savers
+ for (i = 0 ; i < iScreenSavers->Count() ; i++)
+ {
+ TInt idx = 0;
+ TPtrC8 name = (*iScreenSavers)[i]->Id();
+ if (luids->Find( name, idx ) != 0)
+ {
+ // not found
+ // Check that current "name" is not in use
+ if (names->Find( name, idx ) != 0)
+ {
+ // not found, add it
+ names->AppendL( name );
+ }
+ }
+ }
+
+
+ // Fill result
+ for (i = 0 ; i < names->Count() ; i++)
+ {
+ if (i > 0)
+ {
+ aList.InsertL( aList.Size(), KSlash );
+ }
+ aList.InsertL( aList.Size(), (*names)[i] );
+ }
+
+ // Cleanup
+ CleanupStack::PopAndDestroy( luids );
+ CleanupStack::PopAndDestroy( names );
+
+ return MSmlDmAdapter::EOk;
+
+//sf- TInt i = 0;
+//sf- for (i = 0 ; i < iScreenSavers->Count() ; i++)
+//sf- {
+//sf- if (i > 0)
+//sf- {
+//sf- aList.InsertL( aList.Size(), KSlash );
+//sf- }
+//sf-
+//sf- CScreenSaverInfo *info = (*iScreenSavers)[i];
+//sf- aList.InsertL( aList.Size(), info->Id() );
+//sf- }
+//sf-
+//sf-
+//sf- return MSmlDmAdapter::EOk;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::GetIdL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::GetIdL( const TDesC8& aId, CBufBase& aResult )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ aResult.InsertL( aResult.Size(), screenSaverInfo->Id() );
+ ret = MSmlDmAdapter::EOk;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::GetNameL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::GetNameL( const TDesC8& aId, CBufBase& aResult )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ aResult.InsertL( aResult.Size(), screenSaverInfo->Name() );
+ ret = MSmlDmAdapter::EOk;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::SetNameL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::SetNameL( const TDesC8& aId, const TDesC8& aData )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ screenSaverInfo->SetNameL( aData );
+ ret = MSmlDmAdapter::EOk;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::GetDescriptionL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::GetDescriptionL( const TDesC8& aId, CBufBase& aResult )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ aResult.InsertL( aResult.Size(), screenSaverInfo->Description() );
+ ret = MSmlDmAdapter::EOk;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::SetDescriptionL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::SetDescriptionL( const TDesC8& aId, const TDesC8& aData )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ screenSaverInfo->SetDescriptionL( aData );
+ ret = MSmlDmAdapter::EOk;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::GetCustomPropertyL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::GetCustomPropertyL( const TDesC8& aId, CBufBase& aResult )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ aResult.InsertL( aResult.Size(), screenSaverInfo->CustomProperty() );
+ ret = MSmlDmAdapter::EOk;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::SetCustomPropertyL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::SetCustomPropertyL( const TDesC8& aId, const TDesC8& aData )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ screenSaverInfo->SetCustomPropertyL( aData );
+ ret = MSmlDmAdapter::EOk;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::GetVersionL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::GetVersionL( const TDesC8& aId, CBufBase& aResult )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ aResult.InsertL( aResult.Size(), screenSaverInfo->Version() );
+ ret = MSmlDmAdapter::EOk;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::SetVersionL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::SetVersionL( const TDesC8& aId, const TDesC8& aVersion )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::ENotFound;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ screenSaverInfo->SetVersionL( aVersion );
+ ret = MSmlDmAdapter::EOk;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::GetActiveL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::GetActiveL( CBufBase& aResult )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::EOk;
+
+ TInt screenSaverTypeId = 0; // Text
+ TFileName screenSaverFileName;
+
+ CRepository* repository = CRepository::NewLC( KCRUidScreenSaver );
+ TInt error = repository->Get( KScreenSaverObject, screenSaverTypeId );
+
+ if( error == KErrNone )
+ {
+ if( screenSaverTypeId == 0 ) // Text
+ {
+ screenSaverFileName = KPslnScreenSaverTypeText;
+ }
+ else if( screenSaverTypeId == 1 ) // Date&time
+ {
+ screenSaverFileName = KPslnScreenSaverTypeDateTime;
+ }
+ else if( screenSaverTypeId == 3 )// Object
+ {
+ error = repository->Get( KScreenSaverPluginName, screenSaverFileName );
+ }
+ else
+ {
+ error = KErrUnknown;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( repository );
+
+ if( error == KErrNone )
+ {
+ TBuf8<KMaxFileName> screenSaverFileName8;
+ screenSaverFileName8.Copy( screenSaverFileName );
+
+ aResult.InsertL( aResult.Size(), screenSaverFileName8 );
+ }
+ else
+ {
+ ret = MSmlDmAdapter::EError;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::SetActiveL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::SetActiveL( const TDesC8& aId )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::EOk;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aId );
+ if (screenSaverInfo != 0)
+ {
+ screenSaverInfo->ActivateL();
+ }
+ else
+ {
+ ret = MSmlDmAdapter::EError;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::SetInstallOptionsL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::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;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::InstallL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::InstallL( const TDesC& aFileName )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::EOk;
+ TInt errCode = KErrNone;
+
+ iDirty = ETrue;
+
+ // 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 );
+
+ if (errCode != KErrNone)
+ {
+ ret = MSmlDmAdapter::EError;
+ }
+
+ return ret;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::DeleteL()
+// ------------------------------------------------------------------------------------------------
+MSmlDmAdapter::TError CScreenSaverList::DeleteL( const TDesC8& aLUID )
+ {
+ MSmlDmAdapter::TError ret = MSmlDmAdapter::EOk;
+ TInt errCode = KErrNone;
+
+ CScreenSaverInfo* screenSaverInfo = FindByIdL( aLUID );
+ if( screenSaverInfo != NULL )
+ {
+ CRepository* repository = CRepository::NewLC( KCRUidScreenSaver );
+
+ if( screenSaverInfo->TypeId() == CScreenSaverInfo::EObject )
+ {
+ TFileName screenSaverFileName;
+ screenSaverFileName.Copy( screenSaverInfo->FileName() );
+
+ TFileName repFileName;
+ repository->Get( KScreenSaverPluginName, repFileName );
+ if( repFileName == screenSaverFileName )
+ {
+ TBuf<KPslnMaxNumberOfScreenSaverText> screenText;
+ screenText.Copy( screenSaverInfo->CustomProperty() );
+ errCode = repository->Set( KScreenSaverText, screenText );
+ errCode = repository->Set( KScreenSaverObject, CScreenSaverInfo::EText );
+
+ 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 );
+
+ }
+ }
+ CleanupStack::PopAndDestroy( repository );
+
+ }
+ else
+ {
+ errCode = KErrNotFound;
+ }
+
+ if( errCode == KErrNone )
+ {
+ iDirty = ETrue;
+
+ TUint pkgUid = 0;
+ TLex8 parser( aLUID );
+ if ((parser.Get() == '[') &&
+ (parser.Val( pkgUid, EHex ) == KErrNone) &&
+ (parser.Get() == ']'))
+ {
+ // Uninstall silent
+ SwiUI::RSWInstLauncher installer;
+ User::LeaveIfError( installer.Connect() );
+ CleanupClosePushL( installer );
+
+ SwiUI::TUninstallOptions uninstallOptions;
+ SwiUI::TUninstallOptionsPckg optPckg( uninstallOptions );
+
+ errCode = installer.SilentUninstall( TUid::Uid( pkgUid ), optPckg, SwiUI::KSisxMimeType() );
+
+ CleanupStack::PopAndDestroy( &installer );
+ }
+ }
+
+ if (errCode == KErrNotFound)
+ {
+ ret = MSmlDmAdapter::ENotFound;
+ }
+ else if (errCode != KErrNone)
+ {
+ ret = MSmlDmAdapter::EError;
+ }
+
+ return ret;
+ }
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// Internal methods
+//
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::CheckUpdatesL()
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverList::CheckUpdatesL()
+ {
+ if (iDirty)
+ {
+ LoadL();
+ iDirty = EFalse;
+ }
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::LoadL()
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverList::LoadL()
+ {
+ CScreenSaverInfo* entry = 0;
+ // Add descriptors for system screensavers
+ delete iScreenSavers;
+ iScreenSavers = 0;
+ iScreenSavers = new (ELeave) CArrayPtrFlat< CScreenSaverInfo >( 8 );
+
+ entry = CScreenSaverInfo::NewLC( KPslnScreenSaverTypeDateTime );
+ iScreenSavers->AppendL( entry );
+ CleanupStack::Pop( entry );
+
+ entry = CScreenSaverInfo::NewLC( KPslnScreenSaverTypeText );
+ iScreenSavers->AppendL( entry );
+ CleanupStack::Pop( entry );
+
+ // The path variable is not used
+ // The signature of this function could be changed in later releases
+ LoadPluginsL( KNullDesC );
+//sf- LoadPluginsL( KPslnScreensaverPathROM );
+//sf- LoadPluginsL( KPslnScreensaverPathLFFS );
+//sf- LoadPluginsL( KPslnScreensaverPathMMC );
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::LoadPluginsL()
+// ------------------------------------------------------------------------------------------------
+TBool CScreenSaverList::LoadPluginsL( const TDesC& /*aPath*/ )
+ {
+ RDEBUG(" CScreenSaverList: LoadPluginsL ... <");
+ TBool found = EFalse;
+
+ RScreenSaverClient ssClient;
+
+ User::LeaveIfError( ssClient.Connect() );
+ CleanupClosePushL( ssClient );
+
+ RSSListInfoPtrArray sslistinfo;
+ CleanupResetAndDestroyPushL( sslistinfo );
+
+ ssClient.GetScreenSaverListInfoL(sslistinfo );
+ const TInt count = sslistinfo.Count();
+ RDEBUG_2(" CScreenSaverList: LoadPluginsL : SScount is :%d",count);
+
+ for( TInt i = 0 ; i < count ; i++ )
+ {
+ CScreenSaverListInfo* implInfo = sslistinfo[i];
+
+ CScreenSaverInfo* entry = CScreenSaverInfo::NewLC(
+ implInfo->ImplementationUid().Name() );
+ entry->SetNameL( implInfo->DisplayName() );
+
+ TBuf8<20> version;
+ version.Num( implInfo->Version() );
+ entry->SetVersionL( version );
+ entry->SetCustomPropertyL( implInfo->OpaqueData() );
+
+ iScreenSavers->AppendL( entry );
+ CleanupStack::Pop( entry );
+
+ found = ETrue;
+ }
+
+ CleanupStack::PopAndDestroy( &sslistinfo );
+ CleanupStack::PopAndDestroy( &ssClient );
+ RDEBUG(" CScreenSaverList: LoadPluginsL ... >");
+ return found;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::
+// ------------------------------------------------------------------------------------------------
+CScreenSaverInfo* CScreenSaverList::FindByIdL( const TDesC8& aId )
+ {
+ CheckUpdatesL();
+
+ CScreenSaverInfo* entry = 0;
+ TInt i = 0;
+ TPtrC8 id = ScreenSaverIdFromLUID( aId );
+ if (id.Length() == 0)
+ {
+ id.Set( aId );
+ }
+
+ for (i = 0 ; i < iScreenSavers->Count() ; i++)
+ {
+ if (id == (*iScreenSavers)[i]->Id())
+ {
+ entry = (*iScreenSavers)[i];
+ break;
+ }
+ }
+
+ return entry;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::ScreenSaverIdFromLUID()
+// ------------------------------------------------------------------------------------------------
+TPtrC8 CScreenSaverList::ScreenSaverIdFromLUID( const TDesC8& aLUID )
+ {
+ TInt pos = aLUID.Locate( KPkgId_ScrId_Separator );
+ if (pos == KErrNotFound)
+ {
+ pos = aLUID.Length() - 1;
+ }
+ return aLUID.Mid( pos + 1 );
+ }
+
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::GetDefaultInstallOptions()
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverList::GetDefaultInstallOptions( SwiUI::TInstallOptions &aOptions )
+ {
+ SwiUI::TInstallOptions defaultOptions;
+
+ // Return options
+ aOptions = defaultOptions;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverList::
+// ------------------------------------------------------------------------------------------------
+
+//=================================================================================================
+//=================================================================================================
+//====
+//==== CScreenSaverInfo
+//====
+//=================================================================================================
+//=================================================================================================
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::NewL()
+// ------------------------------------------------------------------------------------------------
+CScreenSaverInfo* CScreenSaverInfo::NewL( const TDesC& aId )
+ {
+ RDEBUG("CScreenSaverInfo::NewL(): begin");
+
+ CScreenSaverInfo* self = NewLC( aId );
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo* CScreenSaverInfo::NewLC()
+// ------------------------------------------------------------------------------------------------
+CScreenSaverInfo* CScreenSaverInfo::NewLC( const TDesC& aId )
+ {
+ CScreenSaverInfo* self = new( ELeave ) CScreenSaverInfo( );
+ CleanupStack::PushL( self );
+ self->ConstructL( aId );
+ return self;
+ }
+
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+CScreenSaverInfo::CScreenSaverInfo()
+ : iId( 0 )
+ , iName( 0 )
+ , iDescription( 0 )
+ , iCustomProperty( 0 )
+ , iVersion( 0 )
+ {
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverInfo::ConstructL( const TDesC& aId )
+ {
+ iId = HBufC8::NewL( aId.Length() );
+ iId->Des().Copy( aId );
+ iName = KNullDesC8().AllocL();
+ iDescription = KNullDesC8().AllocL();
+ iCustomProperty = KNullDesC8().AllocL();
+ iVersion = KNullDesC8().AllocL();
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+CScreenSaverInfo::~CScreenSaverInfo()
+ {
+ delete iId;
+ delete iName;
+ delete iDescription;
+ delete iCustomProperty;
+ delete iVersion;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+const TDesC8& CScreenSaverInfo::Id()
+ {
+ return *iId;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+const TDesC8& CScreenSaverInfo::Name()
+ {
+ return *iName;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverInfo::SetNameL( const TDesC8& aName )
+ {
+ delete iName;
+ iName = 0;
+ iName = aName.AllocL();
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverInfo::SetNameL( const TDesC& aName )
+ {
+ delete iName;
+ iName = 0;
+ iName = HBufC8::NewL( aName.Length() );
+ iName->Des().Copy( aName );
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+const TDesC8& CScreenSaverInfo::Description()
+ {
+ return *iDescription;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverInfo::SetDescriptionL( const TDesC8& aDescription )
+ {
+ delete iDescription;
+ iDescription = 0;
+ iDescription = aDescription.AllocL();
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+const TDesC8& CScreenSaverInfo::CustomProperty()
+ {
+ return *iCustomProperty;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverInfo::SetCustomPropertyL( const TDesC8& aCustomProperty )
+ {
+ delete iCustomProperty;
+ iCustomProperty = 0;
+ iCustomProperty = aCustomProperty.AllocL();
+ // Update settings if needed
+ if (IsActivatedL() && TypeId() == EText)
+ {
+ ActivateL();
+ }
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+const TDesC8& CScreenSaverInfo::Version()
+ {
+ return *iVersion;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverInfo::SetVersionL( const TDesC8& aVersion )
+ {
+ delete iVersion;
+ iVersion = 0;
+ iVersion = aVersion.AllocL();
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+CScreenSaverInfo::TScreenSaverType CScreenSaverInfo::TypeId()
+ {
+ TScreenSaverType screenSaverTypeId = EText;
+ TFileName fileName;
+ fileName.Copy( FileName() );
+
+ if( fileName.CompareF( KPslnScreenSaverTypeText ) == 0 )
+ {
+ screenSaverTypeId = EText; // 0=Text
+ }
+ else if( fileName.CompareF( KPslnScreenSaverTypeDateTime ) == 0 )
+ {
+ screenSaverTypeId = EDateTime; // 1=Date&time
+ }
+ else
+ {
+ screenSaverTypeId = EObject; // 3=Object
+ }
+
+ return screenSaverTypeId;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+TBool CScreenSaverInfo::IsActivatedL()
+ {
+ TBool activated = EFalse;
+
+ TInt screenSaverTypeId = 0; // Text
+ TFileName screenSaverFileName;
+
+ CRepository* repository = CRepository::NewLC( KCRUidScreenSaver );
+
+ TInt error = repository->Get( KScreenSaverObject, screenSaverTypeId );
+ if( screenSaverTypeId == 3 )
+ {
+ repository->Get( KScreenSaverPluginName, screenSaverFileName );
+ }
+ CleanupStack::PopAndDestroy( repository );
+
+ if( screenSaverTypeId == 0 && TypeId() == EText ) // Text
+ {
+ activated = ETrue;
+ }
+ else if( screenSaverTypeId == 1 && TypeId() == EDateTime ) // Date&time
+ {
+ activated = ETrue;
+ }
+ else if( screenSaverTypeId == 3 && TypeId() == EObject )// Object
+ {
+ TFileName fileName;
+ fileName.Copy( FileName() );
+ activated = ( fileName.CompareF( screenSaverFileName ) == 0 );
+ }
+
+ return activated;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+void CScreenSaverInfo::ActivateL()
+ {
+ CRepository* repository = CRepository::NewLC( KCRUidScreenSaver );
+
+
+ if( TypeId() == EText )
+ {
+ TBuf<KPslnMaxNumberOfScreenSaverText> screenText;
+ screenText.Copy( CustomProperty() );
+ repository->Set( KScreenSaverText, screenText );
+ }
+ else if( TypeId() == EDateTime )
+ {
+//sf- TBuf<KPslnMaxNumberOfScreenSaverText> screenText;
+//sf- screenText.Copy( CustomProperty() );
+//sf- error = repository->Set( KScreenSaverText, screenText );
+ }
+ else if( TypeId() == EObject )
+ {
+ TFileName screenSaverFileName;
+ screenSaverFileName.Copy( FileName() );
+ repository->Set( KScreenSaverPluginName, screenSaverFileName );
+ }
+ repository->Set( KScreenSaverObject, TypeId() );
+ CleanupStack::PopAndDestroy( repository );
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CScreenSaverInfo::
+// ------------------------------------------------------------------------------------------------
+const TDesC8& CScreenSaverInfo::FileName()
+ {
+ return *iId;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// EOF
+// ------------------------------------------------------------------------------------------------