tsrc/xmltestharness/xmlclient/src/asbreakeventhandler.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 25 Aug 2010 12:40:50 +0300
changeset 0 0e4a32b9112d
permissions -rw-r--r--
Revision: 201033

/*
* Copyright (c) 2008 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:
*
*/


/**
@file
@internalComponent
*/

#ifndef ASBREAKEVENTHANDLER_H_
#define ASBREAKEVENTHANDLER_H_

#include <e32base.h>

#include <openmax/il/khronos/v1_x/OMX_Component.h>

class MASBreakCallback
	{
public:
	virtual void AllComponentsEOS() = 0;
	virtual void AllComponentsTransitioned(OMX_STATETYPE aNewState,
			                               OMX_STATETYPE aOldState) = 0;
	virtual void EventReceived(OMX_COMPONENTTYPE* aComponent, OMX_EVENTTYPE aEvent, TUint32 aData1, TUint32 aData2, TAny* aEventData) = 0;
	virtual void ComponentTransitioned(OMX_STATETYPE aNewState,
				                   OMX_STATETYPE aOldState) = 0;
	virtual void BufferDone(OMX_COMPONENTTYPE* aComp, OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource) = 0;
	};

class RASBreakEventHandler
	{
public:
	RASBreakEventHandler(MASBreakCallback& aHandler);
	TInt Create();
	void Close();
	
	void InstallIntoL(OMX_COMPONENTTYPE* aComponent, const TDesC& aName);
	void AddComponentL(OMX_COMPONENTTYPE* aComponent, const TDesC& aName);
	
	void AwaitTransition(OMX_STATETYPE aNewState, OMX_STATETYPE aOldState);
	void AwaitEOS();
	void AwaitEOS(OMX_COMPONENTTYPE* aComponent);
	void AwaitSingleTransition(OMX_COMPONENTTYPE* aComponent, OMX_STATETYPE aNewState, OMX_STATETYPE aOldState);
	
	OMX_CALLBACKTYPE& CallbackStruct();
	
	static OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent,
			                          OMX_PTR pAppData,
			                          OMX_EVENTTYPE eEvent,
			                          OMX_U32 nData1,
			                          OMX_U32 nData2,
			                          OMX_PTR pEventData);
	static OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
			                                OMX_IN OMX_PTR pAppData,
			                                OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
	static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
			                                 OMX_IN OMX_PTR pAppData,
			                                 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);

private:	
	void StateSet(OMX_COMPONENTTYPE* aComponent, OMX_STATETYPE aState);
	void EndOfStream(OMX_COMPONENTTYPE* aComponent);
	OMX_ERRORTYPE DoBufferDone(OMX_COMPONENTTYPE* aComponent,
	                           OMX_BUFFERHEADERTYPE* aBufHdr,
	                           TBool aSource);
	OMX_ERRORTYPE DoEventHandler(OMX_COMPONENTTYPE* aComponent,
	                          OMX_EVENTTYPE aEvent,
	                          OMX_U32 aData1,
	                          OMX_U32 aData2,
	                          OMX_PTR aEventData);
	const TDesC* ComponentName(OMX_COMPONENTTYPE* aComponent);
	
	OMX_CALLBACKTYPE iOmxCallbackType;

	OMX_STATETYPE iNewState;
	OMX_STATETYPE iOldState;
	
	enum TMode { EIdle, EAwaitingTransition, EAwaitingEOS, EAwaitingSingleTransition };
	MASBreakCallback& iHandler;
	
	class TComponentInfo
		{
	public:
		static TBool CompareHandle(OMX_COMPONENTTYPE* const * a1, const TComponentInfo& a2)
			{
			return (*a1) == a2.iHandle;
			}
		
		OMX_COMPONENTTYPE* iHandle;
		TBool iComplete;
		HBufC* iName;
		};
		
	RArray<TComponentInfo> iComponents;
	TInt iCounter;
	TMode iMode;
	RMutex iMutex;
	
	OMX_COMPONENTTYPE* iEOSComponent;	// from which component we expect EOS. all components if NULL
	};
	
#endif /*ASBREAKEVENTHANDLER_H_*/