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 }
Documentation generated on Mon Jun 9 11:45:57 2008 |
Generated with doxygen by Dimitri van Heesch , 1997-2007 |