Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

PsnSignalDispatcher Class Reference

this class implements signal dispatching More...

#include <PsnSignalDispatcher.h>

Collaboration diagram for PsnSignalDispatcher:

Collaboration graph
[legend]
List of all members.

Public Methods

 PsnSignalDispatcher (PsController &controller)
 constructor

virtual ~PsnSignalDispatcher ()
 destrcutor

virtual void sendEventsForSignal (PsEvent &event, const PsEventIdentifier &sigId)
 send the events correponding to signal sigId

virtual bool registerForSignal (const PsEventIdentifier &sigId, const PsName &registrant, const PsEventIdentifier &eventId)
 register an object for a signal

virtual bool cancelRegistrationForSignal (const PsEventIdentifier &sigId, const PsName &registrant)
 cancel the registration of an object for a signal


Protected Types

typedef PsList< PsPair< PsName,
PsEventIdentifier > > 
_ListType
 the type of data structure associated to a signal

typedef map< PsEventIdentifier,
_ListType * > 
_TableType
 the type of data structure remembering who is registred to what signal


Protected Attributes

PsController_controler
 the controller used to find the reference handles to objects registering

_TableType _tableOfRegistredObjects
 the table of registref objects

PsnMutexLock _mutexForRegistredObjectsTable
 a lock for mutual exclusion on the signal dispatcher


Detailed Description

this class implements signal dispatching

Author:
David Margery
Version:
1.0

Definition at line 36 of file PsnSignalDispatcher.h.


Member Typedef Documentation

typedef PsList<PsPair<PsName,PsEventIdentifier> > PsnSignalDispatcher::_ListType [protected]
 

the type of data structure associated to a signal

Definition at line 71 of file PsnSignalDispatcher.h.

Referenced by registerForSignal().

typedef map<PsEventIdentifier, _ListType * > PsnSignalDispatcher::_TableType [protected]
 

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

Definition at line 74 of file PsnSignalDispatcher.h.


Constructor & Destructor Documentation

PsnSignalDispatcher::PsnSignalDispatcher PsController   controller
 

constructor

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

Definition at line 23 of file PsnSignalDispatcher.cxx.

00023                                                              :
00024    _controler (ctrl) 
00025 {
00026 
00027 }

PsnSignalDispatcher::~PsnSignalDispatcher   [virtual]
 

destrcutor

Definition at line 29 of file PsnSignalDispatcher.cxx.

References _tableOfRegistredObjects, map< PsEventIdentifier, _ListType * >::begin(), and map< PsEventIdentifier, _ListType * >::end().

00029                                           {
00030    for (_TableType::iterator i = _tableOfRegistredObjects.begin() ;
00031         i !=  _tableOfRegistredObjects.end() ;
00032         i++ )
00033       {
00034          delete (*i).second ;
00035       }
00036 }


Member Function Documentation

bool PsnSignalDispatcher::cancelRegistrationForSignal const PsEventIdentifier   sigId,
const PsName   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 90 of file PsnSignalDispatcher.cxx.

References _mutexForRegistredObjectsTable, _tableOfRegistredObjects, map< PsEventIdentifier, _ListType * >::end(), map< PsEventIdentifier, _ListType * >::find(), PsnMutexLock::protect(), and PsnMutexLock::unprotect().

Referenced by PsnReferenceObjectHandle::cancelRegistrationForSignal(), PsDistributedController::processEvent(), and PsController::receiveCancellationForSignal().

00092 {
00093    _mutexForRegistredObjectsTable.protect() ;
00094    _TableType::iterator i = _tableOfRegistredObjects.find ( sigId ) ;
00095    if (i != _tableOfRegistredObjects.end() )
00096       {
00097          _ListType::iterator listeIterator = (*i).second->begin();
00098          while ( listeIterator != (*i).second->end() )
00099             {
00100                if (listeIterator->first == registrant ) 
00101                   {
00102                      listeIterator = (*i).second->erase ( listeIterator ) ;
00103                   }
00104                else
00105                   {
00106                      listeIterator++ ;
00107                   }
00108             }
00109       }
00110    _mutexForRegistredObjectsTable.unprotect() ;   
00111    return true ;
00112 }

bool PsnSignalDispatcher::registerForSignal const PsEventIdentifier   sigId,
const PsName   registrant,
const PsEventIdentifier   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 70 of file PsnSignalDispatcher.cxx.

