taskswitcher/contextengine/hgfswpreviewprovider/wsplugin/src/previewprovidercrp.cpp
changeset 4 4d54b72983ae
parent 3 fb3763350a08
child 5 c743ef5928ba
--- a/taskswitcher/contextengine/hgfswpreviewprovider/wsplugin/src/previewprovidercrp.cpp	Fri Jan 22 09:35:14 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,437 +0,0 @@
-/*
-* ==============================================================================
-*  Name        : %name: previewprovidercrp.cpp %
-*  Part of     : Hg fast swap preview provider plugin
-*  Description : Preview provider ECOM plugin
-*  Version     : %version: sa1spcx1#8 %
-*
-*  Copyright (c) 2008 Nokia Corporation.
-*  This material, including documentation and any related
-*  computer programs, is protected by copyright controlled by
-*  Nokia Corporation. All rights are reserved. Copying,
-*  including reproducing, storing, adapting or translating, any
-*  or all of this material requires the prior written consent of
-*  Nokia Corporation. This material also contains confidential
-*  information which may not be disclosed to others without the
-*  prior written consent of Nokia Corporation.
-* ==============================================================================
-*/
-
-#include <bldvariant.hrh>
-#ifdef SYMBIAN_BUILD_GCE
-#define NGA
-#endif
-
-#include "previewprovidercrp.h"
-#include "previewmsg.h"
-#include "previewprovidercrplogging.h"
-#include <ecom/implementationproxy.h>
-#include <s32mem.h> //RDesReadStream
-
-#ifdef NGA
-#include <graphics/wsscreendevice.h>
-#endif
-
-// CONSTANTS
-const TInt KImpId( 0x20016BEC );
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::CreateL
-// --------------------------------------------------------------------------
-//
-CWsGraphicDrawer* CPreviewProviderCRP::CreateL()
-    {
-    CPreviewProviderCRP* crp = new (ELeave) CPreviewProviderCRP();
-    CleanupStack::PushL( crp );
-    crp->ConstructL();
-    CleanupStack::Pop( crp );
-    return crp;
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::ConstructL
-// --------------------------------------------------------------------------
-//    
-void CPreviewProviderCRP::ConstructL()
-    { 
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::~CPreviewProviderCRP
-// --------------------------------------------------------------------------
-//    
-CPreviewProviderCRP::~CPreviewProviderCRP()    
-    {
-    Env().UnregisterEventHandler( this );
-    iScreenshots.ResetAndDestroy();
-    iWgIds.Close();
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::DoDraw
-// --------------------------------------------------------------------------
-//
-void CPreviewProviderCRP::DoDraw( MWsGc& /*aGc*/, const TRect& /*aRect*/, 
-    const TDesC8& /*aData*/) const
-    {
-    //draws nothing
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::HandleMessage
-// --------------------------------------------------------------------------
-//    
-void CPreviewProviderCRP::HandleMessage( const TDesC8& aData )
-    {
-    TRAP_IGNORE( DoHandleMessageL( aData ) );
-    }
-    
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::DoHandleMessageL
-// --------------------------------------------------------------------------
-//    
-void CPreviewProviderCRP::DoHandleMessageL( const TDesC8& aData )
-    {  
-    HGLOG_CONTEXT( DoHandleMessageL, HGLOG_LOCAL );
-    HGLOG_IN();
-    
-    RDesReadStream in( aData );
-    switch( in.ReadInt32L() )
-        {
-        case NPreviewMsg::ERegister:
-            {
-            const TInt id = in.ReadInt32L();
-            Register( id );
-            }
-            break;
-        case NPreviewMsg::EUnregister:
-            {
-            const TInt id = in.ReadInt32L();
-            Unregister( id );
-            }
-            break;
-        case NPreviewMsg::EChangeScreen:
-            {
-            const TInt screen = in.ReadInt32L();
-            if ( Env().ScreenCount() )
-                {
-                iScreen = screen;
-                }
-            }
-            break;
-        case NPreviewMsg::ESetPreviewParam:
-            iScreenshotSize.iWidth = in.ReadInt32L();
-            iScreenshotSize.iHeight = in.ReadInt32L();
-            iScreenshotMode = static_cast<TDisplayMode>( in.ReadInt32L() );
-            break;
-        case NPreviewMsg::ETakePreview:
-            ScreenshotL();
-            break;
-        case NPreviewMsg::EAckPreviewReady:
-            RemoveScreenshot( in.ReadInt32L() );
-            break;
-        }
-    
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::ConstructL
-// --------------------------------------------------------------------------
-//    
-void CPreviewProviderCRP::ConstructL( MWsGraphicDrawerEnvironment& aEnv,
-    const TGraphicDrawerId& aId, MWsClient& aOwner, const TDesC8& /*aData*/ )
-    {
-    HGLOG_CONTEXT( ConstructL, HGLOG_LOCAL );
-    HGLOG_IN();
-    
-    BaseConstructL( aEnv, aId, aOwner );
-    aEnv.RegisterEventHandler( this, this, TWservCrEvent::EWindowGroupChanged );
-    
-    HGLOG_OUT();
-    }
-    
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::DoHandleEvent
-// --------------------------------------------------------------------------
-//    
-void CPreviewProviderCRP::DoHandleEvent( const TWservCrEvent& aEvent )
-    {
-    HGLOG_CONTEXT( DoHandleEvent, HGLOG_LOCAL );
-    HGLOG_IN();
-    
-    if ( aEvent.Type() == TWservCrEvent::EWindowGroupChanged )
-        {
-        const TInt wgId = aEvent.WindowGroupIdentifier();
-        if ( iWgIds.FindInOrder( iPrevId ) >= 0 ||
-            ( iPrevId == 0 &&  iPrevReg != 0 ) )
-            {
-            TRAP_IGNORE( ScreenshotL() );
-            iPrevReg = 0;
-            }
-        iPrevId = wgId;
-        }
-    
-    HGLOG_OUT();
-    }
-    
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::ScaleComplete
-// --------------------------------------------------------------------------
-//    
-void CPreviewProviderCRP::ScaleCompleteL( const CFbsBitmap& aBitmap )
-    {
-    HGLOG_CONTEXT( ScaleComplete, HGLOG_LOCAL );
-    HGLOG_IN();
-    
-    const TInt msg[] = {
-            NPreviewMsg::EPreviewReady,
-            iPrevId?iPrevId:iPrevReg,
-            aBitmap.Handle()
-            };
-    TPckgC<TInt[sizeof(msg) / sizeof(TInt)]> buf(msg);
-    User::LeaveIfError( SendMessage( buf ) );
-    HGLOG3( HGLOG_INFO, "size = %dx%d handle = %d",
-        aBitmap.SizeInPixels().iWidth,
-        aBitmap.SizeInPixels().iHeight,
-        aBitmap.Handle() );
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::UnregisterComplete
-// --------------------------------------------------------------------------
-//    
-void CPreviewProviderCRP::UnregisterComplete( TInt aWgId )
-    {
-    HGLOG_CONTEXT( UnregisterComplete, HGLOG_LOCAL );
-    HGLOG_IN();
-    
-    const TInt msg[] = {
-            NPreviewMsg::EUnregisterReady,
-            aWgId,
-            0
-            };
-    TPckgC<TInt[sizeof(msg) / sizeof(TInt)]> buf(msg);
-    SendMessage(buf);
-    
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::Register
-// --------------------------------------------------------------------------
-//    
-void CPreviewProviderCRP::Register( TInt aWgId )
-    {
-    HGLOG_CONTEXT( Register, HGLOG_LOCAL );
-    HGLOG_IN();
-    
-    iPrevReg = aWgId;
-    iWgIds.InsertInOrder( aWgId );
-    
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::Unregister
-// --------------------------------------------------------------------------
-//
-void CPreviewProviderCRP::Unregister( TInt aWgId )
-    {
-    HGLOG_CONTEXT( Unregister, HGLOG_LOCAL );
-    HGLOG_IN();
-    
-    const TInt index = iWgIds.FindInOrder( aWgId );
-    if ( index >= 0 )
-        {
-        iWgIds.Remove( index );
-        }
-    
-    UnregisterComplete( aWgId );
-    
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::ScreenShotL
-// --------------------------------------------------------------------------
-//
-void CPreviewProviderCRP::ScreenshotL()
-    {
-    CFbsBitmap* screenshot = new (ELeave)CFbsBitmap();
-    CleanupStack::PushL( screenshot );
-    ScreenshotL( *screenshot );
-    ScaleCompleteL( *screenshot );
-    iScreenshots.InsertL( screenshot, iScreenshots.Count() );
-    CleanupStack::Pop( screenshot );
-    CheckOverflow();
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::ScreenShotL
-// --------------------------------------------------------------------------
-//
-void CPreviewProviderCRP::ScreenshotL(CFbsBitmap& aBitmap)
-    {
-    HGLOG_CONTEXT( ScreenShot, HGLOG_LOCAL );
-    HGLOG_IN();
-
-    if( 0 > iScreen || Env().ScreenCount() <= iScreen )
-        {
-        //screen offset out of range. skip request
-        User::Leave(KErrArgument);
-        }
-    // Find the screen resolution
-    MWsScreenConfig* screenConfig = 
-        Env().Screen( iScreen )->ObjectInterface<MWsScreenConfig>();    
-    
-    const TSize sz = screenConfig->ScreenModeSizeInPixels();
-
-    // Get the screen buffer (containing screenshot data)
-    MWsFrontBuffer* screenFront = 
-        Env().Screen( iScreen )->ObjectInterface<MWsFrontBuffer>();
-    
-    // With NGA we do not support downscaling of the screenshots.
-    // So use the size of the screen if no screenshot size has been explicitly
-    // set or if the old method for taking screenshots is not available.
-    if ( iScreenshotSize.iWidth == 0 || 
-         iScreenshotSize.iHeight == 0 || 
-         !screenFront )
-        {
-        iScreenshotSize = sz;
-        }
-    // Use the the same DisplayMode as for the source image
-    // so override the display mode, ignoring any requests.
-    iScreenshotMode = screenConfig->DisplayMode();
-    
-    HGLOG3( HGLOG_INFO, "iShotSize: %dx%d mode: %d",
-        iScreenshotSize.iWidth, iScreenshotSize.iHeight, iScreenshotMode );
-    
-    aBitmap.Reset();
-    User::LeaveIfError( aBitmap.Create( iScreenshotSize, iScreenshotMode ) );
-  
-    // Check if front buffer is available.
-    // Will always be NULL with NGA.
-    if ( screenFront )
-        {
-        HGLOG0( HGLOG_INFO, "non-NGA, using front buffer" );
-        FrontBufferScreenShot( aBitmap, *screenFront, sz, screenConfig->Stride() );
-        }
-#ifdef NGA
-    else
-        {
-        HGLOG0( HGLOG_INFO, "NGA, using CopyScreenToBitmapL" );
-        MWsScreenDevice* screenDevice = static_cast<MWsScreenDevice*>(
-            Env().Screen( iScreen )->ResolveObjectInterface(
-                MWsScreenDevice::EWsObjectInterfaceId ) );
-        User::LeaveIfNull( screenDevice );
-        screenDevice->CopyScreenToBitmapL( &aBitmap, iScreenshotSize );
-        }
-#endif
-    HGLOG_OUT();
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::RemoveShot
-// --------------------------------------------------------------------------
-//
-void CPreviewProviderCRP::RemoveScreenshot( TInt aBitmapHandle )
-    {
-    for( int iter(0); iter < iScreenshots.Count(); ++iter )
-        {
-        if( iScreenshots[iter]->Handle() == aBitmapHandle )
-            {
-            delete iScreenshots[iter];
-            iScreenshots.Remove(iter);
-            break;
-            }
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::CheckOverflow
-// --------------------------------------------------------------------------
-//
-void CPreviewProviderCRP::CheckOverflow()
-    {
-    TInt overflow( iScreenshots.Count() - KMaxShots);
-    while( 0 < overflow-- )
-        {
-        delete iScreenshots[0];
-        iScreenshots.Remove(0);
-        }
-    }
-
-// --------------------------------------------------------------------------
-// CPreviewProviderCRP::FrontBufferScreenShot
-// --------------------------------------------------------------------------
-//    
-void CPreviewProviderCRP::FrontBufferScreenShot( CFbsBitmap& aBitmap, 
-                                                 MWsFrontBuffer& aFront, 
-                                                 const TSize& aSrcSize, 
-                                                 TInt aSrcStride )
-    {
-    HGLOG_CONTEXT( CPreviewProviderCRP::FrontBufferScreenShot, HGLOG_LOCAL );
-    HGLOG_IN();
-    
-    const TUint8* src = static_cast<const TUint8*> ( aFront.GetBits() );
-    HGLOG1( HGLOG_INFO, "src address = [%d]", src );
-        
-    TInt srcstride( aSrcStride );
-    TInt srcwidth( aSrcSize.iWidth );
-    TInt srcheight( aSrcSize.iHeight ); 
-    TInt dststride( aBitmap.DataStride() );
-    TInt dstheight( iScreenshotSize.iHeight );
-    TInt dstwidth( iScreenshotSize.iWidth );
-    TInt stepdst( dststride / dstwidth );
-    TInt stepsrc( srcstride / srcwidth );
-    // scale must be TInt type
-    TInt scaleX( aSrcSize.iWidth / iScreenshotSize.iWidth );
-    TInt scaleY( aSrcSize.iHeight / iScreenshotSize.iHeight );
-    
-    aBitmap.LockHeap();
-    
-    TUint8* dst = ( TUint8* ) aBitmap.DataAddress();
-    
-    TInt minWidth = Min( srcwidth, dstwidth );
-    TInt minHeight = Min( srcheight, dstheight );
-    TInt minStep = Min( stepsrc, stepdst );
-    
-    for ( TInt y = minHeight; y > 0; y-- )
-         {
-         for ( TInt x = minWidth; x > 0; x-- )
-             {
-             Mem::Copy( dst, src, minStep );
-             dst += stepdst;
-             src += scaleX*stepdst;
-             }
-         src += srcstride - scaleX * stepdst * minWidth;
-         src += ( scaleY - 1 ) * srcstride;
-         }
-         
-    aBitmap.UnlockHeap();
-    HGLOG_OUT();
-    }
-    
-// --------------------------------------------------------------------------
-// KImplementationTable
-// --------------------------------------------------------------------------
-//    
-LOCAL_C const TImplementationProxy KImplementationTable[] = 
-    {
-    IMPLEMENTATION_PROXY_ENTRY(KImpId, CPreviewProviderCRP::CreateL)
-    };
-
-// --------------------------------------------------------------------------
-// ImplementationGroupProxy
-// --------------------------------------------------------------------------
-//    
-EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
-    {
-    aTableCount = (sizeof(KImplementationTable) / sizeof(TImplementationProxy));
-    return KImplementationTable;
-    }
-
-
-// End of file