Gateway.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef __Gateway_h__
00041 #define __Gateway_h__
00042
00043 #include "debug.h"
00044 #include "mw/nl/DistinctNL.h"
00045 #include "mw/el/EventLayer.h"
00046 #include "mw/api/SubscriberEventChannel.h"
00047 #include "mw/gwl/GatewayEventChannel.h"
00048 #include "mw/common/Event.h"
00049 #include "object/Storage.h"
00050
00051 namespace famouso {
00052 namespace mw {
00053 namespace gwl {
00054
00067 template < class ECH, template < typename > class Storage=object::Storage >
00068 class Gateway : private famouso::mw::api::SubscriberEventChannel<ECH> {
00069 typedef GatewayEventChannel<ECH> GEC;
00070 typedef typename Storage<GEC>::depot depot;
00071
00072 depot gecs;
00073 public:
00074
00077 Gateway() : famouso::mw::api::SubscriberEventChannel< ECH > (famouso::mw::Subject("SUBSCRIBE")) {
00078 this->subscribe();
00079 this->callback.template bind<Gateway, &Gateway::subscribe_from_network>(this);
00080 }
00081
00082 private:
00083
00084 void subscribe_from_network(famouso::mw::api::SECCallBackData& cbd) {
00085 if (this->ech().get_network_id() == 0) {
00086 ::logging::log::emit()
00087 << PROGMEMSTRING("Lokal Subscription")
00088 << ::logging::log::endl;
00089 } else {
00090 if (this->subject() == famouso::mw::Subject(cbd.data)) {
00091 ::logging::log::emit()
00092 << PROGMEMSTRING("Subscribe Message of another gateway")
00093 << ::logging::log::endl;
00094 } else {
00095 typename depot::iterator ii = gecs.begin();
00096 while (ii != gecs.end()) {
00098 if ((*ii).subject() == famouso::mw::Subject(cbd.data)) {
00099 ::logging::log::emit()
00100 << PROGMEMSTRING("forward channel exits")
00101 << ::logging::log::endl;
00102 return;
00103 }
00104 ii++;
00105 }
00106
00107 GEC *p=gecs.newElement();
00108 if ( p ) {
00109 ::logging::log::emit()
00110 << PROGMEMSTRING("Generate a new proxy channel for forwarding events of Subject ")
00111 << cbd.data << ::logging::log::endl;
00112 new(p) GEC(famouso::mw::Subject(cbd.data), this->ech().get_network_id());
00113 }
00114 }
00115 }
00116 }
00117 };
00118 }
00119 }
00120 }
00121
00122 #endif