skins/AknSkins/srvsrc/AknsSrvSettings.cpp
changeset 0 05e9090e2422
child 26 800e0f20cfe9
child 42 2398a337fa76
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/skins/AknSkins/srvsrc/AknsSrvSettings.cpp	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,1192 @@
+/*
+* Copyright (c) 2002-2008 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:  Skin server settings.
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "AknsSrvSettings.h"
+#include <AknsSkinUID.h>
+
+#include "AknsDebug.h"
+
+#include <AknLayoutDef.h>
+#include <centralrepository.h>
+#include <driveinfo.h>
+#include <pathinfo.h>
+
+// CenRep keys.
+#include <AvkonInternalCRKeys.h>                // KAknLayoutId
+#include <AknSkinsInternalCRKeys.h>             // KPslnActiveSkinUid, ...
+#include <DRMHelperServerInternalCRKeys.h>      // KDRMHelperServerNotification
+#include <pslninternalcrkeys.h>                 // KThemesWallpaperSlideSetType
+
+//PubSub keys.
+#include <ScreensaverInternalPSKeys.h>
+#include <UsbWatcherInternalPSKeys.h>           // KPSUidUsbWatcher
+#include <usbpersonalityids.h>                  // KUsbPersonalityIdMS
+
+// Default theme has been configured to be different from S60 Default skin.
+_LIT( KAknSkinSrvNoDefaultThemeConfigured, "0" );
+
+// Length of hex UID in characters (number or timestamp)
+const TInt KAknsSkinSrvUIDLength = 8;
+
+// ============================== LOCAL CLASSES ================================
+
+NONSHARABLE_CLASS(CAknsPropertySubscriber) : public CActive
+    {
+    public:
+        CAknsPropertySubscriber(TCallBack aCallBack, RProperty& aProperty);
+        virtual ~CAknsPropertySubscriber();
+
+    public: // New functions
+        void SubscribeL();
+        void StopSubscribe();
+
+    private: // from CActive
+        void RunL();
+        void DoCancel();
+
+    private:
+        TCallBack   iCallBack;
+        RProperty&  iProperty;
+    };
+
+NONSHARABLE_CLASS(CAknsRepositoryWatcher) : public CBase,
+    public MCenRepNotifyHandlerCallback
+    {
+    public:
+        static CAknsRepositoryWatcher* NewL(
+            const TUid aUid, const TUint32 aKey,
+            CCenRepNotifyHandler::TCenRepKeyType aKeyType,
+            TCallBack aCallBack, CRepository* aRepository );
+
+        static CAknsRepositoryWatcher* NewL(
+            const TUid aUid, TCallBack aCallBack, CRepository* aRepository);
+
+        virtual ~CAknsRepositoryWatcher();
+
+        TUint32 ChangedKey();
+
+    public: // from MCenRepNotifyHandlerCallback
+        void HandleNotifyInt(
+            TUint32 aKey, TInt aNewValue );
+        void HandleNotifyString(
+            TUint32 aKey, const TDesC16& aNewValue );
+        void HandleNotifyGeneric(
+            TUint32 aKey );
+        void HandleNotifyError(
+            TUint32 aKey, TInt aError, CCenRepNotifyHandler* aHandler );
+
+    private:
+        CAknsRepositoryWatcher(
+            const TUid aUid, const TUint32 aKey,
+            TCallBack aCallBack, CRepository* aRepository);
+
+        void ConstructL(CCenRepNotifyHandler::TCenRepKeyType aKeyType);
+
+        void ConstructL();
+
+    private: // Data
+        TUid iUid;
+        TUint32 iKey;
+        TUint32 iChangedKey;
+        TCallBack iCallBack;
+        CRepository* iRepository;
+        CCenRepNotifyHandler* iNotifyHandler;
+    };
+
+// -----------------------------------------------------------------------------
+// C++ constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CAknsPropertySubscriber::CAknsPropertySubscriber(
+    TCallBack aCallBack, RProperty& aProperty)
+    : CActive(EPriorityNormal), iCallBack(aCallBack), iProperty(aProperty)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CAknsPropertySubscriber::~CAknsPropertySubscriber()
+    {
+    Cancel();
+    }
+
+// -----------------------------------------------------------------------------
+// Starts to listen for changes.
+// -----------------------------------------------------------------------------
+//
+void CAknsPropertySubscriber::SubscribeL()
+    {
+    if (!IsActive())
+        {
+        iProperty.Subscribe(iStatus);
+        SetActive();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Stops listening for changes.
+// -----------------------------------------------------------------------------
+//
+void CAknsPropertySubscriber::StopSubscribe()
+    {
+    Cancel();
+    }
+
+// -----------------------------------------------------------------------------
+// When active object fires, call callback and continue listening.
+// -----------------------------------------------------------------------------
+//
+void CAknsPropertySubscriber::RunL()
+    {
+    if (iStatus.Int() == KErrNone)
+        {
+        iCallBack.CallBack();
+        SubscribeL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Cancel.
+// -----------------------------------------------------------------------------
+//
+void CAknsPropertySubscriber::DoCancel()
+    {
+    iProperty.Cancel();
+    }
+
+// -----------------------------------------------------------------------------
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+CAknsRepositoryWatcher* CAknsRepositoryWatcher::NewL(
+    const TUid aUid,
+    const TUint32 aKey,
+    CCenRepNotifyHandler::TCenRepKeyType aKeyType,
+    TCallBack aCallBack,
+    CRepository* aRepository)
+    {
+    CAknsRepositoryWatcher* self =
+        new(ELeave) CAknsRepositoryWatcher(aUid, aKey, aCallBack, aRepository);
+
+    CleanupStack::PushL(self);
+    self->ConstructL(aKeyType);
+    CleanupStack::Pop(self);
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+CAknsRepositoryWatcher* CAknsRepositoryWatcher::NewL(
+    const TUid aUid,
+    TCallBack aCallBack,
+    CRepository* aRepository)
+    {
+    CAknsRepositoryWatcher* self = new(ELeave) CAknsRepositoryWatcher(
+        aUid,
+        NCentralRepositoryConstants::KInvalidNotificationId,
+        aCallBack,
+        aRepository );
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CAknsRepositoryWatcher::~CAknsRepositoryWatcher()
+    {
+    if (iNotifyHandler)
+        {
+        iNotifyHandler->StopListening();
+        }
+    delete iNotifyHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// C++ constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CAknsRepositoryWatcher::CAknsRepositoryWatcher(
+    const TUid aUid,
+    const TUint32 aKey,
+    TCallBack aCallBack,
+    CRepository* aRepository)
+    : iUid(aUid), iKey(aKey), iCallBack(aCallBack), iRepository(aRepository)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CAknsRepositoryWatcher::ConstructL(
+    CCenRepNotifyHandler::TCenRepKeyType aKeyType)
+    {
+    iNotifyHandler = CCenRepNotifyHandler::NewL(
+        *this, *iRepository, aKeyType, iKey);
+    iNotifyHandler->StartListeningL();
+    }
+
+// -----------------------------------------------------------------------------
+// 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CAknsRepositoryWatcher::ConstructL()
+    {
+    iNotifyHandler = CCenRepNotifyHandler::NewL(*this, *iRepository);
+    iNotifyHandler->StartListeningL();
+    }
+
+// -----------------------------------------------------------------------------
+// Returns Uid of changed key,
+// -----------------------------------------------------------------------------
+//
+TUint32 CAknsRepositoryWatcher::ChangedKey()
+    {
+    return iChangedKey;
+    }
+
+// -----------------------------------------------------------------------------
+// Repository has changed - int key.
+// -----------------------------------------------------------------------------
+//
+void CAknsRepositoryWatcher::HandleNotifyInt(TUint32 aKey, TInt /*aNewValue*/)
+    {
+    iChangedKey = aKey;
+    iCallBack.CallBack();
+    iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId;
+    }
+
+// -----------------------------------------------------------------------------
+// Repository has changed - string key.
+// -----------------------------------------------------------------------------
+//
+void CAknsRepositoryWatcher::HandleNotifyString(
+    TUint32 aKey, const TDesC16& /*aNewValue*/)
+    {
+    iChangedKey = aKey;
+    iCallBack.CallBack();
+    iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId;
+    }
+
+// -----------------------------------------------------------------------------
+// Repository has changed - all keys.
+// -----------------------------------------------------------------------------
+//
+void CAknsRepositoryWatcher::HandleNotifyGeneric(TUint32 aKey)
+    {
+    iChangedKey = aKey;
+    iCallBack.CallBack();
+    iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId;
+    }
+
+// -----------------------------------------------------------------------------
+// Error in repository.
+// -----------------------------------------------------------------------------
+//
+void CAknsRepositoryWatcher::HandleNotifyError(
+    TUint32 /*aKey*/, TInt /*aError*/, CCenRepNotifyHandler* /*aHandler*/)
+    {
+    }
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RetrieveInt
+// Retrieves an integer (to the given reference) from shared data, or uses
+// default value if an error occured.
+// -----------------------------------------------------------------------------
+//
+static TInt RetrieveInt(
+    CRepository* aRepository, const TUint32 aKey,
+    TInt& aValue, const TInt aDefaultValue )
+    {
+    TInt errorCode = aRepository->Get( aKey, aValue );
+    if( errorCode != KErrNone )
+        {
+        aValue = aDefaultValue;
+        }
+    return errorCode;
+    }
+
+// -----------------------------------------------------------------------------
+// RetrievePID
+// Retrieves a package ID (to the given reference) from shared data, or uses
+// default value if an error occured.
+// -----------------------------------------------------------------------------
+//
+static TInt RetrievePID(
+    CRepository* aRepository, const TUint32 aKey,
+    TAknsPkgID& aValue, const TAknsPkgID& aDefaultValue )
+    {
+    TAknsPkgIDBuf buf;
+    TInt errorCode = aRepository->Get( aKey, buf );
+    if( errorCode == KErrNone )
+        {
+        TRAP( errorCode, aValue.SetFromDesL(buf) );
+        }
+    if( errorCode != KErrNone )
+        {
+        aValue.Set(aDefaultValue);
+        }
+    return errorCode;
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// C++ constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CAknsSrvSettings::CAknsSrvSettings( MAknsSrvSettingObserver* aObserver, RFs& aFileSystemSession )
+    : iObserver( aObserver ), iFsSession ( aFileSystemSession )
+    {
+    // We need to update this, when class is completely constructed.
+    iActiveSkinPID.Set( KAknsPIDProductDefaultSkin );
+    }
+
+// -----------------------------------------------------------------------------
+// 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::ConstructL()
+    {
+    iAvkonRepository = CRepository::NewL(KCRUidAvkon);
+    iSkinsRepository = CRepository::NewL(KCRUidPersonalisation);
+    iDefaultSkinPID = KAknsNullPkgID;
+    iThemesRepository = CRepository::NewL(KCRUidThemes);
+    ReadDefaultSkinID();
+
+    ReadAHMirroringActive();
+    ReadActiveSkinPID();
+    ReadHighlightAnimEnabled();
+
+    iDriveMaster = CAknsSrvDriveMaster::NewL( this );
+
+    iIdleTime = CIdle::NewL( CActive::EPriorityIdle );
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CAknsSrvSettings::~CAknsSrvSettings()
+    {
+    delete iAvkonRepositoryWatcher;
+    delete iAvkonRepository;
+    delete iSkinsRepositoryWatcher;
+    delete iSkinsRepository;
+    delete iThemesRepository;
+
+    if( iUSBWatchSubscriber )
+        {
+        iUSBWatchSubscriber->StopSubscribe();
+        }
+    iEnableUSBWatchProperty.Close();
+    delete iUSBWatchSubscriber;
+
+    if( iScreensaverActivationSubscriber )
+        {
+        iScreensaverActivationSubscriber->StopSubscribe();
+        }
+    iScreensaverActivationProperty.Close();
+    delete iScreensaverActivationSubscriber;
+
+    if ( iIdleTime )
+        {
+        iIdleTime->Cancel();
+        }
+    delete iIdleTime;
+    delete iDriveMaster;
+    }
+
+// -----------------------------------------------------------------------------
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+CAknsSrvSettings* CAknsSrvSettings::NewL(
+    MAknsSrvSettingObserver* aObserver, RFs& aFileSystemSession )
+    {
+    CAknsSrvSettings* self = new (ELeave) CAknsSrvSettings( aObserver, aFileSystemSession );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Callback - USB status change.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::USBCallBack(TAny* aPtr)
+    {
+    CAknsSrvSettings* self = static_cast<CAknsSrvSettings*>(aPtr);
+    if (self)
+        {
+        self->HandlePropertyChange(EAknsSrvSPUSBAttached);
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// Callback - when screensaver state changes.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::SSCallBack(TAny* aPtr)
+    {
+    CAknsSrvSettings* self = static_cast<CAknsSrvSettings*>(aPtr);
+    if (self)
+        {
+        self->HandlePropertyChange( EAknsSrvSPScreensaverActivation );
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// Callback - layout changed.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::LayoutCallBack(TAny* aPtr)
+    {
+    CAknsSrvSettings* self = static_cast<CAknsSrvSettings*>(aPtr);
+    if (self)
+        {
+        self->HandlePropertyChange( EAknsSrvSPLayoutId );
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// Callback - skins repository.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::SkinsRepositoryCallBack(TAny* aPtr)
+    {
+    CAknsSrvSettings* self = static_cast<CAknsSrvSettings*>(aPtr);
+    if (self)
+        {
+        switch( self->iSkinsRepositoryWatcher->ChangedKey() )
+            {
+            case KPslnActiveSkinUid:
+                break;
+            case KPslnWallpaperType:
+                self->HandlePropertyChange( EAknsSrvSPWallpaperType );
+                break;
+            };
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// Callback - Themes repository.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::ThemesRepositoryCallBack(TAny* aPtr)
+    {
+    CAknsSrvSettings* self = static_cast<CAknsSrvSettings*>(aPtr);
+    if (self)
+        {
+        switch( self->iThemesRepositoryWatcher->ChangedKey() )
+            {
+            case KThemesWallpaperSlideSetInterval:
+                self->HandlePropertyChange( EAknsSrvSPSlidesetWPTimeout );
+                break;
+            case KThemesWallpaperSlideSetType:
+                self->HandlePropertyChange( EAknsSrvSPSlidesetWPType );
+                break;
+            case KThemesTransitionEffects:
+                self->HandlePropertyChange( EAknsSrvSPTransitionFx );
+                break;
+            case KThemesAnimBackgroundSupport:
+                self->HandlePropertyChange( EAknsSrvSPAnimBackground );
+                break;
+            default:
+                break;
+            };
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// Callback - DRM repository.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::DRMRepositoryCallBack(TAny* aPtr)
+    {
+    CAknsSrvSettings* self = static_cast<CAknsSrvSettings*>(aPtr);
+    if (self)
+        {
+        if( self->iDRMRepositoryWatcher->ChangedKey() ==
+            KDRMHelperServerNotification )
+            {
+            self->HandlePropertyChange( EAknsSrvSPDRMHelperNotification );
+            }
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// Backup operation handling.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::HandleBackupOperationEventL(
+    const TBackupOperationAttributes& aBackupOperationAttributes )
+    {
+    if( aBackupOperationAttributes.iOperation == EStart )
+        {
+        AKNS_TRACE_INFO("CAknsSrvSettings::HandleBackupOperationEventL Operation START");
+        iBackupOperationInProgress = ETrue;
+        iObserver->NotifyBackupOperationBegin();
+        }
+    else if( aBackupOperationAttributes.iOperation == EEnd ||
+        aBackupOperationAttributes.iOperation == EAbort )
+        {
+        AKNS_TRACE_INFO("CAknsSrvSettings::HandleBackupOperationEventL Operation END/ABORT");
+        iBackupOperationInProgress = EFalse;
+        iObserver->NotifyBackupOperationEnd();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CAknsSrvSettings::NotifyDriveStatusChange
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::NotifyDriveStatusChange(
+    const TInt& aDrive, const TBool& aMediaNotPresent  )
+    {
+    iObserver->NotifyDriveChange( aDrive, aMediaNotPresent );
+    }
+
+// -----------------------------------------------------------------------------
+// Starts additional listeners.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::InstallAdditionalWatchersL()
+    {
+    iAvkonRepositoryWatcher = CAknsRepositoryWatcher::NewL(
+        KCRUidAvkon,
+        KAknLayoutId,
+        CCenRepNotifyHandler::EIntKey,
+        TCallBack(LayoutCallBack, this),
+        iAvkonRepository );
+
+    iSkinsRepositoryWatcher = CAknsRepositoryWatcher::NewL(
+        KCRUidPersonalisation,
+        TCallBack(SkinsRepositoryCallBack, this),
+        iSkinsRepository );
+
+    iDRMRepository = CRepository::NewL(KCRUidDRMHelperServer);
+    iDRMRepositoryWatcher = CAknsRepositoryWatcher::NewL(
+        KCRUidDRMHelperServer,
+        KDRMHelperServerNotification,
+        CCenRepNotifyHandler::EStringKey,
+        TCallBack(DRMRepositoryCallBack, this),
+        iDRMRepository );
+
+    iThemesRepositoryWatcher = CAknsRepositoryWatcher::NewL(
+        KCRUidThemes,
+        TCallBack(ThemesRepositoryCallBack, this),
+        iThemesRepository);
+
+    User::LeaveIfError(
+        iScreensaverActivationProperty.Attach( KPSUidScreenSaver, KScreenSaverOn ) );
+    iScreensaverActivationSubscriber = new (ELeave) CAknsPropertySubscriber(
+        TCallBack(SSCallBack, this), iScreensaverActivationProperty );
+
+    User::LeaveIfError( iEnableUSBWatchProperty.Attach(
+          KPSUidUsbWatcher, KUsbWatcherSelectedPersonality) );
+    iUSBWatchSubscriber = new (ELeave) CAknsPropertySubscriber(
+        TCallBack(USBCallBack, this), iEnableUSBWatchProperty );
+    iUSBWatchSubscriber->SubscribeL();
+    }
+
+// -----------------------------------------------------------------------------
+// Sets active skin PID.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::SetCachedSkinPID( const TAknsPkgID aPid )
+    {
+    iActiveSkinPID = aPid;
+    }
+
+// -----------------------------------------------------------------------------
+// ETrue when AH mirroring is active.
+// -----------------------------------------------------------------------------
+//
+TBool CAknsSrvSettings::CachedAHMirroringActive()
+    {
+    return iAHMirroringActive;
+    }
+
+// -----------------------------------------------------------------------------
+// Returns cached skin PID.
+// -----------------------------------------------------------------------------
+//
+TAknsPkgID CAknsSrvSettings::CachedSkinPID()
+    {
+    return iActiveSkinPID;
+    }
+
+// -----------------------------------------------------------------------------
+// Is cached backup operation in progress.
+// -----------------------------------------------------------------------------
+//
+TBool CAknsSrvSettings::CachedBackupOperationInProgress()
+    {
+    return iBackupOperationInProgress;
+    }
+
+// -----------------------------------------------------------------------------
+// Is highlight animation enabled.
+// -----------------------------------------------------------------------------
+//
+TBool CAknsSrvSettings::HighlightAnimEnabled() const
+    {
+    return iHighlightAnimEnabled;
+    }
+
+// -----------------------------------------------------------------------------
+// Type of wallpaper (none/image/slideset).
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::WallpaperType()
+    {
+    TInt value = 0;
+    TInt err = iSkinsRepository->Get( KPslnWallpaperType, value );
+    if (err)
+        {
+        value = 0;
+        }
+    return value;
+    }
+
+// -----------------------------------------------------------------------------
+// Type of slide set (user defined/random).
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::SlideSetWPType()
+    {
+    TInt value = 0;
+    TInt err = iThemesRepository->Get( KThemesWallpaperSlideSetType, value );
+
+    // Error cases or zero value -> use random (default)
+    if( err || !value )
+        {
+        value = 0;
+        }
+    return value;
+    }
+
+// -----------------------------------------------------------------------------
+// Starts to listen for screensaver changes.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::StartScreenSaverListen()
+    {
+    if( iScreensaverActivationSubscriber )
+        {
+        iPreviousScreenSaverValue = ScreensaverState();
+        iScreensaverActivationSubscriber->StopSubscribe();
+        TRAPD( err, iScreensaverActivationSubscriber->SubscribeL() );
+        if ( err == KErrNone )
+            {
+            iDelayedNotification = ETrue;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Stops to listen for screensaver changes.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::StopScreenSaverListen()
+    {
+    if( iScreensaverActivationSubscriber )
+        {
+        iScreensaverActivationSubscriber->StopSubscribe();
+        }
+    iDelayedNotification = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// Return screensaver state.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::ScreensaverState() const
+    {
+    TInt retValue = KErrNotFound;
+    if ( iScreensaverActivationSubscriber )
+        {
+        iScreensaverActivationProperty.Get(
+            KPSUidScreenSaver,
+            KScreenSaverOn,
+            retValue );
+        }
+    return retValue;
+    }
+
+// -----------------------------------------------------------------------------
+// Interval of image change in slide set.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::SlideSetWPTimeout()
+    {
+    TInt value = 0;
+    TInt err = iThemesRepository->Get( KThemesWallpaperSlideSetInterval, value );
+
+    // Error cases or invalid value -> use default setting (10mins).
+    if( err || value < 0 )
+        {
+        return 600;
+        }
+    else
+        {
+        switch (value)
+            {
+            case 0:
+                return 60;
+            case 1:
+                return 600;
+            case 2:
+                return 1800;
+            case 3:
+                return 3600;
+            case 4:
+                return 86400;
+            default:
+                return 600;
+
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Returns transition effects state.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::TransitionFxState()
+    {
+    TInt value = KMaxTInt;
+    TInt err = iThemesRepository->Get( KThemesTransitionEffects, value );
+
+    // Error cases, disable effects
+    if( err )
+        {
+        return KMaxTInt;
+        }
+    return value;
+    }
+
+// -----------------------------------------------------------------------------
+// Returns animation effects state.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::AnimBackgroundState()
+    {
+    TInt value = KMaxTInt;
+    TInt err = iThemesRepository->Get( KThemesAnimBackgroundSupport, value );
+    if( err != KErrNone )
+        {
+        value = KMaxTInt;
+        }
+    return value;
+    }
+
+// -----------------------------------------------------------------------------
+// Set animation effects state.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::SetAnimBackgroundState( TInt aValue )
+    {
+    ASSERT( aValue == 0 || aValue == KMaxTInt );
+    
+    iThemesRepository->Set( KThemesAnimBackgroundSupport, aValue );
+    }
+
+// -----------------------------------------------------------------------------
+// Gives a reference to drive master.
+// -----------------------------------------------------------------------------
+//
+CAknsSrvDriveMaster* CAknsSrvSettings::GetDriveMaster()
+    {
+    return iDriveMaster;
+    }
+
+// -----------------------------------------------------------------------------
+// Write all settings to defaults.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::WriteAllToDefault(TBool aExcludeWP)
+    {
+    WriteSkinToDefault();
+    if (!aExcludeWP)
+        {
+        WriteIdleBackgroundToDefault();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Write skin to default.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::WriteSkinToDefault()
+    {
+    TAknsPkgID defaultSkin = DefaultSkinPID();
+    iActiveSkinPID.Set( defaultSkin );
+
+    TAknsPkgIDBuf buf;
+    defaultSkin.CopyToDes( buf );
+    iSkinsRepository->Set(KPslnActiveSkinUid, buf);
+    // Active skin location
+    iSkinsRepository->Set(KPslnActiveSkinLocation, 0);
+    }
+
+// -----------------------------------------------------------------------------
+// Write skin settings.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::WriteSkinSettings(const TAknsPkgID aPid, TBool aMMC)
+    {
+    iActiveSkinPID.Set( aPid );
+    TAknsPkgIDBuf buf;
+    iActiveSkinPID.CopyToDes(buf);
+    iSkinsRepository->Set(KPslnActiveSkinUid, buf);
+    // Active skin location
+    TInt location = 0;
+    if (aMMC)
+        {
+        location = 2;
+        }
+    iSkinsRepository->Set(KPslnActiveSkinLocation, location);
+    }
+
+// -----------------------------------------------------------------------------
+// Write wallpaper to default.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::WriteIdleBackgroundToDefault()
+    {
+    TAknsPkgIDBuf buf;
+    DefaultSkinPID().CopyToDes(buf);
+    iSkinsRepository->Set(KPslnIdleBackgroundImageUid, buf);
+    iSkinsRepository->Set(KPslnIdleBackgroundImagePath, KNullDesC());
+    iSkinsRepository->Set(KPslnWallpaperType, 0);
+    }
+
+// -----------------------------------------------------------------------------
+// Read arabic/hebrew mirroring state.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::ReadAHMirroringActive()
+    {
+    TInt ret(0);
+    TInt value(0);
+    ret = RetrieveInt( iAvkonRepository, KAknLayoutId, value, 0 );
+    if( value == EAknLayoutIdABRW )
+        {
+        iAHMirroringActive = ETrue;
+        }
+    else
+        {
+        iAHMirroringActive = EFalse;
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// Read active skin's PID.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::ReadActiveSkinPID()
+    {
+    TInt ret = RetrievePID( iSkinsRepository, KPslnActiveSkinUid,
+        iActiveSkinPID, DefaultSkinPID() );
+
+    // if KPslnActiveSkinUid is 0, translate to default skin
+    if( iActiveSkinPID == KAknsNullPkgID )
+        {
+        iActiveSkinPID.Set( DefaultSkinPID() );
+        
+        TAknsPkgIDBuf buf;
+        iActiveSkinPID.CopyToDes(buf);
+        iSkinsRepository->Set(KPslnActiveSkinUid, buf);
+        }
+    
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// Read path to wallpaper file.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::ReadIdleBackgroundFile( TPath& aPath )
+    {
+    return iSkinsRepository->Get( KPslnIdleBackgroundImagePath,
+        aPath );
+    }
+
+// -----------------------------------------------------------------------------
+// Read DRM Helper server notification state.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::ReadDRMHelperServerNotification( TDes& aString )
+    {
+    return iDRMRepository->Get( KDRMHelperServerNotification, aString );
+    }
+
+// -----------------------------------------------------------------------------
+// Highlight animation enabled/disable flag is read-only -> just read and cache.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::ReadHighlightAnimEnabled()
+    {
+    TInt value = KErrNone;
+    TInt err = iSkinsRepository->Get( KPslnHighlightAnimationEnabled, value );
+
+    // Error cases or zero value -> disabled highlight animation
+    if( err || !value )
+        {
+        iHighlightAnimEnabled = EFalse;
+        }
+    else
+        {
+        iHighlightAnimEnabled = ETrue;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Return default skin PID.
+// -----------------------------------------------------------------------------
+//
+TAknsPkgID CAknsSrvSettings::DefaultSkinPID()
+    {
+    // If value has not been read, read it now.
+    if ( iDefaultSkinPID == KAknsNullPkgID )
+        {
+        ReadDefaultSkinID();
+        }
+    return iDefaultSkinPID;
+    }
+
+// -----------------------------------------------------------------------------
+// Some PS property has changed.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::HandlePropertyChange(
+    const TAknsSrvSettingsProperty aProperty )
+    {
+    switch( aProperty )
+        {
+        case EAknsSrvSPUSBAttached:
+            {
+            TInt value = KErrNone;
+            iEnableUSBWatchProperty.Get(value);
+            if (value == KUsbPersonalityIdMS)
+                {
+                iObserver->NotifyUSBAttach();
+                }
+            else
+                {
+                iObserver->NotifyUSBRemoval();
+                }
+            }
+            break;
+        case EAknsSrvSPLayoutId:
+            {
+            ReadAHMirroringActive();
+            iObserver->NotifyLayoutChange();
+            }
+            break;
+
+        case EAknsSrvSPActiveSkin:
+            {
+            TAknsPkgID oldSkin = iActiveSkinPID;
+            ReadActiveSkinPID();
+
+            if( oldSkin != iActiveSkinPID)
+                {
+                iObserver->NofifySkinChange();
+                }
+            }
+            break;
+
+        case EAknsSrvSPIdleBackground:
+            iObserver->NotifyIdleBackgroundChange();
+            break;
+
+        case EAknsSrvSPDRMHelperNotification:
+            iObserver->NotifyDRMChange();
+            break;
+        case EAknsSrvSPWallpaperType:
+            iObserver->NotifyWallpaperTypeChange();
+            break;
+        case EAknsSrvSPSlidesetWPTimeout:
+            iObserver->NotifySlideSetTimeoutChange();
+            break;
+        case EAknsSrvSPSlidesetWPType:
+            iObserver->NotifySlideSetTypeChange();
+            break;
+
+        case EAknsSrvSPScreensaverActivation:
+            {
+            TInt screenSaverState = ScreensaverState();
+            if ( ( iPreviousScreenSaverValue != screenSaverState ) &&
+                 ( screenSaverState == 0 ) )
+                {
+                if ( iIdleTime )
+                    {
+                    iIdleTime->Cancel();
+                    delete iIdleTime;
+                    iIdleTime = NULL;
+                    }
+                TRAP_IGNORE( 
+                    iIdleTime = CIdle::NewL( CActive::EPriorityIdle );
+                    iIdleTime->Start( TCallBack( DoHandleIdleTimeL, this ) ) ;
+                    );
+                }
+            }
+            break;
+        case EAknsSrvSPTransitionFx:
+            iObserver->NotifyTransitionFxChange();
+            break;
+        case EAknsSrvSPAnimBackground:
+            iObserver->NotifyAnimBackgroundChange();
+            break;
+        default:
+            break;
+        };
+    }
+
+// -----------------------------------------------------------------------------
+// Default skin ID is read-only -> just read and cache.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::ReadDefaultSkinID()
+    {
+    // If value has already been read, ignore call.
+    if ( iDefaultSkinPID != KAknsNullPkgID )
+        {
+        return;
+        }
+
+    // Inquire the default theme UID/PID from CenRep.
+    TInt value = KErrNone;
+    TBuf<32> buf;
+    TInt err = iSkinsRepository->Get( KPslnDefaultSkinUID, buf );
+    // Error case or zero value -> check the old key.
+    if ( err || !buf.CompareF( KAknSkinSrvNoDefaultThemeConfigured ) )
+        {
+        err = iSkinsRepository->Get( KPslnDefaultSkinID, value );
+        // Error case or zero value -> use platform default.
+        if ( err || !value )
+            {
+            iDefaultSkinPID = KAknsPIDS60DefaultSkin;
+            }
+        else
+            {
+            iDefaultSkinPID.Set( TUid::Uid( value ) );
+            }
+        }
+    else
+        {
+        TInt bufLength = buf.Length();
+        // If its 8 characters long, its UID.
+        // PIDs are 16 characters (8 ID + 8 timestamp)
+        if ( bufLength == KAknsSkinSrvUIDLength )
+            {
+            // Let's try to set it directly as Hex.
+            TLex hexLex( buf );
+            TUint pid;
+            err = hexLex.Val( pid, EHex );
+            if (!err)
+                {
+                // UIDs have no timestamp.
+                iDefaultSkinPID.Set( 0, pid );
+                }
+            }
+        else
+            {
+            // The skin PID is set in CenRep in format <PID1><PID2> and
+            // values are in hex.
+            TLex lex ( buf.Left( KAknsSkinSrvUIDLength ) );
+            TLex lex2 ( buf.Right( KAknsSkinSrvUIDLength ) );
+            TUint pid;
+            TUint timeStamp;
+            err = lex.Val( pid, EHex );
+            if ( !err )
+                {
+                err = lex2.Val( timeStamp, EHex );
+                }
+            if ( !err )
+                {
+                iDefaultSkinPID.Set( timeStamp, pid );
+                }
+            }
+        }
+    if ( err != KErrNone )
+        {
+        iDefaultSkinPID = KAknsPIDS60DefaultSkin;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Called when device is idle.
+// -----------------------------------------------------------------------------
+//
+TInt CAknsSrvSettings::DoHandleIdleTimeL( TAny* aAny )
+    {
+    static_cast< CAknsSrvSettings* >( aAny )->HandleIdleTime();
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// Handle the idle object activation.
+// If wallpaper has been changed when screensaver has been active,
+// and screensaver is now off, change wallpaper now.
+// -----------------------------------------------------------------------------
+//
+void CAknsSrvSettings::HandleIdleTime()
+    {
+    if ( iIdleTime )
+        {
+        iIdleTime->Cancel();
+        delete iIdleTime;
+        }
+    iIdleTime = NULL;
+    if ( iDelayedNotification )
+        {
+        iObserver->NotifyScreenSaverChange();
+        }
+    iDelayedNotification = EFalse;
+    }
+
+// End of File