--- a/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPlugin.cpp Mon Jan 18 20:19:52 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1083 +0,0 @@
-/*
-* Copyright (c) 2006 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: This file implements the Slideshow Screensaver plugin.
-*
-*/
-
-
-
-#include <eikenv.h>
-#include <bautils.h>
-#include <data_caging_path_literals.hrh>
-#include <centralrepository.h>
-#include <DRMHelper.h>
-
-// #include <aknnotewrappers.h> AppendSlideL
-// #include <aknnavi.h>
-// #include <aknnavide.h>
-// #include <mmfcontrollerpluginresolver.h>
-#include <DRMHelperServerInternalCRKeys.h>
-#include <mmf/common/mmfcontrollerpluginresolver.h> // For CleanupResetAndDestroyPushL
-#include <pslninternalcrkeys.h>
-#include <pslnslidesetdialoginterface.h>
-
-// #include <NPNExtensions.h>
-#include <coecntrl.h>
-#include <ecom/ecom.h>
-
-#include <ContentListingFactory.h>
-#include <MCLFItem.h>
-
-#include <slideshowplugin.rsg>
-
-#include "SlideshowPlugin.h"
-#include "SlideshowSlide.h"
-#include "SlideshowPluginUtils.h"
-
-// Constants
-const TInt KSecsToMicros = 1000000;
-
-// Slideshow duration times (secs)
-const TInt KMinSlideshowTime = 1;
-const TInt KMaxSlideshowTime = 60;
-const TInt KDefaultSlideshowTime = 5;
-
-// Backlight times (secs)
-const TInt KMinLightsTime = 0;
-const TInt KMaxLightsTime = 30;
-const TInt KDefaultLightsTime = 0;
-
-// Slide times
-// const TInt KMinSlideTime = 1;
-// const TInt KMaxSlideTime = 30;
-const TInt KDefaultSlideTime = 5;
-
-// Refresh interval (Draw() call frequency) in secs.
-// For better resolution kept smaller than slide time
-const TInt KRefreshInterval = 1;
-
-// Slideshow type
-const TInt KSlideshowTypeContinuous = 0;
-const TInt KSlideshowTypeRandom = 1;
-
-// const TInt KScreensaverAnimPluginInterfaceUid = 0x102750CB;
-
-_LIT(KResourceFileName, "Z:SlideshowPlugin.rsc");
-
-
-CSlideshowSettings::CSlideshowSettings()
- {
- iSlideshowTime = KDefaultSlideshowTime;
- iLightsTime = KDefaultLightsTime;
- iSlideTime = KDefaultSlideTime;
- iSlideshowType = KSlideshowTypeContinuous;
- }
-
-// ============================ MEMBER FUNCTIONS =============================
-
-
-// ---------------------------------------------------------------------------
-// CSlideshowPlugin::NewL
-// ---------------------------------------------------------------------------
-//
-CSlideshowPlugin* CSlideshowPlugin::NewL()
- {
- CSlideshowPlugin* self = new (ELeave) CSlideshowPlugin;
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(self);
- return self;
- }
-
-
-// ----------------------------------------------------------------------------
-// CSlideshowPlugin::~CSlideshowPlugin
-// ----------------------------------------------------------------------------
-//
-CSlideshowPlugin::~CSlideshowPlugin()
- {
- if (iResourceOffset != 0)
- {
- iEikEnv->DeleteResourceFile(iResourceOffset);
- }
-
- // Close and delete CR handlers
- NotifyCenrepChangeCancel();
- UnInitializeCenRep();
-
- // Close and delete P&S handlers
- if (iSettingsChangedSubscriber)
- {
- iSettingsChangedSubscriber->StopSubscribe();
- }
- iSettingsChangedProperty.Close();
- delete iSettingsChangedSubscriber;
-
- delete iScreensaverName;
- delete iSettings;
- delete iDrmHelper;
- delete iModel;
-
- // First model, then engine, otherwise bad things happen
- delete iCLFModel;
- delete iCLFEngine;
-
- // Logging done
- SSPLOGGER_DELETE;
- }
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CSlideshowPlugin::ConstructL()
- {
- // Start logging
- SSPLOGGER_CREATE;
-
- iModel = CSlideshowModel::NewL();
- iSettings = new (ELeave) CSlideshowSettings();
-
- // Get nearest language resource file and add it to the
- // eikon environment for the duration of the plugin life
- TFileName fileName;
- TParse lParse;
-
- // Add the resource dir
- lParse.Set(KResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL);
-
- // Get the filename with full path
- fileName = lParse.FullName();
-
- iEikEnv = CEikonEnv::Static();
-
- BaflUtils::NearestLanguageFile(iEikEnv->FsSession(), fileName);
-
- iResourceOffset = iEikEnv->AddResourceFileL(fileName);
-
- // Load localised name of screensaver to be returned
- // to Themes app in Name() query
- iScreensaverName = iEikEnv->AllocReadResourceL(R_SLIDESHOW_SCREENSAVER_NAME);
-
- InitializeCenRepL();
-
- // Read settings
- ReadSettings();
-
- // Make sure random slides are loaded
- iCLFModelUpToDate = EFalse;
-
- iTimerUpdated = EFalse;
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::CSlideshowPlugin
-// -----------------------------------------------------------------------------
-CSlideshowPlugin::CSlideshowPlugin()
- {
- }
-
-
-// --- MScreensaverPlugin ---
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::InitializeL
-// -----------------------------------------------------------------------------
-TInt CSlideshowPlugin::InitializeL(MScreensaverPluginHost *aHost)
- {
- SSPLOGGER_ENTERFN("InitializeL()");
-
- iWaitActive = EFalse;
- iDrawCount = 0;
-
- if (!aHost)
- {
- return KErrArgument;
- }
-
- iHost = aHost;
- // iHost->UseRefreshTimer( EFalse );
-
- NotifyCenrepChangeL();
-
- // No indicators while plugin running
- iHost->OverrideStandardIndicators();
-
- // Get display info
- UpdateDisplayInfo();
-
- // Attach and start watching settings changed key
- User::LeaveIfError(iSettingsChangedProperty.Attach(
- KPSUidScreenSaver, KScreenSaverPluginSettingsChanged));
-
- iSettingsChangedSubscriber = new (ELeave) CPSSubscriber(
- TCallBack(HandleSettingsChanged, this), iSettingsChangedProperty);
- iSettingsChangedSubscriber->SubscribeL();
-
- iDrmHelper = CDRMHelper::NewL(*iEikEnv);
-
- // Load slides on start rather than here
- // LoadSlidesL();
-
- // Make sure random slides are loaded
- iCLFModelUpToDate = EFalse;
-
- SSPLOGGER_LEAVEFN("InitializeL()");
-
- return KErrNone;
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::Draw
-// -----------------------------------------------------------------------------
-TInt CSlideshowPlugin::Draw(CWindowGc& aGc)
- {
- SSPLOGGER_ENTERFN("Draw()");
-
- // Clear the screen on the very first draw call after starting
- if (iDrawCount < 0)
- {
- iDrawCount = 0;
- aGc.SetBrushColor(KRgbBlack);
- aGc.Clear();
- }
-
- // If still waiting for CLF, bail out
- if (iWaitActive)
- {
- SSPLOGGER_WRITE("Draw(): Waiting for CLF, bail out");
- SSPLOGGER_LEAVEFN("Draw()");
- return KErrNone;
- }
- // Make sure we have something to display
- if (iModel->NumberOfSlides() == 0)
- {
- SSPLOGGER_WRITE("Draw(): Nothing to display, suspending");
- SSPLOGGER_LEAVEFN("Draw()");
-// iHost->Suspend( -1 ); // This place will be crashed when transform to default type
- return KErrNotFound;
- }
-
- CSlideshowSlide* pSlide = iModel->NextSlide(EFalse);
- // get the status of the slide
- TInt status = iModel->SlideStatus(pSlide); // TInt decoded(1), decoding(2), not decoding(3),no slide (0)
- // 4 could not decode the slide
- if(KStatusDecodingInProgress == status)
- {
- // decoding in progress... return
- // when ever decoding is going on.. call draw method every 1 second to check the status of the decoding
- // and draw the image as soon as it is available ( otherwise Draw is called every 5 secods, very bad user responce)
- if(iTimerUpdated)
- {
- iHost->SetRefreshTimerValue(KSecsToMicros);
- iTimerUpdated = EFalse;
- }
- return KErrNone;
- }
- else if (KStatusSlideDecoded == status)
- {
- // File was decoded properly and available
- SSPLOGGER_WRITEF(_L("SSP: Draw(): Got slide (%x), drawing"), pSlide);
-
- // Consume slide's DRM rights
- SlideshowUtil::DRMConsume(iDrmHelper, pSlide);
-
- // Make sure the window is empty in case the bitmap doesn't
- // fill the whole screen. Draw background black
- aGc.SetBrushColor(KRgbBlack);
- // aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
- aGc.Clear();
- // Draw image centered
- DrawCentered(aGc, pSlide);
- if(iHost && !iTimerUpdated)
- {
- iHost->SetRefreshTimerValue(iSettings->iSlideTime * KSecsToMicros);
- iTimerUpdated = ETrue;
- }
- // Flush draw buffer so that the new image is displayed immediately
- FlushDrawBuffer();
- SSPLOGGER_WRITE("Draw(): Prepare next slide");
-
- SSPLOGGER_LEAVEFN("Draw()");
- }
-
- // Prefetch image for the next slide
- iModel->PrepareNextSlide(
- (iSettings->iSlideshowType == KSlideshowTypeRandom), iDi.iRect.Size());
-
- SSPLOGGER_LEAVEFN("Draw()");
-
- return KErrNone;
-
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::Name
-// -----------------------------------------------------------------------------
-const TDesC16& CSlideshowPlugin::Name() const
- {
- if (iScreensaverName)
- {
- return *iScreensaverName;
- }
- else
- {
- return KNullDesC;
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::Capabilities
-// -----------------------------------------------------------------------------
-TInt CSlideshowPlugin::Capabilities()
- {
- return (EScpCapsConfigure | EScpCapsSelectionNotification);
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::PluginFunction
-// -----------------------------------------------------------------------------
-TInt CSlideshowPlugin::PluginFunction(
- TScPluginCaps aFunction,
- TAny* aParam)
- {
- TInt ret = KErrNone;
-
- switch (aFunction)
- {
- case EScpCapsSelectionNotification:
- case EScpCapsPreviewNotification:
- // Peek into the slideset
- TRAP(ret, LoadSlidesL());
- if (ret!=KErrNone || iModel->NumberOfSlides() == 0)
- {
- SSPLOGGER_WRITE("No slides selected - launching settings");
- TRAP(ret, ConfigureL(aParam));
- // Check if at least one file is selected
- TRAP(ret, LoadSlidesL());
- if ( ret == KErrNone && iModel->NumberOfSlides() == 0)
- {
- // Don't Pop an error note, just return error
- return KErrCancel;
- }
- }
- break;
- case EScpCapsConfigure:
- // Configure command
- TRAP(ret, ConfigureL(aParam));
- break;
- default:
- break;
- }
-
- return ret;
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::HandleScreensaverEventL
-// -----------------------------------------------------------------------------
-TInt CSlideshowPlugin::HandleScreensaverEventL(
- TScreensaverEvent aEvent,
- TAny* /*aData*/ )
- {
- switch (aEvent)
- {
- case EScreensaverEventStopping:
- StopPlugin();
- break;
-
- case EScreensaverEventStarting:
- StartPlugin();
- break;
-
- case EScreensaverEventDisplayChanged:
- UpdateDisplayInfo();
- break;
-
- case EScreensaverEventTimeout:
- StopPlugin();
- iHost->Suspend(-1);
- break;
-
- default:
- break;
- }
- return KErrNone;
- }
-
-
-// -----------------------------------------------------------------------------
-// From MCLFOperationObserver. Called by CLF when e.g. a content listing
-// operation is finished.
-// -----------------------------------------------------------------------------
-void CSlideshowPlugin::HandleOperationEventL(TCLFOperationEvent aOperationEvent,
- TInt aError)
- {
- if (aOperationEvent == ECLFRefreshComplete)
- {
- iCLFError = aError;
- EndWaitForCLF();
- }
-
- if (aOperationEvent == ECLFModelOutdated)
- {
- // Need to update random list on next start
- iCLFModelUpToDate = EFalse;
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::ReadSettings
-// -----------------------------------------------------------------------------
-TInt CSlideshowPlugin::ReadSettings()
- {
- TInt err = KErrNone;
-
- err = iSlideshowRepository->Get(
- KThemesScreenSaverSlideSetDuration,
- iSettings->iSlideshowTime);
-
- if ((iSettings->iSlideshowTime < KMinSlideshowTime) ||
- (iSettings->iSlideshowTime > KMaxSlideshowTime))
- {
- // Out of range, set to default
- iSettings->iSlideshowTime = KDefaultSlideshowTime;
- }
-
- err = iSlideshowRepository->Get(
- KThemesScreenSaverSlideSetBacklight,
- iSettings->iLightsTime);
-
- if ((iSettings->iLightsTime < KMinLightsTime) ||
- (iSettings->iLightsTime > KMaxLightsTime))
- {
- // Out of range, set to default
- iSettings->iLightsTime = KDefaultLightsTime;
- }
-
- err = iSlideshowRepository->Get(
- KThemesScreenSaverSlideSetType,
- iSettings->iSlideshowType);
-
- // No setting for slide timing
- iSettings->iSlideTime = KDefaultSlideTime;
-
- return err;
- }
-
-#if 0
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::UpdateFileName
-// -----------------------------------------------------------------------------
-//
-TBool CSlideshowPlugin::UpdateFileName()
- {
- if ( !BaflUtils::FileExists( iEikEnv->FsSession(),
- iSettings->iFileName ) )
- {
- // File is deleted now, Show empty string
- iSettings->iFileName.Copy( KEmptyString );
- return ETrue;
- }
-
- TBool canbeautomated(EFalse);
-
- TInt res = 0;
- iDrmHelper->SetAutomatedType(
- CDRMHelper::EAutomatedTypeScreenSaver );
- res = iDrmHelper->CanSetAutomated( iSettings->iFileName,
- canbeautomated );
-
- if ( res || !canbeautomated)
- {
- iSettings->iFileName.Copy( KEmptyString );
- return ETrue;
- }
- return EFalse;
- }
-
-#endif
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::HandleRepositoryCallBack
-// -----------------------------------------------------------------------------
-//
-TInt CSlideshowPlugin::HandleRepositoryCallBack(TAny* aPtr)
- {
- STATIC_CAST(CSlideshowPlugin*, aPtr)->HandleCRSettingsChange(aPtr);
- return KErrNone;
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::HandleCRSettingsChange
-// -----------------------------------------------------------------------------
-//
-void CSlideshowPlugin::HandleCRSettingsChange(TAny* /*aPtr*/)
- {
- if (iSlideshowCRWatcher)
- {
- TInt changedKey = iSlideshowCRWatcher->ChangedKey();
-
- switch (changedKey)
- {
- case KThemesScreenSaverSlideSetType:
- case KThemesScreenSaverSlideSetBacklight:
- case KThemesScreenSaverSlideSetDuration:
- // Update settings
- ReadSettings();
- break;
-
- default:
- // Not interested in other keys
- break;
- }
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::HandleSettingsChanged
-// -----------------------------------------------------------------------------
-//
-TInt CSlideshowPlugin::HandleSettingsChanged(TAny* aPtr)
- {
- return (STATIC_CAST(CSlideshowPlugin*, aPtr)->SettingsChanged());
- }
-
-
-// --- private functions ---
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::InitializeCenRepL
-// Connect Central Repository sessions
-// -----------------------------------------------------------------------------
-void CSlideshowPlugin::InitializeCenRepL()
- {
-
- TRAPD(err, iSlideshowRepository = CRepository::NewL(KCRUidThemes));
- User::LeaveIfError(err);
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::NotifyCenrepChangeL
-// -----------------------------------------------------------------------------
-//
-void CSlideshowPlugin::NotifyCenrepChangeL()
- {
- iSlideshowCRWatcher = CRepositoryWatcher::NewL(
- KCRUidThemes,
- TCallBack(HandleRepositoryCallBack, this),
- iSlideshowRepository);
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::NotifyCenrepChangeCancel
-// -----------------------------------------------------------------------------
-void CSlideshowPlugin::NotifyCenrepChangeCancel()
- {
- delete iSlideshowCRWatcher;
- iSlideshowCRWatcher = NULL;
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::UnInitializeCenRep
-// -----------------------------------------------------------------------------
-void CSlideshowPlugin::UnInitializeCenRep()
- {
- if (iSlideshowRepository)
- {
- delete iSlideshowRepository;
- iSlideshowRepository = NULL;
- }
- }
-
-
-// Starts the saver when screensaver starts
-void CSlideshowPlugin::StartPlugin()
- {
- // Make sure we start from a clean slate
- iDrawCount = -1;
-
- // (Re-)load slideset. When done on every start this avoids
- // having to keep track of gallery changes and images on MMC.
- TRAP_IGNORE(LoadSlidesL());
-
- if (iModel->NumberOfSlides() == 0)
- {
- iHost->RevertToDefaultSaver();
- return;
- }
-
- iModel->PrepareNextSlide(
- (iSettings->iSlideshowType == KSlideshowTypeRandom),
- iDi.iRect.Size());
-
- if (iHost)
- {
- // Start animating as per settings
- iHost->RequestTimeout(iSettings->iSlideshowTime);
- Lights(iSettings->iLightsTime);
- // let the draw method be called every 1 second till first image is available
- iHost->SetRefreshTimerValue(KRefreshInterval * KSecsToMicros);
- SetDisplayMode();
- }
- }
-
-
-// Stops the plugin
-void CSlideshowPlugin::StopPlugin()
- {
- // Let go of pre-fetched images
- iModel->ReleaseNextSlide();
- iTimerUpdated = EFalse;
- }
-
-
-// Draws centered slides
-void CSlideshowPlugin::DrawCentered(CWindowGc& aGc, CSlideshowSlide* aSlide)
- {
- CFbsBitmap* bitmap = aSlide->Image();
-
- if (!bitmap)
- return;
-
- // Center the bitmap horizontally and vertically (crop off excess)
- TPoint pos;
- TRect rectToDraw;
- TSize sizeBmp = bitmap->SizeInPixels();
- TInt screenWidth = iDi.iRect.Width();
- TInt screenHeight = iDi.iRect.Height();
-
- // Horizontally
- if (sizeBmp.iWidth <= screenWidth)
- {
- // Width fits on screen - center xpos
- pos.iX = (screenWidth - sizeBmp.iWidth) / 2;
-
- // Whole width of bmp can be drawn
- rectToDraw.SetWidth(sizeBmp.iWidth);
- }
- else
- {
- // Bmp wider than screen - xpos top left
- pos.iX = 0;
-
- // Adjust draw rect position and width
- rectToDraw.iTl.iX = (sizeBmp.iWidth - screenWidth) / 2;
- rectToDraw.SetWidth(screenWidth);
- }
-
- // Vertically
- if (sizeBmp.iHeight <= screenHeight)
- {
- // Height fits on screen - center ypos
- pos.iY = (screenHeight - sizeBmp.iHeight) / 2;
-
- // Whole height of bmp can be drawn
- rectToDraw.SetHeight(sizeBmp.iHeight);
- }
- else
- {
- // Bmp higher than screen - ypos top left
- pos.iY = 0;
-
- // Adjust draw rect position and height
- rectToDraw.iTl.iY = (sizeBmp.iHeight - screenHeight) / 2;
- rectToDraw.SetHeight(screenHeight);
- }
-
- // Do the drawing
- aGc.BitBlt(pos, bitmap, rectToDraw);
- }
-
-
-// Loads the slides into the model
-void CSlideshowPlugin::LoadSlidesL()
- {
- SSPLOGGER_ENTERFN("LoadSlidesL()");
-
- // Based on settings, load predefined set or random slides
- if (iSettings->iSlideshowType == KSlideshowTypeRandom)
- {
- LoadRandomSlidesL();
- }
- else
- {
- LoadSlideSetL();
- }
-
- SSPLOGGER_LEAVEFN("LoadSlidesL()");
- }
-
-
-// Load filenames from settings file stored in skin server directory
-void CSlideshowPlugin::LoadSlideSetL()
- {
- SSPLOGGER_ENTERFN("LoadSlideSetL()");
-
- // Start by getting rid of possibly loaded slides
- iModel->DeleteAll();
-
- // Connect to skin server.
- RAknsSrvSession skinSrv;
- TInt error = skinSrv.Connect();
- User::LeaveIfError(error);
- CleanupClosePushL(skinSrv);
-
- // Open images file
- TInt fileSrvHandle;
- TInt fileHandle;
- fileSrvHandle = skinSrv.OpenImageInifile(EAknsSrvInifileSSSS, fileHandle);
-
- // Adopt the handle to our process
- RFile imgFile;
- error = imgFile.AdoptFromServer(fileSrvHandle, fileHandle);
- User::LeaveIfError(error);
- CleanupClosePushL(imgFile);
-
- // Read image filenames from file (as text)
- TFileText textFile;
- textFile.Set(imgFile);
- textFile.Seek(ESeekStart);
-
- // Read until EOF
- TInt count = 0;
- TFileName fileName;
- while (textFile.Read(fileName) == KErrNone)
- {
- // Check that the file exists. If not, it is still OK, if it is
- // on the memory card - it may show up later. Omit files from other
- // drives that do not exist at the time of loading
- TBool exists = BaflUtils::FileExists(iEikEnv->FsSession(), fileName);
- TBool isOnMC = SlideshowUtil::IsOnMC(fileName);
-
- if (!exists) // && (!isOnMC))
- {
- // Do not add nonexisting files // from other than memory card
- continue;
- }
-#if 0
- // Check that the file's DRM rights allow it to be displayed (if not
- // missing because not on MMC
- if (!SlideshowUtil::DRMCheck(fileName))
- {
- // No point in adding files that cannot be displayed anyway
- continue;
- }
-#endif
- // Create a slide with the filename and store it in the model
- CSlideshowSlide* pSlide = CSlideshowSlide::NewL(fileName, isOnMC);
- CleanupStack::PushL(pSlide);
- iModel->AppendSlideL(pSlide);
- CleanupStack::Pop(pSlide);
-
- SSPLOGGER_WRITEF(_L("SSP: Slide %d added, file: %S"), count, &fileName);
- count++;
- }
-
- CleanupStack::PopAndDestroy(2); // imgFile, skinSrv
-
- SSPLOGGER_LEAVEFN("LoadSlideSetL()");
- }
-
-
-// Load filenames from CLF
-void CSlideshowPlugin::LoadRandomSlidesL()
- {
- SSPLOGGER_ENTERFN("LoadRandomSlidesL()");
-
- // No need to do anything, if model hasn't become
- // outdated since last loading
- if (iCLFModelUpToDate)
- {
- return;
- }
-
- // Start by getting rid of possibly loaded slides
- iModel->DeleteAll();
-
- // Make sure CLF is ready
- ConnectToCLFL();
-
- // Refresh CLF model
- iCLFError = KErrNone;
- iCLFModel->RefreshL();
-
- // Wait for refresh to complete before continuing
- WaitForCLF();
-
- // On error bail out
- if (iCLFError != KErrNone)
- {
- SSPLOGGER_WRITEF(_L("SSP: CLF refresh error %d"), iCLFError);
- return;
- }
-
- // Model is up to date
- iCLFModelUpToDate = ETrue;
-
- // CLF model should now contain the image files in Gallery, proceed to
- // load into our model
- TInt nItems = iCLFModel->ItemCount();
-
- // Loop through, add filenames
- TInt count = 0;
- for (TInt i = 0; i < nItems; i++)
- {
- // TFileName fileName;
- TPtrC fileName;
- TInt error = KErrNone;
-
- const MCLFItem& item = iCLFModel->Item(i);
-
- error = item.GetField(ECLFFieldIdFileNameAndPath, fileName);
-
- // If OK, add to model
- if (error == KErrNone)
- {
- // Check that the file exists. If not, it is still OK, if it is
- // on the memory card - it may show up later. Omit files from other
- // drives that do not exist at the time of loading
- // TODO: Can be removed, as slides are loaded on every start
- TBool exists = BaflUtils::FileExists(iEikEnv->FsSession(), fileName);
- TBool isOnMC = SlideshowUtil::IsOnMC(fileName);
-
- if (!exists) // && (!isOnMC))
- {
- // Do not add nonexisting files from other than memory card
- continue;
- }
-#if 0
- // Check that the file's DRM rights allow it to be displayed (if not
- // missing because not on MMC
- if (!SlideshowUtil::DRMCheck(fileName))
- {
- // No point in adding files that cannot be displayed anyway
- continue;
- }
-#endif
- // Create a slide with the filename and store it in the model
- CSlideshowSlide* pSlide = CSlideshowSlide::NewL(fileName, isOnMC);
- CleanupStack::PushL(pSlide);
- iModel->AppendSlideL(pSlide);
- CleanupStack::Pop(pSlide);
-
- SSPLOGGER_WRITEF(_L("SSP: Slide %d added, file: %S"), count, &fileName);
- count++;
- }
- }
-
- SSPLOGGER_LEAVEFN("LoadRandomSlidesL()");
- }
-
-
-// Requests display mode from host
-void CSlideshowPlugin::SetDisplayMode()
- {
- if (!iHost)
- {
- return;
- }
-
- // Exit partial mode
- iHost->ExitPartialMode();
- }
-
-
-// Requests lights
-void CSlideshowPlugin::Lights(TInt aSecs)
- {
- // Request nothing, if no time set (don't force lights off)
- if ((iHost) && (aSecs > 0))
- {
- SSPLOGGER_WRITEF(_L("SSP: Request lights for %d secs"), aSecs);
- iHost->RequestLights(aSecs);
- }
- }
-
-
-// Configure the plugin
-void CSlideshowPlugin::ConfigureL(TAny* /* aParam */)
- {
- // Look for screensaver slideset setting interface
- RImplInfoPtrArray array;
- const TUid slidesetInterface = { 0x102823AD };
- const TUid slidesetImplUidScreensaver = { 0x102823AF };
- const TEComResolverParams emptyParams;
-
- REComSession::ListImplementationsL(
- slidesetInterface,
- emptyParams,
- KRomOnlyResolverUid,
- array);
- CleanupResetAndDestroyPushL(array);
-
- // Loop through implementations and look for screensaver
- // slideset implementation (this is not really completely
- // necessary, because we already know the implementation UID,
- // but we want to be sure it's there, and on ROM only
- TInt nCount = array.Count();
- TUid implUid;
-
- for (TInt i = 0; i < nCount; i++)
- {
- CImplementationInformation* info = array[i];
-
- if (info->ImplementationUid() == slidesetImplUidScreensaver)
- {
- // Found
- implUid = info->ImplementationUid();
- break;
- }
- }
-
- // Did we get it?
- if (implUid != slidesetImplUidScreensaver)
- {
- User::Leave(KErrNotFound);
- }
-
- // Instantiate the interface
- CPslnSlidesetDialogInterface* plugin =
- CPslnSlidesetDialogInterface::NewL(implUid);
-
- TInt dlgRet = KErrNone;
- if (plugin)
- {
- dlgRet = plugin->ExecuteDialogLD();
- }
-
- // Cleanup
- array.ResetAndDestroy();
- CleanupStack::PopAndDestroy(); // array
-
- User::LeaveIfError(dlgRet);
- }
-
-
-// Updates the saved information about display
-void CSlideshowPlugin::UpdateDisplayInfo()
- {
- iDi.iSize = sizeof(TScreensaverDisplayInfo);
- iHost->DisplayInfo(&iDi);
- }
-
-
-// Flushes pending draws
-void CSlideshowPlugin::FlushDrawBuffer()
- {
- iEikEnv->WsSession().Flush();
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::SettingsChanged
-// Called when Themes reports a settings change through P & S
-// -----------------------------------------------------------------------------
-TInt CSlideshowPlugin::SettingsChanged()
- {
- // If current key value is nonzero, it means the settings
- // have just changed, otherwise, no action necessary
- TInt value = 0;
- iSettingsChangedProperty.Get(value);
-
- if (value == EScreenSaverPluginSettingsChanged)
- {
-#if 0
- // Slide file has changed - re-load images
- TRAP_IGNORE(LoadSlidesL());
- // Pre-fetch the fist image to be drawn
- iModel->PrepareNextSlide(
- (iSettings->iSlideshowType == KSlideshowTypeRandom),
- iDi.iRect.Size());
-#endif
- iSettingsChangedProperty.Set(EScreenSaverPluginSettingsNoChange);
- }
-
- return KErrNone;
- }
-
-
-// -----------------------------------------------------------------------------
-// CSlideshowPlugin::ConnectToCLFL
-// Connects to Content Listing Framework. Can be called many times,
-// connects only once
-// -----------------------------------------------------------------------------
-void CSlideshowPlugin::ConnectToCLFL()
- {
- if (!iCLFEngine)
- {
- iCLFEngine = ContentListingFactory::NewContentListingEngineLC();
- CleanupStack::Pop(); // LC
- }
-
- if (!iCLFModel)
- {
- iCLFModel = iCLFEngine->CreateListModelLC(*this);
- CleanupStack::Pop(); // LC
- }
-
- // Set image types to model
- RArray<TInt> typeArray;
- CleanupClosePushL(typeArray);
- typeArray.AppendL(ECLFMediaTypeImage);
- iCLFModel->SetWantedMediaTypesL(typeArray.Array());
- CleanupStack::PopAndDestroy(&typeArray);
- }
-
-
-// Begins wait for CLF
-void CSlideshowPlugin::WaitForCLF()
- {
- if (iWaitActive)
- {
- return;
- }
- else
- {
- iWaitActive = ETrue;
- iWaiter.Start();
- }
- }
-
-
-// Ends wait for CLF
-void CSlideshowPlugin::EndWaitForCLF()
- {
- if (!iWaitActive)
- {
- return;
- }
- else
- {
- iWaiter.AsyncStop();
- iWaitActive = EFalse;
- }
- }
-
-// End Of file.