/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1996 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Event sources. * * $Id$ * $CurLog$ */ #include "Source.h" #include "Trigger.h" #include "Reaction.h" #include "ccu/Array.h" #include "ccu/HashTable.h" DnnEventSource :: DnnEventSource () { } DnnEventSource :: ~DnnEventSource () { } void DnnEventSource :: Emit (DnnEvent* ev) { /* should enqueue? */ DispatchEvent (ev); } DnnEventSelector :: DnnEventSelector () { } DnnEventSelector :: ~DnnEventSelector () { } DnnEventIntSelector :: DnnEventIntSelector (DnnIntExtractor exid, int max) : DnnEventSelector (), IdExtractor (exid), MaxSize (max), Triggers (0) { } DnnEventIntSelector :: ~DnnEventIntSelector () { if (Triggers) { int id = 0; #ifdef FIXME while (id < MaxSize) { DnnTrigger* t = (*Triggers)[id]; if (t) delete t; } #endif } } DnnTrigger* DnnEventIntSelector :: UseTrigger (int id) { if (!Triggers && MaxSize) { Triggers = new CcuArrayOf (MaxSize, 0); } /* no need to check bounds: CcuArray does it */ DnnTrigger** t = *Triggers + id; if (*t == 0) { *t = new DnnTrigger; } return *t; } void DnnEventIntSelector :: UnuseTrigger (int id, DnnBaseReaction* r) { DnnTrigger** t; if (!Triggers || !(t = *Triggers + id)) return; r->UnsubscribeTo (**t); if ((*t)->IsUnused ()) { delete *t; *t = 0; } } DnnTrigger* DnnEventIntSelector :: FindTrigger (DnnEvent* ev) { DnnTrigger* t = 0; int id = (IdExtractor) (ev); if (Triggers) t = (*Triggers) [id]; return t; } DnnEventPtrSelector :: DnnEventPtrSelector (DnnPtrExtractor exid, int sz) : DnnEventSelector (), PtrExtractor (exid), TblSize (sz), Triggers (0) { } DnnEventPtrSelector :: ~DnnEventPtrSelector () { if (Triggers) { int id = 0; #ifdef FIXME #endif } } DnnTrigger* DnnEventPtrSelector :: UseTrigger (void* id) { if (!Triggers && TblSize) { Triggers = new CcuHashTableOf (TblSize); } int found; CcuHashCellOf* c = Triggers->Add (id, &found); DnnTrigger* t; if (found) t = c->GetInfo (); else c->SetInfo (t = new DnnTrigger); return t; } void DnnEventPtrSelector :: UnuseTrigger (void* id, DnnBaseReaction* r) { CcuHashCellOf* c; if (!Triggers || !(c = Triggers->Get (id))) return; DnnTrigger* t = c->GetInfo (); r->UnsubscribeTo (*t); if (t->IsUnused ()) { delete t; /* not optimal : we already had the cell */ Triggers->Remove (id); } } DnnTrigger* DnnEventPtrSelector :: FindTrigger (DnnEvent* ev) { DnnTrigger* t = 0; CcuHashCellOf* c; void* id = (PtrExtractor) (ev); if (Triggers && (c = Triggers->Get (id))) t = c->GetInfo (); return t; }