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

PsnSignalDispatcher.cxx

Go to the documentation of this file.
00001 /*
00002  * This file is part of openMask © INRIA, CNRS, Universite de Rennes 1 1993-2002, thereinafter the Software
00003  * 
00004  * The Software has been developped within the Siames Project. 
00005  * INRIA, the University of Rennes 1 and CNRS jointly hold intellectual property rights
00006  * 
00007  * The Software has been registered with the Agence pour la Protection des
00008  * Programmes (APP) under registration number IDDN.FR.001.510008.00.S.P.2001.000.41200
00009  *  
00010  * This file may be distributed under the terms of the Q Public License
00011  * version 1.0 as defined by Trolltech AS of Norway and appearing in the file
00012  * LICENSE.QPL included in the packaging of this file.
00013  *
00014  * Licensees holding valid specific licenses issued by INRIA, CNRS or Université de Rennes 1 
00015  * for the software may use this file in accordance with that specific license
00016  *
00017  */
00018 #include "PsnSignalDispatcher.h"
00019 
00020 #include "PsController.h"
00021 #include "PsEvent.h"
00022 
00023 PsnSignalDispatcher::PsnSignalDispatcher(PsController & ctrl ) :
00024    _controler (ctrl) 
00025 {
00026 
00027 }
00028 
00029 PsnSignalDispatcher::~PsnSignalDispatcher() {
00030    for (_TableType::iterator i = _tableOfRegistredObjects.begin() ;
00031         i !=  _tableOfRegistredObjects.end() ;
00032         i++ )
00033       {
00034          delete (*i).second ;
00035       }
00036 }
00037 
00038 void PsnSignalDispatcher::sendEventsForSignal ( PsEvent & event,
00039                                                const PsEventIdentifier & sigId )
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 }
00069 
00070 bool PsnSignalDispatcher::registerForSignal ( const PsEventIdentifier & sigId, 
00071                                               const PsName & registrant, 
00072                                               const PsEventIdentifier & eventId ) 
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 }
00088 
00089 
00090 bool PsnSignalDispatcher::cancelRegistrationForSignal ( const PsEventIdentifier & sigId, 
00091                                                         const PsName & registrant ) 
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 }

logo OpenMask

Documentation generated on Mon Nov 25 15:25:01 2002

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