src/screensaverctrlplugin.cpp
changeset 14 8a173132b0aa
parent 2 058b1fc1663a
--- 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 <AknDef.h>
-#include <power_save_display_mode.h>
-
-#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(<rect>, %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