OMK::SignalDispatcher Class Reference

this class implements signal dispatching More...

#include <OMKSignalDispatcher.h>

Collaboration diagram for OMK::SignalDispatcher:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 SignalDispatcher (Controller &controller)
 constructor
virtual ~SignalDispatcher ()
 destrcutor
virtual void sendEventsForSignal (Event &event, const EventIdentifier &sigId)
 send the events correponding to signal sigId
virtual bool registerForSignal (const EventIdentifier &sigId, const Name &registrant, const EventIdentifier &eventId)
 register an object for a signal
virtual bool cancelRegistrationForSignal (const EventIdentifier &sigId, const Name &registrant)
 cancel the registration of an object for a signal

Protected Types

typedef std::vector< std::pair<
Name, EventIdentifier > > 
_VectorType
 the type of data structure associated to a signal
typedef std::map< EventIdentifier,
_VectorType * > 
_TableType
 the type of data structure remembering who is registred to what signal

Protected Attributes

Controller_controler
 the controller used to find the reference handles to objects registering
_TableType _tableOfRegistredObjects
 the table of registref objects

Detailed Description

this class implements signal dispatching

Author:
David Margery
Version:
1.0

Definition at line 38 of file OMKSignalDispatcher.h.


Member Typedef Documentation

typedef std::vector<std::pair<Name,EventIdentifier> > OMK::SignalDispatcher::_VectorType [protected]

the type of data structure associated to a signal

Definition at line 74 of file OMKSignalDispatcher.h.

typedef std::map<EventIdentifier, _VectorType * > OMK::SignalDispatcher::_TableType [protected]

the type of data structure remembering who is registred to what signal

Definition at line 77 of file OMKSignalDispatcher.h.


Constructor & Destructor Documentation

SignalDispatcher::SignalDispatcher ( Controller controller  ) 

constructor

Parameters:
controller a controller used to get reference to object handles to send the events

Definition at line 28 of file OMKSignalDispatcher.cpp.

00028                                                      :
00029    _controler (ctrl) 
00030 {
00031 
00032 }

SignalDispatcher::~SignalDispatcher (  )  [virtual]

destrcutor

Definition at line 34 of file OMKSignalDispatcher.cpp.

References _tableOfRegistredObjects.

00034                                     {
00035    for (_TableType::iterator i = _tableOfRegistredObjects.begin() ;
00036         i !=  _tableOfRegistredObjects.end() ;
00037         i++ )
00038       {
00039          delete (*i).second ;
00040       }
00041 }


Member Function Documentation

void SignalDispatcher::sendEventsForSignal ( Event event,
const EventIdentifier sigId 
) [virtual]

send the events correponding to signal sigId

Parameters:
event a prototype for the event send
sigId the signal for wich the events are dispatched

Definition at line 43 of file OMKSignalDispatcher.cpp.

References _controler, _tableOfRegistredObjects, OMK::Event::eventId, OMK::SimulatedObject::getObjectHandle(), OMK::Controller::getPointerToSimulatedObjectNamed(), OMK::ObjectHandle::receiveEvent(), and OMK::Event::receiver.

Referenced by OMK::Controller::broadcastEventsForSignal(), and OMK::ReferenceObjectHandle::sendEventsForSignal().

00045 {
00046    //cerr<<"SignalDispatcher:"<<this<<":sendEventsForSignal "<<sigId<<endl;
00047 #ifdef _OMK_MUTEX_
00048    _mutexForRegistredObjectsTable.protect() ;
00049 #endif
00050    _TableType::iterator i = _tableOfRegistredObjects.find ( sigId ) ;
00051    if (i != _tableOfRegistredObjects.end() )
00052       {
00053          _VectorType::iterator listIterator = (*i).second->begin();
00054          while ( listIterator != (*i).second->end() )
00055             {
00056                event.receiver = listIterator->first ;
00057                event.eventId = listIterator->second ;
00058                SimulatedObject * receiver = _controler.getPointerToSimulatedObjectNamed(event.receiver) ;
00059                if ( receiver != NULL ) 
00060                   {
00061                      receiver->getObjectHandle()->receiveEvent(event) ;
00062                      listIterator ++ ;
00063                   }
00064                else 
00065                   {
00066                      // we suppose the objet no longer exists
00067                      cerr<<"WARNING : OMKReferenceObjectHandle::sendSignalAsEvent "
00068                          <<receiver
00069                          << "no longer seems to exists : deleted from data structure "<<endl;
00070                      listIterator = (*i).second->erase ( listIterator ) ; 
00071                   }
00072             }
00073       }
00074 #ifdef _OMK_MUTEX_
00075    _mutexForRegistredObjectsTable.unprotect() ;
00076 #endif
00077 }

