00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef TAO_EC_OBSERVERSTRATEGY_H
00019 #define TAO_EC_OBSERVERSTRATEGY_H
00020
00021 #include "ace/pre.h"
00022
00023 #include "orbsvcs/ESF/ESF_Worker.h"
00024
00025 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00026 # pragma once
00027 #endif
00028
00029 #include "ace/Null_Mutex.h"
00030 #include "ace/RB_Tree.h"
00031 #include "ace/Map_Manager.h"
00032
00033 #include "orbsvcs/RtecEventChannelAdminC.h"
00034
00035 #include "orbsvcs/Event/event_serv_export.h"
00036
00037 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00038 class ACE_Lock;
00039 ACE_END_VERSIONED_NAMESPACE_DECL
00040
00041 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00042
00043 class TAO_EC_Event_Channel_Base;
00044 class TAO_EC_ProxyPushConsumer;
00045 class TAO_EC_ProxyPushSupplier;
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 class TAO_RTEvent_Serv_Export TAO_EC_ObserverStrategy
00060 {
00061 public:
00062
00063 virtual ~TAO_EC_ObserverStrategy (void);
00064
00065
00066 virtual RtecEventChannelAdmin::Observer_Handle
00067 append_observer (RtecEventChannelAdmin::Observer_ptr
00068 ACE_ENV_ARG_DECL)
00069 ACE_THROW_SPEC ((
00070 CORBA::SystemException,
00071 RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00072 RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
00073 = 0;
00074 virtual void remove_observer (
00075 RtecEventChannelAdmin::Observer_Handle
00076 ACE_ENV_ARG_DECL)
00077 ACE_THROW_SPEC ((
00078 CORBA::SystemException,
00079 RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00080 RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
00081 = 0;
00082
00083
00084
00085 virtual void connected (TAO_EC_ProxyPushConsumer*
00086 ACE_ENV_ARG_DECL_NOT_USED) = 0;
00087 virtual void disconnected (TAO_EC_ProxyPushConsumer*
00088 ACE_ENV_ARG_DECL_NOT_USED) = 0;
00089
00090
00091
00092 virtual void connected (TAO_EC_ProxyPushSupplier*
00093 ACE_ENV_ARG_DECL_NOT_USED) = 0;
00094 virtual void disconnected (TAO_EC_ProxyPushSupplier*
00095 ACE_ENV_ARG_DECL_NOT_USED) = 0;
00096 };
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 class TAO_RTEvent_Serv_Export TAO_EC_Null_ObserverStrategy : public TAO_EC_ObserverStrategy
00109 {
00110 public:
00111
00112 TAO_EC_Null_ObserverStrategy (void);
00113
00114
00115 virtual RtecEventChannelAdmin::Observer_Handle
00116 append_observer (RtecEventChannelAdmin::Observer_ptr
00117 ACE_ENV_ARG_DECL)
00118 ACE_THROW_SPEC ((
00119 CORBA::SystemException,
00120 RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00121 RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER));
00122 virtual void remove_observer (
00123 RtecEventChannelAdmin::Observer_Handle
00124 ACE_ENV_ARG_DECL)
00125 ACE_THROW_SPEC ((
00126 CORBA::SystemException,
00127 RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00128 RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER));
00129 virtual void connected (TAO_EC_ProxyPushConsumer*
00130 ACE_ENV_ARG_DECL_NOT_USED);
00131 virtual void disconnected (TAO_EC_ProxyPushConsumer*
00132 ACE_ENV_ARG_DECL_NOT_USED);
00133 virtual void connected (TAO_EC_ProxyPushSupplier*
00134 ACE_ENV_ARG_DECL_NOT_USED);
00135 virtual void disconnected (TAO_EC_ProxyPushSupplier*
00136 ACE_ENV_ARG_DECL_NOT_USED);
00137 };
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 class TAO_RTEvent_Serv_Export TAO_EC_Basic_ObserverStrategy :
00157 public TAO_EC_ObserverStrategy
00158 {
00159 public:
00160
00161 TAO_EC_Basic_ObserverStrategy (TAO_EC_Event_Channel_Base* ec,
00162 ACE_Lock* lock);
00163
00164
00165 virtual ~TAO_EC_Basic_ObserverStrategy (void);
00166
00167
00168 virtual RtecEventChannelAdmin::Observer_Handle
00169 append_observer (RtecEventChannelAdmin::Observer_ptr
00170 ACE_ENV_ARG_DECL)
00171 ACE_THROW_SPEC ((
00172 CORBA::SystemException,
00173 RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00174 RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER));
00175 virtual void remove_observer (
00176 RtecEventChannelAdmin::Observer_Handle
00177 ACE_ENV_ARG_DECL)
00178 ACE_THROW_SPEC ((
00179 CORBA::SystemException,
00180 RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00181 RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER));
00182 virtual void connected (TAO_EC_ProxyPushConsumer*
00183 ACE_ENV_ARG_DECL_NOT_USED);
00184 virtual void disconnected (TAO_EC_ProxyPushConsumer*
00185 ACE_ENV_ARG_DECL_NOT_USED);
00186 virtual void connected (TAO_EC_ProxyPushSupplier*
00187 ACE_ENV_ARG_DECL_NOT_USED);
00188 virtual void disconnected (TAO_EC_ProxyPushSupplier*
00189 ACE_ENV_ARG_DECL_NOT_USED);
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 struct Observer_Entry
00204 {
00205 Observer_Entry (void);
00206 Observer_Entry (RtecEventChannelAdmin::Observer_Handle h,
00207 RtecEventChannelAdmin::Observer_ptr o);
00208
00209
00210 RtecEventChannelAdmin::Observer_Handle handle;
00211
00212
00213 RtecEventChannelAdmin::Observer_var observer;
00214 };
00215
00216 struct Header_Compare
00217 {
00218 int operator () (const RtecEventComm::EventHeader& lhs,
00219 const RtecEventComm::EventHeader& rhs) const;
00220 };
00221
00222 typedef ACE_Map_Manager<RtecEventChannelAdmin::Observer_Handle,Observer_Entry,ACE_Null_Mutex> Observer_Map;
00223 typedef ACE_Map_Iterator<RtecEventChannelAdmin::Observer_Handle,Observer_Entry,ACE_Null_Mutex> Observer_Map_Iterator;
00224
00225
00226 typedef ACE_RB_Tree<RtecEventComm::EventHeader,int,Header_Compare,ACE_Null_Mutex> Headers;
00227 typedef ACE_RB_Tree_Iterator<RtecEventComm::EventHeader,int,Header_Compare,ACE_Null_Mutex> HeadersIterator;
00228
00229 protected:
00230
00231
00232
00233 virtual void consumer_qos_update (TAO_EC_ProxyPushSupplier *supplier
00234 ACE_ENV_ARG_DECL);
00235
00236
00237 virtual void supplier_qos_update (TAO_EC_ProxyPushConsumer *consumer
00238 ACE_ENV_ARG_DECL);
00239
00240
00241 void fill_qos (RtecEventChannelAdmin::ConsumerQOS &qos
00242 ACE_ENV_ARG_DECL);
00243
00244 void fill_qos (RtecEventChannelAdmin::SupplierQOS &qos
00245 ACE_ENV_ARG_DECL);
00246
00247
00248
00249 int create_observer_list (RtecEventChannelAdmin::Observer_var *&lst
00250 ACE_ENV_ARG_DECL);
00251
00252
00253 protected:
00254
00255 TAO_EC_Event_Channel_Base* event_channel_;
00256
00257
00258 ACE_Lock* lock_;
00259
00260
00261
00262 RtecEventChannelAdmin::Observer_Handle handle_generator_;
00263
00264
00265 Observer_Map observers_;
00266 };
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 class TAO_RTEvent_Serv_Export TAO_EC_Reactive_ObserverStrategy :
00287 public TAO_EC_Basic_ObserverStrategy
00288 {
00289 public:
00290
00291 TAO_EC_Reactive_ObserverStrategy (TAO_EC_Event_Channel_Base* ec,
00292 ACE_Lock* lock);
00293
00294
00295 virtual ~TAO_EC_Reactive_ObserverStrategy (void);
00296
00297 protected:
00298
00299
00300
00301 virtual void consumer_qos_update (TAO_EC_ProxyPushSupplier *supplier
00302 ACE_ENV_ARG_DECL);
00303
00304
00305 virtual void supplier_qos_update (TAO_EC_ProxyPushConsumer *consumer
00306 ACE_ENV_ARG_DECL);
00307
00308
00309
00310
00311
00312
00313 int create_observer_map (Observer_Map &map
00314 ACE_ENV_ARG_DECL);
00315
00316
00317 void observer_not_exists (Observer_Entry& observer
00318 ACE_ENV_ARG_DECL);
00319
00320 };
00321
00322
00323
00324 class TAO_EC_Accumulate_Supplier_Headers :
00325 public TAO_ESF_Worker<TAO_EC_ProxyPushSupplier>
00326 {
00327 public:
00328
00329 TAO_EC_Accumulate_Supplier_Headers (TAO_EC_Basic_ObserverStrategy::Headers &headers);
00330
00331 virtual void work (TAO_EC_ProxyPushSupplier *supplier
00332 ACE_ENV_ARG_DECL);
00333
00334 private:
00335 TAO_EC_Basic_ObserverStrategy::Headers &headers_;
00336 };
00337
00338
00339
00340 class TAO_EC_Accumulate_Consumer_Headers :
00341 public TAO_ESF_Worker<TAO_EC_ProxyPushConsumer>
00342 {
00343 public:
00344
00345 TAO_EC_Accumulate_Consumer_Headers (TAO_EC_Basic_ObserverStrategy::Headers &headers);
00346
00347 virtual void work (TAO_EC_ProxyPushConsumer *consumer
00348 ACE_ENV_ARG_DECL);
00349
00350 private:
00351 TAO_EC_Basic_ObserverStrategy::Headers &headers_;
00352 };
00353
00354 TAO_END_VERSIONED_NAMESPACE_DECL
00355
00356 #if defined (__ACE_INLINE__)
00357 #include "orbsvcs/Event/EC_ObserverStrategy.i"
00358 #endif
00359
00360 #include "ace/post.h"
00361
00362 #endif