//===========================================================================//
// File:	apptask.hpp                                                         //
// Project: MUNGA           Brick: Application								  		  //
// Contents: Interface specification for Application								  //
//---------------------------------------------------------------------------//
//   Date    Who  Modification                                               //
// --------  ---  ---------------------------------------------------------- //
// 08/24/94  ECH  Initial coding.                                            //
//---------------------------------------------------------------------------//
// Copyright (C) 1994-1995, Virtual World Entertainment, Inc.                //
// All Rights reserved worldwide                                             //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL               //
//===========================================================================//

#if !defined(APPTASK_HPP)
#	define APPTASK_HPP

#	if !defined(STYLE_HPP)
#		include <style.hpp>
#	endif

#	if !defined(CMPNNT_HPP)
#		include <cmpnnt.hpp>
#	endif

#	if !defined(SCHAIN_HPP)
#		include <schain.hpp>
#	endif

#	if defined(TRACE_COMPLETE_CYCLES)
		extern BitTrace Complete_Cycles;
#		define SET_COMPLETE_CYCLES() Complete_Cycles.Set()
#		define CLEAR_COMPLETE_CYCLES() Complete_Cycles.Clear()
#	else
#		define SET_COMPLETE_CYCLES()
#		define CLEAR_COMPLETE_CYCLES()
#	endif

#	if defined(TRACE_DEATH_ROW)
		extern BitTrace Death_Row;
#		define SET_DEATH_ROW() Death_Row.Set()
#		define CLEAR_DEATH_ROW() Death_Row.Clear()
#	else
#		define SET_DEATH_ROW()
#		define CLEAR_DEATH_ROW()
#	endif

	//##########################################################################
	//#######################    ApplicationTask    ############################
	//##########################################################################

	class ApplicationTask:
		public Component
	{
	public:
		ApplicationTask(ClassID class_ID = ApplicationTaskClassID);
		~ApplicationTask();
	};

	//##########################################################################
	//#######################    BackgroundTasks    ############################
	//##########################################################################

	class BackgroundTasks:
		public Component
	{
	public:
		BackgroundTasks();
		~BackgroundTasks();

		Logical
			TestInstance() const;

		void
			AddTask(ApplicationTask *task);

		void
      	Execute();

	private:
		SChainOf<ApplicationTask*>
			taskSocket;
		SChainIteratorOf<ApplicationTask*>
      	*taskIterator;
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~ NetworkManagerTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class NetworkManagerTask:
		public ApplicationTask
	{
	public:
		NetworkManagerTask() {}
		~NetworkManagerTask() {}

		void
			Execute();
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~ RoutePacketTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class RoutePacketTask:
		public ApplicationTask
	{
	public:
		RoutePacketTask() {}
		~RoutePacketTask() {}

		void
			Execute();
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~ ProcessEventTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class ProcessEventTask:
		public ApplicationTask
	{
	public:
		ProcessEventTask() {}
		~ProcessEventTask() {}

		void
			Execute();
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~ AudioRendererTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class AudioRendererTask:
		public ApplicationTask
	{
	public:
		AudioRendererTask() {}
		~AudioRendererTask() {}

		void
			Execute();
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~ GaugeRendererTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class GaugeRendererTask:
		public ApplicationTask
	{
	public:
		GaugeRendererTask() {}
		~GaugeRendererTask() {}

		void
			Execute();
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~ CompleteCyclesTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class CompleteCyclesTask:
		public ApplicationTask
	{
	public:
		CompleteCyclesTask() {}
		~CompleteCyclesTask() {}

		void
			Execute();
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~ FryDeathRowTask ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class FryDeathRowTask:
		public ApplicationTask
	{
	public:
		FryDeathRowTask() {}
		~FryDeathRowTask() {}

		void
			Execute();
	};

#endif

