diff -r 88b23e2e82e1 -r 46927d61fef3 uiacceltk/hitchcock/AlfDecoderServerClient/src/alfcompositionclient.cpp --- a/uiacceltk/hitchcock/AlfDecoderServerClient/src/alfcompositionclient.cpp Wed Mar 31 23:03:58 2010 +0300 +++ b/uiacceltk/hitchcock/AlfDecoderServerClient/src/alfcompositionclient.cpp Wed Apr 14 16:53:50 2010 +0300 @@ -1231,4 +1231,104 @@ CAlfCompositionSource::HandleEventL( aEventType, aEventData ); } +class CAlfSignalObserver; + +class MAlfEffectObserverData + { + public: + virtual void Remove(CAlfSignalObserver* aObserver) = 0; + }; + +NONSHARABLE_CLASS(CAlfEffectObserver::CAlfEffectObserverData): public CBase, public MAlfEffectObserverData + { + public: + void SubscribeCallbackL(MAlfEffectObserver* aObserver, TInt aHandle, TInt aType = MAlfEffectObserver::EAlfEffectComplete ); + ~CAlfEffectObserverData(); + void Remove(CAlfSignalObserver* aObserver); + + // data + RAlfBridgerClient iClient; + RPointerArray iObservers; + }; + + +NONSHARABLE_CLASS(CAlfSignalObserver):public CActive + { + public: + CAlfSignalObserver(CAlfEffectObserver::MAlfEffectObserver* aObserver, MAlfEffectObserverData* aOwner, TInt aHandle, TInt aType):CActive(EPriorityStandard), + iOwner(aOwner), iObserver(aObserver), iHandle(aHandle), iType(aType), iArgs(aHandle,aType) + { + CActiveScheduler::Add(this); + SetActive(); + } + + void DoCancel(){} // do not... + + void RunL() + { + iObserver->HandleEffectCallback(iType, iHandle, iStatus.Int()); + iOwner->Remove(this); + } + + MAlfEffectObserverData* iOwner; + CAlfEffectObserver::MAlfEffectObserver* iObserver; + TInt iHandle; + TInt iType; + TIpcArgs iArgs; + }; + +void CAlfEffectObserver::CAlfEffectObserverData::SubscribeCallbackL(MAlfEffectObserver* aObserver, TInt aHandle, TInt aType) + { + CAlfSignalObserver* obs = new (ELeave) CAlfSignalObserver(aObserver, this, aHandle, aType); + CleanupStack::PushL(obs); + User::LeaveIfError(iObservers.Append(obs)); + CleanupStack::Pop(); + iClient.SendAsynchronous(EAlfRequestSignal, obs->iArgs, obs->iStatus); + } + +CAlfEffectObserver::CAlfEffectObserverData::~CAlfEffectObserverData() + { + iClient.Close(); // destroys signals + iObservers.ResetAndDestroy(); + } + +void CAlfEffectObserver::CAlfEffectObserverData::Remove(CAlfSignalObserver* aObserver) + { + TInt index = iObservers.Find(aObserver); + iObservers.Remove(index); + delete aObserver; + } + +EXPORT_C CAlfEffectObserver* CAlfEffectObserver::NewL() + { + CAlfEffectObserver* me = new (ELeave) CAlfEffectObserver(); + CleanupStack::PushL(me); + me->iData = new (ELeave) CAlfEffectObserverData(); + User::LeaveIfError(me->iData->iClient.Connect()); + CleanupStack::Pop(); + return me; + } + +EXPORT_C CAlfEffectObserver::~CAlfEffectObserver() + { + delete iData; + } + +EXPORT_C TInt CAlfEffectObserver::ActiveEffectsCount() + { + return iData->iClient.EffectsCount(); + } + +EXPORT_C void CAlfEffectObserver::SubscribeCallbackL(MAlfEffectObserver* aObserver, TInt aHandle, TInt aType) + { + iData->SubscribeCallbackL(aObserver, aHandle, aType ); + } + +CAlfEffectObserver::CAlfEffectObserver() + { + } + + + + //end of file