diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/ServerCore/Src/alfsrvtranseffect.cpp --- /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 +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#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 ( REComSession::CreateImplementationL( + implInfoArray[i]->ImplementationUid(), _FOFF (MAlfTransEffectPlugin, iDtor_ID_Key) ) ) ); + + TInt countAddedEffects = 0; + if ( !error && ( plugin != NULL ) ) + { + RArray 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 +