uiacceltk/hitchcock/ServerCore/Src/alfsrvtranseffect.cpp
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/ServerCore/Src/alfsrvtranseffect.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,446 @@
+/*
+* 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:   Transition effect framework
+*
+*/
+
+
+
+
+
+#include "alflogger.h"
+#include "alf/alfappserver.h"
+#include "alf/alfappui.h"
+#include "alf/alfconstants.h"
+#include "alfsrvdisplaysubsession.h"
+#include "alfsrvcontrolgroupsubsession.h"
+#include "alfsrvsettingshandler.h"
+
+#include <coemain.h>
+#include <mm/mmcleanup.h>
+#include <pslninternalcrkeys.h>
+#include <centralrepository.h>
+#include <akntranseffect.h> 
+
+#include <uiacceltk/HuiControl.h>
+#include <uiacceltk/HuiControlGroup.h>
+#include <uiacceltk/HuiDisplay.h>
+#include <uiacceltk/HuiDisplayCoeControl.h>
+#include <uiacceltk/HuiEnv.h>
+#include <uiacceltk/HuiTextVisual.h>
+#include <uiacceltk/HuiTransformation.h>
+#include <uiacceltk/HuiBorderBrush.h>
+#include <uiacceltk/HuiImageVisual.h>
+#include <uiacceltk/HuiGridLayout.h>
+#include <uiacceltk/HuiTextureProcessor.h>
+#include <uiacceltk/HuiSegmentedTexture.h>
+
+
+#include "alfsrvtranseffect.h"
+
+
+// ============================ LOCAL CLASS ===============================
+
+/**
+ * This helper class implements listener for any CenRep key. 
+ *
+ */
+NONSHARABLE_CLASS( CAlfCenRep ) : public CActive
+    {
+public:  // New  
+    static CAlfCenRep* NewL( TInt aPriority, const TUid& aRepository, TUint32 aKey );
+    ~CAlfCenRep();
+    
+    /**
+     * Gets the current stored value of the key.
+     */
+    TInt GetValue( TInt& aValue );
+    
+private: // From CActive
+    void RunL();
+    void DoCancel();
+    
+private: // New
+    CAlfCenRep( TInt aPriority, const TUid& aRepository, TInt aKey );
+    void ConstructL();
+
+private: // Data
+	CRepository *iCenRep;
+    TUid iRepository;
+    TInt iKey;
+    TInt iValue;
+    TInt iError;
+    };
+
+
+// ============================ LOCAL CLASS MEMBER FUNCTIONS ================
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CAlfCenRep::CAlfCenRep( TInt aPriority, const TUid& aRepository, TInt aKey ) :
+    CActive( aPriority ),
+    iRepository( aRepository ),
+    iKey( aKey )
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void CAlfCenRep::ConstructL()
+    {
+    iCenRep = CRepository::NewL( iRepository );
+    CActiveScheduler::Add( this );
+    RunL();
+    }
+    
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CAlfCenRep* CAlfCenRep::NewL( TInt aPriority, const TUid& aRepository, TUint32 aKey )
+    {
+    CAlfCenRep* self = new (ELeave) CAlfCenRep( aPriority, aRepository, aKey );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CAlfCenRep::~CAlfCenRep()
+    {
+    Cancel();
+    delete iCenRep;
+    }
+    
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void CAlfCenRep::RunL()
+    {
+    TInt value;
+    iError = iCenRep->Get( iKey, value );
+    if( iError == KErrNone )
+    	{
+    	iValue = value;
+    	}
+    iError = iCenRep->NotifyRequest( iKey, iStatus );
+    
+    if( iError == KErrNone )
+    	{
+    	SetActive();
+    	}
+    }
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+TInt CAlfCenRep::GetValue( TInt& aValue )
+	{
+	if(iError != KErrNone) //if we had an error eariler
+		{
+		TInt value;
+		iError = iCenRep->Get( iKey, value ); //try to get the value
+		if(iError == KErrNone)
+			{
+			iValue = value;
+			iError = iCenRep->NotifyRequest( iKey, iStatus ); //try to start request
+			if(iError == KErrNone)
+				{
+				SetActive();
+				}
+			}
+		}
+	aValue = iValue;
+	return iError;
+	}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void CAlfCenRep::DoCancel()
+    {
+    iCenRep->NotifyCancel( iKey );
+    }
+
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructors
+// ---------------------------------------------------------------------------
+//
+CAlfSrvTransEffect::CAlfSrvTransEffect()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+CAlfSrvTransEffect* CAlfSrvTransEffect::NewL()
+    {
+    CAlfSrvTransEffect* me = new (ELeave) CAlfSrvTransEffect();
+    CleanupStack::PushL(me);
+    me->ConstructL();
+    CleanupStack::Pop();
+    return me;
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CAlfSrvTransEffect::ConstructL()
+    {    
+    // Load transition effect plugins
+	PopulateEffectArrayL();
+    
+    if (iEffectPlugins.Count() > 0)
+    	{
+    	iIsEnabled = ETrue;
+    	}
+        
+    // Start listening Avkon effect system state 
+    iAvkonTfxStateListener = CAlfCenRep::NewL( 
+    	EPriorityHigh, KCRUidThemes, KThemesTransitionEffects );   
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CAlfSrvTransEffect::~CAlfSrvTransEffect()
+    {
+    delete iAvkonTfxStateListener;
+    
+	iEffectPlugins.ResetAndDestroy();
+	
+	iEffectMap.Close();
+    
+   	REComSession::FinalClose(); 
+    }
+
+
+// -----------------------------------------------------------------------------
+// Get a list of plugin implementations via ECom, construct the plugins and 
+// add them to the array.
+// -----------------------------------------------------------------------------
+//
+void CAlfSrvTransEffect::PopulateEffectArrayL()
+	{
+	// Get a list of all plugins from ECom
+	TEComResolverParams resolverParams;
+	resolverParams.SetDataType ( KAlfTransEffectPluginTypeStringDesc );
+	resolverParams.SetWildcardMatch ( EFalse );
+	RImplInfoPtrArray implInfoArray;
+	REComSession::ListImplementationsL( KAlfTransEffectPluginInterfaceUid, 
+		resolverParams, implInfoArray );
+	CleanupResetAndDestroyPushL( implInfoArray ); // Note: intentionally called only after ListImplementationsL()
+    
+	__ALFLOGSTRING1("ALF: CAlfSrvTransEffect::PopulateExtensionArrayL(): extension count: %d",
+		implInfoArray.Count())
+	
+	// Create each plugin via ECom and add it to the list 
+	for ( TInt i = 0; i < implInfoArray.Count(); i++ )
+		{		
+		MAlfTransEffectPlugin* plugin = NULL;
+		
+		// Trap the construction as if one plugin fails to construct it 
+		// should not stop others from constructing
+		TRAPD( error, plugin = reinterpret_cast <MAlfTransEffectPlugin*> ( REComSession::CreateImplementationL( 
+			implInfoArray[i]->ImplementationUid(), _FOFF (MAlfTransEffectPlugin, iDtor_ID_Key) ) ) );
+	
+		TInt countAddedEffects = 0;
+		if ( !error && ( plugin != NULL ) )
+			{
+			RArray<TInt> effectIds;
+			CleanupClosePushL( effectIds );
+			
+			plugin->GetSupportedEffects( effectIds );
+			TInt count = effectIds.Count();
+			if ( count > 0 )
+				{
+				for ( TInt ii = 0; ii < count; ii++ )
+					{
+					TInt mapError = iEffectMap.InsertInSignedKeyOrder( CAlfSrvTransEffect::TEffectMapItem( effectIds[ii], plugin ) );
+					if ( mapError == KErrNone ) 
+						{
+						countAddedEffects++;
+						}
+					else // You cannot insert duplicate effects (with same effect ID)
+						{
+						__ALFLOGSTRING3("Alf: CAlfSrvTransEffect::PopulateExtensionArrayL. Cannot insert effect id to the map array. Imp.uid=%d, effect id=%d, error=%d", 						
+							implInfoArray[i]->ImplementationUid().iUid, effectIds[ii], error)
+						}
+					}
+				}
+			CleanupStack::PopAndDestroy( &effectIds );
+			}
+		
+		// Add plugin to the array if it has at least one effect that has been
+		// successfully registered.	
+		if ( !error && ( plugin != NULL ) && ( countAddedEffects > 0 ) )
+			{
+			iEffectPlugins.AppendL( plugin );
+			}
+		else
+			{
+			// If the plugin is failing we skip that.
+			__ALFLOGSTRING3("Alf: CAlfSrvTransEffect::PopulateExtensionArrayL. Cannot add plugin, uid=%d, error=%d, plugin=%d", 
+				implInfoArray[i]->ImplementationUid().iUid, error, plugin )
+			__ALFLOGSTRING1("                                                  countAddedEffects=%d", 
+				countAddedEffects )
+			delete( plugin );
+			}		
+		} // for
+
+	CleanupStack::PopAndDestroy( &implInfoArray );
+	}
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TBool CAlfSrvTransEffect::IsEnabled()
+	{
+	TInt value;
+	iAvkonTfxStateListener->GetValue( value );
+	TBool isAvkonEffectsEnabled = ( value != KMaxTInt );
+	return( iIsEnabled &&  !isAvkonEffectsEnabled );
+	}    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CAlfSrvTransEffect::StartPhase( 
+    TInt aPhaseId, TInt aContext, 
+    CAlfSrvEffectEnv& aEffectEnv, 
+    TInt /*aUidValue*/, 
+    TInt /*aKey*/, 
+    TInt /*aUidValue2*/, 
+    TInt /*aKey2*/, 
+    const TDesC8* aParams)
+	{
+	if ( IsEnabled() )
+		{		
+		// Find the plugin which implements the effect related to this context and call it
+		MAlfTransEffectPlugin* plugin = NULL;
+		if ( FindPlugin( aContext,  &plugin ) == KErrNone )
+			{
+			// Update state
+			iCurrContext = aContext;
+			iCurrPhase = aPhaseId;
+			
+			// Call plugin
+			ASSERT( plugin != NULL );
+			plugin->StartPhase( aPhaseId, aContext, aEffectEnv, aParams );
+			}
+		}
+		
+	return KErrNone;	
+	}    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CAlfSrvTransEffect::Abort( TInt /*aContext*/, TInt /*aUidValue*/, TInt /*aKey*/ )
+	{
+	return KErrNone;
+	}    
+    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CAlfSrvTransEffect::SetProperty( TInt /*aProperty*/, TInt /*aValue*/, TInt /*aUidValue*/, TInt /*aKey*/ )
+	{
+	return KErrNone;
+	}    
+    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CAlfSrvTransEffect::GetProperty( TInt /*aProperty*/, TInt& /*aValue*/, TInt /*aUidValue*/, TInt /*aKey*/ )
+	{
+	return KErrNone;
+	}    
+    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CAlfSrvTransEffect::AddEventObserver( MAlfTransEffectObserver* /*aObserver*/, TInt /*aEvents*/, const TDesC8* /*aParams*/ )
+	{
+	return KErrNone;
+	}    
+    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CAlfSrvTransEffect::RemoveEventObserver( MAlfTransEffectObserver* /*aObserver*/, TInt /*aEvents*/ )
+	{
+	return KErrNone;
+	}    
+   
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CAlfSrvTransEffect::GetEventState( TInt /*aEvent*/, TInt* /*aState*/, TDes8* /*aParams*/ )
+	{
+	return KErrNotReady;
+	}    
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CAlfSrvTransEffect::FindPlugin( TInt aContext, MAlfTransEffectPlugin** aPlugin ) 
+	{
+	// Note: Now the context id is the same as effect id, but this can change in the future
+	CAlfSrvTransEffect::TEffectMapItem item( aContext, NULL );
+	TInt index;
+	if ( iEffectMap.FindInSignedKeyOrder( item, index ) == KErrNone )
+		{
+		*aPlugin = iEffectMap[index].iPluginPtr;
+		return KErrNone;
+		}
+	else
+		{
+		return KErrNotFound;
+		}
+	}    
+    
+    
+
+// End of file    
+