bool SignalDispatcher::registerForSignal ( const EventIdentifier sigId,
const Name registrant,
const EventIdentifier eventId 
) [virtual]

register an object for a signal

Parameters:
sigId the signal to react to
registrant the simulated object registering to signal sigId
eventId the eventId to send to registrant when sigId is emitted

Definition at line 79 of file OMKSignalDispatcher.cpp.

References _tableOfRegistredObjects.

Referenced by OMK::DistributedController::processEvent(), OMK::ReferenceObjectHandle::receiveRegistrationForSignal(), and OMK::Controller::receiveRegistrationForSignal().

00082 {
00083 //   cerr << "SignalDispatcher: " << this << " :registerForSignal on "<< sigId <<" send "<< eventId <<" to " << registrant << endl ;
00084 #ifdef _OMK_MUTEX_
00085   _mutexForRegistredObjectsTable.protect() ;
00086 #endif
00087   _TableType::iterator i = _tableOfRegistredObjects.find ( sigId ) ;
00088   if (i == _tableOfRegistredObjects.end() )
00089     {
00090       _tableOfRegistredObjects[sigId] = new _VectorType( 1, pair<Name, EventIdentifier>( registrant, eventId ) );
00091     }
00092   else 
00093     {
00094       _VectorType::iterator j = (*i).second->begin() ;
00095       while ( j != (*i).second->end() )
00096         {
00097           if ( ( *j ).first == registrant )
00098             {
00099               j = (*i).second->erase( j ) ;
00100             }
00101           else
00102             {
00103               ++j ;
00104             }
00105         }
00106       ( *i ).second->push_back( pair <Name, EventIdentifier> 
00107                                 ( registrant, eventId ) );
00108     }
00109   
00110 #ifdef _OMK_MUTEX_
00111   _mutexForRegistredObjectsTable.unprotect() ;
00112 #endif
00113   return true ;
00114 }

bool SignalDispatcher::cancelRegistrationForSignal ( const EventIdentifier sigId,
const Name registrant 
) [virtual]

cancel the registration of an object for a signal

Parameters:
sigId the signal for wich there is a cancellation
registrant the object cancelling registration

Definition at line 117 of file OMKSignalDispatcher.cpp.

References _tableOfRegistredObjects.

Referenced by OMK::ReferenceObjectHandle::cancelRegistrationForSignal(), OMK::DistributedController::processEvent(), and OMK::Controller::receiveCancellationForSignal().

00119 {
00120 #ifdef _OMK_MUTEX_
00121    _mutexForRegistredObjectsTable.protect() ;
00122 #endif
00123    _TableType::iterator i = _tableOfRegistredObjects.find ( sigId ) ;
00124    if (i != _tableOfRegistredObjects.end() )
00125       {
00126          _VectorType::iterator listIterator = (*i).second->begin();
00127          while ( listIterator != (*i).second->end() )
00128             {
00129                if (listIterator->first == registrant ) 
00130                   {
00131                      listIterator = (*i).second->erase( listIterator ) ;
00132                   }
00133                else
00134                   {
00135                      listIterator++ ;
00136                   }
00137             }
00138       }
00139 #ifdef _OMK_MUTEX_
00140    _mutexForRegistredObjectsTable.unprotect() ;   
00141 #endif
00142    return true ;
00143 }


Member Data Documentation

Controller& OMK::SignalDispatcher::_controler [protected]

the controller used to find the reference handles to objects registering

Definition at line 71 of file OMKSignalDispatcher.h.

Referenced by sendEventsForSignal().

_TableType OMK::SignalDispatcher::_tableOfRegistredObjects [protected]

the table of registref objects

Definition at line 80 of file OMKSignalDispatcher.h.

Referenced by cancelRegistrationForSignal(), registerForSignal(), sendEventsForSignal(), and ~SignalDispatcher().


logo OpenMask

Documentation generated on Mon Jun 9 11:46:03 2008

Generated with doxygen by Dimitri van Heesch ,   1997-2007