References _ListType, _mutexForRegistredObjectsTable, _tableOfRegistredObjects, map< PsEventIdentifier, _ListType * >::end(), map< PsEventIdentifier, _ListType * >::find(), PsnMutexLock::protect(), and PsnMutexLock::unprotect().

Referenced by PsDistributedController::processEvent(), PsnReferenceObjectHandle::receiveRegistrationForSignal(), and PsController::receiveRegistrationForSignal().

00073 {
00074    //cerr<<"PsnSignalDispatcher:"<<this<<":registerForSignal on "<<sigId<<" send "<<eventId<<" to "<<registrant<<endl;
00075    _mutexForRegistredObjectsTable.protect() ;
00076    _TableType::iterator i = _tableOfRegistredObjects.find ( sigId ) ;
00077    if (i == _tableOfRegistredObjects.end() )
00078       {
00079          _tableOfRegistredObjects[sigId] = new _ListType (1,PsPair<PsName,PsEventIdentifier>(registrant,eventId)) ;
00080       }
00081    else 
00082       {
00083          (*i).second->push_back( PsPair < PsName, PsEventIdentifier> ( registrant, eventId ) );
00084       }
00085    _mutexForRegistredObjectsTable.unprotect() ;
00086    return true ;
00087 }

void PsnSignalDispatcher::sendEventsForSignal PsEvent   event,
const PsEventIdentifier   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 38 of file PsnSignalDispatcher.cxx.

References _controler, _mutexForRegistredObjectsTable, _tableOfRegistredObjects, map< PsEventIdentifier, _ListType * >::end(), PsEvent::eventId, map< PsEventIdentifier, _ListType * >::find(), PsSimulatedObject::getObjectHandle(), PsController::getPointerToSimulatedObjectNamed(), PsnMutexLock::protect(), PsnObjectHandle::receiveEvent(), PsEvent::receiver, and PsnMutexLock::unprotect().

Referenced by PsController::broadcastEventsForSignal(), and PsnReferenceObjectHandle::sendEventsForSignal().

00040 {
00041    //cerr<<"PsnSignalDispatcher:"<<this<<":sendEventsForSignal "<<sigId<<endl;
00042    _mutexForRegistredObjectsTable.protect() ;
00043    _TableType::iterator i = _tableOfRegistredObjects.find ( sigId ) ;
00044    if (i != _tableOfRegistredObjects.end() )
00045       {
00046          _ListType::iterator listeIterator = (*i).second->begin();
00047          while ( listeIterator != (*i).second->end() )
00048             {
00049                event.receiver = listeIterator->first ;
00050                event.eventId = listeIterator->second ;
00051                PsSimulatedObject * receiver = _controler.getPointerToSimulatedObjectNamed(event.receiver) ;
00052                if ( receiver != NULL ) 
00053                   {
00054                      receiver->getObjectHandle()->receiveEvent(event) ;
00055                      listeIterator ++ ;
00056                   }
00057                else 
00058                   {
00059                      // we suppose the objet no longer exists
00060                      cerr<<"WARNING : PsnReferenceObjectHandle::sendSignalAsEvent "
00061                          <<receiver
00062                          << "no longer seems to exists : deleted from data structure "<<endl;
00063                      listeIterator = (*i).second->erase ( listeIterator ) ; 
00064                   }
00065             }
00066       }
00067    _mutexForRegistredObjectsTable.unprotect() ;
00068 }


Member Data Documentation

PsController& PsnSignalDispatcher::_controler [protected]
 

the controller used to find the reference handles to objects registering

Definition at line 68 of file PsnSignalDispatcher.h.

Referenced by sendEventsForSignal().

PsnMutexLock PsnSignalDispatcher::_mutexForRegistredObjectsTable [protected]
 

a lock for mutual exclusion on the signal dispatcher

Definition at line 80 of file PsnSignalDispatcher.h.

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

_TableType PsnSignalDispatcher::_tableOfRegistredObjects [protected]
 

the table of registref objects

Definition at line 77 of file PsnSignalDispatcher.h.

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


The documentation for this class was generated from the following files:
logo OpenMask

Documentation generated on Mon Nov 25 15:26:29 2002

Generated with doxygen 1.2.12 by Dimitri van Heesch ,   1997-2001