/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1997 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Reactions. * * $Id$ * $CurLog$ */ #include "Reaction.h" #include "Trigger.h" /*?class DnnBaseReaction The class \typ{DnnBaseReaction} is the base class for event handling. A reaction implements a behaviour (through the virtual function \fun{Manage}), and can be associated to one or more triggers, generally located in a sensor. ?*/ /*? Create a reaction. ?*/ DnnBaseReaction :: DnnBaseReaction () : Triggers (), Grabbed () { } /*?nodoc?*/ DnnBaseReaction :: ~DnnBaseReaction () { CcuListIterOf ti = Grabbed; while (++ti) (*ti)->Release (*this); ti = Triggers; while (++ti) (*ti)->Unsubscribe (*this); } /*! Tell a reaction to forget a trigger. This special function is used only when destroying a trigger. !*/ void DnnBaseReaction :: Forget (DnnTrigger& t) { Triggers.Remove (&t); Grabbed.Remove (&t); } /*?nextdoc?*/ void DnnBaseReaction :: SubscribeTo (DnnTrigger& t, REL_PRIORITY p) { Triggers.Append (&t); t.Subscribe (*this, (DnnTrigger::REL_PRIORITY) p); } /*? Tell that a reaction should (resp. should no more) be activated when the trigger \var{t} causes the emission of an event. ?*/ void DnnBaseReaction :: UnsubscribeTo (DnnTrigger& t) { Triggers.Remove (&t); t.Unsubscribe (*this); } /*?nextdoc?*/ void DnnBaseReaction :: Grab (DnnTrigger& t) { Grabbed.Append (&t); t.Grab (*this); } /*? Tell that a reaction should (resp. should no more) be the only one activated when the trigger \var{t} causes the emission of an event. ?*/ void DnnBaseReaction :: Release (DnnTrigger& t) { Grabbed.Remove (&t); t.Release (*this); } /*? This virtual function is called when an event is emitted because of a trigger to which this reaction was attached. It should be redefined in derived classes to implement behaviours. ?*/ void DnnBaseReaction :: Manage (DnnEvent&) { } /*?class DnnCallback The class \typ{DnnCallback} is a ready-to-use derived class of \typ{DnnBaseReaction}. In this class, the function \fun{Manage} is redefined to call a function passed when creating the reaction. ?*/ /*? Build a reaction that will call \var{f} to handle events. \fun{f} has to take a \typ{DnnEvent\&} parameter and return \typ{void}. ?*/ DnnCallback :: DnnCallback (DnnHandlingFunction f) : DnnBaseReaction (), Handler (f) { } /*?nodoc?*/ DnnCallback :: ~DnnCallback () { } /*?nodoc?*/ void DnnCallback :: Manage (DnnEvent& ev) { (*Handler) (ev); }