# HG changeset patch # User Pat Downey # Date 1283340640 -3600 # Node ID e8d784ac1a4bbcebe5a84aff5013dd06bd7b699b # Parent aaeeca1f15afdc579688d82d83802d58b67752ae Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035 diff -r aaeeca1f15af -r e8d784ac1a4b CenRep/keys_screensaver.xls Binary file CenRep/keys_screensaver.xls has changed diff -r aaeeca1f15af -r e8d784ac1a4b aif/screensaver_reg.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aif/screensaver_reg.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2004 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: +* resource definition. +* +*/ + + + + +#include +#include + +UID2 KUidAppRegistrationResourceFile +UID3 0x100056CF // Screensaver UID + +RESOURCE APP_REGISTRATION_INFO + { + app_file = "screensaver"; + hidden = KAppIsHidden; + } diff -r aaeeca1f15af -r e8d784ac1a4b aif/screensaveraif.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aif/screensaveraif.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2009 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: Resource for screensaver +* +*/ + + + + +#include + +RESOURCE AIF_DATA + { + app_uid=0x100056CF; + hidden=KAppIsHidden; + } diff -r aaeeca1f15af -r e8d784ac1a4b animations/balloons.gif Binary file animations/balloons.gif has changed diff -r aaeeca1f15af -r e8d784ac1a4b animations/bird.swf Binary file animations/bird.swf has changed diff -r aaeeca1f15af -r e8d784ac1a4b animations/butterfly0.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/animations/butterfly0.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b animations/hypnose.swf Binary file animations/hypnose.swf has changed diff -r aaeeca1f15af -r e8d784ac1a4b conf/screensaver.confml Binary file conf/screensaver.confml has changed diff -r aaeeca1f15af -r e8d784ac1a4b conf/screensaver_101F8770.crml Binary file conf/screensaver_101F8770.crml has changed diff -r aaeeca1f15af -r e8d784ac1a4b group/ScreensaverConfig.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/group/ScreensaverConfig.hrh Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2009 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: +* configurations macros for screensaver +* +*/ + +#ifndef SCREENSAVERCONFIG_HRH +#define SCREENSAVERCONFIG_HRH + +// Enable logging +// #define LOGGING_ENABLED + +// Log layout rects +// #define LAYOUT_TRACING + +// Test content (faster activation, partial mode test line, +// some indicators on by default, layout area borders drawn) +// #define TEST_CONTENT + +// For devices with a twist display. This will cause Screensaver to +// stop slightly faster than with user activity created by the display +// position change +// NOTE that if screensaver is running on device default orientation (ie not +// forced), and there is an application that changes screen orientation, +// screensaver will commit suicide if it is activated on top of that +// application and this flag is defined. +#define FAST_STOP_ON_SCREENDEVICE_CHANGE + +// ONLY ONE OF THE POWERSAVE CONFIGURATIONS CAN BE ON AT A TIME +// +// Power save area should always be based on width of the bar, not height +// (for landscape displays with portrait power save) +// #define POWERSAVE_BASED_ON_WIDTH +// +// Power save area should be based on width of the bar, if display +// has been rotated (for rotatable displays with power save in original +// orientation only) +// #define POWERSAVE_BASED_ON_WIDTH_ROTATED + + +// DEFAULT ORIENTATION (not defined = device default) +// +// Always stay in portrait (overrides landscape if both defined) +// defining this attribute as lead HW for 3.2 supports screensaver only in portrait mode + #define ALWAYS_PORTRAIT +// +// Always stay in landscape +//#define ALWAYS_LANDSCAPE + +#endif // SCREENSAVERCONFIG_HRH diff -r aaeeca1f15af -r e8d784ac1a4b group/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/group/backup_registration.xml Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,5 @@ + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/group/bld.inf Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2009 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: +* Screensaver build information +* +*/ + +#include + +#ifndef TOOLS +// Plugins +// Not compiled on 3.0, also only if S60 browser is used (media plugins present) +#ifndef __SERIES60_30__ +#ifdef __SERIES60_NATIVE_BROWSER +#include "../scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/group/bld.inf" +#include "../scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/group/bld.inf" +#endif +#endif + +// Slideshow screensaver can be feature-variated +#ifdef __SLIDESHOW_SCREENSAVER +#include "../scrsaver/scrsaverplugins/SlideshowPlugin/group/bld.inf" +#endif + +// Screen saver AIW plugin for the time being a R&D feature only +#ifdef RD_SCREENSAVERAIWPLUGIN +#include "../scrsaver/screensaveraiwplugin/group/bld.inf" +#endif + +#endif // TOOLS + +PRJ_PLATFORMS +DEFAULT + + +PRJ_EXPORTS +// Backup +backup_registration.xml z:/private/100056CF/backup_registration.xml + +../rom/screensaver.iby CORE_MW_LAYER_IBY_EXPORT_PATH(screensaver.iby) + +// Generic configuration interface for component cenrep settings +../conf/screensaver.confml APP_LAYER_CONFML(screensaver.confml) +../conf/screensaver_101F8770.crml APP_LAYER_CRML(screensaver_101F8770.crml) + +PRJ_MMPFILES + +#ifndef TOOLS + +// Screensaver +screensaver.mmp + +#endif // TOOLS + +PRJ_TESTMMPFILES + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b group/screensaver.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/group/screensaver.mmp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,127 @@ +/* +* Copyright (c) 2009 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: +* Project definition file +* +*/ + + +#include +#include +#include +#include "ScreensaverConfig.hrh" + +TARGET screensaver.exe +TARGETTYPE exe +UID 0x100039CE 0x100056CF + +VENDORID VID_DEFAULT +CAPABILITY CAP_APPLICATION PowerMgmt + +#ifdef LOGGING_ENABLED +MACRO USE_LOGGER +#endif + +#ifdef ALWAYS_PORTRAIT +MACRO SS_ALWAYSPORTRAIT +#endif + +#ifdef ALWAYS_LANDSCAPE +MACRO SS_ALWAYSLANDSCAPE +#endif + +#ifdef FAST_STOP_ON_SCREENDEVICE_CHANGE +MACRO SS_FASTSTOPONSCREENDEVICECHANGE +#endif + +SOURCEPATH ../src + +SOURCE Screensaver.cpp +SOURCE screensaverview.cpp +SOURCE screensaverappui.cpp +SOURCE screensaverbase.cpp +SOURCE screensaverctrlnone.cpp +SOURCE screensaverctrlplugin.cpp +SOURCE screensaverctrlmovingtext.cpp +SOURCE screensavershareddatai.cpp +SOURCE screensaverutility.cpp +SOURCE screensaverindicator.cpp +SOURCE screensaverindicatorarray.cpp +SOURCE screensaverindicatoricon.cpp +SOURCE screensaverindicatornumberandicon.cpp +SOURCE screensaverindicatortext.cpp +SOURCE screensaversubscriber.cpp +SOURCE screensaverrepositorywatcher.cpp +SOURCE screensavershareddatamonitor.cpp +SOURCE screensaverengine.cpp +SOURCE screensaveractivitymanager.cpp + +START RESOURCE screensaver.rss +HEADER +TARGETPATH APP_RESOURCE_DIR +LANGUAGE_IDS +END // RESOURCE + + +START RESOURCE ../aif/screensaver_reg.rss +// DEPENDS screensaver.rsg +// Do not change the UID below. +TARGETPATH /private/10003a3f/apps +END + +USERINCLUDE ../inc + +// This is a SYSTEMINCLUDE macro containing the middleware +// layer specific include directories +APP_LAYER_SYSTEMINCLUDE + +SYSTEMINCLUDE /epoc32/include/ecom + +LIBRARY euser.lib +LIBRARY cone.lib +LIBRARY eikcore.lib +LIBRARY avkon.lib +LIBRARY apparc.lib +LIBRARY apgrfx.lib +LIBRARY ws32.lib +LIBRARY CommonEngine.lib +LIBRARY aknlayout.lib +LIBRARY AknLayout2Scalable.lib +LIBRARY fbscli.lib +LIBRARY egul.lib +LIBRARY msgs.lib +LIBRARY bafl.lib +LIBRARY power_save_display_mode.lib +LIBRARY gdi.lib +LIBRARY profileeng.lib +LIBRARY hal.lib +LIBRARY aknskins.lib +LIBRARY featmgr.lib // Feature Manager API +LIBRARY aknicon.lib +LIBRARY aknpictograph.lib +LIBRARY ecom.lib +LIBRARY centralrepository.lib +LIBRARY cenrepnotifhandler.lib +LIBRARY efsrv.lib +LIBRARY flogger.lib +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 +LIBRARY gfxtrans.lib +LIBRARY akntransitionutils.lib +LIBRARY akncapserverclient.lib +#endif + +EPOCHEAPSIZE 0x5000 0x2000000 + +// End of file. + diff -r aaeeca1f15af -r e8d784ac1a4b inc/ScreensaverUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/ScreensaverUtils.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2003 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: Screensaver utilities collection +* +*/ + + +#ifndef C_SCREENSAVERUTILS_H +#define C_SCREENSAVERUTILS_H + +// ========== LOGGING MACROS =============================== + +#ifdef USE_LOGGER + +#include +#include +#include +#include + + +/* logging macros usage: + +// set logging on in mmp file... +MACRO USE_LOGGER +#ifdef WINS +MACRO USE_RDEBUG +#endif + + +void CTestAppUi::ConstructL() +{ +// creates log directory and log file on app startup. +// prints starting banner... +SCRLOGGER_CREATE; + +// entering to function... +SCRLOGGER_ENTERFN("ConstructL()"); + +TInt number = 42; +TFileName file; +file = "something" .... + +// print variable number of parameters... +// Note: use _L macro for format string! +SCRLOGGER_WRITEF(_L("SCR: number = %d, file = %S"), number, &file); + +// print just a string (no _L macro here!) +SCRLOGGER_WRITE("Hello world!"); + +// leave from function... +SCRLOGGER_LEAVEFN("ConstructL()"); +} + +CTestAppUi::~CTestAppUi() +{ +// print app exit banner when application exits. +SCRLOGGER_DELETE; +} + +*/ + +#ifdef USE_RDEBUG + +_LIT(KSCRLogBanner, "Screensaver log start"); +_LIT(KSCRLogEnterFn, "SCR: enter --> %S"); +_LIT(KSCRLogLeaveFn, "SCR: leave <-- %S"); +_LIT(KSCRLogWrite, "SCR: %S"); +_LIT(KSCRLogTag, "SCR: "); +_LIT(KSCRLogExit, "Screensaver log end"); +_LIT(KSCRLogTimeFormatString, "%H:%T:%S:%*C2"); + +#define SCRLOGGER_CREATE {RDebug::Print(KSCRLogBanner);} +#define SCRLOGGER_DELETE {RDebug::Print(KSCRLogExit);} +#define SCRLOGGER_ENTERFN(a) {_LIT(temp, a); RDebug::Print(KSCRLogEnterFn, &temp);} +#define SCRLOGGER_LEAVEFN(a) {_LIT(temp, a); RDebug::Print(KSCRLogLeaveFn, &temp);} +#define SCRLOGGER_WRITE(a) {_LIT(temp, a); RDebug::Print(KSCRLogWrite, &temp);} +#define SCRLOGGER_WRITE_TIMESTAMP(a) {_LIT(temp, a); TTime time; time.HomeTime(); TBuf<256> buffer; time.FormatL(buffer, KSCRLogTimeFormatString); buffer.Insert(0, temp); buffer.Insert(0, KSCRLogTag); RDebug::Print(buffer); } +#define SCRLOGGER_WRITEF RDebug::Print + +#else + +_LIT(KSCRLogDir, "SCR"); +_LIT(KSCRLogFile, "SCR.txt"); +_LIT8(KSCRLogBanner, "Screensaver log start"); +_LIT8(KSCRLogEnterFn, "SCR: -> %S"); +_LIT8(KSCRLogLeaveFn, "SCR: <- %S"); +_LIT8(KSCRLogExit, "Screensaver log end"); +_LIT(KSCRLogTimeFormatString, "%H:%T:%S:%*C2"); + +#define SCRLOGGER_CREATE {FCreate();} +#define SCRLOGGER_DELETE {RFileLogger::Write(KSCRLogDir, KSCRLogFile, EFileLoggingModeAppend, KSCRLogExit);} +#define SCRLOGGER_ENTERFN(a) {_LIT8(temp, a); RFileLogger::WriteFormat(KSCRLogDir, KSCRLogFile, EFileLoggingModeAppend, KSCRLogEnterFn, &temp);} +#define SCRLOGGER_LEAVEFN(a) {_LIT8(temp, a); RFileLogger::WriteFormat(KSCRLogDir, KSCRLogFile, EFileLoggingModeAppend, KSCRLogLeaveFn, &temp);} +#define SCRLOGGER_WRITE(a) {_LIT(temp, a); RFileLogger::Write(KSCRLogDir, KSCRLogFile, EFileLoggingModeAppend, temp);} +#define SCRLOGGER_WRITE_TIMESTAMP(a) {_LIT(temp, a); TTime time; time.HomeTime(); TBuf<256> buffer; time.FormatL(buffer, KSCRLogTimeFormatString); buffer.Insert(0, temp); RFileLogger::Write(KSCRLogDir, KSCRLogFile, EFileLoggingModeAppend, buffer); } +#define SCRLOGGER_WRITEF FPrint + +inline void FPrint(const TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + RFileLogger::WriteFormat(KSCRLogDir, KSCRLogFile, EFileLoggingModeAppend, aFmt, list); + } + +inline void FPrint(const TDesC& aDes) + { + RFileLogger::WriteFormat(KSCRLogDir, KSCRLogFile, EFileLoggingModeAppend, aDes); + } + +inline void FHex(const TUint8* aPtr, TInt aLen) + { + RFileLogger::HexDump(KSCRLogDir, KSCRLogFile, EFileLoggingModeAppend, 0, 0, aPtr, aLen); + } + +inline void FHex(const TDesC8& aDes) + { + FHex(aDes.Ptr(), aDes.Length()); + } + +inline void FCreate() + { + TFileName path(_L("c:\\logs\\")); + path.Append(KSCRLogDir); + path.Append(_L("\\")); + RFs& fs = CEikonEnv::Static()->FsSession(); + fs.MkDirAll(path); + RFileLogger::WriteFormat(KSCRLogDir, KSCRLogFile, EFileLoggingModeOverwrite, KSCRLogBanner); + } + +#endif // USE_RDEBUG + +#else // USE_LOGGER + +inline void FPrint(const TRefByValue /*aFmt*/, ...) { }; + +#define SCRLOGGER_CREATE +#define SCRLOGGER_DELETE +#define SCRLOGGER_ENTERFN(a) +#define SCRLOGGER_LEAVEFN(a) +#define SCRLOGGER_WRITE(a) +#define SCRLOGGER_WRITEF 1 ? ((void)0) : FPrint +#define SCRLOGGER_WRITE_TIMESTAMP(a) + +#endif // USE_LOGGER + +#endif // C_SCREENSAVERUTILS_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaver.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2003 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: Main header file for screensaver application. +* +*/ + + + + +#ifndef C_SCREENSAVER_H +#define C_SCREENSAVER_H + +#include + +//For turning display off +#include + +#include + +#include +#include +#include + +// +// class CScreensaverEikDocument +// +class CScreensaverDocument : public CAknDocument + { +public: + /** + * ConstructL + * 2nd phase constructor. + * Perform the second phase construction of a + * CScreensaverDocument object. + */ + void ConstructL(); + /** + * CScreensaverDocument. + * C++ default constructor. + */ + CScreensaverDocument(CEikApplication& aApp); + + /** + * ~CScreensaverDocument + * Destructor. + */ + ~CScreensaverDocument(); +private: + // from CEikDocument + CEikAppUi* CreateAppUiL(); + }; + +// +// CScreensaverApplication +// + +class CScreensaverApplication : public CAknApplication +{ +private: + // from CApaApplication + /** + * From CApaApplication, CreateDocumentL. + * Creates CScreensaverDocument document object. The returned + * pointer in not owned by the CScreensaverApplication object. + * @return A pointer to the created document object. + */ + CApaDocument* CreateDocumentL(); + /** + * From CApaApplication, AppDllUid. + * @return Application's UID (KUidScreensaverApp). + */ + TUid AppDllUid() const; + }; + +#endif // C_SCREENSAVER_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaver.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaver.hrh Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,103 @@ +/* +* Copyright (c) 2003 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: The enumeration for screensaver +* +*/ + + + + + + +#ifndef SCREENSAVER_HRH +#define SCREENSAVER_HRH + +#include + +// +// Screensaver indicator id's. +// +enum TScreensaverIndicatorId + { + ESsNewMessagesInd, + ESsMissedCallsInd, + ESsKeyLockInd, + ESsProfileInd, + ESsImInd, // Instant message (chat) + ESsMailInd, // New email + ESsVoicemailInd, // New voice mail + ESsAmPmInd // AM / PM indicator + }; + +// +// Indicator types. +// +enum TScreensaverIndicatorType + { + ESsNumericIndicator, + ESsIconIndicator, + ESsTextIndicator, + ESsNumberAndIconIndicator + }; + +// +// Indicator aligments. +// +enum TScreensaverAlignment + { + ESsAlignLeft, + ESsAlignRight + }; + + +// +// Indicator drawing priorities. +// +enum TScreensaverDrawType + { + ESsDrawTypeNotDrawn, + ESsDrawTypeSecondary, + ESsDrawTypePrimary + }; + + +// +// Default screensaver bar color modes. +// +enum TScreensaverBarColorModel + { + ESsColorModel3BitMode, + ESsColorModelHighColor + }; + +// +// Factory for display objects +// +enum TDisplayObjectType + { + EDisplayText = 0, + EDisplayTime, + EDisplayBitmap, + EDisplayPlugin, + EDisplayNone + }; + +enum TDisplayState + { + EDisplayOff = 0, + EDisplayOn + }; +#endif //SCREENSAVER_HRH + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaveractivitymanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaveractivitymanager.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,60 @@ +// Copyright (c) 2007-2009 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: +// CScreensaverActivityManager class +// +// + +#ifndef SCREENSAVERACTIVITYMANAGER_H +#define SCREENSAVERACTIVITYMANAGER_H + +#include + + +class CScreensaverActivityManager : public CTimer + { +public: + static CScreensaverActivityManager* NewL(TInt aPriority); + ~CScreensaverActivityManager(); + void Start(TTimeIntervalSeconds aInterval, + TCallBack aInactiveCallback, + TCallBack aActiveCallback); + void SetInactivityTimeout(TTimeIntervalSeconds aInterval); + TBool IsMonitoringForActivity(); +private: + void RunL(); + CScreensaverActivityManager(TInt aPriority); + void MonitorInactivity(); +private: + + enum TState { + EStUndefined = 0, //< Never used, reserved + EStNotActive, //< Constructed but not started + EStMonForInactivity, //< Monitoring user inactivity mode + EStMonForActivity //< Monitoring user activity mode + }; + + /** Inactivity interval */ + TTimeIntervalSeconds iInterval; + + /** Callback to be used in case that user inactivity is detected */ + TCallBack iInactiveCallback; + + /** Callback to be used in case of user activity after inactivity period */ + TCallBack iActiveCallback; + + /** State of object, what form of monitoring is active. */ + TState iState; + }; + +#endif // SCREENSAVERACTIVITYMANAGER_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverappui.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverappui.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2009 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: The define of appui for screensaver +* +*/ + + + + +#ifndef C_SCREENSAVERAPPUI_H +#define C_SCREENSAVERAPPUI_H + +#include +#include + +#include "screensaverview.h" + + +class CScreensaverEngine; + +// UID of Screensaver application +const TUid KUidScreensaverApp = { 0x100056CF }; + +/** + * 'AppUi' class. + */ +class CScreensaverAppUi : public CAknViewAppUi + { +public: + /** + * ConstructL. + * 2nd phase constructor. + */ + void ConstructL(); + + /** + * ~CScreensaverAppUi. + * Destructor. + */ + ~CScreensaverAppUi(); + + /** + * Returns the pointer to screensaver model which is owned by AppUi + * @return Screensaver Model + */ + CScreensaverEngine& Model() const; + + /** + * From CEikAppUi. + * Takes care of command handling. + * @param aCommand command to be handled + */ + void HandleCommandL(TInt aCommand); + + /** + * Returns the pointer to CScreensaverView which is derived from AknView + * @return CScreensaverView + */ + CScreensaverView* ScreensaverView(); + +private: + + /** + * Creates the CScreensaverView object and the Display object + */ + void CreateViewL(); + + /** + * From CEikAppUi. + * Key event handler. + */ + TKeyResponse HandleKeyEventL(const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/); + + /** + * From @c CCoeAppUiBase. + * Calls CAknViewAppUi::HandleScreenDeviceChangedL(). + */ + void HandleScreenDeviceChangedL(); + + /** + * From AknAppUi. Handles pointer-initiated view switch. Currently this + * function does nothing but calls base class function. + * @since Series 60 3.0 + * @param aEvent Window server event. + * @param aDestination Pointer to the control which the event is targeted to. + */ + void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination); + +private: + + /** + * Screensaver Model. + * Owned. + */ + CScreensaverEngine* iModel; + + /** + * Screensaver view + * + * Owned + */ + CScreensaverView* iView; + }; + +#endif // C_SCREENSAVERAPPUI_H + diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverbase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverbase.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,219 @@ +/* +* Copyright (c) 2009 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: Definitions for base class of display object +* +*/ + + + +#ifndef C_SCREENSAVERBASE_H +#define C_SCREENSAVERBASE_H + +#include +#include +#include + +#include "screensaverplugin.h" +#include "screensaver.hrh" +#include "screensaverengine.h" +#include "screensaverindicator.h" +#include "screensaverindicatorarray.h" + + +/** + * The base class of all the different display object + */ +class CScreensaverBase : public CCoeControl, public MCoeControlContext, + public MAknPictographAnimatorCallBack + { +public: + /** + * Default c++ constructor + */ + CScreensaverBase(); + + /** + * Destructor + */ + virtual ~CScreensaverBase(); + + /** + * Show the control and start the refresh timer + */ + virtual void StartDrawObject(); + + /** + * Stop display the control and cancel the timers + */ + virtual void StopDrawObject(); + + /** + * Start the control needed timer + */ + virtual void StartTimer() = 0; + + /** + * Cancels the timer + */ + virtual void CancelTimer() = 0; + + /** + * Show the control + */ + virtual void DrawObject(); + + /** + * Clear the screen + */ + virtual void ClearScreen() = 0; + + /* + * Refresh the display + */ + virtual void Refresh() = 0; + + /** + * Get the screensaver view + */ + CScreensaverView* View() const; + + /** + * Returns the Screensaver Model which is owned by AppUi + * + * @return CScreensaverModel + */ + const CScreensaverEngine& Model() const; + + /** + * Returns the Indicator Array which is owned by Screensaver Model + * + * @return CScreensaverIndicatorArray + */ + CScreensaverIndicatorArray& Array() const; +public: + //From CCoeControl + + /** + * Resource change handling + */ + virtual void HandleResourceChange( TInt aType ) = 0; + + /** + * Responds to changes to the size and position of the contents + * of this control. + */ + virtual void SizeChanged() = 0; + + // Power save mode related functions + + /** + * Used to define the active area of display in power save mode + * + * @param aRect + */ + TInt SetPowerSaveDisplayActiveArea( TRect& aRect ); + + /** + * Activates power save display mode + * + * @param aFullColors + */ + TInt ActivatePowerSaveDisplay( TBool aFullColors = EFalse ) const; + +public: + // From MAknPictograpAnimatorCallback + /** + * This function is called when a redraw is needed for drawing + * new frames of animated pictographs. It should + * + * 1) Draw or clear the background of pictographs + * 2) If the pictographs are amongst text, draw the text + * 3) Draw the pictographs using MAknPictographDrawer interface + * + * In many cases, it is sufficient to implement this simply by + * calling CCoeControl::DrawNow for the appropriate control. + */ + virtual void DrawPictographArea(); + +protected: + + /** + * Start capturing timer + */ + void StartCaptureScreenTimer(); + + /** + * Initial the initial refresh rate + */ + TInt InitialRefreshRate(); + + /** + * Kill the timer + * + * @param aTimer the timer you want stop + */ + void DeleteTimer( CPeriodic*& aTimer ); + + /** + * for Lcd Partial mode. + */ + void ConstructAndConnectLCDL(); + + /** + * Returns the powersave display mode + */ + CPowerSaveDisplayMode* LcdPartialMode() const; + + /** + * If the timer expired, excute the refresh action + */ + static TInt HandleRefreshTimerExpiry( TAny* aPtr ); + + /** + * Callback fuction. Called when the window server heartbeat tiemr time out + */ + static TInt HandleCaptureTimerExpiry( TAny* aPtr ); + + /** + * Capture screen, and get the first pixel address of the bitmap + */ + TInt CaptureScreen(); + +protected: + + // Area of screen that is displayed when in power save mode + TRect iPowerSaveDisplayActiveArea; + + /** + * The capturing screen timer + */ + CPeriodic* iCaptureScreenTimer; + + + /** + * The pointer to the powersaver display mode + * + * Owned + */ + CPowerSaveDisplayMode* iPowerSaveDisplayMode; + + /** + * store the bitmap data + */ + CFbsBitmap* iOffScrnBmp; + + }; + +#endif // C_SCREENSAVERBASE_H + diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverctrlmovingtext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverctrlmovingtext.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,261 @@ +/* +* Copyright (c) 2003 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: Definitions screensaver moving text display class. +* +*/ + +#ifdef USE_DATE_AND_TEXT + +#ifndef C_SCREENSAVERCTRLMOVINGTEXT_H +#define C_SCREENSAVERCTRLMOVINGTEXT_H + +#include + +#include "screensaverbase.h" + +const TInt KScreensaverDataReconnectingDelay = 50000; +const TInt KScreensaverBarHeight = 24; + +// +// class CScreensaverCtrlMovingText +// +class CScreensaverCtrlMovingText : public CScreensaverBase + { +public: + /** + * Two-phased constructor + * + * @param aType the type of display object + * @return CScreensaverCtrlMovingText the pointer of CScreensaverCtrlMovingText + * object + */ + static CScreensaverCtrlMovingText* NewL( TDisplayObjectType aType ); + + /** + * Destructor. + */ + ~CScreensaverCtrlMovingText(); + +public: + // From CCoeControl + + /** + * Resource change handling + */ + virtual void HandleResourceChange( TInt aType ); + + + /** + * Responds to changes to the size and position of the contents + * of this control. + */ + virtual void SizeChanged(); + + /** + * Drawing (override this to draw) + */ + virtual void Draw( const TRect& aRect ) const; + +public: + // Implemented here instead of shareddatainterface + + /** + * Set moving bar on / off + * + * @param aMove a bool type to decide if it can move or not + */ + void SetMoving( TBool aMove = ETrue ); + + /** + * Start the control needed timer + */ + void StartTimer(); + + /** + * Cancels the timer + */ + void CancelTimer(); + + /** + * Clear the screen + */ + void ClearScreen(); + + /* + * Refresh the display + */ + void Refresh(); + +protected: + + /** + * Constructor + * + * @param aType the type of the display object. + */ + CScreensaverCtrlMovingText( TDisplayObjectType aType ); + + /** + * Two-phased constructor + */ + void ConstructL(); + + /** + * Draw the object on the screen of this type + * + * @param aGc the CWindowGc object + * @param aRect + */ + virtual void DrawNew( CWindowGc& aGc, const TRect& aRect ) const; + + /** + * Draw the date on the bar + */ + virtual void DrawText( CWindowGc& aGc ) const; + + /** + * Draws text with pictographs + */ + void DrawPictoText( CWindowGc &aGc ) const; + + /** + * Get the current time + */ + void UpdateCurrentTimeL(); + + /** + * Generate the screensaver bar + */ + void GenerateDisplayAttributesForScreensaverBar(); + +private: + /** + * Get the random top value + * + * @return TInt the random value + */ + void GetRandomTopValue( TInt aBarHight ); + + /** + * Get the random seed + */ + TInt RandomSeed(); + + /** + * Get the text and background color + */ + void GetTextAndBgColor(); + + /** + * Format the display text + */ + void FormatTextL( TDes& aText, const TDesC& aFormat ); + + /** + * Set AmPm text payload to indicator + */ + void SetAmPmIndicatorPayloadL(); + + /** + * Format the data and time text + */ + void FormatTextFromResourceL( TDes &aDes, TInt aResourceId ); + + /** + * Get the clock area and text layout + */ + void GetClockLayout( const TRect& aRect ); + + /** + * Get the date area and text layout + */ + void GetDateLayout( const TRect& aRect ); + + /** + * Get the indicator area and text layout + */ + void GetIndicatorAreaLayout( const TRect& aRect ); + + /** + * Start the indicator bar refresh timer + */ + void StartBarRefreshTimer(); + + +protected://data + + /** + * The layout date and text + */ + TAknLayoutText iLayoutDateText; +private://data + /** + * The top position of the bar + */ + TInt iTop; + + /** + * The random seed to get the random value + */ + TInt64 iRandSeed; + + // For new layout + /** + * The time string that will be displayed on the bar + */ + TBuf<15> iTextTime; + + /** + * The date string that will be displayed on the bar + * or he text will be display the on the bar + */ + TBuf<25> iText; + + /** + * The type of the display text + */ + TDisplayObjectType iType; + + //Lay out + TAknLayoutRect iLayoutBar; + TAknLayoutRect iLayoutClock; + TAknLayoutRect iLayoutDate; // missing + TAknLayoutText iLayoutClockText; + TAknLayoutText iLayoutAmPmText; + + // Moving bar on / off + TBool iMoveBar; + + /** + * The color for background and text + */ + TInt iBgColor; + TInt iTextColor; + TInt iTextBgColor; + + /** + * The indicator bar refresh timer + */ + CPeriodic* iBarRefreshTimer; + + /** + * Pictograph drawing interface + */ + CAknPictographInterface* iPictoI; + }; + +#endif // C_SCREENSAVERCTRLMOVINGTEXT_H + +#endif // USE_DATE_AND_TEXT +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverctrlnone.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverctrlnone.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,113 @@ +/* +* Copyright (c) 2009 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: Definitions for the display object of none type +* +*/ + + + +#ifndef C_SCREENSAVERCTRLNONE_H +#define C_SCREENSAVERCTRLNONE_H + +#include "screensaverbase.h" + +/** + * The none type of the display object to cut off the screen light + */ +class CScreensaverCtrlNone : public CScreensaverBase + { +public: + /** + * The symbian c++ constructor + */ + static CScreensaverCtrlNone* NewL(); + + + /** + * destructor + */ + ~CScreensaverCtrlNone(); + + /** + * Start the control needed timer + */ + void StartTimer(); + + /** + * Cancels the timer + */ + void CancelTimer(); + + /** + * Show the control + */ + void DrawObject(); + + /** + * Clear the screen + */ + void ClearScreen(); + + /* + * Refresh the display + */ + void Refresh(); + +public: + // From CCoeControl + + /** + * Resource change handling + */ + void HandleResourceChange( TInt aType ); + + /** + * Responds to changes to the size and position of the contents + * of this control. + */ + void SizeChanged(); + + /** + * Draw + * @see CCoeControl::Draw(const TRect& aRect) + */ + void Draw( const TRect& aRect ) const; + +private: + + /** + *The Default C++ constructor + */ + CScreensaverCtrlNone(); + + /** + * The two-phased constructor + */ + void ConstructL(); + + /** + * Switch off light in aSecs + * + * @param aSecs after this seconds, screen will switch light + */ + void SwitchLights( TInt aSecs ); + + /** + * Switch on/off the screen + */ + void SwitchDisplayState( TInt aState ); + + }; + +#endif // C_SCREENSAVERCTRLNONE_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverctrlplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverctrlplugin.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,218 @@ +/* +* Copyright (c) 2009 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: Definitions for the display object of plugin type +* +*/ + + + +#ifndef C_SCREENSAVERCTRLPLUGIN_H +#define C_SCREENSAVERCTRLPLUGIN_H + +#include + +#include "screensaverbase.h" + +/** + * The plugin type of display object which is derived from the + * CScreensaverBase class + */ +class CScreensaverCtrlPlugin : public CScreensaverBase, + public MScreensaverPluginHost + { +public: + enum TScreensaverPluginFlag + { + // Indicates that plugin module wants to draw indicators + EPluginFlagOverrideIndicators = 0, + // Indicates that plugin does not use refresh timer and should not get + // Draw() calls + EPluginFlagTimerNotUsed, + EPluginFlagSuspend + }; +public: + /** + * Two-phased constructor. + */ + static CScreensaverCtrlPlugin* NewL(); + + /** + * Destructor + */ + ~CScreensaverCtrlPlugin(); + + /** + * Start the control needed timer + */ + void StartTimer(); + + /** + * Cancels the timer + */ + void CancelTimer(); + + + /** + * Show the control + */ + void DrawObject(); + + /** + * Clear the screen + */ + void ClearScreen(); + + /* + * Refresh the display + */ + void Refresh(); + + /** + * Send the event to plugin to deal with + * + * @param aEvent the event send to plugin + * @return TInt + */ + TInt SendPluginEvent( TScreensaverEvent aEvent ); + + /** + * Returns the implemenataion UID of the plugin + * + * @return TUid Implementation UID + */ + TUid PluginImplementationUid() const; + +public: + // From MScreensaverPluginHost + void UseStandardIndicators(); + void OverrideStandardIndicators(); + TBool StandardIndicatorsUsed() const; + void SetRefreshTimerValue( TInt aValue ); + TInt RefreshTimerValue() const; + TInt GetIndicatorPayload( TScreensaverIndicatorIndex aIndex, + TIndicatorPayload& aResult ) const; + TInt SetActiveDisplayArea( TRect& aRect, + const TScreensaverPartialMode& aMode ); + TInt SetActiveDisplayArea( TInt aStartRow, TInt aEndRow, + const TScreensaverPartialMode& aMode ); + void ExitPartialMode(); + const TScreensaverColorModel& GetColorModel() const; + void Suspend( TInt aTime ); + void RequestLights( TInt aSecs ); + TInt DisplayInfo( TScreensaverDisplayInfo* aDisplayInfo ); + void UseRefreshTimer( TBool aOn = ETrue ); + void RequestTimeout( TInt aSecs ); + void RevertToDefaultSaver(); + // End MScreensaverPluginHost + +protected: + /** + * The default C++ constuctor + * + * @param aType the type of the display object. + * @param aPlugin the plugin which the screensaver is setted. + */ + CScreensaverCtrlPlugin(); + + /** + * Symbian default constructor. + */ + void ConstructL(); + +protected: + // From CCoeControl + + /** + * Resource change handling + */ + virtual void HandleResourceChange( TInt aType ); + + /** + * Responds to changes to the size and position of the contents + * of this control. + */ + virtual void SizeChanged(); + + /** + * Drawing (override this to draw) + */ + virtual void Draw( const TRect& aRect ) const; + +private: + /* + * LoadPluginL() + */ + void LoadPluginL( MScreensaverPluginHost* aPluginHost ); + + /* + * Get the poiter of the plugin + */ + void LoadPluginModuleL(); + + /* + * Delete the plugin + */ + void DeletePlugin(); + + /** + * Starts the plugin refresh timer + */ + void StartPluginRefreshTimer(); + + /** + * Starts the plugin time out timer + */ + void StartPluginTimeoutTimer( TInt aSecs ); + + + /** + * Callback fuction. Called when the Plugin tiemr time out + */ + static TInt HandlePluginTimeoutTimerExpiry( TAny* aPtr ); + + +private://data + /** + * Plugin interface. + */ + MScreensaverPlugin* iPlugin; + + /** + * The plugin refresh timer + */ + CPeriodic* iPluginRefreshTimer; + + /** + * The plugin timeout timer + */ + CPeriodic* iPluginTimeoutTimer; + + + /** + * The plugin flag + */ + mutable TBitFlagsT iPluginFlag; + + /** + * The refresh rate of plugin + */ + TInt iPluginRefreshRate; + + /** + * The implementation UID of the plugin + */ + TUid iPluginImplUid; + + }; +#endif // C_SCREENSAVERCTRLPLUGIN_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverengine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverengine.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,351 @@ +/* +* Copyright (c) 2003 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: Screensaver engine class definition. +* +*/ + + + +#ifndef C_SCREENSAVERENGINE_H +#define C_SCREENSAVERENGINE_H + +#include +#include + +#include "screensaverindicator.h" +#include "screensaverindicatorarray.h" +#include "screensaverplugin.h" + +//delay before wserv timer is turned off +#define KWSERVHEARTBEATTIMEOUT 15 + +// Delay after screensaver is stopped and hided. +const TInt KDefaultScreenSaverTimeout = 2 * 60 * 1000000; // 2 mins + +// FORWARD DECLARATIONS +class CUserActivityManager; +class CScreensaverSharedDataI; +class CScreensaverSharedDataMonitor; +class CScreensaverAppUi; +class CScreensaverView; +class CScreensaverActivityManager; +class CPowerSaveDisplayMode; + +/** +* CScreensaverModel +*/ +class CScreensaverEngine : public CBase + { +public: + + /** + * Two-phased constructor + * + * @param aAppUi the AppUi of the application + */ + static CScreensaverEngine* NewL(); + + /** + * Destructor + */ + ~CScreensaverEngine(); + + /** + * Return the pointer to the CScreensaverSharedDataI + * + * @return CScreensaverSharedDataI* + */ + CScreensaverSharedDataI* SharedDataInterface() const; + + /** + * Reset the time during which the user did not do anything + */ + void ResetInactivityTimeout(); + + /** + * Returns if the screensaver is on or not + */ + TBool ScreenSaverIsOn() const; + + /** + * Returns if the screensaver is previewing or not + */ + TBool ScreenSaverIsPreviewing() const; + + /** + * Starts screensaver + */ + void StartScreenSaver(); + + /** + * Stops the screensaver + */ + void StopScreenSaver(); + + /** + * Starts the preview model + */ + void StartPreviewModeL(); + + /* + * Display the Object(); + */ + void DisplayObject(); + + /** + * Start the suspend timer + */ + void StartSuspendTimer( TInt aSec ); + + /** + * Returns the indicator array + */ + CScreensaverIndicatorArray& IndicatorArray() const; + + /** + * Returns the color model + */ + const TScreensaverColorModel& GetColorModel( ) const; + + /** + * Adds the partial model + * + * @param aBpp the bits per pixels of the partial model + * @param aType the type of the partial type + */ + void AddPartialModeLevel( TInt aBpp, TScreensaverPartialModeType aType ); + + /** + * Updates the indicator attributes. + */ + void UpdateIndicatorAttributes( ); + + /* + * Start screensaver expiry timer. When the timer expires the screensaver + * will be stopped and hided. + * + * @param aTimeout Timeout after the screensaver stops and hides itself in + * microseconds. 0 or negative value will disable the timer. + */ + void SetExpiryTimerTimeout( TInt aTimeout ); + + /** + * Informs the engine about changes in keyguard state + * @param aEnabled whether the keyguard is now on or off + */ + void HandleKeyguardStateChanged( TBool aEnabled ); + +private: + + /** + * C++ default constructor + * + * @param aAppUi the AppUi of the application + */ + CScreensaverEngine(); + +private: + + /** + * Two-phased constructor + */ + void ConstructL(); + + /** + * Constructs the shared data member + */ + void EnableSharedDataAndMonitorL(); + + /** + * Destruct the shared data member + */ + void DisableSharedDataAndMonitor(); + + /** + * Starts to monitor the user activity + */ + void StartActivityMonitoringL(); + + /** + * Stops monitoring the user activity + */ + void StopActivityMonitoring( CScreensaverActivityManager*& aActivityManager ); + + /** + * Gets the color model from the resource + */ + void SetupColorModelL(); + + /** + * Start the preview timer + */ + void StartPreviewTimer(); + + /** + * Starts pause timer + */ + void StartPauseTimer(); + + /** + * Kill the timer + * + * @param aTimer the timer you want stop + */ + void KillTimer( CPeriodic*& aTimer ); + + + /** + * Callback fuction. Called when the preivew tiemr time out + */ + static TInt HandlePreviewTimerExpiry( TAny* aPtr ); + + /** + * Called when the time that the user did activity is out. + */ + static TInt HandleActiveEventL(TAny* aPtr); + + /** + * Called when the time that the user did no activity is out. + */ + static TInt HandleInactiveEventL(TAny* aPtr); + + /** + * Callback fuction. Called when the suspension tiemr time out + */ + static TInt HandleSuspendTimerExpiry( TAny* aPtr ); + + /** + * Callback function. Called when the pause timer expires + */ + static TInt HandlePauseTimerExpiry( TAny* aPtr ); + + /** + * Returns the CScreensaverView + */ + CScreensaverView* View() const; + + /** + * Returns the timeout. + */ + TInt Timeout(); + + /** + * Returns the display flag. + */ + TInt DisplayFlag(); + + /** + * Callback fuction. Called when the screensaver expiry timer time out. + */ + static TInt HandleExpiryTimerExpiry( TAny* aPtr ); + + /** + * Callback to do the screensaver starting. + */ + static TInt StartSaverCb( TAny* aPtr ); + +private: + + /** + * The flag if append alert type indicator + */ + TBool iShowExtendedProfileInd; + + /** + * The flag if the screensaver is on or not + */ + TBool iScreenSaverIsOn; + + /** + * The flag if the screensaver is previewing or not + */ + TBool iScreenSaverIsPreviewing; + + /** + * The trigger for screensaver activation + */ + CScreensaverActivityManager* iActivityManagerScreensaver; + + + /** + * The pointer to CScreensaverSharedDataI + * + * Owned + */ + CScreensaverSharedDataI* iSharedDataI; + + /* + * The pointer to the CScreensaverSharedDataMonitor + */ + CScreensaverSharedDataMonitor* iSharedDataMonitor; + + /** + * The pointer to the indicator array + * + * Owned + */ + CScreensaverIndicatorArray* iIndicatorArray; + + /** + * moved from view class + */ + TScreensaverColorModel iColorModel; + + + /** + * The preview timer + */ + CPeriodic* iPreviewTimer; + + /** + * The suspend timer + */ + CPeriodic* iSuspendTimer; + + /** + * used to intercept and capture application key event. + */ + RAknUiServer iAknUiServer; + + /** + * The screensaver expiry timer. Screensaver will be stoped when this timer + * expires. + * + * Owned. + */ + CPeriodic* iExpiryTimer; + + /** + * Pause timer. Used to reactivate screensaver after 5s when being + * interrupted and keys are locked + */ + CPeriodic* iPauseTimer; + + /** + * Set if the pause timer was started when preview was stopped + */ + TBool iPauseTimerStartedAfterPreview; + + /** + * Asynchronous callback to start screensaver. + */ + CAsyncCallBack iAsyncCb; + + }; + + + +#endif // C_SCREENSAVERENGINE_H + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverindicator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverindicator.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,270 @@ +/* +* Copyright (c) 2003 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: Definitions for screensaver indicator array. +* +*/ + + + +#ifndef C_SCREENSAVERINDICATOR_H +#define C_SCREENSAVERINDICATOR_H + +//#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "screensaver.hrh" + + +/* +* Base class for all indicators. +*/ +class CScreensaverIndicator : public CBase + { +public: + + /** + * Destructor + */ + virtual ~CScreensaverIndicator(); + + /** + * Draw the indicator. it should be implemented by the derived class + */ + virtual void Draw(CWindowGc& aGc) const = 0; + + /** + * two-phased constructor + * + * @param aReader the resource read of the STRUCT + * SCREENSAVER_PARAMETERS_ARRAY defined by ourself + * STRUCT SCREENSAVER_PARAMETERS_ARRAY + * { + * WORD KIndicatorMargin; + * WORD KIndicatorGap; + * WORD KIndicatorTopMargin; + * WORD KIndicatorTextLevel; + * LONG KBackGroundColor; + * WORD KHeight; + * } + * @param aBgColor the background color of display screen + * @param aTextColor the text color + */ + virtual void ConstructL(TResourceReader &aReader, TUint32 aBgColor, TUint aTextColor); + + /** + * Set the parameters of drawing + * + * @param aCorner the position of the lefttop of the indicator + * @param aParentRect + */ + virtual void SetupDrawingParameters(const TPoint& aCorner, const TRect& aParentRect) = 0; + + /** + * Check if indicator is visible or not + * + * @return TBool + */ + virtual TBool CheckVisibilityConditions() const = 0; + + /** + * Get the payload through the property + * + * @param aPayload the reference to the payload + */ + virtual void Payload(TIndicatorPayload& aPayload) const = 0; + + /** + * Set the property through the payload + * + * @param aPayload + */ + virtual void SetPayload(const TIndicatorPayload& aPayload) = 0; + + /** + * Set the Id by the parameter + * + * @param aId the Id value + */ + void SetId(TScreensaverIndicatorId aId); + + /** + * Check if visible or not + * + * @return TBool if visible return ETrue, or EFalse. + */ + virtual TBool Visible() const; + + /** + * Set the visibility + * + * @param aValue + */ + void SetVisibility(TBool aValue); + + /** + * Returns the indicator width + * + * @return TInt + */ + TInt Width() const; + + /** + * Returns the indicator Id + * + * @return TScreensaverIndicatorId + */ + TScreensaverIndicatorId Id() const; + + /** + * Returns the indicator alighment + * enum TScreensaverAlignment + * { + * ESsAlignLeft, + * ESsAlignRight + * }; + * + * @return TScreensaverAlignment + */ + TScreensaverAlignment Alignment() const; + + /** + * Returns the indicator DrawType, DrawType defined as below + * enum TScreensaverDrawType + * { + * ESsDrawTypeNotDrawn, + * ESsDrawTypeSecondary, + * ESsDrawTypePrimary + * }; + * + * @return TScreensaverDrawType + */ + TScreensaverDrawType DrawType() const; + + /** + * Makes a skin item ID from skinned bitmap id + * + * @param aSkinBmpId + * + * @return TAknsItemID + */ + TAknsItemID MakeSkinItemId(TInt aSkinBmpId); + + /** + * Sets the indicator type + * enum TScreensaverIndicatorType + * { + * ESsNumericIndicator, + * ESsIconIndicator, + * ESsTextIndicator, + * ESsNumberAndIconIndicator + * }; + * + * @param aType the type you want to set + */ + void SetType(TScreensaverIndicatorType aType); + + /** + * Returns the type of indicator + * + * @return TScreensaverIndicatorType + */ + TScreensaverIndicatorType Type(); + + /** + * Depending on indicator type these may or may not be implemented + * in derived classes. Replaces setupdrawingparameters. + * Used for new layout * + */ + virtual void SetIconLayout(TAknLayoutRect&, TInt); + virtual void SetTextLayout(TAknLayoutText&, TInt); + + /** + * Get the desired width of the indicator (where it fits completely) + */ + virtual TInt PreferredWidth(); + + /** + * Get the minimum width of the indicator + * (absolute minimum space it can be drawn in) + */ + virtual TInt MinimumWidth(); + + /** + * Set the width allowed for the indicator. This has effect only on + * indicators that have text, which may then be truncated. Bitmap + * widths are not adjusted + */ + virtual void SetWidth(TInt); + + /** + * Set X-position of indicator + */ + virtual void SetXPos(TInt); + +protected: + + /** + * The indicator Id + */ + TScreensaverIndicatorId iId; + + /** + * The topleft position of indicator + */ + TPoint iTopLeft; + + /** + * The flag indicates the indicator is visible or not + */ + TBool iVisible; + + /** + * The area of indicator + */ + TRect iRect; + + /** + * The indicator draw type + */ + TScreensaverDrawType iDrawType; + + /** + * The indicator alignment + */ + TScreensaverAlignment iAlignment; + + /** + * The indicator type. + */ + TScreensaverIndicatorType iType; + + /** + * Colors to be used to draw indicators + */ + TRgb iBgColor; + TRgb iTextColor; + + }; + + +#endif // C_SCREENSAVERINDICATOR_H + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverindicatorarray.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverindicatorarray.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,245 @@ +/* +* Copyright (c) 2003 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: CScreensaverIndicatorArray declaration. +* +*/ + + + +#ifndef C_SCREENSAVERINDICATORARRAY_H +#define C_SCREENSAVERINDICATORARRAY_H + +#include "screensaverindicator.h" + +/* +* Indicator array class. +*/ +class CScreensaverIndicatorArray : public CBase + { + public: + + /** + * Two-phased constructor + * + * @param aOldLayout if construct the old layout or the new layout + * @param aColorInversionUsed if use the inverted color or the + * normal color + */ + static CScreensaverIndicatorArray* NewL( TBool aColorInversionUsed ); + + /** + * Destructor + */ + ~CScreensaverIndicatorArray(); + + /** + * Two-phased constructor + */ + void ConstructL( TBool aColorInversionUsed); + + /** + * Creates indicator of given type and pushes it to + * cleanup stack. + * + * @param aId Indicator to be created. + */ + CScreensaverIndicator *NewIndicatorLC(TScreensaverIndicatorType aType); + + /** + * Draws indicator array to given graphics context. Setup function + * must be called before calling Draw function. + * + * @param aGc Graphics context for drawing indicator array. + */ + void Draw(CWindowGc& aGc) const; + + /** + * Sets up indicator array for drawing. Sets positions for + * indicators. + */ + void Setup(TAknLayoutRect& aLayoutRect, TAknLayoutText& aLayoutText, + TAknLayoutRect& aLayoutInds); + + /* + * Set the attributes of the indicator + */ + void SetIndicatorsAttribute( + TInt& Ind, + TAknLayoutText& aLayoutText, + TAknLayoutRect& aLayoutInds, + TInt& aCurrentX ); + + /** + * Checks if there is dependency flag set for given indicator. + * + * @param + * @return ETrue if there is dependency conflict. + * EFalse if not. + */ + TBool CheckDependencyConflict(TScreensaverIndicatorId aId) const; + + /* + * Sets dependency flag to given indicator to given value. + * If dependency flag is set then the indicator is not drawn + * even when it would be otherwise visible. + */ + void SetDependencyStatus(TScreensaverIndicatorId aId, TBool aValue); + + /** + * Queries payload for given indicator. + * + * @param aId ID of the indicator + * @param aPayload Indicator payload to receive the information + * @return KErrNone if payload was set successfully. + */ + TInt GetIndicatorPayload( + TScreensaverIndicatorId aId, + TIndicatorPayload& aPayload) const; + + /** + * Sets payload for given indicator. + * NOTE that icon and displayed indication cannot be set + * + * @param aType + * @param aPayload + * @return KErrNone if payload was set successfully. + */ + TInt SetIndicatorPayload( + TScreensaverIndicatorId aId, + const TIndicatorPayload& aPayload); + + /** + * Returns value indicating which drawing mode screensaver should select + * based on indicator payloads and dependecies. This function aswers to question + * "What drawing mode should screensaver select if indicator payloads and + * dependencies were the only determining factor?". This doesn't mean + * that screensaver will be necessarily drawn in that mode if there is + * plugin module present or something happens while setting up indicator array + * for drawing. Screensaver needs this information when it prepares itself for + * drawing. + */ + TScreensaverDrawType PreferredDrawingMode() const; + + /** + * Returns value indicating which drawing mode screensaver should select. + * This function is basically same as 'PreferredDrawingMode', but it + * returns the final state of indicator array after it has been + * set up (which may be different from PreferredDrawingMode). + * Screensaver queries this information just before it draws the screen. + */ + TScreensaverDrawType ActualDrawingMode() const; + + /** + * Returns the height of indicator. + */ + TInt Height() const; + + /** + * To set visibility value for indicators + */ + void SetVisibilityForIndicators(); + +private: + + /** + * C++ default constructor + */ + CScreensaverIndicatorArray(); + + /** + * Construct the Indicator from the resource file + */ + void ConstructFromResourceL(); + + /* + * Constuct the screensaver param from the resource + */ + void ConstructParamFromResourceL(); + + /* + * Construct indicator array from resource + */ + void ConstructIndArrayL(); + + /* + * Construct the indicators from resource + */ + void ConstructIndicatorsL( TInt aResourceId ); + + /** + * Returns the dependency record by the index + */ + TBool Dependency(TInt aIndex) const; + +private: + + /** + * The count of the indicator + */ + TInt iCount; + + /** + * How many pixels between indicators. + */ + TInt iGap; + + /** + * Minimum indicator distance to left and right border. + */ + TInt iMargin; + + /** + * Distance from top border of indicator bar to top border of + * indicator icon. + */ + TInt iTopMargin; + + /** + * The level of the text + */ + TInt iTextLevel; + + /** + * The area of the indicator + */ + TRect iRect; + + /** + * The height of the indicator bar + */ + TInt iHeight; + + /** + * The array of indicators + */ + CArrayPtrFlat* iIndicators; + + /** + * The array of dependency record + */ + CArrayFixFlat* iDependencyRecord; + + /** + * The flag decised if use the old layout or not. + */ + TBool iOldLayout; + + /** + * Colors to be used for indicator layout + */ + TUint32 iBgColor; + TUint32 iTextColor; +}; + +#endif // C_SCREENSAVERINDICATORARRAY_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverindicatoricon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverindicatoricon.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,96 @@ +/* +* Copyright (c) 2003 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: CScreensaverIndicatorIcon declaration. +* +*/ + + + +#ifndef C_SCREENSAVERINDICATORICON_H +#define C_SCREENSAVERINDICATORICON_H + +#include "screensaverindicator.h" + +/** +* Simple icon indicator. Displays icon, but no other information. +*/ +class CScreensaverIndicatorIcon : public CScreensaverIndicator + { +public: + + /** + * Destructor + */ + ~CScreensaverIndicatorIcon(); + + /** + * Draw the indicator. it should be implemented by the derived class + */ + virtual void Draw(CWindowGc& aGc) const; + + /** + * two-phased constructor + * + * @param aReader the resource read of the STRUCT + * SCREENSAVER_PARAMETERS_ARRAY defined by ourself + * @param aBgColor the background color of display screen + * @param aTextColor the text color + */ + virtual void ConstructL(TResourceReader &aReader, TUint32 aBgColor, TUint aTextColor); + + /** + * Set the parameters of drawing + * + * @param aCorner the position of the lefttop of the indicator + * @param aParentRect + */ + virtual void SetupDrawingParameters(const TPoint &aCorner, const TRect& aParentRect); + + /** + * Check if indicator is visible or not + * + * @return TBool + */ + virtual TBool CheckVisibilityConditions() const; + + /** + * Get the payload through the property + * + * @param aPayload the reference to the payload + */ + virtual void Payload(TIndicatorPayload& aPayload) const; + + /** + * Set the property through the payload + * + * @param aPayload + */ + virtual void SetPayload(const TIndicatorPayload& aPayload); + + /** + * Sets icon position and size + */ + virtual void SetIconLayout(TAknLayoutRect& aLayout, TInt aX = -1); + +private: + + /** + * The icon will be displayer + * + * Owned + */ + CGulIcon* iIcon; + }; + +#endif // C_SCREENSAVERINDICATORICON_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverindicatornumberandicon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverindicatornumberandicon.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,155 @@ +/* +* Copyright (c) 2003 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: CScreensaverIndicatorNumberAndIcon declaration. +* +*/ + + + +#ifndef C_SCREENSAVERINDICATORNUMBERANDICON_H +#define C_SCREENSAVERINDICATORNUMBERANDICON_H + +#include "screensaverindicator.h" + +class CScreensaverIndicatorNumberAndIcon : public CScreensaverIndicator + { +public: + ~CScreensaverIndicatorNumberAndIcon(); + + /** + * Draw the indicator. it should be implemented by the derived class + */ + virtual void Draw( CWindowGc& aGc ) const; + + /** + * two-phased constructor + * + * @param aReader the resource read of the STRUCT + * SCREENSAVER_PARAMETERS_ARRAY defined by ourself + * @param aBgColor the background color of display screen + * @param aTextColor the text color + */ + virtual void ConstructL( TResourceReader &aReader, TUint32 aBgColor, TUint aTextColor ); + + /** + * Set the parameters of drawing + * + * @param aCorner the position of the lefttop of the indicator + * @param aParentRect + */ + virtual void SetupDrawingParameters( const TPoint& aCorner, const TRect& aParentRect ); + + /** + * Check if indicator is visible or not + * + * @return TBool + */ + virtual TBool CheckVisibilityConditions() const; + + /** + * Get the payload through the property + * + * @param aPayload the reference to the payload + */ + virtual void Payload( TIndicatorPayload& aPayload ) const; + + /** + * Set the property through the payload + * + * @param aPayload + */ + virtual void SetPayload( const TIndicatorPayload& aPayload ); + + /** + * Sets icon position and size + */ + virtual void SetIconLayout( TAknLayoutRect& aLayout, TInt aX = -1 ); + + /** + * Sets text position and font + */ + virtual void SetTextLayout( TAknLayoutText& aLayout, TInt aX = -1 ); + + /** + * Width function overrides + */ + virtual TInt PreferredWidth(); + + /** + * Returns the icon width + */ + virtual TInt MinimumWidth(); + + /** + * virtual void SetWidth(TInt aWidth); + */ + virtual void SetXPos( TInt aX ); + + /** + * Initialize layout of graphics; + */ + virtual void InitializeLayout(); + + /** + * Initialize icon; + */ + virtual void InitializeIconL( TResourceReader &aReader ); + + /** + * draw icon; + */ + virtual void DrawIcon( CWindowGc& aGc ) const; + +private: + + /** + * The icon will be displayer + * + * Owned + */ + CGulIcon* iIcon; + + /** + * + */ + TInt iValue; + + /** + * The font of the text + * Not owned. + */ + const CFont *iFont; + + /** + * The icon alignment + */ + TScreensaverAlignment iIconAlign; + + /** + * Text position for legacy layout + */ + TPoint iTextPos; + + /** + * Rect inside which text is drawn + */ + TRect iTextRect; + + /** + * Text baseline offset from text rect top + */ + TInt iTextOffset; +}; + +#endif // C_SCREENSAVERINDICATORNUMBERANDICON_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverindicatortext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverindicatortext.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2003 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: CScreensaverIndicatorText declaration. +* +*/ + + + +#ifndef C_SCREENSAVERINDICATORTEXT_H +#define C_SCREENSAVERINDICATORTEXT_H + +#include "screensaverindicator.h" + +class CScreensaverIndicatorText : public CScreensaverIndicator + { +public: + + /** + * Draw the indicator. it should be implemented by the derived class + */ + virtual void Draw( CWindowGc& aGc ) const; + + /** + * two-phased constructor + * + * @param aReader the resource read of the STRUCT + * SCREENSAVER_PARAMETERS_ARRAY defined by ourself + * @param aBgColor the background color of display screen + * @param aTextColor the text color + */ + virtual void ConstructL( TResourceReader &aReader, TUint32 aBgColor, TUint aTextColor ); + + /** + * Set the parameters of drawing + * + * @param aCorner the position of the lefttop of the indicator + * @param aParentRect + */ + virtual void SetupDrawingParameters( const TPoint& aCorner, const TRect& aParentRect ); + + /** + * Check if indicator is visible or not + * + * @return TBool + */ + virtual TBool CheckVisibilityConditions() const; + + /** + * Get the payload through the property + * + * @param aPayload the reference to the payload + */ + virtual void Payload( TIndicatorPayload& aPayload ) const; + + /** + * Set the property through the payload + * + * @param aPayload + */ + virtual void SetPayload( const TIndicatorPayload& aPayload ); + + /** + * Sets text position and font + */ + virtual void SetTextLayout( TAknLayoutText& aLayout, TInt aX = -1 ); + + /** + * Returns the width where whole text fits + */ + virtual TInt PreferredWidth(); + + /** + * Set available width + */ + virtual void SetWidth( TInt aWidth ); + + /** + * Set x-position of indicator + */ + virtual void SetXPos( TInt aX ); + +private: + + /** + * The text should be displayed + */ + TBuf16 iText; + + /** + * The font of the text + * Not owned. + */ + const CFont *iFont; + + /** + * Rect inside which text is drawn + */ + TRect iTextRect; + + /** + * Text baseline offset from text rect top + */ + TInt iTextOffset; + }; + +#endif // C_SCREENSAVERINDICATORTEXT_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverrepositorywatcher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverrepositorywatcher.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2003 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: CScreensaverRepositoryWatcher declaration. +* +*/ + + + +#ifndef C_SCREENSAVERREPOSITORYWATCHER_H +#define C_SCREENSAVERREPOSITORYWATCHER_H + +// INCLUDES +#include + +// CLASS DECLARATION +class CRepository; +/** +* The class used to monitor the change of register value +*/ +class CScreensaverRepositoryWatcher : public CBase, + public MCenRepNotifyHandlerCallback + { +public: + + /** + * Two-phased constructor + */ + static CScreensaverRepositoryWatcher* NewL(const TUid aUid, + const TUint32 aKey, CCenRepNotifyHandler::TCenRepKeyType aKeyType, + TCallBack aCallBack, CRepository* aRepository); + + /** + * Two-phased constructor + */ + static CScreensaverRepositoryWatcher* NewL(const TUid aUid, + TCallBack aCallBack, CRepository* aRepository); + + /** + * Destructor + */ + ~CScreensaverRepositoryWatcher(); + + /** + * Returns the changed key + */ + 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: + + /** + * C++ default constructor + */ + CScreensaverRepositoryWatcher(const TUid aUid, const TUint32 aKey, + TCallBack aCallBack, CRepository* aRepository); + + /** + * Two-phased constructor + */ + void ConstructL(CCenRepNotifyHandler::TCenRepKeyType aKeyType); + + /** + * Two-phased constructor + */ + void ConstructL(); + +private: + TUid iUid; + TUint32 iKey; + TUint32 iChangedKey; + TCallBack iCallBack; + CRepository* iRepository; + CCenRepNotifyHandler* iNotifyHandler; + + }; + +#endif // C_SCREENSAVERREPOSITORYWATCHER_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensavershareddatai.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensavershareddatai.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,409 @@ +/* +* Copyright (c) 2005 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: Defines screensaver shared data connections. +* +*/ + + + +#ifndef _SCREENSAVERSHAREDDATAI_H__ +#define _SCREENSAVERSHAREDDATAI_H__ + +#include // for MMsvSessionObserver +#include + +#include "screensaverplugin.h" +#include "ScreensaverUtils.h" +#include "ScreensaverInternalPSKeys.h" +#include "ScreensaverInternalCRKeys.h" +#include "screensaverengine.h" + +enum + { + ESSForceLightsOff = 0, + ESSForceLightsOn + }; + +// CLASS DECLARATION +class CRepository; +class CScreensaverRepositoryWatcher; +class CSubscriber; +class MProfile; +class MProfileEngine; + +class CScreensaverSharedDataI : public CBase, public MMsvEntryObserver, + public MMsvSessionObserver + { +public: + /** + * Two-phased constructor + */ + static CScreensaverSharedDataI* NewL(); + + /** + * Destructor + */ + ~CScreensaverSharedDataI(); + +public: + /** + * Get the screensaver object type + */ + TDisplayObjectType DisplayObjectType() const; + + /* + * Change the display object type of screensaver + */ + void SetDisplayObjectType( const TDisplayObjectType aType ); + + /** + * Gets the display text + */ + void GetDisplayObjectText( TDes& aDes ) const; + + /* + * Get the plug-in name + */ + void GetPluginName( TFileName& aFileName ) const; + + /* + * Get the flag if uses the inversive color + */ + TBool IsInvertedColors() const; + + /** + * Gets the timeout + */ + TInt ScreensaverTimeout() const; + + /* + * Is the New Contact Note is actived or not + */ + TBool IsNCNActive() const; + + /* + * Get the count of the missed calls + */ + TInt NewMissedCalls() const; + + /** + * Request screen lights to be turned on or off + * + * @param sSecs - lights on for aSecs seconds, 0 = off, max 30. + */ + void SetSSForcedLightsOn( const TInt aSecs ); + + /** + * Publish Screensaver on/off status + * + * @param aOn ETrue - saver on, EFalse - off + */ + void SetScreensaverStatus(const TBool aOn = ETrue); + + /** + * Publish "Screensaver started from Idle" status + */ + void SetSSStartedFromIdleStatus(); + + /* + * Get the flag that if the screensaver is allowed or not + */ + TInt IsScreenSaverAllowed() const; + + /* + * Get the Preview mode of screensaver + */ + TInt ScreensaverPreviewMode() const; + + /* + * Set the preview mode + */ + void SetScreensaverPreviewMode( const TInt aMode ); + + /** + * Get preview state + */ + TScreenSaverPreviewState ScreensaverPreviewState() const; + + /** + * Report preview state + */ + void SetScreensaverPreviewState( const TScreenSaverPreviewState aState ); + + /* + * Get keyguard status + * + * @return ETrue key guard is active. + * EFalse key guard is inactive. + */ + TBool IsKeyguardOn() const; + + /** + * Query power save mode usage + * + * @return ETrue, if power save mode should be used + */ + TBool IsUsePowerSaveMode() const; + + /** + * Query system startup completion status + * + * @return ETrue, if system startup is complete + */ + TBool IsSystemStartupComplete(); + + /** + * Gets the default screensaver type + */ + TDisplayObjectType DefaultScreensaverType() const; + + /** + * Returns number of unread messages in inbox. + * + * @return Number of unread messages in inbox. + */ + TInt UnreadMessagesNumber(); + + /** + * Return the name of currently selected profile + * + * @return Profile name descriptor. + */ + const TDesC& ProfileName(); + + /** + * Query active profile. + * + * @return Id of active profile, or system error code. + */ + TInt ActiveProfile(); + + /** + * Query new email status + * + * @return ETrue if there is new email + */ + TBool IsHaveNewEmail() const; + + /** + * Query new voice mail status + * + * @return ETrue, if there is new voice mail + */ + TBool IsHaveNewVoicemail() const; + + /** + * Query new instant message status + * + * @return ETrue, if there are instant messages pending + */ + TBool IsHaveNewInstantMessages() const; + + /** + * Query silent mode status + * + * @return ETrue, if silent mode is on + */ + TBool IsSilentMode(); + + /** + * Query vibra mode status + * + * @return ETrue, if vibra mode is on + */ + TBool IsVibraMode(); + + /** + * Query call state + * + * @return ETrue if a call is ongoing + */ + TBool IsOngoingCall(); + +public: + /** + * From MMsvSessionObserver. Not used. + */ + void HandleSessionEventL(TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, + TAny* /*aArg2*/, TAny* /*aArg3*/); + + /** + * From MMsvEntryObserver. Callback function. Handles global In-box events. + * @param aEvent An entry event. + */ + void HandleEntryEventL(TMsvEntryEvent aEvent, TAny* aArg1, TAny* aArg2, + TAny* aArg3); + + /* + * Returns the pointer of the screensaver repository + */ + CRepository* ScreensaverRepository() const; + +public: + /* + * Get the flag of display changed + */ + TBool GetDisplayObjChanged() const; + /* + * Set the flag of display changed + */ + void SetDisplayObjChanged( TBool aChanged ); + +private: + + /** + * C++ default constructor + */ + CScreensaverSharedDataI(); + + /** + * Two-phased constructor + */ + void ConstructL(); + + /** + * Connect to the screensaver central repository + */ + void ConnectToSSCRL(); + + /** + * Connect to the Psln Setting central repository + */ + void ConnectToPslnSettingCRL(); + void ConnectToCommonTsyCRL(); + void ConnectToInboxL(); + + /** + * Connects to Profile engine. Returns ETrue if successfully connected + * iProfileEngine will then point to a valid MProfileEngine + */ + TBool ConnectToProfileEngine(); + + /** + * Connects to active profile. Returns ETrue if successfully connected + * iActiveProfile will then point to a valid MProfile + */ + TBool ConnectToActiveProfile(); + + /* + * Define the screensaver properties + */ + void DefineScreensaverProperties( TUint32 aKey, const TSecurityPolicy& aWritePolicy ); + +private: + // Shared data key state handlers. + + /** + * Callback fuction. Called when the timeout changed + */ + static TInt HandleTimeoutChanged(TAny* aPtr); + + /** + * Resets the inactivity timeout + */ + void ResetInactivityTimeout(); + + /** + * Callback fuction. Called when the display object changed + */ + static TInt HandleDisplayObjChanged(TAny* aPtr); + + /* + * Get the default type + */ + void GetDefaultType(); + + /* + * Get the default type string from the CR + */ + TInt GetDefaultTypeString( TDes& DefaultScreenSaver ); + + /* + * Get the count of the voice mail + */ + TInt VoiceMailCount( const TUint32 aKey ) const; + + /** + * Invalidate cached active profile + */ + void InvalidateActiveProfile(); + + /** + * Returns the AppUi + */ + CScreensaverAppUi *AppUi() const; + +private: + + /* + * The type of the display object + */ + TDisplayObjectType iDefaultType; + /** + * not owned! + */ + CScreensaverAppUi* iAppUi; + + /** + * Screensaver specific values. + */ + CRepository* iScreensaverRepository; + CScreensaverRepositoryWatcher* iScreensaverRepositoryWatcher; + + /** + * General Settings. + */ + CRepository* iSettingsRepository; + CScreensaverRepositoryWatcher* iSettingsRepositoryWatcher; + + /** + * Common tsy repository (voice message waiting) + */ + CRepository* iCTsyRepository; + + + /** + * Access to the profile engine + */ + MProfileEngine* iProfileEngine; + + /** + * Need to store also the profile, so that it's name + * can be used at any time + */ + MProfile* iActiveProfile; + + /** + * The Msv session pointer. + */ + CMsvSession* iMsvSession; + + /** + * In-box folder entry. Note that the entry is not owned by this class. + */ + CMsvEntry* iInboxFolder; + + /** + * System startup completion flag + */ + TBool iStartupComplete; + + /** + * Record display changed flag + */ + TBool iDisplayChange; + }; + +#endif // C_SCREENSAVERSHAREDDATAI_H +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensavershareddatamonitor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensavershareddatamonitor.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,184 @@ +/* +* Copyright (c) 2003 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: Defination for screensaver shared data monitoring. +* +*/ + + + +#ifndef C_SCREENSAVERSHAREDDATAMONITOR_H +#define C_SCREENSAVERSHAREDDATAMONITOR_H + +// INCLUDES +#include + +// CLASS DECLARATION +class CScreensaverSharedDataI; +class CScreensaverRepositoryWatcher; +class CScreensaverEngine; +class CScreensaverView; +class CSubscriber; + + +/** + * Cscreensavershareddatamonitor + * + */ +class CScreensaverSharedDataMonitor : public CBase + { +public: + // Constructors and destructor + + /** + * Destructor. + */ + ~CScreensaverSharedDataMonitor( ); + + /** + * Two-phased constructor. + */ + static CScreensaverSharedDataMonitor* NewL( CScreensaverSharedDataI* aData ); + +private: + + /** + * Constructor for performing 1st stage construction + */ + CScreensaverSharedDataMonitor( CScreensaverSharedDataI* aData ); + + /** + * EPOC default constructor for performing 2nd stage construction + */ + void ConstructL(); + + /* + * Returns the pointer of screensaver appui + */ + CScreensaverView* View(); + + /* + * Returns the refrence of model instance + */ + CScreensaverEngine& Model(); + + /** + * detele CSubscriber + */ + void DeleteSubscriber( CSubscriber*& aSubscriber ); + +private: + + /** + * Callback fuction. Called when the preview mode changed + */ + static TInt HandlePreviewModeChanged(TAny* aPtr); + + /** + * Callback fuction. Called when the MMC state changed + */ + static TInt HandleMMCStateChanged(TAny* aPtr); + + /** + * Callback fuction. Called when the USB state changed + */ + static TInt HandleUSBStateChanged(TAny* aPtr); + + /** + * Callback fuction. Called when the Keyguard state changed + */ + static TInt HandleKeyguardStateChanged(TAny* aPtr); + + /** + * Callback fuction. Called when the Call state changed + */ + static TInt HandleCallStateChanged(TAny* aPtr); + + /** + * Callback fuction. Called when the ShuttingDown state changed + */ + static TInt HandleShuttingDownStateChanged(TAny* aPtr); + + /** + * Callback function. Called when a start/stop request is received + */ + static TInt HandleActivateSSChanged( TAny* aPtr ); + + /** + * Callback function. Called when charger state changes + */ + static TInt HandleChargerStateChanged( TAny* aPtr ); + + /** + * Callback function. Called when the message waiting display state changes + */ + static TInt HandleMessageWaitingStateChanged( TAny* aPtr ); + +private: + + /* + * The data of model class, Not own + */ + CScreensaverSharedDataI* iData; + + /* + * The Preview mode property and its monitor + */ + RProperty iPreviewModeProperty; + CSubscriber* iPreviewModeSubscriber; + + /* + * The MMC property and its monitor + */ + RProperty iMMCWatchProperty; + CSubscriber* iMMCWatchSubscriber; + + /* + * The USB property and its monitor + */ + RProperty iUSBWatchProperty; + CSubscriber* iUSBWatchSubscriber; + + /* + * The KeyGuard state property and its watcher + */ + RProperty iKeyguardStateProperty; + CSubscriber* iKeyguardStateSubscriber; + + /* + * The Call state property and its watcher + */ + RProperty iCallStateProperty; + CSubscriber* iCallStateSubscriber; + + /* + * The shutting down property and its watcher + */ + RProperty iShuttingDownProperty; + CSubscriber* iShuttingDownSubscriber; + + RProperty iActivateSSProperty; + CSubscriber* iActivateSSSubscriber; + + /* + * Charger state property and subscriber + */ + RProperty iChargerStateProperty; + CSubscriber* iChargerStateSubscriber; + + CRepository* iMessageWaitingRepository; + CScreensaverRepositoryWatcher* iMessageWaitingWatcher; + + }; + +#endif // C_SCREENSAVERSHAREDDATAMONITOR_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaversubscriber.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaversubscriber.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2003 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: Defines screensaver shared data Subscriber. +* +*/ + + + +#ifndef C_SCREENSAVERSUBSCRIBER_H +#define C_SCREENSAVERSUBSCRIBER_H + +#include +#include + +/** +* CSubscriber +*/ +class CSubscriber : public CActive + { +public: + CSubscriber(TCallBack aCallBack, RProperty& aProperty); + ~CSubscriber(); + +public: + // New functions + void SubscribeL(); + void StopSubscribe(); + +private: + // from CActive + void RunL(); + void DoCancel(); + +private: + TCallBack iCallBack; + RProperty& iProperty; + }; + +#endif // C_SCREENSAVERSUBSCRIBER_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverutility.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverutility.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,81 @@ +/* +* Copyright (c) 2009 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: Defines screensaver utility tools. +* +*/ + + + +#ifndef C_SCREENSAVERUTILITY_H +#define C_SCREENSAVERUTILITY_H + +// INCLUDES +#include + +// CLASS DECLARATION + +/** +* The uitility class of screensaver +*/ +class ScreensaverUtility + { +public: + + /** + * Panic + */ + static void Panic( TInt aPanic ); + + /** + * Flushes the draw buffer (before activating power save) + */ + static void FlushDrawBuffer(); + + /** + * Checks whether screen has been rotated + */ + static TBool ScreenRotated(); + + /** + * Query whether 12-hour clock is displayed + */ + static TBool Query12HourClock(); + + /** + * Brings the application to foreground + */ + static void BringToForeground(); + + /** + * Sends the application to background + */ + static void SendToBackground(); + + /** + * Drive info helpers + */ + static TBool IsDrivePresent(TInt aDrive); + + /** + * Loads the bitmap + */ + static CGulIcon* LoadBitmapL(); + + /** + * Stop the server heartbeat + */ + static void StopWServHeartBeat(); + }; + +#endif // C_SCREENSAVERUTILITY_H diff -r aaeeca1f15af -r e8d784ac1a4b inc/screensaverview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/screensaverview.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,170 @@ +/* +* Copyright (c) 2009 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: Screensaver view class defination. +* +*/ + + + +#ifndef C_SCREENSAVERVIEW_H +#define C_SCREENSAVERVIEW_H + +#include +#include + +#include "screensaver.hrh" + +//CLASS DECLARATION +class CScreensaverBase; +class CScreensaverEngine; + +const TUid KUidScreensaverView ={ 1 }; +// +// class CScreensaverView +// an empty place holder for when we are in the background +class CScreensaverView : public CAknView + { +public: + + /** + * Two-phased constructor + */ + static CScreensaverView* NewL(); + + /** + * C++ default constructor + */ + CScreensaverView(); + + /** + * Destructor + */ + ~CScreensaverView(); + + /** + * Two-phased constructor + */ + void ConstructL(); + + /** + * Creates the display object by the parameter + * + * @param the object factory object, default type is EDisplayNone + */ + void CreateDisplayObjectL( TDisplayObjectType aType ); + + /** + * Resets the display object + */ + void SetDisplayObject( TDisplayObjectType aType ); + + /** + * Creates the preview display object + */ + void CreatePreviewDisplayObjectL(); + + /** + * Returns true the screensaver doesn't draw anything + */ + TBool IsContentlessScreensaver() const; + +public://From CAknView + + /** + * Returns views id, intended for overriding by sub classes. + * @return id for this view. + */ + TUid Id() const; + + /** + * Handles a view activation and passes the message of type + * @c aCustomMessageId. This function is intended for overriding by + * sub classes. This function is called by @c AknViewActivatedL(). + * Views should not launch waiting or modal notes or dialogs in + * @c DoActivateL. + * @param aPrevViewId Specifies the view previously active. + * @param aCustomMessageId Specifies the message type. + * @param aCustomMessage The activation message. + */ + void DoActivateL( const TVwsViewId& aPrevViewId, TUid aCustomMessageId, + const TDesC8& aCustomMessage ); + + /** + * View deactivation function intended for overriding by sub classes. + * This function is called by @c AknViewDeactivated(). + */ + void DoDeactivate(); + + /** + * Shows the display object + */ + void ShowDisplayObject(); + + /** + * Hides the display object + */ + void HideDisplayObject(); + + /** + * Update indicator attributes and refresh display + */ + void UpdateAndRefresh(); + +private: + /** + * Returns the default type of screensaver + */ + TDisplayObjectType DefaultScreensaverType(); + + /** + * Returns the psln setting type of screensaver + */ + TDisplayObjectType PslnSettingScreensaverType(); + + /** + * Get the model of appui + */ + CScreensaverEngine& Model() const; + + /** + * Delete the display object + */ + void DestroyDisplayObject(); + +private: + /** + * The type of current control + */ + TDisplayObjectType iCurrentControlType; + + /** + * The display object of screensaver + * + * Owned + */ + CScreensaverBase* iControl; + + /** + * The plugin refresh rate + */ + TInt iPluginRefreshRate; + + /** + * True if the active screensaver doesn't draw (e.g None) + */ + TBool iIsContentless; + + }; + +#endif // C_SCREENSAVERVIEW_H diff -r aaeeca1f15af -r e8d784ac1a4b layers.sysdef.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layers.sysdef.xml Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,14 @@ + + +]> + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b rom/screensaver.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rom/screensaver.iby Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2002-2005 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: Screen saver application IBY +* +*/ + + + + + +#ifndef SCREENSAVER_IBY +#define SCREENSAVER_IBY + +// Application +S60_APP_EXE(screensaver) + +// Resources (not localised) +S60_APP_RESOURCE(screensaver) + +// Application information files +S60_APP_AIF_RSC(screensaver) + +// Backup registration +data=ZPRIVATE\100056CF\backup_registration.xml private\100056CF\backup_registration.xml + +#endif // SCREENSAVER_IBY diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/group/bld.inf Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,53 @@ +/* +* 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: Build information file for project screensaveraiwplugin +* +*/ + + + + + + +// ============================================================================ +// Platforms +// ============================================================================ +// +PRJ_PLATFORMS + +// ============================================================================ +// Exports +// ============================================================================ +// +PRJ_EXPORTS +../loc/screensaveraiwplugin.loc MW_LAYER_LOC_EXPORT_PATH(screensaveraiwplugin.loc) + +../rom/screensaveraiwplugin.iby CORE_MW_LAYER_IBY_EXPORT_PATH(screensaveraiwplugin.iby) +../rom/screensaveraiwpluginresources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(screensaveraiwpluginresources.iby) + + +// ============================================================================ +// MMP Files +// ============================================================================ +// +PRJ_MMPFILES + +#if defined(TOOLS) || defined(CWTOOLS) +#else +screensaveraiwplugin.mmp +#endif + +PRJ_TESTMMPFILES + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/group/screensaveraiwplugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/group/screensaveraiwplugin.mmp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,64 @@ +/* +* 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: Project definition file for project aknswallpaperplugin +* +*/ + + + + +#include +#include + +TARGET screensaveraiwplugin.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x10282921 + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE screensaveraiwplugin.cpp + +// Published to /resource +START RESOURCE screensaveraiwplugin.rss +HEADER +TARGET screensaveraiwplugin.rsc +TARGETPATH RESOURCE_FILES_DIR +LANGUAGE_IDS +END // RESOURCE + +// Published to /resource/plugins +START RESOURCE 10282921.rss +TARGET screensaveraiwplugin.rsc +END + +USERINCLUDE ../inc +USERINCLUDE ../../scrsaverplugins/ScreenSaverAnimPlugin/inc + +// This is a SYSTEMINCLUDE macro containing the middleware +// layer specific include directories +MW_LAYER_SYSTEMINCLUDE + +SYSTEMINCLUDE /epoc32/include/ecom + +LIBRARY euser.lib +LIBRARY servicehandler.lib +LIBRARY CommonEngine.lib // RConeResourceLoader +LIBRARY cone.lib // CCoeEnv +LIBRARY efsrv.lib // TParse +LIBRARY avkon.lib +LIBRARY aknskinsrv.lib // RAknsSrvSession +LIBRARY imageconversion.lib // CImageDecoder +LIBRARY centralrepository.lib // CRepository diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/inc/screensaveraiwplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/inc/screensaveraiwplugin.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,122 @@ +/* +* Copyright (c) 2005 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: Header file for class CScreenSaverAIWPlugin +* +*/ + + + + +#ifndef C_CSCREENSAVERAIWPLUGIN_H +#define C_CSCREENSAVERAIWPLUGIN_H + +#include +#include + +#define CSCREENSAVERAIWPLUGIN_TRACES + + +class CRepository; + +/** + * CScreenSaverAIWPlugin plugin implementation. + * + * This plugin implements an AIW provider for setting image files as slide set + * screen saver or setting a single animated image file as animated screen saver. + * + * + * @since S60 v3.2 + */ +class CScreenSaverAIWPlugin : public CAiwServiceIfMenu + { + public: + static CScreenSaverAIWPlugin* NewL(); + virtual ~CScreenSaverAIWPlugin(); + + private: + // from base class CAiwServiceIfMenu + + void InitialiseL( + MAiwNotifyCallback& aFrameworkCallback, + const RCriteriaArray& aInterest); + + void HandleServiceCmdL( + const TInt& aCmdId, + const CAiwGenericParamList& aInParamList, + CAiwGenericParamList& aOutParamList, + TUint aCmdOptions = 0, + const MAiwNotifyCallback* aCallback = NULL); + + void InitializeMenuPaneL( + CAiwMenuPane& aMenuPane, + TInt aIndex, + TInt aCascadeId, + const CAiwGenericParamList& aInParamList); + + void HandleMenuCmdL( + TInt aMenuCmdId, + const CAiwGenericParamList& aInParamList, + CAiwGenericParamList& aOutParamList, + TUint aCmdOptions = 0, + const MAiwNotifyCallback* aCallback = NULL); + + private: + CScreenSaverAIWPlugin(); + void ConstructL(); + + private: // New + + struct TImageFile + { + TPtrC iFileName; + TPtrC iMimeType; + }; + + void DisplayInfoNoteL(TInt aTextResourceId); + void ValidateParamListL(const CAiwGenericParamList& aParamList); + TBool AnyMimeTypeSupportedL(const CAiwGenericParamList& aParamList); + TBool IsMimeTypeSupportedL(const TDesC& aMimeTypeString); + TBool IsAnimatedMimeTypeL( const TDesC& aMimeTypeString, TBool& aUseImageDecoder ); + TPtrC GetAiwParamAsDescriptor(TInt& aIndex, + const CAiwGenericParamList& aParamList, + TGenericParamId aParamType); + void StoreImageListToFileL( const RArray& aSupportedImageFiles ); + void OpenImageFileL( RFile& aImageFile, const TInt aSlideSetType ); + TBool IsAnimatedImageL( const TDesC& aFileName, const TDesC& aMimeTypeString ); + TBool IsReallyAnimatedImageL( const TDesC& aFileName ); + +#ifdef CSCREENSAVERAIWPLUGIN_TRACES + + void DumpParamList(const TDesC& aMethod, const CAiwGenericParamList& aParamList); + void DumpParamList(const TDesC& aMethod, + TGenericParamId aParamType, + const CAiwGenericParamList& aParamList); + void DumpSupportedImageFileList(const RArray& aSupportedImageFiles); +#endif + + + void GetSupportedImageFilesL(const CAiwGenericParamList& aParamList, + RArray& aSupportedImageFiles); + void SetAnimatedScreenSaverL( const RArray& aSupportedImageFiles ); + void SetSlideShowScreenSaverL( const RArray& aSupportedImageFiles ); + + private: + RConeResourceLoader iConeResLoader; + RArray iSupportedImageFiles; + CRepository* iScreensaverRepository; + CRepository* iAnimationRepository; + CRepository* iSlideshowRepository; + }; + +#endif // C_CSCREENSAVERAIWPLUGIN_H diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/inc/screensaveraiwplugin.rh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/inc/screensaveraiwplugin.rh Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,42 @@ +/* +* 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: Resource header for project screensaveraiwplugin +* +*/ + + + + +#ifndef SCREENSAVERAIWPLUGIN_RH +#define SCREENSAVERAIWPLUGIN_RH + +#define KScreenSaverAIWPluginImplementationUid 0x10282921 + +// +// --------------------------------------------------------------------------- +// Menu commands for screensaver AIW plugin +// --------------------------------------------------------------------------- +// +enum TScreenSaverAIWPluginCommands + { + EScreenSaverAIWPluginCmdSetScreenSaver = 1 + }; + + +enum TScreenSaverAIWPluginNotes + { + EScreenSaverAIWPluginGeneralWaitNote = 1 + }; + +#endif // SCREENSAVERAIWPLUGIN_RH diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/loc/screensaveraiwplugin.loc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/loc/screensaveraiwplugin.loc Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2005 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: Localization strings for project screensaveraiwplugin +* +*/ + + + + + +//d:Menu item text for setting the selected images as screen saver +//l:list_single_popup_menu_pane_1 +//w: +//r:3.2 +// +#define qtn_sanim_set_as_screensaver "Set as screen saver" + +//d:Menu item text for setting the selected images as screen saver +//l:list_single_popup_submenu_pane_t1 +//w: +//r:3.2 +// +#define qtn_sanim_submenu_screensaver "Screen saver" + + +//d:Confirmation note text for setting and image as animated +//d:screen saver. +//l:popup_note_window_1 +//w: +//r:3.2 +// +#define qtn_sanim_image_as_animation "File set as animated screen saver" + +//d:Confirmation note text for adding an image to slide set screen saver +//l:popup_note_window_1 +//w: +//r:3.2 +// +#define qtn_sanim_image_added "Image added to slide set screen saver" + +//d:Confirmation note text for adding images to slide set screen saver +//l:popup_note_window_1 +//w: +//r:3.2 +// +#define qtn_sanim_images_added "Images added to slide set screen saver" + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/rom/screensaveraiwplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/rom/screensaveraiwplugin.iby Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,30 @@ +/* +* Copyright (c) 2009 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: IBY file for screensaveraiwplugin +* +*/ + + + +#ifndef __SCREENSAVERAIWPLUGIN_IBY__ +#define __SCREENSAVERAIWPLUGIN_IBY__ + + +#ifdef RD_SCREENSAVERAIWPLUGIN +ECOM_PLUGIN(screensaveraiwplugin.dll,10282921.rsc) +#endif + +#endif // __SCREENSAVERAIWPLUGIN_IBY__ + +// End of File \ No newline at end of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/rom/screensaveraiwpluginresources.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/rom/screensaveraiwpluginresources.iby Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2009 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: IBY file for screensaveraiwpluginresouces +* +*/ + + + +#ifndef __SCREENSAVERAIWPLUGINRESOURCES_IBY__ +#define __SCREENSAVERAIWPLUGINRESOURCES_IBY__ + +#ifdef RD_SCREENSAVERAIWPLUGIN +//localizable resources +data=DATAZ_\RESOURCE_FILES_DIR\screensaveraiwplugin.rsc RESOURCE_FILES_DIR\screensaveraiwplugin.rsc +#endif + +#endif // __SCREENSAVERAIWPLUGINRESOURCES_IBY__ \ No newline at end of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/src/10282921.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/src/10282921.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,54 @@ +/* +* Copyright (c) 2005 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: AIW(ECOM) registration resource file for project screensaveraiwplugin +* +*/ + + + + +#include +#include +#include "screensaveraiwplugin.rh" + + +// --------------------------------------------------------------------------- +// Registration info for ECOM framework. +// Specifies also provider interest for AIW framework. +// --------------------------------------------------------------------------- +// +RESOURCE REGISTRY_INFO theInfo + { + resource_format_version = RESOURCE_FORMAT_VERSION_2; + dll_uid = KScreenSaverAIWPluginImplementationUid; + interfaces = + { + INTERFACE_INFO + { + // Menu service class (offers menu based services) + interface_uid = KAiwClassMenu; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = KScreenSaverAIWPluginImplementationUid; + version_no = 1; + display_name = ""; + default_data = "*"; + opaque_data = KAiwCmdAssignScreenSaverStr; + } + }; + } + }; + } diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/src/screensaveraiwplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/src/screensaveraiwplugin.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,657 @@ +/* +* Copyright (c) 2005 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: Implementation file for class CScreenSaverAIWPlugin +* +*/ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ScreenSaverAnimPluginInternalCRKeys.h" +#include "screensaveraiwplugin.h" +#include "screensaveraiwplugin.rh" + +_LIT(KResourceFileName, "screensaveraiwplugin.rsc"); +_LIT(KDriveZ, "z:"); +_LIT(KPluginUidAnimation, "[1020744D]25"); // '25' is the drive number (Z = ROM), not +_LIT(KPluginUidSlideshow, "[102823ED]25"); // mandatory + + +_LIT(KScreenSaverAIWPluginMimeTypeImage, "image"); +_LIT(KScreenSaverAIWPluginMimeTypeOTABitmap, "image/x-ota-bitmap"); +_LIT(KScreenSaverAIWPluginSeparator, "/"); + +_LIT(KScreenSaverAIWPluginMimeTypeGIF, "image/gif"); +_LIT(KScreenSaverAIWPluginMimeTypeSVG, "image/svg+xml"); +_LIT(KScreenSaverAIWPluginMimeTypeM3G, "application/m3g"); +_LIT(KScreenSaverAIWPluginMimeTypeSWF, "application/x-shockwave-flash"); + + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// CScreenSaverAIWPlugin::NewL +// ----------------------------------------------------------------------------- +// +CScreenSaverAIWPlugin* CScreenSaverAIWPlugin::NewL() + { + CScreenSaverAIWPlugin* self = new( ELeave ) CScreenSaverAIWPlugin; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAIWPlugin::CScreenSaverAIWPlugin +// ----------------------------------------------------------------------------- +// +CScreenSaverAIWPlugin::CScreenSaverAIWPlugin(): + iConeResLoader(*CCoeEnv::Static()) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAIWPlugin::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::ConstructL() + { + TParse parse; + parse.Set(KResourceFileName, &KDC_RESOURCE_FILES_DIR, &KDriveZ); + TFileName resourceFileName; + resourceFileName.Append(parse.FullName()); + iConeResLoader.OpenL(resourceFileName); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAIWPlugin::~CScreenSaverAIWPlugin +// ----------------------------------------------------------------------------- +// +CScreenSaverAIWPlugin::~CScreenSaverAIWPlugin() + { + iConeResLoader.Close(); + iSupportedImageFiles.Close(); + delete iScreensaverRepository; + delete iAnimationRepository; + } + +// --------------------------------------------------------------------------- +// From class CAiwServiceIfMenu. +// --------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::InitialiseL(MAiwNotifyCallback& /*aFrameworkCallback*/, + const RCriteriaArray& /*aInterest*/) + { + // Not needed. + } + +// --------------------------------------------------------------------------- +// From class CAiwServiceIfMenu. +// +// Implements setting the passed image(s) as screensaver. +// --------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::HandleServiceCmdL(const TInt& aCmdId, + const CAiwGenericParamList& aInParamList, + CAiwGenericParamList& /*aOutParamList*/, + TUint /*aCmdOptions*/, + const MAiwNotifyCallback* aCallback) + { + // Handle only KAiwCmdAssignScreenSaver command. + if ( aCmdId == KAiwCmdAssignScreenSaver ) + { +#ifdef CSCREENSAVERAIWPLUGIN_TRACES + DumpParamList(_L("HandleServiceCmdL"),aInParamList); +#endif + + // Leave, if there were not given all the required parameters + ValidateParamListL(aInParamList); + + // Get the supported image files to iSupportedImageFiles + GetSupportedImageFilesL(aInParamList,iSupportedImageFiles); + +#ifdef CSCREENSAVERAIWPLUGIN_TRACES + DumpSupportedImageFileList(iSupportedImageFiles); +#endif + + TInt textResourceId = 0; + if (iSupportedImageFiles.Count() == 1 && IsAnimatedImageL(iSupportedImageFiles[0].iFileName, + iSupportedImageFiles[0].iMimeType)) + { + textResourceId = R_SCREEN_SAVER_AIW_PLUGIN_TEXT_IMAGE_AS_ANIMATION; + SetAnimatedScreenSaverL(iSupportedImageFiles); + } + else + { + textResourceId = ((iSupportedImageFiles.Count() > 1)?R_SCREEN_SAVER_AIW_PLUGIN_TEXT_IMAGES_ADDED: + R_SCREEN_SAVER_AIW_PLUGIN_TEXT_IMAGE_ADDED); + SetSlideShowScreenSaverL(iSupportedImageFiles); + } + + // display confirmation note + DisplayInfoNoteL(textResourceId); + + // If aCallback defined inform consumers that we have done with + // the operation. + if (aCallback) + { + // Cope with the design problems of AIW framework + MAiwNotifyCallback* nonConstCallback = + const_cast (aCallback); + + CAiwGenericParamList* eventParamList = CAiwGenericParamList::NewL(); + CleanupStack::PushL(eventParamList); + nonConstCallback->HandleNotifyL( + KAiwCmdAssignScreenSaver, + KAiwEventCompleted, + *eventParamList, + aInParamList); + CleanupStack::PopAndDestroy(eventParamList); + } + } + } + +// --------------------------------------------------------------------------- +// From class CAiwServiceIfMenu. +// +// Inserts plugin's menu items to aMenuPane. +// --------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::InitializeMenuPaneL(CAiwMenuPane& aMenuPane, + TInt aIndex, + TInt /*aCascadeId*/, + const CAiwGenericParamList& aInParamList) + { +#ifdef CSCREENSAVERAIWPLUGIN_TRACES + DumpParamList(_L("InitializeMenuPaneL"),aInParamList); +#endif + + // Insert menu only if there is at least a single supported MIME type is given + if ( AnyMimeTypeSupportedL(aInParamList) ) + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, R_SCREEN_SAVER_AIW_PLUGIN_MENU); + aMenuPane.AddMenuItemsL(reader, KAiwCmdAssignScreenSaver, aIndex); + CleanupStack::PopAndDestroy(); // reader + } + } + +// --------------------------------------------------------------------------- +// From class CAiwServiceIfMenu. +// +// Implements menu command handling for EScreenSaverAIWPluginCmdSetScreenSaver. +// --------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::HandleMenuCmdL( + TInt aMenuCmdId, + const CAiwGenericParamList& aInParamList, + CAiwGenericParamList& aOutParamList, + TUint aCmdOptions, + const MAiwNotifyCallback* aCallback) + { + if (aMenuCmdId == EScreenSaverAIWPluginCmdSetScreenSaver) + { + // Menu commands are handled as service commands. + HandleServiceCmdL( + KAiwCmdAssignScreenSaver, + aInParamList, + aOutParamList, + aCmdOptions, + aCallback ); + } + } + +// ----------------------------------------------------------------------------- +// Implements showing information note +// ----------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::DisplayInfoNoteL(TInt aTextResourceId) + { + HBufC* text = StringLoader::LoadLC(aTextResourceId); + CAknInformationNote* dlg = new (ELeave) CAknInformationNote(EFalse); + dlg->ExecuteLD(*text); + CleanupStack::PopAndDestroy(text); + } + + +// ----------------------------------------------------------------------------- +// Validates aParamList if it is not valid +// the method leaves with KErrArgument +// ----------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::ValidateParamListL(const CAiwGenericParamList& aParamList) + { + TBool valid = EFalse; + + // The parameter list must be dividable by 2 because the number of file name + // items must be equal with the number of MIME type items. + valid = !(aParamList.Count()%2); + + valid = valid && AnyMimeTypeSupportedL(aParamList); + + if (valid) + { + TInt index = 0; + TPtrC fileName = GetAiwParamAsDescriptor(index, aParamList, EGenericParamFile); + + // At least one file name parameter should be given + valid = !(fileName == KNullDesC); + } + + if (!valid) + { + User::Leave(KErrArgument); + } + } + +// ----------------------------------------------------------------------------- +// Gets supported image file list from generic param list +// ----------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::GetSupportedImageFilesL(const CAiwGenericParamList& aParamList, + RArray& aSupportedImageFiles) + { + aSupportedImageFiles.Reset(); + for (TInt i = 0;; i++) + { + TImageFile imageFile; + TPtrC fileName = GetAiwParamAsDescriptor(i, aParamList, EGenericParamFile); + + if (fileName == KNullDesC) + { + // last file item is reached + break; + } + + TPtrC mimeTypeString = GetAiwParamAsDescriptor(i, aParamList, EGenericParamMIMEType); + if (mimeTypeString == KNullDesC) + { + // missing MIME type for file + User::Leave(KErrArgument); + break; + } + else if (IsMimeTypeSupportedL(mimeTypeString)) + { + imageFile.iFileName.Set(fileName); + imageFile.iMimeType.Set(mimeTypeString); + aSupportedImageFiles.Append(imageFile); + } + } + } + + +// ----------------------------------------------------------------------------- +// Returns ETrue if any of the MIME types is supported +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAIWPlugin::AnyMimeTypeSupportedL(const CAiwGenericParamList& aParamList) + { + TBool ret = EFalse; + for (TInt i = 0;; i++) + { + TPtrC mimeTypeString = GetAiwParamAsDescriptor(i, aParamList, EGenericParamMIMEType); + if (mimeTypeString == KNullDesC) + { + // If no MIME type parameters are passed just leave + if (i <= 0) + { + User::Leave(KErrArgument); + } + break; + } + else if (IsMimeTypeSupportedL(mimeTypeString)) + { + ret = ETrue; + break; + } + } + return ret; + } +// ----------------------------------------------------------------------------- +// Implements checking if a given MIME type is supported or not +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAIWPlugin::IsMimeTypeSupportedL(const TDesC& aMimeTypeString) + { + // Check for a type separator in the string + TInt pos = aMimeTypeString.Find(KScreenSaverAIWPluginSeparator); + + // Leave if no separator was found.. the MIME + // standard requires it + if (pos == KErrNotFound) + { + User::Leave(KErrArgument); + } + + // Construct the compare string + TPtrC compareString(aMimeTypeString.Left(pos)); + + // Perform the comparison + TBool ret = EFalse; + + // Mime type case: IMAGE/* except IMAGE/X-OTA-BITMAP + if (!compareString.CompareF(KScreenSaverAIWPluginMimeTypeImage) && + aMimeTypeString.CompareF(KScreenSaverAIWPluginMimeTypeOTABitmap)) + { + ret = ETrue; + } + + if (!ret) + { + TBool dummy; + ret = IsAnimatedMimeTypeL(aMimeTypeString,dummy); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// Determines if the MIME type is animated or not and in addition returns +// in aUseImageDecoder if image decoder should be used to determine if +// the image is really animated +// --------------------------------------------------------------------------- +// +TBool CScreenSaverAIWPlugin::IsAnimatedMimeTypeL( const TDesC& aMimeTypeString, TBool& aUseImageDecoder ) + { + TBool ret = EFalse; + aUseImageDecoder = EFalse; + + // check if animated an needs image decoder + if (!aMimeTypeString.CompareF(KScreenSaverAIWPluginMimeTypeGIF)) + { + aUseImageDecoder = ETrue; + ret = ETrue; + } + else if (!aMimeTypeString.CompareF(KScreenSaverAIWPluginMimeTypeSVG) || + !aMimeTypeString.CompareF(KScreenSaverAIWPluginMimeTypeM3G) || + !aMimeTypeString.CompareF(KScreenSaverAIWPluginMimeTypeSWF)) + { + ret = ETrue; + } + + return ret; + } + + +// ----------------------------------------------------------------------------- +// Implements getting a AIW parameter as descriptor +// ----------------------------------------------------------------------------- +// +TPtrC CScreenSaverAIWPlugin::GetAiwParamAsDescriptor( + TInt& aIndex, + const CAiwGenericParamList& aParamList, + TGenericParamId aParamType) + { + const TAiwGenericParam* genericParam = NULL; + genericParam = aParamList.FindFirst( + aIndex, + aParamType, + EVariantTypeDesC); + + if (aIndex != KErrNotFound && genericParam) + { + // Get the data + return genericParam->Value().AsDes(); + } + else + { + return KNullDesC(); + } + } + +#ifdef CSCREENSAVERAIWPLUGIN_TRACES + +// ----------------------------------------------------------------------------- +// Dump parameters in aParamList +// ----------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::DumpParamList(const TDesC& aMethod, const CAiwGenericParamList& aParamList) + { + DumpParamList(aMethod,EGenericParamFile,aParamList); + DumpParamList(aMethod,EGenericParamMIMEType,aParamList); + } + +// ----------------------------------------------------------------------------- +// Dump parameters in aParamList for a given aParamType +// ----------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::DumpParamList(const TDesC& aMethod, + TGenericParamId aParamType, + const CAiwGenericParamList& aParamList) + { + for (TInt i = 0 ;; i++) + { + TPtrC paramString = GetAiwParamAsDescriptor(i, aParamList, aParamType); + if (paramString == KNullDesC) + { + break; + } + else + { + RDebug::Print( _L("ScreenSaverAIWPlugin: %x CScreenSaverAIWPlugin::%S: Index=%d, paramType=%d, paramString=%S"), this, &aMethod, i, aParamType, ¶mString); + } + } + } + +// ----------------------------------------------------------------------------- +// Dump supported image file list +// ----------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::DumpSupportedImageFileList(const RArray& aSupportedImageFiles) + { + for (TInt i = 0 ; i < aSupportedImageFiles.Count() ; i++) + { + RDebug::Print( _L("ScreenSaverAIWPlugin: %x DumpSupportedImageFileList: Index=%d, file=%S, MIME type=%S"), this, i, &aSupportedImageFiles[i].iFileName, &aSupportedImageFiles[i].iMimeType); + } + } + +#endif + +// --------------------------------------------------------------------------- +// Determines if an image is animated or not +// --------------------------------------------------------------------------- +// +TBool CScreenSaverAIWPlugin::IsAnimatedImageL( const TDesC& aFileName, + const TDesC& aMimeTypeString ) + { + TBool useImageDecoder = EFalse; + TBool animated = IsAnimatedMimeTypeL( aMimeTypeString, useImageDecoder ); + + if (useImageDecoder) + { + animated = IsReallyAnimatedImageL(aFileName); + } + + return animated; + } + +// --------------------------------------------------------------------------- +// Determines if an image file is really animated or not +// --------------------------------------------------------------------------- +// +TBool CScreenSaverAIWPlugin::IsReallyAnimatedImageL( const TDesC& aFileName ) + { + CImageDecoder* decoder = CImageDecoder::FileNewL(CCoeEnv::Static()->FsSession(),aFileName); + CleanupStack::PushL( decoder ); + TBool animated = (decoder->FrameCount() > 1); + CleanupStack::PopAndDestroy(); // decoder + return animated; + } + +// --------------------------------------------------------------------------- +// Set and activate slide-show screen saver. +// --------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::SetSlideShowScreenSaverL( const RArray& aSupportedImageFiles ) + { + StoreImageListToFileL(aSupportedImageFiles); + + if (iScreensaverRepository == NULL) + { + // Setting the screensaver type & plugin name + iScreensaverRepository = CRepository::NewL(KCRUidScreenSaver); + } + if (iSlideshowRepository == NULL) + { + iSlideshowRepository = CRepository::NewL(KCRUidThemes); + } + + // set psln to "not random" + iSlideshowRepository->Set(KThemesScreenSaverSlideSetType, 0); + + // Slideshow plugin used + iScreensaverRepository->Set(KScreenSaverPluginName, KPluginUidSlideshow); + + // Type 3 = plugin + iScreensaverRepository->Set(KScreenSaverObject, EScreensaverTypePlugin); + + // Inform screensaver that slide set has changed + User::LeaveIfError( + RProperty::Set( + KPSUidScreenSaver, + KScreenSaverPluginSettingsChanged, + EScreenSaverPluginSettingsChanged ) ); + } + +// --------------------------------------------------------------------------- +// Set and activate animated screen saver. +// --------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::SetAnimatedScreenSaverL( const RArray& aSupportedImageFiles ) + { + if (iScreensaverRepository == NULL) + { + // Setting the screensaver type & plugin name + iScreensaverRepository = CRepository::NewL(KCRUidScreenSaver); + } + + if (iAnimationRepository == NULL) + { + // Setting the screensaver type & plugin name + iAnimationRepository = CRepository::NewL(KCRUidScreenSaverAnimPlugin); + } + + iAnimationRepository->Set(KScreenSaverAnimatedFileName, aSupportedImageFiles[0].iFileName); + + // Animation plugin used + iScreensaverRepository->Set(KScreenSaverPluginName, KPluginUidAnimation); + + // Type 3 = plugin + iScreensaverRepository->Set(KScreenSaverObject, EScreensaverTypePlugin); + } + +// --------------------------------------------------------------------------- +// Stores slide set image file names to file. +// --------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::StoreImageListToFileL( const RArray& aSupportedImageFiles ) + { + // Get file from server. + RFile imgFile; + OpenImageFileL( imgFile, EAknsSrvInifileSSSS ); + CleanupClosePushL( imgFile ); + + // Finally, write image filenames to the file. + TFileText textFile; + textFile.Set( imgFile ); + textFile.Seek( ESeekEnd ); + + for (TInt i = 0 ; i < aSupportedImageFiles.Count(); i++) + { + User::LeaveIfError( textFile.Write( aSupportedImageFiles[i].iFileName ) ); + } + + imgFile.Flush(); + + CleanupStack::PopAndDestroy(); // imgFile + } + +// --------------------------------------------------------------------------- +// Open image list file for operations. +// --------------------------------------------------------------------------- +// +void CScreenSaverAIWPlugin::OpenImageFileL( RFile& aImageFile, const TInt aSlideSetType ) + { + // First, connect to skin server. + RAknsSrvSession skinsrv; + User::LeaveIfError( skinsrv.Connect() ); + CleanupClosePushL( skinsrv ); + + // Then get file handle. + TInt fileserverhandle = 0; + TInt filehandle = 0; + // Validate type and open image file. + if ( aSlideSetType == EAknsSrvInifileSSWP ) + { + fileserverhandle = + skinsrv.OpenImageInifile( EAknsSrvInifileSSWP, filehandle ); + } + else + { + fileserverhandle = + skinsrv.OpenImageInifile( EAknsSrvInifileSSSS, filehandle ); + + } + if ( fileserverhandle <= 0 || filehandle == 0 ) + { + User::Leave( fileserverhandle ); + } + + // Finally adopt file from server. + User::LeaveIfError( aImageFile.AdoptFromServer( fileserverhandle, filehandle ) ); + CleanupStack::PopAndDestroy(); // skinsrv + } + + + +// ======== ECOM INITIALIZATION ======== + +// Map the interface UIDs to implementation factory functions +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KScreenSaverAIWPluginImplementationUid, CScreenSaverAIWPlugin::NewL) + }; + +// --------------------------------------------------------- +// Exported proxy for instantiation method resolution +// --------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/screensaveraiwplugin/src/screensaveraiwplugin.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/screensaveraiwplugin/src/screensaveraiwplugin.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2005 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: Resource file for project aknswallpaperplugin +* +*/ + + + + + +NAME SSAP // screensaveraiwplugin AIW Provider + +// Resource types +#include + +// Commands etc. +#include "screensaveraiwplugin.rh" + + +// Localized texts. +#include + + +RESOURCE RSS_SIGNATURE { } + +// --------------------------------------------------------------------------- +// r_screen_saver_aiw_plugin_menu +// +// Menu for setting image(s) as screen saver. +// --------------------------------------------------------------------------- +// +RESOURCE MENU_PANE r_screen_saver_aiw_plugin_menu + { + items = + { + MENU_ITEM { + command = EScreenSaverAIWPluginCmdSetScreenSaver; + txt = qtn_sanim_set_as_screensaver; + extratxt = qtn_sanim_submenu_screensaver; + } + }; + } + +RESOURCE TBUF r_screen_saver_aiw_plugin_text_image_added { buf = qtn_sanim_image_added; } +RESOURCE TBUF r_screen_saver_aiw_plugin_text_images_added { buf = qtn_sanim_images_added; } +RESOURCE TBUF r_screen_saver_aiw_plugin_text_image_as_animation { buf = qtn_sanim_image_as_animation; } + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/EABI/bmpanimscrplugin_ecomU.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/EABI/bmpanimscrplugin_ecomU.def Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,13 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + _ZTI12CBmpAnimItem @ 2 NONAME ; ## + _ZTI13CBmpAnimModel @ 3 NONAME ; ## + _ZTI15CBmpAnimIniData @ 4 NONAME ; ## + _ZTI16CBmpAnimSettings @ 5 NONAME ; ## + _ZTI17CBmpAnimScrPlugin @ 6 NONAME ; ## + _ZTV12CBmpAnimItem @ 7 NONAME ; ## + _ZTV13CBmpAnimModel @ 8 NONAME ; ## + _ZTV15CBmpAnimIniData @ 9 NONAME ; ## + _ZTV16CBmpAnimSettings @ 10 NONAME ; ## + _ZTV17CBmpAnimScrPlugin @ 11 NONAME ; ## + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/bmarm/BMPANIMSCRPLUGINU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/bmarm/BMPANIMSCRPLUGINU.DEF Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + CreatePluginModule__Fv @ 1 NONAME R3UNUSED ; CreatePluginModule(void) + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/bmarm/BMPANIMSCRPLUGIN_ECOMU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/bmarm/BMPANIMSCRPLUGIN_ECOMU.DEF Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + ImplementationGroupProxy__FRi @ 1 NONAME R3UNUSED ; ImplementationGroupProxy(int &) + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/bwins/BMPANIMSCRPLUGIN_ECOMU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/bwins/BMPANIMSCRPLUGIN_ECOMU.DEF Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * __cdecl ImplementationGroupProxy(int &) + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/bwins/bmpanimscrpluginu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/bwins/bmpanimscrpluginu.def Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + ?CreatePluginModule@@YAPAVMScreensaverPlugin@@XZ @ 1 NONAME ; class MScreensaverPlugin * __cdecl CreatePluginModule(void) + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/ABLD.BAT --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/ABLD.BAT Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,15 @@ +@ECHO OFF + +REM Bldmake-generated batch file - ABLD.BAT +REM ** DO NOT EDIT ** + +perl -S ABLD.PL "\S60\BmpAnimScrPlugin\group\\" %1 %2 %3 %4 %5 %6 %7 %8 %9 +if errorlevel==1 goto CheckPerl +goto End + +:CheckPerl +perl -v >NUL +if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed? +goto End + +:End diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/BmpAnimConfig.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/BmpAnimConfig.hrh Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2009 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: Project definition file +* +*/ + + + +#ifndef BMPANIMCONFIG_HRH +#define BMPANIMCONFIG_HRH + +// Compiled at all? +// #define RD_SCREENSAVER_BMPANIM + +// use logging? +// #define LOGGING_ENABLED + +#endif // BMPANIMCONFIG_HRH diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/BmpAnimScrPlugin.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/BmpAnimScrPlugin.ini Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,27 @@ +[info] +; Plugin name +name=Operator zaver 4.0 + +; Bitmap file name (on ROM full path is needed) +mbmfile=\resource\plugins\BmpAnimScrPlugin.mbm + +; Landscape bitmap file name (on ROM full path is needed) +;mbmfilelandscape=\resource\plugins\BmpAnimScrPluginL.mbm + +; Should separate landscape graphics be used (file must be defined) (1 = use landscape) +uselandscape=0 + +; Scale bitmaps to screen size (SVG is always scaled) (1 = scale) +scalebmps=0 + +; Running time in millis +runningtime=30000000 + +; Suspend time in millis (max 2147483647, -1 indefinitely) +suspendtime=-1 + +; Time between images in millis +timing=100000 + +; Time to keep lights on in seconds +lights=15 diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/BmpAnimScrPlugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/BmpAnimScrPlugin.mmp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2003, 2004 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: Project definition file +* +*/ + + + + +// Animator configuration (logging flags) +#include "BmpAnimConfig.hrh" + +#include + +TARGET BmpAnimScrPlugin.dll +TARGETTYPE PLUGIN + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT +//2nd UID is the ECOM plugin UID, 3rd is screensaver plugin dll's uid +UID 0x10009D8D 0x101F86FF + +#ifdef LOGGING_ENABLED +MACRO USE_LOGGER +MACRO USE_RDEBUG +#endif + +SOURCEPATH ../src + +SOURCE BmpAnimScrPluginDll.cpp +SOURCE CBmpAnimScrPlugin.cpp +SOURCE CBmpAnimModel.cpp +SOURCE CBmpAnimItem.cpp +SOURCE CBmpAnimSettings.cpp +SOURCE CBmpAnimIniData.cpp + +LANG SC + +USERINCLUDE ../inc + +// This is a SYSTEMINCLUDE macro containing the middleware +// layer specific include directories +MW_LAYER_SYSTEMINCLUDE + +SYSTEMINCLUDE ../../../../inc +SYSTEMINCLUDE /epoc32/include/ecom + +LIBRARY ecom.lib +LIBRARY euser.lib +LIBRARY fbscli.lib +LIBRARY eikcore.lib +LIBRARY cone.lib +LIBRARY egul.lib +LIBRARY efsrv.lib +LIBRARY avkon.lib +LIBRARY aknicon.lib +// LIBRARY bitgdi.lib + +#ifdef LOGGING_ENABLED +LIBRARY flogger.lib +#endif + +// The deffile name has to be changed to be able to build +// ecom and non-ecom plugin versions +DEFFILE bmpanimscrplugin_ecom.def + +START RESOURCE 101F86FF.rss +TARGET BmpAnimScrPlugin.rsc +END + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/BmpAnimScrPlugin.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/BmpAnimScrPlugin.pkg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,52 @@ +; +; Copyright (c) 2009 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: The Package file for BmpAnimScrPlugin +; + +;Languages +&EN + +;Header + ; {Names},(UID),major,minor,variant +#{"zippo Zaver"},(0x101F86FF),3,1,0 + +;Supports Series 60 v3 +;This line indicates that this installation is for the Series 60 platform v3 +;This line must appear _exactly_ as shown below in the sis file +;If this line is missing or incorrect, the sis file will not be able +;to be installed on Series 60 v3 platforms +;(0x10201A7A), 0, 0, 0, {"Series60v3.0"} +(0x101F7961), 0, 0, 0, {"Series60ProductID"} + +;Localised Vendor name +%{"zippo Zoftware"} + +;Unique Vendor name +:"zippo Zoftware" + +;Key and certificate +;*"rd-key.pem","rd.cer" + +; Bitmap Animator +"\epoc32\release\armv5\urel\BmpAnimScrPlugin.dll"-"!:\sys\bin\BmpAnimScrPlugin.dll" +"\epoc32\data\z\resource\plugins\BmpAnimScrPlugin.RSC"-"!:\resource\plugins\BmpAnimScrPlugin.RSC" + +; Animation images +; NOTE Switch between MIF or both, depending on which +; kind of bitmaps the animation has (bmp - both) +"\epoc32\data\z\resource\plugins\BmpAnimScrPlugin.mif"-"!:\resource\plugins\BmpAnimScrPlugin.mif" +"\epoc32\data\z\resource\plugins\BmpAnimScrPlugin.mbm"-"!:\resource\plugins\BmpAnimScrPlugin.mbm" + +; Settings file with MBM +"\epoc32\data\z\resource\plugins\BmpAnimScrPlugin.ini"-"!:\resource\plugins\BmpAnimScrPlugin.ini" diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/bld.inf Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2005 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: +* build information file for BmpAnimScrPlugin +* +*/ + + + + +#include "BmpAnimConfig.hrh" + +#ifdef RD_SCREENSAVER_BMPANIM + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +BmpAnimScrPlugin.ini /epoc32/wins/c/resource/plugins/BmpAnimScrPlugin.ini +BmpAnimScrPlugin.ini /epoc32/winscw/c/resource/plugins/BmpAnimScrPlugin.ini +BmpAnimScrPlugin.ini /epoc32/data/z/resource/plugins/BmpAnimScrPlugin.ini + +PRJ_MMPFILES +// Plugin +BmpAnimScrPlugin.mmp + +// Animation bitmaps, can be after actual mmp, bitmap header is not used +gnumakefile ../srcdata/animation.mk + +#endif +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/makesis_3x.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/group/makesis_3x.bat Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,23 @@ +@echo off +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Makesis command for BmpAnimScrPlugin +rem +@echo on + + + + +makesis BmpAnimScrPlugin.pkg +signsis BmpAnimScrPlugin.sis BmpAnimScrPlugin_3x.sisx \S60\AppinstUi\internal\RD_RootCA\rd.cer \S60\AppinstUi\internal\RD_RootCA\rd-key.pem diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/BmpAnimUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/BmpAnimUtils.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,164 @@ +/* +* Copyright (c) 2009 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: BmpAnimScrPlugin utilities collection +* +*/ + + + +#ifndef BMPANIMUTILS_H +#define BMPANIMUTILS_H + +// ========== LOGGING MACROS =============================== + +#ifdef USE_LOGGER + +#include +#include +#include +#include + + +/* logging macros usage: + +// set logging on in mmp file... +MACRO USE_LOGGER +#ifdef WINS +MACRO USE_RDEBUG +#endif + + +void CTestAppUi::ConstructL() +{ +// creates log directory and log file on app startup. +// prints starting banner... +BMALOGGER_CREATE; + +// entering to function... +BMALOGGER_ENTERFN("ConstructL()"); + +TInt number = 42; +TFileName file; +file = "something" .... + +// print variable number of parameters... +// Note: use _L macro for format string! +BMALOGGER_WRITEF(_L("BMA: number = %d, file = %S"), number, &file); + +// print just a string (no _L macro here!) +BMALOGGER_WRITE("Hello world!"); + +// leave from function... +BMALOGGER_LEAVEFN("ConstructL()"); +} + +CTestAppUi::~CTestAppUi() +{ +// print app exit banner when application exits. +BMALOGGER_DELETE; +} + +*/ + +#ifdef USE_RDEBUG + +_LIT(KBMALogBanner, "BmpAnim log start"); +_LIT(KBMALogEnterFn, "BMA: enter --> %S"); +_LIT(KBMALogLeaveFn, "BMA: leave <-- %S"); +_LIT(KBMALogWrite, "BMA: %S"); +_LIT(KBMALogTag, "BMA: "); +_LIT(KBMALogExit, "BmpAnim log end"); +_LIT(KBMALogTimeFormatString, "%H:%T:%S:%*C2"); + +#define BMALOGGER_CREATE {RDebug::Print(KBMALogBanner);} +#define BMALOGGER_DELETE {RDebug::Print(KBMALogExit);} +#define BMALOGGER_ENTERFN(a) {_LIT(temp, a); RDebug::Print(KBMALogEnterFn, &temp);} +#define BMALOGGER_LEAVEFN(a) {_LIT(temp, a); RDebug::Print(KBMALogLeaveFn, &temp);} +#define BMALOGGER_WRITE(a) {_LIT(temp, a); RDebug::Print(KBMALogWrite, &temp);} +#define BMALOGGER_WRITE_TIMESTAMP(a) {_LIT(temp, a); TTime time; time.HomeTime(); TBuf<256> buffer; time.FormatL(buffer, KBMALogTimeFormatString); buffer.Insert(0, temp); buffer.Insert(0, KBMALogTag); RDebug::Print(buffer); } +#define BMALOGGER_WRITEF RDebug::Print + +#else // !USE_RDEBUG + +_LIT(KBMALogDir, "BMA"); +_LIT(KBMALogFile, "BMA.txt"); +_LIT8(KBMALogBanner, "BmpAnim log start"); +_LIT8(KBMALogEnterFn, "BMA: -> %S"); +_LIT8(KBMALogLeaveFn, "BMA: <- %S"); +_LIT8(KBMALogExit, "BmpAnim log end"); +_LIT(KBMALogTimeFormatString, "%H:%T:%S:%*C2"); + +#define BMALOGGER_CREATE {FCreate();} +#define BMALOGGER_DELETE {RFileLogger::Write(KBMALogDir, KBMALogFile, EFileLoggingModeAppend, KBMALogExit);} +#define BMALOGGER_ENTERFN(a) {_LIT8(temp, a); RFileLogger::WriteFormat(KBMALogDir, KBMALogFile, EFileLoggingModeAppend, KBMALogEnterFn, &temp);} +#define BMALOGGER_LEAVEFN(a) {_LIT8(temp, a); RFileLogger::WriteFormat(KBMALogDir, KBMALogFile, EFileLoggingModeAppend, KBMALogLeaveFn, &temp);} +#define BMALOGGER_WRITE(a) {_LIT(temp, a); RFileLogger::Write(KBMALogDir, KBMALogFile, EFileLoggingModeAppend, temp);} +#define BMALOGGER_WRITE_TIMESTAMP(a) {_LIT(temp, a); TTime time; time.HomeTime(); TBuf<256> buffer; time.FormatL(buffer, KBMALogTimeFormatString); buffer.Insert(0, temp); RFileLogger::Write(KBMALogDir, KBMALogFile, EFileLoggingModeAppend, buffer); } +#define BMALOGGER_WRITEF FPrint + +inline void FPrint(const TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + RFileLogger::WriteFormat(KBMALogDir, KBMALogFile, EFileLoggingModeAppend, aFmt, list); + } + +inline void FPrint(const TDesC& aDes) + { + RFileLogger::WriteFormat(KBMALogDir, KBMALogFile, EFileLoggingModeAppend, aDes); + } + +inline void FHex(const TUint8* aPtr, TInt aLen) + { + RFileLogger::HexDump(KBMALogDir, KBMALogFile, EFileLoggingModeAppend, 0, 0, aPtr, aLen); + } + +inline void FHex(const TDesC8& aDes) + { + FHex(aDes.Ptr(), aDes.Length()); + } + +inline void FCreate() + { +#ifdef RD_PF_SEC_APPARC + // Use screensaver private dir + TFileName path(_L("c:\\private\\100056cf\\")); +#else + TFileName path(_L("c:\\logs\\")); +#endif + path.Append(KBMALogDir); + path.Append(_L("\\")); + RFs& fs = CEikonEnv::Static()->FsSession(); + fs.MkDirAll(path); + RFileLogger::WriteFormat(KBMALogDir, KBMALogFile, EFileLoggingModeOverwrite, KBMALogBanner); + } + +#endif // !USE_RDEBUG + +#else // !USE_LOGGER + +inline void FPrint(const TRefByValue /*aFmt*/, ...) { }; + +#define BMALOGGER_CREATE +#define BMALOGGER_DELETE +#define BMALOGGER_ENTERFN(a) +#define BMALOGGER_LEAVEFN(a) +#define BMALOGGER_WRITE(a) +#define BMALOGGER_WRITEF 1 ? ((void)0) : FPrint +#define BMALOGGER_WRITE_TIMESTAMP(a) + +#endif // USE_LOGGER + +#endif // BMPANIMUTILS_H + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimIniData.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimIniData.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,84 @@ +/* +* Copyright (c) 2003 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: Bitmap animator INI file handler +* +*/ + + + +#ifndef C_CBMPANIMINIDATA_H +#define C_CBMPANIMINIDATA_H + +#include + +class CBmpAnimIniData : public CBase + { +public: + // Constructor, pass in name of ini file to open + // Default search path is 'c:\system\data' on target filesystem + // ie. 'NewL(_L("c:\\system\\data\\ttools.ini"))' is equivalent + // to 'NewL(_L("ttools.ini"))' + static CBmpAnimIniData* NewL(const TDesC& aName); + virtual ~CBmpAnimIniData(); + + // Read text value regardless of section + // Returns: True(Success) or false(Failure) + TBool FindVar(const TDesC8& aKeyName, TDes16& aResult); + TBool FindVar(const TDesC8& aKeyName, TPtrC8& aResult); + + // Read integer value regardless of section + // Returns: True(Success) or false(Failure) + TBool FindVar(const TDesC8& aKeyName, TInt& aResult); + + // Read text value under section + // Returns: True(Success) or false(Failure) + TBool FindVar( + const TDesC8& aSection, const TDesC8& aKeyName, TDes16& aResult); + TBool FindVar( + const TDesC8& aSection, const TDesC8& aKeyName, TPtrC8& aResult); + + // Read integer value under section + // Returns: True(Success) or false(Failure) + TBool FindVar( + const TDesC8& aSection, const TDesC8& aKeyName, TInt& aResult); + + // Write integer value associated with a token + TInt WriteVarL( + const TDesC8& aSection, const TDesC8& aKeyName, TInt aValue); + + // Write string associated with a token + TInt WriteVarL( + const TDesC8& aSection, const TDesC8& aKeyName, const TDesC8& aValue); + + // Commits the changes done. NOTE if not called, the changes will NOT + // be saved into file + void CommitL(); + + +protected: + CBmpAnimIniData(); + void ConstructL(const TDesC& aName); + +private: + // Tries to locate the given section. EFalse if not found + TBool FindSection(const TDesC8& aSection, TInt& aStart, TInt& aEnd); + +private: + HBufC* iName; + HBufC8* iToken; + TPtr8 iPtr; // Holds the file in memory, written back in CommitL() + }; + +#endif // C_CBMPANIMINIDATA_H + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimItem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimItem.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2003 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: Stores a single bitmap animation item: image with its +* properties (position, timing et al) +* +*/ + + + +#ifndef C_CBMPANIMITEM_H +#define C_CBMPANIMITEM_H + +// INCLUDES +#include // e32def, e32std +#include + +// CONSTANTS + +// MACROS + +// Item flags +#define BAIF_OWNSICON 0x01 + + +// DATA TYPES + +// EXTERNAL DATA STRUCTURES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// CLASS DEFINITIONS +class CBmpAnimItem : public CBase + { +public: + // Public constructor, doesn't need a two-phase construction + CBmpAnimItem(); + + // Destructor + virtual ~CBmpAnimItem(); + + // Set icon. If owned, an icon is deleted by the item + void SetIcon(CGulIcon* aIcon, TBool aItemOwnsIcon = ETrue); + + // Set icon from bitmaps. If owned, an icon is deleted by the item + void SetIconL( + CFbsBitmap* aBitmap, + CFbsBitmap* aMask = NULL, + TBool aItemOwnsIcon = ETrue); + + // Get icon + CGulIcon* Icon() const { return iIcon; } + + // Set timing (microsecs to display the image) + void SetTiming(TInt aMicros) { iTiming = aMicros; } + + // Get timing + TInt Timing() { return iTiming; } + + // Set position + void SetPosition(TPoint aPos) { iPosition = aPos; } + + // Get position + TPoint Position() { return iPosition; } + + // Get flags + TInt Flags() const { return iFlags; } +protected: +private: + // Type flags + TInt iFlags; + + // Icon + CGulIcon* iIcon; + + // Timing + TInt iTiming; + + // Position + TPoint iPosition; + }; + +#endif // C_CBMPANIMITEM_H diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimModel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimModel.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,109 @@ +/* +* Copyright (c) 2003 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: Takes care of storing and serving the bitmaps +* to be animated along with their properties +* +*/ + + + +#ifndef C_CBMPANIMMODEL_H +#define C_CBMPANIMMODEL_H + +#include "CBmpAnimItem.h" +#include "CBmpAnimSettings.h" + +// 5 seems like a reasonable granularity +const TInt KBmpAnimItemArrayGranularity = 5; + +// BmpAnim model. Contains BmpAnim items, serves the items to BmpAnim plugin +class CBmpAnimModel : public CBase + { +public: + // Default constructor & destructor + CBmpAnimModel(); + virtual ~CBmpAnimModel(); + +public: + // Two-phase constructor, initialises member arrays and stuff + virtual void ConstructL(CBmpAnimSettings* aSettings); + +public: // Access functions + // Number of items query + TInt NumberOfItems() const; + + // Add an item to the end of the array + void AppendItemL(CBmpAnimItem* aItem); + + // Insert an item at . Space must be reserved. + void InsertItemL(TInt aIndex, CBmpAnimItem* aItem); + + // Delete item at . + void DeleteItemL(TInt aIndex); + + // Delete all items + void DeleteAll(); + + // Get item at position + CBmpAnimItem* ItemAt(TInt aIndex) const; + + // Get current item index + inline TInt CurrentItemIndex() const; + + // Set current item index + inline void SetCurrentItemIndex(TInt aIndex); + + // Get next item in animation sequence. aWrapped is ETrue, if the + // next item caused a wrap to the beginning of sequence + CBmpAnimItem* NextItem(TBool& aWrapped); + + // Reserve space for items + void SetReserveL(TInt aCount); + + // Get settings + inline CBmpAnimSettings* Settings() const; + +private: // Utility functions + +private: + // Item array + CArrayPtrFlat* iItems; + + // Current item index + TInt iCurrentItem; + + CBmpAnimSettings* iSettings; + }; + + +// --- inlines --- + +// Get current item index +inline TInt CBmpAnimModel::CurrentItemIndex() const + { return iCurrentItem; } + + +// Set current item index +inline void CBmpAnimModel::SetCurrentItemIndex(TInt aIndex) + { + iCurrentItem = aIndex; + } + +// Get settings +inline CBmpAnimSettings* CBmpAnimModel::Settings() const + { return iSettings; } + +#endif // C_CBMPANIMMODEL_H + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimScrPlugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimScrPlugin.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,178 @@ +/* +* Copyright (c) 2003 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: Main include file for plugin +* +*/ + + + +#ifndef C_CBMPANIMSCRPLUGIN_H +#define C_CBMPANIMSCRPLUGIN_H + +#include +#include +#include +#include +#include + +#include + +#include "CBmpAnimModel.h" +#include "CBmpAnimItem.h" +#include "CBmpAnimSettings.h" + +// The screensaver plugin implementation must inherit from +// CScreensaverPluginInterfaceDefinition +class CBmpAnimScrPlugin : public CScreensaverPluginInterfaceDefinition + { + enum TPluginState + { + EPluginStateLoading = 0, + EPluginStateInitializing, + EPluginStateAnimation, + EPluginStateStoppingAnimation, + }; + + enum TLoadedAnimation + { + ENone, + EPortrait, + ELandscape, + EPortraitRotated + }; + +public: + // Class instance creation + static CBmpAnimScrPlugin* NewL(); + +private: + // Construction + CBmpAnimScrPlugin(); + +public: + // Destruction + ~CBmpAnimScrPlugin(); + +public: // from MScreensaverPlugin + TInt InitializeL(MScreensaverPluginHost *aHost); + TInt Draw(CWindowGc& aGc); + const TDesC16& Name() const; + TInt HandleScreensaverEventL(TScreensaverEvent aEvent, TAny* aData); + TInt Capabilities(); + TInt PluginFunction(TScPluginCaps aFunction, TAny* aParam); + +private: + // Draws centered items + void DrawCentered(CWindowGc& aGc, CBmpAnimItem* aItem); + + // Loads the animation into the model + void LoadAnimationL(TBool aLandscape = EFalse, TBool aRotate = EFalse); + + // Re-loads the animation when display changes, if needed + void ReloadAnimationL(); + + // Starts the display timer + void StartDisplayTimer(); + + // Stops the display timer + void StopDisplayTimer(); + + // Display timer callback + static TInt DisplayTimerCallback(TAny* aPtr); + + // Starts the lights timer + void StartLightsTimer(); + + // Stops the lights + void StopLightsTimer(); + + // Lights timer callback + static TInt LightsTimerCallback(TAny* aPtr); + + // Advances the plugin state + void HandlePluginState(); + + // Requests a suitable display mode from host + void SetDisplayMode(); + + void Lights(TInt aSecs); + + // Configures the plugin + TInt ConfigureL(TAny* aParam); + + // Sets sizes of bitmaps + TInt ScaleBitmap(CFbsBitmap* aBmp, TBool aRotate = EFalse); + + // Returns ETrue if reload of the animation is needed + TBool ReloadNeeded(); + + // Returns ETrue if display is landscape + TBool DisplayIsLandscape(); + + // Returns ETrue if graphics should be rotated + TBool RotateNeeded(); + + // Returns ETrue if landscape graphics should be loaded + TBool LoadLandscape(); + + // Updates the saved display information + void UpdateDisplayInfo(); + + // Sets bitmap size and rotation (used instead of AknIconUtils function) + // Actually an "Easy Leaving :)" wrapper around the L-version + TInt SetSizeAndRotation(CFbsBitmap* aBmp, TSize aSize, TInt aAngle); + + // Sets bitmap size and rotation (used instead of AknIconUtils function) + void SetSizeAndRotationL(CFbsBitmap* aBmp, TSize aSize, TInt aAngle); + + // Rotates and scales a source bitmap into target bitmap + void RotateAndScaleBitmapL( + const TRect& aTrgRect, + CFbsBitmap* aTrgBitmap, + CFbsBitmap* aSrcBitmap, + TInt aAngle); + +private: + // Plugin host interface + MScreensaverPluginHost* iHost; + + // Plugin state + TInt iState; + + // Needed to retrieve bitmaps from files + CEikonEnv* iEikEnv; + + // Animator model, stores and serves animation items + CBmpAnimModel* iModel; + + // Animator settings. Created and deleted here, but used and managed by + // the model. Creating here enables retrieving the plugin name + // in non-plugin-host applications (such as Themes) + CBmpAnimSettings* iSettings; + + // Timer to control how long the animation is displayed + CPeriodic* iDisplayTimer; + + // Flag to control animation stop. Changed from display timer callback + TInt iStopDisplaying; + + TScreensaverDisplayInfo iDi; + + TLoadedAnimation iLoadedAnimation; + }; + + +#endif // C_CBMPANIMSCRPLUGIN_H + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimSettings.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/inc/CBmpAnimSettings.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,183 @@ +/* +* Copyright (c) 2003 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: Loads and stores the bitmap animator settings +* +*/ + + + +#ifndef C_CBMPANIMSETTINGS_H +#define C_CBMPANIMSETTINGS_H + +#include +#include "CBmpAnimIniData.h" + +// Default plugin name +_LIT(KPluginName, "BitmapAnimator"); +const TInt KMaxPluginNameLength = 30; + +// BmpAnim settings +class CBmpAnimSettings : public CBase + { +public: + // User constructor + static CBmpAnimSettings* NewL(); + + // Construction & destruction +private: + CBmpAnimSettings(); + void ConstructL(); +public: + virtual ~CBmpAnimSettings(); + +public: // Access functions + // Load the current settings from file (may be used from outside, + // hence public). Usually just called from ConstructL(), tho + TBool LoadSettingsL(); + + // Save settings + TBool SaveSettingsL(); + + // Get running time (-1 = not defined) + inline TInt RunningTime(); + + // Get loop count (-1 = not defined) + inline TInt LoopCount(); + + // Get suspend time (-1 = indefinitely) + inline TInt SuspendTime(); + + // Get / set default timing + inline TInt Timing(); + inline void SetTiming(TInt aTiming); + + // Get plugin name + inline TDesC& PluginName(); + + // Get bitmap file name + inline TDesC& BitmapFilename(); + + // Get landscape bitmap file name + inline TDesC& BitmapFilenameLandscape(); + + // Get/set lights on time (secs) + inline TInt Lights(); + inline void SetLights(TInt aSecs); + + // Landscape used? + inline TInt UseLandscape(); + + // Should bitmaps be scaled to screen + inline TInt ScaleBmps(); + +private: // Utility functions + // Opens the settings file (initialises the settings reader) + TInt OpenSettings(); + + // Figures out the bitmap file name + void LoadBitmapFileName(TBool aLandscape = EFalse); + +private: + // Settings file handler + CBmpAnimIniData* iIniData; + + // Time to run the animation. Overrides loop count + TInt iRunningTime; + + // Number of loops to be run. Used if run time is undefined + TInt iLoopCount; + + // Time to suspend the animation. -1 = indefinitely + TInt iSuspendTime; + + // Time to display each image. Individual image timing overrides this. + TInt iTiming; + + // Plugin name + TBuf iPluginName; + + // Bitmap file name + TFileName iMbmFileName; + + // Landscale bitmap file name + TFileName iMbmFileNameL; + + // Lights on time (secs) + TInt iLights; + + // Landscape images used (0 = no) + TInt iUseLandscape; + + // Bitmaps scaled to screen size (0 = no) + TInt iScaleBmps; + }; + + +// --- inlines --- + +// Get run time (-1 = not defined) +inline TInt CBmpAnimSettings::RunningTime() + { return iRunningTime; } + + +// Get loop count (-1 = not defined) +inline TInt CBmpAnimSettings::LoopCount() + { return iLoopCount; } + + +// Get suspend time (-1 = indefinitely) +inline TInt CBmpAnimSettings::SuspendTime() + { return iSuspendTime; } + + +// Get default timing +inline TInt CBmpAnimSettings::Timing() + { return iTiming; } + +// Set default timing +inline void CBmpAnimSettings::SetTiming(TInt aTiming) + { iTiming = aTiming; } + + +// Get default bitmap file +inline TDesC16& CBmpAnimSettings::PluginName() + { return iPluginName; } + + +// Get default bitmap file +inline TDesC16& CBmpAnimSettings::BitmapFilename() + { return iMbmFileName; } + +// Get landscape bitmap file +inline TDesC16& CBmpAnimSettings::BitmapFilenameLandscape() + { return iMbmFileNameL; } + +// Get lights on time (secs) +inline TInt CBmpAnimSettings::Lights() + { return iLights; } + + +// Set lights on time (secs) +inline void CBmpAnimSettings::SetLights(TInt aSecs) + { iLights = aSecs; } + +// Use landscape? +inline TInt CBmpAnimSettings::UseLandscape() + { return iUseLandscape; } + +// Scale bitmaps? +inline TInt CBmpAnimSettings::ScaleBmps() + { return iScaleBmps; } + +#endif // C_CBMPANIMSETTINGS_H diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/rom/bmpanimscrplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/rom/bmpanimscrplugin.iby Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2009 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: IBY file for BmpAnimScrPlugin +* +*/ + + + +#ifndef __BMPANIMSCRPLUGIN_IBY__ +#define __BMPANIMSCRPLUGIN_IBY__ + +REM Bmpanim screensaver plugin + +#ifdef RD_SCREENSAVER_BMPANIM + +ECOM_PLUGIN(BmpAnimScrPlugin.dll, 101F86FF.rsc) + +data=DATAZ_\resource\plugins\BmpAnimScrPlugin.ini \resource\plugins\BmpAnimScrPlugin.ini +data=DATAZ_\resource\plugins\BmpAnimScrPlugin.mif \resource\plugins\BmpAnimScrPlugin.mif + +// Only present, if using BMP graphics +data=DATAZ_\resource\plugins\BmpAnimScrPlugin.mbm \resource\plugins\BmpAnimScrPlugin.mbm + +#endif +#endif // __BMPANIMSCRPLUGIN_IBY__ diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/101F86FF.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/101F86FF.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2009 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: ECOM Resource file for BmpAnimScrPlugin +* +*/ + + + +// 101F86FF.RSS +// +// Registry file for Bounce-plugin Implementation. +// +// Interface(s) : +// + +#include +#include + + +RESOURCE REGISTRY_INFO theInfo + { + // plugin's UID + dll_uid = 0x101F86FF; + interfaces = + { + INTERFACE_INFO + { + // ScreenSaver ECOM Plugin interface UID. + interface_uid = KCScreensaverPluginInterfaceDefinitionUid; + implementations = + { + IMPLEMENTATION_INFO + { + // plugin's UID + implementation_uid = 0x101F87F9; + version_no = 1; + // This is the displayed name of the plugin. + // It can be localised if needed + display_name = "zippo Zaver 3.1"; + default_data = ""; + // This must correspond the value returned by + // CBmpAnimScrPlugin::Capabilities + opaque_data = KScrPluginCapabilitiesNoneStr; + } + }; + } + }; + } + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/BmpAnimScrPluginDll.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/BmpAnimScrPluginDll.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2003 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: Plugin DLL export that creates the plugin object itself +* +*/ + + + + + +#include "CBmpAnimScrPlugin.h" + + +#ifndef EKA2 +// Dll entry point or something +GLDEF_C TInt E32Dll(TDllReason) + { + return KErrNone; + } +#endif + + +#define KCScreensaverPluginInterfaceDefinitionImpUid 0x101F87F9 + +#include + +// __________________________________________________________________________ +// Exported proxy for instantiation method resolution +// Use the plugin UID and Implementation factory method +// as a pair for ECom instantiation. +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KCScreensaverPluginInterfaceDefinitionImpUid, CBmpAnimScrPlugin::NewL) + }; + +// Give the table to the caller +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimIniData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimIniData.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,472 @@ +/* +* Copyright (c) 2003 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: Bitmap animator INI file handler +* +*/ + + + + + +#include "CBmpAnimIniData.h" + +#include +#include + +// Default directory to look for INI file +_LIT(KIniFileDir,"C:\\private\\100056cf\\"); + +const TInt KTokenSize=32; + +#ifdef _DEBUG +// Debugging aids +enum TIniPanic + { + ESectionNameTooBig, + EKeyNameTooBig, + }; + +void Panic(TIniPanic aPanic) + { + _LIT(CBmpAnimIniData,"CBmpAnimIniData"); + User::Panic(CBmpAnimIniData,aPanic); + } +#endif // _DEBUG + +// d'tor +CBmpAnimIniData::~CBmpAnimIniData() + { + delete (TText*)iPtr.Ptr(); + delete iToken; + delete iName; + } + + +// Public allocation method +CBmpAnimIniData* CBmpAnimIniData::NewL(const TDesC& aName) + { + CBmpAnimIniData* p=new(ELeave) CBmpAnimIniData; + CleanupStack::PushL(p); + p->ConstructL(aName); + CleanupStack::Pop(); + return p; + } + + +// Find a key's string) value regardless of section (wide) +TBool CBmpAnimIniData::FindVar(const TDesC8& aKeyName, TDes16& aResult) + { + TPtrC8 tmpRes; + if (!FindVar(aKeyName, tmpRes)) + { + return EFalse; + } + + // Copy the 8-bit result into the 16-bit descriptor + aResult.Copy(tmpRes); + return ETrue; + } + + +// Find a key's (string) value regardless of section +TBool CBmpAnimIniData::FindVar(const TDesC8& aKeyName, TPtrC8& aResult) + { + _LIT8(KDummySection, ""); + // Call with no section, so starts at beginning + if (FindVar(KDummySection, aKeyName, aResult)) + { + return ETrue; + } + else + { + return EFalse; + } + } + + +// Find a key's (string) value given a section name and a key name (wide) +TBool CBmpAnimIniData::FindVar(const TDesC8& aSectName, + const TDesC8& aKeyName, + TDes16& aResult) + { + TPtrC8 tmpRes; + if (!FindVar(aSectName, aKeyName, tmpRes)) + { + return EFalse; + } + + // Copy the 8-bit result into the 16-bit descriptor + aResult.Copy(tmpRes); + return ETrue; + } + + +// Find a key's (string) value given a section name and a key name +TBool CBmpAnimIniData::FindVar(const TDesC8& aSectName, + const TDesC8& aKeyName, + TPtrC8& aResult) + { + __ASSERT_DEBUG(aSectName.Length() <= KTokenSize, Panic(ESectionNameTooBig)); + __ASSERT_DEBUG(aKeyName.Length() <= KTokenSize, Panic(EKeyNameTooBig)); + + TInt posStartOfSection(0); + TInt posEndOfSection(0); + TPtrC8 SearchBuf; + + // If we have a section, set pos to section start + if (aSectName.Length() > 0) + { + if (!FindSection(aSectName, posStartOfSection, posEndOfSection)) + { + return EFalse; + } + } + + // Look for key in ini file data Buffer + TInt posI = posStartOfSection; // Position in internal data Buffer + TBool FoundKey(EFalse); + while (!FoundKey) + { + // Search for next occurrence of aKeyName + SearchBuf.Set(iPtr.Mid(posI)); + TInt posSB = SearchBuf.Find(aKeyName); + + // If not found, return + if (posSB == KErrNotFound) + { + return EFalse; + } + + // Check this is at beginning of line (ie. non-commented) + // ie. Check preceding char was CR or LF + if(posSB > 0) + { + // Create a Buffer, starting one char before found subBuf + TPtrC8 CharBefore(SearchBuf.Right(SearchBuf.Length() - posSB + 1)); + // Check first char is end of prev + if(CharBefore[0] == '\n') + { + FoundKey = ETrue; + posI = posI + posSB; + } + else + { + posI = posI + posSB + 1; + } + } + else + { + FoundKey = ETrue; + } + + } // while (!FoundKey) + + // Set pos to just after '=' sign + SearchBuf.Set(iPtr.Mid(posI)); + TInt posSB = SearchBuf.Locate('='); + if (posSB == KErrNotFound) // Illegal format, should flag this... + { + return EFalse; + } + + // Identify start and end of data (EOL or EOF) + posI = posI + posSB + 1; // 1 char after '=' + TInt posValStart = posI; + TInt posValEnd; + SearchBuf.Set(iPtr.Mid(posI)); + posSB = SearchBuf.Locate('\r'); + if (posSB != KErrNotFound) + { + posValEnd = posI + posSB; + } + else + { + posValEnd = iPtr.Length(); + } + + // Check we are still in the section requested + if (aSectName.Length() > 0) + { + if (posValEnd > posEndOfSection) + { + return EFalse; + } + } + + // Parse Buffer from posn of key + // Start one space after '=' + TLex8 lex(iPtr.Mid(posValStart, posValEnd - posValStart)); + lex.SkipSpaceAndMark(); // Should be at the start of the data + aResult.Set(lex.MarkedToken().Ptr(), + posValEnd - posValStart - lex.Offset()); + + return ETrue; + } + + +// Find integer value regardless of section +TBool CBmpAnimIniData::FindVar(const TDesC8& aKeyName, TInt& aResult) + { + TPtrC8 ptr(NULL, 0); + if (FindVar(aKeyName, ptr)) + { + TLex8 lex(ptr); + if (lex.Val(aResult) == KErrNone) + { + return ETrue; + } + } + return EFalse; + } + + +// Find integer value within a given section +TBool CBmpAnimIniData::FindVar( + const TDesC8& aSection, const TDesC8& aKeyName, TInt& aResult) + { + TPtrC8 ptr(NULL, 0); + if (FindVar(aSection, aKeyName, ptr)) + { + TLex8 lex(ptr); + if (lex.Val(aResult) == KErrNone) + { + return ETrue; + } + } + return EFalse; + } + + +// Write integer value in given section +TInt CBmpAnimIniData::WriteVarL( + const TDesC8& aSection, const TDesC8& aKeyName, TInt aValue) + { + TBuf8<32> buf; + buf.Num(aValue); + return WriteVarL(aSection, aKeyName, buf); + } + + +// Write string value in given section +TInt CBmpAnimIniData::WriteVarL( + const TDesC8& aSection, const TDesC8& aKeyName, const TDesC8& aValue) + { + // First find the variable - this gives us a descriptor into the + // ini data giving the bound of the item that has to be replaced + TPtrC8 ptr; + TInt pos; + TBool found = FindVar(aSection, aKeyName, ptr); + + HBufC8* text = HBufC8::NewLC( + aSection.Length() + aKeyName.Length() + aValue.Length() + 7); // +7 for '=', '[', ']' and 2*cr+lf. + TPtr8 textp = text->Des(); + + if (found) + { + pos = ptr.Ptr() - iPtr.Ptr(); + textp.Append(aValue); + } + else + { + TInt posStartOfSection = 0; + TInt posEndOfSection = 0; + + if (FindSection(aSection, posStartOfSection, posEndOfSection)) + { + pos = posEndOfSection; + } + else + { + pos = iPtr.Length(); + textp.Append('['); + textp.Append(aSection); + textp.Append(']'); + textp.Append('\r'); + textp.Append('\n'); + } + textp.Append(aKeyName); + textp.Append('='); + textp.Append(aValue); + textp.Append('\r'); + textp.Append('\n'); + } + + TInt size = (iPtr.Length() + textp.Length() - ptr.Length()) * sizeof(TText8); + + if (size > iPtr.MaxLength()) + { + TText8* newdata = (TText8*) User::ReAllocL((TUint8*)iPtr.Ptr(), size); + iPtr.Set(newdata, iPtr.Length(), size/sizeof(TText8)); + } + + iPtr.Replace(pos, ptr.Length(), textp); + + CleanupStack::PopAndDestroy(text); + + return KErrNone; + } + + +// Commits the changes in variables, ie writes the file data (held in iPtr) +// into the actual disk file +void CBmpAnimIniData::CommitL() + { + TAutoClose fs; + User::LeaveIfError(fs.iObj.Connect()); + fs.PushL(); + + // Just replace the file with the data, no seeking necessary + TAutoClose file; + file.iObj.Replace(fs.iObj, *iName, EFileStreamText|EFileWrite); + file.PushL(); + + TPtrC8 ptrc8((TUint8*)iPtr.Ptr(), iPtr.Size()); + User::LeaveIfError(file.iObj.Write(ptrc8)); + + file.Pop(); + fs.Pop(); + } + + +// --- protected --- + +// c'tor +CBmpAnimIniData::CBmpAnimIniData() +: iPtr(NULL, 0) + { + __DECLARE_NAME(_S("CBmpAnimIniData")); + } + + +// Allocate a buffer and Read file's contents into iPtr +void CBmpAnimIniData::ConstructL(const TDesC& aName) + { + // Allocate space for token + iToken = HBufC8::NewL(KTokenSize + 2); // 2 extra chars for [tokenName] + + // Connect to file server + TAutoClose fs; + User::LeaveIfError(fs.iObj.Connect()); + fs.PushL(); + + // Find file, given name + TFindFile ff(fs.iObj); + TAutoClose file; + TInt err = ff.FindByDir(aName, KIniFileDir); + + // If found - cool, use the found file's name and open it + if (err == KErrNone) + { + iName = ff.File().AllocL(); + err = file.iObj.Open(fs.iObj, *iName, EFileStreamText | EFileRead); + } + + // If not found - create the file using the given name + if (err == KErrNotFound) + { + err = file.iObj.Create(fs.iObj, aName, EFileStreamText); + iName = aName.AllocL(); + } + + file.PushL(); + + // Get file size and read in as 8-bit data + TInt size = 0; + User::LeaveIfError(file.iObj.Size(size)); + TText8* data = (TText8*) User::AllocL(size); + iPtr.Set(data, size, size); + TPtr8 dest((TUint8*)data, 0, size); + User::LeaveIfError(file.iObj.Read(dest)); + + file.Pop(); + fs.Pop(); + } + + +// --- private --- + + +// Find a section in the INIfile +TBool CBmpAnimIniData::FindSection( + const TDesC8& aSection, TInt& aStart, TInt& aEnd) + { + TInt posI = 0; // Position in internal databuffer + TBool FoundSection = EFalse; + TPtrC8 SearchBuf; + + while (!FoundSection) + { + // Move search buffer to next area of interest + SearchBuf.Set(iPtr.Mid(posI)); + + // Make up token "[SECTIONNAME]", to search for + TPtr8 sectionToken = iToken->Des(); + _LIT8(sectionTokenFmtString,"[%S]"); + sectionToken.Format(sectionTokenFmtString, &aSection); + + // Search for next occurrence of aSection + TInt posSB = SearchBuf.Find(sectionToken); + + // If not found, return + if (posSB == KErrNotFound) + { + return EFalse; + } + + // Check this is at beginning of line (ie. non-commented) + // ie. Check preceding char was LF + if (posSB > 0) + { + // Create a Buffer, starting one char before found subBuf + TPtrC8 CharBefore(SearchBuf.Right(SearchBuf.Length() - posSB + 1)); + // Check first char is end of prev + if (CharBefore[0] == '\n') + { + FoundSection = ETrue; // found + posI = posI + posSB; + } + else + { + posI = posI + posSB + 1; // try again + } + } + else + { + FoundSection = ETrue; + } + + } // while (!FoundSection) + + // Set start of section, after section name, (incl '[' and ']') + aStart = posI + aSection.Length() + 2; + + // Set end of section, by finding begin of next section or end + SearchBuf.Set(iPtr.Mid(posI)); + + _LIT8(nextSectionBuf,"\n["); + + TInt posSB = SearchBuf.Find(nextSectionBuf); + if (posSB != KErrNotFound) + { + aEnd = posI + posSB + 1; + } + else + { + aEnd = iPtr.Length(); + } + + return ETrue; + } + +// EOF diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimItem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimItem.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2003 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: Stores a single bitmap animation item: image with its +* properties (position, timing et al) +* +*/ + + + + + +// INCLUDES +#include +#include +#include + +#include "CBmpAnimItem.h" + +// default 0.20 secs +const TInt KDefaultTiming = 200000; + +// Public constructor, doesn't need a two-phase construction +CBmpAnimItem::CBmpAnimItem() + : iFlags(BAIF_OWNSICON), + iTiming(KDefaultTiming), + iPosition(TPoint(0, 0)) + { + } + + +// Destructor +CBmpAnimItem::~CBmpAnimItem() + { + if (Flags() & BAIF_OWNSICON) + { + delete iIcon; + } + } + + +// Set icon. If owned, an icon is deleted by the item +void CBmpAnimItem::SetIcon( + CGulIcon* aIcon, + TBool aItemOwnsIcon /*= ETrue */) + { + // Get rid of old icon, if any and if owned + if ((iIcon) && (Flags() & BAIF_OWNSICON)) + { + delete iIcon; + } + + iIcon = aIcon; + + if (aItemOwnsIcon) + { + iFlags |= BAIF_OWNSICON; + } + else + { + iFlags &= ~BAIF_OWNSICON; + } + } + + +// Set icon from bitmaps. If owned, an icon is deleted by the item +void CBmpAnimItem::SetIconL( + CFbsBitmap* aBitmap, + CFbsBitmap* aMask /* = NULL */, + TBool aItemOwnsIcon /* = ETrue */) + { + // Create a new icon + CGulIcon* icon = CGulIcon::NewL(); + + // Plug the bitmaps in + icon->SetBitmap(aBitmap); + icon->SetMask(aMask); + + // Does icon own bitmaps? + icon->SetBitmapsOwnedExternally(!aItemOwnsIcon); + + // Store the newly created icon + SetIcon(icon, aItemOwnsIcon); + } +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimModel.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,170 @@ +/* +* Copyright (c) 2003 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: Takes care of storing and serving the bitmaps +* to be animated along with their properties +* +*/ + + + + + +#include "CBmpAnimModel.h" + + +// C'tor +CBmpAnimModel::CBmpAnimModel() + { + } + + +// D'tor +CBmpAnimModel::~CBmpAnimModel() + { + // Delete item array + if (iItems) + { + iItems->ResetAndDestroy(); + } + delete iItems; + } + + +// Two-phase constructor, initialises member arrays and stuff +void CBmpAnimModel::ConstructL(CBmpAnimSettings* aSettings) + { + // Create item array + iItems = new(ELeave) CArrayPtrFlat( + KBmpAnimItemArrayGranularity); + + iSettings = aSettings; + } + + +// Number of items query +TInt CBmpAnimModel::NumberOfItems() const + { + return iItems ? iItems->Count() : 0; + } + + +// Add an item to the end of the array +void CBmpAnimModel::AppendItemL(CBmpAnimItem* aItem) + { + // Sanity check + if (!iItems) + { + ASSERT(EFalse); + return; + } + + // Stash it in + iItems->AppendL(aItem); + } + + +// Insert an item at . Space must be reserved. +void CBmpAnimModel::InsertItemL(TInt aIndex, CBmpAnimItem* aItem) + { + if ((iItems) && (aIndex >= 0) && (aIndex <= NumberOfItems())) + { + // Squeeze it in + iItems->InsertL(aIndex, aItem); + } + else + { + ASSERT(EFalse); + } + } + + +// Delete item at +void CBmpAnimModel::DeleteItemL(TInt aIndex) + { + if ((iItems) && (aIndex >= 0) && (aIndex <= NumberOfItems())) + { + // Grab hold of the item for deletion, remove from array + // and compress the array + CBmpAnimItem* ptr = iItems->At(aIndex); + iItems->Delete(aIndex); + delete ptr; + iItems->Compress(); + } + else + { + ASSERT(EFalse); + } + } + + +// Delete all Items +void CBmpAnimModel::DeleteAll() + { + if (iItems) + { + iItems->ResetAndDestroy(); + } + } + + +// Get item at position +CBmpAnimItem* CBmpAnimModel::ItemAt(TInt aIndex) const + { + if ((iItems) && (aIndex >= 0) && (aIndex < NumberOfItems())) + { + return iItems->At(aIndex); + } + else + { + return NULL; + } + } + + +// Get next item in animation sequence. Returns NULL at the end of the +// sequence (or if there are no items at all), and wraps around to the +// beginning, so that next call again returns an item. +CBmpAnimItem* CBmpAnimModel::NextItem(TBool& aWrapped) + { + CBmpAnimItem* pItem = ItemAt(iCurrentItem++); + + if (pItem) + { + aWrapped = EFalse; + } + else + { + // Apparently there are no more items - wrap around and set indicator + iCurrentItem = 0; + aWrapped = ETrue; + + pItem = ItemAt(iCurrentItem++); + } + + return pItem; + } + + +// Reserve space for Items +void CBmpAnimModel::SetReserveL(TInt aCount) + { + if ((iItems) && (aCount >= NumberOfItems())) + { + iItems->SetReserveL(aCount); + } + } + + +// --- private functions --- +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimScrPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimScrPlugin.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,1073 @@ +/* +* Copyright (c) 2003 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: Main code file for plugin +* +*/ + + + +#include +#include +#include +#include +#include +#include + +#include "CBmpAnimScrPlugin.h" +#include "BmpAnimUtils.h" + +#include +#include +// "BmpAnimScrPlugin.rsg" + +const TInt KDefaultViewTime = 1000000; + +// +// CBmpAnimSrcPlugin +// + +// Creates and returns a new instance of CBmpAnimScrPlugin +CBmpAnimScrPlugin* CBmpAnimScrPlugin::NewL() + { + CBmpAnimScrPlugin *plugin = new (ELeave) CBmpAnimScrPlugin(); + + // Initialize settings object so that the plugin name can be retrieved + iSettings = CBmpAnimSettings::NewL(); + + return plugin; + } + + +// Default constructor +CBmpAnimScrPlugin::CBmpAnimScrPlugin() + : iState(EPluginStateLoading), + iStopDisplaying(EFalse), + iLoadedAnimation(ENone) + { + BMALOGGER_CREATE; + + } + + +// Destructor +CBmpAnimScrPlugin::~CBmpAnimScrPlugin() + { + delete iModel; + delete iSettings; + + StopDisplayTimer(); + delete iDisplayTimer; + + BMALOGGER_DELETE; + } + + +// --- from Screensaverplugin --- + + +// Initialization function. Must be called before anything but +// name query can be done +TInt CBmpAnimScrPlugin::InitializeL(MScreensaverPluginHost *aHost) + { + ASSERT(aHost); + + // Sanity check + if (!aHost) + { + return KErrArgument; + } + + // Save the host interface + iHost = aHost; + + // Start state + iState = EPluginStateLoading; + + // Initial timing (may be overridden by settings) + iHost->SetRefreshTimerValue(KDefaultViewTime); + + // Lie that we'll show indicators so that host does not prevent + // plugin to be run if there are any to show. We'll stop after a + // while anyway and the indicators are shown by normal Screensaver + iHost->OverrideStandardIndicators(); + + // Grab hold of the environment (this could be in the plugin host interface) + iEikEnv = CEikonEnv::Static(); + + // Create the model to store the animation in + iModel = new(ELeave) CBmpAnimModel(); + iModel->ConstructL(iSettings); + + // Get screen info + UpdateDisplayInfo(); + + // Load the animation (Reload figures out which graphics should be used) + ReloadAnimationL(); + + // Create display timer + iDisplayTimer = CPeriodic::NewL(CActive::EPriorityStandard); + + return KErrNone; + } + + +// Draw function being called repeatedly by the host +TInt CBmpAnimScrPlugin::Draw(CWindowGc& aGc) + { + // If initializing, start the timer and move on to animation state + if (iState == EPluginStateInitializing) + { + BMALOGGER_WRITE("First draw, initializing"); + + StartDisplayTimer(); + HandlePluginState(); + SetDisplayMode(); + TInt nLights = iModel->Settings()->Lights(); + + if (nLights > 0) + { + Lights(nLights); + } + + // Make sure the animation sequence starts from the beginning + iModel->SetCurrentItemIndex(0); + } + + // Retrieve the next image in sequence + TBool endOfSequence = EFalse; + CBmpAnimItem* pItem = iModel->NextItem(endOfSequence); + + if ((endOfSequence) || (!pItem)) + { + // End of sequence reached, see if we've shown enough (1 minute) + if (iStopDisplaying) + { + // Stop the timer + StopDisplayTimer(); + + // Back to square 1 + iState = EPluginStateInitializing; + + // Set a lower refresh rate while plugin is suspended. + // This allows the Screensaver to stop Window Server heartbeat + // and the system is able to sleep normally + // NOTE: Not needed anymore, Screensaver now shuts down + // WSERV heartbeat for suspended plugins + // iHost->SetRefreshTimerValue(KDefaultViewTime); + + TInt suspendTime = iModel->Settings()->SuspendTime(); + + BMALOGGER_WRITEF(_L("BMA: Done drawing, suspending for %d"), + suspendTime); + + iHost->Suspend(suspendTime); + + return KErrNone; + } + } + + if (pItem) + { + // Make sure the window is empty in case the bitmap doesn't + // fill the whole screen + aGc.Clear(); + + DrawCentered(aGc, pItem); + } + +// Activate code if centering INI-controllable +#if 0 + // Retrieve drawing information + CGulIcon* pIcon = pItem->Icon(); + TPoint position = pItem->Position(); + CFbsBitmap* bitmap = pIcon->Bitmap(); + CFbsBitmap* mask = pIcon->Mask(); + + // Draw the whole bitmap at position + TRect rect(position, bitmap->SizeInPixels()); + + if (mask) + { + // Looks like a real icon - draw masked + aGc.BitBltMasked(position, bitmap, rect, mask, ETrue); + } + else + { + // Just the bitmap - no masked draw + aGc.BitBlt(position, bitmap, rect); + } + + // Wait for the specified time until next image + // + // TODO: The new wk28 Screensaver crashes if the next call + // is uncommented. Maybe the timer is not stopped + // before starting again? Hmm... doesn't seem to happen + // anymore. I wonder what changed. Anyway, I'll have it + // commented out for the time being, in order to control + // all frames' rate with the single setting + // + // NOTE: There was a flaw in Screensaver where it would try to + // start refresh timer twice, if plugin changes the value during + // the first draw. The fix is released for 2.6_wk40_FB4 + // iHost->SetRefreshTimerValue(pItem->Timing()); + } +/* + aGc.SetPenColor(TRgb(255,0,0)); + aGc.SetPenStyle(CGraphicsContext::ESolidPen); + aGc.DrawRect(TRect(30, 30, 100, 100)); + + aGc.SetPenColor(TRgb(255,0,0)); + aGc.SetPenSize(TSize(3,3)); + aGc.DrawRect(TRect(120, 100, 200, 150)); +*/ +#endif + return KErrNone; + } + + +// Return the name of the plugin +const TDesC16& CBmpAnimScrPlugin::Name() const + { + if (iSettings) + { + return iSettings->PluginName(); + } + + return KPluginName; + } + + +// Handles events sent by the screensaver +TInt CBmpAnimScrPlugin::HandleScreensaverEventL( + TScreensaverEvent aEvent, + TAny* /* aData */) + { + switch (aEvent) + { + case EScreensaverEventStarting: + BMALOGGER_WRITE("Start event"); + break; + case EScreensaverEventStopping: + BMALOGGER_WRITE("Stop event"); + StopDisplayTimer(); + iState = EPluginStateInitializing; + break; + case EScreensaverEventDisplayChanged: + BMALOGGER_WRITE("Display changed event"); + // Grab current screen info + UpdateDisplayInfo(); + // Reload animation, if needed + ReloadAnimationL(); + break; + default: + break; + } + + return KErrNone; + } + + +// Return plugin capabilities (configurable) +TInt CBmpAnimScrPlugin::Capabilities() + { + return EScpCapsConfigure; + } + + +// Perform a plugin function +TInt CBmpAnimScrPlugin::PluginFunction(TScPluginCaps aFunction, TAny* aParam) + { + switch (aFunction) + { + case EScpCapsConfigure: + { + TRAPD(err, err = ConfigureL(aParam)); + return err; + } + break; + default: + return KErrNotSupported; + break; + } + } + + +// --- private functions --- + +// Draws centered items +void CBmpAnimScrPlugin::DrawCentered(CWindowGc& aGc, CBmpAnimItem* aItem) + { + CGulIcon* pIcon = aItem->Icon(); + CFbsBitmap* bitmap = pIcon->Bitmap(); + CFbsBitmap* mask = pIcon->Mask(); + + 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 + if (mask) + { + // Looks like a real icon - draw masked + aGc.BitBltMasked(pos, bitmap, rectToDraw, mask, ETrue); + } + else + { + // Just the bitmap - no masked draw + aGc.BitBlt(pos, bitmap, rectToDraw); + } + } + + +// Loads the animation into the model +void CBmpAnimScrPlugin::LoadAnimationL(TBool aLandscape, TBool aRotate) + { + // Rotated landscape not supported + ASSERT(!(aLandscape && aRotate)); + + // Start by getting rid of a possible loaded animation + iModel->DeleteAll(); + + // Bitmap index. If negative, loading is finished. + TInt nIndex = KMifIdFirst; + + TFileName fileName; + + if (aLandscape) + { + fileName = iModel->Settings()->BitmapFilenameLandscape(); + } + else + { + fileName = iModel->Settings()->BitmapFilename(); + } + + BMALOGGER_WRITEF(_L("BMA: Loading from: %S"), &(fileName)); + + while (nIndex > 0) + { + CFbsBitmap* pBmp = NULL; + + TRAPD(err, pBmp = AknIconUtils::CreateIconL(fileName, nIndex)); + + if ((pBmp) && (err == KErrNone)) + { + // Got bitmap, push and set size + CleanupStack::PushL(pBmp); + TInt scaleErr = ScaleBitmap(pBmp, aRotate); + if (scaleErr == KErrNone) + { + // Create an item with the bitmap and store it in the model + CBmpAnimItem* pItem = new(ELeave) CBmpAnimItem(); + CleanupStack::PushL(pItem); + + pItem->SetIconL(pBmp); + iModel->AppendItemL(pItem); + + CleanupStack::Pop(2); // pBmp, pItem + + BMALOGGER_WRITEF(_L("BMA: Loaded bmp %d"), nIndex); + + // Try loading next bitmap (skip mask IDs) + nIndex += 2; + } + else + { + BMALOGGER_WRITEF(_L("BMA: Bmp %d scale err %d"), + nIndex, scaleErr); + + // Apparently SVG icon was not found, this is not caught + // in CreateIconL(). Assume last image was loaded. + CleanupStack::PopAndDestroy(); // pBmp + nIndex = -1; + } + } + else + { + // Loading failed - maybe reached end of bitmaps + nIndex = -1; + + BMALOGGER_WRITEF(_L("BMA: Bmp load failed: %d"), err); + } + } + + // Save the type of loaded animation + if (aLandscape) + { + iLoadedAnimation = ELandscape; + } + else if (aRotate) + { + iLoadedAnimation = EPortraitRotated; + } + else + { + iLoadedAnimation = EPortrait; + } + + // On to next state + HandlePluginState(); + + // Start animating, when appropriate + iHost->SetRefreshTimerValue(iModel->Settings()->Timing()); + + BMALOGGER_WRITE("BMA: Animation loaded"); + } + + +// Re-loads the animation into the model, if needed +void CBmpAnimScrPlugin::ReloadAnimationL() + { + // Check if the correct graphics are already loaded + if (!ReloadNeeded()) + { + // Done! That was easy :) + return; + } + + // Load correct graphics + LoadAnimationL(LoadLandscape(), RotateNeeded()); + } + + +// Starts the display timer +void CBmpAnimScrPlugin::StartDisplayTimer() + { + ASSERT(iDisplayTimer); + + TInt time = iModel->Settings()->RunningTime(); + + BMALOGGER_WRITEF(_L("BMA: Start display timer for %d"), time); + + iStopDisplaying = EFalse; + iDisplayTimer->Start( + time, + time, + TCallBack(DisplayTimerCallback, this)); + } + + +// Stops the display timer +void CBmpAnimScrPlugin::StopDisplayTimer() + { + BMALOGGER_WRITE("BMA: Stop display timer"); + + if (iDisplayTimer) + { + iDisplayTimer->Cancel(); + } + + iStopDisplaying = EFalse; + } + + +// Display timer callback - sets animation stop flag +TInt CBmpAnimScrPlugin::DisplayTimerCallback(TAny* aPtr) + { + BMALOGGER_WRITE("BMA: Display timer timeout"); + + CBmpAnimScrPlugin* _this = REINTERPRET_CAST(CBmpAnimScrPlugin*, aPtr); + _this->iStopDisplaying = ETrue; + return KErrNone; + } + + +// Changes the internal state flag +void CBmpAnimScrPlugin::HandlePluginState() + { + switch (iState) + { + case EPluginStateLoading: + iState = EPluginStateInitializing; + break; + case EPluginStateInitializing: + iState = EPluginStateAnimation; + break; + case EPluginStateAnimation: + break; + case EPluginStateStoppingAnimation: + iHost->SetRefreshTimerValue(KDefaultViewTime); + iState = EPluginStateInitializing; + break; + } + } + + +// Requests display mode from host +void CBmpAnimScrPlugin::SetDisplayMode() + { + if (!iHost) + { + return; + } + + // Exit partial mode + iHost->ExitPartialMode(); + } + + +void CBmpAnimScrPlugin::Lights(TInt aSecs) + { + BMALOGGER_WRITEF(_L("BMA: Request lights for %d secs"), aSecs); + iHost->RequestLights(aSecs); + } + + +// Configure the plugin +TInt CBmpAnimScrPlugin::ConfigureL(TAny* aParam) + { + if (!iSettings) + { + return KErrNotFound; + } + + // Grab the parameter (CEikonEnv in this case) + CEikonEnv* eikEnv = NULL; + + if (aParam) + { + // The host was kind enough to provide us with a param - use it + eikEnv = REINTERPRET_CAST(CEikonEnv*, aParam); + } + else if (iEikEnv) + { + // Use own env, if initialized + eikEnv = iEikEnv; + } + + TInt setting = iSettings->Lights(); + + CAknNumberQueryDialog* dlg = CAknNumberQueryDialog::NewL(setting); + CleanupStack::PushL(dlg); + _LIT(KPrompt, "Lights time (sec)"); + dlg->SetPromptL(KPrompt); + dlg->SetMinimumAndMaximum(0, 30); + CleanupStack::Pop(); + + if (dlg->ExecuteLD(R_AVKON_DIALOG_QUERY_VALUE_NUMBER)) + { + iSettings->SetLights(setting); + iSettings->SaveSettingsL(); + } + + // All was swell! + return KErrNone; + } + + +// Scale bitmap to screen size, set size of SVG bitmaps +TInt CBmpAnimScrPlugin::ScaleBitmap(CFbsBitmap* aBmp, TBool aRotate) + { + TInt ret = KErrNone; + + // SVG size always screen size + TSize size = iDi.iRect.Size(); + + if (!AknIconUtils::IsMifIcon(aBmp)) + { + // Bitmaps maintain their original size, unless scaling requested, in which + // case screen size is OK + if (!iSettings->ScaleBmps()) + { + // No scaling, use original size + size = aBmp->SizeInPixels(); + + if (aRotate) + { + // Lie the target size, otherwise IconUitls will think + // the image needs scaling (this won't work perfectly + // either, the image gets clipped a little :( + //size.SetSize(size.iHeight, size.iHeight); + + // Flip size for rotation + size.SetSize(size.iHeight, size.iWidth); + } + } + } + + if (aRotate) + { + // Set image to screen size and rotate 90 deg left (270 right) + // ret = SetSizeAndRotation(aBmp, size, 270); + ret = AknIconUtils::SetSizeAndRotation( + aBmp, size, EAspectRatioPreservedSlice, 270); + } + else + { + // Just set image to size + ret = AknIconUtils::SetSize(aBmp, size, EAspectRatioPreserved); + } + + return ret; + } + + +// Returns ETrue if reload of the animation is needed +TBool CBmpAnimScrPlugin::ReloadNeeded() + { + // Assume reload needed + TBool needed = ETrue; + + switch (iLoadedAnimation) + { + case EPortrait: + // No reload if display portrait + if (!DisplayIsLandscape()) + { + needed = EFalse; + } + break; + + case ELandscape: + case EPortraitRotated: + // No reload if display landscape + if (DisplayIsLandscape()) + { + needed = EFalse; + } + break; + + case ENone: + default: + // Reload + break; + } + + return needed; + } + + +// Returns ETrue if display in landscape +TBool CBmpAnimScrPlugin::DisplayIsLandscape() + { + // Should actually check the rotation and stuff, but what the hey... + return (iDi.iRect.Width() > iDi.iRect.Height()); + } + + +// Returns ETrue if graphics should be rotated +TBool CBmpAnimScrPlugin::RotateNeeded() + { + // Rotate needed, if only portrait graphics are used, and + // display is landscape + return ((!iSettings->UseLandscape()) && (DisplayIsLandscape())); + } + + +// Returns ETrue if landscape graphics should be loaded +TBool CBmpAnimScrPlugin::LoadLandscape() + { + // Landscape, if only available and display is landscape + return ((iSettings->UseLandscape()) && (DisplayIsLandscape())); + } + + +// Updates the saved information about display +void CBmpAnimScrPlugin::UpdateDisplayInfo() + { + iDi.iSize = sizeof(TScreensaverDisplayInfo); + iHost->DisplayInfo(&iDi); + } + +#if 0 +// Rotates and scales a source bitmap into target bitmap (non-leaving wrapper) +TInt CBmpAnimScrPlugin::SetSizeAndRotation( + CFbsBitmap* aBmp, TSize aSize, TInt aAngle) + { + // Anything to do? + if ((aBmp) && (aBmp->SizeInPixels() == aSize) && ((aAngle % 360) == 0)) + { + // Duh, the bitmap is already as requested + return KErrNone; + } + + // Call the actual workhorse + TRAPD(err, SetSizeAndRotationL(aBmp, aSize, aAngle)); + + return err; + } + + +// Rotates and scales a source bitmap into target bitmap (leaving version) +void CBmpAnimScrPlugin::SetSizeAndRotationL( + CFbsBitmap* aBmp, TSize aSize, TInt aAngle) + { + // Make a copy of the source bitmap, and use the original source as target + CFbsBitmap* tmpBmp = new (ELeave) CFbsBitmap; + CleanupStack::PushL(tmpBmp); + + User::LeaveIfError(tmpBmp->Duplicate(aBmp->Handle())); + + // Discard original bitmap + aBmp->Reset(); + + // Create new target bitmap in the original object + User::LeaveIfError(aBmp->Create(aSize, tmpBmp->DisplayMode())); + + // Let the workhorse do its work + RotateAndScaleBitmapL(TRect(aSize), aBmp, tmpBmp, aAngle); + + // Not interested in original anymore + CleanupStack::PopAndDestroy(tmpBmp); + } + + +// Rotates and scales a source bitmap into target bitmap +void CBmpAnimScrPlugin::RotateAndScaleBitmapL( + const TRect& aTrgRect, + CFbsBitmap* aTrgBitmap, + CFbsBitmap* aSrcBitmap, + TInt aAngle) + { + aAngle = aAngle % 360; + if (aAngle < 0) + { + aAngle+=360; + } + + if (!aSrcBitmap) User::Leave(KErrArgument); + if (!aTrgBitmap) User::Leave(KErrArgument); + if (aSrcBitmap->DisplayMode() != aTrgBitmap->DisplayMode()) + User::Leave(KErrArgument); + + TSize trgBitmapSize = aTrgBitmap->SizeInPixels(); + if ((trgBitmapSize.iHeight < aTrgRect.iBr.iY) || + (trgBitmapSize.iWidth < aTrgRect.iBr.iX)) + { + User::Leave(KErrArgument); + } + + if (aTrgRect.IsEmpty()) + return; + + TSize srcSize = aSrcBitmap->SizeInPixels(); + + TInt centerX = srcSize.iWidth / 2; + TInt centerY = srcSize.iHeight / 2; + + TInt trgWidth = aTrgRect.Width(); + TInt trgHeight = aTrgRect.Height(); + + TInt scalefactor = 65536; + TInt xscalefactor = (srcSize.iWidth << 16) / trgWidth; + TInt yscalefactor = (srcSize.iHeight << 16) / trgHeight; + + // Check if rotating 90 left or right, no need to scale + if (((aAngle == 270) || (aAngle == 90)) && + (srcSize.iWidth == trgHeight) && + (srcSize.iHeight == trgWidth)) + { + scalefactor = 65535; + } + else + { + if (xscalefactor < yscalefactor) + { + scalefactor = yscalefactor; + } + else + { + scalefactor = xscalefactor; + } + } + + TBool srcTemporary = EFalse; + TBool hardMask = EFalse; + if (aSrcBitmap->IsRomBitmap()) + { + srcTemporary = ETrue; + } + if (aSrcBitmap->IsCompressedInRAM()) + { + srcTemporary = ETrue; + } + + TBool fallbackOnly = EFalse; + TDisplayMode displayMode = aSrcBitmap->DisplayMode(); + TUint8 fillColor = 0; + + switch(displayMode) + { + case EGray2: + srcTemporary = ETrue; + hardMask = ETrue; + fillColor = 0xff; // white + break; + case EGray4: + case EGray16: + case EColor16: + case EColor16M: + case ERgb: + fallbackOnly = ETrue; + break; + case EColor256: + fillColor = 0xff; // should be black in our indexed palette.... + case EGray256: + case EColor4K: + case EColor64K: + + case EColor16MU: + // These are the supported modes + break; + default: + fallbackOnly = ETrue; + } + + if (fallbackOnly) + { + // Color mode not supported + User::Leave(KErrNotSupported); + } + + CFbsBitmap* realSource = aSrcBitmap; + CFbsBitmap* realTarget = aTrgBitmap; + if (srcTemporary) + { + realSource = new (ELeave) CFbsBitmap(); + CleanupStack::PushL(realSource); + if (hardMask) + { + realTarget = new (ELeave) CFbsBitmap(); + CleanupStack::PushL(realTarget); + User::LeaveIfError(realSource->Create(srcSize, EGray256)); + displayMode = EGray256; + User::LeaveIfError(realTarget->Create( + aTrgBitmap->SizeInPixels(), EGray256)); + } + else + { + User::LeaveIfError(realSource->Create( + srcSize, aSrcBitmap->DisplayMode())); + } + + CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(realSource); + CleanupStack::PushL(dev); + CFbsBitGc* gc = NULL; + User::LeaveIfError(dev->CreateContext(gc)); + CleanupStack::PushL(gc); + gc->BitBlt(TPoint(0,0), aSrcBitmap); + CleanupStack::PopAndDestroy(2); // dev, gc + } + + // Heap lock for FBServ large chunk is only needed with large bitmaps. + if (realSource->IsLargeBitmap() || realTarget->IsLargeBitmap()) + { + realTarget->LockHeapLC(ETrue); // fbsheaplock + } + else + { + // Bogus push so we can pop() anyway + CleanupStack::PushL((TAny*)NULL); + } + + TUint32* srcAddress = realSource->DataAddress(); + TUint32* trgAddress = realTarget->DataAddress(); + + TReal realsin; + TReal realcos; + TInt sin; + TInt cos; + + User::LeaveIfError(Math::Sin(realsin, ((2*KPi)/360) * aAngle)); + User::LeaveIfError(Math::Cos(realcos, ((2*KPi)/360) * aAngle)); + + sin = ((TInt)(realsin * scalefactor)); + cos = ((TInt)(realcos * scalefactor)); + + TInt xx = ((trgWidth)/2) - ((srcSize.iWidth/2) - centerX); + TInt yy = ((trgHeight)/2) - ((srcSize.iHeight/2) - centerY); + + TInt x = 0; + TInt y = 0; + TInt u = 0; + TInt v = 0; + + if( (displayMode==EGray256) || (displayMode==EColor256) ) + { + TInt srcScanLen8 = CFbsBitmap::ScanLineLength( + srcSize.iWidth, displayMode); + TInt trgScanLen8 = CFbsBitmap::ScanLineLength( + trgBitmapSize.iWidth, displayMode); + TUint8* srcAddr8 = reinterpret_cast(srcAddress); + TUint8* trgAddr8 = reinterpret_cast(trgAddress); + + // skip left and top margins in the beginning + trgAddr8 += trgScanLen8 * aTrgRect.iTl.iY + aTrgRect.iTl.iX; + + for (y = 0; y < trgHeight; y++) + { + u = (-xx) * cos + (y-yy) * sin + (centerX<<16); + v = (y-yy) * cos - (-xx) * sin + (centerY<<16); + for (x = 0; x < trgWidth; x++) + { + if (((u>>16)>=srcSize.iWidth) || + ((v>>16)>=srcSize.iHeight) || + ((u>>16)<0) || + ((v>>16)<0)) + { + *trgAddr8++ = fillColor; + } + else + { + *trgAddr8++ = srcAddr8[(u>>16)+(((v>>16))*srcScanLen8)]; + } + u += cos; + v -= sin; + } + trgAddr8 += trgScanLen8 - trgWidth; + } + } + else if( displayMode == EColor64K || displayMode == EColor4K) + { + TInt srcScanLen16 = CFbsBitmap::ScanLineLength( + srcSize.iWidth, displayMode) / 2; + TInt trgScanLen16 = CFbsBitmap::ScanLineLength( + trgBitmapSize.iWidth, displayMode) / 2; + TUint16* srcAddr16 = reinterpret_cast(srcAddress); + TUint16* trgAddr16 = reinterpret_cast(trgAddress); + + // skip left and top margins in the beginning + trgAddr16 += trgScanLen16 * aTrgRect.iTl.iY + aTrgRect.iTl.iX; + + for (y = 0; y < trgHeight; y++) + { + u = (-xx) * cos + (y-yy) * sin + (centerX<<16); + v = (y-yy) * cos - (-xx) * sin + (centerY<<16); + for (x = 0; x < trgWidth; x++) + { + if (((u>>16)>=srcSize.iWidth) || + ((v>>16)>=srcSize.iHeight) || + ((u>>16)<0) || + ((v>>16)<0)) + { + *trgAddr16++ = 0; + } + else + { + *trgAddr16++ = + srcAddr16[(u>>16)+(((v>>16))*srcScanLen16)]; + } + u += cos; + v -= sin; + } + trgAddr16 += trgScanLen16 - trgWidth; + } + } + else if(displayMode == EColor16MU) + { + TInt srcScanLen32 = CFbsBitmap::ScanLineLength( + srcSize.iWidth, displayMode) / 4; + TInt trgScanLen32 = CFbsBitmap::ScanLineLength( + trgBitmapSize.iWidth, displayMode) / 4; + TUint32* srcAddr32 = srcAddress; + TUint32* trgAddr32 = trgAddress; + + // skip left and top margins in the beginning + trgAddr32 += trgScanLen32 * aTrgRect.iTl.iY + aTrgRect.iTl.iX; + + for (y = 0; y < trgHeight; y++) + { + u = (-xx) * cos + (y-yy) * sin + (centerX<<16); + v = (y-yy) * cos - (-xx) * sin + (centerY<<16); + for (x = 0; x < trgWidth; x++) + { + if (((u>>16)>=srcSize.iWidth) || + ((v>>16)>=srcSize.iHeight) || + ((u>>16)<0) || + ((v>>16)<0)) + { + *trgAddr32++ = 0; + } + else + { + *trgAddr32++ = + srcAddr32[(u>>16)+(((v>>16))*srcScanLen32)]; + } + u += cos; + v -= sin; + } + trgAddr32 += trgScanLen32 - trgWidth; + } + } + else + { + // Display mode not supported - but this should've been caught + // already earlier + User::Leave(KErrUnknown); + } + + CleanupStack::PopAndDestroy(); // fbsheaplock + + if (srcTemporary) + { + if (hardMask) + { + CFbsBitmapDevice* dev = CFbsBitmapDevice::NewL(aTrgBitmap); + CleanupStack::PushL(dev); + CFbsBitGc* gc = NULL; + User::LeaveIfError(dev->CreateContext(gc)); + CleanupStack::PushL(gc); + gc->BitBlt(TPoint(0,0), realTarget); + CleanupStack::PopAndDestroy(3); // dev, gc, realtarget + } + CleanupStack::PopAndDestroy(); // realSource + } + } +#endif + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimSettings.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/src/CBmpAnimSettings.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,320 @@ +/* +* Copyright (c) 2003 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: Loads and stores the bitmap animator settings +* +*/ + + + + + +#include + +#include "CBmpAnimSettings.h" + +#include "BmpAnimUtils.h" +#include + +// Defaults +const TInt KRunningTime = 1000000 * 60; // 60 secs +const TInt KTiming = 200000; // 5 fps +const TInt KSuspendTime = -1; // Max = KMaxTInt, -1 = indefinitely +const TInt KUndefined = -1; + +// Configuration file name +_LIT(KIniFile, "BmpAnimScrPlugin.ini"); + +// Default bitmap file name +_LIT(KMbmFileName, "BmpAnimScrPlugin.mbm"); + +// Default bitmap file name - lansdscape +_LIT(KMbmFileNameL, "BmpAnimScrPluginL.mbm"); + +// Basic info section name +_LIT8(KIniSectionInfo, "info"); + +// Info section keys +_LIT8(KIniKeyName, "name"); // plugin name +_LIT8(KIniKeyNumImages, "numimages"); // number of images +_LIT8(KIniKeyMbmFile, "mbmfile"); // name of imagefile +_LIT8(KIniKeyMbmFileL, "mbmfilelandscape"); // name of landscape imagefile +_LIT8(KIniKeyRunningTime, "runningtime"); // time to run animation (in millis) +_LIT8(KIniKeyLoopCount, "loopcount"); // loop count (if time is not defined) +_LIT8(KIniKeySuspendTime, "suspendtime"); // time to suspend (in millis) +_LIT8(KIniKeyTiming, "timing"); // time to display each image (RE-USED BELOW) +_LIT8(KIniKeyLights, "lights"); // lights on for 5 secs. Over 5 = number of secs +_LIT8(KIniKeyUseLandscape, "uselandscape"); // 1 = landscape image file used +_LIT8(KIniKeyScaleBmps, "scalebmps"); // 1 = bitmaps scaled to screen size + +// Image section base name +_LIT8(KIniSectionImageBase, "image"); // image information section name + +// Image section keys +_LIT8(KIniKeyType, "type"); // 0 = background, 1 = bitmap, 2 = icon +_LIT8(KIniKeyIndex, "index"); // index of image in mbm +_LIT8(KIniKeyMaskIndex, "maskindex"); // index of icon mask in mbm +_LIT8(KIniKeyFile, "file"); // name of image file (not yet supported) +_LIT8(KIniKeyPosX, "posx"); // display position X +_LIT8(KIniKeyPosY, "posy"); // display position Y +// _LIT8(KIniKeyTiming, "timing"); // time to display this image (NOTE RE-USE!) + + +// User constructor +CBmpAnimSettings* CBmpAnimSettings::NewL() + { + CBmpAnimSettings* self = new(ELeave) CBmpAnimSettings(); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// C'tor, sets defaults +CBmpAnimSettings::CBmpAnimSettings() + : iRunningTime(KRunningTime), + iLoopCount(KUndefined), + iSuspendTime(KSuspendTime), + iTiming(KTiming), + iPluginName(KPluginName), + iMbmFileName(KMbmFileName), + iMbmFileNameL(KMbmFileNameL), + iLights(KUndefined), + iUseLandscape(0), + iScaleBmps(0) + { + } + + +// Two-phase constructor +void CBmpAnimSettings::ConstructL() + { + // Try to open the settings file + if (OpenSettings() == KErrNone) + { + LoadSettingsL(); + } + } + + +// D'tor +CBmpAnimSettings::~CBmpAnimSettings() + { + delete iIniData; + } + + +// --- Access functions --- + + +// Loads (common) settings from the settings file +TBool CBmpAnimSettings::LoadSettingsL() + { + // Sanity check + if (!iIniData) + { + return EFalse; + } + + // Running time (never mind the section) + if (!(iIniData->FindVar(KIniKeyRunningTime, iRunningTime))) + { + // Running time not found - try loop count + if (!(iIniData->FindVar(KIniKeyLoopCount, iLoopCount))) + { + // That's not there either - use default running time + iRunningTime = KRunningTime; + } + else + { + // Loop count found - running time is undefined + iRunningTime = KUndefined; + } + } + + // Suspend time + if (!(iIniData->FindVar(KIniKeySuspendTime, iSuspendTime))) + { + iSuspendTime = KSuspendTime; // TODO: KUndefined + } + + // Default timing (need to use section as well) + if (!(iIniData->FindVar( + KIniSectionInfo, + KIniKeyTiming, + iTiming))) + { + iTiming = KTiming; + } + + // Lights time + if (!(iIniData->FindVar(KIniKeyLights, iLights))) + { + iLights = KUndefined; + } + + // Use landscape + if (!(iIniData->FindVar(KIniKeyUseLandscape, iUseLandscape))) + { + iUseLandscape = 0; + } + + // Scale bmps + if (!(iIniData->FindVar(KIniKeyScaleBmps, iScaleBmps))) + { + iScaleBmps = 0; + } + + // Plugin name + iPluginName = KNullDesC; + if ((!(iIniData->FindVar(KIniKeyName, iPluginName))) || + (iPluginName.Length() <= 0)) + { + // Not found, or empty setting - use default + iPluginName = KPluginName; + } + + // Load BMP file names + LoadBitmapFileName(); + LoadBitmapFileName(ETrue); + + BMALOGGER_WRITEF(_L("BMA: Detected settings:")); + BMALOGGER_WRITEF(_L(" Name: %S"), &iPluginName); + BMALOGGER_WRITEF(_L(" Run for: %d"), RunningTime()); + BMALOGGER_WRITEF(_L(" Loops: %d"), LoopCount()); + BMALOGGER_WRITEF(_L(" Suspend: %d"), SuspendTime()); + BMALOGGER_WRITEF(_L(" Timing: %d"), Timing()); + BMALOGGER_WRITEF(_L(" Lights: %d"), Lights()); + BMALOGGER_WRITEF(_L(" Bitmap file: %S"), &iMbmFileName); + BMALOGGER_WRITEF(_L(" Lanscape bitmap file: %S"), &iMbmFileNameL); + BMALOGGER_WRITEF(_L(" Use landscape: %d"), UseLandscape()); + BMALOGGER_WRITEF(_L(" Scale bmps: %d"), ScaleBmps()); + BMALOGGER_WRITEF(_L("BMA: End settings")); + + return ETrue; + } + + +// Saves (common) settings +TBool CBmpAnimSettings::SaveSettingsL() + { + // Sanity check + if (!iIniData) + { + return EFalse; + } + + // Write lights + if (iIniData->WriteVarL( + KIniSectionInfo, KIniKeyLights, iLights) == KErrNone) + { + iIniData->CommitL(); + } + + return ETrue; + } + +// --- private --- + + +// Opens the settings file (initialises the settings reader) +TInt CBmpAnimSettings::OpenSettings() + { + // Locate the dll path + TFileName dllName; +// Dll::FileName(dllName); + dllName.Append(_L("\\resource\\plugins\\")); + + // Combine the dll path with the settings file name + TParse p; + p.SetNoWild(KIniFile, &dllName, NULL); + + BMALOGGER_WRITEF(_L("Searching INI: %S"), &(p.FullName())); + + // Try to open the INI file from plugin directory + TRAPD(err, iIniData = CBmpAnimIniData::NewL(p.FullName())); + + if (err != KErrNone) + { + BMALOGGER_WRITE("INI not in plugin dir, trying \\system\\data"); + // Try \system\data instead + TRAP(err, iIniData = CBmpAnimIniData::NewL(KIniFile)); + } + + if (err != KErrNone) + { + // Make sure the settings are not attempted to be used + delete iIniData; + iIniData = NULL; + BMALOGGER_WRITE("INI not found"); + } + else + { + BMALOGGER_WRITE("INI found"); + } + + return err; + } + + +// Gets the bitmap file name from settings, or uses default +void CBmpAnimSettings::LoadBitmapFileName(TBool aLandscape) + { + // Get the DLL path name. The path is used, if only a file name + // is specified. + TFileName dllName; + Dll::FileName(dllName); + + // Get whatever's in the settings + TFileName fileName; + TBool res = ETrue; + if (aLandscape) + { + res = iIniData->FindVar(KIniKeyMbmFileL, fileName); + } + else + { + res = iIniData->FindVar(KIniKeyMbmFile, fileName); + } + + if (!res) + { + // Not found - use the default name with the plugin directory + // there's really no need to do anything here (I think) + fileName = (_L("\\resource\\plugins\\")); + } + + // The combination order should be: + // 1. use whatever was defined in the settings (part or full path) + // 2. use the default name part + // 3. use the DLL path, if no path parts have yet been defined + TParse p; + if (p.SetNoWild(fileName, + aLandscape ? &KMbmFileNameL : &KMbmFileName, + &dllName) == KErrNone) + { + if (aLandscape) + { + iMbmFileNameL = p.FullName(); + } + else + { + iMbmFileName = p.FullName(); + } + } + } + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/animation.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/animation.mk Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,72 @@ +# +# Copyright (c) 2005 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: Bitmap animation plugin animation makefile +# + +include bitmaps.mk + +ifeq (WINS,$(findstring WINS, $(PLATFORM))) +ZDIR=\epoc32\release\$(PLATFORM)\$(CFG)\Z +else +ZDIR=\epoc32\data\z +endif + +# ---------------------------------------------------------------------------- +# TODO: Configure these +# ---------------------------------------------------------------------------- + +TARGETDIR=$(ZDIR)\resource\plugins +ICONTARGETFILENAME=$(TARGETDIR)\bmpanimscrplugin.mif + +HEADERDIR=\epoc32\include +HEADERFILENAME=$(HEADERDIR)\bmpanimscrplugin.mbg + +do_nothing : + @rem do_nothing + +MAKMAKE : do_nothing + +BLD : do_nothing + +CLEAN : do_nothing + +LIB : do_nothing + +CLEANLIB : do_nothing + +# ---------------------------------------------------------------------------- +# TODO: Configure these. +# +# NOTE 1: DO NOT DEFINE MASK FILE NAMES! They are included automatically by +# MifConv if the mask detph is defined. +# +# NOTE 2: Usually, source paths should not be included in the bitmap +# definitions. MifConv searches for the icons in all icon directories in a +# predefined order, which is currently \s60\icons, \s60\bitmaps2, \s60\bitmaps. +# The directory \s60\icons is included in the search only if the feature flag +# __SCALABLE_ICONS is defined. +# ---------------------------------------------------------------------------- + +RESOURCE : + mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) $(ANIMBITMAPS) + +FREEZE : do_nothing + +SAVESPACE : do_nothing + +RELEASABLES : + @echo $(HEADERFILENAME)&& \ + @echo $(ICONTARGETFILENAME) + +FINAL : do_nothing diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/bitmaps.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/bitmaps.mk Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,51 @@ +# +# Copyright (c) 2009 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: The bitmap files will be used int bitmap animation plugin +# + +# Do not change the ANIMBITMAPS variable name, remember to +# add line continuation marks (backslash) until the last line. +# NOTE that rotation (portrait graphics used in landscape) supports +# only color modes c1, c8, c16, c32 + +BMPDIR = s60 + +ANIMBITMAPS = \ +/c16 $(BMPDIR)\BmpAnim01.bmp \ +/c16 $(BMPDIR)\BmpAnim02.bmp \ +/c16 $(BMPDIR)\BmpAnim03.bmp \ +/c16 $(BMPDIR)\BmpAnim04.bmp \ +/c16 $(BMPDIR)\BmpAnim05.bmp \ +/c16 $(BMPDIR)\BmpAnim06.bmp \ +/c16 $(BMPDIR)\BmpAnim07.bmp \ +/c16 $(BMPDIR)\BmpAnim08.bmp \ +/c16 $(BMPDIR)\BmpAnim09.bmp \ +/c16 $(BMPDIR)\BmpAnim10.bmp \ +/c16 $(BMPDIR)\BmpAnim11.bmp \ +/c16 $(BMPDIR)\BmpAnim12.bmp \ +/c16 $(BMPDIR)\BmpAnim13.bmp \ +/c16 $(BMPDIR)\BmpAnim14.bmp \ +/c16 $(BMPDIR)\BmpAnim15.bmp \ +/c16 $(BMPDIR)\BmpAnim16.bmp \ +/c16 $(BMPDIR)\BmpAnim17.bmp \ +/c16 $(BMPDIR)\BmpAnim18.bmp \ +/c16 $(BMPDIR)\BmpAnim19.bmp \ +/c16 $(BMPDIR)\BmpAnim20.bmp \ +/c16 $(BMPDIR)\BmpAnim21.bmp \ +/c16 $(BMPDIR)\BmpAnim22.bmp \ +/c16 $(BMPDIR)\BmpAnim23.bmp \ +/c16 $(BMPDIR)\BmpAnim24.bmp \ +/c16 $(BMPDIR)\BmpAnim25.bmp \ +/c16 $(BMPDIR)\BmpAnim26.bmp \ +/c16 $(BMPDIR)\BmpAnim27.bmp diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/bitmaps.s60.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/bitmaps.s60.mk Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,51 @@ +# +# Copyright (c) 2009 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: The bitmap files will be used int bitmap animation plugin +# + +# Do not change the ANIMBITMAPS variable name, remember to +# add line continuation marks (backslash) until the last line. +# NOTE that rotation (portrait graphics used in landscape) supports +# only color modes c1, c8, c16, c32 + +BMPDIR = s60 + +ANIMBITMAPS = \ +/c16 $(BMPDIR)\BmpAnim01.bmp \ +/c16 $(BMPDIR)\BmpAnim02.bmp \ +/c16 $(BMPDIR)\BmpAnim03.bmp \ +/c16 $(BMPDIR)\BmpAnim04.bmp \ +/c16 $(BMPDIR)\BmpAnim05.bmp \ +/c16 $(BMPDIR)\BmpAnim06.bmp \ +/c16 $(BMPDIR)\BmpAnim07.bmp \ +/c16 $(BMPDIR)\BmpAnim08.bmp \ +/c16 $(BMPDIR)\BmpAnim09.bmp \ +/c16 $(BMPDIR)\BmpAnim10.bmp \ +/c16 $(BMPDIR)\BmpAnim11.bmp \ +/c16 $(BMPDIR)\BmpAnim12.bmp \ +/c16 $(BMPDIR)\BmpAnim13.bmp \ +/c16 $(BMPDIR)\BmpAnim14.bmp \ +/c16 $(BMPDIR)\BmpAnim15.bmp \ +/c16 $(BMPDIR)\BmpAnim16.bmp \ +/c16 $(BMPDIR)\BmpAnim17.bmp \ +/c16 $(BMPDIR)\BmpAnim18.bmp \ +/c16 $(BMPDIR)\BmpAnim19.bmp \ +/c16 $(BMPDIR)\BmpAnim20.bmp \ +/c16 $(BMPDIR)\BmpAnim21.bmp \ +/c16 $(BMPDIR)\BmpAnim22.bmp \ +/c16 $(BMPDIR)\BmpAnim23.bmp \ +/c16 $(BMPDIR)\BmpAnim24.bmp \ +/c16 $(BMPDIR)\BmpAnim25.bmp \ +/c16 $(BMPDIR)\BmpAnim26.bmp \ +/c16 $(BMPDIR)\BmpAnim27.bmp diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/bitmaps.series60.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/bitmaps.series60.mk Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,47 @@ +# +# Copyright (c) 2009 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: The bitmap files will be used int bitmap animation plugin +# + +# First image MUST be named BmpAnim_first, and +# last image BmpAnim_last. Middle ones don't matter. +# Do not change the ANIMBITMAPS variable name, remember to +# add line continuation marks (backslash) until the last line. + +# NOTE that rotation (portrait graphics used in landscape) supports only color +# modes c1, c8, c16, c32 + +BMPDIR = series60 + +ANIMBITMAPS = \ +/c16 $(BMPDIR)\SS10000.bmp \ +/c16 $(BMPDIR)\SS10001.bmp \ +/c16 $(BMPDIR)\SS10002.bmp \ +/c16 $(BMPDIR)\SS10003.bmp \ +/c16 $(BMPDIR)\SS10004.bmp \ +/c16 $(BMPDIR)\SS10005.bmp \ +/c16 $(BMPDIR)\SS10006.bmp \ +/c16 $(BMPDIR)\SS10007.bmp \ +/c16 $(BMPDIR)\SS10008.bmp \ +/c16 $(BMPDIR)\SS10009.bmp \ +/c16 $(BMPDIR)\SS10010.bmp \ +/c16 $(BMPDIR)\SS10011.bmp \ +/c16 $(BMPDIR)\SS10012.bmp \ +/c16 $(BMPDIR)\SS10013.bmp \ +/c16 $(BMPDIR)\SS10014.bmp \ +/c16 $(BMPDIR)\SS10015.bmp \ +/c16 $(BMPDIR)\SS10016.bmp \ +/c16 $(BMPDIR)\SS10017.bmp \ +/c16 $(BMPDIR)\SS10018.bmp \ +/c16 $(BMPDIR)\SS10019.bmp diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/bitmaps.series60_lowcolor.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/bitmaps.series60_lowcolor.mk Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,43 @@ +# +# Copyright (c) 2009 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: The bitmap files will be used int bitmap animation plugin +# + +# First image MUST be named BmpAnim_first, and +# last image BmpAnim_last. Middle ones don't matter. +# Do not change the ANIMBITMAPS variable name, remember to +# add line continuation marks (backslash) until the last line. +BMPDIR = series60 + +ANIMBITMAPS = \ +/c4 $(BMPDIR)\SS10000.bmp \ +/c4 $(BMPDIR)\SS10001.bmp \ +/c4 $(BMPDIR)\SS10002.bmp \ +/c4 $(BMPDIR)\SS10003.bmp \ +/c4 $(BMPDIR)\SS10004.bmp \ +/c4 $(BMPDIR)\SS10005.bmp \ +/c4 $(BMPDIR)\SS10006.bmp \ +/c4 $(BMPDIR)\SS10007.bmp \ +/c4 $(BMPDIR)\SS10008.bmp \ +/c4 $(BMPDIR)\SS10009.bmp \ +/c4 $(BMPDIR)\SS10010.bmp \ +/c4 $(BMPDIR)\SS10011.bmp \ +/c4 $(BMPDIR)\SS10012.bmp \ +/c4 $(BMPDIR)\SS10013.bmp \ +/c4 $(BMPDIR)\SS10014.bmp \ +/c4 $(BMPDIR)\SS10015.bmp \ +/c4 $(BMPDIR)\SS10016.bmp \ +/c4 $(BMPDIR)\SS10017.bmp \ +/c4 $(BMPDIR)\SS10018.bmp \ +/c4 $(BMPDIR)\SS10019.bmp diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim01.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim01.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,122 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:32:55Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:03:52Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q== + + + + + + + image/svg+xml + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim02.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim02.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,147 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:23:39Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:03:44Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim03.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim03.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,138 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:23:58Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:03:37Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim04.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim04.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,147 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:25:01Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:03:31Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVOW4jj6mrfyjrlGbUwx8+bOMCVJL5 CaOOPv1zGx9oRP1CmZwnoiFdWFVII9szozEhYNtRFN5JDsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdiqySWOMVY08B3yrJmjAbllGJPJBy3rtsnwr+OavNrpS2 jsG+OIDmh8wm12KtqzKaqSD7ZKMzE2DSkWiY75xs45DxGxzOxa+Q+oW0ywjoioZo5VLIagGh9jmy x5BMWGmUTHmvyxi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk 987peSUO2xofkM02rj+8Ln4QDALEmU9djmIYsjAqmRYOxVpmVRVjQYQLSBaDmumbZPhXx7nL44wO bbGCaaH/ALyP/wAZD+oZtNJ9PxcTVfV8EwzKcZ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxVKNVFLqvioP6xmq1o9fwc/TH0oLMRvXLIy9D9GAi0EAqjXXFK8d+3hg GOyw4EJJI7mrGvgMvEQG0ClmFKeaH/vI/wDxkP6hmw0n0/FwNV9XwTDMpxnYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUr1cfvYz4qR9xzW64eoFzNKdigACdhmC5S 8R03PXwyXCx4lKf7I+eGPNlFQybJ2Kp5of8AvI//ABkP6hmw0n0/FwNV9XwTDMpxnYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUDqkLSCIjsTU/OmYWtgTTk6eVWgx GqDbr3OYYjTeZWsbIFkFCf7OCPNmEPk2bYBJAAqT0AwgIZBpdvLBbFZBRmYtTwBAG/3ZstPAxju6 7PMSlsi8vaXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXEAih6 YqhprJHqUPFvDtmNk0wPLZujlI5pfPBLEfjWg7HtmBkxyjzcmEweSEn+zlQ5twWW9tNcPwjWview +eXQxmRoLOYiLKe2Wnw2wr9qXu5/hmxxYRD3uBlzGXuRWXNLsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVcQGFCKg9QcBFqCgp9KgkIKkoK/EBv91emYstJ Emxs5EdQQioYYoUCRqFUZkxiIig0ykZGyvyTF2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim05.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim05.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,153 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:25:35Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FX/2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:03:27Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FX/2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim06.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim06.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,158 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:25:56Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +fhapzuHFJrpx8b/80r7DN5oezsemjUfq6nq63W6/JqJXLl0CcZnuE7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q//Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:03:22Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 fhapzuHFJrpx8b/80r7DN5oezsemjUfq6nq63W6/JqJXLl0CcZnuE7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q//Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim07.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim07.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,158 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:26:11Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +7FX/2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:03:16Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 /9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim08.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim08.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,158 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:26:27Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +ftD2YjP1YTwnuPL58x9ru9J2yY7ZBY7xzY9ov5ZXt1qDz6x/o9ojbQqwLyU91qFX365i9m+z2Q/3 +3pA6dT+xz9X25CMaxeqXf0D0qzs7WytktrWJYYIxRI0FAM7HFijjiIxFAPLZMkpy4pGyVbLGDsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir +sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs +VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV +dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir +sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs +VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV +dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir +sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs +VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV +dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd +irsVdirsVf/Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:03:05Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 ftD2YjP1YTwnuPL58x9ru9J2yY7ZBY7xzY9ov5ZXt1qDz6x/o9ojbQqwLyU91qFX365i9m+z2Q/3 3pA6dT+xz9X25CMaxeqXf0D0qzs7WytktrWJYYIxRI0FAM7HFijjiIxFAPLZMkpy4pGyVbLGDsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVf/Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim09.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim09.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,167 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:26:45Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:02:59Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim10.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim10.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,173 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:27:02Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:02:54Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim11.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim11.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,181 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:27:16Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:02:49Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim12.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim12.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,187 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:27:28Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +7FXYq7FXYq7FXYq7FXYq7FX/2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:02:42Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 7FXYq7FXYq7FXYq7FXYq7FX/2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim13.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim13.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,205 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:27:40Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +TC/tpfgFrOyxzR8/h+2aI6rWpOx9jlgyd73uk9ssWXGYagcE65jeJr7R9qcaF5Uj0CIW0xWa/hHo +zTL9mqfCQlf2ajON1P8AeS/rH73zbX6s5skiNo8R+9NsocF2KoS96p9OZun+n4teRDZe1o/R9FvN +VuvRtxRRvLKfsoPf38BluLEZmgzhjMjs9ZzduzdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir +sVdirsVdirsVdirsVdirsVdiqVap5b0+/wCUgHo3B39VB1P+UvfMLUaCGTflLva5YwWI6noOoaeS +0ic4e0ybr9Ph9OaLUaPJi5jbvaJQIS7MVghL3qn05m6f6fi15EXoPl+71e44p8FuhHrTnoPYeLZm +4cJmfJceMyL0vT9OtNPtVtrVOEa9T3Y92Y9zm3hARFB2EYiIoInJsnYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXEAggioOxBxVItU8p2VzWS1pbTHegHwE/L +t9Ga3UdmwnvH0n7GqWIHkx+DyZqFxfiK6Ho20e8kqkHkD0Ce5/DMfTaGYNS2aPAJO/JnFpaW9pbp +b26COKMUVR/n1zcRiIig5cYgCgq5JLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs +VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV +dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir +sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs +VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV +dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVdirsVdirTMqirGgHfBKQAspAtRN0K7CozEOr32GzYMapHMklQp3HU +ZkY8onyYSiQvyxi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYqp3IrA49v45XmFxLPGfUlrl0XrTNfwuVsVfTK8pD8t8y9P1as/RH5kuO7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVGW0ik8R40yqWGJL +ZHIQqoiooVRRR0GWAUwJtvCh2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K +uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku +xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux +V2KuxV2KuxV//9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:02:33Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 TC/tpfgFrOyxzR8/h+2aI6rWpOx9jlgyd73uk9ssWXGYagcE65jeJr7R9qcaF5Uj0CIW0xWa/hHo zTL9mqfCQlf2ajON1P8AeS/rH73zbX6s5skiNo8R+9NsocF2KoS96p9OZun+n4teRDZe1o/R9FvN VuvRtxRRvLKfsoPf38BluLEZmgzhjMjs9ZzduzdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdiqVap5b0+/wCUgHo3B39VB1P+UvfMLUaCGTflLva5YwWI6noOoaeS 0ic4e0ybr9Ph9OaLUaPJi5jbvaJQIS7MVghL3qn05m6f6fi15EXoPl+71e44p8FuhHrTnoPYeLZm 4cJmfJceMyL0vT9OtNPtVtrVOEa9T3Y92Y9zm3hARFB2EYiIoInJsnYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXEAggioOxBxVItU8p2VzWS1pbTHegHwE/L t9Ga3UdmwnvH0n7GqWIHkx+DyZqFxfiK6Ho20e8kqkHkD0Ce5/DMfTaGYNS2aPAJO/JnFpaW9pbp b26COKMUVR/n1zcRiIig5cYgCgq5JLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirTMqirGgHfBKQAspAtRN0K7CozEOr32GzYMapHMklQp3HU ZkY8onyYSiQvyxi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYqp3IrA49v45XmFxLPGfUlrl0XrTNfwuVsVfTK8pD8t8y9P1as/RH5kuO7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVGW0ik8R40yqWGJL ZHIQqoiooVRRR0GWAUwJtvCh2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV//9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim14.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim14.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,211 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:27:56Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +e+U6vIJ5pyHWRP2t5jOO7FUu1X7UfyP8M2mi+g+9oy80BmW0px5Z8r6l5hvxa2a8UXee4avCNfE+ +JPYd8v0+nlllQbcWEzNB9EKqr0FK51EYCPJ3xLeSQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYqx7X/JGj6tylC/Vbxqn14gPiJ7uvRv1++arW9kYs+/0z7x+lqnhE +ve8513yjrOjsWmi9W27XMXxJ/su6/TnKazszLg3IuPePxs4c8Rikua9rS7VftR/I/wAM2mi+g+9o +y80x8o+TtQ8x3nCL91ZREfWbojZR/Kv8zHw+/NrptLLKduXenDgOQ+T3PRtF0/RrCOxsI/ThTck7 +szHqznuTnR4sUcceGLuMeMQFBHZYzdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVcyhgVYAqRQg7gg4kWrEte/LvS77lNYUsrk78VH7pj7qPs/7H7s0es7Dx5N +4eiX2fs+DRPADy2Yfa/lhrN7rC29+Pq1jBvNcKQ3MHosXuadxt38Mw9D2VkiTGewvn+pxPyspS35 +PVdO06y06zis7KIQ28IoiL+s+JPc50sICAocnYRiIigiMmydirsVdirsVdirsVdirsVdirsVdirs +VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV +dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir +sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs +VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV +dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVWySJGhdzxUdSchOYiLPJMYkmggn1 +QB/gSqdydic1U+1hxbD0uQNPtuUTb3kM5KofjWhZT1Fc2Gn1McosNU8ZjzVsyGt2KuxV2KuxV2Ku +xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDamhexlUCpoCB8iDmNq +43iLdpzUwxyVpooj8VD4eGaAYxe7tBRKP8shi9wxrQhd/ffNtoBzcXXcgnubJ17sVdirsVdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVQV1pFrcEE1TerBehz +EyaOEjfJyIamUUVFDFDGI4lCIvQDMmMREUGmUiTZX5Ji7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:02:24Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 e+U6vIJ5pyHWRP2t5jOO7FUu1X7UfyP8M2mi+g+9oy80BmW0px5Z8r6l5hvxa2a8UXee4avCNfE+ JPYd8v0+nlllQbcWEzNB9EKqr0FK51EYCPJ3xLeSQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYqx7X/JGj6tylC/Vbxqn14gPiJ7uvRv1++arW9kYs+/0z7x+lqnhE ve8513yjrOjsWmi9W27XMXxJ/su6/TnKazszLg3IuPePxs4c8Rikua9rS7VftR/I/wAM2mi+g+9o y80x8o+TtQ8x3nCL91ZREfWbojZR/Kv8zHw+/NrptLLKduXenDgOQ+T3PRtF0/RrCOxsI/ThTck7 szHqznuTnR4sUcceGLuMeMQFBHZYzdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVcyhgVYAqRQg7gg4kWrEte/LvS77lNYUsrk78VH7pj7qPs/7H7s0es7Dx5N 4eiX2fs+DRPADy2Yfa/lhrN7rC29+Pq1jBvNcKQ3MHosXuadxt38Mw9D2VkiTGewvn+pxPyspS35 PVdO06y06zis7KIQ28IoiL+s+JPc50sICAocnYRiIigiMmydirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVWySJGhdzxUdSchOYiLPJMYkmggn1 QB/gSqdydic1U+1hxbD0uQNPtuUTb3kM5KofjWhZT1Fc2Gn1McosNU8ZjzVsyGt2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDamhexlUCpoCB8iDmNq 43iLdpzUwxyVpooj8VD4eGaAYxe7tBRKP8shi9wxrQhd/ffNtoBzcXXcgnubJ17sVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVQV1pFrcEE1TerBehz EyaOEjfJyIamUUVFDFDGI4lCIvQDMmMREUGmUiTZX5Ji7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim15.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim15.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,234 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:28:12Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +V2KuxV2KuxV2KuxV2KuxV//Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:02:17Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 sVdirsVdirsVdirsVdir/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim16.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim16.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,259 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:28:25Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhb7U7KxTlcSBSfsoN2PyGa7X9q6fSRvLKj3dT8PwG7Dp5 +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 +7FXYq7FXYq7FXYq7FXYq7FXYq7FX/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:02:09Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhb7U7KxTlcSBSfsoN2PyGa7X9q6fSRvLKj3dT8PwG7Dp5 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 V2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim17.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim17.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,275 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:28:37Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 +rsVdirsVdirsVdirsVdirsVdirsVdirsVf/Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:02:05Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 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 fQfe0ZeaY+UfJ2oeY7zhF+6soiPrN0Rso/lX+Zj4ffm102lllO3LvThwHIfJ7no2i6fo1hHY2Efp wpuSd2Zj1Zz3Jzo8WKOOPDF3GPGICgjssZuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuZQwKsAVIoQdwQcSLViWvfl3pd9ymsKWVyd+Kj90x91H2f9j92aPW dh48m8PRL7P2fBongB5bMPtfyw1m91hbe/H1axg3muFIbmD0WL3NO427+GYeh7KyRJjPYXz/AFOJ +VlKW/J6rp2nWWnWcVnZRCG3hFERf1nxJ7nOlhAQFDk7CMREUERk2TsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqQeffMM3l7yhqesQANcW0YEHLcCSV1iQkdwGcG mKvFPy/8hXX5ji+1rzBrFw4hl9FQCHlLlQ5NXqqIARQBfupir13yD+Xdn5NN+tnezXUF76NI5wv7 sxc60K0Hxep4dsVTbWfNeh6Q4ivbik5FfRQF3oe5A6fTirejeatD1hzFZXHKZRyMLgo9PEA9foxV HTX9rDcx28jUll+wKGhqadcVU01jT5LpbaOXnKxIHEEioFevTFUZirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqWeZtCttf0G+0e4YpFeRGPmBUq32kenfiwBxV85 +n+YX5V6w0gUpbTNxL0MlnchdxvtQ/cwxV7b5D/MvS/Nmk3FxHGbbULJOd5ZE8qChIZGoOSmnht+ tViflG/0ufzJcalr0yVKtIhmFVMrMANjX7K1pires3ulWvnO1vtFdPq4aKR/R2TkWpIoAHdevzxV mvmskXsJGxEex/2RxVONP0axtkikEdZ1AJkJNakb7VpiqYYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqoX+oWOn2r3d/cR2trGVEk8zBI15sEXkzUAqzAYqknmLz D5Hk0G7/AEtf2dxpkkbCWP1Y5OYp0RQSWav2ab1xV4v/AM4+addXPmTVJV5LaLp7wTuBUcppE4L8 /gY/RirKfJ8elWnmCay16GPiVaEeuBxSVWHXlsK0Irir0I6Z5HjkjX0bASyMqxL+75M5NFCjqTXF UN5s/wB7If8AjH/xscVZNF/dp8h+rFV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KoDXtC03XtJuNJ1KMyWVzx9VFYoTwcOtGWh2ZQcVYKv5AeQRLzP1xlrX0jMO Py2Tl+OKs40Hy7ougWAsNItUtLYHkVWpLNSnJ2NWY7dScVQ2teT9C1iX1ruAi4pQzxsUYgePY/SM VQmn/l75csbqK6RJZJYXWSIySGgZSCpooXoR3xVOb7SbO9kWScMWUcRQ02rXFUYAAAB0GwxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqV1dW9rA09w4jiSnJz 7mg/HKdRqIYYGczUQzx45TlwxFlj8/nNBOBDb84B1ZjRj8utM4nP7bRGSseO8fmaJ93d+OTtIdlH h3O6a6Xrun6k0kdu59aIBpYmG6hq0rTbemdR2X2vi1seKFgjmCPwC4Wo0k8VGXI9UwzaOKkVz5lu I7q+hg09riPT+JuJFkVSFZeVQpG+wOKpvZXcV5aRXUNfTmUOtetD2OKqa3bnUntKDgsQkDd6lqYq iiQBUmgHUnFVqSxv9h1anWhBxVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdiqT+b4Gn8uX0agsxRWAG5JV1bt8s1PbmPj0eQeX3EFz+zJ8OoifxyeU3suoWNk370qxoOP XiD755lHSjiHEN3soiGSXJkn5QLIZ9UlYMVKxDma0LVY0r4523szHefdt+l03tERUB7/AND0rOte XYgltqd1rfmC2spIoUmMKXEkgZmCtGw+ACgr164qyiws47KyhtIySkKBAT1NO5+eKoVP+O/L/wAw 6/8AE8VRtxII4XcryAH2fHFUNFy+ux8ggJQmieHviqNxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxVxAIodweoxVjuseRtF1NlZg8A5BpFiICsAakUNeP0ZpNT2Bp8sxIX Hvrkf1fB2mm7Wy4hXP3p3Y2NnY2yWtnEsMEYokaig/tPuc2+LDHHERgKiHX5csskuKRslXyxrUor S2hnmnjjCzXHEzOOrcRRa/KuKquKrBDEJjMFHqleJfvTrTFV5AIIIqD1BxVYkEKGqIFPiPfFV+Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim18.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim18.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,295 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:28:51Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXAg9DXADa27CrsVdirsVdirsVdirsVdirsVdirsVdir +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 +xV2KuxV2KuxV2KuxV2KuxV2Kse1/yRo+rcpQv1W8ap9eID4ie7r0b9fvmq1vZGLPv9M+8fpap4RL +3vOdd8o6zo7FpovVtu1zF8Sf7Luv05yms7My4NyLj3j8bOHPEYpLmva0u1X7UfyP8M2mi+g+9oy8 +0x8o+TtQ8x3nCL91ZREfWbojZR/Kv8zHw+/NrptLLKduXenDgOQ+T3PRtF0/RrCOxsI/ThTck7sz +HqznuTnR4sUcceGLuMeMQFBHZYzdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs +VdirsVdirsVdirsVcyhgVYAqRQg7gg4kWrEte/LvS77lNYUsrk78VH7pj7qPs/7H7s0es7Dx5N4e +iX2fs+DRPADy2Yfa/lhrN7rC29+Pq1jBvNcKQ3MHosXuadxt38Mw9D2VkiTGewvn+pxPyspS35PV +dO06y06zis7KIQ28IoiL+s+JPc50sICAocnYRiIigiMmydirsVdirsVdirsVdirsVdirsVdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir +sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs +VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqkLu1M/1cSr63++6jl49MVVcVdirsVdir +sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirD/AM3vOVz5M/LbXfMloqteWMCr +a8hVRNPIkETMO4V5QxHfFXy3+Tv5Q3/52DVvNHnLzJeyLbXH1ZArCSdpSqyMay8ljjAYBVVflSmK +vo78oPyW0z8sm1dNN1W61C11T6txhuglYTb+rUqU4g8/W3+EdO+Ksh80fmN5R8szC31W9C3bAMLW +JWlkCnoWCii+3IiuKu8rfmL5S8zytBpV5zu0Xm1rKrRycR3AYUYf6pOKprea/pdnqNvp1xKUurqn +orxJBqSo+LoNxiqEXzn5dk1AWEVz6055bxqzJ8Klj8VKHYdsVU7Y6JPq63EU0jTuxZYyCF5U8aYq +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 +sVdirsVdirsVdirsVdirsVdirsVf/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:59Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXAg9DXADa27CrsVdirsVdirsVdirsVdirsVdirsVdir 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 XYq7FXYq7FXYq7FXYq7FXYq7FWPa/wCSNH1blKF+q3jVPrxAfET3dejfr981Wt7IxZ9/pn3j9LVP CJe95zrvlHWdHYtNF6tt2uYviT/Zd1+nOU1nZmXBuRce8fjZw54jFJc17Wl2q/aj+R/hm00X0H3t GXmmPlHydqHmO84RfurKIj6zdEbKP5V/mY+H35tdNpZZTty704cByHye56Noun6NYR2NhH6cKbkn dmY9Wc9yc6PFijjjwxdxjxiAoI7LGbsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirmUMCrAFSKEHcEHEi1Ylr35d6XfcprCllcnfio/dMfdR9n/Y/dmj1nYePJ vD0S+z9nwaJ4AeWzD7X8sNZvdYW3vx9WsYN5rhSG5g9Fi9zTuNu/hmHoeyskSYz2F8/1OJ+VlKW/ J6rp2nWWnWcVnZRCG3hFERf1nxJ7nOlhAQFDk7CMREUERk2TsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVUhd2pn+riVfW/33UcvHpiqrirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVYf8Am95yufJn5ba75ktFVryx gVbXkKqJp5EgiZh3CvKGI74q+W/yd/KG/wDzsGreaPOXmS9kW2uPqyBWEk7SlVkY1l5LHGAwCqq/ KlMVfR35Qfktpn5ZNq6abqt1qFrqn1bjDdBKwm39WpUpxB5+tv8ACOnfFWQ+aPzG8o+WZhb6rehb tgGFrErSyBT0LBRRfbkRXFXeVvzF8peZ5Wg0q853aLza1lVo5OI7gMKMP9UnFU1vNf0uz1G3064l KXV1T0V4kg1JUfF0G4xVCL5z8uyagLCK59ac8t41Zk+FSx+KlDsO2KqdsdEn1dbiKaRp3YssZBC8 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 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim19.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim19.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,309 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:29:06Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kAVOwxVpWVhVSCPEYBIHkgEFvCl2KuxV2KuxV2KuxV2K +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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:53Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kAVOwxVpWVhVSCPEYBIHkgEFvCl2KuxV2KuxV2KuxV2K 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim20.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim20.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,333 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:29:28Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kAEk0A6k4CaW1qSRuOSMGHiDXBGYkLBtAkDyXZJLsVdi +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 +q7FXYq//2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:48Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kAEk0A6k4CaW1qSRuOSMGHiDXBGYkLBtAkDyXZJLsVdi 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 KuxV/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim21.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim21.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,361 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:29:42Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq5mVQWYgKNyTsMBIAsoJpZFNFKvKJ1dfFSCPwyMMkZi4kE +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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:43Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq5mVQWYgKNyTsMBIAsoJpZFNFKvKJ1dfFSCPwyMMkZi4kE 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim22.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim22.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,397 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:29:58Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq5mVQWYgKNyTsMBIAsoJpZFNFKvKJ1dfFSCPwyMMkZi4kE +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 +xV2KuxV2KuxV/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:36Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq5mVQWYgKNyTsMBIAsoJpZFNFKvKJ1dfFSCPwyMMkZi4kE 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 /9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim23.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim23.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,411 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:30:16Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN +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 +sVdirsVdir//2Q== + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:29Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN 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 irsVdirsVdirsVdir//Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim24.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim24.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,416 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:30:28Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN +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 +FXYq7FXYq7FXYq7FX//Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:23Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN 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 VS7VftR/I/wzaaL6D72jLzQGZbSnHlnyvqXmG/FrZrxRd57hq8I18T4k9h3y/T6eWWVBtxYTM0H0 Jb2tvbhhCgQOeTU7nN/o9Dh00eHFERD0E8kpcyq5lsHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FWPa/5I0fVuUoX6reNU+vEB8RPd16N+v3zVa3sjFn3+mfeP0tU8 Il73nOu+UdZ0di00Xq23a5i+JP8AZd1+nOU1nZmXBuRce8fjZw54jFJc17Wl2q/aj+R/hm00X0H3 tGXmmPlHydqHmO84RfurKIj6zdEbKP5V/mY+H35tdNpZZTty704cByHye56Noun6NYR2NhH6cKbk ndmY9Wc9yc6PFijjjwxdxjxiAoI7LGbsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirmUMCrAFSKEHcEHEi1Ylr35d6XfcprCllcnfio/dMfdR9n/Y/dmj1nYeP JvD0S+z9nwaJ4AeWzD7X8sNZvdYW3vx9WsYN5rhSG5g9Fi9zTuNu/hmHoeyskSYz2F8/1OJ+VlKW /J6rp2nWWnWcVnZRCG3hFERf1nxJ7nOlhAQFDk7CMREUERk2TsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSVPO3k9/MZ8srrNm3mBRyOlieP6xs vMj068uXD4uPXjv0xVOsVdirsVdirsVeKfnr+c975dn/AMNeXZBHqrIHv72gYwK4qsaAinqMp5cv 2RSm5233ZPZgyjxJ/T0He4Oq1Jj6Y82FeXvyR/M3zXYprmray1m14okhF5LNLcOjbqzAfZBBqATX 2zPzdq6fCeCMbruqnHhpckxZL2f8pfIes+TNFvNO1TUF1Bprn1oJELkKhRV40fp8QJ2zRdo6uGeY lEcOznafEYCiba/NDzrc6DaQ2OnME1C8BYy9TFENqgH9pjsD7HHQaUZCTL6QufLwihzYbov5f+av MWkHWZNSKyzhmt0neR3k4kirNX4akbdczsusx4pcHDyaI4ZSF2rfl7541jTtdj0TV5pJrWaT6txm JZ4ZuXFaManjy+Ej6cGs0sZQ448+fvThykGi9mzROc7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqw/8A N7zlc+TPy213zJaKrXljAq2vIVUTTyJBEzDuFeUMR3xV8t/k7+UN/wDnYNW80ecvMl7IttcfVkCs JJ2lKrIxrLyWOMBgFVV+VKYq+jvyg/JbTPyybV003VbrULXVPq3GG6CVhNv6tSpTiDz9bf4R074q jPP352flx5EuVs/MGqBNRdQ40+3R55wp6M6oCEB7cyK9sVb8gfnV+XXny4ktPL2p+pqESmR7CeN4 J+ANCyq4AcDvwJp3xVMNf/M3ydoHmvSvKuqXjQazrQU6fD6blH9RzGtZAOC1dabnFUgk/wCch/ym /T7aFb6z9cvY0meV7WGWWFRbRPNJ+9C8GokZ+wTiryvyjJ/zjx5j/PO18z6NrmpXHmPULl7m10t4 ZI7Y3XpMWcu0SsFoCwUv9r2+HFX0P5n81eXvK2jy6x5gvo9P02GgeeWu7HoqKoZ3Y9lUE4q850n/ AJyn/JjUtRSxGryWjSNwjuLq3lihJJoKyUIQHxeg8cVeqXeoWNnYy393cR29jBGZprqRgsSRqORd nJoFA3riryW8/wCcsPyWtr1rZdTuLhVbi1zDazGLrQkFgrEDxC/KuKvTfLvmfRPMegWuv6Rc/WNJ vEaSC5KvHVVYqxKyBWFGUjcYq+MV1zT9X/MAa3r7H9HXWo/W79eJcmD1ebRhR/kfAM7/AMKUMPBD 6hGh73Q8QlO5cre3S/8AOVmgLc8IdBumtK0ErSxpJT/jGAy/8PmhHs/Ot5C3O/PjuepeR/Pvl3zn pZ1DRpWPpEJdWsoCzQsRUB1BPXsQSD9BzUarSTwS4Z/2uXiyxmLDyn827lpvOtzGTUW0UMSjwBQS frkzcdnRrEPO3E1B9b2XyvEsXlrSo16LZwDw/wB1Lvmizm8kveXNx/SHg/nX/RfOuqPD8LJdtKp8 GJ51+850Wl3xRvudfl2mX0TE4kjSQbBwGAPuK5zJFOzXYFdirsVdirsVdirsVdirsVdirsVdiqRe evKVl5v8oar5avWMcGpwGL1QKmNwQ0cgHfhIqtT2xV8UCH85v+cffMzzKhjsblwjS0M2mXypUqCf howBNPsyD5Yq+pPyq/Pny/5+8r6hqUUDWer6PA0+p6UW5EKqlg8T0HNG406VB2PYlV8yfkZ5m8na l+bOp+bfzMvrarwzXUDXw5xNeSyIq0Uhh+7jLcFpttTpiq7z95i8laL/AM5AaP5j/L64txpSzWdz ObEFIBI0hS5jCqBQSR/aAH7RxVkP/OazvH+YWgSRsUdNLVkdTQgi5lIIIxV7l+Wv/OPn5aeW9L0e /wD0St1r0dsrXOoTySuXlmh4zfui/pcCHZePGlPE74q8F0Czs7L/AJzIFpZwR21rDqlwsUEKLHGi /VH2VVAAHyxVd/zlx5mm1b81dO8r3NwbfRtJigEm/wAKyXZDyzH5RFB9Hviqa/8AOQ2o/kLqH5dW kPkyfTDrWlzQR2a2KBJjbUZXR24qXXfkeRJrv44qr3d55l80f84a2y2fq3M2lTiDUFQFmaysp2K7 D9mJPSJ9lriqX/8AOMnnr8mLDQ5fLXm2xs4NavLpmGpajbxSwTxuFCRGZ1b0gvH7L0TvWpxV9Xw6 XpWl+XnsdJtobPToYJPq9tbIscKK4ZzwVKKASxO2Sh9QRLk+Lfy80C38wedtG0e5BNtd3Ki4VTQm JKvIAe1VUiud9rMxx4pSHMB0OGHFMB9Sfmd+Xvla8/L3VYbfS7a2m0+zlubCSCJI3je3Quqqyhdm 4cSM5HQazJHPEmRPEaPxdtnwxMDtyeIf8416rdWn5jLZRsfQ1G1mjnSu1Yl9VGp4gpT6Tm/7cxg4 L6xI/U4GilU672ZfmojL561EnowgK/L0EH8Mwez/AO5Hx+9vz/WXt3l0g+X9MI3BtIKH/nmuaHN9 cveXPh9IeC+f/wDlMtW/4zn9QzotH/dR9zrs31F9DWoK20IIoQigg9QaZzMubsgqYEuxV2KuxV2K uxV2KuxV2KuxV2KuxVB6vrGk6Np8mo6teQ6fp8JQTXdzIsUSeo4jTm7kKtXYDc4qxbzp5z/KmXyl qH+ItW0y80KaBxcQevDN6oAJ4xIrEtJUfBx35dMVfLn/ADh95fv9U84+Y3QvHpx0Seyu5lFRzu5I xEu/ekbsP9XFUj/Ie28laL+aN95e/MuwtBE0U1iP0mqGGC9ilUjmZPhTkEZQx9vHFX1M3k//AJxz tru0iOn+Wo7u5mjhsoh9V9WSd2CxpEoPJmLEUAxV4H/zm1/yn+hf9sof9RMuKvsDSf8AjlWX/GCL /iAxV8f6Z/62k/8A21bj/qDfFUJ/zlvoc+j/AJv2XmC5t/rGmapb28yhh8EjWhEU0Jr/AJCoT7Ni r3rR9A/5xl1bRoNYtNP8tixnjEgaVbWJkBFSsiuQUZejA9MVZjouofln5f8ALNpJpF3pWmeWr6Zo 7GWGWGGzmmflyWN6iN2b0m6HehxV81/85WeRPyn0rS7LzB5aktbLXr26WOXTrCSMwzQtGzNN6KGk fEqvxIADXcVNcVez/wDOL17q17+SuiPqTNJ6bXEFo77k20U7pGN+y0KD2AxV4PYxf4B/NyCPUFKW +j6kBISCT9WL7SDuawsHGd1M/mNMeHnKP2/2ujH7vJv0L6Q/NHz55bs/y51a4g1O2uH1G0ltdPEE ySGV50MQMfAmvDlyJ7Uzl9BpMks8QYkcJs7dztM+WIgd+bxf/nGXQLq889S6uEItNLtn5y9vVnHp onzK8z9Gb3t3MI4eHrI/c4Ohhc77noH50aVLDr1tqIX9xdwhC/b1IiQQf9iVzW9mZAYGPcXI1Md7 Z15F8z6TN5Os5JrqOE2ECwXSuwUp6I4gkeBUAjNfq8EhlNDmXIxTHD7nkaRt5n88sIVLR6hes9Kb iEuWJP8Aqx5uSfCw7/whw/rn7y+ic5l2TsVdirsVdirsVdirsVdirsVdirsVdiqT+b/KeiebvLt5 5e1yJp9LvgguI0do2PpSLKhDoQRR41OKvJ0/5w7/ACfW4Ep/STJWvoG6XhTwqIw9P9lir1byj5L8 r+UNIXSfLmnx6fYqebJHUs70ALyOxZ3ag6sScVYx+YH5Eflr57vP0hrenMmqFQjajaSNBMygUHOl UegFAXUkdOmKpH5W/wCcWvyn8u6zZ6xbwXt3fafPHdWbXNyxVJoWDxvxiEXLiyg0ao8a4qn35ifk f5D/ADA1S21PzFFcSXVpB9WhMExiX0+bPuADU1c4qzyCFIII4Y/sRKEWu5oooMVYHD+R/kOH8wj5 +SK4/wAQmd7kyGY+l6jxmM/u6UpxbFWSeb/JXlfzhpDaR5k0+PULFmDqj8lZHGweORCro29KqRtt 0xV5WP8AnDz8nxceqRqRjqT9XN0OHyqI+f8Aw2Ks21n8lvy+1fyPYeSbmykXy/pconsYI55Q8coE g5eoWZm/v32ao3+WKsN07/nEL8nbS7S4lgv75FNfq1xdH0z8/SWJ/wDhsVeyWNjZWFlBY2MCW1nb IsVvbxKEREQUVVUbAAYqw/8AMP8AKPyt534T3yva6nEvCLULegfj1CyKQVdQfHfwIzP0faOTT7De PcWjNp45OfN5/af84o6QtwGu/MNxNb13jit0ielOnNnlH/C5spe0Eq2gL97jDs8dS9f8q+U9C8ra RHpWi2wt7VDyck8nkcgAySMd2Y0/gNs0uo1E80uKZsubjxiAoIrWtE03WtPex1CISwPuOzKw6Mp7 EZDFllCVxTKIkKLz+b8jrEykw6tKkVdkeJXan+sGQfhmyHap6xcc6Ud7K/KnkTRPLfKS1DTXkg4v dS0LcevFQAAozD1Grnl58m3HiEWR5itrsVdirsVdirsVdirsVdirsVdirsVdiqldXVvawNPcOI4k pyc+5oPxynUaiGGBnM1EM8eOU5cMRZY/P5zQTgQ2/OAdWY0Y/LrTOJz+20RkrHjvH5mifd3fjk7S HZR4dzumul67p+pNJHbufWiAaWJhuoatK023pnUdl9r4tbHihYI5gj8AuFqNJPFRlyPVMM2jisTv vPF7DqGrW1ro73kOjcGvJkmRSEdC/IIwqaBTsMVZHpmo2+padb39sSYLmNZI67EBhWh9x0OKpfFr dw/m6fRTGn1eKyW6Em/Ms0nCnWlKYqm8s0UMTSzOscSAs8jkKqgdSSdhiqGsdY0m/ZlsL23u2QVc QSpIVB6V4E0xVWvLy2s7WW6upFht4VLyyMaAAYqgNA8yaTrtoLiwmVjuXgLKZUHIqpdASV5caiuK oXzj5pi8vackw9N7u4kEVtDK4QEkjk578Ur8WKplo895cafFNdvbySyAsJLNmeBlJ+EozbmoxV15 rOkWUqw3t9b20riqRzSpGzCtKgMQTiqMBBFRuD0OKoa71TTLOou7uG24qHb1ZESik8Qx5EbE7Yqi QQwBBqDuCOhGKoZ9T01HEb3cKuzFFQyKCWU8SKV6g7Yquh1CwmmaGG5ilmSvONHVmFNjUA1xVXxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVJ/N8DT+XL6NQWYorADckq6t2+WantzHx6PIPL7iC5/Zk+H URP45PKb2XULGyb96VY0HHrxB988yjpRxDiG72URDJLkyT8oFkM+qSsGKlYhzNaFqsaV8c7b2Zjv Pu2/S6b2iIqA9/6HpWda8u83isNd1DzV5wstMnt7eK5NtFeTTK7uEeF1/dBSBWhPXFWe6RpkOl6X a6fAS0VrGsas3U8RuTTx64qkFv8A+TNu/wDtlR/8n8VTbzPqcGl6Be389uLqKGP4rciofkQoVtm2 q2+3TFWHaQ1yfzA017hLKGebTpHeKwDBQjHkokJ2Y4qznWIll0m8RkDhoJPhIrU8TTb54qkX5ZxW 6+TdOkjRBK6P6jqByakrj4iNzTFUN+aMUT6Pp7Misw1G3UEgE0atR9NMVZiiJGgSNQiKKKqigA8A BirziODR7nUfOx1lYXu4yfTM/HmkAiPpmPluP2fs96e2Ksp8gtct5O0k3FfU9AAcuvAEiP8A4SmK pVrGmWGo/mTYQ30CXMMemvIIpQGQsJSoJU7H7XfFWaABQABQDYAdAMVYM1pbSaX5nneJWmW7mCyE AsAr1FD23OKpgtla2ms+W/q8YjLwzrIVABbjCD8VOpqa4qynFXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXEAih3B6jFWO6x5G0XU2VmDwDkGkWIgKwBqRQ14/Rmk1PYGnyzEhce+uR/V8HaabtbLiFc/en djY2djbJa2cSwwRiiRqKD+0+5zb4sMccRGAqIdflyyyS4pGyVfLGtDW+m2NtdXN3BCsdzeFTcyjq 5QELX5A4qicVQ66fZLfNfiFRePGIWn/aMYPIL8q4qqzwQXELwTxrLDICskbgMrKeoIOxGKpfp/ln QNOlWaxsIbeVeXGSNQG+MANv17YqmeKoDTdB0bS3lfT7OK1aenqmJePKlafrxVWv9Nsb+JIryFZ4 43WVFboHX7LfRiqJxVLNR8s+X9SuFub+whuZ0AAkdQTQdAfEfPFUyVVVQqgKqiiqNgAOwxVQbT7J r5b8wqbxIzCs/wC0IyeRX5VxVEYqhv0ZYelPF6C+ndMXuF7OzdScVXmytWlglMYMlsCLdu6BhxNP mMVVsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVf/Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim25.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim25.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,419 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:30:40Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN +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 +V2KuxV2KuxV2Kv8A/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:18Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN 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 KuxV2KuxV2KuxV2Kv//Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim26.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim26.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,419 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:30:56Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN +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 +V2KuxV2KuxV2Kv8A/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:12Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN 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 KuxV2KuxV2KuxV2Kv//Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim27.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/s60/BmpAnim27.svg Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,419 @@ + + + + + +]> + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-04T09:32:40Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN +LIpopV5ROrr4qQR+GRhkjMXEghEZiQsG1+TZOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K +uxV2KuxV2KuxV2KuxVZNPDBGZJnEca9WY0GU588MUTOZEYjqWUIGRoCyxvUvN43jsF9vXcf8RX+u +cN2p7Zc46Yf5x/QP1/J22DszrP5McmubiaUyyyM8h35k7/RnD59Tkyz45yMpd7tY44xFAbJlY+Zt +TtqK7fWIx+zJufobr9+bzQe1OrwbSPiR7pc/9Nz+duJm7Pxz5ek+TIbHzPptzRZG+ryH9mT7P0N0 +++mdtoParS59pHw5f0uX+m5fOnV5uz8kOXqHkq32vWdsOKH1peyodvpbNjqu1cWMek8UvL9bpdRr +I49ucmOX2qXl4f3r0j7Rrso/r9Oc3qtdkzH1Hbu6OnzameTmdu5DxTTQvzidkbxUkH8MxseSUDcS +QWmMzE2DSa2vmW8joJ1Ey+P2W+8bfhm3wdtZI7THEPkXOxdozH1bpxa67p9xQc/Sc/sybfj0zc4O +1MOTrwnz/FOxxa3HPrR80wBBFRuD0ObEFy3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FUq8y602j6eLpY/ULSCPfovIE8iO/TNR232hPSYOOABkTW/Ic93N0Gk8fJw3W1sKm1aXU +m9WSf1fAdAtfBe2eTa/W6jUT4s0jL7h7uj0MNMMQoClPMFk7FXYqslliijMkrBEXqx2GGMTI0OaQ +CdglUPmT1tSgt7f4LdnAeRv2h7A9M3/Z+CeMiz8Ojg9tdmYzpZ5JxHHGO39rJs3T5g7FVG7vLWzg +ae6lWGFersaD5fPG2UYmRoMQ1XzXe31YtP5WlqdjcH+9cf5I/YHv1zrOxvZPNqqnlvHi/wBkfcOn +vPyL0fZ/YMp1LJsHaV5s8w6WI0tb1/RjAVYZDzSg/wAlq0r3I3z0mHY+mhjGOMajH5/Pq9R+RxcP +DTMdK/NlDxTVbPie81uaj/gGP/G2a/P2F1xy+B/W4mTsz+afmzHS/MuhaoALK8jkkP8AuonhJ/wD +UbNPn0eXF9UT+h1+TTzh9QTPMZpdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirHfP0XP +y1O1P7p42+9wv/G2aD2mhejke4xP21+l2vY0q1A8wfueWI7IwZSVYdCNs8zezIB5o+31iVaCYcx/ +MNjlE8APLZxZ6UHkmcF1BOKxuCe46H7sxp4zHm4k8co80LqOr2tktGPOb9mIdfp8MuwaWWTflHvZ +4sEp+5i1/qV1eycpm+EfZjH2Rm6w4I4xQdnjwxhyQ8X94vzzJx/UHW9vf4ll/qpvZ6vf2lBFISg/ +3W/xL/Z9GZ744jL/AM9xWdl6j2/78ninxfu6nux65fpdNPPljjxi5y5OVpNKc8xAMdmu59SkF3dz +i5b/AHWFP7pP9RRt9PXPU+xfZTDpankrJl/2MfcP0n4U9xoOyceAWd5N51rtnYq7FWwSDUdcVR2h +/mprFr5i0vQ7W8N2L27gtZRMfUSNZZVjNGPxVAboDmj7QwYDEkR9QHTZ1uqx4qNDd77nLuldirsV +dirsVdirsVdirsVdirsVdirsVdirsVdirsVSjzbF6vlu/Xwj5f8AAEN/DNV23Di0eQf0fu3c7s2V +aiHveQZ5S924Ak0G5PbFCsIWT4iaMOlO2WcFc2BkCkLli7ciWapqx6k5sacgLcUrov7xfnlmP6g6 +jt7/ABLL/VRDyBfc+Gdf2P7OZ9aeL6MX84/70dfu83wrXdqY8G31T7v19yhJSQFXAZT1Uioz1Tsz +sfT6KHDjG/WR5n8d3J5LP2jmyTE+IgjlW1e5Ln0aNHMtlI1pKevDdD80O2bOnqey/bvWaeo5f30P +PaX+m6/EFr6/qNrtewerGP8Aj4g3/wCCTrgfR+y/a7Q6ygJcE/5s9vkeR+d+SNtr21ul5QSK47gd +R8x1wvTrrm5gtoWmncRxL9pm6ZGUgBZQSBzYRrvm64vOVvZ1httwz9Hcf8ajNfm1JlsOTiZMxOw5 +Kv5ZQ+t+YPl9Ntr2J9/8huf/ABrmu1J/dy9ziZvoL7CznnVOxV2KuxV2KuxV2KuxV2KuxV2KuxV2 +KuxV2KuxV2KoTWIvV0i9i/nglX70IzE18OLBkj3wl9zfpZcOWJ/pD73jVtaTXDUjGw+0x6DPI8eK +Uzs99kyCI3TFbOO3Xb4n7sczBhEB5uIcpkhZ++UTb4Mak/vG+Z/XmYHMHJaSB1y3DhnlmIQFykaA +as+eGGByTPDCIsnuC5QQa989T7C9iIYqyar1z/mfwj3/AM77ve+Ie1X/AAQ5aqMtPpBw4jsZn6pe +4fwj/Zf1W89BAAFDk+Wk27CrsVdiqU6ymk28f1i4rDMa+m8R4yMfanX6ctxYZZDQen7E9oO0NORH +FPigP4Zbx/WP80hhGr6leXkyieVnRAPTViNqj2A3981WuFZDG+T7Rh1Es2KE5bGUQfmLQGYbNmv5 +MQ+t+ZuhpttJM+/T4LeR/wDjXMbWH90WrP8AQX1pmgdW7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq06h0ZT0YEH5HBIWKSDRtiN/5TmtY/wDQB6sC9Ixs4/5q/X7ZyGr7BnjH7r1R7uv7fxs7 +zD2kJn17H7P2MXulZGZWBVlNGUihBHiM5vLEg0ebuMZB3CWz98wZuZBjc396/wDrH9eZceQcwIe6 +WtrN7Ix+4ZvvZrHOXaGExF1khfkOIW6j2ghxdn5x/tU/siSk9vf3MGytyT+Rtxn0ZPDGT8yTxRlz +TO31W3k2f923v0+/MaWGQ83DnppDlujAQRUbg9DlLj03iqUaz5ht7AGKKkt1/J+yv+t/TMzT6Q5N +ztFz9LoZZNztH72F3V3cXUxmncvI3c9h4Adhm4hjERQd9jxxgKiKCDuf74/Jf+IjOL7Q/v5+99b0 +P+L4/wDhcP8AchSzDcp6H+QkPqfmVYvQfuYbh9+u8TJt7/HmHrj+6LRqfofU2aN1rsVdirsVdirs +VdirsVdirsVdirsVdirsVdirsVdirsVdiqV69ZaHLavPqZSFEFPrJIRl8KN39hvmFrOz8OoHrG/f +1/H2OZo8uYSAx2T3PJ768003ckdpK8kAP7uWReHL6Kn8c4vtH2dzYvVj/eR/2Xy6/D5PbYcWThBk +Kl3DdIZYy08h7cjv9OHsvsfJnAMvTDv/AFOZEbLbhQLWUAbcG/VnoPZWmhgyQjAUOKP3uF2xEHRZ +h/tU/wDcli2ervy67FVaC7uIP7tyB/Kdx92QljjLmwljjLmFHWfMd2kKwwqInkB5TDrT/J8Mlp9J +EmzvTbpdBAniO47mLkkkkmpO5JzaO2diqleAC4IH8qH70GcLrDeaX9Yvrel/uYf1I/7kL9M0y/1S +9isbCBri6mNI4kFSfc+AHcnpmBqNRDDAzyHhiOreTT6C/KXyDY+WNSjmuGF3rc8bpNKpPpQKVqUj +/mJIoWP0Z5+Pa06zWjBjH7rf37An8Bq1GKRxmR2D13N86t2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV +2KuxV2KuxV2KuxV5D/zkPcXlpZaHe20hjaOaeNqdDzVGoR0P2O+TgLe69iIQnPLCQu4xPyv9bzHS +/OdvLSO/X0X6eqtSh+Y6jCcfc9fqOypR3huO7qyOOSORA8bB0bdWU1Byt1UokGi6UVicD+U/qy3A +anH3hxNdEnBMD+ZL7mJ56m/KrsVdiqVa31h/2X8MyNNzPw/S5+l+n4pZmW5LsVTbQ/KOseZdWa3s +I+MMaxm5u5Nool4Ddm8T2UbnPMO3e18OjMp5T1NDqfx3vrmAVjgP6Mfue0+XfLmj+WrI2ulqWmkA +F3qDiksp8B/Ingozwvt72lza6fOoDkPx9/3Oxw6brLmyfyqtdYjPgrn8KYPZKN66PlGX3Me0T+6P +wZvnrLzrsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiryz/AJyKtxJ5Ks5h9qHUI/8A +gWilB/GmTx83s/YedayQ78Z++L5zy59VRmn6rf2D8raUqD9qM7ofmMBALRm00Mo9QZF/ju0Sxkku +YHE6igRN1YnbqemQEKILz+u7MMYkA7S2+xa0MyJG8kTxLKoeP1EZCynoQGAz0jSa7BqYmWKcZgbG +jdHuPc/I+s0WXTZDjyx4ZD4/IjY/BbmW4rsVSrW/tQ/Jv4Zkabmfh+lz9L9PxSzMtyU00TQLnVJG +fl6FlEf9Iu2FVX2UftOeyjOe9oPaPB2bjuXqyy+mA5y/4mPfI/Czs5el0ksp7ojmfx1e9Q21vY2s +djZxrDaxgHgihOTFRV2A6sc+Se0+1s+tynJlO5L7Fo8EYQHU03mtcxOvKIB1YnwiYj7wM6r2OF6z +/MP6HX9p/wB18WaZ6o8+7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwD89Lf1fy4v +3/3xLbyffMqf8b5OHN6b2QnXaEB/OEh/sSf0Pl/Ln2J2KqV05S3dgaMOPE+4YHARezhdoR4sddHt +K3PKH6vcRrc23++ZBUD/AFT1XPLtNqcunn4mGUsc++Jr59/xfm+YjkjwzAlHzSy78rW1xV9Kl4yf +8scxAJ/1H6H6c9K7G/4IpFQ1sf8AkpAf7qP6Y/6V57V+zwPqwH/NP6D+v5sdubW5tZjDcRtFKvVW +FDnp2k1mHU4xkxSE4HqHmc2GeOXDMGJSXW/tQ/Jv4ZsdNzPw/S5Wl+n4o7QvK5uIl1DUi0GnH+7Q +bSzkdo69F8Wzkfab2yhorwaesmp6/wA2H9bz7o/Ouu70mgMxxz2h9p9362QzTh0SGKNYLWEUgt02 +VB/EnuTuc8fy5Z5chyZJGeSXOR5n9Q7hyDtyRVAVEdHqE32/9iv/ABEZ5fVPpWn/ALse5Zi3J95N +B/SUp7CEj72XOw9ih/hUj/tZ/wB1F1vah/dj+t+gswz050LsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirFPzVtvrH5ea5HSvG39Tt/up1k7/6uSjzd37OZOHX4j/Sr5inyXl77a7FVC+H ++jP7U/WMXG1n92XsNuawRmtaqpr9GeU5B6j735vyipn3qmQa1c3EU8P1e+iW6g7B/tr/AKr9RmXo +dfn0mTxMEzjl5cj7xyPxY5scMseHIBIfjkUkvtA8u29zHesXu1UH0LGUUUP4yMPtKPDv3zuD7ea/ +PpziiI48h2lkj3f0R0kepvbpRdZj7KwYZWCZDpE/p8lC5uZrmUyytyY7AdAAOgA7AZzMYCI2cqUj +I2VLJMXq9wpWUqdiAoI9wBnmcjZt9MwCoBfZWVxeXCwQLydu/YDxJ8MytFocupyDHjFyP2eZ8mWX +LHHHikzjSdIt9Og4p8UzD97L3PsPbPW+x+xsWix1HeZ+qXf+x5zU6mWU78u5H5uHGdirsVdirsVd +irsVdirsVdirsVdirsVdirsVdirsVdirsVUbyztb20ms7uJZra4Ro5onFVZGFCDi2YssschOJqUT +YLxjzr/zj2repeeVJuJ3Y6ZcNt8opT+p/wDgssGTve/7K9tiKhqh/nj9I/V8njOqaTqelXj2WpWs +lpdR/ailUqfmK9R4EbZaC99p9TjzQE8chKJ6hATqDBICK/Cx+4VxY6z+6Pw+96xprBtOtWG4MMZB ++ajPLNSKyS/rH735z1grNMf0j96Jylx3Yql+q/7q/wBl/DNnovpPvaMyX5mNLsVexpp9xfak8MA3 +rVmPRRTqc8/7N7Oy6vIMeMdBZ6Ad5fSDmjjx2WZaZpdtp9uIohVz/eSnqx/p7Z692V2Vi0WPgh9X +WXU/s7g6DUaiWWVlGZs2h2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpX5 +g8saD5hszZ6xZx3UW/BmFHQnvG4oyn5HCDTmaLtDPpZ8eKRifsPvHIvEfOX/ADj3rNszy+WJhf20 +vwC1nZY5o+fw/bNEdVrUnY+xywZO973Se2WLLjMNQOCdcxvE19o+1y6dNpgGmzsrTWI+rSsleJaL +4GK1oaVXPM9YKzT/AK0vvfKdXkE805DrIn7W8xnHdiqXar9qP5H+GbTRfQfe0ZeaAzLaU48s+V9S +8w34tbNeKLvPcNXhGvifEnsO+X6fTyyyoNuLCZmg+hLe1t7cMIUCBzyanc5v9HocOmjw4oiIegnk +lLmVXMtg7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx7X/ACRo ++rcpQv1W8ap9eID4ie7r0b9fvmq1vZGLPv8ATPvH6WqeES97znXfKOs6OxaaL1bbtcxfEn+y7r9O +cprOzMuDci494/GzhzxGKS5r2tLtV+1H8j/DNpovoPvaMvNMfKPk7UPMd5wi/dWURH1m6I2Ufyr/ +ADMfD782um0ssp25d6cOA5D5Pc9G0XT9GsI7Gwj9OFNyTuzMerOe5OdHixRxx4Yu4x4xAUEdljN2 +KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVzKGBVgCpFCDu +CDiRasS178u9LvuU1hSyuTvxUfumPuo+z/sfuzR6zsPHk3h6JfZ+z4NE8APLZh9r+WGs3usLb34+ +rWMG81wpDcweixe5p3G3fwzD0PZWSJMZ7C+f6nE/KylLfk9V07TrLTrOKzsohDbwiiIv6z4k9znS +wgIChydhGIiKCIybJ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux +V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV +2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 +KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K +uxV2KuxV2KuxV2KpKnnbye/mM+WV1mzbzAo5HSxPH9Y2XmR6deXLh8XHrx36YqnWKuxV2KuxV2Kv +FPz1/Oe98uz/AOGvLsgj1VkD397QMYFcVWNART1GU8uX7IpTc7b7snswZR4k/p6DvcHVakx9MebC +vL35I/mb5rsU1zVtZaza8USQi8lmluHRt1ZgPsgg1AJr7Zn5u1dPhPBGN13VTjw0uSYsl7P+UvkP +WfJmi3mnapqC6g01z60EiFyFQoq8aP0+IE7Zou0dXDPMSiOHZztPiMBRNsf/AD7/ADSvvKOn2ula +M4j1nUlZ2uKAtBAvw8lB25O2yntQ96Zk9kaAZpGU/pj9pa9XnMBQ5l5l5Y/Jz8wfOnlw+Z5tdZJ7 +sO9lFdSTSSTBSVq8lTwDMDTr45ts/aWHBPwxHYc6rZxcemnOPFaJ/Jr81vMui+bIfKvmO5mubC5n ++pBLli8trc8uCgO1Tx5/Cy1oOo6bw7T7PxzxnJjFEC9uoTptRKMuGXJ9O5ybtXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FWH/m95yufJn5ba75ktFVryxgVbXkKqJp5EgiZh3CvKGI74q+W/wAnfyhv/wA7 +Bq3mjzl5kvZFtrj6sgVhJO0pVZGNZeSxxgMAqqvypTFX0d+UH5LaZ+WTaumm6rdaha6p9W4w3QSs +Jt/VqVKcQefrb/COnfFUZ5+/Oz8uPIlytn5g1QJqLqHGn26PPOFPRnVAQgPbmRXtirfkD86vy68+ +XElp5e1P1NQiUyPYTxvBPwBoWVXADgd+BNO+Kphr/wCZvk7QPNeleVdUvGg1nWgp0+H03KP6jmNa +yAcFq603OKpBJ/zkP+U36fbQrfWfrl7GkzyvawyywqLaJ5pP3oXg1EjP2CcVeV+UZP8AnHjzH+ed +r5n0bXNSuPMeoXL3NrpbwyR2xuvSYs5dolYLQFgpf7Xt8OKvofzP5q8veVtHl1jzBfR6fpsNA88t +d2PRUVQzux7KoJxV51pX/OU/5MajqKWI1eS1aRgkdxdW8sUJJNBWQghB7vQYq9Tu9QsbOxlv7u4j +t7GCMzTXUjBYkjUci7OTQKBvXFXkt5/zlh+S1tetbLqdxcKrcWuYbWYxdaEgsFYgeIX5VxV6b5d8 +z6J5j0C11/SLn6xpN4jSQXJV46qrFWJWQKwoykbjFXxiuuafq/5gDW9fY/o661H63frxLkwerzaM +KP8AI+AZ3/hShh4IfUI0Pe6HiEp3Llb26X/nKzQFueEOg3TWlaCVpY0kp/xjAZf+HzQj2fnW8hbn +fnx3PUvI/n3y75z0s6ho0rH0iEurWUBZoWIqA6gnr2IJB+g5qNVpJ4JcM/7XLxZYzFh80f8AORl+ +9z+aN7CzVFjb20CDwDRCan3zE51XYsK04PeT+r9Dq9abyF9OeQoEt/I/l6FPsx6baLWlK/uEqdvH +OT1ZvNM/0j97tcQ9A9z5H/NKth+aWvyWx4PHqDzodtnZhITtT9o52mg9Wnhf8102fbIfe+0oJVmg +jlUELIocA9aMK5whFGnehfgV2KuxV2KuxV2KuxV2KuxV2KuxV2KpF568pWXm/wAoar5avWMcGpwG +L1QKmNwQ0cgHfhIqtT2xV8UCH85v+cffMzzKhjsblwjS0M2mXypUqCfhowBNPsyD5Yq+pPyq/Pny +/wCfvK+oalFA1nq+jwNPqelFuRCqpYPE9BzRuNOlQdj2JVfMn5GeZvJ2pfmzqfm38zL62q8M11A1 +8OcTXksiKtFIYfu4y3BabbU6Yqu8/wDmLyVov5/6R5k/L64t/wBFLNZ3U/1EcIRI0hS5jVQBxEkf +2gB+0cVZD/zms7x/mFoEkbFHTS1ZHU0IIuZSCCMVe5flr/zj5+WnlvS9Hv8A9Erda9HbK1zqE8kr +l5ZoeM37ov6XAh2XjxpTxO+KvBdAs7Oy/wCcyBaWcEdtaw6pcLFBCixxov1R9lVQAB8sVXf85ceZ +ptW/NXTvK9zcG30bSYoBJv8ACsl2Q8sx+URQfR74qmv/ADkNqP5C6h+XVpD5Mn0w61pc0EdmtigS +Y21GV0duKl135HkSa7+OKq93eeZfNH/OGtstn6tzNpU4g1BUBZmsrKdiuw/ZiT0ifZa4ql//ADjJ +56/Jiw0OXy15tsbODWry6ZhqWo28UsE8bhQkRmdW9ILx+y9E71qcVfV8Ol6Vpfl57HSbaGz06GCT +6vbWyLHCiuGc8FSigEsTtkofUES5Pi38vNAt/MHnbRtHuQTbXdyouFU0JiSryAHtVVIrnfazMceK +UhzAdDhhxTAfUn5n/l75XvPy91WG20u2t5tPtJbmwkgiSN43t0LhVZQNmCcSM5HQazJHPEmRPEaP +xdtnwxMDtyeIf8416rdWn5jLZRsfQ1G1mjnSu1Yl9VGp4gpT6Tm/7cxg4L6xI/U4GilU670t/wCc +gY3T82daZhtItqy/L6pEv61y3sc/4NH4/eWOr/vD+Oj6p8lkHydoJBqDp1oQR/xgTOQ1X97L+sfv +dvi+ke58h/nD/wCTO8xf8xbf8RGdr2b/AIvD3Ol1P94X2dYKy2NurAqyxIGU7EEKNjnCz5l3g5K+ +RS7FXYq7FXYq7FXYq7FXYq7FXYq7FUHq+saTo2nyajq15Dp+nwlBNd3MixRJ6jiNObuQq1dgNzir +FvOfnP8AKmbyjqB8w6vpl5oU0DieH14ZvWWleMSKxLyVHwcd69MVfLn/ADh95fv9U84+Y3QvHpx0 +Seyu5lFRzu5IxEu/ekbsP9XFUj/Ie28laL+aN95e/MuwtBE0U1iP0mqGGC9ilUjmZPhTkEZQx9vH +FX1M3k//AJxztru0iOn+Wo7u5mjhsoh9V9WSd2CxpEoPJmLEUAxV4H/zm1/yn+hf9sof9RMuKvsD +Sf8AjlWX/GCL/iAxV8f6Z/62k/8A21bj/qDfFUJ/zlvoc+j/AJv2XmC5t/rGmapb28yhh8EjWhEU +0Jr/AJCoT7Nir3rR9A/5xl1bRoNYtNP8tixnjEgaVbWJkBFSsiuQUZejA9MVZlot/wDln5e8tWkm +kXelaZ5avpmjsZYZYIrOad+XJYnqI3ZvSbod6HFXzV/zlZ5E/KfStLsvMHlqS1stevbpY5dOsJIz +DNC0bM03ooaR8Sq/EgANdxU1xV7P/wA4vXurXv5K6I+pM0nptcQWjvuTbRTukY37LQoPYDFXg9jF +/gH83II9QUpb6PqQEhIJP1YvtIO5rCwcZ3Uz+Y0x4eco/b/a6Mfu8m/QvpD80fPnluz/AC51a4g1 +O2uH1G0ltdPEEySGV50MQMfAmvDlyJ7Uzl9BpMks8QYkcJs7dztM+WIgd+bxf/nGXQLq889S6uEI +tNLtn5y9vVnHponzK8z9Gb3t3MI4eHrI/c4Ohhc77kR/zlB5fuLXzfZa2qH6pqNqsRkA29a3JDAn +/UZafTkOwcwOIw6xP2FOuhUge961+U3nzy7c/lnpk9xqEFu2j2iWt+krqjRfVl4AsCejIoIPf55p +u0dJMaiQAJ4jY+LmafLE4xvyfOMcL+e/zXYWqM0Os6o8gFCSts0pdmav8kIqc6gn8vpt/wCGP2/2 +usrxMnvL7TzhHeOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpP5v8p6J5u8u3nl7XImn0u+CC4jR2jY+ +lIsqEOhBFHjU4q8nT/nDv8n1uBKf0kyVr6Bul4U8KiMPT/ZYq9W8o+S/K/lDSF0ny5p8en2KnmyR +1LO9AC8jsWd2oOrEnFWMfmB+RH5a+e7z9Ia3pzJqhUI2o2kjQTMoFBzpVHoBQF1JHTpiqR+Vv+cW +vyn8u6zZ6xbwXt3fafPHdWbXNyxVJoWDxvxiEXLiyg0ao8a4qn35ifkf5D/MDVLbU/MUVxJdWkH1 +aEwTGJfT5s+4ANTVzirPIIUggjhj+xEoRa7miigxVgcP5H+Q4fzCPn5Irj/EJne5MhmPpeo8ZjP7 +ulKcWxVknm/yV5X84aQ2keZNPj1CxZg6o/JWRxsHjkQq6NvSqkbbdMVeVj/nDz8nxceqRqRjqT9X +N0OHyqI+f/DYqzbWfyW/L7V/I9h5JubKRfL+lyiexgjnlDxygSDl6hZmb+/fZqjf5Yqw3Tv+cQvy +dtLtLiWC/vkU1+rXF0fTPz9JYn/4bFXsljY2VhZQWNjAltZ2yLFb28ShEREFFVVGwAGKsP8AzD/K +Pyt534T3yva6nEvCLULegfj1CyKQVdQfHfwIzP0faOTT7DePcWjNp45OfN5/af8AOKOkLcBrvzDc +TW9d44rdInpTpzZ5R/wubKXtBKtoC/e4w7PHUvX/ACr5T0LytpEelaLbC3tUPJyTyeRyADJIx3Zj +T+A2zS6jUTzS4pmy5uPGICgu80eVtE80aPLpOs24ntJaEdnjcfZkjbqrDx+jpg0+onilxQNFcmMT +FF47c/8AOKOlNccrXzDPFb1NI5bdJHpTYc1eMf8AC5vI+0Eq3gL97hHs8d70L8vfyk8reSA89gJL +rUpl4S6hcEGTgSCUQKAqKSPn4nNZrO0cmo2ltHuDk4dPHHy5s2zAb3Yq7FXYq7FXYq7FXYq7FXYq +7FXYq7FVK6ure1gae4cRxJTk59zQfjlOo1EMMDOZqIZ48cpy4Yiyx+fzmgnAht+cA6sxox+XWmcT +n9tojJWPHePzNE+7u/HJ2kOyjw7ndNdL13T9SaSO3c+tEA0sTDdQ1aVptvTOo7L7Xxa2PFCwRzBH +4BcLUaSeKjLkeqYZtHFYnfeeL2HUNWtrXR3vIdG4NeTJMikI6F+QRhU0CnYYqyPTNRt9S063v7Yk +wXMayR12IDCtD7jocVS+LW7h/N0+imNPq8Vkt0JN+ZZpOFOtKUxVN5ZooYmlmdY4kBZ5HIVVA6kk +7DFUNY6xpN+zLYXtvdsgq4glSQqD0rwJpiqteXltZ2st1dSLDbwqXlkY0AAxVAaB5k0nXbQXFhMr +HcvAWUyoORVS6Akry41FcVQvnHzTF5e05Jh6b3dxIIraGVwgJJHJz34pX4sVTLR57y40+Ka7e3kl +kBYSWbM8DKT8JRm3NRirrzWdIspVhvb63tpXFUjmlSNmFaVAYgnFUYCCKjcHocVQ13qmmWdRd3cN +txUO3qyIlFJ4hjyI2J2xVEghgCDUHcEdCMVQMmu6HHKsMmo2ySs5jWNpowxdW4soBNahtiPHFV9t +rGk3Vy9rbXtvPcx19SCOVHdeJoaqpJFDiqLxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVJ/N8DT+XL +6NQWYorADckq6t2+WantzHx6PIPL7iC5/Zk+HURP45PKb2XULGyb96VY0HHrxB988yjpRxDiG72U +RDJLkyT8oFkM+qSsGKlYhzNaFqsaV8c7b2ZjvPu2/S6b2iIqA9/6HpWda8u83isNd1DzV5wstMnt +7eK5NtFeTTK7uEeF1/dBSBWhPXFWe6RpkOl6Xa6fAS0VrGsas3U8RuTTx64qkFv/AOTNu/8AtlR/ +8n8VTbzPqcGl6Be389uLqKGP4rciofkQoVtm2q2+3TFWHaQ1yfzA017hLKGebTpHeKwDBQjHkokJ +2Y4qznWIll0m8RkDhoJPhIrU8TTb54qkX5ZxW6+TdOkjRBK6P6jqByakrj4iNzTFUN+aMUT6Pp7M +isw1G3UEgE0atR9NMVZiiJGgSNQiKKKqigA8ABirziODR7nUfOx1lYXu4yfTM/HmkAiPpmPluP2f +s96e2Ksp8gtct5O0k3FfU9AAcuvAEiP/AISmKpVrGmWGo/mTYQ30CXMMemvIIpQGQsJSoJU7H7Xf +FWaABQABQDYAdAMVeTyadYzaD57upYEe5TUbkRzMoLqEkDDi3UbnFU5j0uw0/wAy+SPqcKwmW2uk +mKAKX4WqsC9KcjyYmpxVn+KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuIBFDuD1GKsd1jyNoupsrMH +gHINIsRAVgDUihrx+jNJqewNPlmJC499cj+r4O003a2XEK5+9O7Gxs7G2S1s4lhgjFEjUUH9p9zm +3xYY44iMBUQ6/LllklxSNkq+WNaGt9Nsba6ubuCFY7m8Km5lHVygIWvyBxVE4qh10+yW+a/EKi8e +MQtP+0YweQX5VxVVngguIXgnjWWGQFZI3AZWU9QQdiMVS/T/ACzoGnSrNY2ENvKvLjJGoDfGAG36 +9sVTPFUBpug6Npbyvp9nFatPT1TEvHlStP14qrX+m2N/EkV5Cs8cbrKit0Dr9lvoxVE4qlmo+WfL ++pXC3N/YQ3M6AASOoJoOgPiPniqZKqqoVQFVRRVGwAHYYqoNp9k18t+YVN4kZhWf9oRk8ivyriqI +xVAfoLR/QvLf6qno37tLeJvSR3NWZvniqq2l6e09pO0CmaxDLZv3jDqEYL81FMVRWKuxV2KuxV2K +uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku +xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux +V2KuxV2KuxV2Kv8A/9k= + + + + + + + image/svg+xml + + + + + + + + + + + + + + 2005-04-04T07:58:17Z + 2005-04-20T12:01:04Z + Illustrator + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq0XQMFLAM32VJ3NPDImcQQCdymjzbySHYq7FXMyqCzEBRuSdhgJAFlBN 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 KuxV2KuxV2KuxV2Kv//Z + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10000.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10000.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10001.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10001.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10002.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10002.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10003.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10003.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10004.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10004.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10005.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10005.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10006.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10006.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10007.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10007.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10008.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10008.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10009.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10009.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10010.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10010.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10011.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10011.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10012.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10012.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10013.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10013.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10014.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10014.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10015.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10015.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10016.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10016.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10017.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10017.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10018.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10018.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10019.bmp Binary file scrsaver/scrsaverplugins/BmpAnimScrPlugin/srcdata/series60/SS10019.bmp has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/cenrep/1020744E.txt Binary file scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/cenrep/1020744E.txt has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/cenrep/keys_screensaveranimplugin.xls Binary file scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/cenrep/keys_screensaveranimplugin.xls has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/conf/screensaveranimplugin.confml Binary file scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/conf/screensaveranimplugin.confml has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/conf/screensaveranimplugin_1020744E.crml Binary file scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/conf/screensaveranimplugin_1020744E.crml has changed diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/data/10207447.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/data/10207447.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2005 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: ECOM Resource file for ScreenSaverAnimPlugin +* +*/ + + + + + +// INCLUDES +#include + +#include "ScreensaverpluginIntDef.hrh" +#include "ScreenSaverAnimPluginImplementationUid.hrh" +#include "screensaveranimplugin.loc" + +// RESOURCE DEFINITIONS +// ----------------------------------------------------------------------------- +// +// theInfo +// ECOM DLL interface & implementation description resource. +// +// ----------------------------------------------------------------------------- +// +RESOURCE REGISTRY_INFO theInfo + { + dll_uid = 0x10207447; + interfaces = + { + INTERFACE_INFO + { + interface_uid = KCScreensaverPluginInterfaceDefinitionUid; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid =KScreenSaverAnimPluginImplementationUID; + version_no = 1; + display_name = qtn_sanim_screensaver_name; + default_data = ""; + opaque_data = "07"; + } + }; + } + }; + } +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/data/ScreenSaverAnimPlugin.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/data/ScreenSaverAnimPlugin.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,378 @@ +/* +* Copyright (c) 2005 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: Resource file for ScreenSaverAnimPlugin +* +*/ + + + + + +// RESOURCE IDENTIFIER + +NAME ANSS + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ScreenSaverAnimCustControl.rh" +#include +#include "ScreenSaverAnimPlugin.hrh" + +// --------------------------------------------------------- +// +// Define the resource file signature +// This resource should be empty. +// +// --------------------------------------------------------- +// +RESOURCE RSS_SIGNATURE + { + } + +RESOURCE TBUF + { + buf = "AnimScreenSaver"; + } + +STRUCT MIMETYPE_SPECIFIC_PLUGIN_ARRAY + { + STRUCT pairs[]; // array of mimetype and implementation uid pair + } +// ----------------------------------------------------------------------------- +// SCREENSAVER_MIMETYPE_PLUGIN_PAIR +// One mapping between file name extension and MIME type. +// ----------------------------------------------------------------------------- +// +STRUCT SCREENSAVER_MIMETYPE_PLUGIN_PAIR + { + LTEXT mimetype; + LONG implementation_uid; + } + +RESOURCE MIMETYPE_SPECIFIC_PLUGIN_ARRAY r_mimetype_specific_plugin_array + { + pairs = + { + SCREENSAVER_MIMETYPE_PLUGIN_PAIR + { + mimetype = "image/svg+xml"; + implementation_uid = 0x102071E6; + }, + SCREENSAVER_MIMETYPE_PLUGIN_PAIR + { + mimetype = "image/gif"; + implementation_uid = 0x102750B4; + }, + SCREENSAVER_MIMETYPE_PLUGIN_PAIR + { + mimetype = "application/m3g"; + implementation_uid = 0x102750B3; + } +#ifdef RD_FLASHLITE_SCREENSAVER + , + SCREENSAVER_MIMETYPE_PLUGIN_PAIR + { + mimetype = "application/x-shockwave-flash"; + implementation_uid = 0x101f4e5d; + } +#endif + + }; + } + +//---------------------------------------------------- +// +// r_anim_timeout_slider +// Duration slider. +// +//---------------------------------------------------- +// +RESOURCE SLIDER r_anim_timeout_slider + { + layout = EAknSettingsItemSliderLayout; + minvalue = 5; + maxvalue = 60; + step = 1; + valuetype = EAknSliderValueBareFigure; + singular_valuelabel = qtn_sanim_duration_slider_ykcur; + minlabel = qtn_sanim_duration_slider_min; + maxlabel = qtn_sanim_duration_slider_max; + valuelabel = qtn_sanim_duration_slider_cur; + } + +//---------------------------------------------------- +// +// r_light_timeout_slider +// Backlight slider. +// +//---------------------------------------------------- +// +RESOURCE SLIDER r_light_timeout_slider + { + layout = EAknSettingsItemSliderLayout; + minvalue = 0; + maxvalue = 30; + step = 1; + valuetype = EAknSliderValueBareFigure; + singular_valuelabel = qtn_sanim_duration_slider_ykcur; + minlabel = qtn_sanim_slider_off; + maxlabel = qtn_sanim_slider_max_secs; + valuelabel = qtn_sanim_slider_context_value_secs; + } + +// ----------------------------------------------------------------------------- +// +// r_anim_timeout_setting_page +// Screen saver setting page. +// +// ----------------------------------------------------------------------------- +// +RESOURCE AVKON_SETTING_PAGE r_anim_timeout_setting_page + { + number = EAknSettingPageNoOrdinalDisplayed; + label = qtn_sanim_list_anim_timeout; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + type = EAknCtSlider;//0xffff; + editor_resource_id = r_anim_timeout_slider; + } + +// ----------------------------------------------------------------------------- +// +// r_light_timeout_setting_page +// Screen saver setting page. +// +// ----------------------------------------------------------------------------- +// +RESOURCE AVKON_SETTING_PAGE r_light_timeout_setting_page + { + number = EAknSettingPageNoOrdinalDisplayed; + label = qtn_sanim_list_light_timeout; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + type = EAknCtSlider;//0xffff; + editor_resource_id = r_light_timeout_slider; + } + + +// ----------------------------------------------------------------------------- +// +// r_sanim_setting_lbx +// +// ----------------------------------------------------------------------------- +// +RESOURCE LISTBOX r_sanim_setting_lbx + { + array_id = r_sanim_setting_lbx_items; + flags = EEikListBoxMultipleSelection; + } + +// ----------------------------------------------------------------------------- +// +// r_sanim_setting_lbx_items +// +// ----------------------------------------------------------------------------- +// +RESOURCE ARRAY r_sanim_setting_lbx_items + { + items = + { + LBUF + { + txt = "\t"qtn_sanim_list_anim_file"\t\t"; + }, + LBUF + { + txt = "\t"qtn_sanim_list_anim_timeout"\t\t"; + }, + LBUF + { + txt = "\t"qtn_sanim_list_light_timeout"\t\t"; + } + + }; + } + +// --------------------------------------------------------- +// +// r_sanim_setting_dialog +// SVG-T Dialog +// +// --------------------------------------------------------- +// + +RESOURCE DIALOG r_sanim_setting_dialog + { + flags = EAknDialogSelectionList; + title = "SANIM Dialog"; + buttons = R_AVKON_SOFTKEYS_SELECTION_LIST; + items = + { + DLG_LINE + { + type = ESanimCustControl; + id = ESanimDialogCustControlIdData; + control = SANIM_CUST_CONTROL + { + }; + } + }; + } +// ----------------------------------------------------------------------------- +// +// r_sanim_dialog_menubar +// Resource for Dialog "Options" Menu Bar +// +// ----------------------------------------------------------------------------- +// +RESOURCE MENU_BAR r_sanim_dialog_menubar + { + titles = + { + MENU_TITLE + { + menu_pane = r_sanim_dialog_menu; + } + }; + } + +// ----------------------------------------------------------------------------- +// +// r_sanim_dialog_menu +// Resource for Screen saver setting Dialog "Options" Menu Pane +// +// ----------------------------------------------------------------------------- +// +RESOURCE MENU_PANE r_sanim_dialog_menu + { + items = + { + MENU_ITEM + { + command = ESanimDlgChangeCommand; + txt = qtn_sanim_option_change; + flags = EEikMenuItemAction; // add this line to list item action commands + }, +#ifdef __SERIES60_HELP + MENU_ITEM + { + command = ESanimDlgHelpCommand; + txt = qtn_options_help; + }, +#endif // __SERIES60_HELP + MENU_ITEM + { + command = EAknCmdExit; + txt = qtn_options_exit; + } + }; + } + +// --------------------------------------------------- +// +// r_sanim_title_settings +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_title_settings + { + buf = qtn_sanim_title_settings; + } + +// --------------------------------------------------- +// +// r_sanim_title_settings +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_not_supported + { + buf = qtn_err_not_supp; + } + +// --------------------------------------------------- +// +// r_sanim_title_settings +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_error_wrong_format + { + buf = qtn_sanim_error_wrong_format; + } + + +// --------------------------------------------------- +// +// r_sanim_err_failure +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_err_failure + { + buf = qtn_err_failure; + } + +// --------------------------------------------------- +// +// r_sanim_slider_off +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_slider_off + { + buf = qtn_sanim_slider_off; + } + +// --------------------------------------------------- +// +// r_drm_prev_rights_set +// +// --------------------------------------------------- +// +RESOURCE TBUF r_drm_prev_rights_set + { + buf = qtn_drm_prev_rights_set; + } + + +// --------------------------------------------------- +// +// r_sanim_screensaver_name +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_screensaver_name + { + buf = qtn_sanim_screensaver_name; + } + + +// ----------------------------------------------------------------------------- +// +// r_sanim_msk_change +// Middle softkey label: change. From Avkon resources (avkon.loc) +// ----------------------------------------------------------------------------- +// +RESOURCE TBUF r_sanim_msk_change + { + buf = qtn_msk_change; + } + + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/group/ScreenSaverAnimPlugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/group/ScreenSaverAnimPlugin.mmp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2005 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 is the .mmp for building the Screen Saver Anim Plugin +* +*/ + + + + + +#include +#include +#include + +TARGET ScreenSaverAnimPlugin.dll + + +TARGETTYPE PLUGIN + +UID 0x10009D8D 0x10207447 + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +START RESOURCE ../data/10207447.rss +TARGET ScreenSaverAnimPlugin.rsc +END + +START RESOURCE ../data/ScreenSaverAnimPlugin.rss +HEADER +TARGETPATH RESOURCE_FILES_DIR +LANGUAGE_IDS +END // RESOURCE + + +/* exportunfrozen */ + +SOURCEPATH ../src +SOURCE ScreenSaverAnimPlugin.cpp +SOURCE ScreenSaverAnimPluginProxy.cpp +SOURCE NpnImplementation.cpp +SOURCE ScreenSaverAnimPluginContainer.cpp +SOURCE ScreenSaverAnimSettingDialog.cpp +SOURCE ScreenSaverAnimPluginHelper.cpp + + + +USERINCLUDE ../inc + +// This is a SYSTEMINCLUDE macro containing the middleware +// layer specific include directories +APP_LAYER_SYSTEMINCLUDE + + +LIBRARY ecom.lib +LIBRARY euser.lib +LIBRARY eikcore.lib +LIBRARY cone.lib +LIBRARY efsrv.lib +LIBRARY bafl.lib +LIBRARY centralrepository.lib +LIBRARY cenrepnotifhandler.lib +LIBRARY DrmHelper.lib +LIBRARY aknicon.lib // AknIconUtils +LIBRARY aknlayout2.lib // Scalable UI +LIBRARY AknLayout2Scalable.lib // Scalable UI +LIBRARY aknskins.lib +LIBRARY CdlEngine.lib // Scalable UI +LIBRARY avkon.lib +LIBRARY apgrfx.lib +LIBRARY apmime.lib +LIBRARY mgfetch.lib +LIBRARY eikcoctl.lib +LIBRARY CommonEngine.lib +LIBRARY eikdlg.lib +LIBRARY flogger.lib +LIBRARY caf.lib +LIBRARY cafutils.lib +#ifdef __SERIES60_HELP +LIBRARY hlplch.lib // for "Help" options menu +#endif // __SERIES60_HELP + + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/group/bld.inf Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,43 @@ +/* +* Copyright (c) 2005 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: Build information file for ScreenSaverAnimPlugin +* +*/ + + + + + +#include + +PRJ_PLATFORMS +// Defaults + + + +PRJ_MMPFILES + +ScreenSaverAnimPlugin.mmp +PRJ_EXPORTS +//../inc/NPNExtensions.h MW_LAYER_PLATFORM_EXPORT_PATH(NPNExtensions.h) +../loc/screensaveranimplugin.loc MW_LAYER_LOC_EXPORT_PATH(screensaveranimplugin.loc) + +../rom/ScreenSaverAnimPlugin.iby CORE_MW_LAYER_IBY_EXPORT_PATH(ScreenSaverAnimPlugin.iby) +../rom/ScreenSaverAnimPluginResources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(ScreenSaverAnimPluginResources.iby) + +// Generic configuration interface for component cenrep settings +../conf/screensaveranimplugin.confml APP_LAYER_CONFML(screensaveranimplugin.confml) +../conf/screensaveranimplugin_1020744E.crml APP_LAYER_CRML(screensaveranimplugin_1020744E.crml) + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/NpnImplementation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/NpnImplementation.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,140 @@ +/* +* Copyright (c) 2005 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: Thin wrapper around plugin's function table. +* +*/ + + + + + +#ifndef NPNIMPLEMENTATION_H +#define NPNIMPLEMENTATION_H + + // INCLUDE FILES +#include +#include +#include +#include +#include + + +NPError NpnGetUrl( NPP aInstance, const TDesC& aUrl, + const TDesC* aWindowType ); + + +NPError NpnPostUrl( NPP aInstance, const TDesC& aUrl, + const TDesC* aWindowType, const TDesC& aBuf, NPBool aFile ); + + +NPError NpnRequestRead( NPStream* /*aStream*/, + NPByteRange* /*aRangeList*/ ); + + +NPError NpnNewStream( NPP /*aInstance*/, NPMIMEType /*aType*/, + const TDesC* /*aWindowType*/, NPStream** /*aStream*/ ); + + +TInt32 NpnWrite( NPP /*aInstance*/, NPStream* /*aStream*/, + TInt32 /*aLen*/, void* /*aBuffer*/ ); + + +NPError NpnDestroyStream( NPP /*aInstance*/, + NPStream* /*aStream*/, NPReason /*aReason*/ ); + + +void NpnStatus( NPP /*aInstance*/, const TDesC& aMessage ); + + +const TDesC* NpnUAgent( NPP /*aInstance*/ ); + + +void* NpnMemAlloc( uint32 aSize ); + + +void NpnMemFree( void* aPtr ); + + +uint32 NpnMemFlush( uint32 /*aSize*/ ); + + +void NpnReloadPlugins( NPBool aReloadPages ); + + +JRIEnv* NpnGetJavaEnv(); + + +jref NpnGetJavaPeer( NPP /*aInstance*/ ); + + +NPError NpnGetUrlNotify( NPP aInstance, const TDesC& aUrl, + const TDesC* aWindowType, void* aNotifyData ); + + +NPError NpnPostUrlNotify( NPP aInstance, const TDesC& aUrl, + const TDesC* aWindowType, const TDesC& aBuf, NPBool aFile, void* aNotifyData ); + + +NPError NpnGetValue( NPP aInstance, NPNVariable aVariable, void *aRetValue ); + + +NPError NpnSetValue( NPP aInstance, NPPVariable aVariable, void *aSetValue ); + + +void NpnInvalidateRect( NPP /*aInstance*/, NPRect * /*aRect*/ ); + + +void NpnInvalidateRegion( NPP /*aInstance*/, NPRegion /*aRegion*/ ); + + +void NpnForceRedraw( NPP /*aInstance*/ ); + + + +// ----------------------------------------------------------------------------- +// PluginNpnFuncs +// +// A const global variable used to hold the browser callback functions. +// ----------------------------------------------------------------------------- +// +const NPNetscapeFuncs NpnImplementationFuncs = + { + sizeof( NPNetscapeFuncs ), + 1, // Version + NpnGetUrl, + NpnPostUrl, + NpnRequestRead, + NpnNewStream, + NpnWrite, + NpnDestroyStream, + NpnStatus, + NpnUAgent, + NpnMemAlloc, + NpnMemFree, + NpnMemFlush, + NpnReloadPlugins, + NpnGetJavaEnv, + NpnGetJavaPeer, + NpnGetUrlNotify, + NpnPostUrlNotify, + NpnGetValue, + NpnSetValue, + NpnInvalidateRect, + NpnInvalidateRegion, + NpnForceRedraw + }; + + +#endif // NPNIMPLEMENTATION_H +// End Of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimCustControl.rh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimCustControl.rh Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,41 @@ +/* +* Copyright (c) 2004,2005 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: Resource Header for SVGT Custom Control Structure +* +*/ + + + + + +#ifndef SCREENSAVERANIMCUSTCONTROL_RH +#define SCREENSAVERANIMCUSTCONTROL_RH +// INCLUDES + +// MACROS + +// STRUCTURE DEFINITIONS + +// ----------------------------------------------------------------------------- +// SANIM_CUST_CONTROL +// Defines the resource structure for SVGT Custom Control. +// ----------------------------------------------------------------------------- +// + +STRUCT SANIM_CUST_CONTROL + { + } +#endif // SCREENSAVERANIMCUSTCONTROL_RH + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPlugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPlugin.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,576 @@ +/* +* Copyright (c) 2005 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: ScreenSaverAnimPlugin provides an implementation of +* MScreensaverPlugin for animation files. +* +*/ + + + +#ifndef C_SCREENSAVERANIMPLUGIN_H +#define C_SCREENSAVERANIMPLUGIN_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +class CEikonEnv; +class CDRMHelper; +class CScreensaverRepositoryWatcher; +class CRepository; + + +_LIT( KFileLoggingDir, "ScreenSaver" ); +_LIT( KFileLog, "SaveLog.txt" ); +_LIT( KEmptyString, "" ); + +#ifdef SCREENSAVER_LOG_ENABLED + +inline void PrintDebugMsg( const TDesC& aMsg ) + { + RDebug::Print( aMsg ); +#if 0 + RFileLogger::Write( KFileLoggingDir, + KFileLog, EFileLoggingModeAppend, aMsg ); +#endif + } +#else + +inline void PrintDebugMsg( const TDesC& /*aMsg*/ ) + { + } + +#endif + +/** +* Encapsulates the Settings that are written into the central repository +* @lib ScreenSaverAnimPlugin.lib +* @since 3.1 +*/ +class CScreenSaverAnimSettingObject : public CBase + { + + public: + CScreenSaverAnimSettingObject(); + + public: + + // Name of the file to be set as screensaver + TFileName iFileName; + + // Animation Timeout + TInt iAnimationTimeout; + + // Lights Timeout + TInt iLightsTimeout; + }; + +/** +* Provides the Animated ScreenSaverPlugin functionality which implements +* ScreenSaver Interface and gives a Netscape Browser Plugin Interface +* to the format specific plugins like SVG, Flash, M3G etc. +* @lib ScreenSaverAnimPlugin.lib +* @since 3.1 +*/ + +class CScreenSaverAnimPlugin: public CScreensaverPluginInterfaceDefinition, + public MPluginAdapter, + public MCoeControlObserver + { + + public: + + /** + * Two-phased constructor. + * @since 3.1 + */ + static CScreenSaverAnimPlugin* NewL(); + + /** + * Destructor. + */ + virtual ~CScreenSaverAnimPlugin(); + + public: // Functions From CScreensaverPluginInterfaceDefinition + + /** + * From MScreensaverPlugin, Method called by ScreenSaver Application + * when an animation file is configured as a Screen Saver. + * @param aHost Screen saver plugin host. + * @since 3.1 + */ + virtual TInt InitializeL( MScreensaverPluginHost *aHost ); + + /** + * From MScreensaverPlugin, Method called by ScreenSaver Application + * when Screen Saver is activated. + * @since 3.1 + */ + virtual TInt Draw( CWindowGc& aGc ); + + /** + * From MScreensaverPlugin, Method called by ScreenSaver Application + * before the InitializeL. + * @since 3.1 + */ + virtual const TDesC16& Name() const; + + /** + * From MScreensaverPlugin, Method called by ScreenSaver Application + * to get the capabilities of Screensaver plugin. + * @since 3.1 + */ + virtual TInt Capabilities(); + + /** + * From MScreensaverPlugin, Method called by Psln Application + * when the user selects Animated ScreenSaver + * @since 3.1 + */ + virtual TInt PluginFunction( + TScPluginCaps /*aFunction*/, + TAny* /*aParam*/ ); + + /** + * From MScreensaverPlugin, Method called by ScreenSaver Application + * when there are Screen Saver events. + * @since 3.1 + */ + virtual TInt HandleScreensaverEventL( + TScreensaverEvent aEvent, + TAny* aData ); + + public: // New Functions + + /** + * Reads the animation settings from the central repository + * @since 3.1 + * @return System wide Error value + */ + TInt GetAnimSettings(); + + /** + * Writes the animation settings to the central repository + * @since 3.1 + * @return System wide Error value + */ + TInt SetAnimSettings() const; + + /** + * This method registers for expiry of drm content + * @since 3.1 + * @return System wide Error value + */ + TInt RegisterForDrmExpiry(); + + /** + * This method unregisters for expiry of drm content + * @since 3.1 + * @return System wide Error value + */ + TInt UnregisterForDrmExpiry(); + + /** + * This method reads and parses the central repository key + * for drm expiry + * @since 3.1 + * @return System wide Error value + */ + TInt ReadDrmNotification( TDes8& aString ); + + /** + * Called when there is a drm expiry notification + * @since 3.1 + */ + void ProcessDrmNotificationL(); + + /** + * This method pops the settings dialog + * @since 3.1 + */ + void PopSettingsDialogL(); + + /** + * This method checks whether the set file exists currently + * if not, it updates the filename string + * This also checks if the rights are valid if the content is drm + * if not, it updates the filename with the empty file name + * returns True, if the Filename is updated + * False, otherwise + * @since 3.1 + */ + TBool UpdateFileName(); + + /** + * Called when HandleScreenSaverEventL is called with EDisplayChanged + * Used to set the parent control for the animation plugins + * returns KErrGeneral when SetWindow does not go through + * @since 3.1 + */ + TInt SetWindow( CCoeControl* aParent ); + + /** + * Called to set the filename for the animation plugins + * @since 3.1 + */ + void AsFile(); + + /** + * Called when there is a central repository settings change + * @since 3.1 + */ + void HandleSettingsChange( TAny* aPtr ); + + /** + * Called by the repository watcher when there is a central + * repository settings change + * @since 3.1 + */ + static TInt HandleRepositoryCallBack( TAny* aPtr ); + + /** + * Called by the repository watcher when there is a + * drm expiry notification + * @since 3.1 + */ + static TInt HandleDrmNotification( TAny* aPtr ); + + /** + * Sends an event to the plugins to check for the file's validity + * repository settings change + * returns KErrNone if the file is valid + * @since 3.1 + */ + TInt CheckFileValidityL( const TDesC& aFileName ); + + /** + * Parses the mime description and checks whether the given mime type + * is present in the mime description + * @since 3.1 + * @param aMIMEDescription mime Description which has mimetype, + * extension and description + * @param aDataType mimetype to be searched + * @return TBool ETrue if aDataType is present in aMIMEDescription + * EFalse otherwise + */ + static TBool ParseMimeStringL( const TDesC& aMIMEDescription, + const TDesC& aDataType ); + + /** + * Given the mimetype searches and returns the browser plugin which + * handles the given mimetype + * @since 3.1 + * @param aDataType + * @return TUid uid of the plugin which handles the mimetype + */ + TUid FindAnimPluginL( const TDesC& aDataType ); + + + public: // From MPluginAdapter + + /** + * Gets the pointer to the minor version number of the plug-in version + * number of the Browser Plug-in API. + * @since 3.1 + * @return Series 60 returns 1. Series 80 and + * the Nokia 7710 smartphone return 101. + */ + virtual TUint16 GetVersion(); + + /** + * Called when the plug-in has completed its creation. + * This function is called from the constructL function of the plug-in. + * @since 3.1 + * @param aPluginControl A pointer to the plug-in control window + */ + virtual void PluginConstructedL( CCoeControl* aPluginControl ); + + /** + * Called after the plug-in has been deleted. + * This function is called from the destructor of the plug-in. + * @since 3.1 + */ + virtual void PluginFinishedL(); + +#ifndef __SERIES60_30__ + + /** + * Called by the plug-in to open a URL in the parent frame. + * This function is not implemented in Series 60. + * It is supported in Series 80 and in the Nokia 7710 smartphone. + * @since 3.1 + * @param aUrl Name of the URL to open + */ + virtual void OpenUrlL( const TDesC& aUrl ); + + /** + * Called by the plug-in to open a URL in a named window or frame. + * This function is not implemented in Series 60. + * It is supported in Series 80 and in the Nokia 7710 smartphone. + * @since 3.1 + * @param aUrl Name of the URL to open + * @param aNewTargetWindowName The name of the target window or frame + */ + virtual void OpenUrlInTargetWindowL( const TDesC& aUrl, + const TDesC& aNewTargetWindowName ); + + /** + * Specifies whether or not the frame has a previous navigation + * history item. + * This function is not implemented in Series 60. + * It is supported in Series 80 and in the Nokia 7710 smartphone. + * @since 3.1 + * @return true if the frame has a previous navigation + * history item false otherwise + */ + virtual TBool HasNavigationHistoryPrevious() const; + + /** + * Informs the browser to load the next navigation history URL + * in its parent frame. + * This function is not implemented in Series 60. + * It is supported in Series 80 and in the Nokia 7710 smartphone. + * @since 3.1 + */ + virtual void LoadNavigationHistoryPreviousL(); + + /** + * Returns whether the frame has a next navigation history item. + * This function is not implemented in Series 60. + * It is supported in Series 80 and in the Nokia 7710 smartphone. + * @since 3.1 + * @return Returns whether the frame has a next navigation history item. + */ + virtual TBool HasNavigationHistoryNext() const; + + /** + * Informs the browser to load the next navigation history URL + * in its parent frame. + * This function is not implemented in Series 60. It is supported in + * Series 80 and in the Nokia 7710 smartphone. + * @since 3.1 + */ + virtual void LoadNavigationHistoryNextL(); + +#endif + /** + * Returns the window system level control object for the plug-in. + * @since 3.1 + * @return A pointer to the parent control window. + */ + virtual CCoeControl* GetParentControl(); + + /** + * Returns the observer for the plug-in control. + * @since 3.1 + * @return Observer that the plug-in can use to send events + * to the browser. + */ + virtual MCoeControlObserver* GetParentControlObserver(); + + /** + * Sets the plug-in notifier allowing the plug-in to control + * portions of the browser. + * @since 3.1 + * @param aNotifier Pointer to an interface that the browser can + * use to send events to the plug-in. + */ + virtual void SetPluginNotifier( MPluginNotifier *aNotifier ); + + /** + * Tells the plugin adapter if plugin content can accept user interaction. This function + * is called from the plugin. + * @since Series 60 3nd Edition + * @param None + * @return None + */ + virtual void SetContentInteractive( TBool /*aInteractive*/ ); + + public: //MCoeControlObserver + /** + * Handles an event from an observed control. + * This function is called when a control for which this control + * is the observer calls CCoeControl::ReportEventL(). It should be + * implemented by the observer control, and should handle all events + * sent by controls it observes. + * @param aControl The control that sent the event. + * @param aEventType The event type. + */ + virtual void HandleControlEventL( CCoeControl* aControl, + TCoeEvent aEventType ); + + private: // New functions + + /** + * Finds the mime type of the file, searches the corresponding + * browser plugin which handles the mime type and starts the same. + * @since 3.1 + */ + void FindAndStartPluginL( const TDesC& aFileName, + TBool aCheckFileMode = EFalse ); + + /** + * Makes use of ecom api to find out whether an implementation with uid + * aImpUid is present which implements the interface aInterfaceUid. + * @since 3.1 + */ + TBool CheckIfPluginPresentL( TUid aInterfaceUid, + TUid aImpUid ); + + /** + * Finds the mime type of the file, searches the corresponding + * browser plugin which handles the mime type + * @since 3.1 + */ + void FindPluginL( const TDesC& aFileName ); + + /** + * Creates the format specific plugin + * @since 3.1 + */ + void CreatePluginL( TBool aCheckFileMode = EFalse ); + + /** + * Deletes the browser plugin. + * @since 3.1 + */ + void DeletePlugin(); + + /** + * Deletes and Sets the browser plugin members to NULL + * @since 3.1 + */ + void SetPluginDeleted(); + + /** + * Connects the central repository session + * @since 3.1 + */ + void InitializeCenRepL(); + + /** + * Registers for central repository key changes + * @since 3.1 + */ + void NotifyCenrepChangeL(); + + /** + * Cancels registration for central repository key changes + * @since 3.1 + */ + void NotifyCenrepChangeCancel(); + + /** + * Disconnects the central repository session + * @since 3.1 + */ + void UnInitializeCenRep(); + + /** + * Sends an animation end event to the plugins + * @since 3.1 + */ + TInt SendEndEvent(); + + /** + * Checks whether the given content id matches the content id of the + * file name given + * @return ETrue if the content id matches + * EFalse if not + * @since 3.1 + */ + TBool CheckContentIdL( const TDesC& aFileName, TDesC8& aContentUri ); + + private: + + /** + * Default Constructor + * @since 3.1 + */ + CScreenSaverAnimPlugin(); + + /** + * 2nd phase constructor + * @since 3.1 + */ + void ConstructL(); + + public: + + // Pointer to the screen saver host + MScreensaverPluginHost* iScreenSaverHost; + + private: + + // Resource file offset + TInt iResourceOffset; + + // Handle to the central repository session + CRepository* iAnimPluginSession; + + // Handle to the central repository session + CRepository* iDrmSession; + + // Environment pointer + CEikonEnv* iEikEnv; + + // Format specific Netscape plugin UID + TUid iPluginUID; + + // Netscape plugin functions. + NPPluginFuncs* iPluginFuncs; + + // Netscape ECOM plugin interface. + CEcomBrowserPluginInterface* iPluginInterface; + + // Netscape plugin instance. + NPP iNPPinstance; + + // Plugin Type + HBufC8* iPluginType; + + // Parent control given by the screen saver application + CCoeControl* iParentControl; + + // Pointer to the Settings object + CScreenSaverAnimSettingObject* iSettingObject; + + // Pointer to Drm Helper + CDRMHelper* iDrmHelper; + + // Cenrep Watcher for settings change + CScreensaverRepositoryWatcher* iScreensaverRepositoryWatcher; + + // Cenrep Watcher for drm expiry + CScreensaverRepositoryWatcher* iDrmExpiryWatcher; + + // To save the error encountered by the plugin + TInt iPluginError; + + // Screensaver plugin name + HBufC* iScreensaverName; + }; + + +#endif // C_SCREENSAVERANIMPLUGIN_H +// End Of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPlugin.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPlugin.hrh Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2005 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: The enumeration will be used in the animation plugin +* +*/ + + + +#ifndef SCREENSAVERANIMPLUGIN_HRH +#define SCREENSAVERANIMPLUGIN_HRH + +#include + + +// Screen Animation Plugin's Setting List Items. +enum TSanimSettingListItemIds + { + ESanimAnimFileNameId, + ESanimAnimTimeoutId, + ESanimLightsTimeoutId + }; + +enum TSAnimDialogMenuCommands + { + ESanimDlgChangeCommand = 1, // Must not start with 0 - dialog ignores it + ESanimDlgHelpCommand + }; + +enum { ESanimDialogCustControlIdData = 1 }; +enum { ESanimCustControl = 1020 }; + + +#endif + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginConst.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginConst.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,63 @@ +/* +* Copyright (c) 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: Constant definitions for Screen Saver Anim Plugin +* +*/ + + + + + +#ifndef SCREENSAVERANIMPLUGINCONST_H +#define SCREENSAVERANIMPLUGINCONST_H + +// Feature IDs. +enum + { + // Remove Back Light Setting + EAnimPluginBacklightRemoved, + + /*Insert new item here*/ + + // last feature should be max value + KAnimPluginMaxFeatureID + }; + +/** +******************************************************************************* +* Following constants are shared between PLSN. The three constants need to be +* sychronized in both PLSN and Screensaver Animation plugin projects when each +* has changes. +******************************************************************************* +*/ +// Same definition as in PslnVariationPrivateCRKeys.h +const TUid KCRUidThemesVariation = { 0x102818EB }; + + +/** +* Specifies the bitmask for Themes applications locally variated features. +* +* Possible values are defined in PslnVariant.hrh. +*/ +const TUint32 KThemesLocalVariation = 0x00000001; + + +// Same definition as in pslnvariant.hrh +// Removes screensaver animation plugin's timeout setting. +// Bitmask value in decimals: 256. +#define KScreenSaverRemoveAnimPluginTimeout 0x00000100 + + +#endif // SCREENSAVERANIMPLUGINCONST_H +// End Of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginContainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginContainer.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,160 @@ +/* +* Copyright (c) 2005 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 header defines the container for the settings list +* +*/ + + + +#ifndef C_SCREENSAVERANIMPLUGINCONTAINER_H +#define C_SCREENSAVERANIMPLUGINCONTAINER_H + +// INCLUDES +#include +#include +#include + +// CLASS DECLARATION + +/** +* CScreenSaverAnimPluginContainer container class +* +*/ +class CScreenSaverAnimPluginContainer : public CCoeControl, + public MEikListBoxObserver + { + public: // Constructors and destructor + + static CScreenSaverAnimPluginContainer* NewLC( + CScreenSaverAnimPlugin* aCaller, + const CCoeControl* aParent, + CScreenSaverAnimSettingObject* aSettingObject ); + + static CScreenSaverAnimPluginContainer* NewL( + CScreenSaverAnimPlugin* aCaller, + const CCoeControl* aParent, + CScreenSaverAnimSettingObject* aSettingObject ); + + CScreenSaverAnimPluginContainer( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ); + + virtual void ConstructL( const CCoeControl* aParent, + const TRect& aRect ); + + /** + * Constructs all common parts of the container. + * @param aRect Listbox control's rect. + * @param aResTitleId Resource id for title. + * @param aResLbxId Resource id for listbox. + * @return void + */ + void BaseConstructL( const TRect& aRect, TInt aResTitleId, + TInt aResLbxId = 0 ); + + /** + * Destructor. + */ + ~CScreenSaverAnimPluginContainer(); + + public: //new + + /** + * Updates listbox's item's value. + * @param aItemId An item which is updated. + * @return void. + */ + void UpdateListBoxL( TInt aItemId ); + + void HandleListBoxSelectionL(); + + /** + * Sets feature support - see screensaveranimpluginconst.h for feature list. + * @param aFeatureBitFlags feature support bitflags. + */ + void GetFeatureSupportL( TBitFlags& aFeatureBitFlags ) const; + + /** + * Checks if feature is supported. + * @param aFeatureID feature ID. + * @return ETrue if feature is supported, EFalse otherwise. + */ + TBool IsFeatureSupported( TInt aFeatureID ); + + public: //MEikListBoxObserver + + virtual void HandleListBoxEventL( CEikListBox* aListBox, + TListBoxEvent aEventType ); + + public: //From CCoeControl + + virtual void HandleResourceChange( TInt aType ); + + TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ); // this processes key events + + virtual void SetContainerWindowL( const CCoeControl& aContainer ); + + // Focus change handler + void FocusChanged( TDrawNow aDrawNow ); + + protected: // New methods + + /** + * Constructs listbox. + * @param aResLbxId Resource id for listbox. + * @return void + */ + virtual void ConstructListBoxL( TInt aResLbxId ); + + private: // new + void CreateListBoxItemsL(); + void MakeAnimTimeOutItemL(); + void MakeLightsTimeOutItemL(); + void MakeFileNameItem(); + void ShowFileNameItemL(); + void ShowAnimTimeOutItemL(); + void ShowLightsTimeOutItemL(); + + private: // from CCoeControl + + void SizeChanged(); + + TInt CountComponentControls() const; + + CCoeControl* ComponentControl( TInt /*aIndex*/ ) const; + + void GetNormalScreenLayoutRect( TRect& aRect ) const; + + protected: // Data + CEikTextListBox* iListBox; + + private: // new + CDesCArrayFlat* iItems; + CDesCArray* iItemArray; + TBuf<128> iItem; + CScreenSaverAnimSettingObject* iSettingObject; + CScreenSaverAnimPlugin* iCaller; + TBool iInShowFileItem; + + /** + * Defines which features are supported. + */ + TBitFlags iFeaturesSupport; + + }; + +#endif // C_SCREENSAVERANIMPLUGINCONTAINER_H + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginHelper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginHelper.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,144 @@ +/* +* Copyright (c) 2005 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 declares all helper classes +* for ScreenSaverAnimPlugin +* +*/ + + + +#ifndef C_SCREENSAVERANIMPLUGINHELPER_H +#define C_SCREENSAVERANIMPLUGINHELPER_H + +// INCLUDES +#include +#include +#include + +// FORWARD DECLARATIONS +class CDRMHelper; +class CCoeEnv; +class CScreenSaverAnimPlugin; +class CRepository; + +// CLASS DECLARATION + +/** +* Implementation for File Validity Check. +* @since 3.1 +* @internal +*/ +class CScreenSaverAnimPluginVerifier : public CBase, public MMGFetchVerifier + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + static CScreenSaverAnimPluginVerifier* NewL( + CScreenSaverAnimPlugin* aFileVerify ); + + /** + * Destructor. + */ + ~CScreenSaverAnimPluginVerifier(); + + public: // Functions from base classes + + /** + * From MFLDFileObserver. + */ + TBool VerifySelectionL( const MDesCArray* aSelectedFiles ); + + private: + + /** + * C++ default constructor. + */ + CScreenSaverAnimPluginVerifier( CScreenSaverAnimPlugin* aFileVerify ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + void ShowErrorNoteL( TInt aResourceId ) const; + + private: // Data + // Own: DRM helper + CDRMHelper* iDRMHelper; + + // Environment pointer + CCoeEnv* iCoeEnv; + + CScreenSaverAnimPlugin* iFileVerify; + + }; + + +// CLASS DECLARATION + +/** +* Helper Class to watch Central Repository Changes. +* @since 3.1 +* @internal +*/ +class CScreensaverRepositoryWatcher : public CBase, public MCenRepNotifyHandlerCallback + { +public: + static CScreensaverRepositoryWatcher* NewL( + const TUid aUid, + const TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aKeyType, + TCallBack aCallBack, + CRepository* aRepository ); + + static CScreensaverRepositoryWatcher* NewL( + const TUid aUid, + TCallBack aCallBack, + CRepository* aRepository ); + + ~CScreensaverRepositoryWatcher(); + + 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: + CScreensaverRepositoryWatcher( + const TUid aUid, + const TUint32 aKey, + TCallBack aCallBack, + CRepository* aRepository ); + + void ConstructL( CCenRepNotifyHandler::TCenRepKeyType aKeyType ); + + void ConstructL(); + +private: + TUid iUid; + TUint32 iKey; + TUint32 iChangedKey; + TCallBack iCallBack; + CRepository* iRepository; + CCenRepNotifyHandler* iNotifyHandler; + + }; + +#endif // C_SCREENSAVERANIMPLUGINHELPER_H + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginImplementationUid.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginImplementationUid.hrh Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2005 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: Defines the ECOM Implementation UIDs. +* +*/ + + + + + +#ifndef SCREENSAVERANIMPLUGINIMPLEMENTATIONUID_HRH +#define SCREENSAVERANIMPLUGINIMPLEMENTATIONUID_HRH + +#define KScreenSaverAnimPluginImplementationUID 0x1020744D + +#endif // SCREENSAVERANIMPLUGINIMPLEMENTATIONUID_HRH +// End of File + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginInternalCRKeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimPluginInternalCRKeys.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2005 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 header file gives the central repository key +* enumerations +* +*/ + + + + +#ifndef SCREENSAVERANIMPLUGININTERNALCRKEYS_H +#define SCREENSAVERANIMPLUGININTERNALCRKEYS_H + +const TUid KCRUidScreenSaverAnimPlugin = { 0x1020744E }; + +const TUint32 KScreenSaverAnimatedFileName = 0x00000001; + +const TUint32 KScreenSaverAnimationTimeOut = 0x00000002; + +const TUint32 KScreenSaverLightsTimeOut = 0x00000003; + +#endif // SCREENSAVERANIMPLUGININTERNALCRKEYS_H +// End of File + + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimSettingDialog.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/ScreenSaverAnimSettingDialog.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2005 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: ScreenSaverAnimPlugin Settings Dialog +* +*/ + + + +#ifndef C_SCREENSAVERANIMSETTINGDIALOH_H +#define C_SCREENSAVERANIMSETTINGDIALOH_H + + +// FORWARD DECLARATIONS +class CAknDialog; +class CScreenSaverAnimPluginContainer; +class CScreenSaverAnimSettingObject; + +/** +* Provides the dialog functionality for viewing Settings. +* @lib ScreenSaverAnimPlugin.dll +* @since 3.1 +*/ + +class CScreenSaverAnimSettingDialog : public CAknDialog + { + public: // Constructors and destructor + /** + * Two-phased constructor. + */ + static CScreenSaverAnimSettingDialog* NewL( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ); + + /** + * Two-phased constructor. + */ + static CScreenSaverAnimSettingDialog* NewLC( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ); + + // Destructor + virtual ~CScreenSaverAnimSettingDialog(); + + public: // New functions + public: // Functions from base classes + + /** + * From CAknDialog Executes the dialog and deletes the dialog on exit. + * @since 3.1 + * @param aFileHandle File handle to the SVGT content. + * @param aAppObs Implementation Class provided by application that + * uses this dialog + * Note: The ownership of the file handle is not transferred. + * It is the responsibility of the caller to close this file + * after deleting this dialog. + * @return Integer - Indicates Exit Reason. + */ + virtual TInt ExecuteLD(); + /** + * From CAknDialog - Called by framework to process commands invoked by + * the user. + */ + virtual void ProcessCommandL( TInt aCommandId ); + +#ifdef __SERIES60_HELP + /** + * From CCoeControl Context Sensitive Help ID retrieving function. + * @since 3.0 + * @see CCoeControl + */ + void GetHelpContext( TCoeHelpContext& aContext ) const; +#endif + + public: + + /** + * Function used by the application to handle background/foreground + * events. When the application goes to background the presentation + * needs to be paused. When application comes back to foreground, + * the user would need to start the paused presentation. + * @param aForeground: ETrue: Foreground event, + * EFalse: Background event. + * @since 3.1 + */ + virtual void HandleApplicationForegroundEvent( TBool aForeground ); + + protected: // Functions from base classes + // From CEikDialog + // From CAknDialog + + /** + * From CAknDialog - Called by framework to dynamically manipulate + * the menu for the dialog. + */ + void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ); + + /** + * From CEikDialog. Prelayouts the dialog. + */ + void PreLayoutDynInitL(); + + /** + * From CAknDialog - Framework method to determine if it OK + * to exit the dialog. + */ + TBool OkToExitL( TInt aButtonId ); + + /** + * From CAknDialog - Called by framework to add custom control to the + * dialog when specified in resource. + */ + SEikControlInfo CreateCustomControlL( TInt aControlType ); + + /** + * From CAknDialog - Called by framework to notify resize of dialog. + */ + void SizeChanged(); + + /** + * From CCoeControl Key Handling Method for control. + * @since 3.1 + * @param aKeyEvent Key Event. + * @param aType Type of Key Event. + * @return TKeyResponse - EKeyWasConsumed/EKeyWasNotConsumed. + */ + TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ); + + /** + * From CCoeControl + * @see CCoeControl::HandleResourceChange + */ + void HandleResourceChange( TInt aType ); + + /** + * From CCoeControl + * @see CCoeControl::FocusChanged + */ + void FocusChanged( TDrawNow aDrawNow ); + + /** + * Sets middle softkey label. + * @param aResourceId resource ID of label text to use. + * @param aCommandId command to place to middle softkey. + */ + void SetMiddleSoftKeyLabelL( const TInt aResourceId, + const TInt aCommandId ); + + private: + /** + * C++ default constructor. + */ + CScreenSaverAnimSettingDialog( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ); + /** + * Second Phase constructor. + */ + void ConstructL(); + + private: // Data + + // Pointer to Custom CCoeControl. + CScreenSaverAnimPluginContainer* iCustControl; + + // Application Title Text + HBufC* iAppTitleText; + + // Text to be displayed in the title pane + HBufC* iTitlePaneString; + + // Setting Object + CScreenSaverAnimSettingObject* iSettingObject ; + + // Caller's reference + CScreenSaverAnimPlugin* iCaller; + + }; + +#endif // C_SCREENSAVERANIMSETTINGDIALOH_H +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/screensaver.hlp.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/inc/screensaver.hlp.hrh Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2009 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: The string to be used in the animation plugin +* +*/ + + + +// +// screensaver.hlp.hrh +// + +// +// File generated by cshlpcmp Version 011 +// + +#ifndef SCREENSAVER_HLP_HRH +#define SCREENSAVER_HLP_HRH + + +_LIT( KSCREENSAVER_HLP_ANIM_SETTINGS, "SCREENSAVER_HLP_ANIM_SETTINGS" ); //ScreenSaver animation settings +_LIT( KSCREENSAVER_HLP_SLIDE_SET, "SCREENSAVER_HLP_SLIDE_SET" ); //Slide set screen saver settings + +#endif diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/loc/screensaveranimplugin.loc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/loc/screensaveranimplugin.loc Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,141 @@ +/* +* Copyright (c) 2005 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: Localization strings for ScreenSaverAnimPlugin +* +*/ + + + + + +//d: Screensaver name +//d: Displayed in Themes application screensaver list +//l: list_set_graphic_pane_t1 +//w: +//r:3.1 +#define qtn_sanim_screensaver_name "Animation" + +//d: Title Pane String +//d: Displayed in the title Pane when settings dialog is displayed. +//l: title_pane_1 +//w: +//r:3.1 +#define qtn_sanim_title_settings "Settings" + +//d: Text in the setting list item. +//d: Displayed in the setting page to select backlight timer value +//l: list_setting_pane_1 +//w: +//r:3.1 +#define qtn_sanim_list_light_timeout "BackLight" + +//d: Text in the setting list item +//d: Displayed in the setting page to select animation duration +//l: list_setting_pane_t1 +//w: +//r:3.1 +#define qtn_sanim_list_anim_timeout "Duration" + +//d: Text in the setting list item +//d: Displayed in the setting page to select animation file +//l: list_setting_pane_t1 +//w: +//r:3.1 +#define qtn_sanim_list_anim_file "Animation file" + +//d:Text in slider control +//d:Screen saver animation duration setting page +//d:Minimum value +//l:setting_slider_pane_t2 +//r:3.1 +#define qtn_sanim_duration_slider_min "5 sec." + +//d:Text in slider control +//d:Screen saver animation duration setting page +//d:Maximum value +//l:setting_slider_pane_t3 +//r:3.1 +#define qtn_sanim_duration_slider_max "60 sec." + +//d:Text in slider control / setting list item value +//d:Screen saver animation duration setting page +//d:Context specific text +//l:setting_slider_pane_t1 / list_set_graphic_pane_t1 +//r:3.1 +#define qtn_sanim_duration_slider_cur "%U seconds" + +//d:Text in slider control / setting list item value +//d:Screen saver animation duration / backlight timeout setting page +//d:Context specific text for singular value +//l:setting_slider_pane_t1 / list_set_graphic_pane_t1 +//r:3.1 +#define qtn_sanim_duration_slider_ykcur "%U second" + +//d:Text in slider control +//d:Screen saver backlight time-out setting page +//d:Minimum value +//l:slider_set_pane_2 +//r:3.1 +#define qtn_sanim_slider_off "Off" + +//d:Text in slider control +//d:Screen saver backlight time-out setting page +//d:Maximum value +//l:slider_set_pane_2 +//r:3.1 +#define qtn_sanim_slider_max_secs "30 secs." + +//d:Text in slider control / setting list item value +//d:Screen saver backlight time-out setting page +//d:Context specific text +//l:setting_slider_pane_t1 / list_set_graphic_pane_t1 +//r:3.1 +#define qtn_sanim_slider_context_value_secs "%U seconds" + +//d: Option in the Options menu. +//d: Option used to change the settings +//l: list_single_popup_menu_pane_1 +//w: +//r:3.1 +#define qtn_sanim_option_change "Change" + +// Taken from errorres.loc +// d: Generic error note to be displayed when user tries to +// d: use some feature which is not supported +// l: popup_note_window_1_four_rows +// w: Errorres +// +#define qtn_err_not_supp "Feature is not supported" + +// d: error note to be displayed when user tries to +// d: select some file which is corrupted +// l: popup_note_window/opt2 +// w: +// r:3.1 +#define qtn_sanim_error_wrong_format "File is corrupted or wrong format" + +// d: error note to be displayed when animation couldnot +// d: be played as a screensaver +// l: popup_note_window_1_four_rows +// w: +// r:3.1 +#define qtn_err_failure "Unable to perform operation" + +// d: error note to be displayed when animation couldnot +// d: be set as a screensaver +// l: popup_note_window_1_four_rows +// w: +// r:3.1 +#define qtn_drm_prev_rights_set "Unable to select.Object can only be viewed" + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/rom/ScreenSaverAnimPlugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/rom/ScreenSaverAnimPlugin.iby Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2005 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: IBY file for ScreenSaverAnimPlugin +* +*/ + + + + +#ifndef __SCREENSAVERANIMPLUGIN_IBY +#define __SCREENSAVERANIMPLUGIN_IBY + +// File empty on 3.0, or if S60 native browser is not used +#ifndef __SERIES60_30__ +#ifdef __SERIES60_NATIVE_BROWSER +ECOM_PLUGIN(ScreenSaverAnimPlugin.dll,10207447.rsc) +#endif +#endif + +#endif // __SCREENSAVERANIMPLUGIN_IBY +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/rom/ScreenSaverAnimPluginResources.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/rom/ScreenSaverAnimPluginResources.iby Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2005 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: IBY file for ScreenSaverAnimPlugin +* +*/ + + + + +#ifndef __SCREENSAVERANIMPLUGINRESOURCES_IBY +#define __SCREENSAVERANIMPLUGINRESOURCES_IBY + +// File empty on 3.0, also if S60 browser is not used (media plugins not present) +#ifndef __SERIES60_30__ +#ifdef __SERIES60_NATIVE_BROWSER +data=DATAZ_\RESOURCE_FILES_DIR\ScreenSaverAnimPlugin.rsc RESOURCE_FILES_DIR\ScreenSaverAnimPlugin.rsc +#endif +#endif + +#endif // __SCREENSAVERANIMPLUGINRESOURCES_IBY +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/NpnImplementation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/NpnImplementation.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,286 @@ +/* +* Copyright (c) 2005 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 defines the functions +* _NPNetscapeFuncs of Browser's Netscape API +* +*/ + + + + + +#include "NpnImplementation.h" + + +// ----------------------------------------------------------------------------- +// NpnGetUrl +// +// Requests the associated pluginInst to load the given url. +// ----------------------------------------------------------------------------- +// + NPError NpnGetUrl( NPP /*aInstance*/, const TDesC& /*aUrl*/, + const TDesC* /*aWindowType*/ ) + { + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnPostUrl +// +// Requests the associated pluginInst to POST to the given url. +// ----------------------------------------------------------------------------- +// + NPError NpnPostUrl( NPP /*aInstance*/, const TDesC& /*aUrl*/, + const TDesC* /*aWindowType*/, + const TDesC& /*aBuf*/, NPBool /*aFile*/ ) + { + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnRequestRead +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + NPError NpnRequestRead( NPStream* /*aStream*/, NPByteRange* /*aRangeList*/ ) + { + // This function is not supported + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnNewStream +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + NPError NpnNewStream( NPP /*aInstance*/, NPMIMEType /*aType*/, + const TDesC* /*aWindowType*/, NPStream** /*aStream*/ ) + { + // This function is not supported. + // It is specifically intended to create a new Browser window + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnWrite +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + TInt32 NpnWrite( NPP /*aInstance*/, NPStream* /*aStream*/, + TInt32 /*aLen*/, void* /*aBuffer*/ ) + { + // This function is not supported. + // It is specifically intended to create a new Browser window + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnDestroyStream +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + NPError NpnDestroyStream( NPP /*aInstance*/, NPStream* /*aStream*/, + NPReason /*aReason*/ ) + { + // This function is not supported. + // It is specifically intended to create a new Browser window + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnStatus +// +// Allows a plugin to report its current status to the associated PluginInst. +// ----------------------------------------------------------------------------- +// + void NpnStatus( NPP /*aInstance*/, const TDesC& /*aMessage*/ ) + { + } + +// ----------------------------------------------------------------------------- +// NpnUAgent +// +// Returns the user agent of the Series 60 Browser. +// ----------------------------------------------------------------------------- +// + const TDesC* NpnUAgent( NPP /*aInstance*/ ) + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// NpnMemAlloc +// +// Allocates a chunk of memory on the behalf of the plugin. +// ----------------------------------------------------------------------------- +// + void* NpnMemAlloc( uint32 aSize ) + { + if ( aSize ) + { + return User::Alloc( aSize ); + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// NpnMemFree +// +// Deallocates a chunk of memory on the behalf of the plugin. +// ----------------------------------------------------------------------------- +// + void NpnMemFree( void* aPtr ) + { + User::Free( aPtr ); + } + +// ----------------------------------------------------------------------------- +// NpnMemFlush +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + uint32 NpnMemFlush( uint32 /*aSize*/ ) + { + // This function is not supported + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnReloadPlugins +// +// Causes the PluginHandler to scan for new plugins and reloads the current +// page if aReloadPages is true. +// ----------------------------------------------------------------------------- +// + void NpnReloadPlugins( NPBool /*aReloadPages*/ ) + { + //This is currently not supported since CPluginHandler is non static + } + +// ----------------------------------------------------------------------------- +// NpnGetJavaEnv +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + JRIEnv* NpnGetJavaEnv() + { + // This function is not supported + return NULL; + } + +// ----------------------------------------------------------------------------- +// NpnGetJavaPeer +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + jref NpnGetJavaPeer( NPP /*aInstance*/ ) + { + // This function is not supported + return NULL; + } + +// ----------------------------------------------------------------------------- +// NpnGetUrlNotify +// +// Requests the associated PluginInst to load the given url. The plugin is +// notified when the request completes. +// ----------------------------------------------------------------------------- +// + NPError NpnGetUrlNotify( NPP /*aInstance*/, const TDesC& /*aUrl*/, + const TDesC* /*aWindowType*/, void* /*aNotifyData*/ ) + { + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnPostUrlNotify +// +// Requests the associated PluginInst to POST to the given url. The plugin is +// notified when the request completes. +// ----------------------------------------------------------------------------- +// + NPError NpnPostUrlNotify( NPP /*aInstance*/, const TDesC& /*aUrl*/, + const TDesC* /*aWindowType*/, const TDesC& /*aBuf*/, + NPBool /*aFile*/, void* /*aNotifyData*/ ) + { + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnGetValue +// +// Query the associated PluginInst for information. +// ----------------------------------------------------------------------------- +// + NPError NpnGetValue( NPP /*aInstance*/, NPNVariable /*aVariable*/, + void* /*aRetValue*/ ) + { + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnSetValue +// +// Set a value on the associated PluginInst +// ----------------------------------------------------------------------------- +// + NPError NpnSetValue( NPP /*aInstance*/, NPPVariable /*aVariable*/, + void* /*aSetValue*/ ) + { + return NPERR_GENERIC_ERROR; + } + +// ----------------------------------------------------------------------------- +// NpnInvalidateRect +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + void NpnInvalidateRect( NPP /*aInstance*/, NPRect * /*aRect*/ ) + { + // This function is not supported + } + +// ----------------------------------------------------------------------------- +// NpnInvalidateRegion +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + void NpnInvalidateRegion( NPP /*aInstance*/, NPRegion /*aRegion*/ ) + { + // This function is not supported + } + +// ----------------------------------------------------------------------------- +// NpnForceRedraw +// +// Unsupported. +// ----------------------------------------------------------------------------- +// + void NpnForceRedraw( NPP /*aInstance*/ ) + { + // This function is not supported + } + + +// End Of File + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPlugin.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,1570 @@ +/* +* Copyright (c) 2005 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 Screen Saver Animation Plugin which +* is used by Screen Saver application to load animation +* screen savers. +* +*/ + + + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ScreenSaverAnimPluginInternalCRKeys.h" +#include "ScreenSaverAnimPlugin.h" +#include "ScreenSaverAnimPluginContainer.h" +#include "ScreenSaverAnimSettingDialog.h" +#include "NpnImplementation.h" +#include "ScreenSaverAnimPluginHelper.h" + +// Constants +#ifdef SCREENSAVER_LOG_ENABLED +const TInt KMaxBufLen = 64; +#endif +const TInt KSixteenBytes = 128; +const TInt KUrlMaxLen = 1024; + +// Animation Timeout values +const TInt KMinDurationValue = 5; +const TInt KMaxDurationValue = 60; +const TInt KDefaultDurationValue = 5; + +// Backlight Values +const TInt KMinBackLightValue = 0; +const TInt KMaxBackLightValue = 30; +const TInt KDefaultBackLightValue = 0; + +const TInt KScreensaverAnimPluginInterfaceUid = 0x102750CB; + + +_LIT( KResourceFileName, "Z:ScreenSaverAnimPlugin.rsc" ); + + +CScreenSaverAnimSettingObject::CScreenSaverAnimSettingObject() + { + iAnimationTimeout = KDefaultDurationValue; + iLightsTimeout = KDefaultBackLightValue; + } +// ============================ MEMBER FUNCTIONS ============================= + + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::NewL +// --------------------------------------------------------------------------- +// +CScreenSaverAnimPlugin* CScreenSaverAnimPlugin::NewL() + { + CScreenSaverAnimPlugin* self = new ( ELeave ) CScreenSaverAnimPlugin; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::~CScreenSaverAnimPlugin +// ---------------------------------------------------------------------------- +// +CScreenSaverAnimPlugin::~CScreenSaverAnimPlugin() + { + if ( iResourceOffset != 0 ) + { + iEikEnv->DeleteResourceFile( iResourceOffset ); + } + UnregisterForDrmExpiry(); + NotifyCenrepChangeCancel(); + UnInitializeCenRep(); + + // Final place to delete plug-in. Plug-in is deleted here + // if plug-in notices runtime error. + SetPluginDeleted(); + + delete iDrmHelper; + delete iSettingObject; + delete iScreensaverName; + } + + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::InitializeL +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::InitializeL( MScreensaverPluginHost *aHost ) + { + + if ( !aHost ) + { + return KErrCancel; + } +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "InitializeL called " ); + PrintDebugMsg( msg ); +#endif + + iScreenSaverHost = aHost; + iScreenSaverHost->UseRefreshTimer( EFalse ); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( cenrepmsg, "before NotifyCenrepChangeL" ); + PrintDebugMsg( cenrepmsg ); +#endif + + NotifyCenrepChangeL(); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( cenrepmsg1, "After NotifyCenrepChangeL" ); + PrintDebugMsg( cenrepmsg1 ); +#endif + + iScreenSaverHost->OverrideStandardIndicators(); + + iScreenSaverHost->ExitPartialMode(); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( FindPluginLmsg, "before FindPluginL" ); + PrintDebugMsg( FindPluginLmsg ); +#endif + + TRAPD( err, FindPluginL( iSettingObject->iFileName ) ) + + if ( err != KErrNone ) + { + return err; + } + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( FindPluginLmsg1, "After FindPluginL" ); + PrintDebugMsg( FindPluginLmsg1 ); +#endif + + return KErrNone; + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::Draw +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::Draw(CWindowGc& /*aGc*/) + { + return KErrNone; + } +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::SetWindow +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::SetWindow( CCoeControl* aParent ) + { + + iParentControl = aParent; + NPWindow window; + TInt ret = KErrNone; + + window.window = STATIC_CAST( MPluginAdapter*, this ); + iNPPinstance->ndata = STATIC_CAST( MPluginAdapter*, this ); + window.x = 0; /* Position of top left corner relative */ + window.y = 0; /* to a netscape page.*/ + + if ( aParent ) + { + window.width = aParent->Rect().Width(); /* Max window size */ + window.height = aParent->Rect().Height(); + window.type = NPWindowTypeDrawable; + } + + if ( iPluginFuncs && !iPluginFuncs->setwindow( iNPPinstance, &window ) ) + { + ret = KErrNone; + } + else + { + ret = KErrGeneral; + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::Name +// ----------------------------------------------------------------------------- +// +const TDesC16& CScreenSaverAnimPlugin::Name() const + { + if ( iScreensaverName ) + { + return *iScreensaverName; + } + else + { + return KNullDesC; + } + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::Capabilities +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::Capabilities() + { + return EScpCapsConfigure; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::PluginFunction +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::PluginFunction( + TScPluginCaps aFunction, + TAny* /*aParam*/) + { + if ( aFunction == EScpCapsSelectionNotification + || aFunction == EScpCapsPreviewNotification ) + { + _LIT( msg, "Plugin function called Sel Notify" ); + PrintDebugMsg( msg ); + + if ( iSettingObject->iFileName.Length() == 0 || UpdateFileName() ) + { + // File is not configured yet or deleted/renamed, + // pop the settings dialog + TInt err = KErrNone; + TRAP( err, PopSettingsDialogL() ); + return err; + } + else + { + return KErrNone; + } + } + if ( aFunction == EScpCapsConfigure ) + { + _LIT( msg, "Plugin function called Configure" ); + PrintDebugMsg( msg ); + UpdateFileName(); + TInt err = KErrNone; + TRAP( err, PopSettingsDialogL() ); + return err; + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::HandleScreensaverEventL +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::HandleScreensaverEventL( + TScreensaverEvent aEvent, + TAny* /*aData*/ ) + { + + if ( aEvent == EScreensaverEventDisplayChanged ) + { + // Display Changed is called when there is a change in the size + // of the window and when the parent control is set for the + // first time. + TScreensaverDisplayInfo* displayInfo = new( ELeave ) + TScreensaverDisplayInfo; + displayInfo->iSize = sizeof( TScreensaverDisplayInfo ); + iScreenSaverHost->DisplayInfo( displayInfo ); + iParentControl = displayInfo->iParent; + delete displayInfo; + } + + if ( aEvent == EScreensaverEventStopping ) + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( KStopEventMsg, "Stop Event" ); + PrintDebugMsg( KStopEventMsg ); +#endif + + // Delete the Plugin + SendEndEvent(); + DeletePlugin(); + } + + if ( aEvent == EScreensaverEventStarting ) + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( KStartEventMsg, "Start Event" ); + PrintDebugMsg( KStartEventMsg ); +#endif + // Check for drm rights + // If the file is not valid, suspend and return + if ( iDrmHelper ) + { + TBool yes = EFalse; + iDrmHelper->CanSetAutomated( + iSettingObject->iFileName, yes ); + if ( !yes ) + { + iScreenSaverHost->RevertToDefaultSaver(); + return KErrNotFound; + } + } + + if ( iScreenSaverHost ) + { + iScreenSaverHost->RequestTimeout( + iSettingObject->iAnimationTimeout ); + } + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( KStartMsg, "Starting" ); + PrintDebugMsg( KStartMsg ); +#endif + + // Reset plugin creation error + // The plugin cannot leave or return error + // The plugin sets the error using pluginFinishedL + iPluginError = KErrNone; + // Create the plugin + TRAPD( err,CreatePluginL() ); + if ( err != KErrNone ) + { + DeletePlugin(); + return err; + } + + // Check whether the plugin has + // reported any error using PluginFinishedL + if ( iPluginError ) + { + SetPluginDeleted(); + return iPluginError; + } + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( KStartedMsg, "Started" ); + PrintDebugMsg( KStartedMsg ); +#endif + + // send an event to plugins + if ( iPluginFuncs ) + { + NPAnimationEvent event; + event = NPStartAnimation; + iPluginFuncs->setvalue( iNPPinstance, + ( NPNVariable )NPNScreenSaverAnimationEvent, + &event ); + } + + // Request lights only if set - otherwise it will turn off lights + // (e.g. in preview). Not nice. + TInt nLights = iSettingObject->iLightsTimeout; + + if ( nLights > 0 ) + { + iScreenSaverHost->RequestLights( nLights ); + } + } + + if ( aEvent == EScreensaverEventTimeout ) + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( KTimeoutEventMsg, "Timeout Event" ); + PrintDebugMsg( KTimeoutEventMsg ); +#endif + // Delete the Plugin + SendEndEvent(); + DeletePlugin(); + iScreenSaverHost->Suspend( -1) ; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::GetAnimSettings +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::GetAnimSettings() + { + // Read the file last, since if it is missing the reading will be + // stopped and settings all wrong + TInt err = iAnimPluginSession->Get( KScreenSaverAnimationTimeOut, + iSettingObject->iAnimationTimeout ); + + if ( iSettingObject->iAnimationTimeout < KMinDurationValue || + iSettingObject->iAnimationTimeout > KMaxDurationValue ) + { + // Out of range set it to default + iSettingObject->iAnimationTimeout = KDefaultDurationValue; + } + + if ( err != KErrNone ) + { + return err; + } + + err = iAnimPluginSession->Get( KScreenSaverLightsTimeOut, + iSettingObject->iLightsTimeout ); + + if ( iSettingObject->iLightsTimeout < KMinBackLightValue || + iSettingObject->iLightsTimeout > KMaxBackLightValue ) + { + // Out of range set it to default + iSettingObject->iLightsTimeout = KDefaultBackLightValue; + } + + if ( err != KErrNone ) + { + return err; + } + + // read the file from central repository and return + err = iAnimPluginSession->Get( KScreenSaverAnimatedFileName, + iSettingObject->iFileName ); + + if ( err != KErrNone ) + { + return err; + } + + if ( !BaflUtils::FileExists( iEikEnv->FsSession(), + iSettingObject->iFileName ) ) + { + return KErrNotFound; + } + + TBool yes = EFalse; + if ( iDrmHelper ) + { + TInt err = iDrmHelper->CanSetAutomated( + iSettingObject->iFileName, yes ); + if ( !yes ) + { + return KErrNotFound; + } + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::SetAnimSettings +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::SetAnimSettings() const + { + + TInt err = KErrNone; + err = iAnimPluginSession->Set( KScreenSaverAnimatedFileName, + iSettingObject->iFileName ); + if ( err != KErrNone ) + { + return err; + } + err = iAnimPluginSession->Set( KScreenSaverAnimationTimeOut, + iSettingObject->iAnimationTimeout ); + + if ( err != KErrNone ) + { + return err; + } + + err = iAnimPluginSession->Set( KScreenSaverLightsTimeOut, + iSettingObject->iLightsTimeout ); + + return err; + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::RegisterForDrmExpiry +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::RegisterForDrmExpiry() + { + TInt err = iDrmHelper->SetAutomatedType( + CDRMHelper::EAutomatedTypeScreenSaver ); + if ( err == KErrNone ) + { + return iDrmHelper->SetAutomatedSilent( iSettingObject->iFileName, + ETrue ); + } + else + { + return err; + } + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::UnregisterForDrmExpiry +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::UnregisterForDrmExpiry() + { + if ( iDrmHelper ) + { + iDrmHelper->SetAutomatedType( + CDRMHelper::EAutomatedTypeScreenSaver ); + return iDrmHelper->RemoveAutomated( iSettingObject->iFileName ); + } + else + { + return KErrNone; + } + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::ReadDrmNotification +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::ReadDrmNotification( TDes8& aString ) + { + return iDrmSession->Get( KDRMHelperServerNotification, aString ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::ProcessDrmNotificationL +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::ProcessDrmNotificationL() + { + + TInt size = KSixteenBytes; + HBufC8* buf = HBufC8::NewLC( size ); + TPtr8 bufPtr = buf->Des(); + + TInt error = ReadDrmNotification( bufPtr ); + while ( error == KErrTooBig ) + { + size += KSixteenBytes; + CleanupStack::PopAndDestroy( buf ); // buf + buf = HBufC8::NewLC( size ); + bufPtr = buf->Des(); + error = ReadDrmNotification( bufPtr ); + } + + TUint8 count = ( TUint8 )( *( buf->Ptr() ) ); + TChar type = ( TUint8 )( *( buf->Ptr() + 1 ) ); + + TUint8 permType = ( TUint8 )( *( buf->Ptr() + 2 ) ); + TUint8 autoType = ( TUint8 )( *( buf->Ptr() + 3 ) ); + + TPtr8 ptr( ( TUint8* ) ( buf->Ptr() + 4 ) , buf->Length() - 5 , buf->Length() - 5 ); + HBufC8* content = HBufC8::NewLC( ptr.Length() ); + *content = ptr; + + TBool matched = CheckContentIdL( iSettingObject->iFileName, *content ); + + CleanupStack::PopAndDestroy( content ); + CleanupStack::PopAndDestroy( buf ); + + if ( !matched ) + { + return; + } + + if ( type == 'E') + { + if ( count == 0 ) + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "First Notification" ); + PrintDebugMsg( msg ); +#endif + + // Expire screen saver here..., no note + if ( iScreenSaverHost ) + { + SendEndEvent(); + // Delete the Plugin + DeletePlugin(); + iScreenSaverHost->Suspend(-1); + } + } + else + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "Second Notification" ); + PrintDebugMsg( msg ); +#endif + + // Show expiration notes... + iDrmHelper->SetAutomatedType( + CDRMHelper::EAutomatedTypeScreenSaver ); + iDrmHelper->CheckRightsAmountL( iSettingObject->iFileName ); + UnregisterForDrmExpiry(); + } + } + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::FindAndStartPluginL +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::FindAndStartPluginL( const TDesC& aFileName, + TBool aCheckFileMode ) + { + FindPluginL( aFileName ); + CreatePluginL( aCheckFileMode ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::FindPluginL +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::FindPluginL( const TDesC& aFileName ) + { + + RApaLsSession ls; + CleanupClosePushL( ls ); + TUid dummyUid( KNullUid ); + TDataType dataType; + User::LeaveIfError( ls.Connect() ); + User::LeaveIfError( ls.AppForDocument( aFileName, + dummyUid, dataType ) ); + CleanupStack::PopAndDestroy( &ls ); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "before FindAnimPluginL" ); + PrintDebugMsg( msg ); +#endif + + iPluginUID = FindAnimPluginL( dataType.Des() ); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg1, "After FindAnimPluginL" ); + PrintDebugMsg( msg1 ); +#endif + + if ( iPluginUID == KNullUid ) + { + User::Leave( KErrNotFound ); + } + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( registermsg, "Before RegisterForDrmExpiry" ); + PrintDebugMsg( registermsg ); +#endif + + RegisterForDrmExpiry(); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( registermsg1, "After RegisterForDrmExpiry" ); + PrintDebugMsg( registermsg1 ); +#endif + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::CreatePluginL +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::CreatePluginL( TBool aCheckFileMode ) + { + + /* Create the Netscape plugin for the animation format. + * Allocate memory for the plugin functions array. This + * would be filled by the netscape plugin. + * Initialize the plugin. + */ + + iPluginFuncs = + ( NPPluginFuncs* ) User::AllocL( sizeof( NPPluginFuncs ) ); + Mem::FillZ( ( void* )iPluginFuncs, sizeof( NPPluginFuncs ) ); + + iNPPinstance = ( NPP ) User::AllocL( sizeof( NPP_t ) ); + Mem::FillZ( ( void* )iNPPinstance, sizeof( NPP_t ) ); + + iPluginType = ( HBufC8* )User::AllocL( sizeof( NPMIMEType ) ); + Mem::FillZ( ( void* )iPluginType, sizeof( NPMIMEType ) ); + + TRAPD( err, iPluginInterface = + CEcomBrowserPluginInterface::CreatePluginL( iPluginUID, + ( NPNetscapeFuncs* ) ( &NpnImplementationFuncs ), + iPluginFuncs ) ); + + if ( err != KErrNone ) + { + SetPluginDeleted(); + User::Leave( err ); + } + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( newpmsg, "Before newp" ); + PrintDebugMsg( newpmsg ); +#endif + + // Create an instance. + // Flash Plugin needs the NPInteractionMode in the newp + + CDesCArrayFlat* attributeNames = new( ELeave ) CDesCArrayFlat( 1 ); + CDesCArrayFlat* attributeValues = new( ELeave ) CDesCArrayFlat( 1 ); + attributeNames->AppendL( KAttributeInteractionMode ); + attributeValues->AppendL( KValueScreensaver ); + + User::LeaveIfError( iPluginFuncs->newp( *iPluginType, iNPPinstance, + 0 /*mode*/, + attributeNames /*argn*/, + attributeValues /*argv*/, + NULL /*saved*/ ) ); + + delete attributeNames; + delete attributeValues; + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( newpmsg1, "After newp" ); + PrintDebugMsg( newpmsg1 ); +#endif + + // Set ScreenSaver Mode + if ( iPluginFuncs ) + { + NPInteractionMode mode; + mode = NPScreenSaverMode; + iPluginFuncs->setvalue( iNPPinstance, + ( NPNVariable )NPNInteractionMode, + &mode ); + } + + if ( !aCheckFileMode ) + { + SetWindow( iParentControl ); + AsFile(); + } + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::FindAnimPluginL +// ----------------------------------------------------------------------------- +// +TUid CScreenSaverAnimPlugin::FindAnimPluginL( const TDesC& aDataType ) + { + + TUid impUid = KNullUid; + + TResourceReader reader; + iEikEnv->CreateResourceReaderLC( reader, R_MIMETYPE_SPECIFIC_PLUGIN_ARRAY ); + TInt countResource = reader.ReadInt16(); + + for ( TInt i = 0; i < countResource; i++ ) + { + HBufC* newMimeTypeEntry = reader.ReadHBufCL(); + TPtr mimePtr( newMimeTypeEntry->Des() ); + impUid.iUid = reader.ReadInt32(); + if ( newMimeTypeEntry->Compare( aDataType ) == 0 ) + { + delete newMimeTypeEntry; + break; + } + else + { + delete newMimeTypeEntry; + } + } + CleanupStack::PopAndDestroy(); // reader + + if ( CheckIfPluginPresentL( KBrowserPluginInterfaceUid, impUid ) || + CheckIfPluginPresentL( TUid::Uid( KScreensaverAnimPluginInterfaceUid ),impUid ) ) + { + return impUid; + } + + return KNullUid; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::CheckIfPluginPresentL +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAnimPlugin::CheckIfPluginPresentL( TUid aInterfaceUid , + TUid aImpUid ) + { + TBool ret( EFalse ); + RImplInfoPtrArray animPluginList; + + REComSession::ListImplementationsL( aInterfaceUid, animPluginList ); + + const TInt count = animPluginList.Count(); + + for ( TInt i = 0; i < count; i++ ) + { + CImplementationInformation* implInfo = animPluginList[i]; + if ( aImpUid == implInfo->ImplementationUid() ) + { + ret = ETrue; + break; + } + } + animPluginList.ResetAndDestroy(); + return ret; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::ParseMimeStringL +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAnimPlugin::ParseMimeStringL( const TDesC& aMIMEDescription, + const TDesC& aDataType ) + { + + if ( aMIMEDescription.Length() == 0 || + aDataType.Length() == 0 ) + { + return EFalse; + } + + _LIT( KPattern1Ptr, ",;|" ); + _LIT( KPattern2Ptr, ";|" ); + + TUint end( aMIMEDescription.Length() ); + TUint i( 0 ); + TUint marker( 0 ); + TUint16 mimeSeparator( '|' ); + TUint fieldSeparator( ';' ); + HBufC* newMimeTypeEntry = NULL; + + // Parse the aMIMEDescription string to populate the mimeTypes + for ( ; i < end; ) // outer for loop + { + // Search until end of buffer or match one of the delimiters ';' or '|'. + // We are looking for the mimeType, ie "text/html", + // "application/pdf", etc. + for ( ; ( i < end ) && ( KPattern2Ptr().Locate( ( aMIMEDescription )[i] ) == + KErrNotFound ); i++ ) + { + // Walking the aMIMEDescription string + } + + if ( i > marker ) + { + // Create new mimeType entry, the first entry is mimeType + newMimeTypeEntry = HBufC::NewLC( i - marker ); + TPtr mimePtr( newMimeTypeEntry->Des() ); + mimePtr.Copy( aMIMEDescription.Mid( marker, i - marker ) ); + if ( newMimeTypeEntry->Compare( aDataType ) == 0 ) + { + CleanupStack::PopAndDestroy( newMimeTypeEntry ); //newMimeTypeEntry + return ETrue; + } + CleanupStack::PopAndDestroy( newMimeTypeEntry ); //newMimeTypeEntry + } + + // Are we at the end of the supported mime string + if ( i == end ) + { + // This break with i=end means we leave outer for loop + break; + } + + marker = ++i; + if ( ( aMIMEDescription )[i - 1] == mimeSeparator ) + { + // Found a mime separator '|', get next supported mime + continue; + } + + // There can be multiple mimeFileExtentions per mimeType + for ( ; ( i < end ); ) // inner for loop + { + // Search until end of buffer or match one of the delimiters + // ';' or ',' or '|'. + for ( ; (i < end) && ( KPattern1Ptr().Locate( ( aMIMEDescription )[i] ) == + KErrNotFound ); i++ ) + { + // Walking the aMIMEDescription string + } + + // Are we at the end of the supported mime string + if ( i == end ) + { + // This break means we leave the inner loop, + // and with i=end means + // we leave the outer loop + break; + } + + marker = ++i; + if ( ( aMIMEDescription )[i - 1] == mimeSeparator ) + { + // Found a mime separator '|', get next supported mime + break; + } + + if ( ( aMIMEDescription )[i - 1] == fieldSeparator ) + { + // Found a field separator ';', get the mimeDescription. + // Search until end of buffer or match one of the + // delimiters ';' or '|'. + for ( ; (i < end) && + ( KPattern2Ptr().Locate( ( aMIMEDescription )[i] ) == + KErrNotFound ); i++ ) + { + // Walking the aMIMEDescription string + } + + + // Are we at the end of the supported mime string + if ( i == end ) + { + // This break means we leave the inner loop, + // and with i=end means + // we leave the outer loop + break; + } + + marker = ++i; + // Make sure we start at the next mime, + // after we found the mimeDescription. + // We are handling a mime string with an extra semi-colon(s), + // ie "...mimeDescription1;|mimeType2 + for (; (i < end) && + ((aMIMEDescription)[i-1] != mimeSeparator); i++) + { + // Walking the aMIMEDescription string + } + + // Leave the inner loop and look for the next mime + break; + } // end of if fieldSeparator aka get mimeDescription + + // If we get here, we have another mimeFileExtension. + // Continue on the + // inner loop to find additional mimeFileExtensions. + + } // end of inner for (;idestroy( iNPPinstance, NULL ); + } + SetPluginDeleted(); + } +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::SetPluginDeleted +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::SetPluginDeleted() + { + + delete iPluginType; + iPluginType = NULL; + + delete iPluginFuncs; + iPluginFuncs = NULL; + + delete iNPPinstance; + iNPPinstance = NULL; + + delete iPluginInterface; + iPluginInterface = NULL; + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::AsFile +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::AsFile() + { + + // Set the File-name to the plugin. + // Note that the SVG-T plugin atleast wants setwindow + // to be called first + iPluginFuncs->asfile( iNPPinstance, NULL, iSettingObject->iFileName ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::UpdateFileName +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAnimPlugin::UpdateFileName() + { + if ( !BaflUtils::FileExists( iEikEnv->FsSession(), + iSettingObject->iFileName ) ) + { + // File is deleted now, Show empty string + iSettingObject->iFileName.Copy( KEmptyString ); + return ETrue; + } + + TBool canbeautomated( EFalse ); + + TInt res = 0; + iDrmHelper->SetAutomatedType( + CDRMHelper::EAutomatedTypeScreenSaver ); + res = iDrmHelper->CanSetAutomated( iSettingObject->iFileName, + canbeautomated ); + + if ( res || !canbeautomated ) + { + iSettingObject->iFileName.Copy( KEmptyString ); + return ETrue; + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::PopSettingsDialogL +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::PopSettingsDialogL() + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "Pop Settings Dialog" ); + PrintDebugMsg( msg ); +#endif + + // Get the Status Pane Control + CEikStatusPane* sp = iEikEnv->AppUiFactory()->StatusPane(); + + // Fetch pointer to the default navi pane control + CAknNavigationControlContainer* NaviPane = + ( CAknNavigationControlContainer* )sp->ControlL( + TUid::Uid( EEikStatusPaneUidNavi ) ); + + NaviPane->PushDefaultL( ETrue ); + + CScreenSaverAnimSettingDialog* dlg = + CScreenSaverAnimSettingDialog::NewL( this, iSettingObject ); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg1, "dlg created Call executeld" ); + PrintDebugMsg( msg1 ); +#endif + + dlg->ExecuteLD(); + + NaviPane->Pop(); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg2, "Executed dlg, write to cenrep" ); + PrintDebugMsg( msg2 ); +#endif + + User::LeaveIfError( SetAnimSettings() ); + + // Check if a file is selected + if ( iSettingObject->iFileName.Length() == 0 ) + { + // Don't Pop an error note + // Just leave + User::Leave( KErrCancel ) ; + } + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::HandleRepositoryCallBack +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::HandleRepositoryCallBack( TAny* aPtr ) + { + STATIC_CAST( CScreenSaverAnimPlugin*, aPtr )->HandleSettingsChange( aPtr ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::HandleRepositoryCallBack +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::HandleDrmNotification( TAny* aPtr ) + { + TRAPD( err, STATIC_CAST( CScreenSaverAnimPlugin*, aPtr ) + ->ProcessDrmNotificationL() ); + return err; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::HandleSettingsChange +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::HandleSettingsChange( TAny* /*aPtr*/ ) + { + if ( iScreensaverRepositoryWatcher ) + { + if ( iScreensaverRepositoryWatcher->ChangedKey() == + KScreenSaverAnimationTimeOut ) + { + // Update the iSettingObject + iAnimPluginSession->Get( KScreenSaverAnimationTimeOut, + iSettingObject->iAnimationTimeout ); + } + if ( iScreensaverRepositoryWatcher->ChangedKey() == + KScreenSaverLightsTimeOut ) + { + // Update the iSettingObject + iAnimPluginSession->Get( KScreenSaverLightsTimeOut, + iSettingObject->iLightsTimeout ); + } + + if ( iScreensaverRepositoryWatcher->ChangedKey() == + KScreenSaverAnimatedFileName ) + { + UnregisterForDrmExpiry(); + iAnimPluginSession->Get( KScreenSaverAnimatedFileName, + iSettingObject->iFileName ); + // Find the Plugin for the new file + TInt err; + TRAP( err, FindPluginL( iSettingObject->iFileName ) ); + if ( err != KErrNone ) + { + NotifyCenrepChangeCancel(); + iScreenSaverHost->RevertToDefaultSaver(); + return; + } + } + } + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::InitializeCenRepL +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::InitializeCenRepL() + { + + TRAPD( err, iAnimPluginSession = + CRepository::NewL( KCRUidScreenSaverAnimPlugin ) ); +#ifdef SCREENSAVER_LOG_ENABLED + TBuf buffer; + _LIT( msg, "After SS Cenrep Init : %d" ); + buffer.Format( msg, err ); + PrintDebugMsg( buffer ); +#endif + User::LeaveIfError( err ); + + TRAPD( err1, iDrmSession = CRepository::NewL( KCRUidDRMHelperServer ) ); +#ifdef SCREENSAVER_LOG_ENABLED + TBuf buffer1; + _LIT( msg1, "After DRM Cenrep Init : %d" ); + buffer1.Format( msg1, err1 ); + PrintDebugMsg( buffer1 ); +#endif + User::LeaveIfError( err1 ); + + } +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::NotifyCenrepChangeL +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::NotifyCenrepChangeL() + { + + iScreensaverRepositoryWatcher = CScreensaverRepositoryWatcher::NewL( + KCRUidScreenSaverAnimPlugin, + TCallBack( HandleRepositoryCallBack, this ), + iAnimPluginSession ); + + iDrmExpiryWatcher = CScreensaverRepositoryWatcher::NewL( + KCRUidDRMHelperServer, + KDRMHelperServerNotification, + CCenRepNotifyHandler::EIntKey, + TCallBack( HandleDrmNotification, this ), + iDrmSession ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::NotifyCenrepChangeCancel +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::NotifyCenrepChangeCancel() + { + + delete iScreensaverRepositoryWatcher; + iScreensaverRepositoryWatcher = NULL; + + delete iDrmExpiryWatcher; + iDrmExpiryWatcher = NULL; + + } +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::UnInitializeCenRep +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::UnInitializeCenRep() + { + if ( iAnimPluginSession ) + { + delete iAnimPluginSession; + iAnimPluginSession = NULL; + } + if ( iDrmSession ) + { + delete iDrmSession; + iDrmSession = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::CScreenSaverAnimPlugin +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimPlugin::CScreenSaverAnimPlugin(): + iParentControl( NULL ),iPluginError( KErrNone ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::ConstructL() + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "ConstructL of ScreenSaverAnimPlugin" ); + PrintDebugMsg( msg ); +#endif + + // Find which drive this DLL is installed. + TFileName fileName; + + // Get the full resource file + 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 ); //for + // localization + + iDrmHelper = CDRMHelper::NewL( *iEikEnv ); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg1, "Before Cenrep Init " ); + PrintDebugMsg( msg1 ); +#endif + + InitializeCenRepL(); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg2, "After Cenrep Init " ); + PrintDebugMsg( msg2 ); +#endif + + iSettingObject = new( ELeave ) CScreenSaverAnimSettingObject; + + GetAnimSettings(); + + iResourceOffset = iEikEnv->AddResourceFileL( fileName ); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg3, "ConstructL end " ); + PrintDebugMsg( msg3 ); +#endif + + // Load localised name of screensaver to be returned for + // Themes app in Name() query + iScreensaverName = iEikEnv->AllocReadResourceL( R_SANIM_SCREENSAVER_NAME ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::SendEndEvent +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::SendEndEvent() + { + NPAnimationEvent event; + event = NPEndAnimation; + if ( iPluginFuncs ) + { + return iPluginFuncs->setvalue( iNPPinstance, + ( NPNVariable )NPNScreenSaverAnimationEvent, + &event ); + } + return KErrNone; + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::CheckFileValidity +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimPlugin::CheckFileValidityL( const TDesC& aFileName ) + { + FindAndStartPluginL( aFileName , ETrue /* Check File Mode */); + NPCheckFile checkFile; + checkFile.fileValidityCheckError = KErrNone; + checkFile.fileName = HBufC::NewL( aFileName.Length() ); + checkFile.fileName->Des().Copy( aFileName ); + + if ( iPluginFuncs ) + { + iPluginFuncs->getvalue( iNPPinstance, + ( NPPVariable )NPPCheckFileIsValid, + &checkFile ); + } + delete checkFile.fileName; + DeletePlugin(); + return checkFile.fileValidityCheckError; + + } + +/* MPluginAdapter Interface functions, The plugins call + * these back + */ +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::GetVersion +// ----------------------------------------------------------------------------- +// +TUint16 CScreenSaverAnimPlugin::GetVersion() + { + return 0; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::PluginConstructedL +// Called when the plug-in has completed its creation. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::PluginConstructedL( CCoeControl* + /*aPluginControl*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::PluginFinishedL +// Called when the plug-in has completed its creation. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::PluginFinishedL() + { + TInt error; + iPluginFuncs->getvalue( iNPPinstance, + ( NPPVariable )NPPScreenSaverGetLastError, + &error ); + +#ifdef SCREENSAVER_LOG_ENABLED + TBuf buffer1; + _LIT( msg, "Plugin finishedL Error: %d" ); + buffer1.Format( msg, error ); + PrintDebugMsg( buffer1 ); +#endif + + if ( iScreenSaverHost ) + { + if ( error != KErrNone ) + { + iPluginError = error; + // Plugin has encountered an error + iScreenSaverHost->RevertToDefaultSaver(); + } + } + } + +#ifndef __SERIES60_30__ +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::OpenUrlL +// Called by the plug-in to open a URL in the parent frame. +// This function is not implemented in Series 60. It is supported +// in Series 80 and in the Nokia 7710 smartphone +// ----------------------------------------------------------------------------- +// + +void CScreenSaverAnimPlugin::OpenUrlL( const TDesC& /* aUrl */ ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::OpenUrlInTargetWindowL +// Called by the plug-in to open a URL in a named window or frame. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::OpenUrlInTargetWindowL( const TDesC& /* aUrl */, + const TDesC& /* aNewTargetWindowName */ ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::HasNavigationHistoryPrevious +// Specifies whether or not the frame has a previous navigation history item. +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAnimPlugin::HasNavigationHistoryPrevious() const + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::LoadNavigationHistoryPreviousL +// Informs the browser to load the next navigation history URL in its parent +// frame. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::LoadNavigationHistoryPreviousL() + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::HasNavigationHistoryNext +// Returns whether the frame has a next navigation history item. +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAnimPlugin::HasNavigationHistoryNext() const + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::LoadNavigationHistoryNextL +// Informs the browser to load the next navigation history URL in its parent +// frame. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::LoadNavigationHistoryNextL() + { + } + +#endif + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::GetParentControl +// Returns the window system level control object for the plug-in. +// ----------------------------------------------------------------------------- +// +CCoeControl* CScreenSaverAnimPlugin::GetParentControl() + { + return iParentControl; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::GetParentControlObserver +// Returns the observer for the plug-in control. +// ----------------------------------------------------------------------------- +// +MCoeControlObserver* CScreenSaverAnimPlugin::GetParentControlObserver() + { + return this; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::GetParentControlObserver +// Sets the plug-in notifier allowing the plug-in to control +// portions of the browser. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::SetPluginNotifier( MPluginNotifier* /*aNotifier*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::SetContentInteractive +// Tells the plugin adapter if plugin content can accept user interaction. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::SetContentInteractive( TBool /*aInteractive*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::HandleControlEventL +// Handles an event from an observed control.This function is called +// when a control for which this control is the observer calls +// CCoeControl::ReportEventL(). It should be implemented by the observer +// control, and should handle all events sent by controls it observes. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPlugin::HandleControlEventL( CCoeControl* /*aControl*/, + TCoeEvent /*aEventType*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPlugin::CheckContentIdL +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAnimPlugin::CheckContentIdL( const TDesC& aFileName, + TDesC8& aContentUri ) + { + + TBool matched = EFalse; + HBufC* contentURI = NULL; + HBufC8* contentURI8 = NULL; + + RFile fileHandle; + + TInt error = fileHandle.Open( iEikEnv->FsSession(), + aFileName, + EFileRead | EFileShareReadersOnly ); + if ( error != KErrNone ) + { + return matched; + } + + CleanupClosePushL( fileHandle ); + CData* content = CData::NewL( fileHandle, KDefaultContentObject, EPeek ); + CleanupStack::PopAndDestroy( &fileHandle ); + + CleanupStack::PushL( content ); + + contentURI = HBufC::NewLC( KUrlMaxLen ); + + // create attribute set + RStringAttributeSet stringAttributeSet; + CleanupClosePushL( stringAttributeSet ); + // add the attributes we are interested in + stringAttributeSet.AddL( EContentID ); + + User::LeaveIfError( content->GetStringAttributeSet( stringAttributeSet ) ); + + // pass on values of string attributes + TPtr ptr = contentURI->Des(); + error = stringAttributeSet.GetValue( EContentID, ptr ); + if ( error == KErrNone ) + { + contentURI8 = HBufC8::NewLC( contentURI->Length() ); + contentURI8->Des().Copy( contentURI->Des() ); + if ( contentURI8->Compare( aContentUri ) == 0 ) + { + matched = ETrue; + } + CleanupStack::PopAndDestroy( contentURI8 ); + } + + CleanupStack::PopAndDestroy( 2, contentURI ); // stringAttributeSet.Close() + CleanupStack::PopAndDestroy( content ); + + return matched; + } + +// End Of file. + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPluginContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPluginContainer.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,614 @@ +/* +* Copyright (c) 2005 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: +* Provides ScreenSaverAnimPlugin edit list view container methods. +* +* +*/ + + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ScreenSaverAnimPlugin.h" +#include "ScreenSaverAnimPluginConst.h" +#include "ScreenSaverAnimPluginHelper.h" +#include "ScreenSaverAnimPluginContainer.h" +#include "ScreenSaverAnimPlugin.hrh" + +// ========================= MEMBER FUNCTIONS ================================ + CScreenSaverAnimPluginContainer* CScreenSaverAnimPluginContainer::NewLC( + CScreenSaverAnimPlugin* aCaller, + const CCoeControl* aParent, + CScreenSaverAnimSettingObject* aSettingObject ) + { + CScreenSaverAnimPluginContainer* self = + new ( ELeave ) CScreenSaverAnimPluginContainer( aCaller, + aSettingObject ); + CleanupStack::PushL( self ); + TRect rect; + self->GetNormalScreenLayoutRect( rect ); + self->ConstructL(aParent, rect ); + return self; + + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::NewL +// --------------------------------------------------------------------------- +// + +CScreenSaverAnimPluginContainer* CScreenSaverAnimPluginContainer::NewL( + CScreenSaverAnimPlugin* aCaller, + const CCoeControl* aParent, + CScreenSaverAnimSettingObject* aSettingObject ) + { + CScreenSaverAnimPluginContainer* self = + CScreenSaverAnimPluginContainer::NewLC( aCaller, + aParent, + aSettingObject ); + CleanupStack::Pop( self ); + return self; + + } + +// --------------------------------------------------------------------------- +// Constructor +// +// --------------------------------------------------------------------------- +// +CScreenSaverAnimPluginContainer::CScreenSaverAnimPluginContainer( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ) + : + iSettingObject( aSettingObject ), + iCaller( aCaller ) + { + } + + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::ConstructL(const TRect& aRect) +// EPOC two phased constructor +// +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::ConstructL( const CCoeControl* aParent, + const TRect& aRect ) + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "In ConstructL of container" ); + PrintDebugMsg( msg ); +#endif + + CreateWindowL( aParent ); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg1, "Window Created" ); + PrintDebugMsg( msg1 ); +#endif + + BaseConstructL( aRect, NULL, R_SANIM_SETTING_LBX_ITEMS ); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg2, "Base ConstructL called" ); + PrintDebugMsg( msg2 ); +#endif + + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::BaseConstructL + +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::BaseConstructL( + const TRect& aRect, TInt /* aTitleId */, TInt aResLbxId ) + { + // Feature support should only be read once. It should not change run-time. + GetFeatureSupportL( iFeaturesSupport ); + CEikStatusPane* sp = static_cast< CAknAppUi* >( + CEikonEnv::Static()->EikAppUi() )->StatusPane(); + CAknTitlePane* title = static_cast( + sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle) ) ); + + iListBox = new( ELeave ) CAknSettingStyleListBox; + + ConstructListBoxL( aResLbxId ); + iListBox->SetContainerWindowL( *this ); + iListBox->SetRect( aRect ); + + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + SetRect( aRect ); + ActivateL(); + + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::~CScreenSaverAnimPluginContainer() +// Destructor +// --------------------------------------------------------------------------- +// +CScreenSaverAnimPluginContainer::~CScreenSaverAnimPluginContainer() + { + delete iItems; + delete iListBox; + // delete iItemArray; + } + +// --------------------------------------------------------------------------- +// Sets feature support - see screensaveranimpluginconst.h for feature list. +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::GetFeatureSupportL( + TBitFlags& aFeatureBitFlags ) const + { + CRepository* featureRep = CRepository::NewLC( KCRUidThemesVariation ); + TInt value = KErrNone; + featureRep->Get( KThemesLocalVariation, value ); + + aFeatureBitFlags.ClearAll(); + + //map value to feature flags + if ( value & KScreenSaverRemoveAnimPluginTimeout ) + { + aFeatureBitFlags.Set( EAnimPluginBacklightRemoved ); + } + + CleanupStack::PopAndDestroy( featureRep ); + } + +// --------------------------------------------------------------------------- +// Checks if feature is supported. +// --------------------------------------------------------------------------- +// +TBool CScreenSaverAnimPluginContainer::IsFeatureSupported( TInt aFeatureID ) + { + if ( ( aFeatureID >= 0 ) && ( aFeatureID < KAnimPluginMaxFeatureID ) ) + { + return iFeaturesSupport.IsSet( aFeatureID ); + } + else + { + // invalid feature value. + return EFalse; + } + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::HandleListBoxEventL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::HandleListBoxEventL( + CEikListBox* /*aListBox*/, TListBoxEvent aEventType ) + { + switch ( aEventType ) + { + case EEventEnterKeyPressed: + case EEventItemDoubleClicked: + case EEventItemSingleClicked: + HandleListBoxSelectionL(); + break; + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::HandleListBoxSelectionL() +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::HandleListBoxSelectionL() + { + TInt index = iListBox->CurrentItemIndex(); + + switch ( index ) + { + case ESanimAnimFileNameId: + if ( !iInShowFileItem ) + { + iInShowFileItem = ETrue; + TRAPD( err,ShowFileNameItemL() ); + iInShowFileItem = EFalse; + User::LeaveIfError( err ); + } + break; + case ESanimAnimTimeoutId: + ShowAnimTimeOutItemL(); + break; + case ESanimLightsTimeoutId: + ShowLightsTimeOutItemL(); + break; + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::ConstructListBoxL( TInt aResLbxId ) +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::ConstructListBoxL( TInt aResLbxId ) + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "In Construct ListBoxL" ); + PrintDebugMsg( msg ); +#endif + + iListBox->ConstructL( this, EAknListBoxSelectionList ); + iItems = iCoeEnv->ReadDesC16ArrayResourceL( aResLbxId ); + iItemArray = static_cast< CDesCArray* >( iListBox->Model()->ItemTextArray() ); + iListBox->SetListBoxObserver( this ); + CreateListBoxItemsL(); + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::CreateListBoxItemsL() +// +// +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::CreateListBoxItemsL() + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "Make FileName" ); + PrintDebugMsg( msg ); +#endif + + MakeFileNameItem(); + iItemArray->InsertL( ESanimAnimFileNameId, iItem ); + +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg1, "Make Duration" ); + PrintDebugMsg( msg1 ); +#endif + + MakeAnimTimeOutItemL(); + iItemArray->InsertL( ESanimAnimTimeoutId, iItem ); + + if ( !IsFeatureSupported( EAnimPluginBacklightRemoved ) ) + { + #ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg2, "Make Backlight" ); + PrintDebugMsg( msg2 ); + #endif + + MakeLightsTimeOutItemL(); + iItemArray->InsertL( ESanimLightsTimeoutId, iItem ); + } + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::UpdateListBoxL( TInt aItemId ) +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::UpdateListBoxL( TInt aItemId ) + { + switch ( aItemId ) + { + case ESanimAnimFileNameId: + MakeFileNameItem(); + break; + case ESanimAnimTimeoutId: + MakeAnimTimeOutItemL(); + break; + case ESanimLightsTimeoutId: + MakeLightsTimeOutItemL(); + break; + default: + break; + } + + iItemArray->Delete( aItemId ); + iItemArray->InsertL( aItemId, iItem ); + iListBox->HandleItemAdditionL(); + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::HandleResourceChange( TInt aType ) +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::HandleResourceChange( TInt aType ) + { + CCoeControl::HandleResourceChange( aType ); + if( aType == KEikDynamicLayoutVariantSwitch ) + { + TRect mainPaneRect; + GetNormalScreenLayoutRect( mainPaneRect ); + SetRect(mainPaneRect); + + DrawNow(); + } + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::MakeFileNameItem() +// +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::MakeFileNameItem() + { + iItem = ( *iItems )[ESanimAnimFileNameId]; + TParsePtrC fileParser( iSettingObject->iFileName ); + TPtrC ptr( fileParser.NameAndExt() ); + + // Filename may be quite long - copy only the amount there's space left + iItem += ptr.Left( iItem.MaxLength() - iItem.Length() - 1 ); + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::MakeAnimTimeOutItemL() +// +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::MakeAnimTimeOutItemL() + { + iItem = ( *iItems )[ESanimAnimTimeoutId]; + + HBufC* animText = CAknSlider::CreateValueTextInHBufCL( + iSettingObject->iAnimationTimeout, + R_ANIM_TIMEOUT_SLIDER ); + + // for A&H number conversion + TPtr bufPtr = animText->Des(); + if( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeShownToUser ) ) + { + AknTextUtils::LanguageSpecificNumberConversion( bufPtr ); + } + iItem += bufPtr; + delete animText; + + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::MakeLightTimeOutItemL() +// +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::MakeLightsTimeOutItemL() + { + iItem = ( *iItems )[ESanimLightsTimeoutId]; + + HBufC* animText = NULL; + + if ( iSettingObject->iLightsTimeout == 0 ) + { + animText = iCoeEnv->AllocReadResourceL( R_SANIM_SLIDER_OFF ); + } + else + { + animText = CAknSlider::CreateValueTextInHBufCL( + iSettingObject->iLightsTimeout, + R_LIGHT_TIMEOUT_SLIDER ); + } + + // for A&H number conversion + TPtr bufPtr = animText->Des(); + if( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeShownToUser ) ) + { + AknTextUtils::LanguageSpecificNumberConversion( bufPtr ); + } + iItem += bufPtr; + delete animText; + + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::ShowFileNameItemL() +// +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::ShowFileNameItemL() + { + + CDesCArrayFlat* selectedFile = new( ELeave )CDesCArrayFlat( 1 ); + CleanupStack::PushL( selectedFile ); + + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC( reader, + R_MIMETYPE_SPECIFIC_PLUGIN_ARRAY ); + TInt countResource = reader.ReadInt16(); + + CDesCArrayFlat* mimetypesList = new( ELeave ) + CDesCArrayFlat( countResource ); + + CleanupStack::PushL( mimetypesList ); + + for ( TInt i = 0; i < countResource; i++ ) + { + HBufC* mimeType = reader.ReadHBufCL(); + + // Check plugin availability before appending mimetype + TUid uid = iCaller->FindAnimPluginL( *mimeType ); + if ( uid != KNullUid ) + { + mimetypesList->AppendL( *mimeType ); + } + delete mimeType; + reader.ReadInt32(); + } + + CScreenSaverAnimPluginVerifier* verifier = + CScreenSaverAnimPluginVerifier::NewL( iCaller ); + CleanupStack::PushL( verifier ); + TBool fileSelected = MGFetch::RunL( *selectedFile, + EAnyMediaFile, + EFalse, + KNullDesC, + KNullDesC, + mimetypesList, + verifier ); + + CleanupStack::PopAndDestroy( verifier ); + CleanupStack::PopAndDestroy( mimetypesList ); + CleanupStack::PopAndDestroy(); // reader + + if ( fileSelected ) + { + TPtrC fileNamePtr = selectedFile->MdcaPoint( 0 ); + TFileName tempFileName; + tempFileName.Copy( fileNamePtr ); + iSettingObject->iFileName.Copy( tempFileName ); + // Write the new setting into the central repository + iCaller->SetAnimSettings(); + UpdateListBoxL( ESanimAnimFileNameId ); + } + + CleanupStack::PopAndDestroy( selectedFile ); + + } + +// ---------------------------------------------------- +// CScreenSaverAnimPluginContainer::ShowAnimTimeOutItemL() +// Display the animation time-out setting page. +// ---------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::ShowAnimTimeOutItemL() + { + + CAknSettingPage* dlg = new( ELeave ) CAknSliderSettingPage( + R_ANIM_TIMEOUT_SETTING_PAGE, + iSettingObject->iAnimationTimeout ); + if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) ) + { + // Write the new setting into the central repository + iCaller->SetAnimSettings(); + UpdateListBoxL( ESanimAnimTimeoutId ); + } + } + +// ---------------------------------------------------- +// CScreenSaverAnimPluginContainer::ShowLightsTimeOutItemL() +// Display the animation time-out setting page. +// ---------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::ShowLightsTimeOutItemL() + { + CAknSettingPage* dlg = + new( ELeave ) CAknSliderSettingPage( R_LIGHT_TIMEOUT_SETTING_PAGE, + iSettingObject->iLightsTimeout ); + if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) ) + { + // Write the new setting into the central repository + iCaller->SetAnimSettings(); + UpdateListBoxL( ESanimLightsTimeoutId ); + } + } + +void CScreenSaverAnimPluginContainer::SizeChanged() + { + if (iListBox) + { + // Get size from main pane, place from this rect + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( + AknLayoutUtils::EMainPane, + mainPaneRect ); + + iListBox->SetExtent( Rect().iTl, mainPaneRect.Size() ); + } + } + +TInt CScreenSaverAnimPluginContainer::CountComponentControls() const + { + if ( iListBox ) + { + return 1; + } + else + { + return 0; + } + } + +CCoeControl* CScreenSaverAnimPluginContainer:: + ComponentControl( TInt /*aIndex*/ ) const + { + if ( iListBox ) + { + return iListBox; + } + else + { + return NULL; + } + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::OfferKeyEventL +// Called when a key is pressed. +// +// --------------------------------------------------------------------------- +TKeyResponse CScreenSaverAnimPluginContainer::OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType ) + { + switch (aKeyEvent.iCode) + { + case EKeyLeftArrow: + case EKeyRightArrow: + // Listbox takes all event even if it doesn't use them + return EKeyWasNotConsumed; + default: + break; + } + return iListBox->OfferKeyEventL( aKeyEvent, aType ); + } + +void CScreenSaverAnimPluginContainer::SetContainerWindowL( const CCoeControl& + /* aContainer*/ ) + { + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimPluginContainer::FocusChanged +// --------------------------------------------------------------------------- +void CScreenSaverAnimPluginContainer::FocusChanged( TDrawNow aDrawNow ) + { + // Pass focus changed event to listbox. + if ( iListBox ) + { + iListBox->SetFocus( IsFocused(), aDrawNow ); + } + } + +// ----------------------------------------------------------------------------- +// CSvgRenderFrameControl::GetNormalScreenLayoutRect +// Gets the normal screen layout rectangle for control from LAF. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginContainer::GetNormalScreenLayoutRect( + TRect& aRect ) const // Rectangle specifying extent of control + { + AknLayoutUtils::LayoutMetricsRect( + AknLayoutUtils::EMainPane, + aRect ); + } + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPluginHelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPluginHelper.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,361 @@ +/* +* Copyright (c) 2005 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 all helper classes +* for ScreenSaverAnimPlugin +* +*/ + + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include + +#include + +#include "ScreenSaverAnimPluginHelper.h" +#include "ScreenSaverAnimPlugin.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPluginVerifier::CScreenSaverAnimPluginVerifier +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimPluginVerifier::CScreenSaverAnimPluginVerifier( + CScreenSaverAnimPlugin* aFileVerify ) : + iFileVerify( aFileVerify ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPluginVerifier::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginVerifier::ConstructL() + { + iCoeEnv = CCoeEnv::Static(); + iDRMHelper = CDRMHelper::NewL( *iCoeEnv ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPluginVerifier::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimPluginVerifier* CScreenSaverAnimPluginVerifier::NewL( + CScreenSaverAnimPlugin* aFileVerify ) + { + CScreenSaverAnimPluginVerifier* self = new( ELeave ) + CScreenSaverAnimPluginVerifier( aFileVerify ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPluginVerifier::~CScreenSaverAnimPluginVerifier +// Destructor. +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimPluginVerifier::~CScreenSaverAnimPluginVerifier() + { + delete iDRMHelper; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPluginVerifier::IsFileValidL +// Empty implementation. +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAnimPluginVerifier::VerifySelectionL( const MDesCArray* + aSelectedFiles ) + { + + TBool canbeautomated( EFalse ); + + if( aSelectedFiles->MdcaCount()<1 ) + { + // Download item + return ETrue; + } + + // 1. Check whether the drm rights are ok + TInt res = 0; + iDRMHelper->SetAutomatedType( + CDRMHelper::EAutomatedTypeScreenSaver ); + res = iDRMHelper->CanSetAutomated( aSelectedFiles->MdcaPoint( 0 ), canbeautomated ); + if ( KErrUnderflow == res ) + { + TInt resourceId = R_SANIM_ERROR_WRONG_FORMAT; + // Show information note + ShowErrorNoteL( resourceId ); + return EFalse; + } + if ( res ) + { + iDRMHelper->HandleErrorL( res, aSelectedFiles->MdcaPoint( 0 ) ); + return canbeautomated; + } + else if ( !canbeautomated ) + { + ShowErrorNoteL( R_DRM_PREV_RIGHTS_SET ); + return canbeautomated; + } + + // 2. Check whether the file is supported + RApaLsSession ls; + CleanupClosePushL( ls ); + TUid dummyUid( KNullUid ); + TDataType dataType; + User::LeaveIfError( ls.Connect() ); + // find the mimetype + User::LeaveIfError( ls.AppForDocument( aSelectedFiles->MdcaPoint( 0 ), + dummyUid, dataType ) ); + + CleanupStack::PopAndDestroy( &ls ); + + TResourceReader reader; + TBool valid( EFalse ); + iCoeEnv->CreateResourceReaderLC( reader, + R_MIMETYPE_SPECIFIC_PLUGIN_ARRAY ); + TInt countResource = reader.ReadInt16(); + + for ( TInt i = 0; i < countResource; i++ ) + { + HBufC* newMimeTypeEntry = reader.ReadHBufCL(); + TPtr mimePtr( newMimeTypeEntry->Des() ); + reader.ReadInt32(); + if ( newMimeTypeEntry->Compare( dataType.Des() ) == 0 ) + { + valid = ETrue; + } + delete newMimeTypeEntry; + } + CleanupStack::PopAndDestroy(); // reader + + if ( !valid ) + { + // Pop a not supported error message + ShowErrorNoteL( R_SANIM_NOT_SUPPORTED ); + return EFalse; + } + + //3. Check file for Validity + + //Display the confirmation query when setting + //a DRM protected image as screensaver in General settings. + TInt isCancel; + isCancel = iDRMHelper->ShowAutomatedNote( aSelectedFiles->MdcaPoint( 0 ) ); + if ( KErrCancel == isCancel ) + { + return EFalse; + } + + + TInt validity = KErrNone; + TRAPD( err, + validity = iFileVerify->CheckFileValidityL( aSelectedFiles->MdcaPoint( 0 ) )); + + if ( err ) + { + // Dll may not be present + ShowErrorNoteL( R_SANIM_NOT_SUPPORTED ); + return EFalse; + } + + if ( validity == KErrNoMemory ) + { + // Pop up a Corrupted File message + CEikonEnv::Static()->HandleError( validity ); + return EFalse; + } + else if ( validity != KErrNone ) + { + TInt resourceId = R_SANIM_ERROR_WRONG_FORMAT; + // Show information note + ShowErrorNoteL( resourceId ); + return EFalse; + } + + return valid; + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimPluginVerifier::ShowErrorNoteL +// Displays the error note +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimPluginVerifier::ShowErrorNoteL( TInt aResourceId ) const + { + HBufC* errorText = + iCoeEnv->AllocReadResourceLC( aResourceId ); + CAknInformationNote* note = new( ELeave ) CAknInformationNote( EFalse ); + note->ExecuteLD( *errorText ); + CleanupStack::PopAndDestroy( errorText ); // errorText + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverRepositoryWatcher* CScreensaverRepositoryWatcher::NewL( + const TUid aUid, + const TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aKeyType, + TCallBack aCallBack, + CRepository* aRepository ) + { + CScreensaverRepositoryWatcher* self = new( ELeave ) + CScreensaverRepositoryWatcher( aUid, aKey, aCallBack, aRepository ); + + CleanupStack::PushL( self ); + self->ConstructL( aKeyType ); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverRepositoryWatcher* CScreensaverRepositoryWatcher::NewL( + const TUid aUid, + TCallBack aCallBack, + CRepository* aRepository ) + { + CScreensaverRepositoryWatcher* self = new( ELeave ) CScreensaverRepositoryWatcher( + aUid, NCentralRepositoryConstants::KInvalidNotificationId, aCallBack, aRepository ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::~CScreensaverRepositoryWatcher +// ----------------------------------------------------------------------------- +// +CScreensaverRepositoryWatcher::~CScreensaverRepositoryWatcher() + { + if ( iNotifyHandler ) + { + iNotifyHandler->StopListening(); + delete iNotifyHandler; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::CScreensaverRepositoryWatcher +// ----------------------------------------------------------------------------- +// +CScreensaverRepositoryWatcher::CScreensaverRepositoryWatcher( + const TUid aUid, + const TUint32 aKey, + TCallBack aCallBack, + CRepository* aRepository ) + : + iUid( aUid ), iKey( aKey ), iCallBack( aCallBack ), iRepository( aRepository ) + { + } + + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::ConstructL(CCenRepNotifyHandler::TCenRepKeyType aKeyType) + { + iNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iRepository, aKeyType, iKey ); + iNotifyHandler->StartListeningL(); + } + + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::ConstructL() + { + iNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iRepository ); + iNotifyHandler->StartListeningL(); + } + + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::ChangedKey +// ----------------------------------------------------------------------------- +// +TUint32 CScreensaverRepositoryWatcher::ChangedKey() + { + return iChangedKey; + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::HandleNotifyInt +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::HandleNotifyInt( + TUint32 aKey, TInt /*aNewValue*/ ) + { + iChangedKey = aKey; + iCallBack.CallBack(); + iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId; + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::HandleNotifyString +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::HandleNotifyString( TUint32 aKey, + const TDesC16& /*aNewValue*/ ) + { + iChangedKey = aKey; + iCallBack.CallBack(); + iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId; + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::HandleNotifyGeneric +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::HandleNotifyGeneric(TUint32 aKey) + { + iChangedKey = aKey; + iCallBack.CallBack(); + iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId; + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::HandleNotifyError +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::HandleNotifyError(TUint32 /*aKey*/, TInt /*aError*/, CCenRepNotifyHandler* /*aHandler*/) + { + } + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPluginProxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimPluginProxy.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2005 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: ECOM Implementation Array. +* +*/ + + + + + +// INCLUDE FILES +#include +#include +#include +#include "ScreenSaverAnimPluginImplementationUid.hrh" +#include "ScreenSaverAnimPlugin.h" + +// CONSTANTS +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( KScreenSaverAnimPluginImplementationUID, + CScreenSaverAnimPlugin::NewL ) + }; + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// ImplementationProxy +// ECOM implementation table entry. +// ----------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + + return ImplementationTable; + } + +// End of File + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimSettingDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverAnimPlugin/src/ScreenSaverAnimSettingDialog.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,470 @@ +/* +* Copyright (c) 2005 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 Setting Dialog which +* is used to display Settings container +* +*/ + + + + + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __SERIES60_HELP +#include +#endif // __SERIES60_HELP + +#ifdef __SERIES60_HELP +// Help Context UID = DLL UID3 +const TUid KScreenSaverAnimPluginHelpContextUid = { 0x10207447 }; +#endif // __SERIES60_HELP + +#include +#include +#include +#include +#include +#include +#include +//----------- +// USER INCLUDES +#include "ScreenSaverAnimPlugin.h" +#include "ScreenSaverAnimPlugin.hrh" +#include "ScreenSaverAnimSettingDialog.h" +#include "ScreenSaverAnimPluginContainer.h" +#include "screensaver.hlp.hrh" + +// Middle softkey control ID +const TInt KSanimMSKControlID = 3; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::CScreenSaverAnimSettingDialog +// Default Constructor. Initialises Dialog State Variables. +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimSettingDialog::CScreenSaverAnimSettingDialog( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ) + :iSettingObject( aSettingObject ), + iCaller( aCaller ) + { + iCustControl = NULL; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::ConstructL +// Second Phase Constructor for CScreenSaverAnimSettingDialog. Opens resource file, reads the +// dialog menu resource and calls CAknDialog::ConstructL with the resource as +// param. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::ConstructL() + { + CAknDialog::ConstructL( R_SANIM_DIALOG_MENUBAR ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::NewL +// Factory function for creating CScreenSaverAnimSettingDialog objects. +// Returns: CScreenSaverAnimSettingDialog* ; Pointer to the created object. +// Leaves if error occurs during creation. +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimSettingDialog* CScreenSaverAnimSettingDialog::NewL( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ) + { + CScreenSaverAnimSettingDialog* self = CScreenSaverAnimSettingDialog::NewLC( + aCaller, + aSettingObject ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::NewLC +// Factory function for creating CScreenSaverAnimSettingDialog objects. +// It also pushes the created dialog object onto the cleanup stack. +// Returns: CScreenSaverAnimSettingDialog* ; Pointer to the created object. +// Leaves if error occurs during creation. +// ----------------------------------------------------------------------------- +// +CScreenSaverAnimSettingDialog* CScreenSaverAnimSettingDialog::NewLC( + CScreenSaverAnimPlugin* aCaller, + CScreenSaverAnimSettingObject* aSettingObject ) + { + CScreenSaverAnimSettingDialog* self = new ( ELeave ) + CScreenSaverAnimSettingDialog( aCaller, aSettingObject ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// Destructor +CScreenSaverAnimSettingDialog::~CScreenSaverAnimSettingDialog() + { + if (this->IsFocused()) + { + CEikDialog::ButtonGroupContainer().RemoveCommandObserver( + KSanimMSKControlID ); + } + + // Custom Control will be automatically destroyed by dialog framework + iCustControl = NULL; + + // Set the text in status pane to the stored one + if (iAppTitleText) + { + // Get the Status Pane Control + CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane(); + // Get the title pane + CAknTitlePane* tp = NULL; + TRAPD( errGetControl, + tp = static_cast< CAknTitlePane* >( sp->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ) ); + if ( errGetControl == KErrNone && tp ) + { + //set application name in the title pane + TRAPD( errSetText, + tp->SetTextL( *iAppTitleText ) ); + if ( errSetText != KErrNone ) + { + // No error handling here + } + } + + delete iAppTitleText; + iAppTitleText = NULL; + } + + delete iTitlePaneString; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::ExecuteLD +// Reimplements CAknDialog::ExecuteLD. It initialises the member variables of +// the class and calls CAknDialog::ExecuteLD() with the dialog resource. +// ----------------------------------------------------------------------------- +// +TInt CScreenSaverAnimSettingDialog::ExecuteLD() + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "In Executeld dlg" ); + PrintDebugMsg( msg ); +#endif + + // Save this pointer since there are leaving functions in the flow + CleanupStack::PushL( this ); + + // Get the Status Pane Control + CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane(); + + // Get the Title Pane Control + CAknTitlePane* tp = static_cast< CAknTitlePane* >( sp->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + // Store the Application's title text + iAppTitleText = HBufC::NewL( tp->Text()->Length() ); + *iAppTitleText = *tp->Text(); + + // Display Settings in the title pane of application + iTitlePaneString = NULL; + iTitlePaneString = StringLoader::LoadL( R_SANIM_TITLE_SETTINGS, + iEikonEnv ); + // SetTextL also ensures that if the length exceeds the layout space + // available the text is truncated from the end. + tp->SetTextL( iTitlePaneString->Des() ); + + // ExecuteLD will delete this, so we have to Pop it... + CleanupStack::Pop( this ); // this + + return CAknDialog::ExecuteLD( R_SANIM_SETTING_DIALOG ); + + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::DynInitMenuPaneL +// Reimplements CAknDialog::DynInitMenuPaneL inorder to support dynamic hiding +// of menu items based on current state of the viewer. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::DynInitMenuPaneL( + TInt aResourceId, // Resource Id for which this func is called + CEikMenuPane* aMenuPane ) // Menupane object pointer for manipulation + { + if ( ( aResourceId == R_SANIM_DIALOG_MENU ) && ( aMenuPane ) ) + { + } + } + + +// ----------------------------------------------------------------------------- +// Layouts dialog before showing it. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::PreLayoutDynInitL() + { + // Set middle softkey as Change. + SetMiddleSoftKeyLabelL( R_SANIM_MSK_CHANGE, ESanimDlgChangeCommand ); + + CAknDialog::PreLayoutDynInitL(); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::OkToExitL +// Reimplements CAknDialog::OkToExitL inorder to display custom menu and +// trap the back softkey to provide restore view functionality/exit. +// ----------------------------------------------------------------------------- +// +TBool CScreenSaverAnimSettingDialog::OkToExitL( TInt aButtonId ) // ButtonId of button pressed + { + if ( aButtonId == EAknSoftkeyOptions ) + { + DisplayMenuL(); + return EFalse; + } + else + { + if ( aButtonId == EAknSoftkeyBack ) + { + } + else + { + // Especially handle Select Key + if ( ( aButtonId == EAknSoftkeySelect ) || + ( aButtonId == EEikBidOk ) || + ( aButtonId == ESanimDlgChangeCommand ) ) + { + // Select button pressed, handle, do not leave dialog + ProcessCommandL( ESanimDlgChangeCommand ); + return EFalse; + } + if ( aButtonId == EEikCmdExit ) + { + } + } + } + + return ETrue; + } + + +// --------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::HandleApplicationForegroundEvent +// This API is used by the application to give background/foreground events +// to the Dialog. The dialog inturn passes the events to custom control. +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::HandleApplicationForegroundEvent( TBool + /*aForeground*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::ProcessCommandL +// Reimplements CAknDialog::ProcessCommandL inorder to handle dialog menu +// commands. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::ProcessCommandL( TInt aCommandId ) // Command Id + { + // The Commands are handled by the custom CCoe Control and + // a boolean varialble is used inorder to keep track whether + // the control command processing needs to be invoked or not. + CAknDialog::ProcessCommandL( aCommandId ); + switch ( aCommandId ) + { + case ESanimDlgChangeCommand: + if ( iCustControl ) + { + iCustControl->HandleListBoxSelectionL(); + } + break; + case ESanimDlgHelpCommand: + { +#ifdef __SERIES60_HELP + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), + iEikonEnv->EikAppUi()->AppHelpContextL() ); +#endif + } + break; + case EAknSoftkeyBack: // Fall Through + case EEikCmdExit: + case EAknCmdExit: + // Close this dialog + TryExitL( aCommandId ); + iAvkonAppUi->ProcessCommandL( aCommandId ); + break; + default: + break; + } + } + +#ifdef __SERIES60_HELP +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::OfferKeyEventL +// Handles Key events by reimplementing CCoeControl::OfferKeyEventL. +// Returns: +// EKeyWasConsumed: If this control uses this key. +// EKeyWasNotConsumed: Otherwise. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::GetHelpContext( TCoeHelpContext& + aContext ) const + { + aContext.iMajor = KScreenSaverAnimPluginHelpContextUid; + aContext.iContext = KSCREENSAVER_HLP_ANIM_SETTINGS; + } +#endif // __SERIES60_HELP + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::CreateCustomControlL +// Reimplements CAknDialog::CreateCustomControlL inorder to add the +// custom control as part of the dialog in the UI framework. +// Returns: SEikControlInfo which contains the Cust Control, if +// aControlType == ESanimCustControl +// else, +// the structure does not contain any control. +// ----------------------------------------------------------------------------- +// +SEikControlInfo CScreenSaverAnimSettingDialog::CreateCustomControlL( + TInt aControlType ) // Control Type + { +#ifdef SCREENSAVER_LOG_ENABLED + _LIT( msg, "In Create Custom Control" ); + PrintDebugMsg( msg ); +#endif + + SEikControlInfo controlInfo; + controlInfo.iControl = NULL; + controlInfo.iTrailerTextId = 0; + controlInfo.iFlags = EEikControlIsNonFocusing; + + switch ( aControlType ) + { + case ESanimCustControl: + iCustControl = CScreenSaverAnimPluginContainer::NewL( + iCaller, + this, + iSettingObject ); + controlInfo.iControl = iCustControl; + break; + default: + break; + } + return controlInfo; + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::SizeChanged +// Reimplements CAknDialog::SizeChanged inorder to support the resize of the +// dialog when functions such as SetRect, SetExtent are called on the dialog. +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::SizeChanged() + { + CAknDialog::SizeChanged(); + iCustControl->SetExtent( Rect().iTl, Rect().Size() ); + DrawNow(); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::OfferKeyEventL +// Handles Key events by reimplementing CCoeControl::OfferKeyEventL. +// Returns: +// EKeyWasConsumed: If this control uses this key. +// EKeyWasNotConsumed: Otherwise. +// ----------------------------------------------------------------------------- +// +TKeyResponse CScreenSaverAnimSettingDialog::OfferKeyEventL( + const TKeyEvent& aKeyEvent, // Key Event + TEventCode aType ) // Event Code + { + if ( iCustControl ) + { + TKeyResponse lCcRetVal = iCustControl->OfferKeyEventL( aKeyEvent, aType ); + if ( lCcRetVal == EKeyWasConsumed ) + { + // Key was consumed, UNLESS it was the End key, which should be + // passed to base class. For some reason listboxes like to eat + // end keys + if ( aKeyEvent.iCode != EKeyEscape ) + { + return EKeyWasConsumed; + } + } + } + return CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + +// ----------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::HandleResourceChange +// Handles change of skin/Layout +// ----------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::HandleResourceChange( TInt aType ) + { + if ( iCustControl ) + { + iCustControl->HandleResourceChange( aType ); + } + CAknDialog::HandleResourceChange( aType ); + } + +// --------------------------------------------------------------------------- +// CScreenSaverAnimSettingDialog::FocusChanged +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::FocusChanged( TDrawNow aDrawNow ) + { + // Pass focus changed event to listbox. + if ( iCustControl ) + { + iCustControl->SetFocus( IsFocused(), aDrawNow ); + } + } + +// --------------------------------------------------------------------------- +// Sets middle softkey label. +// --------------------------------------------------------------------------- +// +void CScreenSaverAnimSettingDialog::SetMiddleSoftKeyLabelL( + const TInt aResourceId, const TInt aCommandId ) + { + HBufC* middleSKText = StringLoader::LoadLC( aResourceId ); + TPtr mskPtr = middleSKText->Des(); + CEikDialog::ButtonGroupContainer().AddCommandToStackL( + KSanimMSKControlID, + aCommandId, + mskPtr ); + CEikDialog::ButtonGroupContainer().UpdateCommandObserverL( + KSanimMSKControlID, + *this ); + CleanupStack::PopAndDestroy( middleSKText ); + } + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/BWINSCW/ScreenSaverGifAnimPluginU.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/BWINSCW/ScreenSaverGifAnimPluginU.def Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/EABI/ScreenSaverGifAnimPluginU.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/EABI/ScreenSaverGifAnimPluginU.def Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,9 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + _ZTI19CGifAnimationPlugin @ 2 NONAME ; ## + _ZTI26CGifAnimationPluginControl @ 3 NONAME ; ## + _ZTI27CGifAnimationPluginEcomMain @ 4 NONAME ; ## + _ZTV19CGifAnimationPlugin @ 5 NONAME ; ## + _ZTV26CGifAnimationPluginControl @ 6 NONAME ; ## + _ZTV27CGifAnimationPluginEcomMain @ 7 NONAME ; ## + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/group/ScreenSaverGifAnimPluginEcom.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/group/ScreenSaverGifAnimPluginEcom.mmp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2005 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: Project definition file for project GifAnimation plug-in +* +*/ + + + + + +#include + +TARGET ScreenSaverGifAnimPlugin.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x102750B5 + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE GifAnimationPluginMain.cpp +SOURCE GifAnimationPlugin.cpp +SOURCE GifAnimationPluginDllApi.cpp +SOURCE GifAnimationPluginControl.cpp + + +USERINCLUDE ../inc +USERINCLUDE ../../ScreenSaverAnimPlugin/inc + +// This is a SYSTEMINCLUDE macro containing the middleware +// layer specific include directories +APP_LAYER_SYSTEMINCLUDE + +SOURCEPATH ../resource +START RESOURCE 102750B5.rss +TARGET ScreenSaverGifAnimPlugin.rsc +END // RESOURCE + + +//deffile generation +#if defined( ARMCC ) +DEFFILE ../EABI/ScreenSaverGifAnimPlugin.def +#else +DEFFILE ../BWINSCW/ScreenSaverGifAnimPlugin.def +#endif + +LIBRARY euser.lib cone.lib +LIBRARY eikcore.lib fbscli.lib gdi.lib +LIBRARY bitgdi.lib // CFbsBitmapDevice +LIBRARY ecom.lib +LIBRARY IHL.lib // MIHLFileImage +LIBRARY efsrv.lib // RFs +LIBRARY bafl.lib // baflutils diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/group/bld.inf Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,34 @@ +/* +* 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: This is a build file that builds ScreenSaverGifAnimPlugin alone +* +*/ + + + + + +#ifdef RD_SCREENSAVER_GIFANIMATION + +//Platforms listed are not built by ScreenSaver GifAnimPlugin +PRJ_PLATFORMS +DEFAULT -ARMI -ARM4 + +PRJ_EXPORTS +../rom/ScreenSaverGifAnimPlugin.iby CORE_MW_LAYER_IBY_EXPORT_PATH(ScreenSaverGifAnimPlugin.iby) + +PRJ_MMPFILES +ScreenSaverGifAnimPluginEcom.mmp + +#endif // RD_SCREENSAVER_GIFANIMATION diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/inc/GifAnimationPlugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/inc/GifAnimationPlugin.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,434 @@ +/* +* Copyright (c) 2005 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: Screensaver GifAnimation plug-in implementation header file +* +*/ + + + +#ifndef C_GIFANIMATIONPLUGIN_H +#define C_GIFANIMATIONPLUGIN_H + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +// FORWARD DECLARATIONS +class MIHLFileImage; +class MIHLBitmap; +class MIHLImageViewer; + +class CCoeControl; +class CGifAnimationPlugin; + +// CONSTANTS +/** implementation id GifAnim Ecom Plugin */ +const TInt KGifAnimationPluginImplementationValue = 0x102750B4; + +/****************************************** +* This class is specific to ECom Style Plugin. +* This is used for passing plugin specific initialization information +* to and from browser. +*******************************************/ + +class CGifAnimationPluginEcomMain : public CEcomBrowserPluginInterface + { + public: // Functions from base classes + + /** + * Instance factory + * @param aInitParam an optional parameter + */ + static CGifAnimationPluginEcomMain* NewL(TAny* aInitParam); + + /** + * Destructor. + */ + virtual ~CGifAnimationPluginEcomMain(); + + /** + * @return pointer to functions struct. + */ + NPNetscapeFuncs* Funcs() { return iNpf; } + + private: // Constructors + CGifAnimationPluginEcomMain( NPNetscapeFuncs* aNpf ); + void Construct( NPPluginFuncs* aPluginFuncs ); + private: // new functions + /** + * Sets pointers to interface functions + * @param aPpf structure to fill + */ + NPError InitializeFuncs( NPPluginFuncs* aPpf ); + + private: // Data + // pointer to plug-in function pointers struct + NPNetscapeFuncs* iNpf; + }; + +/**************************************** +Class CGifAnimationPluginControl +Class to Handle UI related actions +****************************************/ +class CGifAnimationPluginControl : public CCoeControl, + public MIHLViewerObserver + + { +public: // Constructor and Destructor + + /** + * Function: NewL + * + * Description: Get instance of a CGifAnimationPluginControl object. + * @param aParentControl a parent class to register to + * @param aPluginAdapter pointer to plugin adapter + */ + static CGifAnimationPluginControl* NewL( CCoeControl* aParentControl, + MPluginAdapter* aPluginAdapter); + + /** + * Destructor. + */ + ~CGifAnimationPluginControl(); + +public: // From MIHLViewerObserver + /** + * From MIHLViewerObserver Notifies client + * when viewer bitmap content is changed. + * Leave situation is handled in ViewerError() callback. + */ + void ViewerBitmapChangedL(); + + /** + * From MIHLViewerObserver Notifies client if error occurs in viewer. + * @param aError IN System wide error code. + */ + void ViewerError( TInt aError ); + +public: // new methods + /** + * Loads the image into display. + * @param aImageFileName image file name - expected to be valid image + */ + void LoadImageL( const TDesC& aImageFileName ); + + /** + * @return last error, if any + */ + TInt GetLastError() const; + + /** + * Start animation. + */ + void StartAnimationL(); + + /** + * Stop animation. + */ + void StopAnimation(); + + /** + * Checks that the file is a valid image file. + * Will leave otherwise + * + * @param aImageFileName image file name - expected to be valid image + */ + static void CheckFileIsValidL( const TDesC& aImageFileName ); + + +private: // new methods + + /** + * @return ETrue if loaded image is animation. + */ + TBool IsAnimation() const; + + /** + * Cancel animation. + */ + void CancelAnimation(); + + /** + * Performs image loading steps. + * Uses file name stored in LoadImageL() + */ + void DoImageLoadingL(); + + /** + * Frees resources allocated with LoadImageL() + */ + void DeleteAnimation(); + + /** + * If loading content fails, non-leaving HandleCallback + * must be call always that parent can update its state + * properly. + */ + void HandleCallback( TInt aError ); + + /** + * Informes that the plug-in wants to terminate + */ + void InformPluginFinished(); + + /** + * Informs that DRM rights should not be consumed + */ + void SetPreviewMode(); + +private: // from CCoeControl + void Draw(const TRect& aRect) const; + void SizeChanged(); + +private: // Constructor + /** + * Constructor. + */ + CGifAnimationPluginControl(); + + /** + * ConstructL + * + * 2nd phase constructor. + * @param aParentControl a parent class to register to + * @param aPluginAdapter pointer to plugin adapter + */ + void ConstructL( CCoeControl *aParentControl, + MPluginAdapter* aPluginAdapter ); + +private: // Data + + /** + * Possible animation states + */ + enum TAnimationState + { + EAnimationNotReady=1, // the file was not loaded yet or corrupt + EAnimationLoading=2, + EAnimationPlaying=3 + }; + + // Source image + MIHLFileImage* iSourceImage; + + // Destination bitmap + MIHLBitmap* iDrawingBitmap; + + // the bitmap is used for scaling our way, IHL will not do scaling + CFbsBitmap* iScalingBitmap; + + // the mask for scaled bitmap + CFbsBitmap* iScalingBitmapMask; + + // size of target bitmap + TSize iTargetSize; + + // new size of target bitmap + TSize iTargetNewSize; + + // Image viewer used as engine + MIHLImageViewer* iEngine; + + // Internal animation state. + TAnimationState iAnimationState; + + // path and name of file being loaded + TFileName iFileName; + + // code of last loading error occured + TInt iLastError; + + // pointer to adapter, we do not own the instance + MPluginAdapter* iPluginAdapter; + + // if true, no DRM rights are consumed + TBool isPreviewMode; + + // a flag to make sure the first ViewerBitmapChangedL is finished, + // then we could draw image on screen + TBool isViewerBitmapChangedL; + }; + + +/******************************************************* +Class CGifAnimationPlugin +********************************************************/ + +class CGifAnimationPlugin : public CBase + { +public: // Constructor and Destructor + /** + * Instance factory + */ + static CGifAnimationPlugin* NewL( NPP anInstance ); + /** + * Destructor + */ + ~CGifAnimationPlugin(); + + /** + * Notifies host that plug-in has finished. + */ + void PrepareToExitL(); + + /** + * @return ref of CGifAnimationPluginControl + */ + CGifAnimationPluginControl* Control(); + + /** + * @return pointer on NPP instance + */ + NPP Instance(); + + /** + * Sets the parent window to plug-in. If already set, only updates size. + * @param aWindow a parent window + * @param aRect a parent window rectangle + */ + void SetWindowL( const NPWindow *aWindow, const TRect& aRect ); + +private: + /** + * Construct. + * + * 2nd phase constructor. + * @param anInstance NPP structure + */ + void Construct( NPP anInstance ); + +private: + // pointer to adapter + MPluginAdapter* iPluginAdapter; + + // pointer to Container + CGifAnimationPluginControl* iControl; + + // structure with pointers + NPP iInstance; + }; + +/**************************************************************************** +* +* Plugin API methods +* +*/ + +/** + * Create a plugin. + */ +NPError GifAnimationPluginNewp( NPMIMEType pluginType, + NPP instance, + uint16 mode, + CDesCArray* argn, + CDesCArray* argv, + NPSavedData* saved ); + +/** + * Destroy a plugin. + */ +NPError GifAnimationPluginDestroy(NPP instance, NPSavedData** save); + +/** + * This is the parent window of a plugin. + */ +NPError GifAnimationPluginSetWindow(NPP instance, NPWindow* window); + +/** + * A new data stream has been created for sending data to the plugin. + */ +NPError GifAnimationPluginNewStream( NPP instance, + NPMIMEType type, + NPStream* stream, + NPBool seekable, + uint16* stype ); + +/** + * A data stream has been terminated. + */ +NPError GifAnimationPluginDestroyStream( NPP instance, + NPStream* stream, + NPReason reason ); + +/** + * A data stream has been fully saved to a file. + */ +void GifAnimationPluginAsFile( NPP instance, + NPStream* stream, + const TDesC& fname ); + +/** + * Return the maximum number of bytes this plugin can accept from the stream. + * @param instance - the plug-in instance + * @param stream - the stream to use + */ +int32 GifAnimationPluginWriteReady( NPP instance, NPStream* stream ); + +/** + * Receive more data - return number of bytes processed. + * + * @param instance - the plug-in instance + * @param stream - the stream to read from + * @param buffer - contains the data. + * @param len - the number of bytes in buffer. + * @param offset - the number of bytes already sent/processed. + * @return TInt number of bytes processed. + */ +int32 GifAnimationPluginWrite( NPP instance, + NPStream* stream, + int32 offset, + int32 len, + void* buffer ); + +/** + * Generic hook to retrieve values/attributes from the plugin. + */ +NPError GifAnimationPluginGetValue( NPP instance, + NPPVariable variable, + void *ret_value ); + +/** + * Generic hook to set values/attributes within the plugin. + */ +NPError GifAnimationPluginSetValue( NPP instance, + NPNVariable variable, + void *ret_value ); + +/** + * Event + */ +int16 GifAnimationPluginEvent( NPP instance, void* event ); + +/** + * Notify + */ +void GifAnimationPluginURLNotify( NPP instance, + const TDesC& url, + NPReason reason, + void* notifyData ); + +/** + * Print + */ +void GifAnimationPluginPrint( NPP instance, NPPrint* platformPrint ); + +#endif // C_GIFANIMATIONPLUGIN_H diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/inc/GifAnimationUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/inc/GifAnimationUtils.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2005 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: Screensaver GifAnimation plug-in utility file header +* +*/ + + + + + +#ifndef GIFANIMPLUGINUTIL_H +#define GIFANIMPLUGINUTIL_H + +// INCLUDES +#include +#include + +#ifdef _DEBUG + +// MACROS +#define DBG_TRACE( str ) \ + RDebug::Printf( "GifAnimation plug-in: %s:%s:%d %s", \ + __FILE__, __FUNCTION__, __LINE__, (str) ); +#define DBG_TRACE_FN_BEGIN \ + RDebug::Printf("GifAnimation plug-in: %s:%s begin", \ + __FILE__, __FUNCTION__); +#define DBG_TRACE_FN_END \ + RDebug::Printf("GifAnimation plug-in: %s:%s end", \ + __FILE__, __FUNCTION__); + +#define DBG_ERR_DLG( strDesC, code ) \ + CAknErrorNote* informationNote = \ + new ( ELeave ) CAknErrorNote(ETrue); \ + TBuf<256> message; \ + _LIT(KErrorFormat, "Error: %S, code: %d"); \ + message.Format(KErrorFormat, &strDesC, code); \ + informationNote->ExecuteLD( message ); +#else + +#define DBG_TRACE( str ) +#define DBG_TRACE_FN_BEGIN +#define DBG_TRACE_FN_END +#define DBG_ERR_DLG( strDesC, code ) + +#endif // _DEBUG + +#endif // GIFANIMPLUGINUTIL_H diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/resource/102750B5.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/resource/102750B5.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,63 @@ +/* +* Copyright (c) 2005 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: Registry file for Ecom style Screensaver GifAnimation plug-in +* +*/ + + + + + +#include + + + +// RESOURCE DEFINITIONS +// ----------------------------------------------------------------------------- +// +// Registry info +// The UIDs for the filters implemented in this DLL +// +// ----------------------------------------------------------------------------- +// + +RESOURCE REGISTRY_INFO theInfo + { + dll_uid = 0x102750B5; // should match the name of the file. + // 3-d Uid of associeted plugin dll (declared in the dll mmp file) + + interfaces= + { + INTERFACE_INFO + { + interface_uid = 0x102750CB; // KScreenSaverPluginInterfaceUid, identifies plugin type (used by ECom) + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x102750B4; // specify specific implementation (must + // match an implementation entry in the dll + version_no = 1; + display_name = "ScreenSaverGifAnimPlugin.dll;Gif Animation Plugin"; // file name; plugin's name + default_data = "image/gif"; + // suppored mime types + // mime Extensions + // and mime descriptions + opaque_data = "Gif Animation Plugin"; // plugin's description + } + }; + } + }; + } + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/rom/ScreenSaverGifAnimPlugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/rom/ScreenSaverGifAnimPlugin.iby Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2005 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: IBY file for ScreenSaverAnimPlugin +* +*/ + + + + +#ifndef __SCREENSAVERGIFANIMPLUGIN_IBY +#define __SCREENSAVERGIFANIMPLUGIN_IBY + +// Not on ROM in 3.0, and only if S60 browser is used +#ifdef RD_SCREENSAVER_GIFANIMATION +#ifdef __SERIES60_NATIVE_BROWSER +ECOM_PLUGIN(ScreenSaverGifAnimPlugin.dll,102750B5.rss) +#endif +#endif // RD_SCREENSAVER_GIFANIMATION + +#endif // __SCREENSAVERGIFANIMPLUGIN_IBY +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/src/GifAnimationPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/src/GifAnimationPlugin.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,145 @@ +/* +* Copyright (c) 2005 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: Screensaver GifAnimation plug-in implementation source file +* +*/ + + + + + +#include +#include +#include +#include +#include +#include +#include + +#include "GifAnimationPlugin.h" +#include "GifAnimationUtils.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Instance factory. +// --------------------------------------------------------------------------- +// +CGifAnimationPlugin* CGifAnimationPlugin::NewL( NPP anInstance ) + { + DBG_TRACE_FN_BEGIN; + CGifAnimationPlugin *self = new (ELeave) CGifAnimationPlugin; + CleanupStack::PushL( self ); + self->Construct( anInstance ); + + CleanupStack::Pop(); + DBG_TRACE_FN_END; + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CGifAnimationPlugin::~CGifAnimationPlugin() + { + DBG_TRACE_FN_BEGIN; + if ( iControl ) + { + delete iControl; + iControl=NULL; + } + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// Notifies host that plug-in has finished. +// --------------------------------------------------------------------------- +// +void CGifAnimationPlugin::PrepareToExitL() + { + DBG_TRACE_FN_BEGIN; + + if ( iPluginAdapter ) + { + CCoeControl* aParentControl = iPluginAdapter->GetParentControl(); + if ( iControl != NULL ) + { + // will free resources, if file was loaded but was not stopped + iControl->StopAnimation(); + } + iPluginAdapter->PluginFinishedL(); + } + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// 2nd phase constructor. +// --------------------------------------------------------------------------- +// +void CGifAnimationPlugin::Construct( NPP anInstance ) + { + DBG_TRACE_FN_BEGIN; + iInstance=anInstance; + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// Sets the parent window to plug-in. If already set, only updates size. +// --------------------------------------------------------------------------- +// +void CGifAnimationPlugin::SetWindowL( const NPWindow *aWindow, + const TRect& aRect ) + { + DBG_TRACE_FN_BEGIN; + iPluginAdapter = static_cast( aWindow->window ); + CCoeControl* aParentControl = iPluginAdapter->GetParentControl(); + if ( iControl == NULL ) + { + iControl = CGifAnimationPluginControl::NewL( aParentControl, + iPluginAdapter ); + iPluginAdapter->PluginConstructedL( iControl ); + } + + if ( iControl != NULL ) + { + iControl->SetRect( aRect ); + } + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// Returns pointer on instance of CGifAnimationPluginControl +// --------------------------------------------------------------------------- +// +CGifAnimationPluginControl* CGifAnimationPlugin::Control() + { + DBG_TRACE_FN_BEGIN; + ASSERT( iControl ); + DBG_TRACE_FN_END; + return iControl; + } + +// --------------------------------------------------------------------------- +// Returns pointer on NPP instance +// --------------------------------------------------------------------------- +// +NPP CGifAnimationPlugin::Instance() + { + DBG_TRACE_FN_BEGIN; + ASSERT( iInstance ); + DBG_TRACE_FN_END; + return iInstance; + } diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/src/GifAnimationPluginControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/src/GifAnimationPluginControl.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,603 @@ +/* +* Copyright (c) 2005 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: Screensaver GifAnimation plug-in container source file +* +*/ + + + + + +#include +#include +#include +#include + +#include // IHLImageFactory +#include // IHLViewerFactory +#include // MIHLImageViewer +#include // MIHLFileImage +#include // MIHLBitmap +#include // MIHLImageViewer +#include +#include + +#include "GifAnimationPlugin.h" +#include "GifAnimationUtils.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Instance factory +// --------------------------------------------------------------------------- +// +CGifAnimationPluginControl* CGifAnimationPluginControl::NewL( + CCoeControl *aParentControl, + MPluginAdapter* aPluginAdapter ) + { + ASSERT( aPluginAdapter ); + DBG_TRACE_FN_BEGIN; + CGifAnimationPluginControl* tmp = + new ( ELeave )CGifAnimationPluginControl(); + CleanupStack::PushL( tmp ); + tmp->ConstructL( aParentControl, aPluginAdapter ); + CleanupStack::Pop(); + DBG_TRACE_FN_END; + return tmp; + } + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CGifAnimationPluginControl::ConstructL( CCoeControl* aParentControl, + MPluginAdapter* aPluginAdapter ) + { + DBG_TRACE_FN_BEGIN; + + iPluginAdapter = aPluginAdapter; + isViewerBitmapChangedL = EFalse; + + if ( aParentControl != NULL ) + { + CreateWindowL( aParentControl ); + } + else + { + CreateWindowL(); + } + ActivateL(); + + MakeVisible( ETrue ); // make it invisible for now + + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CGifAnimationPluginControl::CGifAnimationPluginControl() + : iSourceImage( NULL ), + iDrawingBitmap( NULL ), + iScalingBitmap( NULL ), + iScalingBitmapMask( NULL ), + iEngine( NULL ), + iAnimationState( EAnimationNotReady ), + iLastError( KErrNone ) + { + DBG_TRACE_FN_BEGIN; + // nothing goes here + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CGifAnimationPluginControl::~CGifAnimationPluginControl() + { + DBG_TRACE_FN_BEGIN; + + DeleteAnimation(); + + iPluginAdapter = NULL; + + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------- +// Loads the image into display. +// Param aImageFileName image file name - expected to be valid image +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::LoadImageL( const TDesC& aImageFileName ) + { + DBG_TRACE_FN_BEGIN; + iFileName.Copy( aImageFileName ); + + iLastError = KErrNotReady; // if asked before loading is complete+Draw() + TRAPD( error, DoImageLoadingL() ); + if ( error ) + { + iLastError = error; + DeleteAnimation(); + DBG_TRACE_FN_END; + User::Leave( error ); // re-throw it + } + else + { + DBG_TRACE( "Animation loaded" ); + iAnimationState = EAnimationLoading; + iLastError = KErrNone; + } + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------- +// Return ETrue if loaded image is animation. +// --------------------------------------------------------- +// +TBool CGifAnimationPluginControl::IsAnimation() const + { + DBG_TRACE_FN_BEGIN; + if ( iSourceImage + && iLastError == KErrNone ) // we did not have any error loading picture + { + DBG_TRACE_FN_END; + return iSourceImage->IsAnimation(); + } + DBG_TRACE_FN_END; + return EFalse; + } + + +// --------------------------------------------------------- +// Return TInt with image loading error. +// --------------------------------------------------------- +// +TBool CGifAnimationPluginControl::GetLastError() const + { + DBG_TRACE_FN_BEGIN; + // + DBG_TRACE_FN_END; + return iLastError; + } + +// --------------------------------------------------------- +// Start animation. +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::StartAnimationL() + { + DBG_TRACE_FN_BEGIN; + + if ( iEngine == NULL ) // animation was stopped, + { // need to re-load animation file + DoImageLoadingL(); + } + + // start animation + if ( iEngine && IsAnimation() ) + { + iEngine->Play(); + iAnimationState = EAnimationPlaying; + } + + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------- +// Stop animation. +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::StopAnimation() + { + DBG_TRACE_FN_BEGIN; + + // bugfix for JPYO-6KXHRW + MakeVisible( EFalse ); + + + // instead of just stopping player, we delete it. + // This is because of stability issues with the start-stop-destroy cycle + DeleteAnimation(); + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------- +// Called when size is changed. +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::SizeChanged() + { + DBG_TRACE_FN_BEGIN; + if ( iEngine ) + { + iEngine->SetViewerSize( Size() ); + } + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// Overriden CCoeControl::Draw() +// --------------------------------------------------------------------------- +// +void CGifAnimationPluginControl::Draw( const TRect& /*aRect*/ ) const + { + //DBG_TRACE_FN_BEGIN; + CWindowGc& gc = SystemGc(); + TRect rect( Rect() ); + + DBG_TRACE( "Draw: Clearing background" ); + gc.Clear( Rect() ); + gc.SetBrushColor( KRgbBlack ); + gc.SetBrushStyle( CGraphicsContext::ESolidBrush); + gc.DrawRect( rect ); + + if ( iDrawingBitmap + && iEngine + && iLastError == KErrNone // loading was successful + && isViewerBitmapChangedL ) // need to check whether first ViewerBitmapChangedL + // has been called; + { + TSize screenSize( rect.Size() ); + TPoint destinationPoint( + ( screenSize.iWidth-iTargetNewSize.iWidth ) / 2, + ( screenSize.iHeight-iTargetNewSize.iHeight ) / 2 ); + + TSize drawingBitmapSize( iDrawingBitmap->Bitmap().SizeInPixels() ); + if ( drawingBitmapSize.iHeight == iTargetNewSize.iHeight + && drawingBitmapSize.iWidth == iTargetNewSize.iWidth ) + { + // we use unscaled version as size is Ok + iDrawingBitmap->Draw( gc, + destinationPoint, + iTargetNewSize ); + } + else + { + // we use scaled version + if ( iDrawingBitmap->HasMask() ) + { + gc.BitBltMasked( destinationPoint, + iScalingBitmap, + iTargetNewSize, + iScalingBitmapMask, + EFalse ); + } + else + { + gc.BitBlt( destinationPoint, + iScalingBitmap ); + } + } + } + else // image is not ready or broken + { + DBG_TRACE( "image is not ready or broken" ); + } + //DBG_TRACE_FN_END; + } + +// --------------------------------------------------------- +// CGifAnimationPluginControl::DoImageLoadingL +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::DoImageLoadingL() + { + DBG_TRACE_FN_BEGIN; + + RFs& fs = CEikonEnv::Static()->FsSession(); + TBool fileExists = BaflUtils::FileExists( fs, iFileName ); + if ( !fileExists ) + { + DBG_TRACE_FN_END; + User::Leave( KErrPathNotFound ); + } + + + RFile fileHandle; + CleanupClosePushL( fileHandle ); + iLastError = fileHandle.Open( fs, iFileName, EFileRead | EFileShareReadersOnly ); + User::LeaveIfError(iLastError); + + // delete old instances, if any + DeleteAnimation(); + + // create new objects + if ( iDrawingBitmap == NULL ) + { + iDrawingBitmap = IHLBitmap::CreateL(); + } + + TInt drmOption( 0 ); + if ( isPreviewMode ) + { + drmOption = MIHLFileImage::EOptionNoDRMConsume; + } + iSourceImage = IHLImageFactory::OpenFileImageL( fileHandle, + 0, // image index + drmOption ); + + // calculate target size so that picture fits the screen and centered + TSize sourceSize( iSourceImage->Size() ); + TSize maxSize = Size(); + + iTargetSize = TSize( Min( sourceSize.iWidth, maxSize.iWidth ), + Min( sourceSize.iHeight, maxSize.iHeight ) ); + + if ( sourceSize.iWidth < maxSize.iWidth + && sourceSize.iHeight < maxSize.iHeight ) + { + // scale up N-times + TInt upScale = Min( maxSize.iWidth / sourceSize.iWidth, + maxSize.iHeight / sourceSize.iHeight ); + iTargetSize = TSize( sourceSize.iWidth * upScale, + sourceSize.iHeight * upScale ); + const TUint32 options( 0 ); // no flags set + // we do not want IHL do scaling, so targetSize= sourceSize + iEngine = IHLViewerFactory::CreateImageViewerL( sourceSize, + *iSourceImage, + *iDrawingBitmap, + *this, + options ); + iTargetNewSize = iTargetSize; + } + else + { + //The image needs to be scaled down. We pass the target size to + //IHL so that it doesn't come back with an OOM situation in case + //the resolution is too high. + // scale up N-times + TReal downScale = Min( TReal(maxSize.iWidth) / TReal(sourceSize.iWidth), + TReal(maxSize.iHeight) / TReal(sourceSize.iHeight) ); + iTargetSize = TSize( sourceSize.iWidth * downScale, + sourceSize.iHeight * downScale ); + const TUint32 options( 0 ); // no flags set + TReal widthRatio( TReal( iTargetSize.iWidth ) / TReal( sourceSize.iWidth ) ); + TReal heightRatio( TReal( iTargetSize.iHeight ) / TReal( sourceSize.iHeight ) ); + if( options & MIHLImageViewer::EOptionIgnoreAspectRatio ) + { + downScale = ( widthRatio > heightRatio ) ? widthRatio : heightRatio; + } + else + { + downScale = ( widthRatio < heightRatio ) ? widthRatio : heightRatio; + } + TReal widthZoomRatio( downScale ); + TReal heightZoomRatio( downScale ); + if( options & MIHLImageViewer::EOptionIgnoreAspectRatio ) + { + TReal widthRatio( TReal( iTargetSize.iWidth ) / TReal( sourceSize.iWidth ) ); + TReal heightRatio( TReal( iTargetSize.iHeight ) / TReal( sourceSize.iHeight ) ); + if( widthRatio < heightRatio ) + { + widthZoomRatio = widthZoomRatio * widthRatio / heightRatio; + } + else + { + heightZoomRatio = heightZoomRatio * heightRatio / widthRatio; + } + } + iTargetNewSize = TSize( sourceSize.iWidth * widthZoomRatio, + sourceSize.iHeight * heightZoomRatio ); + // we do not want IHL do scaling, so targetSize= sourceSize + iEngine = IHLViewerFactory::CreateImageViewerL( iTargetSize, + *iSourceImage, + *iDrawingBitmap, + *this, + options ); + } + + // create bitmaps needed for manual scaling + TDisplayMode dMode = CEikonEnv::Static()->DefaultDisplayMode(); + if ( iScalingBitmap == NULL ) + { + iScalingBitmap = new( ELeave ) CFbsBitmap; + iScalingBitmap->Create( iTargetSize, dMode ); + } + + if ( iScalingBitmapMask == NULL ) + { + iScalingBitmapMask = new( ELeave ) CFbsBitmap; + iScalingBitmapMask->Create( iTargetSize, EGray256 ); + } + + CleanupStack::PopAndDestroy( &fileHandle ); + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------- +// CGifAnimationPluginControl::CheckFileIsValidL +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::CheckFileIsValidL( + const TDesC& aImageFileName ) + { + DBG_TRACE_FN_BEGIN; + + ASSERT( aImageFileName.Size() ); + CGifAnimationPluginControl* temp = + new ( ELeave )CGifAnimationPluginControl(); + CleanupStack::PushL( temp ); + temp->SetSize( TSize( 100, 100 ) ); + temp->SetPreviewMode(); + temp->LoadImageL( aImageFileName ); + temp->DeleteAnimation(); + CleanupStack::PopAndDestroy( temp ); + + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------- +// CGifAnimationPluginControl::DeleteAnimation +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::DeleteAnimation() + { + DBG_TRACE_FN_BEGIN; + if ( iEngine ) + { + iAnimationState = EAnimationNotReady; + iEngine->Stop(); + delete iEngine; + iEngine = NULL; + } + + if ( iSourceImage ) + { + delete iSourceImage; + iSourceImage = NULL; + } + + if ( iDrawingBitmap ) + { + delete iDrawingBitmap; + iDrawingBitmap = NULL; + } + + if ( iScalingBitmap ) + { + delete iScalingBitmap; + iScalingBitmap = NULL; + } + + if ( iScalingBitmapMask ) + { + delete iScalingBitmapMask; + iScalingBitmapMask = NULL; + } + + + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------- +// Handle bitmap change notifications. State is changed accordingly +// if this is the first frame. +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::ViewerBitmapChangedL() + { + switch ( iAnimationState ) + { + case EAnimationLoading: + { + iAnimationState = EAnimationPlaying; + break; + } + case EAnimationPlaying: + { + // do nothing + break; + } + case EAnimationNotReady: + default: + { + break; + } + } + + if( iAnimationState == EAnimationPlaying ) + { + if ( iDrawingBitmap + && iEngine + && iLastError == KErrNone ) // loading was successful + { + TSize drawingBitmapSize( iDrawingBitmap->Bitmap().SizeInPixels() ); + if ( drawingBitmapSize.iHeight == iTargetNewSize.iHeight + && drawingBitmapSize.iWidth == iTargetNewSize.iWidth ) + { + // we do not need to do scaling + } + else + { + // we need to do scaling + CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL( iScalingBitmap ); + CleanupStack::PushL(bitmapDevice); + CFbsBitGc* graphicsContext = NULL; + User::LeaveIfError( bitmapDevice->CreateContext( graphicsContext ) ); + CleanupStack::PushL( graphicsContext ); + TRect srcRect( iSourceImage->Size() ); + graphicsContext->DrawBitmap( iTargetSize, &iDrawingBitmap->Bitmap(), srcRect ); + CleanupStack::PopAndDestroy( 2 );//graphicsContext,bitmapDevice + + if ( iDrawingBitmap->HasMask() ) + { + CFbsBitmapDevice* bitmapMaskDevice = CFbsBitmapDevice::NewL( iScalingBitmapMask ); + CleanupStack::PushL(bitmapMaskDevice); + CFbsBitGc* graphicsMaskContext = NULL; + User::LeaveIfError( bitmapMaskDevice->CreateContext( graphicsMaskContext ) ); + CleanupStack::PushL( graphicsMaskContext ); + graphicsMaskContext->DrawBitmap( iTargetSize, &iDrawingBitmap->Mask(), srcRect ); + CleanupStack::PopAndDestroy( 2 );//graphicsContext,bitmapDevice + } + } + } + isViewerBitmapChangedL = ETrue; + MakeVisible( ETrue ); + DrawNow(); + } + } + +// --------------------------------------------------------- +// Handles engine errors. +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::ViewerError( TInt aError ) + { + DBG_TRACE_FN_BEGIN; + iLastError = aError; + HandleCallback( aError ); + DBG_TRACE_FN_END; + } + + +// --------------------------------------------------------- +// Handles error codes; stores the error +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::HandleCallback( TInt aError ) + { + DBG_TRACE_FN_BEGIN; + + if ( aError ) + { + InformPluginFinished(); + } + + DBG_TRACE_FN_END; + } + + +// --------------------------------------------------------- +// Informs that plug-in wants to terminate +// --------------------------------------------------------- +// +void CGifAnimationPluginControl::InformPluginFinished() + { + + ASSERT( iPluginAdapter ); + + StopAnimation(); + + TRAP_IGNORE(iPluginAdapter->PluginFinishedL()); + } + +void CGifAnimationPluginControl::SetPreviewMode() + { + isPreviewMode = ETrue; + } diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/src/GifAnimationPluginDllApi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/src/GifAnimationPluginDllApi.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,278 @@ +/* +* Copyright (c) 2005 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: Screensaver GifAnimation plug-in API file +* +*/ + + + + + +#include // IHLImageFactory + +#include "GifAnimationPlugin.h" +#include "NPNExtensions.h" +#include "GifAnimationUtils.h" + +// ======== Ecom interface functions implementation ======== + +NPError GifAnimationPluginNewp( NPMIMEType /*pluginType*/, + NPP instance, + uint16 /*mode*/, + CDesCArray* /*argn*/, + CDesCArray* /*argv*/, + NPSavedData* /*saved*/ ) + { + DBG_TRACE_FN_BEGIN; + CGifAnimationPlugin* lGifAnimationPlugin=NULL; + TRAPD(err,lGifAnimationPlugin=CGifAnimationPlugin::NewL( instance ) ); + + if ( err == KErrNoMemory ) + { + DBG_TRACE_FN_END; + return NPERR_OUT_OF_MEMORY_ERROR; + } + if ( err != KErrNone ) + { + DBG_TRACE_FN_END; + return NPERR_MODULE_LOAD_FAILED_ERROR; + } + instance->pdata = (void *) lGifAnimationPlugin; + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + +NPError GifAnimationPluginDestroy( NPP instance, NPSavedData** /*save*/ ) + { + DBG_TRACE_FN_BEGIN; + CGifAnimationPlugin* lGifAnimationPlugin = + ( CGifAnimationPlugin * )instance->pdata; + if ( lGifAnimationPlugin ) + { + TRAPD( err, lGifAnimationPlugin->PrepareToExitL() ); + if ( err != KErrNone ) + { + DBG_TRACE( + "GifAnimationPluginDestroy Error when PrepareToExitL()" ); + } + /**Ignoring the error*/ + delete lGifAnimationPlugin; + lGifAnimationPlugin = NULL; + } + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + +NPError GifAnimationPluginSetWindow( NPP instance, NPWindow *window ) + { + DBG_TRACE_FN_BEGIN; + CGifAnimationPlugin* lGifAnimationPlugin = + (CGifAnimationPlugin *) instance->pdata; + TUint lWidth = window->width; + TUint lHeight = window->height; + TRAPD( err, + lGifAnimationPlugin->SetWindowL( window, + TRect( TSize( lWidth, lHeight ) ) ) ); + + if ( err == KErrNoMemory ) + { + DBG_TRACE_FN_END; + return NPERR_OUT_OF_MEMORY_ERROR; + } + if ( err != KErrNone ) + { + DBG_TRACE_FN_END; + return NPERR_GENERIC_ERROR; + } + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + +NPError GifAnimationPluginNewStream( NPP /*instance*/, + NPMIMEType /*type*/, + NPStream* /*stream*/, + NPBool /*seekable*/, + uint16* stype ) + { + DBG_TRACE_FN_BEGIN; + *stype = NP_ASFILEONLY; + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + +NPError GifAnimationPluginDestroyStream( NPP /*instance*/, + NPStream* /*stream*/, + NPReason /*reason*/ ) + { + DBG_TRACE_FN_BEGIN; + // + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + +void GifAnimationPluginAsFile( NPP instance, + NPStream* /*stream*/, + const TDesC& fname ) + { + DBG_TRACE_FN_BEGIN; + CGifAnimationPlugin* lGifAnimationPlugin = + ( CGifAnimationPlugin* )instance->pdata; + TRAP_IGNORE( lGifAnimationPlugin->Control()->LoadImageL( fname ) ); + DBG_TRACE_FN_END; + } + +int32 GifAnimationPluginWriteReady( NPP /*instance*/, NPStream* /*stream*/ ) + { + DBG_TRACE_FN_BEGIN; + // + DBG_TRACE_FN_END; + return 65536; + } + +int32 GifAnimationPluginWrite( NPP /*instance*/, + NPStream* /*stream*/, + int32 /*offset*/, + int32 len, + void* /*buffer*/ ) + { + DBG_TRACE_FN_BEGIN; + // + DBG_TRACE_FN_END; + return len; + } + +int16 GifAnimationPluginEvent( NPP /*instance*/, void* /*event*/ ) + { + DBG_TRACE_FN_BEGIN; + // + DBG_TRACE_FN_END; + return 0; + } + + +NPError GifAnimationPluginGetValue( NPP instance, + NPPVariable variable, + void* ret_value ) + { + DBG_TRACE_FN_BEGIN; + if ( variable == NPPCheckFileIsValid ) + { + NPCheckFile* checkFile = (NPCheckFile*)ret_value; + TRAPD( err, + CGifAnimationPluginControl::CheckFileIsValidL( + checkFile->fileName->Des() ) ); + + checkFile->fileValidityCheckError = err; + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + + if ( variable == NPPScreenSaverGetLastError ) + { + DBG_TRACE( "GetLastError" ); + TInt* retValue = (TInt*)ret_value; + CGifAnimationPlugin* lGifAnimationPlugin = + ( CGifAnimationPlugin* )instance->pdata; + *retValue = lGifAnimationPlugin->Control()->GetLastError(); + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + + // new command, panic + _LIT( KErrGetMsg, + "CGifAnimationPluginDllApi::GifAnimationPluginGetValue" ); + User::Panic( KErrGetMsg, KErrNotSupported ); + return NPERR_GENERIC_ERROR; + } + +NPError GifAnimationPluginSetValue( NPP instance, + NPNVariable variable, + void* value ) + { + DBG_TRACE_FN_BEGIN; + CGifAnimationPlugin* lGifAnimationPlugin = + ( CGifAnimationPlugin* )instance->pdata; + + if ( variable == NPNScreenSaverAnimationEvent ) + { + NPAnimationEvent* event = (NPAnimationEvent*)value; + switch ( *event ) + { + case NPStartAnimation: + DBG_TRACE( "StartAnimationL" ); + TRAPD( errStart, + lGifAnimationPlugin->Control()->StartAnimationL() ); + if ( errStart != KErrNone ) + { + DBG_TRACE( "StartAnimation failed!" ); + return NPERR_GENERIC_ERROR; + } + return NPERR_NO_ERROR; + case NPEndAnimation: + DBG_TRACE( "StopAnimation" ); + TRAPD( errEnd, + lGifAnimationPlugin->Control()->StopAnimation() ); + if (errEnd != KErrNone) + { + DBG_TRACE( "StopAnimation failed!" ); + return NPERR_GENERIC_ERROR; + } + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + default: + // new command, panic + _LIT( KErrSet1Msg, + "CGifAnimationPluginDllApi::GifAnimationPluginSetValue1" ); + User::Panic( KErrSet1Msg, KErrNotSupported ); + return NPERR_GENERIC_ERROR; + } + } + + if ( variable == NPScreenSaverMode ) + { + // we do not need the event + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + + if ( variable == NPNInteractionMode ) + { + // we do not need the event + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + + // new command, panic + _LIT( KErrSet2Msg, + "CGifAnimationPluginDllApi::GifAnimationPluginSetValue2" ); + User::Panic( KErrSet2Msg, KErrNotSupported ); + return NPERR_GENERIC_ERROR; + } + +void GifAnimationPluginURLNotify( NPP /*instance*/, + const TDesC& /*url*/, + NPReason /*reason*/, + void* /*notifyData*/ ) + { + DBG_TRACE_FN_BEGIN; + // + DBG_TRACE_FN_END; + } + +void GifAnimationPluginPrint( NPP /*instance*/, NPPrint* /*platformPrint*/ ) + { + DBG_TRACE_FN_BEGIN; + // + DBG_TRACE_FN_END; + } diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/src/GifAnimationPluginMain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/ScreenSaverGifAnimPlugin/src/GifAnimationPluginMain.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,155 @@ +/* +* Copyright (c) 2005 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: Screensaver GifAnimation plug-in API file +* +*/ + + + + + +#include +#include + + +#include "GifAnimationPlugin.h" +#include "GifAnimationUtils.h" + +// --------------------------------------------------------------------------- +// Table of implementation UID / implementation class factory +// --------------------------------------------------------------------------- +// +const TImplementationProxy KImplementationTable[] = + { + { { KGifAnimationPluginImplementationValue }, + (TProxyNewLPtr) CGifAnimationPluginEcomMain::NewL + } + }; + + +/************************************************************************/ +/**********ECOM STYLE Screensaver GifAnimation plug-in ENTRY POINTS******/ +/************************************************************************/ + +// --------------------------------------------------------------------------- +// Instance factory. +// --------------------------------------------------------------------------- +// +CGifAnimationPluginEcomMain* CGifAnimationPluginEcomMain::NewL( + TAny* aInitParam ) + { + DBG_TRACE_FN_BEGIN; + TFuncs* funcs = REINTERPRET_CAST( TFuncs*, aInitParam); + CGifAnimationPluginEcomMain* self = + new( ELeave )CGifAnimationPluginEcomMain( funcs->iNetscapeFuncs ); + CleanupStack::PushL(self); + self->Construct( funcs->iPluginFuncs ); + CleanupStack::Pop(); + DBG_TRACE_FN_END; + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CGifAnimationPluginEcomMain::~CGifAnimationPluginEcomMain() + { + DBG_TRACE_FN_BEGIN; + // nothing here + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// 2nd phase constructor. +// --------------------------------------------------------------------------- +// +void CGifAnimationPluginEcomMain::Construct( NPPluginFuncs* aPluginFuncs ) + { + DBG_TRACE_FN_BEGIN; + InitializeFuncs( aPluginFuncs ); + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// Initializes NPP with pointers to implementing functions. +// --------------------------------------------------------------------------- +// +NPError CGifAnimationPluginEcomMain::InitializeFuncs( NPPluginFuncs* aPpf ) + { + DBG_TRACE_FN_BEGIN; + aPpf->size = sizeof(NPPluginFuncs); + aPpf->version = 1; + aPpf->newp = NewNPP_NewProc( GifAnimationPluginNewp ); + aPpf->destroy = NewNPP_DestroyProc( GifAnimationPluginDestroy ); + aPpf->setwindow = NewNPP_SetWindowProc( GifAnimationPluginSetWindow ); + aPpf->newstream = NewNPP_NewStreamProc( GifAnimationPluginNewStream ); + aPpf->destroystream = NewNPP_DestroyStreamProc( + GifAnimationPluginDestroyStream ); + aPpf->asfile = NewNPP_StreamAsFileProc( GifAnimationPluginAsFile ); + aPpf->writeready = NewNPP_WriteReadyProc( + GifAnimationPluginWriteReady ); + aPpf->write = NewNPP_WriteProc( GifAnimationPluginWrite ); + aPpf->print = NewNPP_PrintProc( GifAnimationPluginPrint ); + aPpf->event = NewNPP_HandleEventProc( GifAnimationPluginEvent ); + aPpf->urlnotify = NewNPP_URLNotifyProc( GifAnimationPluginURLNotify ); + aPpf->javaClass = NULL; + aPpf->getvalue = NewNPP_GetValueProc( GifAnimationPluginGetValue ); + aPpf->setvalue = NewNPP_SetValueProc( GifAnimationPluginSetValue ); + + DBG_TRACE_FN_END; + return NPERR_NO_ERROR; + } + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +CGifAnimationPluginEcomMain::CGifAnimationPluginEcomMain( + NPNetscapeFuncs* aNpf ) + : CEcomBrowserPluginInterface(), iNpf( aNpf ) + { + DBG_TRACE_FN_BEGIN; + // + DBG_TRACE_FN_END; + } + +// --------------------------------------------------------------------------- +// Returns the filters implemented in this DLL +// Returns: The filters implemented in this DLL +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount ) + { + DBG_TRACE_FN_BEGIN; + aTableCount = sizeof( KImplementationTable ) + / sizeof( TImplementationProxy ); + DBG_TRACE_FN_END; + return KImplementationTable; + } + +#ifndef EKA2 +// --------------------------------------------------------------------------- +// The E32Dll() entry point function. Deprecated. +// --------------------------------------------------------------------------- +// +GLDEF_C TInt E32Dll(TDllReason /*aReason*/) + { + DBG_TRACE_FN_BEGIN; + // + DBG_TRACE_FN_END; + return KErrNone; + } +#endif // EKA2 diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/data/102823EC.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/data/102823EC.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,58 @@ +/* +* 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: ECOM Resource file for slideshowplugin +* +*/ + + + + + +// INCLUDES +#include + +#include "ScreensaverpluginIntDef.hrh" +#include "SlideshowPluginImpUID.hrh" + +// RESOURCE DEFINITIONS +// ----------------------------------------------------------------------------- +// +// theInfo +// ECOM DLL interface & implementation description resource. +// +// ----------------------------------------------------------------------------- +// +RESOURCE REGISTRY_INFO theInfo + { + dll_uid = 0x102823EC; + interfaces = + { + INTERFACE_INFO + { + interface_uid = KCScreensaverPluginInterfaceDefinitionUid; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = KSlideshowPluginImpUID; + version_no = 1; + display_name = "Slideshow"; + default_data = ""; + opaque_data = "07"; // Conf, sel notif, preview notif + } + }; + } + }; + } +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/data/SlideshowPlugin.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/data/SlideshowPlugin.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,128 @@ +/* +* 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: Localisable resources of SlideshowPlugin +* +*/ + + + + + +// RESOURCE IDENTIFIER + +NAME SSSS + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// --------------------------------------------------------- +// +// Define the resource file signature +// This resource should be empty. +// +// --------------------------------------------------------- +// +RESOURCE RSS_SIGNATURE + { + } + + +RESOURCE TBUF + { + buf = "SlideshowScreensaver"; + } + + +// --------------------------------------------------- +// +// r_slideshow_screensaver_name +// +// --------------------------------------------------- +// +RESOURCE TBUF r_slideshow_screensaver_name + { + buf = qtn_slideshow_screensaver_name; + } + + +// --------------------------------------------------- +// +// r_sanim_title_settings +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_not_supported + { + buf = qtn_err_not_supp; + } + + +// --------------------------------------------------- +// +// r_sanim_title_settings +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_error_wrong_format + { + buf = qtn_sanim_error_wrong_format; + } + + +// --------------------------------------------------- +// +// r_sanim_file_not_selected +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_file_not_selected + { + buf = qtn_sanim_file_not_selected; + } + + +// --------------------------------------------------- +// +// r_sanim_err_failure +// +// --------------------------------------------------- +// +RESOURCE TBUF r_sanim_err_failure + { + buf = qtn_err_failure; + } + + +// --------------------------------------------------- +// +// r_drm_prev_rights_set +// +// --------------------------------------------------- +// +RESOURCE TBUF r_drm_prev_rights_set + { + buf = qtn_drm_prev_rights_set; + } + + +// End of File + + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/group/ABLD.BAT --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/group/ABLD.BAT Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,15 @@ +@ECHO OFF + +REM Bldmake-generated batch file - ABLD.BAT +REM ** DO NOT EDIT ** + +perl -S ABLD.PL "\S60\screensaver\plugins\SlideshowPlugin\group\\" %1 %2 %3 %4 %5 %6 %7 %8 %9 +if errorlevel==1 goto CheckPerl +goto End + +:CheckPerl +perl -v >NUL +if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed? +goto End + +:End diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/group/SlideshowPlugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/group/SlideshowPlugin.mmp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,97 @@ +/* +* 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: Makefile for Screensaver Slideshow plugin +* +*/ + + + + + +#include +#include +#include + +TARGET slideshowplugin.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x102823EC + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +START RESOURCE ../data/102823EC.rss +TARGET slideshowplugin.rsc +END + +START RESOURCE ../data/SlideshowPlugin.rss +HEADER +TARGETPATH RESOURCE_FILES_DIR +LANGUAGE_IDS +END // RESOURCE + + +/* exportunfrozen */ + +SOURCEPATH ../src +SOURCE SlideshowPlugin.cpp +SOURCE SlideshowModel.cpp +SOURCE SlideshowSlide.cpp +SOURCE SlideshowSlideLoader.cpp +SOURCE SlideshowPluginUtils.cpp +SOURCE SlideshowPluginProxy.cpp + +USERINCLUDE ../inc + +// This is a SYSTEMINCLUDE macro containing the middleware +// layer specific include directories +APP_LAYER_SYSTEMINCLUDE + + +LIBRARY ecom.lib +LIBRARY euser.lib +LIBRARY fbscli.lib +LIBRARY bitgdi.lib +LIBRARY cone.lib +LIBRARY efsrv.lib +LIBRARY bafl.lib +LIBRARY ws32.lib +LIBRARY imageconversion.lib +LIBRARY centralrepository.lib +LIBRARY cenrepnotifhandler.lib +LIBRARY DrmHelper.lib +LIBRARY platformenv.lib +LIBRARY aknskinsrv.lib +LIBRARY ContentListingFramework.lib +LIBRARY avkon.lib +LIBRARY eikdlg.lib +LIBRARY eikcore.lib +LIBRARY eikcoctl.lib +LIBRARY mdeclient.lib + +// LIBRARY AknLayout2.lib // Scalable UI +// LIBRARY AknLayout2Scalable.lib // Scalable UI +// LIBRARY CdlEngine.lib // Scalable UI +// LIBRARY apgrfx.lib +// LIBRARY apmime.lib +// LIBRARY MGFetch.lib +// LIBRARY CommonEngine.lib +// LIBRARY flogger.lib +// LIBRARY caf.lib +// LIBRARY cafutils.lib +#ifdef __SERIES60_HELP +// LIBRARY hlplch.lib // for "Help" options menu +#endif // __SERIES60_HELP + + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/group/bld.inf Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,35 @@ +/* +* 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: Build information file for slideshowplugin +* +*/ + + + + +PRJ_PLATFORMS +// Defaults + +PRJ_MMPFILES +#ifdef __SLIDESHOW_SCREENSAVER +SlideshowPlugin.mmp +#endif + +PRJ_EXPORTS +../loc/slideshowplugin.loc MW_LAYER_LOC_EXPORT_PATH(slideshowplugin.loc) + +../rom/SlideshowPlugin.iby CORE_MW_LAYER_IBY_EXPORT_PATH(SlideshowPlugin.iby) +../rom/SlideshowPluginResources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(SlideshowPluginResources.iby) + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowModel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowModel.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,258 @@ +/* +* 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: Takes care of storing and serving the slides +* to Slideshow plugin +* +*/ + + + +#ifndef C_SLIDESHOWMODEL_H +#define C_SLIDESHOWMODEL_H + +#include + +class CSlideshowSlide; + +// Slide Array's size. 5 seems like a reasonable granularity +const TInt KSlideshowSlideArrayGranularity = 5; + +//Slide status +//this is only called in startplugin, Dont call it anywhere +//Get next slide status +const TInt KStatusNoSlide = 0; //no side +const TInt KStatusSlideDecoded = 1; //already decoded +const TInt KStatusDecodingInProgress =2; //decoding in progress +const TInt KStatusSlideNotDecoding = 3; //slide is there but not decoded +const TInt KStatusSlideDecodeingFailed = 4; //could not decode the file + +// Slideshow model. +// Contains slideshow slides, serves the slides to Slideshow plugin +class CSlideshowModel : public CBase + { + +public: + /** + * Return a new CSlideshowModel object + */ + static CSlideshowModel* NewL(); + + /** + * Desconstructor + */ + virtual ~CSlideshowModel(); + +private: + /** + * Default constructor + */ + CSlideshowModel(); + + /* + * Two-phase constructor, initialises member arrays and stuff + */ + virtual void ConstructL(); + +public: // Access functions + /* + * Number of slides query. + */ + TInt NumberOfSlides() const; + + /* + * Add a slide to the end of the array. + * + * @param aSlide The new slide which will be added to the silde array. + */ + void AppendSlideL(CSlideshowSlide* aSlide); + + /* + * Insert a slide at . Space must be reserved. + * + * @param aIndex The postion index which the new slide will be insert to. + * @param aSilde The new slide which will be insert. + */ + void InsertSlideL(TInt aIndex, CSlideshowSlide* aSlide); + + /* + * Delete slide at . + * + * @param aIndex The slide at will be delete. + */ + void DeleteSlide(TInt aIndex); + + /* + * Delete all slides. + */ + void DeleteAll(); + + /* + * Get slide at position . + * + * @return a slide at position . + */ + CSlideshowSlide* SlideAt(TInt aIndex) const; + + /* + * Get current slide index. + * + * @return the current slide index. + */ + inline TInt CurrentSlideIndex() const; + + /* + * Set current slide index. + * + * @param aIndex The slide index, which will be show. + */ + inline void SetCurrentSlideIndex(TInt aIndex); + + /* + * Get next slide in sequence + * + * @param aRandom No used now. + * @return the next slide. + */ + CSlideshowSlide* NextSlide(TBool aRandom); + + /* + * Get slide status: decoded, decoding ,not started,decoding failed,no slide. + * + * @param aSlide the slide which status will be detected. + * @return status of aSlide. + */ + TInt SlideStatus(CSlideshowSlide* aSlide); + + /* + * Prepare next slide. + * @param aRandom Whether select next slide random.( ETrue is random, EFalse is sequential) + * @param aTargetSize The slide Size. + */ + void PrepareNextSlide(TBool aRandom, const TSize& aTargetSize); + + /* + * Release next slide. + */ + void ReleaseNextSlide(); + + /* + * Release Current slide. + */ + void ReleaseCurrentSlide(); + + /* + * Get next slide index. + * + * @return the position index which slide will be on. + */ + inline TInt NextSlideIndex() const; + + /* + * Reserve space for slides. + * + * @param aCount The slide number. + */ + void SetReserveL(TInt aCount); + + /* + * Query if model is busy (decoding a slide). + * + * @return status whether the model is ready.(ETrue is ready, EFalse is not) + */ + TBool Busy(); + + /* + * Reset slide sequence, note that this will not release current image + */ + inline void ResetSlideSequence(); + +private: // Utility functions + /* + * Get a random number in the range aMin - aMax (inclusive) + * + * @param aMax The upper limited. + * @param aMin The lower limited. + * @return an random number which is between aMax and aMin. + */ + TInt Random(TInt aMax, TInt aMin = 0); + +private: + /* + * Slide array + */ + CArrayPtrFlat* iSlides; + + /* + * Current slide index + */ + TInt iCurrentSlide; + + /* + * Next slide index + */ + TInt iNextSlide; + + /* + * Random seed + */ + TInt64 iRandSeed; + + /* + * Busy flag + */ + TBool iBusy; + }; + +//------------------------------------------------------------------------------ +// CSlideshowModel::CurrentSlideIndex +//------------------------------------------------------------------------------ +// +TInt CSlideshowModel::CurrentSlideIndex() const + { + return iCurrentSlide; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::SetCurrentSlideIndex +//------------------------------------------------------------------------------ +// +void CSlideshowModel::SetCurrentSlideIndex(TInt aIndex) + { + iCurrentSlide = aIndex; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::NextSlideIndex +//------------------------------------------------------------------------------ +// +TInt CSlideshowModel::NextSlideIndex() const + { + return iNextSlide; + } + +//------------------------------------------------------------------------------ +// CSlideshowModel::ResetSlideSequence +//------------------------------------------------------------------------------ +// +void CSlideshowModel::ResetSlideSequence() + { + iCurrentSlide = 0; + iNextSlide = -1; + } + +#endif // C_CSLIDESHOWMODEL_H + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowPlugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowPlugin.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,361 @@ +/* +* 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: Implements the Slideshow plugin beef, especially +* MScreensaverPlugin interface +* +*/ + + + +#ifndef C_SLIDESHOWPLUGIN_H +#define C_SLIDESHOWPLUGIN_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "SlideshowModel.h" +#include "SlideshowSlide.h" +#include "SlideshowPluginUtils.h" + +class CEikonEnv; +class CDRMHelper; +class CRepositoryWatcher; +class CRepository; + +/** +* Encapsulates the Settings that are written into the central repository +* @lib ScreenSaverAnimPlugin.lib +* @since 3.1 +*/ +class CSlideshowSettings : public CBase + { +public: + CSlideshowSettings(); + +public: + // Slideshow time + TInt iSlideshowTime; + + // Lights time + TInt iLightsTime; + + // Time a slide is displayed + TInt iSlideTime; + + // Slideshow type + TInt iSlideshowType; + }; + + +/** +* Provides the Animated ScreenSaverPlugin functionality which implements +* ScreenSaver Interface and gives a Netscape Browser Plugin Interface +* to the format specific plugins like SVG, Flash, M3G etc. +* @lib ScreenSaverAnimPlugin.lib +* @since 3.1 +*/ +class CSlideshowPlugin: public CScreensaverPluginInterfaceDefinition, + public MMdESessionObserver, + public MMdEQueryObserver + { + enum TPluginState + { + EPluginStateLoading = 0, + EPluginStateInitializing, + EPluginStateRunning, + EPluginStateStopping + }; + +public: + + /** + * Creator + * @since 3.1 + */ + static CSlideshowPlugin* NewL(); + + /** + * Destructor + */ + virtual ~CSlideshowPlugin(); + +private: + /** + * 2nd phase constructor + * @since 3.1 + */ + void ConstructL(); + + /** + * Default Constructor + * @since 3.1 + */ + CSlideshowPlugin(); + +public: // Functions From CScreensaverPluginInterfaceDefinition + + /** + * From MScreensaverPlugin, Method called by Screensaver + * when plugin is being loaded into use + * @param aHost Plugin host (Screensaver). + * @since 3.1 + */ + virtual TInt InitializeL(MScreensaverPluginHost *aHost); + + /** + * From MScreensaverPlugin, Method called by Screensaver + * when plugin is allowed to draw + * @since 3.1 + */ + virtual TInt Draw( CWindowGc& aGc ); + + /** + * From MScreensaverPlugin, Method called by Themes application + * to get localised name + * @since 3.1 + */ + virtual const TDesC16& Name() const; + + /** + * From MScreensaverPlugin, Method called by Screensaver + * to get the capabilities of screensaver plugin + * @since 3.1 + */ + virtual TInt Capabilities(); + + /** + * From MScreensaverPlugin, Method called by Themes application + * to configure the plugin or to pass e.g. selection notifications + * to plugin + * @since 3.1 + */ + virtual TInt PluginFunction( + TScPluginCaps /* aFunction */, + TAny* /* aParam */ ); + + /** + * From MScreensaverPlugin, Method called by Screensaver + * when there are screensaver events, such as starting and stopping + * @since 3.1 + */ + virtual TInt HandleScreensaverEventL( + TScreensaverEvent aEvent, + TAny* aData ); + +public: // from MMdESessionObserver + /** + * Called to notify the observer that opening the session has been + * completed and, if the opening succeeded, the session is ready for use. + * + * @param aSession session + * @param aError KErrNone, if opening the session succeeded; + * or one of the system-wide error codes, if opening the + * session failed + */ + void HandleSessionOpened(CMdESession& aSession, TInt aError); + + /** + * Called to notify the observer about errors, which are not a direct + * consequence of the operations initiated by the client but caused by + * some external source (e.g., other clients). The error cannot be + * recovered and all on-going operations initiated by the client have been + * aborted. Any attempts to continue using the session will cause a panic. + * The client should close the session immediately and try to open a new + * session, if it needs to continue using the metadata engine. + * + * @param aSession session + * @param aError one of the system-wide error codes + */ + void HandleSessionError(CMdESession& aSession, TInt aError); + +public: // from MMdEQueryObserver + /** + * Called to notify the observer that new results have been received + * in the query. + * + * @param aQuery Query instance that received new results. + * @param aFirstNewItemIndex Index of the first new item that was added + * to the result item array. + * @param aNewItemCount Number of items added to the result item + * array. + */ + void HandleQueryNewResults(CMdEQuery& aQuery, + TInt aFirstNewItemIndex, + TInt aNewItemCount); + + /** + * Called to notify the observer that the query has been completed, + * or that an error has occured. + * + * @param aQuery Query instance. + * @param aError KErrNone, if the query was completed + * successfully. Otherwise one of the system-wide error + * codes. + */ + void HandleQueryCompleted(CMdEQuery& aQuery, TInt aError); + +public: // New Functions + + /** + * Reads the settings from the central repository + * @since 3.1 + * @return System wide Error value + */ + TInt ReadSettings(); + +#if 0 + /** + * This method checks whether the set file exists currently + * if not, it updates the filename string + * This also checks if the rights are valid if the content is drm + * if not, it updates the filename with the empty file name + * returns True, if the Filename is updated + * False, otherwise + * @since 3.2 + */ + TBool UpdateFileName(); +#endif + + /** + * Called when there is a central repository settings change + * @since 3.2 + */ + void HandleCRSettingsChange(TAny* aPtr); + + /** + * Called by the repository watcher when there is a central + * repository settings change + * @since 3.2 + */ + static TInt HandleRepositoryCallBack(TAny* aPtr); + + /** + * Called by the P & S subscriber when the subscribed key value changes + * @since 3.2 + */ + static TInt HandleSettingsChanged(TAny* aPtr); + +private: // New functions + + /** + * Connects the central repository session + * @since 3.1 + */ + void InitializeCenRepL(); + + /** + * Registers for central repository key changes + * @since 3.1 + */ + void NotifyCenrepChangeL(); + + /** + * Cancels registration for central repository key changes + * @since 3.1 + */ + void NotifyCenrepChangeCancel(); + + /** + * Disconnects the central repository session + * @since 3.1 + */ + void UnInitializeCenRep(); + + void StartPlugin(); + void StopPlugin(); + void DrawCentered(CWindowGc& aGc, CSlideshowSlide* aSlide); + void LoadSlidesL(); + void LoadSlideSetL(); + void LoadRandomSlidesL(); + void SetDisplayMode(); + void Lights(TInt aSecs); + void ConfigureL(TAny* aParam); + void UpdateDisplayInfo(); + void FlushDrawBuffer(); + + TInt SettingsChanged(); + + void ConnectToMDSSessionL(); + void WaitForMDS(); + void EndWaitForMDS(); + void LoadImagesToModel(const CMdEQuery& aQuery, + TInt aFirstNewItemIndex = 0, + TInt aNewItemCount = 0); + void AppendSlideToModelL(TDesC& aFileName, TBool aIsOnMC); + void OpenQueryL(); + +private: + // Pointer to the screensaver host + MScreensaverPluginHost* iHost; + + // Display info + TScreensaverDisplayInfo iDi; + + // Resource file offset + TInt iResourceOffset; + + // Handle to the central repository session + CRepository* iSlideshowRepository; + + // Environment pointer + CEikonEnv* iEikEnv; + + // Pointer to settings + CSlideshowSettings* iSettings; + + // Slideshow model + CSlideshowModel* iModel; + + // Pointer to Drm Helper + CDRMHelper* iDrmHelper; + + // Cenrep watcher for settings change + CRepositoryWatcher* iSlideshowCRWatcher; + + RProperty iSettingsChangedProperty; + CPSSubscriber* iSettingsChangedSubscriber; + + // Localised name + HBufC* iScreensaverName; + + // Waiter + CActiveSchedulerWait iWaiter; + TBool iWaitActive; + + // Draw count + TInt iDrawCount; + TBool iTimerUpdated; + + //loading state + TBool iIsLoadFinished; + + // MDS session + CMdESession* iMdESession; + }; + + +#endif // C_SLIDESHOWPLUGIN_H +// End Of file diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowPluginImpUID.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowPluginImpUID.hrh Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,28 @@ +/* +* 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: Defines the ECOM Implementation UIDs. +* +*/ + + + + + +#ifndef SLIDESHOWPLUGINIMPUID_HRH +#define SLIDESHOWPLUGINIMPUID_HRH + +#define KSlideshowPluginImpUID 0x102823ED + +#endif // SLIDESHOWPLUGINIMPUID_HRH +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowPluginUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowPluginUtils.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,283 @@ +/* +* 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: SlideshowPlugin utilities collection +* +*/ + + + +#ifndef C_SLIDESHOWPLUGINUTILS_H +#define C_SLIDESHOWPLUGINUTILS_H + +// INCLUDES +#include +#include +#include + +#include "SlideshowSlide.h" + +// FORWARD DECLARATIONS +class CDRMHelper; +class CCoeEnv; +class CRepository; + +// CLASS DECLARATION + +/** +* Central Repository Change watcher +* @since 3.2 +* @internal +*/ +class CRepositoryWatcher : public CBase, public MCenRepNotifyHandlerCallback + { +public: + static CRepositoryWatcher* NewL( + const TUid aUid, + const TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aKeyType, + TCallBack aCallBack, + CRepository* aRepository); + + static CRepositoryWatcher* NewL( + const TUid aUid, + TCallBack aCallBack, + CRepository* aRepository); + + ~CRepositoryWatcher(); + + 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: + CRepositoryWatcher( + const TUid aUid, + const TUint32 aKey, + TCallBack aCallBack, + CRepository* aRepository); + + void ConstructL(CCenRepNotifyHandler::TCenRepKeyType aKeyType); + + void ConstructL(); + +private: + TUid iUid; + TUint32 iKey; + TUint32 iChangedKey; + TCallBack iCallBack; + CRepository* iRepository; + CCenRepNotifyHandler* iNotifyHandler; +}; + + +/** +* Publish & Subscribe change subscriber +* @since 3.2 +* @internal +*/ +class CPSSubscriber : public CActive + { +public: + CPSSubscriber(TCallBack aCallBack, RProperty& aProperty); + ~CPSSubscriber(); + +public: // New functions + void SubscribeL(); + void StopSubscribe(); + +private: // from CActive + void RunL(); + void DoCancel(); + +private: + TCallBack iCallBack; + RProperty& iProperty; +}; + + +// ========== UTILITIES CLASS ============================= + +class SlideshowUtil + { +public: + // Checks if memory card is present + static TBool IsMCPresent(); + + // Checks if the given file is on memory card + static TBool IsOnMC(TFileName aFile); + + // Checks that the file has enough DRM rights to be displayed + static TBool DRMCheck(CDRMHelper *aDRMHelper, TDesC& aFileName); + + // Checks that the slide has enough DRM rights to be displayed + static TBool DRMCheck(CDRMHelper *aDRMHelper, CSlideshowSlide* aSlide); + + // Consumes the slide's DRM rights + static void DRMConsume(CDRMHelper* aDRMHelper, CSlideshowSlide* aSlide); + +private: + /** + * Static class can not be instantiated. + */ + SlideshowUtil(); + //lint -esym(1526, SlideshowUtil::SlideshowUtil) Intentionally undefined + + /** + * Static class can not be instantiated. + */ + ~SlideshowUtil(); + }; + + +// ========== LOGGING MACROS =============================== + +#ifdef USE_LOGGER + +#include +#include +#include +#include + + +/* logging macros usage: + +// set logging on in mmp file... +MACRO USE_LOGGER +#ifdef WINS +MACRO USE_RDEBUG +#endif + + +void CTestAppUi::ConstructL() +{ +// creates log directory and log file on app startup. +// prints starting banner... +SCRLOGGER_CREATE; + +// entering to function... +SCRLOGGER_ENTERFN("ConstructL()"); + +TInt number = 42; +TFileName file; +file = "something" .... + +// print variable number of parameters... +// Note: use _L macro for format string! +SCRLOGGER_WRITEF(_L("SCR: number = %d, file = %S"), number, &file); + +// print just a string (no _L macro here!) +SCRLOGGER_WRITE("Hello world!"); + +// leave from function... +SCRLOGGER_LEAVEFN("ConstructL()"); +} + +CTestAppUi::~CTestAppUi() +{ +// print app exit banner when application exits. +SCRLOGGER_DELETE; +} + +*/ + +#ifdef USE_RDEBUG + +_LIT(KSSPLogBanner, "SlideshowPlugin log start"); +_LIT(KSSPLogEnterFn, "SSP: enter --> %S"); +_LIT(KSSPLogLeaveFn, "SSP: leave <-- %S"); +_LIT(KSSPLogWrite, "SSP: %S"); +_LIT(KSSPLogTag, "SSP: "); +_LIT(KSSPLogExit, "SlideshowPlugin log end"); +_LIT(KSSPLogTimeFormatString, "%H:%T:%S:%*C2"); + +#define SSPLOGGER_CREATE {RDebug::Print(KSSPLogBanner);} +#define SSPLOGGER_DELETE {RDebug::Print(KSSPLogExit);} +#define SSPLOGGER_ENTERFN(a) {_LIT(temp, a); RDebug::Print(KSSPLogEnterFn, &temp);} +#define SSPLOGGER_LEAVEFN(a) {_LIT(temp, a); RDebug::Print(KSSPLogLeaveFn, &temp);} +#define SSPLOGGER_WRITE(a) {_LIT(temp, a); RDebug::Print(KSSPLogWrite, &temp);} +#define SSPLOGGER_WRITE_TIMESTAMP(a) {_LIT(temp, a); TTime time; time.HomeTime(); TBuf<256> buffer; time.FormatL(buffer, KSSPLogTimeFormatString); buffer.Insert(0, temp); buffer.Insert(0, KSSPLogTag); RDebug::Print(buffer); } +#define SSPLOGGER_WRITEF RDebug::Print + +#else + +_LIT(KSSPLogDir, "SSP"); +_LIT(KSSPLogFile, "SSP.txt"); +_LIT8(KSSPLogBanner, "SlideshowPlugin log start"); +_LIT8(KSSPLogEnterFn, "SSP: -> %S"); +_LIT8(KSSPLogLeaveFn, "SSP: <- %S"); +_LIT8(KSSPLogExit, "SlideshowPlugin log end"); +_LIT(KSSPLogTimeFormatString, "%H:%T:%S:%*C2"); + +#define SSPLOGGER_CREATE {FCreate();} +#define SSPLOGGER_DELETE {RFileLogger::Write(KSSPLogDir, KSSPLogFile, EFileLoggingModeAppend, KSSPLogExit);} +#define SSPLOGGER_ENTERFN(a) {_LIT8(temp, a); RFileLogger::WriteFormat(KSSPLogDir, KSSPLogFile, EFileLoggingModeAppend, KSSPLogEnterFn, &temp);} +#define SSPLOGGER_LEAVEFN(a) {_LIT8(temp, a); RFileLogger::WriteFormat(KSSPLogDir, KSSPLogFile, EFileLoggingModeAppend, KSSPLogLeaveFn, &temp);} +#define SSPLOGGER_WRITE(a) {_LIT(temp, a); RFileLogger::Write(KSSPLogDir, KSSPLogFile, EFileLoggingModeAppend, temp);} +#define SSPLOGGER_WRITE_TIMESTAMP(a) {_LIT(temp, a); TTime time; time.HomeTime(); TBuf<256> buffer; time.FormatL(buffer, KSSPLogTimeFormatString); buffer.Insert(0, temp); RFileLogger::Write(KSSPLogDir, KSSPLogFile, EFileLoggingModeAppend, buffer); } +#define SSPLOGGER_WRITEF FPrint + +inline void FPrint(const TRefByValue aFmt, ...) + { + VA_LIST list; + VA_START(list, aFmt); + RFileLogger::WriteFormat(KSSPLogDir, KSSPLogFile, EFileLoggingModeAppend, aFmt, list); + } + +inline void FPrint(const TDesC& aDes) + { + RFileLogger::WriteFormat(KSSPLogDir, KSSPLogFile, EFileLoggingModeAppend, aDes); + } + +inline void FHex(const TUint8* aPtr, TInt aLen) + { + RFileLogger::HexDump(KSSPLogDir, KSSPLogFile, EFileLoggingModeAppend, 0, 0, aPtr, aLen); + } + +inline void FHex(const TDesC8& aDes) + { + FHex(aDes.Ptr(), aDes.Length()); + } + +inline void FCreate() + { + TFileName path(_L("c:\\logs\\")); + path.Append(KSSPLogDir); + path.Append(_L("\\")); + RFs& fs = CEikonEnv::Static()->FsSession(); + fs.MkDirAll(path); + RFileLogger::WriteFormat(KSSPLogDir, KSSPLogFile, EFileLoggingModeOverwrite, KSSPLogBanner); + } + +#endif // USE_RDEBUG + +#else // USE_LOGGER + +inline void FPrint(const TRefByValue /*aFmt*/, ...) { }; + +#define SSPLOGGER_CREATE +#define SSPLOGGER_DELETE +#define SSPLOGGER_ENTERFN(a) +#define SSPLOGGER_LEAVEFN(a) +#define SSPLOGGER_WRITE(a) +#define SSPLOGGER_WRITEF 1 ? ((void)0) : FPrint +#define SSPLOGGER_WRITE_TIMESTAMP(a) + +#endif // USE_LOGGER + +#endif // C_SLIDESHOWPLUGINUTILS_H diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowSlide.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowSlide.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,112 @@ +/* +* 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: Stores a single slide +* +*/ + + + +#ifndef C_SLIDESHOWSLIDE_H +#define C_SLIDESHOWSLIDE_H + +// INCLUDES +#include // e32def, e32std +#include +#include + +#include "SlideshowSlideLoader.h" + +// CONSTANTS + +// Leave code when a slide is on memory card and the card is not present +const TInt KSSTryLater = (-100); + +// MACROS + +// Item flags +#define SSS_NONE 0x00 +#define SSS_IMAGELOADED 0x01 +#define SSS_ISONMC 0x02 +#define SSS_DECODEFAILED 0x04 + + +// DATA TYPES + +// EXTERNAL DATA STRUCTURES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// CLASS DEFINITIONS +class CSlideshowSlide : public CBase + { +public: + // Creator + static CSlideshowSlide* NewL(TDesC& aFileName, TBool aIsOnMC = EFalse); + + // Destructor + virtual ~CSlideshowSlide(); + + // Is decoding is in progress + TBool IsDecodingInProgress(); + + // Could not decode the file + TBool CouldNotDecodeFile(); + + // + friend class CSlideshowSlideLoader; +private: + + // Default constructor + CSlideshowSlide(TBool aIsOnMC); + + // 2-phase + void ConstructL(TDesC& aFileName); + +public: + + // Prepares slide (loads image) + void PrepareSlideL(const TSize& aTargetSize); + + // Get image + CFbsBitmap* Image() const { return iImage; } + + // Get filename + HBufC* FileName() const { return iFileName; } + + // Release image + void ReleaseImage(); + + // Get flags + TInt Flags() const { return iFlags; } + + // Is slide decoded completely + TBool IsSlideDecoded(); + +protected: + //Empty +private: + // Type flags + TInt iFlags; + + // Image + CFbsBitmap* iImage; + + // Filename + HBufC* iFileName; + CSlideshowSlideLoader *iSlideLoader; + }; + +#endif // C_SLIDESHOWSLIDE_H diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowSlideLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/inc/SlideshowSlideLoader.h Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,78 @@ +/* +* 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: Loads a slide from file +* +*/ + + + +#ifndef C_SLIDESHOWSLIDELOADER_H +#define C_SLIDESHOWSLIDELOADER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class CSlideshowSlide; +class CSlideshowSlideLoader : public CActive + { +public: + // Creator + static CSlideshowSlideLoader* NewL(CSlideshowSlide *aSlide); + + // Called when image decoding done + void RunL(); + + // Called if user calls Cancel() on active object + void DoCancel(); + + //virtual distructor + virtual ~CSlideshowSlideLoader(); + + //start decoding the slide + void LoadSlideL(const TDesC& aFilename, const TSize& aTargetSize); + +private: + + // Default constructor + CSlideshowSlideLoader(CSlideshowSlide *aSlide); + + //Two Phase constructor + void ConstructL(); + + //Delete the Decoder object + void DeleteDecoder(); + + //From CActive + TInt RunError(TInt aError); + +private: + + // Target size (Phone screen size) + TSize iTargetSize; + //Bitmap size + TSize iBitmapsize; + //Decoder + CImageDecoder * iDecoder; + //Slide + CSlideshowSlide * iSlide; + + }; + +#endif // C_SLIDESHOWSLIDELOADER_H diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/loc/slideshowplugin.loc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/loc/slideshowplugin.loc Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,71 @@ +/* +* 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: Localization strings for Slideshow screensaver +* +*/ + + + + + +//d: Screensaver name +//d: Displayed in Themes application screensaver list +//l: list_set_graphic_pane_t1 +//w: +//r:3.2 +#define qtn_slideshow_screensaver_name "Slideshow" + +//d: Title Pane String +//d: Displayed in the title Pane when settings dialog is displayed. +//l: title_pane_1 +//w: +//r:3.2 +#define qtn_sanim_title_settings "Settings" + +// Taken from errorres.loc +// d: Generic error note to be displayed when user tries to +// d: use some feature which is not supported +// l: popup_note_window_1_four_rows +// w: Errorres +// r: 3.2 +#define qtn_err_not_supp "Feature is not supported" + +// d: error note to be displayed when user tries to +// d: select some file which is corrupted +// l: popup_note_window/opt2 +// w: +// r:3.2 +#define qtn_sanim_error_wrong_format "File is corrupted or wrong format" + +// d: error note to be displayed when user hasnt +// d: selected a file +// l: popup_note_window/opt2 +// w: +// r:3.2 +#define qtn_sanim_file_not_selected "File not Selected" + +// d: error note to be displayed when animation couldnot +// d: be played as a screensaver +// l: popup_note_window_1_four_rows +// w: +// r:3.2 +#define qtn_err_failure "Unable to perform operation" + +// d: error note to be displayed when animation couldnot +// d: be set as a screensaver +// l: popup_note_window_1_four_rows +// w: +// r:3.2 +#define qtn_drm_prev_rights_set "Unable to select.Object can only be viewed" + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/rom/SlideshowPlugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/rom/SlideshowPlugin.iby Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,29 @@ +/* +* 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: IBY file for Slideshowplugin.dll +* +*/ + + + + +#ifndef SLIDESHOWPLUGIN_IBY +#define SLIDESHOWPLUGIN_IBY + +#ifdef __SLIDESHOW_SCREENSAVER +ECOM_PLUGIN(SlideshowPlugin.dll, 102823EC.rsc) +#endif + +#endif // SLIDESHOWPLUGIN_IBY +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/rom/SlideshowPluginResources.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/rom/SlideshowPluginResources.iby Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,29 @@ +/* +* 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: IBY file for SlideshowPlugin resources +* +*/ + + + + +#ifndef SLIDESHOWPLUGINRESOURCES_IBY +#define SLIDESHOWPLUGINRESOURCES_IBY + +#ifdef __SLIDESHOW_SCREENSAVER +data=DATAZ_\RESOURCE_FILES_DIR\SlideshowPlugin.rsc RESOURCE_FILES_DIR\SlideshowPlugin.rsc +#endif + +#endif // SLIDESHOWPLUGINRESOURCES_IBY +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowModel.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,441 @@ +/* +* 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: Takes care of storing and serving the slides +* to Slideshow plugin +* +*/ + + +#include +#include +#include + +#include "SlideshowModel.h" +#include "SlideshowPluginUtils.h" + +//------------------------------------------------------------------------------ +// CSlideshowModel::NewL +//------------------------------------------------------------------------------ +// +CSlideshowModel* CSlideshowModel::NewL() + { + CSlideshowModel* self = new (ELeave) CSlideshowModel(); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::~CSlideshowModel +//------------------------------------------------------------------------------ +// +CSlideshowModel::~CSlideshowModel() + { + // Delete slide array + if (iSlides) + { + iSlides->ResetAndDestroy(); + } + delete iSlides; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::CSlideshowModel +//------------------------------------------------------------------------------ +// +CSlideshowModel::CSlideshowModel() + : iNextSlide(-1) + { + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::ConstructL +//------------------------------------------------------------------------------ +// +void CSlideshowModel::ConstructL() + { + // Create slide array + iSlides = new(ELeave) CArrayPtrFlat( + KSlideshowSlideArrayGranularity); + + //Get random seed + TTime time; + time.HomeTime(); + iRandSeed = time.Int64(); + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::NumberOfSlides +//------------------------------------------------------------------------------ +// +TInt CSlideshowModel::NumberOfSlides() const + { + //if the slide array is not NULL, return it's size + return iSlides ? iSlides->Count() : 0; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::AppendSlideL +//------------------------------------------------------------------------------ +// +void CSlideshowModel::AppendSlideL(CSlideshowSlide* aSlide) + { + // Sanity check + if (!iSlides) + { + ASSERT(EFalse); + return; + } + + // Stash it in + iSlides->AppendL(aSlide); + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::InsertSlideL +//------------------------------------------------------------------------------ +// +void CSlideshowModel::InsertSlideL(TInt aIndex, CSlideshowSlide* aSlide) + { + if ((iSlides) && (aIndex >= 0) && (aIndex <= NumberOfSlides())) + { + // Squeeze it in + iSlides->InsertL(aIndex, aSlide); + } + else + { + ASSERT(EFalse); + } + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::DeleteSlide +//------------------------------------------------------------------------------ +// +void CSlideshowModel::DeleteSlide(TInt aIndex) + { + //Sanity check + if ((iSlides) && (aIndex >= 0) && (aIndex <= NumberOfSlides())) + { + // Grab hold of the slide for deletion, remove from array + // and compress the array + CSlideshowSlide* ptr = iSlides->At(aIndex); + + iSlides->Delete(aIndex); + delete ptr; + iSlides->Compress(); + + } + else + { + ASSERT(EFalse); + } + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::DeleteAll +//------------------------------------------------------------------------------ +// +void CSlideshowModel::DeleteAll() + { + //Sanity check + if (iSlides) + { + iSlides->ResetAndDestroy(); + } + + iCurrentSlide = 0; + iNextSlide = -1; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::SlideAt +//------------------------------------------------------------------------------ +// +CSlideshowSlide* CSlideshowModel::SlideAt(TInt aIndex) const + { + if ((iSlides) && (aIndex >= 0) && (aIndex < NumberOfSlides())) + { + //return the postion object + return iSlides->At(aIndex); + } + else + { + return NULL; + } + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::NextSlide +//------------------------------------------------------------------------------ +// +CSlideshowSlide* CSlideshowModel::NextSlide(TBool /*aRandom */) + { + if (iNextSlide < 0) + { + // Next slide could not be prepared, or preparenextslide not called + return NULL; + } + + CSlideshowSlide* pSlide = SlideAt(iNextSlide); + + if (!pSlide) + { + // Apparently there are no more slides - wrap around + iCurrentSlide = -1; + iNextSlide = 0; + pSlide = SlideAt(iNextSlide); + } + + iCurrentSlide = iNextSlide; + return pSlide; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::PrepareNextSlide +//------------------------------------------------------------------------------ +// +void CSlideshowModel::PrepareNextSlide(TBool aRandom, const TSize& aTargetSize) + { + SSPLOGGER_WRITE("Model::PrepareNextSlide(), model busy"); + + SSPLOGGER_WRITEF(_L("SPP: iCurrentSlide %d, iNextSlide %d"), + iCurrentSlide, iNextSlide); + + TBool slideOK = EFalse; + while (!slideOK) + { + TInt nSlides = NumberOfSlides(); + // Any point in continuing? + if (nSlides == 0) + { + iNextSlide = -1; + break; + } + + // Special cases, 1 or 2 slides only + if (nSlides == 1) + { + iNextSlide = 0; + SSPLOGGER_WRITEF(_L("SPP: One slide, next slide %d"), iNextSlide); + } + else if (nSlides == 2) + { + // Switch between slides even if random + iNextSlide = (iNextSlide == 0 ? 1 : 0); + SSPLOGGER_WRITEF(_L("SPP: 2 slides, next slide %d"), iNextSlide); + } + else + { + // We got at least 3 slides, and can also do random + if (aRandom) + { + // Make sure we won't pick the same slide + do + { + iNextSlide = Random(nSlides - 1); + } + while (iNextSlide == iCurrentSlide); + + SSPLOGGER_WRITEF(_L("SPP: Random, next slide %d"), iNextSlide); + } + else + { + iNextSlide++; + + // Wrap? + if (iNextSlide >= nSlides) + { + SSPLOGGER_WRITE("Wrapping..."); + iNextSlide = 0; + } + SSPLOGGER_WRITEF(_L("SPP: Continuous, next slide %d"), + iNextSlide); + } + } + + // Get the slide + CSlideshowSlide* pSlide = SlideAt(iNextSlide); + + if (!pSlide) + { + // Should not have happened - start from beginning + iNextSlide = 0; + SSPLOGGER_WRITEF(_L("SPP: Wrapping, next slide %d"), + iNextSlide); + pSlide = SlideAt(iNextSlide); + } + + if (pSlide) + { + // Try loading the image, if image does not already exist + if (!pSlide->IsSlideDecoded()) + { + SSPLOGGER_WRITE("Preparing next slide"); + if(iCurrentSlide != iNextSlide) + { + // relese currently deleted image from RAM.( We dont have caching) + ReleaseCurrentSlide(); + } + if ((TInt)ETrue == pSlide->CouldNotDecodeFile()) + { + // could not decode this file last time. so delete this slide from the + // list of slide and go to the next one. + DeleteSlide(iNextSlide); + iNextSlide--; + continue; + } + TRAPD(err, pSlide->PrepareSlideL(aTargetSize)); + if (err == KErrNone) + { + //wait for slide to load. + iCurrentSlide = iNextSlide; + SSPLOGGER_WRITE("Started Decoding Wait"); + break; + } + else + { + // Apparently the file was not a loadable image - + // remove from slideset and try again + SSPLOGGER_WRITEF(_L("SSP: Deleting slide %d"), iNextSlide); + DeleteSlide(iNextSlide); + iNextSlide--; + continue; // can not load this image, go to the next one. + } + } + else + { + // Slide is already decoded. This is cool, if the file is + // still there. Otherwise lose image and go on. + // should not come here as we dont any caching + SSPLOGGER_WRITEF(_L("Slide %d already has image"), iNextSlide); + + if (!BaflUtils::FileExists(CEikonEnv::Static()->FsSession(), + *(pSlide->FileName()))) + { + SSPLOGGER_WRITE("Slide image file gone, dropping image"); + pSlide->ReleaseImage(); + continue; // continue with next image + } + else + { + if(iCurrentSlide != iNextSlide) + { + ReleaseCurrentSlide(); + } + break; + } + } + } + } + SSPLOGGER_WRITE("Model::PrepareNextSlide() end, model no longer busy"); + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::ReleaseCurrentSlide +//------------------------------------------------------------------------------ +// +void CSlideshowModel::ReleaseCurrentSlide() + { + CSlideshowSlide* pSlide = SlideAt(iCurrentSlide); + if(pSlide) + { + pSlide->ReleaseImage(); + } + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::ReleaseNextSlide +//------------------------------------------------------------------------------ +// +void CSlideshowModel::ReleaseNextSlide() + { + CSlideshowSlide* pSlide = SlideAt(iNextSlide); + if(pSlide) + { + pSlide->ReleaseImage(); + } + iNextSlide --; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::SetReserveL +//------------------------------------------------------------------------------ +// +void CSlideshowModel::SetReserveL(TInt aCount) + { + if ((iSlides) && (aCount >= NumberOfSlides())) + { + iSlides->SetReserveL(aCount); + } + } + +//------------------------------------------------------------------------------ +// CSlideshowModel::SlideStatus +//------------------------------------------------------------------------------ +// +TInt CSlideshowModel::SlideStatus(CSlideshowSlide* aSlide) + { + if(!aSlide) + { + return KStatusNoSlide; + } + else if(aSlide->IsSlideDecoded()) + { + return KStatusSlideDecoded; + } + else if(aSlide->IsDecodingInProgress()) + { + return KStatusDecodingInProgress; + } + else if (aSlide->CouldNotDecodeFile()) + { + return KStatusSlideDecodeingFailed; + } + + return KStatusSlideNotDecoding; + } + + + +//------------------------------------------------------------------------------ +// CSlideshowModel::Random +//------------------------------------------------------------------------------ +// +TInt CSlideshowModel::Random(TInt aMax, TInt aMin /* = 0 */) + { + TInt range = aMax - aMin; + TInt rand = Math::Rand(iRandSeed); + return (rand % range); + } + + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPlugin.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,1124 @@ +/* +* 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 +#include +#include +#include +#include + +// #include AppendSlideL +// #include +// #include +// #include +#include +#include // For CleanupResetAndDestroyPushL +#include +#include + +// #include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "SlideshowPlugin.h" +#include "SlideshowSlide.h" +#include "SlideshowPluginUtils.h" + +// Constants +const TInt KSecsToMicros = 1000000; +const TUint KDefaultRandomLoadingNumber = 100; + +// 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 iMdESession; + + // 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(); + + 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(); + + 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 && iIsLoadFinished ) + { + iHost->RevertToDefaultSaver(); + SSPLOGGER_WRITE("Draw(): Nothing to display, suspending"); + SSPLOGGER_LEAVEFN("Draw()"); +// iHost->Suspend( -1 ); // This place will be crashed when transform to default type + return KErrNone; + } + + 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 + ReadSettings();// update the key value of KThemesScreenSaverSlideSetType + 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; + } + +// ----------------------------------------------------------------------------- +// 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()"); + iIsLoadFinished = EFalse; + // Based on settings, load predefined set or random slides + if (iSettings->iSlideshowType == KSlideshowTypeRandom) + { + LoadRandomSlidesL(); + } + else + { + LoadSlideSetL(); + } + iIsLoadFinished = ETrue; + 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()"); + // Start by getting rid of possibly loaded slides + iModel->DeleteAll(); + // connect to MDS, load data or not + ConnectToMDSSessionL(); + + 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::ConnectToMDSSessionL +// Connects to MDS Listing Framework. Can be called many times, +// connects only once +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::ConnectToMDSSessionL() + { + if (!iMdESession) + { + iMdESession = CMdESession::NewL( *this ); + // Wait for query of MDS to complete before continuing + WaitForMDS(); + } + } + +// ----------------------------------------------------------------------------- +// CSlideshowPlugin::WaitForMDS +// Begins wait for MDS session connected +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::WaitForMDS() + { + if (iWaitActive) + { + return; + } + else + { + iWaitActive = ETrue; + iWaiter.Start(); + } + } + +// ----------------------------------------------------------------------------- +// CSlideshowPlugin::WaitForMDS +// Ends wait for MDS +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::EndWaitForMDS() + { + if (!iWaitActive) + { + return; + } + else + { + iWaiter.AsyncStop(); + iWaitActive = EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CSlideshowPlugin::HandleSessionOpened +// Session is open successfully, then start a query for images +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::HandleSessionOpened(CMdESession& /*aSession*/, TInt aError) + { + if ( KErrNone != aError ) + { + // Error occurred when opening session. iMdeSession must be deleted and new + // session opened if we wish to use MdE. + delete iMdESession; + iMdESession = NULL; + return; + } + // The session was opened successfully. + TRAP(aError, OpenQueryL() ); + } + +// ----------------------------------------------------------------------------- +// CSlideshowPlugin::OpenQueryL +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::OpenQueryL() + { + CMdENamespaceDef& defaultNamespaceDef = iMdESession->GetDefaultNamespaceDefL(); + CMdEObjectDef& imageObjDef = defaultNamespaceDef.GetObjectDefL( MdeConstants::Image::KImageObject ); + + // query objects with object definition "Image" + CMdEObjectQuery* query = iMdESession->NewObjectQueryL( defaultNamespaceDef, imageObjDef, this ); + + query->FindL( KDefaultRandomLoadingNumber ); + } + +// ----------------------------------------------------------------------------- +// CSlideshowPlugin::HandleSessionError +// error happened when open the session, close session and end the waiting +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::HandleSessionError(CMdESession& /*aSession*/, TInt /*aError*/) + { + if ( iMdESession ) + { + delete iMdESession; + iMdESession = NULL; + } + // error happened when open the session, so end the waiting for MDS session. + EndWaitForMDS(); + } + +// ----------------------------------------------------------------------------- +// CSlideshowPlugin::HandleQueryCompleted +// query completed, load the images +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::HandleQueryCompleted(CMdEQuery& aQuery, TInt aError) + { + if ( aError == KErrNone ) + { + LoadImagesToModel( aQuery ); + } + EndWaitForMDS(); + } + +// ----------------------------------------------------------------------------- +// CSlideshowPlugin::HandleQueryCompleted +// part of query completed, load the completed images +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::HandleQueryNewResults( CMdEQuery& aQuery, + TInt aFirstNewItemIndex, + TInt aNewItemCount) + { + LoadImagesToModel( aQuery, aFirstNewItemIndex, aNewItemCount ); + EndWaitForMDS(); + } + +// ----------------------------------------------------------------------------- +// CSlideshowPlugin::LoadImagesToModel +// load the images when query is successfully +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::LoadImagesToModel(const CMdEQuery& aQuery, + TInt aFirstNewItemIndex, + TInt aNewItemCount) + { + CMdEObjectQuery& query= ( CMdEObjectQuery& ) aQuery; + // query is completed + if( aQuery.Count() > 0 ) + { + // some items were found! + // Loop through, add filenames + TInt startIndex = aFirstNewItemIndex; + TInt nItem = aNewItemCount; + if ( aFirstNewItemIndex == 0 && aFirstNewItemIndex == aNewItemCount ) + { + startIndex = 0; + nItem = aQuery.Count(); + } + TInt count = 0; + for ( ; startIndex < nItem; startIndex++) + { + // TFileName fileName; + TBufC<256> fileName; + + const CMdEObject& obj = query.Result(startIndex); + fileName = obj.Uri(); + + // 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 + TRAPD(err, AppendSlideToModelL( fileName, isOnMC ) ); + if ( KErrNone != err ) + { + // appending error, go on to append next slide + continue; + } + SSPLOGGER_WRITEF(_L("SSP: Slide %d added, file: %S"), count, &fileName); + count++; + } + } + } + +// ----------------------------------------------------------------------------- +// CSlideshowPlugin::AppendSlideToModelL +// Add slide to model +// ----------------------------------------------------------------------------- +void CSlideshowPlugin::AppendSlideToModelL(TDesC& aFileName, TBool aIsOnMC) + { + CSlideshowSlide* pSlide = CSlideshowSlide::NewL(aFileName, aIsOnMC); + CleanupStack::PushL(pSlide); + iModel->AppendSlideL(pSlide); + CleanupStack::Pop(pSlide); + } +// End Of file. diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPluginProxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPluginProxy.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,53 @@ +/* +* 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: ECOM implementation array. +* +*/ + + + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include "SlideshowPluginImpUID.hrh" +#include "SlideshowPlugin.h" + +// CONSTANTS +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KSlideshowPluginImpUID, + CSlideshowPlugin::NewL) + }; + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// ImplementationProxy +// ECOM implementation table entry. +// ----------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + + return ImplementationTable; + } + +// End of File + diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPluginUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowPluginUtils.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,327 @@ +/* +* 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: SlideshowPlugin utility classes and functions +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +#include "SlideshowPluginUtils.h" + +_LIT(KSSPDriveLetterMC, "E"); + +// ============================ MEMBER FUNCTIONS =============================== + +// Repository watcher + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::NewL +// --------------------------------------------------------------------------- +// +CRepositoryWatcher* CRepositoryWatcher::NewL( + const TUid aUid, + const TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aKeyType, + TCallBack aCallBack, + CRepository* aRepository) + { + CRepositoryWatcher* self = new(ELeave) + CRepositoryWatcher(aUid, aKey, aCallBack, aRepository); + + CleanupStack::PushL(self); + self->ConstructL(aKeyType); + CleanupStack::Pop(self); + + return self; + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::NewL +// --------------------------------------------------------------------------- +// +CRepositoryWatcher* CRepositoryWatcher::NewL( + const TUid aUid, + TCallBack aCallBack, + CRepository* aRepository) + { + CRepositoryWatcher* self = new(ELeave) CRepositoryWatcher( + aUid, NCentralRepositoryConstants::KInvalidNotificationId, aCallBack, aRepository); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::~CRepositoryWatcher +// --------------------------------------------------------------------------- +// +CRepositoryWatcher::~CRepositoryWatcher() + { + if ( iNotifyHandler ) + { + iNotifyHandler->StopListening(); + delete iNotifyHandler; + } + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::CRepositoryWatcher +// --------------------------------------------------------------------------- +// +CRepositoryWatcher::CRepositoryWatcher( + const TUid aUid, + const TUint32 aKey, + TCallBack aCallBack, + CRepository* aRepository) + : + iUid(aUid), iKey(aKey), iCallBack(aCallBack), iRepository(aRepository) + { + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::ConstructL +// --------------------------------------------------------------------------- +// +void CRepositoryWatcher::ConstructL(CCenRepNotifyHandler::TCenRepKeyType aKeyType) + { + iNotifyHandler = CCenRepNotifyHandler::NewL(*this, *iRepository, aKeyType, iKey); + iNotifyHandler->StartListeningL(); + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::ConstructL +// --------------------------------------------------------------------------- +// +void CRepositoryWatcher::ConstructL() + { + iNotifyHandler = CCenRepNotifyHandler::NewL(*this, *iRepository); + iNotifyHandler->StartListeningL(); + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::ChangedKey +// --------------------------------------------------------------------------- +// +TUint32 CRepositoryWatcher::ChangedKey() + { + return iChangedKey; + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::HandleNotifyInt +// --------------------------------------------------------------------------- +// +void CRepositoryWatcher::HandleNotifyInt( + TUint32 aKey, TInt /*aNewValue*/ ) + { + iChangedKey = aKey; + iCallBack.CallBack(); + iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId; + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::HandleNotifyString +// --------------------------------------------------------------------------- +// +void CRepositoryWatcher::HandleNotifyString( TUint32 aKey, + const TDesC16& /*aNewValue*/ ) + { + iChangedKey = aKey; + iCallBack.CallBack(); + iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId; + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::HandleNotifyGeneric +// --------------------------------------------------------------------------- +// +void CRepositoryWatcher::HandleNotifyGeneric(TUint32 aKey) + { + iChangedKey = aKey; + iCallBack.CallBack(); + iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId; + } + +// --------------------------------------------------------------------------- +// CRepositoryWatcher::HandleNotifyError +// --------------------------------------------------------------------------- +// +void CRepositoryWatcher::HandleNotifyError(TUint32 /*aKey*/, TInt /*aError*/, CCenRepNotifyHandler* /*aHandler*/) + { + } + + +// P & S subscriber + +// --------------------------------------------------------------------------- +// CPSSubscriber::CPSSubscriber +// --------------------------------------------------------------------------- +// +CPSSubscriber::CPSSubscriber(TCallBack aCallBack, RProperty& aProperty) + : CActive(EPriorityNormal), iCallBack(aCallBack), iProperty(aProperty) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CPSSubscriber::~CPSSubscriber +// --------------------------------------------------------------------------- +// +CPSSubscriber::~CPSSubscriber() + { + Cancel(); + } + +// --------------------------------------------------------------------------- +// CPSSubscriber::SubscribeL +// --------------------------------------------------------------------------- +// +void CPSSubscriber::SubscribeL() + { + if (!IsActive()) + { + iProperty.Subscribe(iStatus); + SetActive(); + } + } + +// --------------------------------------------------------------------------- +// CPSSubscriber::StopSubscribe +// --------------------------------------------------------------------------- +// +void CPSSubscriber::StopSubscribe() + { + Cancel(); + } + +// --------------------------------------------------------------------------- +// CPSSubscriber::RunL +// --------------------------------------------------------------------------- +// +void CPSSubscriber::RunL() + { + if (iStatus.Int() == KErrNone) + { + iCallBack.CallBack(); + SubscribeL(); + } + } + +// --------------------------------------------------------------------------- +// CPSSubscriber::DoCancel +// --------------------------------------------------------------------------- +// +void CPSSubscriber::DoCancel() + { + iProperty.Cancel(); + } + + + +// ========== UTILITIES CLASS =============================== + +// Checks if memory card is present +TBool SlideshowUtil::IsMCPresent() + { + RFs& fs = CCoeEnv::Static()->FsSession(); + + TInt error = KErrNone; + TDriveInfo driveInfo; + TInt res = 0; + TInt err = fs.CharToDrive(PathInfo::MemoryCardRootPath()[0], res); + error = fs.Drive(driveInfo, res ); + + // Not present, locked or unknown is bad + if ((error != KErrNone) || + (driveInfo.iMediaAtt & KMediaAttLocked) || + (driveInfo.iType == EMediaNotPresent) || + (driveInfo.iType == EMediaUnknown)) + { + return EFalse; + } + + // Read-only is fine + return ETrue; + } + + +// Checks if the given file is on memory card +TBool SlideshowUtil::IsOnMC(TFileName aFile) + { + // Grab drive letter from path and compare to memory card drive letter + TBuf<1> driveLetterBuf; + driveLetterBuf.CopyUC(aFile.Left(1)); + + if (driveLetterBuf.Compare(KSSPDriveLetterMC) == 0) + { + return ETrue; + } + + return EFalse; + } + + +// Checks that the file has enough DRM rights to be displayed +TBool SlideshowUtil::DRMCheck(CDRMHelper *aDRMHelper, TDesC& /* aFileName */) + { + if (!aDRMHelper) + { + return EFalse; + } + + return ETrue; + } + + +// Checks that the slide has enough DRM rights to be displayed +TBool SlideshowUtil::DRMCheck(CDRMHelper *aDRMHelper, CSlideshowSlide* aSlide) + { + if (!aDRMHelper || !aSlide) + { + return EFalse; + } + + return (DRMCheck(aDRMHelper, *(aSlide->FileName()))); + } + + +// Consumes the slide's DRM rights +void SlideshowUtil::DRMConsume(CDRMHelper* aDRMHelper, CSlideshowSlide* aSlide) + { + if (!aDRMHelper || !aSlide) + { + return; + } + + aDRMHelper->ConsumeFile2(*(aSlide->FileName()), + ContentAccess::EView, + CDRMHelper::EStart); + aDRMHelper->ConsumeFile2(*(aSlide->FileName()), + ContentAccess::EView, + CDRMHelper::EFinish); + } + + +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowSlide.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowSlide.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,123 @@ +/* +* 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: Stores a single slide +* +*/ + + + + + +// INCLUDES +#include "SlideshowSlide.h" +#include "SlideshowSlideLoader.h" +#include "SlideshowPluginUtils.h" + +// Creator +CSlideshowSlide* CSlideshowSlide::NewL(TDesC& aFileName, TBool aIsOnMC) + { + CSlideshowSlide* self = new (ELeave) CSlideshowSlide(aIsOnMC); + CleanupStack::PushL(self); + self->ConstructL(aFileName); + CleanupStack::Pop(self); + return self; + } + +// Destructor +CSlideshowSlide::~CSlideshowSlide() + { + ReleaseImage(); + delete iSlideLoader; + delete iFileName; + } + + +// Default C'tor +CSlideshowSlide::CSlideshowSlide(TBool aIsOnMC) + : iFlags(SSS_NONE) + { + if (aIsOnMC) + { + iFlags |= SSS_ISONMC; + } + } + +// is decoding in progress +TBool CSlideshowSlide::IsDecodingInProgress() + { + if(iSlideLoader->IsActive()) + { + return ETrue; + } + return EFalse; + } +// Could not decode the file +TBool CSlideshowSlide::CouldNotDecodeFile() + { + if (iFlags & SSS_DECODEFAILED) + { + return ETrue; + } + return EFalse; + } +// Two-phase constructor +void CSlideshowSlide::ConstructL(TDesC& aFileName) + { + // Allocate space for the filename and save it + iFileName = HBufC::NewL(aFileName.Length()); + *iFileName = aFileName; + iSlideLoader = CSlideshowSlideLoader::NewL(this); + } +// Prepares the slide (loads image) +void CSlideshowSlide::PrepareSlideL(const TSize& aTargetSize) + { + if (iFlags & SSS_IMAGELOADED) + { + return; + } + if( iSlideLoader->IsActive()) + { + // slide is being decoded ... should wait .. dont call LoadSlideL here + // should not come here.. + return; + } + iSlideLoader->LoadSlideL(*iFileName, aTargetSize); + } + +// Is slide decoded completely +TBool CSlideshowSlide::IsSlideDecoded() + { + if (iFlags & SSS_IMAGELOADED) + { + return ETrue; + } + return EFalse; + } +// Releases the slide's image +void CSlideshowSlide::ReleaseImage() + { + // if decoding is in progress... at any cost dont delete the image before Canceling the decoding + if(IsDecodingInProgress()) + { + iSlideLoader->Cancel(); + } + else if(iImage ) + { + delete iImage; + iImage = NULL; + } + //image deleted, revert back to not decoded state + iFlags &= ~(SSS_IMAGELOADED); + } +// End of File diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowSlideLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowSlideLoader.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,286 @@ +/* +* 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: Loads a slide from file +* +*/ + + + +// INCLUDES +#include "SlideshowPluginUtils.h" +#include "SlideshowSlideLoader.h" + +// --------------------------------------------------------------------------- +// DivAndRoundUp +// --------------------------------------------------------------------------- +// +TInt DivAndRoundUp(const TInt aNumber, const TInt aDivider) + { + TInt result = aNumber / aDivider; + + if (aNumber % aDivider) + { + result += 1; + } + + return result; + } + +// --------------------------------------------------------------------------- +// CSlideshowSlideLoader::NewL +// --------------------------------------------------------------------------- +// +CSlideshowSlideLoader* CSlideshowSlideLoader::NewL(CSlideshowSlide *aSlide) + { + CSlideshowSlideLoader * self = new (ELeave)CSlideshowSlideLoader(aSlide); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// CSlideshowSlideLoader::ConstructL +// --------------------------------------------------------------------------- +// +void CSlideshowSlideLoader::ConstructL() + { + // Add this object to active scheduler + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CSlideshowSlideLoader::CSlideshowSlideLoader +// --------------------------------------------------------------------------- +// +CSlideshowSlideLoader::CSlideshowSlideLoader(CSlideshowSlide *aSlide) + : CActive(CActive::EPriorityStandard),iSlide(aSlide) + { + // Empty + } + +// --------------------------------------------------------------------------- +// CSlideshowSlideLoader::~CSlideshowSlideLoader +// --------------------------------------------------------------------------- +// +CSlideshowSlideLoader::~CSlideshowSlideLoader() + { + if(IsActive()) + { + Cancel(); + } + + } + +// --------------------------------------------------------------------------- +// CSlideshowSlideLoader::DeleteDecoder +// --------------------------------------------------------------------------- +// +void CSlideshowSlideLoader::DeleteDecoder() + { + if(iDecoder) + { + delete iDecoder; + iDecoder = NULL; + } + + } + +// --------------------------------------------------------------------------- +// CSlideshowSlideLoader::DoCancel +// --------------------------------------------------------------------------- +// +void CSlideshowSlideLoader::DoCancel() + { + iDecoder->Cancel(); + DeleteDecoder(); + // delete the image + if(iSlide->iImage) + { + delete iSlide->iImage; + iSlide->iImage = NULL; + } + } + +// --------------------------------------------------------------------------- +// CSlideshowSlideLoader::RunL +// --------------------------------------------------------------------------- +// +void CSlideshowSlideLoader::RunL() + { + // delete the decoder to save some memory. + DeleteDecoder(); + if(iStatus != KErrNone) + { + iSlide->ReleaseImage(); + // SSS_DECODEFAILED says that Image could not be decoded. Corrupted image. + (iSlide->iFlags) |= SSS_DECODEFAILED; + return; + } + + // Image loaded, size scaled down while loading. Find out, if the + // image still needs to be scaled smaller to fit the screen + + TReal aspectRatio = (TReal) iBitmapsize.iWidth / (TReal) iBitmapsize.iHeight; + + if ((iBitmapsize.iWidth <= iTargetSize.iWidth) && + (iBitmapsize.iHeight <= iTargetSize.iHeight)) + { + // Fits completely - finish + SSPLOGGER_WRITE("No resize needed"); + + // Compress the heap after imageconversion as + // imagedecoder seems to leave heap uncompressed + User::Heap().Compress(); + (iSlide->iFlags) |= SSS_IMAGELOADED; + return; + } + + // Figure out which dimension needs most scaling + TReal xFactor = (TReal) iTargetSize.iWidth / (TReal) iBitmapsize.iWidth; + TReal yFactor = (TReal) iTargetSize.iHeight / (TReal) iBitmapsize.iHeight; + + // Start with target (screen) size + TSize finalSize = iTargetSize; + + if (xFactor <= yFactor) + { + // X-dimension needs most scaling - fit to x, re-calc y + finalSize.iHeight = (TInt) ((TReal) finalSize.iWidth / aspectRatio); + } + else + { + // Y-dimension needs most scaling - fit to y, re-calc x + finalSize.iWidth = (TInt) ((TReal) finalSize.iHeight * aspectRatio); + } + + SSPLOGGER_WRITEF(_L("SSP: Final size (%d, %d)"), + finalSize.iWidth, finalSize.iHeight); + + // Create a final bitmap with the final size, and draw to it + CFbsBitmap* finalBmp = new (ELeave) CFbsBitmap; + CleanupStack::PushL(finalBmp); + User::LeaveIfError(finalBmp->Create(finalSize, (iSlide->iImage)->DisplayMode())); + + CFbsBitmapDevice* bmpDev = CFbsBitmapDevice::NewL(finalBmp); + CleanupStack::PushL(bmpDev); + + CFbsBitGc* bmpCxt; + User::LeaveIfError(bmpDev->CreateContext(bmpCxt)); + CleanupStack::PushL(bmpCxt); + bmpCxt->DrawBitmap(TRect(0, 0, finalSize.iWidth, finalSize.iHeight), + (iSlide->iImage), + TRect(0, 0, iBitmapsize.iWidth, iBitmapsize.iHeight)); + + CleanupStack::PopAndDestroy(2); // bmpDev, bmpCxt + // Return the result in the original bitmap parameter + (iSlide->iImage)->Reset(); + + User::LeaveIfError((iSlide->iImage)->Duplicate(finalBmp->Handle())); + CleanupStack::PopAndDestroy(finalBmp); + // Compress the heap after imageconversion as + // imagedecoder seems to leave heap uncompressed + User::Heap().Compress(); + (iSlide->iFlags) |= SSS_IMAGELOADED; + return; + } + +// --------------------------------------------------------------------------- +// CSlideshowSlideLoader::LoadSlideL +// --------------------------------------------------------------------------- +// +void CSlideshowSlideLoader::LoadSlideL( + const TDesC& aFilename, const TSize& aTargetSize) + { + + iTargetSize = aTargetSize; + RFs filesys; + User::LeaveIfError(filesys.Connect()); + CleanupClosePushL(filesys); + // this line can leave if decoder is not found..need to cacth this. + iDecoder = CImageDecoder::FileNewL(filesys, aFilename, ContentAccess::EView,CImageDecoder::EOptionAlwaysThread); + if (aTargetSize == TSize(-1,-1)) + { + CleanupStack::PopAndDestroy(&filesys); + iDecoder = NULL; + return; + } + + // Get image information + TFrameInfo frameinfo = iDecoder->FrameInfo(); + TDisplayMode mode; + + // Tone down colors if possible (saves memory) + if (frameinfo.iFlags & TFrameInfo::ECanDither) + { + mode = EColor64K; + } + else + { + mode = frameinfo.iFrameDisplayMode; + } + + // Find out if the image can be downscaled during loading + iBitmapsize = frameinfo.iOverallSizeInPixels; + + + if ((iBitmapsize.iWidth >= aTargetSize.iWidth * 2) && + (iBitmapsize.iHeight >= aTargetSize.iHeight * 2)) + { + // 1/2 size + iBitmapsize.iWidth = DivAndRoundUp(frameinfo.iOverallSizeInPixels.iWidth, 2); + iBitmapsize.iHeight = DivAndRoundUp(frameinfo.iOverallSizeInPixels.iHeight, 2); + + if ((iBitmapsize.iWidth >= aTargetSize.iWidth * 2) && + (iBitmapsize.iHeight >= aTargetSize.iHeight * 2)) + { + // 1/4 size + iBitmapsize.iWidth = DivAndRoundUp(frameinfo.iOverallSizeInPixels.iWidth, 4); + iBitmapsize.iHeight = DivAndRoundUp(frameinfo.iOverallSizeInPixels.iHeight, 4); + + if ((iBitmapsize.iWidth >= aTargetSize.iWidth * 2) && + (iBitmapsize.iHeight >= aTargetSize.iHeight * 2)) + { + // 1/8 size + iBitmapsize.iWidth = DivAndRoundUp(frameinfo.iOverallSizeInPixels.iWidth, 8); + iBitmapsize.iHeight = DivAndRoundUp(frameinfo.iOverallSizeInPixels.iHeight, 8); + } + } + } + + // Create a target bitmap + iSlide->iImage = new (ELeave) CFbsBitmap; + User::LeaveIfError((iSlide->iImage)->Create(iBitmapsize, mode)); + // for filesys + CleanupStack::PopAndDestroy(&filesys); + + //Start decoding the image ... + // RunL method is called when decoding is done. + iDecoder->Convert(&iStatus, *(iSlide->iImage),0); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CSlideshowSlideLoader::RunError +// --------------------------------------------------------------------------- +// +TInt CSlideshowSlideLoader::RunError(TInt aError) + { + if (NULL != iSlide->iImage) + { + delete iSlide->iImage; + iSlide->iImage = NULL; + } + return aError; + } diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/group/bld.inf Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,24 @@ +/* +* Copyright (c) 2009 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: Build information file for all plugins +* +*/ + + + + +#include "../BmpAnimScrPlugin/group/bld.inf" +#include "../ScreenSaverAnimPlugin/group/bld.inf" +#include "../ScreenSaverGifAnimPlugin/group/bld.inf" +#include "../SlideshowPlugin/group/bld.inf" diff -r aaeeca1f15af -r e8d784ac1a4b src/Screensaver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Screensaver.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2004 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: Document and application class file for screensaver app. +* +*/ + + + +#include +#include "screensaver.hrh" +#include "screensaver.h" +#include "screensaverappui.h" + + + +// ----------------------------------------------------------------------------- +// CScreensaverDocument::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverDocument::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverDocument::CScreensaverDocument +// ----------------------------------------------------------------------------- +// +CScreensaverDocument::CScreensaverDocument(CEikApplication& aApp): CAknDocument(aApp) + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverDocument::~CScreensaverDocument +// ----------------------------------------------------------------------------- +// +CScreensaverDocument::~CScreensaverDocument() + { + + } + +// +// CScreensaverEikDocument +// + +// ----------------------------------------------------------------------------- +// CScreensaverDocument::CreateAppUiL +// ----------------------------------------------------------------------------- +// +CEikAppUi* CScreensaverDocument::CreateAppUiL() + { + return ( new (ELeave) CScreensaverAppUi ); + } + + +// +// CScreensaverApplication +// +// ----------------------------------------------------------------------------- +// CScreensaverApplication::CreateDocumentL +// ----------------------------------------------------------------------------- +// +CApaDocument* CScreensaverApplication::CreateDocumentL() + { + CScreensaverDocument* document=new(ELeave) CScreensaverDocument(*this); + // No need to do ConstructL for document since it is empty. + return(document); + } + +// ----------------------------------------------------------------------------- +// CScreensaverApplication::AppDllUid +// ----------------------------------------------------------------------------- +// +TUid CScreensaverApplication::AppDllUid() const + { + return KUidScreensaverApp; + } + + +// +// EXPORTed functions +// +LOCAL_C CApaApplication* NewApplication() + { + return new CScreensaverApplication; + } + + +GLDEF_C TInt E32Main() + { + return EikStart::RunApplication(NewApplication); + } + + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaver.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaver.rss Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,405 @@ +/* +* Copyright (c) 2003 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: Screensaver resource file. +* +*/ + + + + + +NAME SCRE + +#include +#include +#include +#include +#include +#include + +#include "screensaver.hrh" + +RESOURCE RSS_SIGNATURE { } + +RESOURCE TBUF + { + buf= ""; + } + +RESOURCE EIK_APP_INFO + { + status_pane = r_status_pane; + } + +RESOURCE STATUS_PANE_APP_MODEL r_status_pane + { + layout= R_AVKON_STATUS_PANE_LAYOUT_EMPTY; + } + + +STRUCT SCREENSAVER_COLOR_MODEL + { + LONG color_depth; // Highest color model supported in partial mode. + WORD colors[8]; // This array is for defining colors for 3-bit mode. + LONG dark_gradient[6]; // Darker shades for gradient effect (in high color mode). + LONG light_gradient[6]; // Lighter shades for gradient effect (in high color mode). + } + + +RESOURCE SCREENSAVER_COLOR_MODEL r_screensaver_color_model + { + color_depth = ESsColorModel3BitMode; + colors = + { + 210, + 35, + 23, + 185, + 105, + 95, + 159, + 221 + }; + dark_gradient = + { + 0x993300, + 0x990033, + 0x680069, + 0x003bce, + 0x225904, + 0x090273 + }; + light_gradient = + { + 0xfbb100, + 0xfd9597, + 0xfe00cb, + 0x00c8fe, + 0x33fa95, + 0xa843fd + }; + } + + +// +// This struct contains various rendering parameters for screensaver +// indicator bar. Do not change the order of fields in this struct. +// +STRUCT SCREENSAVER_PARAMETERS_ARRAY + { + WORD KIndicatorMargin; // Minimum indicator distance to left and right border. + WORD KIndicatorGap; // How many pixels between indicators. + WORD KIndicatorTopMargin; // Distance from top border of indicator bar to top border of indicator icon. + WORD KIndicatorTextLevel; + LONG KBackGroundColor; // Background color in TRgb format. + WORD KHeight; // Height of the indicator bar. + } + + +RESOURCE SCREENSAVER_PARAMETERS_ARRAY r_screensaver_parameters + { + KIndicatorMargin = 5; + KIndicatorGap = 4; + KIndicatorTopMargin = 2; + KIndicatorTextLevel = 17; + KBackGroundColor = 0x00c8c8c8; + KHeight = 14; + } + + +// +// Numeric indicator. Displays number over bitmap background. +// there can be separate background bitmap for each number of digits +// displayed. 'Icons' array has following format: +// icons = +// { +// // Backround bitmap for one digit case +// EMbmAvkonQgn_background_for_one_digit_case, +// // Mask for one digit case. +// EMbmAvkonQgn_mask_for_one_digit_case, +// // X position of numeric value inside of bitmap (value is an example). +// 23, +// // Y position of numeric value inside of bitmap. +// 17, +// // Two digit case starts here... +// EMbmAvkonQgn_background_for_two_digit_case, +// EMbmAvkonQgn_mask_for_two_digit_case, +// 22, +// 15 +// // ... and so on for each number of digits. +// }; +// This indicator type is not currently used in standard 2.x screensaver. +// +STRUCT SCRN_NUMERIC_INDICTOR + { + LONG type = ESsNumericIndicator; + WORD id; + WORD priority = ESsDrawTypeNotDrawn; + WORD align; + LONG icons[]; + } + + +// +// Icon indicator. Displays bitmap and mask (if specified). +// +STRUCT SCRN_ICON_INDICATOR + { + LONG type = ESsIconIndicator; + WORD id; + WORD priority = ESsDrawTypeNotDrawn; + WORD align; + LONG icon[4]; // Bmp id, mask id, skinned bmp id, skinned bmp mask id + } + + +// +// Text indicator. Displays text without background bitmap. +// +STRUCT SCRN_TEXT_INDICATOR + { + LONG type = ESsTextIndicator; + WORD id; + WORD priority = ESsDrawTypeNotDrawn; + WORD align; + LONG font_id = ELatinPlain12; + } + + +// +// Number & Icon indicator. Displays numeric information with +// icon. Number is displayed on left or right side of the +// icon (depending on icon_align), not over the icon like with +// numeric indicator. +// +STRUCT SCRN_NUMBER_AND_ICON_INDICATOR + { + LONG type = ESsNumberAndIconIndicator; + WORD id; + WORD priority = ESsDrawTypeNotDrawn; + WORD align; + LONG icon_align; + LONG font_id = ELatinPlain12; + LONG icon[4]; // Bmp id, mask id, skinned bmp id, skinned bmp mask id + } + + +// +// The screensaver indicator array. Defines indicators for +// indicator bar in default screensaver view. +// The order of indicators in this array specifies the order +// of indicators on screen. +// +RESOURCE ARRAY r_screensaver_indicator_array + { + items = + { + SCRN_ICON_INDICATOR // Voicemail indicator + { + id = ESsVoicemailInd; + align = ESsAlignRight; + priority = ESsDrawTypePrimary; + icon = + { + EMbmAvkonQgn_stat_vm0_uni, + EMbmAvkonQgn_stat_vm0_uni, + EAknsMinorGenericQgnStatVm0Uni, + EAknsMinorGenericQgnStatVm0Uni + }; + }, + SCRN_ICON_INDICATOR // E-mail indicator + { + id = ESsMailInd; + align = ESsAlignRight; + priority = ESsDrawTypePrimary; + icon = + { + EMbmAvkonQgn_stat_message_mail_uni, + EMbmAvkonQgn_stat_message_mail_uni, + EAknsMinorGenericQgnStatMessageMailUni, + EAknsMinorGenericQgnStatMessageMailUni + }; + }, + SCRN_ICON_INDICATOR // Instant messaging indicator. + { + id = ESsImInd; + align = ESsAlignRight; + priority = ESsDrawTypePrimary; + icon = + { + EMbmAvkonQgn_stat_im_uni, + EMbmAvkonQgn_stat_im_uni, + EAknsMinorGenericQgnStatImUni, + EAknsMinorGenericQgnStatImUni + }; + }, + SCRN_NUMBER_AND_ICON_INDICATOR // Unread messages indicator. + { + id = ESsNewMessagesInd; + align = ESsAlignRight; + priority = ESsDrawTypePrimary; + icon_align = ESsAlignRight; + icon = + { + EMbmAvkonQgn_stat_message_ps, + EMbmAvkonQgn_stat_message_ps, + EAknsMinorGenericQgnStatMessagePs, + EAknsMinorGenericQgnStatMessagePs + }; + }, + SCRN_NUMBER_AND_ICON_INDICATOR // Missed calls indicator. + { + id = ESsMissedCallsInd; + align = ESsAlignRight; + priority = ESsDrawTypePrimary; + icon_align = ESsAlignRight; + icon = + { + EMbmAvkonQgn_stat_missed_call_ps, + EMbmAvkonQgn_stat_missed_call_ps, + EAknsMinorGenericQgnStatMissedCallPs, + EAknsMinorGenericQgnStatMissedCallPs + }; + }, + SCRN_TEXT_INDICATOR // Profile name indicator. + { + id = ESsProfileInd; + align = ESsAlignLeft; + priority = ESsDrawTypeSecondary; + }, + SCRN_ICON_INDICATOR // Keyguard indicator. + { + id = ESsKeyLockInd; + align = ESsAlignLeft; + priority = ESsDrawTypeSecondary; + icon = + { + EMbmAvkonQgn_stat_keyguard, + EMbmAvkonQgn_stat_keyguard, + EAknsMinorGenericQgnStatKeyguard, + EAknsMinorGenericQgnStatKeyguard + }; + } + }; + } + + +// +// The screensaver indicator array. Defines indicators for +// indicator bar in default screensaver view. +// The order of indicators in this array specifies the order +// of indicators on screen. +RESOURCE ARRAY r_screensaver_indicator_array_new_layout + { + items = + { + SCRN_TEXT_INDICATOR // Am/Pm indicator. + { + id = ESsAmPmInd; + align = ESsAlignRight; + priority = ESsDrawTypePrimary; + }, + SCRN_TEXT_INDICATOR // Profile name indicator. + { + id = ESsProfileInd; + align = ESsAlignLeft; + priority = ESsDrawTypeSecondary; + }, + SCRN_ICON_INDICATOR // Voicemail indicator + { + id = ESsVoicemailInd; + align = ESsAlignLeft; + priority = ESsDrawTypeSecondary; + icon = + { + EMbmAvkonQgn_stat_vm0_uni, + EMbmAvkonQgn_stat_vm0_uni, + EAknsMinorGenericQgnStatVm0Uni, + EAknsMinorGenericQgnStatVm0Uni + }; + }, + SCRN_ICON_INDICATOR // E-mail indicator + { + id = ESsMailInd; + align = ESsAlignLeft; + priority = ESsDrawTypeSecondary; + icon = + { + EMbmAvkonQgn_stat_message_mail_uni, + EMbmAvkonQgn_stat_message_mail_uni, + EAknsMinorGenericQgnStatMessageMailUni, + EAknsMinorGenericQgnStatMessageMailUni + }; + }, + SCRN_ICON_INDICATOR // Instant messaging indicator. + { + id = ESsImInd; + align = ESsAlignLeft; + priority = ESsDrawTypeSecondary; + icon = + { + EMbmAvkonQgn_stat_im_uni, + EMbmAvkonQgn_stat_im_uni, + EAknsMinorGenericQgnStatImUni, + EAknsMinorGenericQgnStatImUni + }; + }, + SCRN_NUMBER_AND_ICON_INDICATOR // Unread messages indicator. + { + id = ESsNewMessagesInd; + align = ESsAlignLeft; + priority = ESsDrawTypePrimary; + icon_align = ESsAlignRight; + icon = + { + EMbmAvkonQgn_stat_message_uni, //ps, + EMbmAvkonQgn_stat_message_uni, //ps, + EAknsMinorGenericQgnStatMessageUni, + EAknsMinorGenericQgnStatMessageUni + }; + }, + SCRN_NUMBER_AND_ICON_INDICATOR // Missed calls indicator. + { + id = ESsMissedCallsInd; + align = ESsAlignLeft; + priority = ESsDrawTypePrimary; + icon_align = ESsAlignRight; + icon = + { + EMbmAvkonQgn_stat_missed_calls_uni, //_ps, + EMbmAvkonQgn_stat_missed_calls_uni, //_ps, + EAknsMinorGenericQgnStatMissedCallsUni, + EAknsMinorGenericQgnStatMissedCallsUni + }; + }, + SCRN_ICON_INDICATOR // Keyguard indicator. + { + id = ESsKeyLockInd; + align = ESsAlignLeft; + priority = ESsDrawTypePrimary; + icon = + { + EMbmAvkonQgn_stat_keyguard, + EMbmAvkonQgn_stat_keyguard, + EAknsMinorGenericQgnStatKeyguard, + EAknsMinorGenericQgnStatKeyguard + }; + } + }; + } + +// 01:20, 1:20, 13:05, 1:05 // separators are locale dependent +RESOURCE TBUF r_screensaver_time_usual_without_ampm { buf = "%J%:1%T"; } + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaveractivitymanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaveractivitymanager.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,131 @@ +// Copyright (c) 2007-2009 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: +// CScreensaverActivityManager class +// +// + +#include "screensaveractivitymanager.h" + +CScreensaverActivityManager* CScreensaverActivityManager::NewL(TInt aPriority) + { + CScreensaverActivityManager* self = new (ELeave) CScreensaverActivityManager(aPriority); + CleanupStack::PushL(self); + self->ConstructL(); + CActiveScheduler::Add(self); + CleanupStack::Pop(self); + return self; + } + +CScreensaverActivityManager::CScreensaverActivityManager(TInt aPriority) + : CTimer(aPriority), iInactiveCallback(0,0), iActiveCallback(0,0), iState(EStNotActive) + { + } + + +CScreensaverActivityManager::~CScreensaverActivityManager() + { + } + + +void CScreensaverActivityManager::Start(TTimeIntervalSeconds aInterval, + TCallBack aInactiveCallback, TCallBack aActiveCallback) + { + iInterval = aInterval; + iInactiveCallback = aInactiveCallback; + iActiveCallback = aActiveCallback; + + if (iInterval.Int() < 0) + { + iInterval = TTimeIntervalSeconds(0); + } + + // Cancel outstanding timer, if any + CTimer::Cancel(); + + if (iState == EStNotActive || iState == EStMonForInactivity) + { + // Begin or contine monitoring for user inactivity + MonitorInactivity(); + } + else + { + // Continue monitoring for user activity + Inactivity(0); + } + } + + +void CScreensaverActivityManager::SetInactivityTimeout(TTimeIntervalSeconds aInterval) + { + if (iState <= EStNotActive) + { + } + Start(aInterval, iInactiveCallback, iActiveCallback); + } + + +void CScreensaverActivityManager::MonitorInactivity() + { + if (User::InactivityTime() >= iInterval) + { + // Already inactive enough, monitor for activity + iState = EStMonForActivity; + // Monitor for activity, set timer before callback to avoid missing any + // user activity should callback take some time. + Inactivity(0); + // Inform client that the inactivity interval has ended. + (void) iInactiveCallback.CallBack(); + } + else + { + // Monitor for Inactivity + iState = EStMonForInactivity; + Inactivity(iInterval); + } + } + + +void CScreensaverActivityManager::RunL() + { + if (iStatus == KErrNone) + { + if (iState == EStMonForInactivity) + { + // Looking for Inactivity, found it + // Monitor for activity, set timer before callback to avoid missing + // any user activity should callback take some time. + iState = EStMonForActivity; + Inactivity(0); + // Inform client that the inactivity interval has ended. + (void) iInactiveCallback.CallBack(); + } + else if (iState == EStMonForActivity) + { + // Looking for activity, found it + // Monitor for activity unless MonitorInactivity overrides it + iState = EStMonForInactivity; + MonitorInactivity(); + (void) iActiveCallback.CallBack(); + } + else + { // Must never happen, indicates internal state of object incorrect. + + } + } + } + +TBool CScreensaverActivityManager::IsMonitoringForActivity() + { + return ( iState == EStMonForActivity ); + } diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverappui.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverappui.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2004 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: The AppUi file for screensaver application. +* +*/ + + + +#include + +#include "screensavershareddatai.h" +#include "screensaverappui.h" +#include "screensaverengine.h" + +// +// CScreensaverAppUi +// +// ----------------------------------------------------------------------------- +// CScreensaverAppUi::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverAppUi::ConstructL() + { + SCRLOGGER_WRITEF(_L("SCR:CScreensaverAppUi::ConstructL start") ); + SCRLOGGER_CREATE; + + // Choose orientation based on screensaverconfig +#if defined(SS_ALWAYSPORTRAIT) + BaseConstructL(EAppOrientationPortrait); + +#elif defined(SS_ALWAYSLANDSCAPE) + BaseConstructL(EAppOrientationLandscape); + +#else + + // Not specified - follows device setting + BaseConstructL(); +#endif + + SetKeyEventFlags( CAknAppUiBase::EDisableSendKeyShort | CAknAppUiBase::EDisableSendKeyLong ); + + iModel = CScreensaverEngine::NewL(); + + CreateViewL(); + + iEikonEnv->SetSystem( ETrue ); + HideApplicationFromFSW(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverAppUi::~CScreensaverAppUi +// ----------------------------------------------------------------------------- +// +CScreensaverAppUi::~CScreensaverAppUi() + { + + delete iModel; + iModel = NULL; + + SCRLOGGER_DELETE; + } + +// ----------------------------------------------------------------------------- +// CScreensaverAppUi::Model +// ----------------------------------------------------------------------------- +// +CScreensaverEngine& CScreensaverAppUi::Model() const + { + return *iModel; + } + +// ----------------------------------------------------------------------------- +// CScreensaverAppUi::HandleCommandL +// ----------------------------------------------------------------------------- +// +void CScreensaverAppUi::HandleCommandL( TInt aCommand ) + { + switch ( aCommand ) + { + case EEikCmdExit: + Exit(); + break; + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverAppUi::GetView +// ----------------------------------------------------------------------------- +// +CScreensaverView* CScreensaverAppUi::ScreensaverView() + { + return iView; + } + +// ----------------------------------------------------------------------------- +// CScreensaverAppUi::CreateViewL +// ----------------------------------------------------------------------------- +// +void CScreensaverAppUi::CreateViewL() + { + SCRLOGGER_WRITEF(_L("SCR:CScreensaverAppUi::CreateViewL start") ); + iView = CScreensaverView::NewL(); + + AddViewL( iView ); // transfer ownership to CAknViewAppUi + + SetDefaultViewL( *iView ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverAppUi::HandleKeyEventL +// ----------------------------------------------------------------------------- +// +TKeyResponse CScreensaverAppUi::HandleKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + SCRLOGGER_WRITEF(_L("SCR:CScreensaverAppUi::HandleKeyEventL start") ); + // Stop on keyup instead of keydown, otherwise the underlying + // app might get orphaned key up events and soil its pants. EXCEPT + // in preview mode stop on keydown, because the keup from starting + // the preview might be received here, and preview stopped before + // it even properly started + TBool stop = EFalse; + + if ( !iView ) + { + return EKeyWasConsumed; + } + + if ( aType == EEventKey && aKeyEvent.iCode == EKeyNo ) + { + stop = ETrue; + } + else + { + if ( iModel->ScreenSaverIsPreviewing() ) + { + if ( aType == EEventKeyDown ) + { + stop = ETrue; + } + } + else + { + if ( aType == EEventKeyUp && + !iModel->SharedDataInterface()->IsKeyguardOn() ) + { + stop = ETrue; + } + } + } + + if ( stop ) + { + iModel->StopScreenSaver(); + } + + return EKeyWasConsumed; + } + +// ----------------------------------------------------------------------------- +// CScreensaverAppUi::HandleScreenDeviceChangedL +// Stops screensaver as soon as screen device changes. Resourcechange +// about e.g. resulting layout change comes annoyingly late +// ----------------------------------------------------------------------------- +// +void CScreensaverAppUi::HandleScreenDeviceChangedL() + { +#if defined(SS_FASTSTOPONSCREENDEVICECHANGE) + // Slightly faster stop when screendevice changes. Instead of + // letting the created user activity stop, do it here. + // NOTE that if forced orientation is not used and there is an + // application that changes screen orientation for itself (e.g. + // viewfinder), screensaver will die here when activated if fast + // stop is used. +#if !defined(SS_ALWAYSPORTRAIT) && !defined(SS_ALWAYSLANDSCAPE) + // Do not stop, if forced orientation is used! + // Screensaver may cause a screen device change when activated, + // and will promptly commit suicide here + iModel->StopScreenSaver(); +#endif +#endif + + CAknViewAppUi::HandleScreenDeviceChangedL(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverAppUi::HandleWsEventL +// ----------------------------------------------------------------------------- +// +void CScreensaverAppUi::HandleWsEventL( const TWsEvent& aEvent, + CCoeControl* aDestination ) + { + SCRLOGGER_WRITEF(_L("SCR:CScreensaverAppUi::HandleWsEventL start") ); + // First, let parent class handle the event + CAknViewAppUi::HandleWsEventL( aEvent, aDestination ); + + // In case of a pointer event, also stop screensaver + if ( aEvent.Type() == EEventPointer ) + { + iModel->StopScreenSaver(); + } + } + +//End of file diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverbase.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,339 @@ +/* +* Copyright (c) 2009 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: The control base class of display object. +* +*/ + + + +#include +#include + +#include "screensaverbase.h" +#include "screensaverview.h" +#include "screensaverappui.h" +#include "ScreensaverUtils.h" +#include "screensavershareddatai.h" +#include "screensaverutility.h" + +const TInt KRefreshRate = 60000000; // 60 sec + + +// Time delayed before a wserv heartbeat stop request is issued. +// Delay is needed, because draw commands may still be handled, if +// stop request is issued right after screen refresh. +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 +const TInt KCaptureDelay = 2000000; // 2.0 sec, used to delay the capturing operation +#else +const TInt KCaptureDelay = 100000; // 0.1 sec +#endif + +// ----------------------------------------------------------------------------- +// CScreensaverBase::CScreensaverBase +// ----------------------------------------------------------------------------- +// +CScreensaverBase::CScreensaverBase() + { + + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::~CScreensaverBase +// ----------------------------------------------------------------------------- +// +CScreensaverBase::~CScreensaverBase() + { + DeleteTimer( iCaptureScreenTimer ); + + delete iPowerSaveDisplayMode; + + delete iOffScrnBmp; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::StartDrawObject +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::StartDrawObject() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StartDrawObject start") ); + StartTimer(); + + DrawObject(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::StopDrawObject +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::StopDrawObject() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StopDrawObject start") ); + if ( LcdPartialMode() && LcdPartialMode()->Status() ) + { + SCRLOGGER_WRITE("Model: StopScreenSaver(), exit power save"); + LcdPartialMode()->Exit(); + } + + CancelTimer(); + + ClearScreen(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::DrawObject +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::DrawObject() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::DrawObject start") ); + SetRect( Rect() ); + + DrawNow(); + + StartCaptureScreenTimer(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::View +// ----------------------------------------------------------------------------- +// +CScreensaverView* CScreensaverBase::View() const + { + return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->ScreensaverView(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::Model +// ----------------------------------------------------------------------------- +// +const CScreensaverEngine& CScreensaverBase::Model() const + { + return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->Model(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::Array +// ----------------------------------------------------------------------------- +// +CScreensaverIndicatorArray& CScreensaverBase::Array() const + { + return Model().IndicatorArray(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::SetPowerSaveDisplayActiveArea +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::SetPowerSaveDisplayActiveArea( TRect& aRect ) + { + // Save the requested area + iPowerSaveDisplayActiveArea = aRect; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::ActivatePowerSaveDisplay +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::ActivatePowerSaveDisplay( TBool aFullColors ) const + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::ActivatePowerSaveDisplay start") ); + TInt err = KErrNone; + + if ( ( Model().ScreenSaverIsOn() + && ( !iPowerSaveDisplayActiveArea.IsEmpty() ) ) ) + { + TInt startLine = 0; + TInt endLine = 0; + + // Normal mode - using saver bar height + startLine = iPowerSaveDisplayActiveArea.iTl.iY; + endLine = iPowerSaveDisplayActiveArea.iBr.iY; + + SCRLOGGER_WRITEF( _L("SCR: Powersave supports %d lines"), + LcdPartialMode()->MaxLines() ); + + // Check whether power save mode should be used + // When local variation added, PS will override if local says + // yes, but PS says no + if ( Model().SharedDataInterface()->IsUsePowerSaveMode() ) + { + SCRLOGGER_WRITEF( _L("SCR: Requesting powersave, lines: %d, %d"), + startLine, endLine ); + TUint16* addr = ( TUint16* )iOffScrnBmp->DataAddress(); + err = LcdPartialMode()->Set( startLine, endLine, addr, aFullColors ); + + Model().SharedDataInterface()->SetSSForcedLightsOn( 0 ); + } + else + { + SCRLOGGER_WRITE("Power save mode not in use, not requested"); + err = KErrCancel; + } + } + else + { + // Screensaver not on - cannot set power save mode on + err = KErrNotReady; + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::DrawPictographArea +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::DrawPictographArea() + { + // Currently animation is not supported - do nothing + } + +// ---------------------------------------------------------------------------- +// CScreensaverBase::StartCaptureScreenTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::StartCaptureScreenTimer() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StartCaptureScreenTimer start") ); + DeleteTimer( iCaptureScreenTimer ); + + TRAP_IGNORE( iCaptureScreenTimer = CPeriodic::NewL( CActive::EPriorityStandard ) ); + + iCaptureScreenTimer->Start( KCaptureDelay , KCaptureDelay , + TCallBack( HandleCaptureTimerExpiry, this ) ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::InitialRefreshRate +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::InitialRefreshRate() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::InitialRefreshRate start") ); + TTime homeTime, timeTmp; + TTimeIntervalSeconds interval; + TInt initialRefresh = KRefreshRate; + homeTime.HomeTime(); + timeTmp = homeTime; + timeTmp.RoundUpToNextMinute(); + if ( timeTmp.SecondsFrom( homeTime, interval ) == KErrNone ) + { + initialRefresh = interval.Int() * 1000000; + } + + return initialRefresh; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::DeleteTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::DeleteTimer( CPeriodic*& aTimer ) + { + if ( aTimer ) + { + aTimer->Cancel(); + delete aTimer; + aTimer = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::ConstructAndConnectLCDL +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::ConstructAndConnectLCDL() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::ConstructAndConnectLCD start") ); + // User side handle object is created + TRAPD( err, iPowerSaveDisplayMode = CPowerSaveDisplayMode::NewL() ); + if ( ( err != KErrNone ) || ( !iPowerSaveDisplayMode ) ) + { + SCRLOGGER_WRITEF( _L("SCR: Model: No power save mode (err = %d)"), err ); + } + + iOffScrnBmp = new ( ELeave ) CFbsBitmap; + User::LeaveIfError( iOffScrnBmp->Create( Size(), EColor64K ) ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::LcdPartialMode +// ----------------------------------------------------------------------------- +// +CPowerSaveDisplayMode* CScreensaverBase::LcdPartialMode() const + { + return iPowerSaveDisplayMode; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::HandleRefreshTimerExpiry +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::HandleRefreshTimerExpiry( TAny* aPtr ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::HandleRefreshTimerExpiry start") ); + CScreensaverBase* control = STATIC_CAST(CScreensaverBase*, aPtr); + + SCRLOGGER_WRITEF( _L("SCR: Inside CScreensaverView::HandleRefreshTimerExpiry()") ); + + control->DrawObject(); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::HandleCaptureTimerExpiry +// Handles capture screen timer timeout +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::HandleCaptureTimerExpiry( TAny* aPtr ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::HandleCaptureTimerExpiry start") ); + CScreensaverBase *control= STATIC_CAST( CScreensaverBase*, aPtr ); + + SCRLOGGER_WRITEF( _L("SCR: Inside CScreensaverView::HandleWsHbStopTimerTimeout()") ); + + if ( control ) + { + TInt err = control->CaptureScreen(); + control->DeleteTimer( control->iCaptureScreenTimer ); + ScreensaverUtility::StopWServHeartBeat(); + +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + + if ( KErrNone == err ) + { + control->ActivatePowerSaveDisplay(); + } + +#endif + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::CaptureScreen +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::CaptureScreen() + { + CWsScreenDevice* device = iCoeEnv->ScreenDevice(); + TInt err = device->CopyScreenToBitmap( iOffScrnBmp, iPowerSaveDisplayActiveArea ); + return err; + } + +//End of file diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverctrlmovingtext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverctrlmovingtext.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,598 @@ +/* +* Copyright (c) 2003 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: Implementation of screensaver moving text display class. +* +*/ + +#ifdef USE_DATE_AND_TEXT + +#include +#include +#include +#include +#include +#include + +#include "screensaverappui.h" +#include "screensavershareddatai.h" +#include "ScreensaverUtils.h" +#include "screensaverutility.h" +#include "screensaverctrlmovingtext.h" + +const TInt KInvertedColors = 1; + +//The color for text and background +const TInt KInvertedBgColor = 215; +const TInt KInvertedTextColor = 0; +const TInt KInvertedTextBgColor = 215; + +const TInt KBgColor = 0; +const TInt KTextColor = 215; +const TInt KTextBgColor = 210; + +// the minimum top value +const TInt KMinTop = 4; + +const TInt KRefreshRate = 60000000; // 60 sec +// +// Class CScreensaverCtrlMovingText +// +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverCtrlMovingText* CScreensaverCtrlMovingText::NewL( TDisplayObjectType aType ) + { + CScreensaverCtrlMovingText* obj = new( ELeave ) CScreensaverCtrlMovingText( aType ); + CleanupStack::PushL( obj ); + obj->ConstructL(); + CleanupStack::Pop(); + return obj; + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::~CScreensaverCtrlMovingText +// ----------------------------------------------------------------------------- +// +CScreensaverCtrlMovingText::~CScreensaverCtrlMovingText() + { + iEikonEnv->RemoveFromStack( this ); + + DeleteTimer( iBarRefreshTimer ); + DeleteTimer( iCaptureScreenTimer ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::HandleResourceChange +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::HandleResourceChange( TInt aType ) + { + if ( aType == KEikDynamicLayoutVariantSwitch )//&& iType != EDisplayNone) + { + // Screen layout has changed - resize + SetRect( iCoeEnv->ScreenDevice()->SizeInPixels() ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::SizeChanged +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::SizeChanged() + { + GenerateDisplayAttributesForScreensaverBar(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::Draw +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::Draw( const TRect& aRect ) const + { + if ( !Model().ScreenSaverIsOn() && !Model().ScreenSaverIsPreviewing() ) + { + return; + } + + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Draw, screensaver is on or previewing") ); + // Graphics context to draw on. + CWindowGc& gc = SystemGc(); + + // Fix for error ESMG-74Y4PE - S60 3.2 wk26, Power Saver: + // Flickering when power saver is deactivated. + // We now clear the screen with a black brush so the screensaver + // background is changed to black. There will no longer be a white + // intermediate screen and this will reduce the "flicker" effect. + gc.SetBrushColor( KRgbBlack ); + + // Start with a clear screen + gc.Clear( aRect ); + // If there is no plugin module, indicator view overrides plugin module or + // plugin drawing is suspended then the standard screensaver bar is shown, + // let's draw it. + + DrawNew( gc, aRect ); + + // Activate power save display mode after draw, so that + // the image is already in screen buffer + ScreensaverUtility::FlushDrawBuffer(); + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Draw, draw finished") ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::SetMoving +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::SetMoving( TBool aMove ) + { + iMoveBar = aMove; + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::StartTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::StartTimer() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::StartTimer start") ); + Model().SharedDataInterface()->SetSSForcedLightsOn( ESSForceLightsOn ); + + StartCaptureScreenTimer(); + + StartBarRefreshTimer(); + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::StartTimer finish") ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::CancelTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::CancelTimer() + { + DeleteTimer( iBarRefreshTimer ); + DeleteTimer( iCaptureScreenTimer ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::ClearScreen +// Date & time saver +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::ClearScreen() + { + + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::Refresh +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::Refresh() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh start") ); + // Currently only keylock indicator is updated, because + // thats the only indicator whose state may change while screensaver + // is displaying. Other indicators' state changing also dismisses + // screensaver. Once redisplaying, the indicators are updated anyway. + // Key lock indicator depends on status of key guard. + TIndicatorPayload payload; + payload.iType = EPayloadTypeInteger; + + Array().SetDependencyStatus( ESsKeyLockInd, !Model().SharedDataInterface()->IsKeyguardOn() ); + payload.iInteger = Model().SharedDataInterface()->UnreadMessagesNumber(); + Array().SetIndicatorPayload( ESsNewMessagesInd, payload ); + Array().SetDependencyStatus( ESsNewMessagesInd, ( payload.iInteger <= 0 ) ); + Array().SetDependencyStatus( ESsVoicemailInd, !Model().SharedDataInterface()->IsHaveNewVoicemail() ); + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh move") ); + // Don't move bar during this refresh + SetMoving( EFalse ); + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh DrawObject") ); + // Cause a redraw + DrawObject(); + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh move") ); + // Allow moving + SetMoving(); + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::Refresh finish") ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::CScreensaverCtrlMovingText +// Date & time saver +// ----------------------------------------------------------------------------- +// +CScreensaverCtrlMovingText::CScreensaverCtrlMovingText( TDisplayObjectType aType ) + :iType( aType ) + { + // No implementation required + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::ConstructL() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::ConstructL start") ); + + if ( iType == EDisplayText ) + { + iPictoI = CAknPictographInterface::NewL( *this, *this ); + } + + iTop = KMinTop; + iRandSeed = RandomSeed(); + iMoveBar = ETrue; + + GetTextAndBgColor(); + + CreateWindowL(); + + // Cannot do this earlier - it'll cause a SizeChanged() + SetRect( iCoeEnv->ScreenDevice()->SizeInPixels() ); + + iEikonEnv->EikAppUi()->AddToStackL( + this, ECoeStackPriorityEnvironmentFilter, ECoeStackFlagRefusesFocus ); + ConstructAndConnectLCDL(); + ActivateL(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::DrawNew +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::DrawNew( CWindowGc& aGc, const TRect& /* aRect */) const + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::DrawNew start") ); + // Draw bar background + iLayoutBar.DrawRect( aGc ); + + // Draw clock + iLayoutClock.DrawRect( aGc ); + iLayoutClockText.DrawText( aGc, iTextTime ); + + // Draw date / user text + iLayoutDate.DrawRect( aGc ); + + DrawText( aGc ); + + // Draw indicators + Array().Draw( aGc ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::DrawPictoText +// Draws text with pictographs +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::DrawPictoText( CWindowGc &aGc ) const + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::DrawPictoText start") ); + // Draw text and possible pictographs + MAknPictographDrawer* pictoDrawer = iPictoI->Interface(); + ASSERT( pictoDrawer ); + + if ( ( !pictoDrawer ) || ( !pictoDrawer->ContainsPictographs( iText ) ) ) + { + // Just draw normally + iLayoutDateText.DrawText( aGc, iText ); + return; + } + + // Else draw normal text with pictographs + aGc.UseFont( iLayoutDateText.Font() ); + aGc.SetPenColor( iLayoutDateText.Color() ); + + // Calculating the offset (unfortunately not public in TAknLayoutText) + // copied from AknUtils TAknLayoutText::LayoutText() + pictoDrawer->DrawText( aGc, *iLayoutDateText.Font(), iText, + iLayoutDateText.TextRect(), iLayoutDateText.Font()->AscentInPixels(), + iLayoutDateText.Align() ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::DrawText +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::DrawText( CWindowGc& aGc ) const + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::DrawText start") ); + if ( iPictoI ) + { + // Draw text and pictographs in the layout + DrawPictoText( aGc ); + } + else + { + // Draw just text + iLayoutDateText.DrawText( aGc, iText ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::UpdateCurrentTimeL +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::UpdateCurrentTimeL() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::UpdateCurrentTimeL start") ); + // AVKON does not have proper format string for just time, + // load from own resources + FormatTextFromResourceL( iTextTime, R_SCREENSAVER_TIME_USUAL_WITHOUT_AMPM ); + + if ( iType == EDisplayTime ) + { + FormatTextFromResourceL( iText, R_QTN_DATE_USUAL_WITH_ZERO ); + } + else + { + Model().SharedDataInterface()->GetDisplayObjectText( iText ); + } + + SetAmPmIndicatorPayloadL(); + // Convert numbers according to language + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::GenerateDisplayAttributesForScreensaverBar +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::GenerateDisplayAttributesForScreensaverBar( ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GenerateDisplayAttributesForScreensaverBar start") ); + // Zero out power save area, it should then be set before power save + // mode can be activated (also by plugins) + iPowerSaveDisplayActiveArea.SetRect( 0, 0, 0, 0 ); + + // Cool! We got scalable layouts. Use them. + TAknWindowComponentLayout barLayoutComponent = + AknLayoutScalable_Avkon::power_save_pane(); + iLayoutBar.LayoutRect( Rect(), barLayoutComponent.LayoutLine() ); + + // Add bar height from layout to get total bar height + TInt barHeight = iLayoutBar.Rect().Height(); + + // Plain refresh, no move? + if ( iMoveBar ) + { + // Get random values for bar position and color. + GetRandomTopValue( iLayoutBar.Rect().Height() ); + } + + // Create a rect with the new top to be used as layout rect + TRect fakeScreen( Rect() ); + fakeScreen.iTl.iY = iTop; + + // Layout components + + // Bar itself + iLayoutBar.LayoutRect( fakeScreen, barLayoutComponent.LayoutLine() ); + TRect barRect = iLayoutBar.Rect(); + + // Clock (area + text) + GetClockLayout( barRect ); + + // Date (area + text) + GetDateLayout( barRect ); + + // Indicators (area + text) + GetIndicatorAreaLayout( barRect ); + + // Update current time + TRAP_IGNORE( UpdateCurrentTimeL() ); + + // Since it is known for sure at this point that screensaver + // bar will be drawn the partial mode can activated for bar area + // if it is supported by display hardware. + const TScreensaverColorModel& colorModel = Model().GetColorModel(); + + if ( colorModel.iNumberOfPartialModes > 0 ) + { + TRect psRect( iLayoutBar.Rect() ); + SetPowerSaveDisplayActiveArea( psRect ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::GetRandomTopValue +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::GetRandomTopValue( TInt aBarHight ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetRandomTopValue start") ); + TInt range( iCoeEnv->ScreenDevice()->SizeInPixels().iHeight - aBarHight - 1 - 4 ); + TInt rand = Math::Rand( iRandSeed ); + rand %= range; + iTop = ( rand > 3 ) ? ( rand/4 ) * 4 : 4; + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::RandomValue +// ----------------------------------------------------------------------------- +// +TInt CScreensaverCtrlMovingText::RandomSeed() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::RandomSeed start") ); + TTime time; + time.HomeTime(); + return time.DateTime().MicroSecond(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::GetTextAndBgColor +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::GetTextAndBgColor() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetTextAndBgColor start") ); + if( Model().SharedDataInterface()->IsInvertedColors() == KInvertedColors ) + { + iBgColor = KInvertedBgColor; + iTextColor = KInvertedTextColor; + iTextBgColor = KInvertedTextBgColor; + } + else + { + iBgColor = KBgColor; + iTextColor = KTextColor; + iTextBgColor = KTextBgColor; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::FormatTextL +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::FormatTextL( TDes& aText, const TDesC& aFormat ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::FormatTextL start") ); + TTime curTime; + curTime.HomeTime(); + // Since screensaver is updated on the minute, make sure it displays + // the time of the passing minute by adding a few seconds to the + // time at the moment of the update. + curTime += TTimeIntervalSeconds( 5 ); + + TRAPD( err, curTime.FormatL( aText, aFormat ) ); + if ( err != KErrNone ) + { + // If time can't be displayed then display an empty text + aText = KNullDesC; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::SetAmPmIndicatorPayload +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::SetAmPmIndicatorPayloadL() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::SetAmPmIndicatorPayloadL start") ); + _LIT(KAmPmFormat, "%*A"); + TBuf<10> textAmPm; + FormatTextL( textAmPm, KAmPmFormat ); + + TIndicatorPayload payload; + payload.iType = EPayloadTypeText; + payload.iText.Zero(); + payload.iText.Append( textAmPm ); + Array().SetIndicatorPayload( ESsAmPmInd, payload ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::FormatTextFromResourceL +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::FormatTextFromResourceL( TDes &aText, TInt aResourceId ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::FormatTextFromResourceL start") ); + TBuf<30> timeFormat; + iCoeEnv->ReadResourceL( timeFormat, aResourceId ); + FormatTextL( aText, timeFormat ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( aText ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::GetClockLayout +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::GetClockLayout( const TRect& aRect ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetClockLayout start") ); + TAknWindowComponentLayout clockarea = + AknLayoutScalable_Avkon::aid_ps_clock_pane( 0 ); + TAknWindowLineLayout clockline = clockarea.LayoutLine(); + clockline.iC = iBgColor; + iLayoutClock.LayoutRect( aRect, clockarea.LayoutLine() ); + + TAknTextComponentLayout clocktext = + AknLayoutScalable_Avkon::power_save_t2( 0 ); + clocktext.SetC( iTextColor ); + iLayoutClockText.LayoutText( aRect, clocktext.LayoutLine() ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::GetClockLayout +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::GetDateLayout( const TRect& aRect ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetDateLayout start") ); + TAknWindowComponentLayout datearea = + AknLayoutScalable_Avkon::power_save_pane_g1( 0 ); + TAknWindowLineLayout dateline = datearea.LayoutLine(); + dateline.iC = iTextBgColor; + iLayoutDate.LayoutRect( aRect, dateline ); + + TAknTextComponentLayout datetext = + AknLayoutScalable_Avkon::power_save_pane_t1( 0 ); + TAknTextLineLayout datetextline = datetext.LayoutLine(); + iLayoutDateText.LayoutText( aRect, datetextline ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::GetClockLayout +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::GetIndicatorAreaLayout( const TRect& aRect ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::GetIndicatorAreaLayout start") ); + TAknWindowComponentLayout indicatorarea = + AknLayoutScalable_Avkon::aid_ps_indicator_pane( 0 ); + TAknWindowLineLayout indicatorline = indicatorarea.LayoutLine(); + indicatorline.iC = iBgColor; + TAknLayoutRect layoutIndicatorArea; + layoutIndicatorArea.LayoutRect( aRect, indicatorline ); + + // Indicator texts + TAknTextComponentLayout indtext = + AknLayoutScalable_Avkon::power_save_pane_t4( 0 ); + TAknTextLineLayout indline = indtext.LayoutLine(); + TAknLayoutText layoutIndicatorText; + layoutIndicatorText.LayoutText( aRect, indline ); + + // Indicator icons + TAknWindowComponentLayout inds = + AknLayoutScalable_Avkon::indicator_ps_pane( 0 ); + TAknWindowLineLayout indsline = inds.LayoutLine(); + TAknLayoutRect layoutInds; + layoutInds.LayoutRect( aRect, indsline ); + + // Tell indicator array where to draw (this should be moved to + // the array itself) + Array().Setup( layoutIndicatorArea, layoutIndicatorText, layoutInds ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlMovingText::StartBarRefreshTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlMovingText::StartBarRefreshTimer() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlMovingText::StartBarRefreshTimer start") ); + DeleteTimer( iBarRefreshTimer ); + + TRAP_IGNORE( iBarRefreshTimer = CPeriodic::NewL( CActive::EPriorityStandard ) ); + + TInt initialRefreshRate = InitialRefreshRate(); + + iBarRefreshTimer->Start( initialRefreshRate, KRefreshRate, TCallBack( + HandleRefreshTimerExpiry, this ) ); + + SCRLOGGER_WRITEF( _L("SCR: BarRefreshTimer->Start(%d, %d, HandleRefreshTimerExpiry)"), + initialRefreshRate, KRefreshRate ); + } + +#endif //USE_DATE_AND_TEXT +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverctrlnone.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverctrlnone.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,195 @@ +/* +* Copyright (c) 2009 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: Implementation of screensaver none display object class. +* +*/ + + + +#include +#include + +#include "screensaverctrlnone.h" +#include "ScreensaverUtils.h" +#include "screensaverappui.h" +#include "screensavershareddatai.h" + +//the param to set the display off/on +const TInt KDisplayOff = 0; +const TInt KDisplayOn = 1; + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverCtrlNone* CScreensaverCtrlNone::NewL() + { + CScreensaverCtrlNone* self = new( ELeave ) CScreensaverCtrlNone(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::~CScreensaverCtrlNone +// ----------------------------------------------------------------------------- +// +CScreensaverCtrlNone::~CScreensaverCtrlNone() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::StartTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::StartTimer() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::CancelTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::CancelTimer() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::ClearScreen +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::ClearScreen() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlNone::ClearScreen start") ); + SwitchDisplayState( KDisplayOn ); + + SwitchLights( ESSForceLightsOn ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::Refresh +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::Refresh() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::DrawObject +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::DrawObject() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlNone::DrawObject start") ); + SwitchDisplayState( KDisplayOff ); + SwitchLights( ESSForceLightsOff ); + DrawNow(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::HandleResourceChange +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::HandleResourceChange(TInt aType) + { + if ( aType == KEikDynamicLayoutVariantSwitch )//&& iType != EDisplayNone) + { + // Screen layout has changed - resize + SetRect( iCoeEnv->ScreenDevice()->SizeInPixels() ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::SizeChanged +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::SizeChanged() + { + // Nothing to be implemented + } + +// --------------------------------------------------------------------------- +// CScreensaverCtrlNone::Draw +// --------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::Draw( const TRect& aRect ) const + { + if ( !Model().ScreenSaverIsOn() && !Model().ScreenSaverIsPreviewing() ) + { + return; + } + + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlNone::Draw, screensaver is on or previewing") ); + CWindowGc& gc = SystemGc(); + gc.SetBrushColor( KRgbBlack ); + gc.Clear( aRect ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::CScreensaverCtrlNone +// ----------------------------------------------------------------------------- +// +CScreensaverCtrlNone::CScreensaverCtrlNone() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::ConstructL() + { + CreateWindowL(); + SetRect( iCoeEnv->ScreenDevice()->SizeInPixels() ); + ActivateL(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::SwitchLights +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::SwitchLights( TInt aSecs ) + { + Model().SharedDataInterface()->SetSSForcedLightsOn( aSecs ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlNone::SwitchDisplayState +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlNone::SwitchDisplayState( TInt aState ) + { + SCRLOGGER_WRITEF(_L("SCR:CScreensaverCtrlNone::SwitchDisplayState start") ); + TInt currentState ; + //Get the current display state + TInt result = KErrNone; + TRAP_IGNORE( result = HAL::Get( HALData::EDisplayState, currentState ) ); + + if( KErrNone != result ) + { + //if can't get the state, revert to default type + View()->SetDisplayObject( + Model().SharedDataInterface()->DefaultScreensaverType() ); + return; + } + + if ( aState != currentState ) //display already on/off; nothing to do + { + TRAP_IGNORE( HAL::Set( HALData::EDisplayState, aState ) ); + } + } + + +//End of file diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverctrlplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverctrlplugin.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,679 @@ +/* +* Copyright (c) 2009 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: Implementation of screensaver plugin display object class. +* +*/ + + + +#include +#include + +#include "ScreensaverpluginIntDef.h" +#include "screensaverctrlplugin.h" +#include "screensaverview.h" +#include "screensaverappui.h" +#include "screensaverutility.h" +#include "ScreensaverUtils.h" +#include "screensavershareddatai.h" + +// If plugin refresh rate is lower than this threshold, wserv heartbeat +// is stopped between redraws +const TInt KStopWsHbPluginRefreshThreshold = 1000000; // 1 sec + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverCtrlPlugin* CScreensaverCtrlPlugin::NewL() + { + CScreensaverCtrlPlugin* self = new( ELeave ) CScreensaverCtrlPlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::~CScreensaverCtrlPlugin +// ----------------------------------------------------------------------------- +// +CScreensaverCtrlPlugin::~CScreensaverCtrlPlugin() + { + DeleteTimer( iPluginRefreshTimer ); + DeleteTimer( iPluginTimeoutTimer ); + DeletePlugin(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::StartTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::StartTimer() + { + // Notify plugin that screensaver is starting + Model().SharedDataInterface()->SetSSForcedLightsOn( ESSForceLightsOn ); + + SendPluginEvent( EScreensaverEventStarting ); + + + StartPluginRefreshTimer(); + + if ( RefreshTimerValue() >= KStopWsHbPluginRefreshThreshold ) + { + StartCaptureScreenTimer(); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::CancelTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::CancelTimer() + { + DeleteTimer( iPluginRefreshTimer ); + DeleteTimer( iPluginTimeoutTimer ); + + SendPluginEvent( EScreensaverEventStopping ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::DrawObject +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::DrawObject() + { + CScreensaverBase::DrawObject(); + + if( iPluginFlag.IsSet( EPluginFlagSuspend ) ) + { + Suspend( -1 ); + iPluginFlag.Clear( EPluginFlagSuspend ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::ClearScreen +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::ClearScreen() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::Refresh +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::Refresh() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlPlugin::Refresh start") ); + // Currently only keylock indicator is updated, because + // thats the only indicator whose state may change while screensaver + // is displaying. Other indicators' state changing also dismisses + // screensaver. Once redisplaying, the indicators are updated anyway. + // Key lock indicator depends on status of key guard. + TIndicatorPayload payload; + payload.iType = EPayloadTypeInteger; + + Array().SetDependencyStatus( ESsKeyLockInd, !Model().SharedDataInterface()->IsKeyguardOn() ); + payload.iInteger = Model().SharedDataInterface()->UnreadMessagesNumber(); + Array().SetIndicatorPayload( ESsNewMessagesInd, payload ); + Array().SetDependencyStatus( ESsNewMessagesInd, ( payload.iInteger <= 0 ) ); + Array().SetDependencyStatus( ESsVoicemailInd, !Model().SharedDataInterface()->IsHaveNewVoicemail() ); + + Array().SetVisibilityForIndicators(); + + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlPlugin::Refresh DrawObject") ); + // Cause a redraw + DrawObject(); + + SCRLOGGER_WRITEF( _L("SCR:CScreensaverCtrlPlugin::Refresh finish") ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::SendPluginEvent +// ----------------------------------------------------------------------------- +// +TInt CScreensaverCtrlPlugin::SendPluginEvent( TScreensaverEvent aEvent ) + { + if ( iPlugin ) + { + TRAPD( err, iPlugin->HandleScreensaverEventL( aEvent, NULL ) ); + return err; + } + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::PluginImplementationUid() +// --------------------------------------------------------------------------- +// +TUid CScreensaverCtrlPlugin::PluginImplementationUid() const + { + return iPluginImplUid; + } + +// From MScreensaverPluginHost +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::UseStandardIndicators +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::UseStandardIndicators() + { + SCRLOGGER_WRITE("Host: UseStandardIndicators()"); + + iPluginFlag.Clear( EPluginFlagOverrideIndicators ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::OverrideStandardIndicators +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::OverrideStandardIndicators() + { + SCRLOGGER_WRITE("Host: OverrideStandardIndicators()"); + + iPluginFlag.Set( EPluginFlagOverrideIndicators ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::StandardIndicatorsUsed +// ----------------------------------------------------------------------------- +// +TBool CScreensaverCtrlPlugin::StandardIndicatorsUsed() const + { + SCRLOGGER_WRITE("Host: StandardIndicatorsUsed()"); + + return iPluginFlag.IsClear( EPluginFlagOverrideIndicators ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::SetRefreshTimerValue +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::SetRefreshTimerValue( TInt aValue ) + { + SCRLOGGER_WRITEF( _L("SCR: Host: SetRefreshTimerValue(%d)"), aValue ); + + iPluginRefreshRate = aValue; + iPluginFlag.Clear( EPluginFlagTimerNotUsed ); + StartPluginRefreshTimer(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::RefreshTimerValue +// ----------------------------------------------------------------------------- +// +TInt CScreensaverCtrlPlugin::RefreshTimerValue() const + { + SCRLOGGER_WRITE("Host: RefreshTimerValue()"); + + return iPluginRefreshRate; + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::GetIndicatorPayload +// ----------------------------------------------------------------------------- +// +TInt CScreensaverCtrlPlugin::GetIndicatorPayload( + TScreensaverIndicatorIndex aIndex, TIndicatorPayload& aResult ) const + { + SCRLOGGER_WRITEF( _L("SCR: Host: GetIndicatorPayload(%d, %x)"), + aIndex, &aResult ); + + return Model().IndicatorArray().GetIndicatorPayload( ( TScreensaverIndicatorId ) aIndex, aResult ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::SetActiveDisplayArea +// ----------------------------------------------------------------------------- +// +TInt CScreensaverCtrlPlugin::SetActiveDisplayArea( + TRect& aRect, const TScreensaverPartialMode& aMode ) + { + SCRLOGGER_WRITEF( _L("SCR: Host: SetActiveDisplayArea(, %d)"), aMode ); + SCRLOGGER_WRITEF( _L(" -> rect: (%d, %d, %d, %d)"), + aRect.iTl.iX, aRect.iTl.iY, aRect.iBr.iX, aRect.iBr.iY ); + // Make sure everything is in display memory + ScreensaverUtility::FlushDrawBuffer(); + + // Save the active area + TInt err = SetPowerSaveDisplayActiveArea( aRect ); + if ( err == KErrNone ) + { + // And activate power save display. Full mode = full colors +// err = ActivatePowerSaveDisplay( aMode.iType +// == EPartialModeTypeFull ); + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::SetActiveDisplayArea +// ----------------------------------------------------------------------------- +// +TInt CScreensaverCtrlPlugin::SetActiveDisplayArea( + TInt aStartRow, TInt aEndRow, const TScreensaverPartialMode& aMode ) + { + SCRLOGGER_WRITEF( _L("SCR: Host: SetActiveDisplayArea(%d, %d, %d)"), + aStartRow, aEndRow, aMode ); + + TRect psRect( 0, aStartRow, 1, aEndRow); + return SetActiveDisplayArea( psRect, aMode ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::ExitPartialMode +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::ExitPartialMode() + { + SCRLOGGER_WRITE("Host: ExitPartialMode()"); + + LcdPartialMode()->Exit(); + // Make sure the partial area is empty + // Make this less idiotic + TRect psRect( 0, 0, 0, 0); + SetPowerSaveDisplayActiveArea( psRect ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::GetColorModel +// ----------------------------------------------------------------------------- +// +const TScreensaverColorModel& CScreensaverCtrlPlugin::GetColorModel() const + { + SCRLOGGER_WRITE("Host / Own use: GetColorModel()"); + + return Model().GetColorModel(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::Suspend +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::Suspend( TInt aTime ) + { + SCRLOGGER_WRITEF( _L("SCR: Host: Suspend(%d)"), aTime ); + + View()->SetDisplayObject( Model().SharedDataInterface()->DefaultScreensaverType() ); + + CScreensaverEngine& model = MUTABLE_CAST( CScreensaverEngine&, Model() ); + model.SetExpiryTimerTimeout( KDefaultScreenSaverTimeout ); + + View()->ShowDisplayObject(); + + if ( aTime >= 0 ) + { + model.StartSuspendTimer( aTime ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::RequestLights +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::RequestLights( TInt aSecs ) + { + SCRLOGGER_WRITEF( _L("SCR: Host: RequestLights(%d)"), aSecs ); + + if ( aSecs <= 0 ) + { + // Turn lights off, kill lights timer + Model().SharedDataInterface()->SetSSForcedLightsOn( 0 ); + } + else + { + // Make sure nobody tries to overextend our hospitality + TInt secs = (aSecs > KMaxLightsOnTime) ? KMaxLightsOnTime : aSecs; + + // Turn lights on, start lights timer + Model().SharedDataInterface()->SetSSForcedLightsOn( secs ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::DisplayInfo +// ----------------------------------------------------------------------------- +// +TInt CScreensaverCtrlPlugin::DisplayInfo( TScreensaverDisplayInfo* aInfo ) + { + SCRLOGGER_WRITEF( _L("SCR: Host: DisplayInfo(%x)"), aInfo ); + + if ( !aInfo ) + { + return KErrArgument; + } + // Sanity check: the indicated size of the info struct should be + // same or less than the actual size (allows for extensibility) + if ( aInfo->iSize > sizeof( TScreensaverDisplayInfo ) ) + { + ASSERT( EFalse ); + return KErrArgument; + } + + // Fill our own perception of the info structure + TScreensaverDisplayInfo info; + + info.iSize = aInfo->iSize; + + // Currently whole screen + info.iRect = CCoeEnv::Static()->ScreenDevice()->SizeInPixels(); + info.iParent = this; + + // Copy only the size of the caller struct + Mem::Copy( aInfo, &info, aInfo->iSize ); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::UseRefreshTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::UseRefreshTimer( TBool aOn ) + { + SCRLOGGER_WRITEF( _L("SCR: Host: UseRefreshTimer(%d)"), aOn ); + + if ( aOn ) + { + // Use normal timer, plugin timer allowed + iPluginFlag.Clear( EPluginFlagTimerNotUsed ); + } + else + { + // Plugin does not want Draw() calls, let timer tick the usual way + iPluginFlag.Set( EPluginFlagTimerNotUsed ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::RequestTimeout +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::RequestTimeout( TInt aSecs ) + { + CScreensaverEngine& model = MUTABLE_CAST( CScreensaverEngine&, Model() ); + model.SetExpiryTimerTimeout( 0 ); + StartPluginTimeoutTimer( aSecs ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::RevertToDefaultSaver +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::RevertToDefaultSaver() + { + SCRLOGGER_WRITE("Host: RevertToDefaultSaver()"); + + Model().SharedDataInterface()->SetDisplayObjectType( + Model().SharedDataInterface()->DefaultScreensaverType() ); + } + +// --- end MScreensaverPluginHost --- + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::CScreensaverCtrlPlugin +// ----------------------------------------------------------------------------- +// +CScreensaverCtrlPlugin::CScreensaverCtrlPlugin() + :iPluginFlag() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::ConstructL() + { + iPluginFlag.ClearAll(); + + + CreateWindowL(); + + SetRect( iCoeEnv->ScreenDevice()->SizeInPixels() ); + ConstructAndConnectLCDL(); + LoadPluginL( this ); + ActivateL(); + + // Notify plugin that display control has changed + SendPluginEvent( EScreensaverEventDisplayChanged ); + + if( Model().ScreenSaverIsPreviewing() ) + { + SendPluginEvent( EScreensaverEventPreview ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::HandleResourceChange +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::HandleResourceChange( TInt aType ) + { + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + // Screen layout has changed - resize + SetRect( iCoeEnv->ScreenDevice()->SizeInPixels() ); + // Notify plugin that the display has changed + SendPluginEvent( EScreensaverEventDisplayChanged ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::SizeChanged +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::SizeChanged() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::Draw +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::Draw( const TRect& /*aRect*/ ) const + { + + if ( !Model().ScreenSaverIsOn() && !Model().ScreenSaverIsPreviewing() ) + { + return; + } + + // Graphics context to draw on. + CWindowGc& gc = SystemGc(); + + // Fix for error ESMG-74Y4PE - S60 3.2 wk26, Power Saver: + // Flickering when power saver is deactivated. + // We now clear the screen with a black brush so the screensaver + // background is changed to black. There will no longer be a white + // intermediate screen and this will reduce the "flicker" effect. + gc.SetBrushColor( KRgbBlack ); + + // Start with a clear screen + // If there is no plugin module, indicator view overrides plugin module or + // plugin drawing is suspended then the standard screensaver bar is shown, + // let's draw it. + + // Let plugin module handle the drawing, unless not requested + + TInt err = KErrNone; + if ( iPluginFlag.IsClear( EPluginFlagTimerNotUsed ) ) + { + err = iPlugin->Draw( gc ); + } + //Notice:add this code to shield the issue ELWG-7SF3R3. + //Prevent screensaver plugin from being called unexpected draw function, + //which would cause chosen images are not displayed. + //Check the err code return by iPlugin->Draw: + //If draw action is correct and iPluginFlag has already been set EPluginFlagSuspend, + //then clear this EPluginFlagSuspend + if ( KErrNone == err && iPluginFlag.IsSet( EPluginFlagSuspend ) ) + { + iPluginFlag.Clear( EPluginFlagSuspend ); + } + + if( err != KErrNone ) + { + iPluginFlag.Set( EPluginFlagSuspend ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::LoadPluginL +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::LoadPluginL( MScreensaverPluginHost* /*aPluginHost*/ ) + { + DeletePlugin(); + LoadPluginModuleL(); + User::LeaveIfNull( iPlugin ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::LoadPluginModule +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::LoadPluginModuleL() + { + TFileName pluginName; + + Model().SharedDataInterface()->GetPluginName( pluginName ); + + // Create plugin object in the DLL + // Convert the UID of the given screensaver plugin from text to integer + // The string format of the UID: [12345678] + // The number inside the brackets in hexadecimal format + TLex lex( pluginName ); + + // Skip the first character: '[' + lex.Get(); + + TUint32 tempUid; + + // Get the UID + TInt err = lex.Val( tempUid, EHex ); + + // Bail out, if the UID is not parseable + if ( err != KErrNone ) + { + iPlugin = NULL; + } + + iPluginImplUid = TUid::Uid( tempUid ); + //codescanner will crib if leaving function inside trap is called + //after line break within the macro. Hence the following trap call + //is made in a single line + TRAP(err, iPlugin = STATIC_CAST( MScreensaverPlugin*, + CScreensaverPluginInterfaceDefinition::NewL( iPluginImplUid ) ) ); + + if( err != KErrNone ) + return; + + TRAP( err, err = iPlugin->InitializeL( this ) ); + + if( err != KErrNone ) + { + // Loaded OK, but failed to initialize - cannot use plugin + TBool changed = Model().SharedDataInterface()->GetDisplayObjChanged(); + if( !changed ) + { + //Just activate the screensaver revert to defaultsaver + RevertToDefaultSaver(); + } + Model().SharedDataInterface()->SetDisplayObjChanged( EFalse ); + delete iPlugin; + iPlugin = NULL; + } + + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::DeletePlugin +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::DeletePlugin() + { + if( iPlugin ) + { + delete iPlugin; + iPlugin = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::StartPluginRefreshTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::StartPluginRefreshTimer() + { + DeleteTimer( iPluginRefreshTimer ); + + if( ( iPluginRefreshRate != 0 ) ) + { + TRAP_IGNORE( iPluginRefreshTimer = CPeriodic::NewL( CActive::EPriorityStandard ) ); + + iPluginRefreshTimer->Start( iPluginRefreshRate, iPluginRefreshRate, + TCallBack( HandleRefreshTimerExpiry, this ) ); + SCRLOGGER_WRITEF( _L("SCR: iRefreshTimer->Start(%d, %d, HandleRefreshTimerExpiry)"), + iPluginRefreshRate,iPluginRefreshRate ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::StartPluginTimeoutTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverCtrlPlugin::StartPluginTimeoutTimer( TInt aSecs ) + { + // Cancel pending timeouts + DeleteTimer( iPluginTimeoutTimer ); + + TRAP_IGNORE( iPluginTimeoutTimer = CPeriodic::NewL( CActive::EPriorityStandard ) ); + + // Nothing more to do? + if( ( aSecs <= 0 ) || ( aSecs > ( 35 * 60 ) ) ) // 35 mins max + { + return; + } + + TInt timeOut = aSecs * 1000000; // uSecs + + iPluginTimeoutTimer->Start( timeOut, timeOut, TCallBack( + HandlePluginTimeoutTimerExpiry, this ) ); + SCRLOGGER_WRITEF( _L("SCR: iPluginTimeoutTimer->Start(%d, %d, HandlePluginTimeoutTimerTimeout)"), + timeOut, timeOut ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverCtrlPlugin::HandlePluginTimeoutTimerExpiry +// ----------------------------------------------------------------------------- +// +TInt CScreensaverCtrlPlugin::HandlePluginTimeoutTimerExpiry( TAny* aPtr ) + { + CScreensaverCtrlPlugin *plugin= STATIC_CAST( CScreensaverCtrlPlugin*, aPtr ); + SCRLOGGER_WRITEF( _L("SCR: Inside CScreensaverView::HandlePluginTimeoutTimerTimeout()") ); + if ( plugin ) + { + plugin->DeleteTimer( plugin->iPluginRefreshTimer ); + plugin->DeleteTimer( plugin->iPluginTimeoutTimer ); + plugin->SendPluginEvent( EScreensaverEventTimeout ); + } + + return KErrNone; + } +//End of file diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverengine.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,897 @@ +/* +* Copyright (c) 2003 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: Screensaver engine class definition. +* +*/ + + + +#include +#include +#include +#include +#include +#include + +#include "screensaverengine.h" +#include "screensaverctrlmovingtext.h" +#include "screensavershareddatai.h" +#include "screensavershareddatamonitor.h" +#include "screensaverappui.h" +#include "ScreensaverUtils.h" +#include "screensaverutility.h" +#include "screensaveractivitymanager.h" + +// Minimum plugin suspension time +const TInt KMinPluginSuspensionTime = 500000; // 0.5 sec + +// Inactivity timeout in seconds when keys locked +const TInt KTimeoutShort = 5000000; +const TInt KTimeoutPreviewLocked = 2000000; + +const TInt KNoPreview = 0; + +const TInt KPreviewTimeout = 10000000; // 10 sec + +const TText KSilentProfileInd= KPuaCodeSilentSymbol; +const TText KSilentVibraInd= KPuaCodeAprofSilentVibra; +const TText KSoundVibraInd= KPuaCodeAprofSoundVibra; +const TText KSoundInd= KPuaCodeAprofSound; + +// Class CScreensaverEngine + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverEngine* CScreensaverEngine::NewL() + { + CScreensaverEngine* self = new (ELeave) CScreensaverEngine(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::~CScreensaverEngine +// ----------------------------------------------------------------------------- +// +CScreensaverEngine::~CScreensaverEngine( ) + { + iAsyncCb.Cancel(); + StopActivityMonitoring( iActivityManagerScreensaver ); + DisableSharedDataAndMonitor(); + delete iIndicatorArray; + KillTimer( iPreviewTimer ); + KillTimer( iExpiryTimer ); + iAknUiServer.Close(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::SharedDataInterface +// ----------------------------------------------------------------------------- +// +CScreensaverSharedDataI* CScreensaverEngine::SharedDataInterface( ) const + { + return iSharedDataI; + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::ResetInactivityTimeout +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::ResetInactivityTimeout() + { + if ( iActivityManagerScreensaver ) + { + SCRLOGGER_WRITEF(_L("SCR: Model: Setting inac timeout to %d secs"), + Timeout()); + iActivityManagerScreensaver->SetInactivityTimeout( Timeout( ) ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::ScreenSaverIsOn +// ----------------------------------------------------------------------------- +// +TBool CScreensaverEngine::ScreenSaverIsOn( ) const + { + return iScreenSaverIsOn; + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::ScreenSaverIsPreviewing +// ----------------------------------------------------------------------------- +// +TBool CScreensaverEngine::ScreenSaverIsPreviewing( ) const + { + return iScreenSaverIsPreviewing; + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::StartScreenSaver +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::StartScreenSaver( ) + { + SCRLOGGER_WRITE("Model: StartScreenSaver()"); + + // Stop if previewing. If keylock was activated, the pause timer will + // be started and the selected (not necessarily previewed) screensaver + // will start + if ( iScreenSaverIsPreviewing ) + { + StopScreenSaver(); + return; + } + + // if (DisplayFlag() == 1) then screensaver can be activated + // else screensaver can't come during phone call. + // Also not OK to start until system startup has been completed + if ( ( !DisplayFlag() ) && ( iSharedDataI->IsSystemStartupComplete() ) ) + { + if ( !iScreenSaverIsOn ) + { + // Activating is done asynchronously to prevent screensaver from + // flashing quickly in some cases. This flashing happens e.g. when + // a call is missed and a note is showed about it. + iAsyncCb.CallBack(); + } + else + { + SCRLOGGER_WRITE("Model: StartScreenSaver(): already on, ignore"); + } + } + else + { + SCRLOGGER_WRITE("Model: SS not displaying, not allowed."); + ResetInactivityTimeout( ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::StopScreenSaver +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::StopScreenSaver() + { + SCRLOGGER_WRITE("Stopping Screensaver"); + iAsyncCb.Cancel(); + + if ( iSharedDataI->IsKeyguardOn() || iScreenSaverIsPreviewing ) + { + StartPauseTimer(); + } + + if( iScreenSaverIsOn ) + { + // disconnect in StopScreenSaver, It makes sure other applications could + // receive application key event when screensaver is disactivated. + iAknUiServer.ConnectAndSendAppsKeySuppress(EFalse); + // Indicate we've stopped + iSharedDataI->SetScreensaverStatus( EFalse ); + + iScreenSaverIsOn = EFalse ; + + KillTimer( iExpiryTimer ); + + View()->HideDisplayObject(); + } + + if( iScreenSaverIsPreviewing ) + { + iSharedDataI->SetScreensaverPreviewMode( KNoPreview ); + + iScreenSaverIsPreviewing = EFalse; + + View()->HideDisplayObject(); + + // Update preview progress + iSharedDataI->SetScreensaverPreviewState( EScreenSaverPreviewEnd ); + iSharedDataI->SetScreensaverPreviewState( EScreenSaverPreviewNone ); + + KillTimer( iPreviewTimer ); + ResetInactivityTimeout(); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::StartPreviewModeL +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::StartPreviewModeL( ) + { + SCRLOGGER_WRITEF(_L("SCR: Inside CScreensaverEngine::StartPreviewModeL()") ); + + iScreenSaverIsPreviewing = ETrue; + // Change the display object into what's being previewed + View()->CreatePreviewDisplayObjectL(); + + if( iSharedDataI->ScreensaverPreviewState() == EScreenSaverPreviewError ) + { + iScreenSaverIsPreviewing = EFalse; + return; + } + + StartPreviewTimer(); + + UpdateIndicatorAttributes(); + + if ( !View()->IsContentlessScreensaver() ) + { + ScreensaverUtility::BringToForeground(); + } + + View()->ShowDisplayObject(); + + iSharedDataI->SetScreensaverPreviewState( EScreenSaverPreviewStart ); + + iActivityManagerScreensaver->SetInactivityTimeout(0); + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::DisplayObject +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::DisplayObject() + { + SCRLOGGER_WRITEF(_L("SCR: Inside CScreensaverEngine::DisplayObject()") ); + //if the display object type is plugin, we should recreate the object + //cause when plugin is suspend status, it will be changed to the default + //type + if ( iSharedDataI->DisplayObjectType() == EDisplayPlugin ) + { + View()->SetDisplayObject( EDisplayPlugin ); + SetExpiryTimerTimeout( KDefaultScreenSaverTimeout ); + } + + UpdateIndicatorAttributes(); + + View()->ShowDisplayObject(); + + iSharedDataI->SetScreensaverStatus( ETrue ); + } + +// ---------------------------------------------------------------------------- +// CScreensaverEngine::StartSuspendTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::StartSuspendTimer( TInt aSec ) + { + KillTimer( iSuspendTimer ); + + // Let's keep this operation reasonable. + TInt realTime = ( aSec > KMinPluginSuspensionTime ) + ? aSec : KMinPluginSuspensionTime; + + TRAP_IGNORE( iSuspendTimer = CPeriodic::NewL( CActive::EPriorityStandard ) ); + + iSuspendTimer->Start( realTime, realTime, TCallBack( + HandleSuspendTimerExpiry, this ) ); + + SCRLOGGER_WRITEF(_L("SCR: iSuspendTimer->Start(%d, %d, HandleSuspensionTimerTimeout)"), + realTime, realTime); + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::IndicatorArray +// ----------------------------------------------------------------------------- +// +CScreensaverIndicatorArray& CScreensaverEngine::IndicatorArray() const + { + return *iIndicatorArray; + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::GetColorModel +// ----------------------------------------------------------------------------- +// +const TScreensaverColorModel& CScreensaverEngine::GetColorModel() const + { + SCRLOGGER_WRITE("Host / Own use: GetColorModel()"); + + return iColorModel; + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::AddPartialModeLevel +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::AddPartialModeLevel( TInt aBpp, + TScreensaverPartialModeType aType ) + { + TInt i; + for (i = 0; i < iColorModel.iNumberOfPartialModes; i++ ) + { + if ( (iColorModel.iPartialModes[i].iBpp == aBpp) + && (iColorModel.iPartialModes[i].iType == aType) ) + { + break; + } + } + if ( i >= iColorModel.iNumberOfPartialModes ) + { + iColorModel.iPartialModes[iColorModel.iNumberOfPartialModes].iBpp + = aBpp; + iColorModel.iPartialModes[iColorModel.iNumberOfPartialModes].iType + = aType; + iColorModel.iNumberOfPartialModes++; + } + } + + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::UpdateIndicatorAttributes +// This method is for updating screensaver indicator +// attributes (payloads and dependencies). This is where indicator +// payload values are connected to real values. +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::UpdateIndicatorAttributes() + { + SCRLOGGER_WRITEF(_L("SCR: Inside CScreensaverView::UpdateIndicatorAttributes()")); + + TIndicatorPayload payload; + + // First integer types. + payload.iType = EPayloadTypeInteger; + + // Missed calls. + payload.iInteger = iSharedDataI->NewMissedCalls(); + iIndicatorArray->SetIndicatorPayload( ESsMissedCallsInd, payload ); + // Missed calls indicator depends on status of new contacts note. + iIndicatorArray->SetDependencyStatus( ESsMissedCallsInd, + !iSharedDataI->IsNCNActive() ); + + // Unread messages + payload.iInteger = iSharedDataI->UnreadMessagesNumber(); + iIndicatorArray->SetIndicatorPayload( ESsNewMessagesInd, payload ); + iIndicatorArray->SetDependencyStatus( ESsNewMessagesInd, (payload.iInteger > 0 + ? EFalse : ETrue) ); + + // Then string types. + payload.iType = EPayloadTypeText; + + // Profile information + TBool nameDisplayed = (iSharedDataI->ActiveProfile() == EProfileGeneralId) ? EFalse : ETrue; + TBool isSilent = iSharedDataI->IsSilentMode(); + payload.iText.Zero( ); + + if ( nameDisplayed || isSilent || iShowExtendedProfileInd ) + { + // append alert type indicator + if ( iShowExtendedProfileInd ) + { + TBool isVibra = iSharedDataI->IsVibraMode( ); + if ( isSilent ) + { + payload.iText.Append( isVibra ? KSilentVibraInd + : KSilentProfileInd ); + } + else + { + payload.iText.Append( isVibra ? KSoundVibraInd : KSoundInd ); + } + } + else + { + // Check if this is silent mode and we have to add indicator + // character to string. + if ( isSilent ) + { + payload.iText.Append( KSilentProfileInd ); + } + } + + if ( nameDisplayed ) + { + const TDesC& profile = iSharedDataI->ProfileName( ); + // Don't panic if profile name is too long, 'less than' ensures + // the 1 free space used for silent/vibra + if ( profile.Length( ) < KMaxPayloadTextLength ) + { + // append profile name + payload.iText.Append( profile ); + } + } + + // Profile indicator shown + iIndicatorArray->SetDependencyStatus( ESsProfileInd, EFalse ); + } + else + { + // Profile indicator not shown + iIndicatorArray->SetDependencyStatus( ESsProfileInd, ETrue ); + } + + iIndicatorArray->SetIndicatorPayload( ESsProfileInd, payload ); + + // AM/PM indicator is text but it is updated with every draw + // in screensaver control, so that it changes properly even if + // time rolls over between draws. Note that Am/Pm information is + // maintained by screensaver display object, not shareddatainterface. + if ( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + // Am/Pm indicator depends on 12-hour clock + iIndicatorArray->SetDependencyStatus( ESsAmPmInd, !ScreensaverUtility::Query12HourClock( ) ); + } + else + { + // Make sure it's not shown + iIndicatorArray->SetDependencyStatus( ESsAmPmInd, ETrue ); + } + + + // Key lock indicator depends on status of key guard. + iIndicatorArray->SetDependencyStatus( ESsKeyLockInd, !iSharedDataI->IsKeyguardOn() ); + + // Instant messaging indicator depends on existence of unseen IMs + iIndicatorArray->SetDependencyStatus( ESsImInd, !iSharedDataI->IsHaveNewInstantMessages() ); + + // Mail indicator depends on existence of unseen mails + iIndicatorArray->SetDependencyStatus( ESsMailInd, !iSharedDataI->IsHaveNewEmail() ); + + // Voicemail indicator depends on existence of unseen voicemail messages + iIndicatorArray->SetDependencyStatus( ESsVoicemailInd, !iSharedDataI->IsHaveNewVoicemail() ); + + //Set visibility for indicators if selected screensaver is a plugin + //which overides standard indicators + //TODO: Convert the iControlType to the iSettingType +// if ( (iSharedDataI->ScreensaverObjectType() == EDisplayPlugin ) && +// ( AppUi()->ScreensaverView()->PluginFlags() & CScreensaverView::EPluginFlagOverrideIndicators ) ) +// { + iIndicatorArray->SetVisibilityForIndicators(); +// } + } + + +// ----------------------------------------------------------------------------- +// Start screensaver expiry timer. When the timer expires the screensaver will +// be stopped and hided. +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::SetExpiryTimerTimeout( TInt aTimeout ) + { + SCRLOGGER_WRITEF( _L( "SCR:CScreensaverEngine::SetExpiryTimerTimeout(%d) start" ), aTimeout ); + KillTimer( iExpiryTimer ); + + if ( 0 < aTimeout ) + { + TRAP_IGNORE( + iExpiryTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + iExpiryTimer->Start( aTimeout , aTimeout , + TCallBack( HandleExpiryTimerExpiry, this ) ); + ) + } + } + + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::CScreensaverEngine +// ----------------------------------------------------------------------------- +// +CScreensaverEngine::CScreensaverEngine() : iAsyncCb( CActive::EPriorityLow ) + { + TCallBack callbackFunc( StartSaverCb, this ); + iAsyncCb.Set( callbackFunc ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::ConstructL( ) + { + SetupColorModelL(); + + EnableSharedDataAndMonitorL(); + + iIndicatorArray = CScreensaverIndicatorArray::NewL( iSharedDataI->IsInvertedColors() ); + + StartActivityMonitoringL(); + + FeatureManager::InitializeLibL(); + iShowExtendedProfileInd + = FeatureManager::FeatureSupported( KFeatureIdProtocolCdma ); + FeatureManager::UnInitializeLib(); + + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::EnableSharedDataAndMonitorL +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::EnableSharedDataAndMonitorL() + { + iSharedDataI = CScreensaverSharedDataI::NewL(); + + iSharedDataMonitor = CScreensaverSharedDataMonitor::NewL( iSharedDataI ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::DisableSharedDataAndMonitor +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::DisableSharedDataAndMonitor( ) + { + delete iSharedDataMonitor; + iSharedDataMonitor = NULL; + + delete iSharedDataI; + iSharedDataI = NULL; + + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::StartActivityMonitoringL +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::StartActivityMonitoringL( ) + { + // Actually screensaver is the last exe to be launch at the startup, + // so when it is being launched the elapsed time(User::InactivityTime()) + // is greater than the interval (15 sec) which screensaver pass to start + // activitymanager for inactivitycallback. + // So it has to do to reset inactivitytime (User::ResetInactivityTime() ) + // once in the screensaver constructor so that the inactivity callback + // called after the interval time expired. + User::ResetInactivityTime(); + + // Start monitoring activity for screensaver + iActivityManagerScreensaver + = CScreensaverActivityManager::NewL( CActive::EPriorityUserInput ); + iActivityManagerScreensaver->Start( Timeout(), + TCallBack( HandleInactiveEventL,this ), + TCallBack( HandleActiveEventL, this ) ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::StopActivityMonitoring +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::StopActivityMonitoring( CScreensaverActivityManager*& aActivityManager ) + { + if ( aActivityManager ) + { + aActivityManager->Cancel(); + delete aActivityManager; + aActivityManager = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::SetupColorModelL +// THIS IS TEMPORARY VERSION OF SetupColorModelL function. It is used until +// new version of LcdPartialMode module is integrated. +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::SetupColorModelL() + { + SCRLOGGER_WRITEF(_L("SCR: Inside CScreensaverEngine::SetupColorModelL()") ); + TResourceReader reader; + TInt i, ctmp; + + TInt suggestedDrawingMode; + + CEikonEnv::Static()->CreateResourceReaderLC( reader, R_SCREENSAVER_COLOR_MODEL ); + suggestedDrawingMode = reader.ReadInt32( ); + + // + // Let's find out how many partial modes hardware + // actually supports. + // + AddPartialModeLevel( (TInt)3, + (TScreensaverPartialModeType)EPartialModeTypeMostPowerSaving ); + AddPartialModeLevel( (TInt)3, + (TScreensaverPartialModeType)EPartialModeTypeDefault ); + AddPartialModeLevel( (TInt)16, + (TScreensaverPartialModeType)EPartialModeTypeFull ); + + if ( suggestedDrawingMode == ESsColorModel3BitMode ) + { + // This can always be done, just set default partial mode to + // most power saving. First try 'most power saving' and if not supported + // then try default. if default isn't supported leave with error code. + iColorModel.iSystemPartialMode.iBpp = 3; + iColorModel.iSystemPartialMode.iType + = EPartialModeTypeMostPowerSaving; + } + + // Read color indices for 3-bit mode. + reader.Read( iColorModel.iColors, 8 * sizeof(TInt16) ); + + // Read rgb values for gradient effect. + for (i = 0; i < 6; i++ ) + { + ctmp = reader.ReadInt32( ); + iColorModel.iDarkGradient[i] = TRgb( ctmp ); + } + + for (i = 0; i < 6; i++ ) + { + ctmp = reader.ReadInt32( ); + iColorModel.iLightGradient[i] = TRgb( ctmp ); + } + + CleanupStack::PopAndDestroy( ); // reader + } + +// ---------------------------------------------------------------------------- +// CScreensaverEngine::StartPreviewTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::StartPreviewTimer() + { + SCRLOGGER_WRITEF(_L("SCR: Inside CScreensaverEngine::StartPreviewTimer()") ); + + KillTimer( iPreviewTimer ); + + TRAP_IGNORE( iPreviewTimer = CPeriodic::NewL( CActive::EPriorityHigh ) ); + + iPreviewTimer->Start( KPreviewTimeout, KPreviewTimeout, TCallBack( + HandlePreviewTimerExpiry, this ) ); + + SCRLOGGER_WRITEF(_L("SCR: iPreviewTimer->Start(%d, %d, HandlePreviewTimerTimeout)"), + KPreviewTimeout,KPreviewTimeout); + } + +// ---------------------------------------------------------------------------- +// CScreensaverEngine::StartPauseTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::StartPauseTimer() + { + if ( iScreenSaverIsPreviewing ) + { + iPauseTimerStartedAfterPreview = ETrue; + } + + TInt timeout = ( iScreenSaverIsPreviewing )? KTimeoutPreviewLocked : + KTimeoutShort; + + KillTimer( iPauseTimer ); + + TRAP_IGNORE( iPauseTimer = CPeriodic::NewL( CActive::EPriorityHigh ) ); + + if ( !iPauseTimer ) + { + HandlePauseTimerExpiry( this ); + return; + } + + iPauseTimer->Start( timeout, timeout, TCallBack( + HandlePauseTimerExpiry, this ) ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::KillTimer +// Stops and deletes a timer +// ----------------------------------------------------------------------------- +// +void CScreensaverEngine::KillTimer( CPeriodic*& aTimer ) + { + if ( aTimer ) + { + aTimer->Cancel( ); + delete aTimer; + aTimer = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::HandlePreviewTimerExpiry +// ----------------------------------------------------------------------------- +// +TInt CScreensaverEngine::HandlePreviewTimerExpiry( TAny* aPtr ) + { + CScreensaverEngine* Engine = STATIC_CAST(CScreensaverEngine*, aPtr); + SCRLOGGER_WRITEF(_L("SCR: Inside CScreensaverView::HandlePreviewTimerTimeout()")); + + Engine->KillTimer( Engine->iPreviewTimer ); + Engine->StopScreenSaver(); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CScreensaverEngine::HandlePauseTimerExpiry +// --------------------------------------------------------------------------- +// +TInt CScreensaverEngine::HandlePauseTimerExpiry( TAny* aPtr ) + { + CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); + _this->KillTimer( _this->iPauseTimer ); + _this->iPauseTimerStartedAfterPreview = EFalse; + + if ( _this->iSharedDataI->IsKeyguardOn() ) + { + SCRLOGGER_WRITE("HandleInactiveEventShortL() starting saver"); + _this->StartScreenSaver( ); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::HandleActiveEventL +// ----------------------------------------------------------------------------- +// +TInt CScreensaverEngine::HandleActiveEventL( TAny* aPtr ) + { + SCRLOGGER_WRITE("HandleActiveEventL(), stop if previewing"); + CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); + if ( !_this->iSharedDataI->IsKeyguardOn() ) + { + _this->StopScreenSaver(); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::HandleInactiveEventL +// ----------------------------------------------------------------------------- +// +TInt CScreensaverEngine::HandleInactiveEventL( TAny* aPtr ) + { + SCRLOGGER_WRITE("HandleInactiveEventL(), starting screensaver"); + + CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); + // Inactivity is detected immediately when preview starts + if ( _this->iScreenSaverIsPreviewing ) + { + _this->ResetInactivityTimeout(); + return KErrNone; + } + // Double-start is OK, it will be checked in StartScreenSaver() + // This will be trigged by keylock activation after keyguard + // timeout, or if keylock is disabled + if ( !_this->iSharedDataI->IsOngoingCall() ) + { + _this->StartScreenSaver( ); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::HandleSuspendTimerExpiry +// ----------------------------------------------------------------------------- +// +TInt CScreensaverEngine::HandleSuspendTimerExpiry( TAny* aPtr ) + { + CScreensaverEngine* control= STATIC_CAST(CScreensaverEngine*, aPtr); + SCRLOGGER_WRITEF(_L("SCR: Inside CScreensaverEngine::HandleSuspendTimerExpiry()")); + + control->KillTimer( control->iSuspendTimer ); + + control->View()->SetDisplayObject( EDisplayPlugin ); + control->View()->ShowDisplayObject(); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CScreensaverEngine::HandleKeyguardStateChanged +// --------------------------------------------------------------------------- +// +void CScreensaverEngine::HandleKeyguardStateChanged( TBool aEnabled ) + { + if ( aEnabled ) + { + // Keys locked - if screensaver is running, this was caused by + // automatic keyguard and screensaver should refresh the view + // to show the keylock indicator + if ( iScreenSaverIsOn && !iScreenSaverIsPreviewing ) + { + View()->UpdateAndRefresh(); + } + if ( !( iPauseTimerStartedAfterPreview && + iPauseTimer && iPauseTimer->IsActive() ) ) + { + StartScreenSaver(); + } + } + else + { + StopScreenSaver(); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::View +// ----------------------------------------------------------------------------- +// +CScreensaverView* CScreensaverEngine::View() const + { + return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->ScreensaverView(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::Timeout +// ----------------------------------------------------------------------------- +// +TInt CScreensaverEngine::Timeout( ) + { + return iSharedDataI->ScreensaverTimeout( ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverEngine::DisplayFlag +// ----------------------------------------------------------------------------- +// +TInt CScreensaverEngine::DisplayFlag( ) + { + return iSharedDataI->IsScreenSaverAllowed(); + } + + +// ----------------------------------------------------------------------------- +// Handles expire timer timeout +// ----------------------------------------------------------------------------- +// +TInt CScreensaverEngine::HandleExpiryTimerExpiry( TAny* aPtr ) + { + SCRLOGGER_WRITEF( _L( "SCR:CScreensaverEngine::HandleExpiryTimerExpiry(%d) start" ), aPtr ); + CScreensaverEngine *control = STATIC_CAST( CScreensaverEngine*, aPtr ); + + if ( control ) + { + control->KillTimer( control->iExpiryTimer ); + // Revert to default screensaver. + control->View()->SetDisplayObject( + control->SharedDataInterface()->DefaultScreensaverType() ); + control->View()->ShowDisplayObject(); + } + + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// Callback to do the screensaver starting. +// --------------------------------------------------------------------------- +// +TInt CScreensaverEngine::StartSaverCb( TAny* aPtr ) + { + CScreensaverEngine* self = static_cast( aPtr ); + // connect in StartScreenSaver, intercept and capture application + // key event. It makes sure this event will not be received + // by other applictions when screensaver is activated. + self->iAknUiServer.ConnectAndSendAppsKeySuppress(ETrue); + self->iScreenSaverIsOn = ETrue; + + // Report whether started from Idle BEFORE bringing to foreground + self->iSharedDataI->SetSSStartedFromIdleStatus(); + + if ( !self->View()->IsContentlessScreensaver() ) + { + ScreensaverUtility::BringToForeground(); + } + + SCRLOGGER_WRITE("Model: SS is displaying (BringToForeground)"); + + // Compress heap while displaying. No longer possible to + // compress all heaps (User::CompressAllHeaps() is a no-op) + User::Heap().Compress(); + + self->iSharedDataI->SetDisplayObjChanged( EFalse ); + + self->DisplayObject(); + + return KErrNone; + } + + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverindicator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverindicator.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,220 @@ +/* +* Copyright (c) 2003 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: Implementation screensaver indicator array. +* +*/ + + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "screensaverplugin.h" +#include "screensaverindicator.h" +#include "ScreensaverUtils.h" + + + +// +// CSCreensaverIndicator +// + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::~CScreensaverIndicator +// ----------------------------------------------------------------------------- +// +CScreensaverIndicator::~CScreensaverIndicator() + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicator::ConstructL(TResourceReader &aReader, + TUint32 aBgColor, TUint aTextColor) + { + iId = (TScreensaverIndicatorId)aReader.ReadInt16(); + iDrawType = (TScreensaverDrawType)aReader.ReadInt16(); + iAlignment = (TScreensaverAlignment)aReader.ReadInt16(); + + // Switch left & right alignment of indicators, if layout mirrored + if (AknLayoutUtils::LayoutMirrored()) + { + if (iAlignment == ESsAlignLeft) + { + iAlignment = ESsAlignRight; + } + else + { + iAlignment = ESsAlignLeft; + } + } + iBgColor = TRgb(aBgColor); + iTextColor = TRgb(aTextColor); + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::SetId +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicator::SetId(TScreensaverIndicatorId aId) + { + iId = aId; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::Visible +// ----------------------------------------------------------------------------- +// +TBool CScreensaverIndicator::Visible() const + { + return iVisible; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::SetVisibility +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicator::SetVisibility(TBool aValue) + { + iVisible = aValue; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::Width() +// ----------------------------------------------------------------------------- +// +TInt CScreensaverIndicator::Width() const + { + return iRect.Width(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::Id +// ----------------------------------------------------------------------------- +// +TScreensaverIndicatorId CScreensaverIndicator::Id() const + { + return iId; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::Alignment +// ----------------------------------------------------------------------------- +// +TScreensaverAlignment CScreensaverIndicator::Alignment() const + { + return iAlignment; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::DrawType +// ----------------------------------------------------------------------------- +// +TScreensaverDrawType CScreensaverIndicator::DrawType() const + { + return iDrawType; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::MakeSkinItemId +// ----------------------------------------------------------------------------- +// +TAknsItemID CScreensaverIndicator::MakeSkinItemId(TInt aSkinBmpId) + { + TAknsItemID id; + // All are AVKON generic ids + id.Set(EAknsMajorGeneric, aSkinBmpId); + return id; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::SetType +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicator::SetType(TScreensaverIndicatorType aType) + { + iType = aType; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::Type +// ----------------------------------------------------------------------------- +// +TScreensaverIndicatorType CScreensaverIndicator::Type() + { + return iType; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::SetIconLayout +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicator::SetIconLayout(TAknLayoutRect&, TInt) + { + iVisible = ETrue; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::SetTextLayout +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicator::SetTextLayout(TAknLayoutText&, TInt) + { + iVisible = ETrue; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::PreferredWidth +// ----------------------------------------------------------------------------- +// +TInt CScreensaverIndicator::PreferredWidth() + { + return -1; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::MinimumWidth +// ----------------------------------------------------------------------------- +// +TInt CScreensaverIndicator::MinimumWidth() + { + return 0; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::SetWidth +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicator::SetWidth(TInt) + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicator::SetXPos +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicator::SetXPos(TInt) + { + } + + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverindicatorarray.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverindicatorarray.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,498 @@ +/* +* Copyright (c) 2003 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: CScreensaverIndicatorArray implementation. +* +*/ + + + +#include +#include +#include + +#include "screensaverindicatorarray.h" +#include "screensaverindicatornumberandicon.h" +#include "screensaverindicatortext.h" +#include "screensaverindicatoricon.h" +#include "screensaverutility.h" + +const TInt KInvertedColors = 1; + + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverIndicatorArray* CScreensaverIndicatorArray::NewL( TBool aColorInversionUsed ) + { + CScreensaverIndicatorArray* array = new(ELeave) CScreensaverIndicatorArray(); + CleanupStack::PushL(array); + array->ConstructL( aColorInversionUsed ); + CleanupStack::Pop(); // array + + return array; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::~CScreensaverIndicatorArray +// ----------------------------------------------------------------------------- +// +CScreensaverIndicatorArray::~CScreensaverIndicatorArray() + { + if (iIndicators) + { + iIndicators->ResetAndDestroy(); + } + delete iIndicators; + delete iDependencyRecord; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::NewIndicatorLC +// ----------------------------------------------------------------------------- +// +CScreensaverIndicator *CScreensaverIndicatorArray::NewIndicatorLC( + TScreensaverIndicatorType aId) + { + CScreensaverIndicator *result= NULL; + + switch (aId) + { + case ESsIconIndicator: + result = new( ELeave ) CScreensaverIndicatorIcon(); + break; + case ESsTextIndicator: + result = new( ELeave ) CScreensaverIndicatorText(); + break; + case ESsNumberAndIconIndicator: + result = new( ELeave ) CScreensaverIndicatorNumberAndIcon(); + break; + default: + User::Leave(KErrCorrupt); + } + + CleanupStack::PushL( result ); + result->SetType(aId); + + return result; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::ConstructL( TBool aColorInversionUsed ) + { + if (aColorInversionUsed == KInvertedColors) + { + iBgColor = TRgb(KRgbBlack).Value(); + iTextColor = TRgb(KRgbWhite).Value(); + } + else //aColorInversionUsed == KNormalColors + { + iBgColor = TRgb(KRgbWhite).Value(); + iTextColor = TRgb(KRgbBlack).Value(); + } + + ConstructFromResourceL(); + + } + + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::ConstructFromResourceL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::ConstructFromResourceL() + { + ConstructParamFromResourceL(); + + ConstructIndArrayL(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::ConstructParamFromResourceL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::ConstructParamFromResourceL() + { + TResourceReader reader; + + CEikonEnv::Static()->CreateResourceReaderLC( reader, R_SCREENSAVER_PARAMETERS ); + iMargin = reader.ReadInt16(); + iGap = reader.ReadInt16(); + iTopMargin = reader.ReadInt16(); + iTextLevel = reader.ReadInt16(); + iHeight = reader.ReadInt16(); + CleanupStack::PopAndDestroy(); // reader + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::ConstructIndArrayL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::ConstructIndArrayL() + { + if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + {//use the new layout + ConstructIndicatorsL( R_SCREENSAVER_INDICATOR_ARRAY_NEW_LAYOUT ); + } + else + {//use the old layout + ConstructIndicatorsL( R_SCREENSAVER_INDICATOR_ARRAY ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::ConstructIndicatorsL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::ConstructIndicatorsL( TInt aResourceId ) + { + TResourceReader reader; + + CEikonEnv::Static()->CreateResourceReaderLC( + reader, aResourceId); + + iCount = reader.ReadInt16(); + + iIndicators = new( ELeave ) CArrayPtrFlat( iCount ); + iDependencyRecord = new( ELeave ) CArrayFixFlat( iCount ); + + CScreensaverIndicator *nInd; + TInt32 type; + for (TInt i = 0; i < iCount; i++) + { + iDependencyRecord->AppendL( ETrue ); + type = reader.ReadInt32(); + nInd = NewIndicatorLC( ( TScreensaverIndicatorType ) type ); + nInd->ConstructL( reader, iBgColor, iTextColor ); + iIndicators->InsertL( 0, nInd ); + CleanupStack::Pop(); // nInd + } + + CleanupStack::PopAndDestroy(); // reader + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::Dependency +// ----------------------------------------------------------------------------- +// +TBool CScreensaverIndicatorArray::Dependency(TInt aIndex) const + { + return (*iDependencyRecord)[aIndex]; + } +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::Setup +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::Setup( TAknLayoutRect& aLayoutRect, + TAknLayoutText& aLayoutText, TAknLayoutRect& aLayoutInds ) + { + // Reset drawing parameters (do not use those defined in resources) + iRect = aLayoutRect.Rect(); + + TInt rightMargin = 0; + // Left margin = indicators left edge - indicator area left edge + // Right margin = 0, the AM/PM indicator needs to be on the edge + // Except when mirrored the other way around. Right margin can be reduced + // by 1 when mirrored, because the icons contain a border on top & right + if ( AknLayoutUtils::LayoutMirrored() ) + { + iMargin = 0; + rightMargin = aLayoutInds.Rect().iTl.iX - iRect.iTl.iX - 1; + } + else + { + iMargin = aLayoutInds.Rect().iTl.iX - iRect.iTl.iX; + rightMargin = 0; + } + + TInt currentX = iRect.iBr.iX - rightMargin; + + TInt leftmostRightAlignedBorder = iRect.iBr.iX - rightMargin; // iMargin; + + // This is done in two passes, first we set up right-aligned indicators + // and then left-aligned. If any left-aligned indicator overlaps with leftmost + // right-aligned indicator the the process is stopped (right-aligned + // indicators have higher priority). + for ( TInt i = 0; i < iIndicators->Count(); i++ ) + { + if (iIndicators->At(i)->Alignment() != ESsAlignRight) + { + continue; + } + + SetIndicatorsAttribute( i, aLayoutText, aLayoutInds, currentX ); + + if (iIndicators->At(i)->Visible()) + { + currentX -= iIndicators->At(i)->Width() + iGap; + leftmostRightAlignedBorder = currentX; + if (currentX < iMargin) + { + break; + } + } + } + + // Start second round from left edge + currentX = iRect.iTl.iX + iMargin; + for ( TInt i = 0; i < iIndicators->Count(); i++ ) + { + if (iIndicators->At(i)->Alignment() != ESsAlignLeft) + { + continue; + } + + SetIndicatorsAttribute( i, aLayoutText, aLayoutInds, currentX ); + + if (iIndicators->At(i)->Visible()) + { + if (currentX + iIndicators->At(i)->Width() + iGap >= leftmostRightAlignedBorder) + { + iIndicators->At(i)->SetVisibility(EFalse); + break; + } + currentX += iIndicators->At(i)->Width() + iGap; + if (currentX > iRect.Width() - iMargin) + { + break; + } + } + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::SetIndicatorsAttribute +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::SetIndicatorsAttribute( + TInt& Ind, + TAknLayoutText& aLayoutText, + TAknLayoutRect& aLayoutInds, + TInt& aCurrentX ) + { + + // Set text layout for text containing indicators + iIndicators->At(Ind)->SetTextLayout(aLayoutText, aCurrentX); + + // Set icon layout for icon containing indicators + iIndicators->At(Ind)->SetIconLayout(aLayoutInds, aCurrentX); + + // Not visible, if conditions (e.g. there's icon & payload) are not met, + // or there's no reason to show the indicator + if (!iIndicators->At(Ind)->CheckVisibilityConditions() || Dependency(iIndicators->At(Ind)->Id())) + { + iIndicators->At(Ind)->SetVisibility(EFalse); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::Draw +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::Draw(CWindowGc& aGc) const + { + aGc.SetBrushColor(iBgColor); + aGc.SetPenColor(iTextColor); + aGc.Clear(iRect); + + for (TInt i = 0; i < iIndicators->Count(); i++) + { + if (iIndicators->At(i)->Visible()) + { + iIndicators->At(i)->Draw(aGc); + } + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::CheckDependencyConflict +// ----------------------------------------------------------------------------- +// +TBool CScreensaverIndicatorArray::CheckDependencyConflict( + TScreensaverIndicatorId aId) const + { + if ((iDependencyRecord) && (aId < iCount)) + { + return Dependency(aId); + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::SetDependencyStatus +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::SetDependencyStatus( + TScreensaverIndicatorId aId, TBool aValue) + { + if ((iDependencyRecord) && (aId < iCount)) + { + (*iDependencyRecord)[aId] = aValue; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::GetIndicatorPayload +// ----------------------------------------------------------------------------- +// +TInt CScreensaverIndicatorArray::GetIndicatorPayload( + TScreensaverIndicatorId aId, TIndicatorPayload& aPayload) const + { + if (aId < iCount) + { + for (TInt i = 0; i < iIndicators->Count(); i++) + { + if (aId == iIndicators->At(i)->Id()) + { + iIndicators->At(i)->Payload(aPayload); + return KErrNone; + } + } + } + + return KErrCorrupt; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::SetIndicatorPayload +// ----------------------------------------------------------------------------- +// +TInt CScreensaverIndicatorArray::SetIndicatorPayload( + TScreensaverIndicatorId aId, const TIndicatorPayload& aPayload) + { + if (aId < iCount) + { + for (TInt i = 0; i < iIndicators->Count(); i++) + { + if (aId == iIndicators->At(i)->Id()) + { + iIndicators->At(i)->SetPayload(aPayload); + return KErrNone; + } + } + } + + return KErrCorrupt; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::PreferredDrawingMode +// ----------------------------------------------------------------------------- +// +TScreensaverDrawType CScreensaverIndicatorArray::PreferredDrawingMode() const + { + TScreensaverDrawType result = ESsDrawTypeNotDrawn; // Default mode. + + for (TInt i = 0; i < iIndicators->Count(); i++) + { + if ((iIndicators->At(i)->CheckVisibilityConditions() == EFalse) + || (CheckDependencyConflict(iIndicators->At(i)->Id()))) + { + // This indicator can't be visible or there is + // dependency conflict -> continue. + continue; + } + + switch (iIndicators->At(i)->DrawType()) + { + case ESsDrawTypePrimary: + // Primary draw type overides everything, + // so we can return immediately. + return ESsDrawTypePrimary; + case ESsDrawTypeSecondary: + result = ESsDrawTypeSecondary; + break; + default: + break; + } + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::ActualDrawingMode +// ----------------------------------------------------------------------------- +// +TScreensaverDrawType CScreensaverIndicatorArray::ActualDrawingMode() const + { + TScreensaverDrawType result = ESsDrawTypeNotDrawn; // Default mode. + + for (TInt i = 0; i < iIndicators->Count(); i++) + { + if ((iIndicators->At(i)->CheckVisibilityConditions() == EFalse) + || !( iIndicators->At(i)->Visible() ) ) + { + // This indicator can't be visible or it is visible + continue; + } + + switch (iIndicators->At(i)->DrawType()) + { + case ESsDrawTypePrimary: + return ESsDrawTypePrimary; // Primary draw type overides everything. + case ESsDrawTypeSecondary: + result = ESsDrawTypeSecondary; + break; + default: + break; + } + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::Height +// ----------------------------------------------------------------------------- +// +TInt CScreensaverIndicatorArray::Height() const + { + return iHeight; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::SetVisibilityForIndicators +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorArray::SetVisibilityForIndicators() + { + for (int i = 0; i < iIndicators->Count(); i++) + { + // Not visible, if conditions (e.g. there's icon & payload) are not met, + // or there's no reason to show the indicator + if (!iIndicators->At(i)->CheckVisibilityConditions() || Dependency(iIndicators->At(i)->Id())) + { + iIndicators->At(i)->SetVisibility(EFalse); + } + else + iIndicators->At(i)->SetVisibility(ETrue); + } + + } + +// ----------------------------------------------------------------------------- +// CScreensaverIndicatorArray::CScreensaverIndicatorArray +// ----------------------------------------------------------------------------- +// +CScreensaverIndicatorArray::CScreensaverIndicatorArray() + { + + } + +// End of files diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverindicatoricon.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverindicatoricon.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,218 @@ +/* +* Copyright (c) 2003 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: CScreensaverIndicatorIcon implementation. +* +*/ + + + +#include +#include + +#include "screensaverindicatoricon.h" + +// +// CScreensaverIconIndicator +// + +// ----------------------------------------------------------------------------- +// CScreensaverIconIndicator::~CScreensaverIconIndicator +// ----------------------------------------------------------------------------- +// +CScreensaverIndicatorIcon::~CScreensaverIndicatorIcon() + { + delete iIcon; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIconIndicator::Draw +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorIcon::Draw(CWindowGc& aGc) const + { + aGc.SetPenColor(iTextColor); + aGc.SetBrushColor(iBgColor); + if (Visible() && iIcon) + { + if (!iIcon->Mask()) + { + aGc.BitBlt(iTopLeft, iIcon->Bitmap(), iRect); + } + else + { + aGc.BitBltMasked(iTopLeft, iIcon->Bitmap(), iRect, iIcon->Mask(), + ETrue); + } + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverIconIndicator::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorIcon::ConstructL(TResourceReader &aReader, + TUint32 aBgColor, TUint aTextColor) + { + CScreensaverIndicator::ConstructL(aReader, aBgColor, aTextColor); + + // Icon & mask ids + TInt id = aReader.ReadInt32(); + TInt maskid = aReader.ReadInt32(); + + // Icon & mask skin identifiers + TInt skinid = aReader.ReadInt32(); + TInt skinmaskid = aReader.ReadInt32(); + + iIcon = CGulIcon::NewL(); + + CFbsBitmap* bmp= NULL; + CFbsBitmap* mask= NULL; + + // Load skinned bitmap + AknsUtils::CreateColorIconLC(AknsUtils::SkinInstance(), + MakeSkinItemId(skinid), + KAknsIIDNone, // Lie so that we get default color, not skin color + 0, // No color group + bmp, mask, AknIconUtils::AvkonIconFileName(), id, maskid, + iTextColor); + + CleanupStack::Pop(2); + + // Save the icon + iIcon->SetBitmap(bmp); + iIcon->SetMask(mask); + + // Set initial size for SVG graphics, this is later altered + // as the layout is known + // Set desired size for SVG graphics (height from LAF, width 3 x height) + TAknLayoutRect screenLayout; + screenLayout.LayoutRect(TRect(0, 0, 0, 0), AknLayout::screen() ); + TRect screenRect = screenLayout.Rect(); + TAknLayoutRect powerSavePaneLayout; + powerSavePaneLayout.LayoutRect(screenRect, + AknLayout::Power_save_pane_descendants_Line_1() ); + TRect powerSavePaneRect = powerSavePaneLayout.Rect(); + TAknLayoutRect rect; + rect.LayoutRect(powerSavePaneRect, + AknLayout::Power_save_pane_descendants_Line_3() ); + TInt height = rect.Rect().Height(); + TSize iconSize(3 * height, height); + AknIconUtils::SetSize(iIcon->Bitmap(), iconSize); + } + +// ----------------------------------------------------------------------------- +// CScreensaverIconIndicator::SetupDrawingParameters +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorIcon::SetupDrawingParameters(const TPoint &aCorner, + const TRect& aParentRect) + { + iVisible = EFalse; + + if (!iIcon) + { + return; + } + + TSize size = iIcon->Bitmap()->SizeInPixels(); + iTopLeft.iX = aCorner.iX; + if (iAlignment == ESsAlignRight) + { + // Change topright to topleft. + iTopLeft.iX -= size.iWidth; + } + // Center bitmap in y direction. + iTopLeft.iY = aCorner.iY + (aParentRect.Size().iHeight / 2) - (size.iHeight / 2) - 2; + + iRect = TRect(0, 0, size.iWidth, size.iHeight); + + iVisible = ETrue; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIconIndicator::CheckVisibilityConditions +// ----------------------------------------------------------------------------- +// +TBool CScreensaverIndicatorIcon::CheckVisibilityConditions() const + { + return (iIcon == 0 ? EFalse : ETrue); + } + +// ----------------------------------------------------------------------------- +// CScreensaverIconIndicator::Payload +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorIcon::Payload(TIndicatorPayload& aPayload) const + { + aPayload.iType = EPayloadTypeIcon; + aPayload.iInteger = -1; + aPayload.iText = KNullDesC; + aPayload.iIsDisplayed = Visible(); + aPayload.iIcon = iIcon; + } + +// ----------------------------------------------------------------------------- +// CScreensaverIconIndicator::SetPayload +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorIcon::SetPayload(const TIndicatorPayload& /*aPayload*/) + { + // Nothing to set, payload is icon and it is created from resources. + } + +// ----------------------------------------------------------------------------- +// CScreensaverIconIndicator::SetIconLayout +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorIcon::SetIconLayout(TAknLayoutRect& aLayout, TInt aX) + { + if (!iIcon) + { + ASSERT(iIcon); + return; + } + + // Resize icon according to layout + TInt height = aLayout.Rect().Height(); + TSize iconSize(KMaxTInt, height); + AknIconUtils::SetSize(iIcon->Bitmap(), iconSize, + EAspectRatioPreservedAndUnusedSpaceRemoved); + + // Set vertical icon position according to layout (this overrides + // what's already there. Also set correct width in iRect + iTopLeft.iY = aLayout.Rect().iTl.iY; + iTopLeft.iX = aX; + TSize size = iIcon->Bitmap()->SizeInPixels(); + iRect = TRect(0, 0, size.iWidth, size.iHeight); + + if (iAlignment == ESsAlignRight) + { + // Change topright to topleft. + iTopLeft.iX -= size.iWidth; + } + +#ifdef SS_LAYOUTTRACE + SCRLOGGER_WRITEF(_L("SCR: Icon indicator (%d):"), iId); + SCRLOGGER_WRITEF(_L("SCR: Rect: (%d,%d,%d,%d)"), + iRect.iTl.iX, + iRect.iTl.iY, + iRect.iBr.iX, + iRect.iBr.iY); + SCRLOGGER_WRITEF(_L("SCR: Size: (%d,%d)"), size.iWidth, size.iHeight); + SCRLOGGER_WRITEF(_L("SCR: Pos: (%d,%d)"), iTopLeft.iX, iTopLeft.iY); +#endif + } + + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverindicatornumberandicon.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverindicatornumberandicon.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,434 @@ +/* +* Copyright (c) 2003 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: CScreensaverIndicatorNumberAndIcon implementation. +* +*/ + + + +#include +#include +#include + +#include "screensaverindicatornumberandicon.h" + + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::~CScreensaverNumberAndIconIndicator +// ----------------------------------------------------------------------------- +// +CScreensaverIndicatorNumberAndIcon::~CScreensaverIndicatorNumberAndIcon() + { + delete iIcon; + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::Draw +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::Draw( CWindowGc& aGc ) const + { + TBuf<10> nStr; + nStr.AppendNum( iValue ); + + aGc.SetPenColor( iTextColor ); + aGc.SetBrushColor( iBgColor ); + + if ( iFont ) + { + aGc.UseFont( iFont ); + } + else + { + ASSERT( iFont != NULL ); + aGc.UseFont( CEikonEnv::Static()->AnnotationFont() ); + } + + if ( Visible() && iIcon ) + { + // Convert number according to language + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( nStr ); + + DrawIcon( aGc ); + + // Draw number beside icon + if ( ( iTextRect.IsEmpty() ) || ( !iFont ) ) + { + // Draw using text position (old layout) + aGc.DrawText( nStr, iTextPos ); + } + else + { + // Use text rect + ASSERT( iTextOffset> 0 ); + aGc.DrawText( nStr, iTextRect, iTextOffset ); + } + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::ConstructL( TResourceReader &aReader, + TUint32 aBgColor, TUint aTextColor ) + { + CScreensaverIndicator::ConstructL( aReader, aBgColor, aTextColor ); + + iIconAlign = ( TScreensaverAlignment )aReader.ReadInt32(); + iFont = AknLayoutUtils::FontFromId( aReader.ReadInt32() ); + if ( !iFont ) + { + iFont = LatinPlain12(); + } + + // create icon + InitializeIconL( aReader ); + + // Set desired size for SVG graphics (height from LAF, width 3 x height) + InitializeLayout(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::SetupDrawingParameters +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::SetupDrawingParameters( + const TPoint& aCorner, const TRect& aParentRect ) + { + iVisible = EFalse; + + TBuf<10> nStr; + + if ( !iIcon ) + { + return; + } + + nStr.AppendNum( iValue ); + + TSize bmsize = iIcon->Bitmap()->SizeInPixels(); + TInt textWidth = iFont ? iFont->TextWidthInPixels( nStr ) + 1 : nStr.Length() + * 11; // Should be enough for APAC too + + iTopLeft.iX = aCorner.iX; + if ( iAlignment == ESsAlignRight ) + { + // Change topright to topleft. + iTopLeft.iX -= bmsize.iWidth + textWidth; + } + // Center bitmap in y direction. + iTopLeft.iY = aCorner.iY + ( aParentRect.Size().iHeight / 2 ) - ( bmsize.iHeight / 2 ) - 2; + + // Calculate text corner + if ( iIconAlign == ESsAlignLeft ) + { + iTextPos.iX = iTopLeft.iX + bmsize.iWidth + 1; + } + else + { + iTextPos.iX = iTopLeft.iX; + } + + iTextPos.iY = aCorner.iY + iRect.Size().iHeight / 2 + 4; + + iRect = TRect( 0, 0, bmsize.iWidth + textWidth, aParentRect.Size().iHeight ); + + // Make sure text rect is not used + iTextRect.SetRect( 0, 0, 0, 0 ); + + iVisible = ETrue; + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::CheckVisibilityConditions +// ----------------------------------------------------------------------------- +// +TBool CScreensaverIndicatorNumberAndIcon::CheckVisibilityConditions() const + { + if ( ( iIcon ) && ( iValue > 0 ) ) + { + return ETrue; + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::Payload +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::Payload( TIndicatorPayload& aPayload ) const + { + aPayload.iType = EPayloadTypeInteger; + aPayload.iInteger = iValue; + aPayload.iText = KNullDesC; + aPayload.iIsDisplayed = Visible(); + aPayload.iIcon = iIcon; + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::SetPayload +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::SetPayload( + const TIndicatorPayload& aPayload ) + { + if ( aPayload.iType != EPayloadTypeInteger ) + { + return; + } + + iValue = aPayload.iInteger; + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::SetIconLayout +// Sets icon position and size +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::SetIconLayout( TAknLayoutRect& aLayout, + TInt aX ) + { + if ( !iIcon ) + { + ASSERT( iIcon ); + return; + } + + // Resize icon according to layout + TInt height = aLayout.Rect().Height(); + TSize iconSize(KMaxTInt, height); + AknIconUtils::SetSize( iIcon->Bitmap(), iconSize, + EAspectRatioPreservedAndUnusedSpaceRemoved ); + + // Overrides vertical icon position set earlier + iTopLeft.iY = aLayout.Rect().iTl.iY; + + // Set initial rect + iRect = TRect( 0, 0, PreferredWidth(), height ); + + // Set X-position + SetXPos( aX ); + +#ifdef SS_LAYOUTTRACE + SCRLOGGER_WRITEF( _L("SCR: NumberAndIcon indicator (%d):"), iId ); + SCRLOGGER_WRITEF( _L("SCR: Icon rect: (%d,%d,%d,%d)"), + iRect.iTl.iX, + iRect.iTl.iY, + iRect.iBr.iX, + iRect.iBr.iY ); + TSize size = iIcon->Bitmap()->SizeInPixels(); + SCRLOGGER_WRITEF( _L("SCR: Icon size: (%d,%d)"), size.iWidth, size.iHeight ); + SCRLOGGER_WRITEF( _L("SCR: Icon pos: (%d,%d)"), iTopLeft.iX, iTopLeft.iY ); +#endif + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::SetTextLayout +// Sets text position and font +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::SetTextLayout( TAknLayoutText& aLayout, + TInt /* aX */ ) + { + // Font from layout + iFont = aLayout.Font(); + // Layout MUST have a font + ASSERT( iFont != NULL ); + + // Vertical dimension of text rect from layout + // (x-dims will be set separately) + iTextRect = aLayout.TextRect(); + + // Calculate text offset from rect top + const CAknLayoutFont* layoutFont = + CAknLayoutFont::AsCAknLayoutFontOrNull( iFont ); + + if ( layoutFont ) + { + iTextOffset = layoutFont->TextPaneTopToBaseline(); + } + else + { + iTextOffset = iFont->AscentInPixels(); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::PreferredWidth +// Return width where the whole indicator can be drawn +// ----------------------------------------------------------------------------- +// +TInt CScreensaverIndicatorNumberAndIcon::PreferredWidth() + { + // Preferred width = icon width + text width + a little gap in between + TBuf<10> nStr; + nStr.AppendNum( iValue ); + + TInt width = iFont ? iFont->TextWidthInPixels( nStr ) : nStr.Length() * 11; // Should be enough for APAC too + + // Add icon width + width += MinimumWidth(); + + // Add a little gap between text and icon + return width + 1; + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::MinimumWidth +// Get minimum width +// ----------------------------------------------------------------------------- +// +TInt CScreensaverIndicatorNumberAndIcon::MinimumWidth() + { + // Minimum width is icon width + return ( iIcon ? ( iIcon->Bitmap()->SizeInPixels()).iWidth : 0 ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::SetXPos +// Sets the x-position for the indicator +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::SetXPos( TInt aX ) + { + iVisible = EFalse; + + if ( !iIcon ) + { + return; + } + + TBuf<10> nStr; + nStr.AppendNum( iValue ); + + TSize bmsize = iIcon->Bitmap()->SizeInPixels(); + TInt textWidth = iFont ? iFont->TextWidthInPixels( nStr ) + 1 : nStr.Length() + * 11; // Should be enough for APAC too + + iTopLeft.iX = aX; + if ( iAlignment == ESsAlignRight ) + { + // Change topright to topleft. + iTopLeft.iX -= bmsize.iWidth + textWidth; + } + + // Calculate text corner + if ( iIconAlign == ESsAlignLeft ) + { + iTextRect.iTl.iX = iTopLeft.iX + bmsize.iWidth; + } + else + { + iTextRect.iTl.iX = iTopLeft.iX; + } + + iTextRect.SetWidth( textWidth ); + + iVisible = ETrue; + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::InitializeLayout +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::InitializeLayout() + { + // Set desired size for SVG graphics (height from LAF, width 3 x height) + TAknLayoutRect screenLayout; + screenLayout.LayoutRect( TRect(0, 0, 0, 0), AknLayout::screen() ); + TRect screenRect = screenLayout.Rect(); + TAknLayoutRect powerSavePaneLayout; + powerSavePaneLayout.LayoutRect( screenRect, + AknLayout::Power_save_pane_descendants_Line_1() ); + TRect powerSavePaneRect = powerSavePaneLayout.Rect(); + TAknLayoutRect rect; + rect.LayoutRect( powerSavePaneRect, + AknLayout::Power_save_pane_descendants_Line_3() ); + TInt height = rect.Rect().Height(); + TSize iconSize( 2 * height, height ); + AknIconUtils::SetSize( iIcon->Bitmap(), iconSize ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::InitializeIconL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::InitializeIconL( TResourceReader &aReader ) + { + // Icon & mask ids + TInt id = aReader.ReadInt32(); + TInt maskid = aReader.ReadInt32(); + + // Icon & mask skin identifiers + TInt skinid = aReader.ReadInt32(); + TInt skinmask = aReader.ReadInt32(); + + iIcon = CGulIcon::NewL(); + + CFbsBitmap* bmp= NULL; + CFbsBitmap* mask= NULL; + + // Load skinned bitmap + AknsUtils::CreateColorIconLC( AknsUtils::SkinInstance(), + MakeSkinItemId( skinid ), + KAknsIIDNone, // Lie so that we get default color, not skin color + 0, // No color group + bmp, mask, AknIconUtils::AvkonIconFileName(), id, maskid, + iTextColor ); + + CleanupStack::Pop( 2 ); + + // Save the icon + iIcon->SetBitmap( bmp ); + iIcon->SetMask( mask ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverNumberAndIconIndicator::DrawIcon +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorNumberAndIcon::DrawIcon( CWindowGc& aGc ) const + { + if ( iIconAlign == ESsAlignLeft ) + { + if ( !iIcon->Mask() ) + { + aGc.BitBlt( iTopLeft, iIcon->Bitmap(), iRect ); + } + else + { + aGc.BitBltMasked( iTopLeft, iIcon->Bitmap(), iRect, + iIcon->Mask(), ETrue ); + } + } + else + { + // Calculate icon left point (right edge - icon width) + TPoint pTmp = TPoint( iTopLeft.iX + iRect.Size().iWidth - iIcon->Bitmap()->SizeInPixels().iWidth, iTopLeft.iY ); + + if ( !iIcon->Mask() ) + { + aGc.BitBlt( pTmp, iIcon->Bitmap(), iRect ); + } + else + { + aGc.BitBltMasked( pTmp, iIcon->Bitmap(), iRect, iIcon->Mask(), + ETrue ); + } + } + } + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverindicatortext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverindicatortext.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,234 @@ +/* +* Copyright (c) 2003 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: CScreensaverIndicatorText implementation. +* +*/ + + + +#include +#include + +#include "screensaverindicatortext.h" + + + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::Draw +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorText::Draw( CWindowGc& aGc ) const + { + if ( iFont ) + { + aGc.UseFont( iFont ); + } + aGc.SetPenColor( iTextColor ); + + // Draw normal bidi text + TBidiText* bidi= NULL; + TRAPD( err, bidi = TBidiText::NewL( iText, 1 ) ); + if ( err == KErrNone ) + { + bidi->WrapText( Width(), *iFont, NULL ); + if ( iTextRect.IsEmpty() ) + { + bidi->DrawText( aGc, iTopLeft ); + } + else + { + TPoint pt = iTextRect.iTl; + pt.iY += iTextOffset; + bidi->DrawText( aGc, pt ); + } + delete bidi; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorText::ConstructL( TResourceReader &aReader, + TUint32 aBgColor, TUint aTextColor ) + { + CScreensaverIndicator::ConstructL( aReader, aBgColor, aTextColor ); + + iFont = AknLayoutUtils::FontFromId( aReader.ReadInt32() ); + if ( !iFont ) + { + iFont = LatinPlain12(); + } + + } + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::SetupDrawingParameters +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorText::SetupDrawingParameters( const TPoint& aCorner, + const TRect& aParentRect ) + { + iVisible = EFalse; + + if ( iText.Length() <= 0 ) + { + return; + } + + TInt textWidth = ( iFont ? iFont->TextWidthInPixels(iText) + 1 + : iText.Length() * 11 ); // Should be enough for APAC too + + iRect = TRect( 0, 0, textWidth, aParentRect.Size().iHeight ); + + iTopLeft.iX = aCorner.iX; + + if ( iAlignment == ESsAlignRight ) + { + // Change topright to topleft. + iTopLeft.iX -= iRect.Size().iWidth; + } + + iTopLeft.iY = aCorner.iY + ( aParentRect.Size().iHeight / 2 ) + ( ( aParentRect.Size().iHeight - iFont->HeightInPixels() ) / 2 ) + 2; + + // Make sure text rect is not used + iTextRect.SetRect( 0, 0, 0, 0 ); + + iVisible = ETrue; + } + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::ConstructL +// ----------------------------------------------------------------------------- +// +TBool CScreensaverIndicatorText::CheckVisibilityConditions() const + { + return ( iText.Length() > 0 ? ETrue : EFalse ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorText::Payload( TIndicatorPayload &aPayload ) const + { + aPayload.iType = EPayloadTypeText; + aPayload.iText = iText; + aPayload.iInteger = -1; + aPayload.iIsDisplayed = Visible(); + aPayload.iIcon = NULL; + } + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorText::SetPayload( const TIndicatorPayload& aPayload ) + { + if ( aPayload.iType != EPayloadTypeText ) + { + return; + } + + if ( aPayload.iText.Length() > iText.MaxLength() ) + { + return; // Don't panic. + } + + iText = aPayload.iText; + } + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::SetTextLayout +// Sets text position and font +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorText::SetTextLayout( TAknLayoutText& aLayout, TInt aX ) + { + // Font from layout + iFont = aLayout.Font(); + // Layout MUST have a font + ASSERT( iFont != NULL ); + + // Vertical dimension of text rect from layout + iTextRect = aLayout.TextRect(); + + // Calculate text offset from rect top + const CAknLayoutFont* layoutFont = + CAknLayoutFont::AsCAknLayoutFontOrNull( iFont ); + + if ( layoutFont ) + { + iTextOffset = layoutFont->TextPaneTopToBaseline(); + } + else + { + iTextOffset = iFont->AscentInPixels(); + } + + // X-pos from parameter + iTextRect.iTl.iX = aX; + + // Initially set indicator rect (this may later be overridden by SetWidth()) + iRect = TRect( 0, 0, PreferredWidth(), aLayout.TextRect().Height() ); + + // If right-aligned, the X-pos indicates right edge - switch to left + if ( iAlignment == ESsAlignRight ) + { + // Change topright to topleft. + iTextRect.iTl.iX -= Width(); // iRect.Size().iWidth; + } + + // Indicator width = text rect width + iTextRect.SetWidth( Width() ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::PreferredWidth +// Gets preferred indicator width +// ----------------------------------------------------------------------------- +// +TInt CScreensaverIndicatorText::PreferredWidth() + { + TInt textWidth = ( iFont ? iFont->TextWidthInPixels( iText ) + 1 + : iText.Length() * 11 ); // Should be enough for APAC too + return textWidth; + } + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::SetWidth +// Sets indicator width +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorText::SetWidth( TInt iWidth ) + { + iRect.SetWidth( iWidth ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverTextIndicator::SetXPos +// Sets indicator X-position (new layout) +// ----------------------------------------------------------------------------- +// +void CScreensaverIndicatorText::SetXPos( TInt aX ) + { + iTopLeft.iX = aX; + if ( iAlignment == ESsAlignRight ) + { + // Change topright to topleft. + iTopLeft.iX -= iRect.Size().iWidth; + } + } + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverrepositorywatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverrepositorywatcher.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,171 @@ +/* +* Copyright (c) 2003 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: CScreensaverRepositoryWatcher implementation. +* +*/ + + + +#include + +#include "screensaverrepositorywatcher.h" +#include "ScreensaverUtils.h" +// +// CScreensaverRepositoryWatcher +// +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverRepositoryWatcher* CScreensaverRepositoryWatcher::NewL( + const TUid aUid, + const TUint32 aKey, + CCenRepNotifyHandler::TCenRepKeyType aKeyType, + TCallBack aCallBack, + CRepository* aRepository) + { + CScreensaverRepositoryWatcher* self = new(ELeave) CScreensaverRepositoryWatcher(aUid, aKey, aCallBack, aRepository); + + CleanupStack::PushL(self); + self->ConstructL(aKeyType); + CleanupStack::Pop(self); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverRepositoryWatcher* CScreensaverRepositoryWatcher::NewL( + const TUid aUid, + TCallBack aCallBack, + CRepository* aRepository) + { + CScreensaverRepositoryWatcher* self = new(ELeave) CScreensaverRepositoryWatcher( + aUid, NCentralRepositoryConstants::KInvalidNotificationId, aCallBack, aRepository); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::CScreensaverRepositoryWatcher +// ----------------------------------------------------------------------------- +// +CScreensaverRepositoryWatcher::~CScreensaverRepositoryWatcher() + { + if (iNotifyHandler) + { + iNotifyHandler->StopListening(); + delete iNotifyHandler; + } + } + + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::CScreensaverRepositoryWatcher +// ----------------------------------------------------------------------------- +// +CScreensaverRepositoryWatcher::CScreensaverRepositoryWatcher( + const TUid aUid, + const TUint32 aKey, + TCallBack aCallBack, + CRepository* aRepository) + :iUid(aUid), iKey(aKey), iCallBack(aCallBack), iRepository(aRepository) + { + } + + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::ConstructL(CCenRepNotifyHandler::TCenRepKeyType aKeyType) + { + iNotifyHandler = CCenRepNotifyHandler::NewL(*this, *iRepository, aKeyType, iKey); + iNotifyHandler->StartListeningL(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::ConstructL() + { + iNotifyHandler = CCenRepNotifyHandler::NewL(*this, *iRepository); + iNotifyHandler->StartListeningL(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::ChangedKey +// ----------------------------------------------------------------------------- +// +TUint32 CScreensaverRepositoryWatcher::ChangedKey() + { + return iChangedKey; + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::HandleNotifyInt +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::HandleNotifyInt(TUint32 aKey, TInt aNewValue) + { + SCRLOGGER_WRITEF(_L("SCR: HandleNotifyInt aKey=%d, aNewValue=%d"), aKey, aNewValue); + + iChangedKey = aKey; + iCallBack.CallBack(); + iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId; + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::HandleNotifyString +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::HandleNotifyString(TUint32 aKey, const TDesC16& aNewValue) + { + SCRLOGGER_WRITEF(_L("SCR: HandleNotifyString aKey=%d, aNewValue=%S"), aKey, &aNewValue); + + iChangedKey = aKey; + iCallBack.CallBack(); + iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId; + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::HandleNotifyGeneric +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::HandleNotifyGeneric(TUint32 aKey) + { + iChangedKey = aKey; + iCallBack.CallBack(); + iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId; + } + +// ----------------------------------------------------------------------------- +// CScreensaverRepositoryWatcher::HandleNotifyError +// ----------------------------------------------------------------------------- +// +void CScreensaverRepositoryWatcher::HandleNotifyError(TUint32 /*aKey*/, TInt /*aError*/, CCenRepNotifyHandler* /*aHandler*/) + { + } + + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b src/screensavershareddatai.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensavershareddatai.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,969 @@ +/* +* Copyright (c) 2003-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: Implementation for screensaver shared data connections. +* +*/ + + + +#include +#include // Profile API, not yet included in .h +#include +#include +#include +#include // KCoreAppUIsUipInd, KLightsVTForcedLightsOn +#include // KPSUidAiInformation +#include // KSettingsScreenSaverPeriod +#include // KLogsNewMissedCalls +#include +#include // KAknNewContactsNoteActive +#include // KAknKeyguardStatus +#include // Message (voice) waiting status +#include // KCTsyCallState +#include // KPSGlobalSystemState +#include +#include // Profile engine API +#include +#include + +#include "screensaverappui.h" +#include "screensaverctrlmovingtext.h" +#include "screensaverengine.h" +#include "screensavershareddatai.h" +#include "ScreensaverInternalPSKeys.h" +#include "screensaverutility.h" +#include "screensaverrepositorywatcher.h" +#include "screensaversubscriber.h" + +const TInt KTimeoutDefault = 15; // seconds (also in GS) +const TInt KTimeoutMin = 5; // minimum timeout in seconds (also in GS) + +// Screensaver "On/Off" status values +const TInt KScreensaverOff = 0; +const TInt KScreensaverOn = 1; + +// Screensaver activated from idle status values +const TInt KScreensaverNotFromIdle = 0; +const TInt KScreensaverStartedFromIdle = 1; + +// Screen saver text type. +// _LIT( KScreenSaverTypeText, "Text" ); +// Screensaver "None" (Sleep mode) +// _LIT( KScreenSaverTypeNone, "None" ); + +// Define security policies for Screensavers property keys +_LIT_SECURITY_POLICY_PASS(KSSPolicyPass); +_LIT_SECURITY_POLICY_C1(KSSPolicyWriteUserData, ECapabilityWriteUserData); +_LIT_SECURITY_POLICY_S0(KSSPolicyWriteSSOnly, 0x100056cf); + +// +// CScreensaverSharedDataI +// +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverSharedDataI* CScreensaverSharedDataI::NewL() + { + CScreensaverSharedDataI* self = new (ELeave) CScreensaverSharedDataI(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::~CScreensaverSharedDataI +// ----------------------------------------------------------------------------- +// +CScreensaverSharedDataI::~CScreensaverSharedDataI() + { + // Release the active profile resources + InvalidateActiveProfile(); + + // Release the profile engine + if (iProfileEngine) + { + // No need to delete pointer, just release resources + iProfileEngine->Release(); + } + + delete iScreensaverRepositoryWatcher; + delete iScreensaverRepository; + delete iSettingsRepositoryWatcher; + delete iSettingsRepository; + delete iCTsyRepository; + delete iInboxFolder; + delete iMsvSession; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::DisplayObjectType +// ----------------------------------------------------------------------------- +// +TDisplayObjectType CScreensaverSharedDataI::DisplayObjectType() const + { + TInt type = 0; + + if (iScreensaverRepository) + { + iScreensaverRepository->Get( KScreenSaverObject, type ); + } + + return ( TDisplayObjectType )type; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::SetDisplayObjectType +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::SetDisplayObjectType( const TDisplayObjectType aType ) + { + if( iScreensaverRepository ) + { + iScreensaverRepository->Set(KScreenSaverObject, aType); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::GetDisplayObjectText +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::GetDisplayObjectText( TDes& aDes ) const + { + CEikonEnv::Static()->ReadResource(aDes, R_SCREEN_SAVER_TEXT); + + if ( iScreensaverRepository ) + { + iScreensaverRepository->Get( KScreenSaverText, aDes ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::PluginName +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::GetPluginName( TFileName& aFileName ) const + { + if ( iScreensaverRepository ) + { + iScreensaverRepository->Get( KScreenSaverPluginName, aFileName ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ColorInversionUsed +// ----------------------------------------------------------------------------- +// +TBool CScreensaverSharedDataI::IsInvertedColors() const + { + TInt colorInversionUsed(0); + + if( iScreensaverRepository ) + { + iScreensaverRepository->Get( KScreenSaverInvertedColors, colorInversionUsed ); + } + + return ( colorInversionUsed != 0 ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ScreensaverTimeout +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataI::ScreensaverTimeout() const + { + TInt timeout = KTimeoutDefault; + + if (iSettingsRepository) + { + iSettingsRepository->Get(KSettingsAutomaticKeyguardTime, timeout); + } + // No less than minimum timeout + // Old backed up minutes 1-4 will cause default timeout after + // being restored to new sw using seconds + if (timeout < KTimeoutMin) + { + return KTimeoutDefault; + } + + return timeout; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsNCNActive +// ----------------------------------------------------------------------------- +// +TBool CScreensaverSharedDataI::IsNCNActive() const + { + // Setting the flag here is also needed, because Screensaver should not + // display new calls when Ncn note has been cancelled (even if the missed + // calls count is still nonzero). + // Also, when the phone is (re)started, and there are missed calls, + // Ncn will pop a note, This is the only way Screensaver knows about that. + + CRepository* avkonRepository = NULL; + + TRAP_IGNORE( avkonRepository = CRepository::NewL( KCRUidAvkon ) ); + + TInt value = 0; + + if ( avkonRepository ) + { + avkonRepository->Get( KAknNewContactsNoteActive, value ); + } + + delete avkonRepository; + + return ( value != 0 ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::NewMissedCalls +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataI::NewMissedCalls() const + { + CRepository* logsRepository = NULL; + + TRAP_IGNORE( logsRepository = CRepository::NewL( KCRUidLogs ) ); + + TInt value = 0; + + if ( logsRepository ) + { + logsRepository->Get( KLogsNewMissedCalls, value ); + } + + delete logsRepository; + + return value; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::SetSSForcedLightsOn +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::SetSSForcedLightsOn(TInt aSecs) + { + SCRLOGGER_WRITEF(_L("SCR: RequestLights(%d)"), aSecs); + + RProperty::Set( KPSUidCoreApplicationUIs, KLightsSSForcedLightsOn, aSecs ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::SetScreensaverStatus +// Indicate whether Screensaver is active or not +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::SetScreensaverStatus( TBool aOn /* = ETrue */ ) + { + //Check if the value is already updated. If so, setting the value again + //will cause unnecessary call backs to any subscribers of this property + if ( aOn ) + { + RProperty::Set( KPSUidScreenSaver, KScreenSaverOn, KScreensaverOn ); + //else - no need to re-apply the same value + } + else //aOn is false + { + RProperty::Set( KPSUidScreenSaver, KScreenSaverOn, KScreensaverOff ); + //else - no need to re-apply the same value + + //if stop from idle, change the status + RProperty::Set( KPSUidScreenSaver, KScreenSaverOn, KScreensaverNotFromIdle); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::SetSSStartedFromIdleStatus +// Set "Screensaver started from Idle" status +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::SetSSStartedFromIdleStatus() + { + TInt idleState = EPSAiBackground; + RProperty::Get(KPSUidAiInformation, KActiveIdleState, idleState); + + if (idleState == EPSAiBackground) + { + RProperty::Set( KPSUidScreenSaver, KScreenSaverActivatedFromIdle, KScreensaverNotFromIdle ); + } + else + { + RProperty::Set( KPSUidScreenSaver, KScreenSaverActivatedFromIdle, KScreensaverStartedFromIdle ); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsScreenSaverAllowed +// Set "Screensaver started from Idle" status +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataI::IsScreenSaverAllowed() const + { + TInt value = 0; + + RProperty::Get( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, value ); + + return value; + } + +TInt CScreensaverSharedDataI::ScreensaverPreviewMode() const + { + TInt value = 0; + + RProperty::Get( KPSUidScreenSaver, KScreenSaverPreviewMode, value ); + + return value; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::SetScreensaverPreviewMode +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::SetScreensaverPreviewMode( const TInt aMode ) + { + RProperty::Set( KPSUidScreenSaver, KScreenSaverPreviewMode, aMode ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ScreensaverPreviewState +// Get preview state +// ----------------------------------------------------------------------------- +// +TScreenSaverPreviewState CScreensaverSharedDataI::ScreensaverPreviewState() const + { + TInt state = EScreenSaverPreviewNone; + RProperty::Get( KPSUidScreenSaver, KScreenSaverPreviewState, state ); + + return ( TScreenSaverPreviewState ) state; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::SetScreensaverPreviewState +// Report preview state +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::SetScreensaverPreviewState( + const TScreenSaverPreviewState aState ) + { + RProperty::Set( KPSUidScreenSaver, KScreenSaverPreviewState, aState ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsKeyguardOn +// ----------------------------------------------------------------------------- +// +TBool CScreensaverSharedDataI::IsKeyguardOn() const + { + // Report preview state + TInt state = 0; + + RProperty::Get( KPSUidAvkonDomain, KAknKeyguardStatus, state ); + + return ( state != 0 ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsUsePowerSaveMode +// ----------------------------------------------------------------------------- +TBool CScreensaverSharedDataI::IsUsePowerSaveMode() const + { + TInt state = 0; + + // Check if power save mode has been denied + RProperty::Get( KPSUidScreenSaver, KScreenSaverNoPowerSaveMode, state ); + + return ( state != 1 ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::SystemStartupComplete +// Returns whether system startup has been completed +// ----------------------------------------------------------------------------- +// +TBool CScreensaverSharedDataI::IsSystemStartupComplete() + { + if ( iStartupComplete == EFalse ) + { + TInt startupState = -1; + RProperty::Get( KPSUidStartup, KPSGlobalSystemState, startupState ); + + switch (startupState) + { + case ESwStateNormalRfOn: + case ESwStateNormalRfOff: + case ESwStateNormalBTSap: + iStartupComplete = ETrue; + break; + default: + break; + } + } + return iStartupComplete; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::DefaultScreensaverType +// ----------------------------------------------------------------------------- +// +TDisplayObjectType CScreensaverSharedDataI::DefaultScreensaverType() const + { + return iDefaultType; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::UnreadMessagesNumber +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataI::UnreadMessagesNumber() + { + TInt numberOfUnreadMessages = 0; + // Check how many unread messages there are in the In-box. + if( !iInboxFolder ) + { + TRAPD( err, ConnectToInboxL() ); + if (err != KErrNone) + { + return numberOfUnreadMessages; + } + } + + const TInt itemCount = iInboxFolder->Count(); + for ( TInt index = 0; index < itemCount; index++ ) + { + const TMsvEntry entry = ( *iInboxFolder )[index]; + if ( entry.iType.iUid == KUidMsvMessageEntryValue && entry.Unread()) + { + if( entry.Visible() ) + { + numberOfUnreadMessages++; + } + } + } + return numberOfUnreadMessages; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ProfileName +// ----------------------------------------------------------------------------- +const TDesC& CScreensaverSharedDataI::ProfileName() + { + // Get the active profile name from profile engine, not from + // shareddata ( may not be up-to-date after phone restart ) + + if ( ConnectToActiveProfile() ) + { + // Ectract profile name + const MProfileName& profileName = iActiveProfile->ProfileName(); + + return ( profileName.Name() ); + } + + return KNullDesC; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ActiveProfile +// ----------------------------------------------------------------------------- +TInt CScreensaverSharedDataI::ActiveProfile() + { + // Return the current profile Id + TInt profileId = 0; + + // Connect to profile engine + if ( ConnectToProfileEngine() ) + { + profileId = iProfileEngine->ActiveProfileId(); + } + + return profileId; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsHaveNewEmail +// ----------------------------------------------------------------------------- +TBool CScreensaverSharedDataI::IsHaveNewEmail() const + { + TInt state = 0; + // Check the new email state from PubSub + TInt error = RProperty::Get( + KPSUidCoreApplicationUIs, KCoreAppUIsNewEmailStatus, state); + + SCRLOGGER_WRITEF(_L("SCR: QueryNewEmail state=%d error=%d"), state, error); + + if ( ( error == KErrNone ) && ( state == ECoreAppUIsNewEmail ) ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsHaveNewVoicemail +// ----------------------------------------------------------------------------- +TBool CScreensaverSharedDataI::IsHaveNewVoicemail() const + { + // Show the indicator, if either line has messages waiting + if ( ( VoiceMailCount( KCtsyMessageWaitingVoiceMailCount ) > 0 ) + || ( VoiceMailCount( KCtsyMessageWaitingAuxLineCount ) > 0 ) ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsHaveNewInstantMessages +// ----------------------------------------------------------------------------- +TBool CScreensaverSharedDataI::IsHaveNewInstantMessages() const + { + TInt showValue = 0; + TInt error = RProperty::Get( + KPSUidCoreApplicationUIs, KCoreAppUIsUipInd, showValue); + + SCRLOGGER_WRITEF(_L("SCR: QueryNewInstantMessages state=%d error=%d"), + showValue, error); + + return ( ( error == KErrNone ) && ( showValue == ECoreAppUIsShow ) ); + } + + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsSilentMode +// ----------------------------------------------------------------------------- +TBool CScreensaverSharedDataI::IsSilentMode() + { + // Connect to active profile, and return silent mode status + if (ConnectToActiveProfile()) + { + return iActiveProfile->IsSilent(); + } + + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsVibraMode +// ----------------------------------------------------------------------------- +TBool CScreensaverSharedDataI::IsVibraMode() + { + // Get the active profile name from profile engine, not from + // shareddata (may not be up-to-date after phone restart) + if (ConnectToActiveProfile()) + { + // Extract profile vibra setting + return iActiveProfile->ProfileTones().ToneSettings().iVibratingAlert; + } + + return EFalse; + } + +// --------------------------------------------------------------------------- +// CScreensaverSharedDataI::IsOngoingCall() +// --------------------------------------------------------------------------- +// +TBool CScreensaverSharedDataI::IsOngoingCall() + { + TInt state = EPSCTsyCallStateUninitialized; + // Check the call state from PubSub + RProperty::Get( KPSUidCtsyCallInformation, KCTsyCallState, state ); + + return ( state != EPSCTsyCallStateNone && + state != EPSCTsyCallStateUninitialized ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::HandleSessionEventL +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::HandleSessionEventL(TMsvSessionEvent aEvent, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) + { + switch (aEvent) + { + case EMsvEntriesChanged: + AppUi()->ScreensaverView()->UpdateAndRefresh(); + break; + case EMsvCloseSession: + case EMsvServerTerminated: + delete iInboxFolder; + iInboxFolder = NULL; + delete iMsvSession; + iMsvSession = NULL; + break; + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::HandleEntryEventL +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::HandleEntryEventL(TMsvEntryEvent /*aEvent */, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ScreensaverRepository +// ----------------------------------------------------------------------------- +// +CRepository* CScreensaverSharedDataI::ScreensaverRepository() const + { + return iScreensaverRepository; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::CScreensaverSharedDataI +// ----------------------------------------------------------------------------- +// +CScreensaverSharedDataI::CScreensaverSharedDataI() + { + iStartupComplete = EFalse; + } + + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::ConstructL() + { + GetDefaultType(); + ConnectToSSCRL(); + ConnectToPslnSettingCRL(); + ConnectToCommonTsyCRL(); + + // Define and publish "Screensaver is on" property + // Read: pass, Write: Screensaver only + DefineScreensaverProperties( KScreenSaverOn, KSSPolicyWriteSSOnly ); + + // Define and publish "Screensaver activated from idle" property + // Read: pass, Write: Screensaver only + DefineScreensaverProperties( KScreenSaverActivatedFromIdle, KSSPolicyWriteSSOnly ); + + // Define and attach "allow screensaver property" + // Read: Readuserdata, Write: writeuserdata + DefineScreensaverProperties( KScreenSaverAllowScreenSaver, KSSPolicyWriteUserData ); + + // Define and attach "screensaver preview property" + // Read: Readuserdata, Write: writeuserdata + DefineScreensaverProperties( KScreenSaverPreviewMode, KSSPolicyWriteUserData ); + + // Define and attach "screensaver preview state property" + // Read: Readuserdata, Write: writeuserdata + DefineScreensaverProperties( KScreenSaverPreviewState, KSSPolicyWriteUserData ); + + // Define and initialize "current plugin settings changed" property + // Read: pass, Write: pass + DefineScreensaverProperties( KScreenSaverPluginSettingsChanged, KSSPolicyPass ); + + // Define and initialize "no power save mode" property + // Read: pass, Write: pass + DefineScreensaverProperties( KScreenSaverNoPowerSaveMode, KSSPolicyPass ); + + DefineScreensaverProperties( KScreenSaverActivate, KSSPolicyWriteUserData ); + + iDisplayChange = EFalse; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ConnectToSSCR +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::ConnectToSSCRL() + { + iScreensaverRepository = CRepository::NewL( KCRUidScreenSaver ); + + if( iScreensaverRepository ) + iScreensaverRepositoryWatcher = CScreensaverRepositoryWatcher::NewL( + KCRUidScreenSaver, + TCallBack( HandleDisplayObjChanged, this ), + iScreensaverRepository ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ConnectToPslnSettingCRL +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::ConnectToPslnSettingCRL() + { + TRAPD(ret, iSettingsRepository = CRepository::NewL(KCRUidSecuritySettings)); + + if( ret == KErrNone ) + { + iSettingsRepositoryWatcher = CScreensaverRepositoryWatcher::NewL( + KCRUidPersonalizationSettings, + KSettingsAutomaticKeyguardTime, + CCenRepNotifyHandler::EIntKey, + TCallBack(HandleTimeoutChanged, this), + iSettingsRepository); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ConnectToCommonTsyCRL +// Connects to common tsy central repository +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::ConnectToCommonTsyCRL() + { + iCTsyRepository = CRepository::NewL( KCRUidCtsyMessageWaitingIndicator ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ConnectToInboxL +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::ConnectToInboxL() + { + if (!iMsvSession) + { + iMsvSession = CMsvSession::OpenSyncL( *this ); + } + iInboxFolder = iMsvSession->GetEntryL( KMsvGlobalInBoxIndexEntryId ); + + TMsvSelectionOrdering ordering = iInboxFolder->SortType(); + ordering.SetShowInvisibleEntries( EFalse ); + iInboxFolder->SetSortTypeL( ordering ); + + iInboxFolder->AddObserverL( *this ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ConnectToProfileEngine +// Connect to Profile engine. Returns ETrue if successfully connected +// ----------------------------------------------------------------------------- +// +TBool CScreensaverSharedDataI::ConnectToProfileEngine() + { + // Check if already connected + if ( iProfileEngine ) + { + // Done + return ETrue; + } + // The member variable is also used to indicate successful + // connection, hence a pointer instead of just RSystemAgent + TRAPD( err, ( iProfileEngine = CreateProfileEngineL() ) ); + + if ( err != KErrNone ) + { + // Something went wrong on allocation + iProfileEngine = NULL; + return EFalse; + } + + // Successfully connected + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ClearPreviewFlag +// Connect to current active Profile. Returns ETrue if successfully connected +// ----------------------------------------------------------------------------- +// +TBool CScreensaverSharedDataI::ConnectToActiveProfile() + { + InvalidateActiveProfile(); + + if ( ConnectToProfileEngine() ) + { + TRAPD( err, ( iActiveProfile = iProfileEngine->ActiveProfileL() ) ); + if ( ( err == KErrNone ) && ( iActiveProfile ) ) + { + return ETrue; + } + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::DefineScreensaverProperties +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::DefineScreensaverProperties( + TUint32 aKey, const TSecurityPolicy& aWritePolicy ) + { + RProperty::Define( + KPSUidScreenSaver, + aKey, + RProperty::EInt, + KSSPolicyPass, + aWritePolicy ); + + RProperty::Set( KPSUidScreenSaver, aKey, 0); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::HandleTimeoutChanged +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataI::HandleTimeoutChanged(TAny* aPtr) + { + STATIC_CAST(CScreensaverSharedDataI*, aPtr)->ResetInactivityTimeout(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::ResetInactivityTimeout +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::ResetInactivityTimeout() + { + AppUi()->Model().ResetInactivityTimeout(); + } + + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::HandleDisplayObjChanged +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataI::HandleDisplayObjChanged(TAny* aPtr) + { + CScreensaverSharedDataI* self = STATIC_CAST(CScreensaverSharedDataI*, aPtr); + + self->SetDisplayObjChanged( ETrue ); + + self->AppUi()->ScreensaverView()->SetDisplayObject( self->DisplayObjectType() ); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::GetDefaultType +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::GetDefaultType() + { +/* +default type is hardcoded, so commented out below code. +Remove the comment when default type is read from CenRep. + //Store the default screensaver for this device + TBuf<16> screensaverName; + + TInt error = GetDefaultTypeString( screensaverName ); + + if ( KErrNone == error ) + { + if ( screensaverName.CompareF( KScreenSaverTypeNone ) == 0 ) + { + iDefaultType = EDisplayNone; + } + else if ( screensaverName.CompareF( KScreenSaverTypeText ) == 0 ) + { + iDefaultType = EDisplayText; + } + else //go back to the "old" option, ie - Date type + { + iDefaultType = EDisplayTime; + } + } +*/ + +#ifdef USE_DATE_AND_TEXT + iDefaultType = EDisplayTime; +#else + iDefaultType = EDisplayNone; +#endif + + + + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::GetDefaultTypeString +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataI::GetDefaultTypeString( TDes& DefaultScreenSaver ) + { + CRepository* skinsRepository = NULL; + TRAP_IGNORE( skinsRepository = CRepository::NewL( KCRUidPersonalisation ) ); + + TInt error = skinsRepository->Get( KPslnSystemDefaultScreenSaver, + DefaultScreenSaver ); + + delete skinsRepository; + + return error; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::VoiceMailCount +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataI::VoiceMailCount( const TUint32 aKey ) const + { + TInt line(0); + TInt error = KErrNone; + + error = iCTsyRepository->Get( aKey, line ); + + if( error != KErrNone ) + { + line = 0; + } + + return line; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::InvalidateActiveProfile +// Invalidate the cached active profile, so that next call to ConnectToActiveProfile +// will use the newest profile data (in case it has changed) +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::InvalidateActiveProfile() + { + if (iActiveProfile) + { + iActiveProfile->Release(); + iActiveProfile = NULL; + } + } +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::SetDisplayObjChanged +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataI::SetDisplayObjChanged( TBool aChanged ) + { + iDisplayChange = aChanged; + } +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::GetDisplayObjChanged +// ----------------------------------------------------------------------------- +// +TBool CScreensaverSharedDataI::GetDisplayObjChanged()const + { + return iDisplayChange; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataI::AppUi +// ----------------------------------------------------------------------------- +// +CScreensaverAppUi *CScreensaverSharedDataI::AppUi() const + { + return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() ); + } +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b src/screensavershareddatamonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensavershareddatamonitor.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,376 @@ +/* +* Copyright (c) 2003 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: Implementation for screensaver shared data monitoring. +* +*/ + + + +#include +#include +#include +#include // kaknkeyguardstatus +#include // kpsuidctsycallinformation +#include // kpsglobalsystemstate +#include +#include // kuikmmcinserted +#include +#include +#include + +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 +#include +#endif + +#include "screensavershareddatamonitor.h" +#include "screensavershareddatai.h" +#include "screensaverrepositorywatcher.h" +#include "screensaverview.h" +#include "screensaverengine.h" +#include "screensaverappui.h" +#include "screensaversubscriber.h" +#include "screensaverutility.h" + +//System shuttingdown value +const TInt KSystemShuttingdown = 1; + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::~CScreensaverSharedDataMonitor +// ----------------------------------------------------------------------------- +// +CScreensaverSharedDataMonitor::~CScreensaverSharedDataMonitor() + { + DeleteSubscriber( iPreviewModeSubscriber ); + iPreviewModeProperty.Close(); + + DeleteSubscriber( iMMCWatchSubscriber ); + iMMCWatchProperty.Close(); + + DeleteSubscriber( iUSBWatchSubscriber ); + iUSBWatchProperty.Close(); + + DeleteSubscriber( iKeyguardStateSubscriber ); + iKeyguardStateProperty.Close(); + + DeleteSubscriber( iCallStateSubscriber ); + iCallStateProperty.Close(); + + DeleteSubscriber( iShuttingDownSubscriber ); + iShuttingDownProperty.Close(); + + DeleteSubscriber( iActivateSSSubscriber ); + iActivateSSProperty.Close(); + + DeleteSubscriber( iChargerStateSubscriber ); + iChargerStateProperty.Close(); + + delete iMessageWaitingWatcher; + delete iMessageWaitingRepository; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::NewL +// ----------------------------------------------------------------------------- +// +CScreensaverSharedDataMonitor* CScreensaverSharedDataMonitor::NewL( CScreensaverSharedDataI* aData ) + { + CScreensaverSharedDataMonitor* self = new( ELeave )CScreensaverSharedDataMonitor( aData ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self; + return self; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::CScreensaverSharedDataMonitor +// ----------------------------------------------------------------------------- +// +CScreensaverSharedDataMonitor::CScreensaverSharedDataMonitor( + CScreensaverSharedDataI* aData ) + :iData( aData ) + { + // No implementation required + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataMonitor::ConstructL() + { + User::LeaveIfError(iPreviewModeProperty.Attach(KPSUidScreenSaver, KScreenSaverPreviewMode)); + iPreviewModeSubscriber = new (ELeave) CSubscriber(TCallBack(HandlePreviewModeChanged, this), iPreviewModeProperty); + iPreviewModeSubscriber->SubscribeL(); + + + // MMC watcher + User::LeaveIfError(iMMCWatchProperty.Attach(KPSUidUikon, KUikMMCInserted)); + iMMCWatchSubscriber = new (ELeave) CSubscriber( + TCallBack(HandleMMCStateChanged, this), iMMCWatchProperty); + iMMCWatchSubscriber->SubscribeL(); + + // USB watcher (MMC dismount) + User::LeaveIfError(iUSBWatchProperty.Attach( + KPSUidUsbWatcher, KUsbWatcherSelectedPersonality)); + iUSBWatchSubscriber = new (ELeave) CSubscriber( + TCallBack(HandleUSBStateChanged, this), iUSBWatchProperty); + iUSBWatchSubscriber->SubscribeL(); + + // Keyguard state watcher + User::LeaveIfError(iKeyguardStateProperty.Attach( + KPSUidAvkonDomain, KAknKeyguardStatus)); + iKeyguardStateSubscriber = new (ELeave) CSubscriber( + TCallBack(HandleKeyguardStateChanged, this), iKeyguardStateProperty); + iKeyguardStateSubscriber->SubscribeL(); + + // Call state watcher + User::LeaveIfError(iCallStateProperty.Attach( KPSUidCtsyCallInformation, KCTsyCallState ) ); + iCallStateSubscriber = new (ELeave) CSubscriber( + TCallBack(HandleCallStateChanged, this), iCallStateProperty); + iCallStateSubscriber->SubscribeL(); + + // Shutting down state watcher + User::LeaveIfError( iShuttingDownProperty.Attach( KPSUidStartup, KPSGlobalSystemState ) ); + iShuttingDownSubscriber = new (ELeave) CSubscriber( + TCallBack(HandleShuttingDownStateChanged, this), iShuttingDownProperty); + iShuttingDownSubscriber->SubscribeL(); + + User::LeaveIfError( iActivateSSProperty.Attach( KPSUidScreenSaver, KScreenSaverActivate ) ); + iActivateSSSubscriber = new( ELeave ) CSubscriber( + TCallBack( HandleActivateSSChanged, this ), iActivateSSProperty ); + iActivateSSSubscriber->SubscribeL(); + + User::LeaveIfError( iChargerStateProperty.Attach( KPSUidHWRMPowerState, KHWRMChargingStatus ) ); + iChargerStateSubscriber = new (ELeave) CSubscriber( + TCallBack( HandleChargerStateChanged, this ), iChargerStateProperty ); + iChargerStateSubscriber->SubscribeL(); + + iMessageWaitingRepository = CRepository::NewL( KCRUidCtsyMessageWaitingIndicator ); + iMessageWaitingWatcher = CScreensaverRepositoryWatcher::NewL( KCRUidCtsyMessageWaitingIndicator, + TCallBack( HandleMessageWaitingStateChanged, this ), + iMessageWaitingRepository ); + + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::View +// ----------------------------------------------------------------------------- +// +CScreensaverView* CScreensaverSharedDataMonitor::View() + { + return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->ScreensaverView(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::Model +// ----------------------------------------------------------------------------- +// +CScreensaverEngine& CScreensaverSharedDataMonitor::Model() + { + return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->Model(); + } + + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::DeteleSubscriber +// ----------------------------------------------------------------------------- +// +void CScreensaverSharedDataMonitor::DeleteSubscriber( CSubscriber*& aSubscriber ) + { + if ( aSubscriber ) + { + aSubscriber->StopSubscribe(); + } + delete aSubscriber; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::HandlePreviewModeChanged +// Handles preview mode property key change. If key is changed to 1, +// preview mode is started +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataMonitor::HandlePreviewModeChanged(TAny *aPtr) + { + CScreensaverSharedDataMonitor *data = STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr); + + if ( data->iData->ScreensaverPreviewMode() == 1) + { + TRAP_IGNORE( data->Model().StartPreviewModeL() ); + } + + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::HandleMMCStateChanged +// Handles MMC state change callback. If current plugin is loaded from +// MMC, screensaver defaults to date & time when MMC removed +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataMonitor::HandleMMCStateChanged(TAny* aPtr) + { + User::ResetInactivityTime(); + STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr)->Model().StopScreenSaver(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::HandleUSBStateChanged +// Handles USB state change callback. If current plugin is loaded from +// MMC, screensaver defaults to date & time when USB attached +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataMonitor::HandleUSBStateChanged(TAny* aPtr) + { + // Same handler as in MMC removal, parameter tells it's because of USB + User::ResetInactivityTime(); + STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr)->Model().StopScreenSaver(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::HandleKeyguardStateChanged +// Handles keyguards status change callback. +// When keys become locked, screensaver timeout is shortened. +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataMonitor::HandleKeyguardStateChanged(TAny* aPtr) + { + // If keyguard just became unlocked, inform model so that + // short timeout use is reset. Otherwise there might be a situation + // where short timeout was in use, user opened keys, did something + // without letting the device idle for short timeout period and + // locked keys again. Then short timeout would remain in use without this + // notification. + // Also inform of keys locked, in case Screensaver is running this + // happened because of automatic keyguard fired, and screensaver + // should update the display to show the keyguard indicator + CScreensaverSharedDataMonitor* _this = + STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr); + + _this->Model().HandleKeyguardStateChanged( _this->iData->IsKeyguardOn() ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::HandleCallStateChanged +// Handles call state change callback. If call state changes, +// screensaver is stopped +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataMonitor::HandleCallStateChanged(TAny* aPtr) + { +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + // Prevent fullscreen transition from screensaver on incoming call + CAknTransitionUtils::SetData( KScreensaverCallStateChange, (TAny*)1 ); +#endif + User::ResetInactivityTime(); + STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr)->Model().StopScreenSaver(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::HandleShuttingDownStateChanged +// ----------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataMonitor::HandleShuttingDownStateChanged( TAny* /*aPtr*/ ) + { + TInt startupState = -1; + + RProperty::Get( KPSUidStartup, KPSGlobalSystemState, startupState ); + + if( startupState == ESwStateShuttingDown ) + { + RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, KSystemShuttingdown); + } + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::HandleActivateSSChanged +// --------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataMonitor::HandleActivateSSChanged( TAny* aPtr ) + { + TInt activateState = -1; + + RProperty::Get( KPSUidScreenSaver, KScreenSaverActivate, activateState ); + + if( activateState && -1 != activateState ) + { + // Enable SS + SCRLOGGER_WRITE("SharedDataMonitor: Activate SS"); + STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr)->Model().StartScreenSaver(); + } + else if ( !activateState ) + { + // Disable SS + SCRLOGGER_WRITE("SharedDataMonitor: Stop SS"); + STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr)->Model().StopScreenSaver(); + } + else + { + // Unknown state + } + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CScreensaverSharedDataMonitor::HandleChargerStateChanged +// --------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataMonitor::HandleChargerStateChanged( TAny* aPtr ) + { + TInt state = -1; + + RProperty::Get( KPSUidHWRMPowerState, KHWRMChargingStatus, state ); + + switch ( state ) + { + case EChargingStatusError: // Some error has occurred when charger is connected or charging. + case EChargingStatusNotConnected: // Charger not connected/uninitialized + case EChargingStatusCharging: // Device is charging + { + User::ResetInactivityTime(); + STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr)->Model().StopScreenSaver(); + } + break; + case EChargingStatusChargingComplete: // Charging completed + case EChargingStatusNotCharging: // Charger is connected, device not charging + case EChargingStatusAlmostComplete: // Charging almost completed + case EChargingStatusChargingContinued: // Charging continued after brief interruption + default: + break; + } + return KErrNone; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CScreensaverSharedDataMonitor::HandleMessageWaitingStateChanged( TAny* aPtr ) + { + CScreensaverSharedDataMonitor* self = STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr); + if ( self->iMessageWaitingWatcher->ChangedKey() == KCtsyMessageWaitingDisplayStatus ) + { + self->View()->UpdateAndRefresh(); + } + return KErrNone; + } + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaversubscriber.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaversubscriber.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2003 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: Implementation of screensaver shared data Subscriber. +* +*/ + + + +#include "screensaversubscriber.h" + + +// ----------------------------------------------------------------------------- +// CSubscriber::CSubscriber +// ----------------------------------------------------------------------------- +// +CSubscriber::CSubscriber(TCallBack aCallBack, RProperty& aProperty) + : CActive(EPriorityNormal), iCallBack(aCallBack), iProperty(aProperty) + { + CActiveScheduler::Add(this); + } + +// ----------------------------------------------------------------------------- +// CSubscriber::~CSubscriber +// ----------------------------------------------------------------------------- +// +CSubscriber::~CSubscriber() + { + } + +// ----------------------------------------------------------------------------- +// CSubscriber::SubscribeL +// ----------------------------------------------------------------------------- +// +void CSubscriber::SubscribeL() + { + if (!IsActive()) + { + iProperty.Subscribe(iStatus); + SetActive(); + } + } + +// ----------------------------------------------------------------------------- +// CSubscriber::StopSubscribe +// ----------------------------------------------------------------------------- +// +void CSubscriber::StopSubscribe() + { + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CSubscriber::RunL +// ----------------------------------------------------------------------------- +// +void CSubscriber::RunL() + { + if (iStatus.Int() == KErrNone) + { + SubscribeL(); + iCallBack.CallBack(); + } + } + +// ----------------------------------------------------------------------------- +// CSubscriber::DoCancel +// ----------------------------------------------------------------------------- +// +void CSubscriber::DoCancel() + { + iProperty.Cancel(); + } + + +// End of file. diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverutility.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverutility.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,225 @@ +/* +* Copyright (c) 2004 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: Defines screensaver utility tools. +* +*/ + + + +#include +#include +#include +#include + +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 +#include +#endif + +#include "screensaverutility.h" +#include "screensaverappui.h" +#include "ScreensaverUtils.h" + + +// Screensaver window group priority boost (to ensure it's on top) +const TInt KSSWinPriorityBoost = 2; + +_LIT(KSsBitmapName, "\\ssbackground.mbm"); +_LIT(KSsBitmapUserDrive, "c:"); +_LIT(KSsBitmapSystemDrive, "z:"); + +// ----------------------------------------------------------------------------- +// CScreensaverUtility::Panic( TInt aPanic ) +// ----------------------------------------------------------------------------- +// +void ScreensaverUtility::Panic( TInt aPanic ) + { + User::Panic( _L("Screensaver"),aPanic ); + } + + +// ----------------------------------------------------------------------------- +// CScreensaverUtility::FlushDrawBuffer( TInt aPanic ) +// Flushes pending draw commands. A "must" before activating power save +// mode, so that the image can be copied to power save memory +// ----------------------------------------------------------------------------- +// +void ScreensaverUtility::FlushDrawBuffer() + { + CCoeEnv::Static()->WsSession().Flush(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverUtility::ScreenRotated( TInt aPanic ) +// Checks if screen has been rotated +// ----------------------------------------------------------------------------- +// +TBool ScreensaverUtility::ScreenRotated() + { + TPixelsAndRotation pxRot; + CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation(pxRot); + + // Rotated, if 90 or 270 degrees + return ((pxRot.iRotation == CFbsBitGc::EGraphicsOrientationRotated90) + || (pxRot.iRotation == CFbsBitGc::EGraphicsOrientationRotated270)); + } + +// ----------------------------------------------------------------------------- +// ScreensaverUtility::Query12HourClock +// Query whether 12-hour clock is displayed +// ----------------------------------------------------------------------------- +// +TBool ScreensaverUtility::Query12HourClock( ) + { + TLocale locale; + return (locale.TimeFormat() == ETime12); + } + + +// ----------------------------------------------------------------------------- +// ScreensaverUtility::BringToForeground +// ----------------------------------------------------------------------------- +// +void ScreensaverUtility::BringToForeground() + { +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + const TInt KSsaCustomActivateContextNum = 1002; + + GfxTransEffect::BeginFullScreen( KSsaCustomActivateContextNum, TRect( ), + AknTransEffect::EParameterType, AknTransEffect::GfxTransParam( + KUidScreensaverApp, + AknTransEffect::TParameter::EActivateExplicitContinue ) ); +#endif + CEikonEnv::Static()->SetAutoForwarding( ETrue ); + CEikonEnv::Static()->BringForwards( ETrue, ECoeWinPriorityAlwaysAtFront + + KSSWinPriorityBoost ); + } + +// ----------------------------------------------------------------------------- +// ScreensaverUtility::SendToBackground +// ----------------------------------------------------------------------------- +// +void ScreensaverUtility::SendToBackground() + { +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + + // Start the exit effect context even if this is actually application switch. The exit context + // makes possible to map effect by using the *previous* application uid (=Screen Saver). + // Note: Not allowed to call GfxTransEffect::EndFullScreen() as AVKON takes care of that when + // EApplicationExit context is used! + const TInt KSsaCustomDeactivateContextNum = 1001; + + //condition takes care of special case of incomeing call (should not have effect then) + if ( CAknTransitionUtils::GetData( KScreensaverCallStateChange ) == NULL ) + { + if ( static_cast(CCoeEnv::Static()->AppUi())->IsForeground() ) + { + GfxTransEffect::BeginFullScreen( KSsaCustomDeactivateContextNum, + TRect( ), AknTransEffect::EParameterType, + AknTransEffect::GfxTransParam( KUidScreensaverApp, + AknTransEffect::TParameter::EActivateExplicitContinue ) ); + } + } + CAknTransitionUtils::RemoveData( KScreensaverCallStateChange ); +#endif + + CEikonEnv::Static()->BringForwards( EFalse ); + } + +// ----------------------------------------------------------------------------- +// ScreensaverUtility::IsDrivePresent +// ----------------------------------------------------------------------------- +// +TBool ScreensaverUtility::IsDrivePresent(TInt aDrive) + { + RFs& fs = CCoeEnv::Static()->FsSession(); + + TInt error = KErrNone; + TDriveInfo driveInfo; + error = fs.Drive(driveInfo, aDrive ); + + // Not present, locked or unknown is bad + if ((error != KErrNone) || + (driveInfo.iMediaAtt & KMediaAttLocked) || + (driveInfo.iType == EMediaNotPresent) || + (driveInfo.iType == EMediaUnknown)) + { + return EFalse; + } + + // Read-only is fine + return ETrue; + } + +// ----------------------------------------------------------------------------- +// ScreensaverUtility::LoadBitmapL +// ----------------------------------------------------------------------------- +// +CGulIcon* ScreensaverUtility::LoadBitmapL() + { + CGulIcon *icon = CGulIcon::NewL(); + CleanupStack::PushL( icon ); + icon->SetBitmap(new (ELeave) CFbsBitmap()); + CFbsBitmap* mask = new (ELeave) CFbsBitmap(); + + // First try user path and then system path. + TInt error; + TFileName path; + path.Copy(KSsBitmapUserDrive); + path.Append(KDC_APP_BITMAP_DIR); + path.Append(KSsBitmapName); + + for (TInt i = 0; i < 2; i++) + { + error = icon->Bitmap()->Load(path, 0); + if (error == KErrNone) + { + error = mask->Load(path, 1); + if (error != KErrNone) + { + delete mask; + } + else + { + icon->SetMask( mask ); + } + CleanupStack::Pop(); // icon + return icon; + } + path.Copy(KSsBitmapSystemDrive); + path.Append(KDC_APP_BITMAP_DIR); + path.Append(KSsBitmapName); + } + + CleanupStack::PopAndDestroy(); // icon + return NULL; + } + + +// ----------------------------------------------------------------------------- +// ScreensaverUtility::StopWServHeartBeat +// ----------------------------------------------------------------------------- +// +void ScreensaverUtility::StopWServHeartBeat() + { + SCRLOGGER_WRITE("Model: Stopping WServ HB, snoozing..."); + RWsSession ws; + TInt err = ws.Connect( ); + if ( !err ) + { + ws.PrepareForSwitchOff( ); + ws.Close( ); + } + } + +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverview.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,283 @@ +/* +* Copyright (c) 2004 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: Screensaver view class implementation. +* +*/ + + + +#include +#include + +#include "ScreensaverUtils.h" +#include "screensaverview.h" +#include "screensaverappui.h" +#include "screensaverplugin.h" +#include "screensaverutility.h" +#include "screensaverctrlmovingtext.h" +#include "screensaverctrlnone.h" +#include "screensaverctrlplugin.h" +#include "screensaverengine.h" +#include "screensavershareddatai.h" + +const TUid KBigClockScreensaverPluginImplUid = { 0x2002E6DE }; + +// ----------------------------------------------------------------------------- +// CScreensaverView::NewLC +// add this NewLC code called by UI +// ----------------------------------------------------------------------------- +// +CScreensaverView* CScreensaverView::NewL() + { + CScreensaverView* self = new( ELeave ) CScreensaverView(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::CScreensaverView +// ----------------------------------------------------------------------------- +// +CScreensaverView::CScreensaverView() + { + } + + +// ----------------------------------------------------------------------------- +// CScreensaverView::~CScreensaverView +// ----------------------------------------------------------------------------- +// +CScreensaverView::~CScreensaverView( ) + { + DestroyDisplayObject(); + } + + +// ----------------------------------------------------------------------------- +// CScreensaverView::ConstructL +// ----------------------------------------------------------------------------- +// +void CScreensaverView::ConstructL( ) + { + // Let CAknView do its stuff + BaseConstructL(); + + SetDisplayObject( PslnSettingScreensaverType() ); + } + + +// ----------------------------------------------------------------------------- +// CScreensaverView::CreateDisplayObjectL +// ----------------------------------------------------------------------------- +// +void CScreensaverView::CreateDisplayObjectL( TDisplayObjectType aType ) + { + SCRLOGGER_WRITEF(_L("SCR: CScreensaverView::CreateDisplayObjectL "),aType); + + DestroyDisplayObject(); + + switch( aType ) + { + case EDisplayPlugin: + { + iControl = CScreensaverCtrlPlugin::NewL(); + CScreensaverCtrlPlugin* pluginCtrl = + STATIC_CAST( CScreensaverCtrlPlugin*, iControl ); + if ( pluginCtrl->PluginImplementationUid() == + KBigClockScreensaverPluginImplUid ) + { + iIsContentless = ETrue; + } + break; + } + case EDisplayTime: + case EDisplayText: +#ifdef USE_DATE_AND_TEXT + { + iControl = CScreensaverCtrlMovingText::NewL( aType ); + break; + } +#endif + case EDisplayNone: + { + iControl = CScreensaverCtrlNone::NewL(); + // iIsContentless = ETrue; + break; + } + + default: + { + break; + } + } + + iCurrentControlType = aType; + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::SetDisplayObject +// ----------------------------------------------------------------------------- +// +void CScreensaverView::SetDisplayObject( TDisplayObjectType aType ) + { + SCRLOGGER_WRITEF(_L("SCR: CScreensaverView::SetDisplayObject ")); + + TRAPD( error, CreateDisplayObjectL( aType ) ); + + if(error == KErrNone) + return; + + SCRLOGGER_WRITE("ResetDisplayObject() setting default screensaver"); + + TRAP_IGNORE( CreateDisplayObjectL( DefaultScreensaverType() ) ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::CreatePreviewDisplayObjectL +// ----------------------------------------------------------------------------- +// +void CScreensaverView::CreatePreviewDisplayObjectL() + { + SCRLOGGER_WRITEF(_L("SCR: CScreensaverView::CreatePreviewDisplayObjectL ")); + TRAPD( error, CreateDisplayObjectL( PslnSettingScreensaverType() ) ); + + if(error == KErrNone) + { + Model().SharedDataInterface()->SetScreensaverPreviewState( + EScreenSaverPreviewLoaded ); + return; + } + + Model().SharedDataInterface()->SetScreensaverPreviewState( + EScreenSaverPreviewError ); + } + +// --------------------------------------------------------------------------- +// CScreensaverView::IsContentlessScreensaver +// --------------------------------------------------------------------------- +// +TBool CScreensaverView::IsContentlessScreensaver() const + { + return iIsContentless; + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::Id +// ----------------------------------------------------------------------------- +// +TUid CScreensaverView::Id( ) const + { + return KUidScreensaverView; + } + + +// ----------------------------------------------------------------------------- +// CScreensaverView::DoActivateL +// ----------------------------------------------------------------------------- +// +void CScreensaverView::DoActivateL( const TVwsViewId& /*aPrevViewId*/, + TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/) + { + } + + +// ----------------------------------------------------------------------------- +// CScreensaverView::DoDeactivate +// ----------------------------------------------------------------------------- +// +void CScreensaverView::DoDeactivate( ) + { + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::ShowDisplayObject +// ----------------------------------------------------------------------------- +// +void CScreensaverView::ShowDisplayObject() + { + SCRLOGGER_WRITEF(_L("SCR: CScreensaverView::ShowDisplayObject ")); + + iControl->StartDrawObject(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::HideDisplayObject +// ----------------------------------------------------------------------------- +// +void CScreensaverView::HideDisplayObject() + { + SCRLOGGER_WRITEF(_L("SCR: CScreensaverView::HideDisplayObject ")); + iControl->StopDrawObject(); + + if ( !IsContentlessScreensaver() ) + { + ScreensaverUtility::SendToBackground(); + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::UpdateAndRefresh +// Updates indicators and refreshes the display +// ----------------------------------------------------------------------------- +// +void CScreensaverView::UpdateAndRefresh( ) + { + SCRLOGGER_WRITEF(_L("SCR: CScreensaverView::UpdateAndRefresh ")); + iControl->Refresh(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::DefaultScreensaverType +// ----------------------------------------------------------------------------- +// +TDisplayObjectType CScreensaverView::DefaultScreensaverType() + { + return Model().SharedDataInterface()->DefaultScreensaverType(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::PslnSettingScreensaverType +// ----------------------------------------------------------------------------- +// +TDisplayObjectType CScreensaverView::PslnSettingScreensaverType() + { + return Model().SharedDataInterface()->DisplayObjectType(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::Model +// ----------------------------------------------------------------------------- +// +CScreensaverEngine& CScreensaverView::Model() const + { + return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->Model(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverView::DestroyDisplayObject +// ----------------------------------------------------------------------------- +// +void CScreensaverView::DestroyDisplayObject() + { + SCRLOGGER_WRITEF(_L("SCR: CScreensaverView::DestroyDisplayObject ")); + if( iControl ) + { + delete iControl; + iControl = NULL; + } + iIsContentless = EFalse; + } +// End of file diff -r aaeeca1f15af -r e8d784ac1a4b sysdef_1_4_0.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysdef_1_4_0.dtd Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r aaeeca1f15af -r e8d784ac1a4b systemDefinition.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/systemDefinition.xml Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,33 @@ + + + + + + + + +]> + + + +&layer_file; + + +&targetDefinition_file; + + + + +&defaultbuild_file; + + + + + +&defaultclean_file; + + + + diff -r aaeeca1f15af -r e8d784ac1a4b systemDefinitionLayer.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/systemDefinitionLayer.xml Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,7 @@ + + + + + + +