/* * DNN - Data News Network * * by Stephane Chatty and Stephane Sire * * Copyright 1993-1996 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Multiplexer. * * $Id$ * $CurLog$ */ #ifndef IvlMultiplexer_H_ #define IvlMultiplexer_H_ #include "ivl/Initializer.h" #include "ivl/List.h" enum MPX_RES { isMpxEmpty, isMpxTerminated, isMpxError, isMpxAborted }; typedef void (IvlMpxHook) (); class IvlBaseMultiplexer { friend void IvlDnnOpen (IvlBaseMultiplexer*); friend MPX_RES IvlLoop (); friend void IvlClose (); public: static bool ClassInitialized; static void ClassInit (); static IvlInitializerFor Initializer; protected: static IvlList* GlobalHooks; static IvlList* GlobalFinalHooks; virtual MPX_RES Loop () = 0; public: IvlBaseMultiplexer (); virtual ~IvlBaseMultiplexer (); MPX_RES Run (); virtual void Stop () = 0; static void AddGlobalHook (IvlMpxHook*, bool = false); static void RemoveGlobalHook (IvlMpxHook*, bool = false); virtual void AddHook (IvlMpxHook*, bool = false) = 0; virtual void RemoveHook (IvlMpxHook*, bool = false) = 0; virtual void AddFinalHook (IvlMpxHook*) = 0; virtual void RemoveFinalHook (IvlMpxHook*) = 0; }; class IvlMultiplexer : public IvlBaseMultiplexer { protected: IvlList Hooks; IvlList FinalHooks; bool Looping; void ExecHooks (bool = false); MPX_RES Loop (); public: IvlMultiplexer (); ~IvlMultiplexer (); void Stop (); void AddHook (IvlMpxHook*, bool = false); void RemoveHook (IvlMpxHook*, bool = false); void AddFinalHook (IvlMpxHook*); void RemoveFinalHook (IvlMpxHook*); }; extern IvlBaseMultiplexer* IvlMpx; extern void IvlDnnOpen (IvlBaseMultiplexer* = 0); extern MPX_RES IvlLoop (); extern void IvlStop (); extern void IvlClose (); #endif /* IvlMultiplexer_H_ */