taskswitcher/contextengine/hgfswpreviewprovider/src/previewprovider.cpp
changeset 2 08c6ee43b396
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/taskswitcher/contextengine/hgfswpreviewprovider/src/previewprovider.cpp	Mon Jan 18 20:10:36 2010 +0200
@@ -0,0 +1,586 @@
+/*
+* ==============================================================================
+*  Name        : %name: previewprovider.cpp %
+*  Part of     : Hg fast swap preview provider plugin
+*  Description : Preview provider API
+*  Version     : %version: sa1spcx1#3 %
+*
+*  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 "hgpreviewprovider.h"
+#include "hgpreviewobserver.h"
+#include "previewmsg.h"
+#include "previewproviderlogging.h"
+#include <w32std.h>
+#include <s32mem.h>
+#include <e32property.h>
+
+#define SZ( x ) ( sizeof( x ) / sizeof( TInt ) )
+
+// CONSTANTS
+
+// Publish & subscribe UID (akncapserver.exe SID so that it can define the keys)
+const TUid KPSUidPreviewProvider = { 0x10207218 };
+
+// P&S keys
+const TUint32 KPSKeyWgId = 0x20016BE1;
+const TUint32 KPSKeyFbsBitmapId = 0x20016BE2;
+const TUint32 KPSKeyOperation = 0x20016BE3;
+
+/**
+ * Operation which will be done after P&S keys have changed.
+ */
+enum TPreviewOperation
+    {
+    EOperationNone,
+    EOperationUnregister,
+    EOperationBitmapUpdated
+    };
+
+/**
+ * CPropertyListener
+ */
+NONSHARABLE_CLASS( CPropertyListener ) : public CActive
+    {
+public:
+    static CPropertyListener* NewL( MHgFastSwapPreviewObserver& aObs );
+    virtual ~CPropertyListener();
+    
+protected:
+    CPropertyListener( MHgFastSwapPreviewObserver& aObs );
+    void ConstructL();  
+
+private: // From CActive
+    void RunL();
+    void DoCancel();
+    
+private:    
+    void ReadPropertiesL();
+    void DefinePropertyL( TInt aPSKey ); 
+    void Subscribe();
+
+private:
+    MHgFastSwapPreviewObserver& iObs;
+    RProperty iProperty;
+   
+    TInt iWgId;
+    TInt iFbsBitmapId;
+    
+    TPreviewOperation iOperation;
+    };
+
+// --------------------------------------------------------------------------
+// CPropertyListener::~CPropertyListener
+// --------------------------------------------------------------------------
+//
+CPropertyListener::~CPropertyListener()
+    {
+    Cancel();
+    iProperty.Close();
+    }
+
+// --------------------------------------------------------------------------
+// CPropertyListener::CPropertyListener
+// --------------------------------------------------------------------------
+//
+CPropertyListener::CPropertyListener( MHgFastSwapPreviewObserver& aObs ) : 
+    CActive( CActive::EPriorityHigh ), iObs( aObs )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPropertyListener::NewL
+// --------------------------------------------------------------------------
+//
+CPropertyListener* CPropertyListener::NewL( MHgFastSwapPreviewObserver& aObs )
+    {
+    CPropertyListener* self = new ( ELeave ) CPropertyListener( aObs );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;    
+    }
+
+// --------------------------------------------------------------------------
+// CPropertyListener::RunL
+// --------------------------------------------------------------------------
+//
+void CPropertyListener::RunL()
+    {
+    // Resubscribe before processing new value to prevent missing updates
+    Subscribe();
+    
+    // Read all properties to member variables
+    ReadPropertiesL();
+    
+    // Do the callback
+    switch( iOperation )
+        {
+        case EOperationUnregister:
+            {
+            iObs.HandleFswPpApplicationUnregistered( iWgId );
+            break;            
+            }        
+        case EOperationBitmapUpdated:
+            {
+            iObs.HandleFswPpApplicationChange( iWgId, iFbsBitmapId );
+            break;
+            }
+        default:
+            break;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPropertyListener::DoCancel
+// --------------------------------------------------------------------------
+//
+void CPropertyListener::DoCancel()
+    {
+    iProperty.Cancel();
+    }
+
+// --------------------------------------------------------------------------
+// CPropertyListener::ReadProperties
+// --------------------------------------------------------------------------
+//
+void CPropertyListener::ReadPropertiesL()
+    {
+    // Read all properties
+    User::LeaveIfError( iProperty.Get( KPSUidPreviewProvider, KPSKeyWgId, iWgId ) );
+    User::LeaveIfError( iProperty.Get( KPSUidPreviewProvider, KPSKeyFbsBitmapId, iFbsBitmapId ) );
+    TInt operation( 0 );
+    User::LeaveIfError( iProperty.Get( KPSUidPreviewProvider, KPSKeyOperation, operation ) );
+    iOperation = static_cast<TPreviewOperation>( operation );    
+    }
+
+// --------------------------------------------------------------------------
+// CPropertyListener::DefinePropertyL
+// --------------------------------------------------------------------------
+//
+void CPropertyListener::DefinePropertyL( TInt aPSKey )
+    {
+    TInt err = RProperty::Define( KPSUidPreviewProvider, aPSKey, RProperty::EInt );
+    // Don't mind the already exists error
+    if ( err != KErrAlreadyExists && err != KErrPermissionDenied )
+        {
+        User::LeaveIfError( err );
+        }    
+    }
+
+// --------------------------------------------------------------------------
+// CPropertyListener::Subscribe
+// --------------------------------------------------------------------------
+//
+void CPropertyListener::Subscribe()
+    {
+    iProperty.Subscribe( iStatus );
+    SetActive();  
+    }
+
+// --------------------------------------------------------------------------
+// CPropertyListener::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPropertyListener::ConstructL()
+    {
+    HGLOG_CONTEXT( ConstructL, HGLOG_LOCAL );
+    HGLOG_IN();
+    
+    DefinePropertyL( KPSKeyWgId );
+    DefinePropertyL( KPSKeyFbsBitmapId );
+    DefinePropertyL( KPSKeyOperation );
+    
+    User::LeaveIfError( iProperty.Attach( KPSUidPreviewProvider, KPSKeyWgId ) );
+    CActiveScheduler::Add( this );
+    
+    // initial subscription
+    Subscribe();
+    
+    HGLOG_OUT();    
+    }
+
+/**
+ * CHgFastSwapPreviewProviderClient
+ */
+NONSHARABLE_CLASS( CHgFastSwapPreviewProviderClient ) : public CWsGraphic
+    {
+public:
+    CHgFastSwapPreviewProviderClient( MHgFastSwapPreviewObserver& aObs );
+    void ConstructL();
+    void Register( TInt aWgId );
+    void Unregister( TInt aWgId );
+    void ChangeScreen( TInt aScreenNo );
+    void SetPreviewParam( const TSize& aSize, TDisplayMode aMode );
+    void TakePreview();
+    void AckPreview( TInt aPreviewId );
+    virtual ~CHgFastSwapPreviewProviderClient();
+private:
+    void HandleMessage( const TDesC8& aData );
+    void OnReplace();
+private:
+    void DoHandleMessageL( const TDesC8& aData );
+    void SetProperties( TInt aHandle, TInt aWgId, TInt aOp );    
+private:
+    MHgFastSwapPreviewObserver& iObs;
+    CPropertyListener* iListener;
+    };
+
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::CHgFastSwapPreviewProviderClient
+// --------------------------------------------------------------------------
+//
+CHgFastSwapPreviewProviderClient::CHgFastSwapPreviewProviderClient(
+        MHgFastSwapPreviewObserver& aObs ) : iObs( aObs )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::~CHgFastSwapPreviewProviderClient
+// --------------------------------------------------------------------------
+//
+CHgFastSwapPreviewProviderClient::~CHgFastSwapPreviewProviderClient()
+    {
+    delete iListener;
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::ConstructL
+// --------------------------------------------------------------------------
+//
+void CHgFastSwapPreviewProviderClient::ConstructL()
+    {
+    HGLOG_CONTEXT( ConstructL, HGLOG_LOCAL );
+    HGLOG_IN();
+
+    const TUid id = { 0x20016BEC };
+    BaseConstructL( id, KNullDesC8 );
+    iListener = CPropertyListener::NewL( iObs );
+    
+    HGLOG_OUT();        
+    }    
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::Register
+// --------------------------------------------------------------------------
+//    
+void CHgFastSwapPreviewProviderClient::Register( TInt aWgId )
+    {
+    HGLOG_CONTEXT( Register, HGLOG_LOCAL );
+    HGLOG_IN();
+    
+    const TInt msg[] = {
+        NPreviewMsg::ERegister,
+        aWgId
+        };
+    TPckgC<TInt[SZ(msg)]> buf(msg);
+    SendMessage(buf);
+    Flush();
+
+    HGLOG_OUT();
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::Unregister
+// --------------------------------------------------------------------------
+//    
+void CHgFastSwapPreviewProviderClient::Unregister( TInt aWgId )
+    {
+    HGLOG_CONTEXT( Unregister, HGLOG_LOCAL );
+    HGLOG_IN();
+
+    const TInt msg[] = {
+        NPreviewMsg::EUnregister,
+        aWgId
+        };
+    TPckgC<TInt[SZ(msg)]> buf(msg);
+    SendMessage(buf);
+    Flush();
+    
+    HGLOG_OUT();
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::ChangeScreen
+// --------------------------------------------------------------------------
+//    
+void CHgFastSwapPreviewProviderClient::ChangeScreen( TInt aScreenNo )
+    {
+    HGLOG_CONTEXT( ChangeScreen, HGLOG_LOCAL );
+    HGLOG_IN();
+    
+    const TInt msg[] = {
+        NPreviewMsg::EChangeScreen,
+        aScreenNo
+        };
+    TPckgC<TInt[SZ(msg)]> buf(msg);
+    SendMessage(buf);
+    Flush();
+    
+    HGLOG_OUT();     
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::SetPreviewParam
+// --------------------------------------------------------------------------
+//    
+void CHgFastSwapPreviewProviderClient::SetPreviewParam(const TSize& aSize,
+        TDisplayMode aMode)
+    {
+    HGLOG_CONTEXT( SetPreviewParam, HGLOG_LOCAL );
+    HGLOG_IN();
+    
+    const TInt msg[] = {
+        NPreviewMsg::ESetPreviewParam,
+        aSize.iWidth,
+        aSize.iHeight,
+        static_cast<TInt>(aMode)
+        };
+    TPckgC<TInt[SZ(msg)]> buf(msg);
+    SendMessage(buf);
+    Flush();
+
+    HGLOG_OUT();
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::TakePreview 
+// --------------------------------------------------------------------------
+//    
+void CHgFastSwapPreviewProviderClient::TakePreview()
+    {
+    HGLOG_CONTEXT( TakePreview, HGLOG_LOCAL );
+    HGLOG_IN();
+    
+    TPckgC<TInt> buf(NPreviewMsg::ETakePreview);
+    SendMessage(buf);
+    Flush();
+    
+    HGLOG_OUT();      
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::AckPreview 
+// --------------------------------------------------------------------------
+//
+void CHgFastSwapPreviewProviderClient::AckPreview( TInt aPreviwId )
+    {
+    HGLOG_CONTEXT( TakePreview, HGLOG_LOCAL );
+    HGLOG_IN();
+    
+    const TInt msg[] = { NPreviewMsg::EAckPreviewReady,
+                         aPreviwId };
+    TPckgC<TInt[SZ(msg)]> buf(msg);
+    SendMessage(buf);
+    Flush();
+    
+    HGLOG_OUT();
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::HandleMessage
+// --------------------------------------------------------------------------
+//    
+void CHgFastSwapPreviewProviderClient::HandleMessage( const TDesC8& aData )
+    {
+    TRAP_IGNORE(DoHandleMessageL(aData));
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::DoHandleMessageL
+// --------------------------------------------------------------------------
+//
+void CHgFastSwapPreviewProviderClient::DoHandleMessageL( const TDesC8& aData )
+    {
+    HGLOG_CONTEXT( DoHandleMessageL, HGLOG_LOCAL );
+    HGLOG_IN();
+    
+    RDesReadStream in( aData );
+    TInt message = in.ReadInt32L();
+    switch ( message )
+        {
+        case NPreviewMsg::EPreviewReady:
+            {
+            const TInt id = in.ReadInt32L();
+            const TInt handle = in.ReadInt32L();    
+            SetProperties( handle, id, EOperationBitmapUpdated );
+            }
+            break;
+        case NPreviewMsg::EUnregisterReady:
+            {
+            const TInt id = in.ReadInt32L();
+            const TInt handle = in.ReadInt32L();
+            SetProperties( handle, id, EOperationUnregister );
+            }
+            break;
+        }
+
+    HGLOG_OUT();
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::SetProperties
+// --------------------------------------------------------------------------
+//
+void CHgFastSwapPreviewProviderClient::SetProperties(TInt aHandle, TInt aWgId,
+        TInt aOp)
+    {
+    // Notify CPropertyListener via P&S
+    RProperty::Set( KPSUidPreviewProvider, KPSKeyFbsBitmapId, aHandle );
+    RProperty::Set( KPSUidPreviewProvider, KPSKeyOperation, aOp );
+    // KPSKeyWgId should be notified first since that is being listened 
+    // by CPropertyListener 
+    RProperty::Set( KPSUidPreviewProvider, KPSKeyWgId, aWgId );    
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProviderClient::OnReplace
+// --------------------------------------------------------------------------
+//
+void CHgFastSwapPreviewProviderClient::OnReplace()
+    {
+    }
+    
+/////////////////////////////////////////////////////////////////////////////
+
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::NewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CHgFastSwapPreviewProvider* CHgFastSwapPreviewProvider::NewL(
+        MHgFastSwapPreviewObserver& aObs)
+    {
+    CHgFastSwapPreviewProvider* p = new (ELeave) CHgFastSwapPreviewProvider();
+    CleanupStack::PushL( p );
+    p->ConstructL( aObs );
+    CleanupStack::Pop( p );
+    return p;
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::~CHgFastSwapPreviewProvider
+// --------------------------------------------------------------------------
+//    
+EXPORT_C CHgFastSwapPreviewProvider::~CHgFastSwapPreviewProvider()
+    {
+    if ( iClient )
+        {
+        iClient->Destroy();
+        }
+    delete iClient;
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::Register
+// --------------------------------------------------------------------------
+//    
+EXPORT_C TInt CHgFastSwapPreviewProvider::Register( TInt aWgId )
+    {
+    iClient->Register( aWgId );
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::Unregister
+// --------------------------------------------------------------------------
+//    
+EXPORT_C TInt CHgFastSwapPreviewProvider::Unregister( TInt aWgId )    
+    {
+    iClient->Unregister( aWgId );
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::ChangeScreen
+// --------------------------------------------------------------------------
+//    
+EXPORT_C TInt CHgFastSwapPreviewProvider::ChangeScreen( TInt aScreenId )
+    {
+    iClient->ChangeScreen( aScreenId );
+    return KErrNone;
+    }    
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::SetPreviewParam
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CHgFastSwapPreviewProvider::SetPreviewParam(const TSize& aSize,
+        TDisplayMode aMode)
+    {
+    HGLOG_CONTEXT( SetPreviewParam, HGLOG_LOCAL );
+    HGLOG_IN();
+    
+    TInt error( KErrNone );
+    
+    if ( aMode == ENone || aMode == EColor64K )
+        {
+        iClient->SetPreviewParam( aSize, aMode );        
+        }
+    else
+        {
+        error = KErrNotSupported;
+        }
+   
+    HGLOG_OUT();
+    return error;
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::TakePreview
+// --------------------------------------------------------------------------
+//    
+EXPORT_C TInt CHgFastSwapPreviewProvider::TakePreview()
+    {
+    // Reset timer for screensaver (dismiss screensaver)
+    User::ResetInactivityTime(); 
+           
+    iClient->TakePreview();
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::AckPreview
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CHgFastSwapPreviewProvider::AckPreview( TInt aPreviewId )
+    {
+    iClient->AckPreview( aPreviewId );
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::CHgFastSwapPreviewProvider
+// --------------------------------------------------------------------------
+//    
+CHgFastSwapPreviewProvider::CHgFastSwapPreviewProvider()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CHgFastSwapPreviewProvider::ConstructL
+// --------------------------------------------------------------------------
+//    
+void CHgFastSwapPreviewProvider::ConstructL( MHgFastSwapPreviewObserver& aObs )
+    {
+    HGLOG_CONTEXT( ConstructL, HGLOG_LOCAL );
+    HGLOG_IN();
+    
+    iClient = new ( ELeave ) CHgFastSwapPreviewProviderClient( aObs );
+    iClient->ConstructL();
+    
+    HGLOG_OUT();
+    }
+
+// End of file
+