customization/ScreenSaverAdapter/src/ScreenSaverList.cpp
changeset 0 3ce708148e4d
--- /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
+// ------------------------------------------------------------------------------------------------