OMKSignalDispatcher.cpp

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 "OMKSignalDispatcher.h"
00019 
00020 #include "OMKController.h"
00021 #include "OMKEvent.h"
00022 #include <OMKNameServer.h>
00023 
00024 using namespace std ;
00025 using namespace OMK ;
00026 
00027 
00028 SignalDispatcher::SignalDispatcher(Controller & ctrl ) :
00029    _controler (ctrl) 
00030 {
00031 
00032 }
00033 
00034 SignalDispatcher::~SignalDispatcher() {
00035    for (_TableType::iterator i = _tableOfRegistredObjects.begin() ;
00036         i !=  _tableOfRegistredObjects.end() ;
00037         i++ )
00038       {
00039          delete (*i).second ;
00040       }
00041 }
00042 
00043 void SignalDispatcher::sendEventsForSignal ( Event & event,
00044                                                const EventIdentifier & sigId )
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 }
00078 
00079 bool SignalDispatcher::registerForSignal ( const EventIdentifier & sigId, 
00080                                               const Name & registrant, 
00081                                               const EventIdentifier & eventId ) 
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 }
00115 
00116 
00117 bool SignalDispatcher::cancelRegistrationForSignal ( const EventIdentifier & sigId, 
00118                                                         const Name & registrant ) 
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 }

logo OpenMask

Documentation generated on Mon Jun 9 11:45:57 2008

Generated with doxygen by Dimitri van Heesch ,   1997-2007