OMKEventSignalEmitterUtil.h

Go to the documentation of this file.
00001 #ifndef OMK_INP_EVENTSIGNALEMITTERUTIL_H
00002 #define OMK_INP_EVENTSIGNALEMITTERUTIL_H
00003 
00004 #include "OMKInputs.h"
00005 #include "OMKExtensibleSimulatedObject.h"
00006 #include "OMKTransform.h"
00007 #include "OMKBaseType.h"
00008 #include "OMKTransformType.h"
00009 #include "OMKParametersAccessor.inl"
00010 namespace OMK
00011 {
00015 class OMKINPUTS_API EventSignalEmitterUtil  
00016 {
00017 protected: 
00020         EventSignalEmitterUtil() ;
00021 public: 
00022   virtual ~EventSignalEmitterUtil() ;
00023 protected:
00024   virtual bool loadParametersUtil( ExtensibleSimulatedObject* owner, 
00025                                    const ConfigurationParameterDescriptor * node ) ;
00028   bool _signal ;
00030   EventIdentifier _eventId ;
00032   std::vector< Name > _listeners ;
00035   virtual void sendUtil( ExtensibleSimulatedObject* owner ) ;
00036 };
00037 
00038 //=============================================================================
00042 template< typename T, typename ModelType >
00043 class ValuedEventSignalEmitterUtilT:  
00044   public EventSignalEmitterUtil
00045 {
00046 protected: 
00049         ValuedEventSignalEmitterUtilT() 
00050     : EventSignalEmitterUtil(),
00051     _current()
00052   {
00053   }
00054 
00055 public: 
00056   virtual ~ValuedEventSignalEmitterUtilT() {}
00057 protected:
00058   virtual bool loadParametersUtil( ExtensibleSimulatedObject* owner, 
00059                                    const ConfigurationParameterDescriptor * node ) 
00060   {
00061     bool ok = true ;
00062     if( ParametersAccessor::get( node, "AttributeId", _eventId, owner ) )
00063     {
00064       IAttribute * attribute = owner->getAttribute( _eventId ) ;
00065       ok = ok && attribute ;
00066       if( !attribute ) OMERROR( "Attribute " << _eventId << " cannot be found" ) ;
00067       if( ok )
00068       {
00069         attribute->activateSetByEventOf() ;
00070         _eventId = EventId::getCurrentValueEventId( _eventId.getCString() ) ;
00071         _listeners.push_back( owner->getName() ) ;
00072         _signal = false ;
00073       }
00074     }
00075     else
00076     {
00077       ok = ok && EventSignalEmitterUtil::loadParametersUtil( owner, node ) ;
00078     }
00079     ok = ok && ParametersAccessor::get( node, "Values", _values, owner ) ;
00080     _current = _values.begin() ;
00081     return ok ;
00082   }
00084   std::vector< T > _values ;
00086   typename std::vector< T >::iterator _current ;
00089   virtual void sendUtil( ExtensibleSimulatedObject* owner ) 
00090   {
00091     if( _signal )
00092     { // Fire the signal
00093       owner->fireValuedSignal< ModelType >( _eventId, ModelType( *_current ) ) ;
00094     }
00095     else
00096     { // Send the event for each listener
00097       for( std::vector< Name >::const_iterator i = _listeners.begin() ;
00098            i != _listeners.end() ;
00099            i++ )
00100       {
00101         OMTRACEID( OMK_DEBUG_OMK_EVENT, "send value \"" << *_current << "\" to \"" << *i << "\" through event \"" << _eventId << "\"" ) ;
00102         owner->sendValuedEvent< ModelType >( *i, _eventId, ModelType( *_current ) ) ;
00103       }
00104     }
00105     // Next one 
00106     _current++ ;
00107     if( _current == _values.end() ) _current = _values.begin() ;
00108   }
00109 } ;
00110 
00111 //=============================================================================
00115 template< typename T, typename ModelType >
00116 class MultiValuedEventSignalEmitterUtilT:  
00117   public EventSignalEmitterUtil
00118 {
00119 protected: 
00122         MultiValuedEventSignalEmitterUtilT() 
00123     : EventSignalEmitterUtil(),
00124     _default( 0 )
00125   {
00126   }
00127 
00128 public: 
00129   virtual ~MultiValuedEventSignalEmitterUtilT() {}
00130 protected:
00131   virtual bool loadParametersUtil( ExtensibleSimulatedObject* owner, 
00132                                    const ConfigurationParameterDescriptor * node ) 
00133   {
00134     bool ok = true ;
00135     if( ParametersAccessor::get( node, "AttributeId", _eventId, owner ) )
00136     {
00137       IAttribute * attribute = owner->getAttribute( _eventId ) ;
00138       ok = ok && attribute ;
00139       if( !attribute ) OMERROR( "Attribute " << _eventId << " cannot be found" ) ;
00140       if( ok )
00141       {
00142         attribute->activateSetByEventOf() ;
00143         _eventId = EventId::getCurrentValueEventId( _eventId.getCString() ) ;
00144         _listeners.push_back( owner->getName() ) ;
00145         _signal = false ;
00146       }
00147     }
00148     else
00149     {
00150       ok = ok && EventSignalEmitterUtil::loadParametersUtil( owner, node ) ;
00151     }
00152     ok = ok && ParametersAccessor::get( node, "Values", _values, owner ) ;
00153     ParametersAccessor::get( node, "Default", _default ) ;
00154     return ok ;
00155   }
00157   std::vector< T > _values ;
00160   int _default ;
00163   virtual void sendUtil( ExtensibleSimulatedObject* owner, int index ) 
00164   {
00165     // if index out of range then it uses the _default
00166     index = ( index < 0 || (int)_values.size() < index ) ? _default : index ;
00167     if( _signal )
00168     { // Fire the signal
00169       owner->fireValuedSignal< ModelType >( _eventId, ModelType( _values[ index ] ) ) ;
00170     }
00171     else
00172     { // Send the event for each listener
00173       for( std::vector< Name >::const_iterator i = _listeners.begin() ;
00174            i != _listeners.end() ;
00175            i++ )
00176       {
00177         OMTRACEID( OMK_DEBUG_OMK_EVENT, "send value[ " << index << " ] \"" << _values[ index ] << "\" to \"" << *i << "\" through event \"" << _eventId << "\"" ) ;
00178         owner->sendValuedEvent< ModelType >( *i, _eventId, ModelType( _values[ index ] ) ) ;
00179       }
00180     }
00181   }
00182 } ;
00183 
00184 } // namespace OMK
00185 
00186 #endif // OMK_INP_EVENTSIGNALEMITTERUTIL_H

logo OpenMask

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

Generated with doxygen by Dimitri van Heesch ,   1997-2007