/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1994 * 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); } /*?nextdoc?*/ void DnnBaseReaction :: SubscribeTo (DnnTrigger& t) { Triggers.Append (&t); t.Subscribe (*this); } /*? 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 DnnReaction The class \typ{DnnReaction} 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}. ?*/ DnnReaction :: DnnReaction (DnnHandlingFunction f) : DnnBaseReaction (), Handler (f) { } /*?nodoc?*/ DnnReaction :: ~DnnReaction () { } /*?nodoc?*/ void DnnReaction :: Manage (DnnEvent& ev) { (*Handler) (ev); }