diff -r 058b1fc1663a -r 8a173132b0aa src/screensaverctrlplugin.cpp --- a/src/screensaverctrlplugin.cpp Mon Jan 18 20:19:52 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,648 +0,0 @@ -/* -* 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 - 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. - Array().SetDependencyStatus( ESsKeyLockInd, !Model().SharedDataInterface()->IsKeyguardOn() ); - 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; - } - -// 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 ); - } - -// ----------------------------------------------------------------------------- -// 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() ); - - View()->ShowDisplayObject(); - - if ( aTime >= 0 ) - { - CScreensaverEngine& model = MUTABLE_CAST( CScreensaverEngine&, Model() ); - - 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 ) - { - 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(); - - TUint screenSaverPluginImpUid; - - // Get the UID - TInt err = lex.Val( screenSaverPluginImpUid, EHex ); - - // Bail out, if the UID is not parseable - if ( err != KErrNone ) - { - iPlugin = NULL; - } - //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( - TUid::Uid( screenSaverPluginImpUid ) ) ) ); - - if( err != KErrNone ) - return; - - TRAP( err, err = iPlugin->InitializeL( this ) ); - - if( err != KErrNone ) - { - // Loaded OK, but failed to initialize - cannot use plugin - 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