/* * DNN - Data News Network * * by Stephane Chatty and Stephane Sire * * Copyright 1993-1996 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Multiplexer * * $Id$ * $CurLog$ */ #include "Loop.h" CcuInitializerFor DnnBaseMultiplexer::Initializer; bool DnnBaseMultiplexer::ClassInitialized = false; CcuList* DnnBaseMultiplexer::GlobalHooks = 0; CcuList* DnnBaseMultiplexer::GlobalFinalHooks = 0; DnnBaseMultiplexer* DnnMpx = 0; void DnnBaseMultiplexer :: ClassInit () { if (!ClassInitialized) { ClassInitialized = true; GlobalHooks = new CcuList; GlobalFinalHooks = new CcuList; } } void DnnBaseMultiplexer :: AddGlobalHook (DnnMpxHook* h, bool final) { GlobalHooks->Append ((void*) h); if (final) GlobalFinalHooks->Append ((void*) h); } void DnnBaseMultiplexer :: RemoveGlobalHook (DnnMpxHook* h, bool final) { GlobalHooks->Remove ((void*) h); if (final) GlobalFinalHooks->Remove ((void*) h); } DnnBaseMultiplexer :: DnnBaseMultiplexer () { } DnnBaseMultiplexer :: ~DnnBaseMultiplexer () { } /* useless? */ MPX_RES DnnBaseMultiplexer :: Run () { return Loop (); } DnnMultiplexer :: DnnMultiplexer () : DnnBaseMultiplexer (), Hooks (), FinalHooks () { } DnnMultiplexer :: ~DnnMultiplexer () { } void DnnMultiplexer :: AddHook (DnnMpxHook* h, bool final) { Hooks.Append ((void*) h); if (final) FinalHooks.Append ((void*) h); } void DnnMultiplexer :: RemoveHook (DnnMpxHook* h, bool final) { Hooks.Remove ((void*) h); if (final) FinalHooks.Remove ((void*) h); } void DnnMultiplexer :: AddFinalHook (DnnMpxHook* h) { FinalHooks.Append ((void*) h); } void DnnMultiplexer :: RemoveFinalHook (DnnMpxHook* h) { FinalHooks.Remove ((void*) h); } void DnnMultiplexer :: ExecHooks (bool final) { CcuList* hooks = final ? &FinalHooks : &Hooks; CcuListIter li = *hooks; while (++li) { DnnMpxHook* h = (DnnMpxHook*) *li; (*h)(); } } MPX_RES DnnMultiplexer :: Loop () { Looping = true; while (Looping) ExecHooks (false); ExecHooks (true); return isMpxTerminated; } void DnnMultiplexer :: Stop () { Looping = false; } void DnnOpen (DnnBaseMultiplexer* m) { DnnMpx = m ? m : new DnnMultiplexer; CcuListIter li = *DnnBaseMultiplexer::GlobalHooks; while (++li) DnnMpx->AddHook ((DnnMpxHook*) *li, false); li = *DnnBaseMultiplexer::GlobalFinalHooks; while (++li) DnnMpx->AddFinalHook ((DnnMpxHook*) *li); } MPX_RES DnnLoop () { return DnnMpx->Loop (); } void DnnStop () { DnnMpx->Stop (); } void DnnClose () { }