00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <gui_utils/interface_dispatcher.h>
00025 #include <interface/interface.h>
00026
00027 namespace fawkes {
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 InterfaceDispatcher::InterfaceDispatcher(const char *listener_name,
00047 Interface *iface,
00048 bool message_enqueueing)
00049 : BlackBoardInterfaceListener(listener_name)
00050 {
00051 __message_enqueueing = message_enqueueing;
00052
00053 bbil_add_data_interface(iface);
00054 if ( iface->is_writer() ) {
00055 bbil_add_message_interface(iface);
00056 }
00057 bbil_add_writer_interface(iface);
00058 bbil_add_reader_interface(iface);
00059
00060 __dispatcher_data_changed.connect(sigc::mem_fun(*this, &InterfaceDispatcher::on_data_changed));
00061 __dispatcher_message_received.connect(sigc::mem_fun(*this, &InterfaceDispatcher::on_message_received));
00062 __dispatcher_writer_added.connect(sigc::mem_fun(*this, &InterfaceDispatcher::on_writer_added));
00063 __dispatcher_writer_removed.connect(sigc::mem_fun(*this, &InterfaceDispatcher::on_writer_removed));
00064 __dispatcher_reader_added.connect(sigc::mem_fun(*this, &InterfaceDispatcher::on_reader_added));
00065 __dispatcher_reader_removed.connect(sigc::mem_fun(*this, &InterfaceDispatcher::on_writer_removed));
00066 }
00067
00068
00069
00070
00071
00072
00073
00074
00075 void
00076 InterfaceDispatcher::set_message_enqueueing(bool enqueue)
00077 {
00078 __message_enqueueing = enqueue;
00079 }
00080
00081
00082
00083
00084
00085 void
00086 InterfaceDispatcher::on_data_changed()
00087 {
00088 __queue_data_changed.lock();
00089 while (! __queue_data_changed.empty()) {
00090 Interface *iface = __queue_data_changed.front();
00091 __signal_data_changed.emit(iface);
00092 __queue_data_changed.pop();
00093 }
00094 __queue_data_changed.unlock();
00095 }
00096
00097
00098
00099
00100
00101 void
00102 InterfaceDispatcher::on_message_received()
00103 {
00104 __queue_message_received.lock();
00105 while (! __queue_message_received.empty()) {
00106 std::pair<Interface *, Message *> p = __queue_message_received.front();
00107 __signal_message_received.emit(p.first, p.second);
00108 p.second->unref();
00109 __queue_message_received.pop();
00110 }
00111 __queue_message_received.unlock();
00112 }
00113
00114
00115
00116
00117
00118 void
00119 InterfaceDispatcher::on_writer_added()
00120 {
00121 __queue_writer_added.lock();
00122 while (! __queue_writer_added.empty()) {
00123 Interface *iface = __queue_writer_added.front();
00124 __signal_writer_added.emit(iface);
00125 __queue_writer_added.pop();
00126 }
00127 __queue_writer_added.unlock();
00128 }
00129
00130
00131
00132
00133
00134 void
00135 InterfaceDispatcher::on_writer_removed()
00136 {
00137 __queue_writer_removed.lock();
00138 while (! __queue_writer_removed.empty()) {
00139 Interface *iface = __queue_writer_removed.front();
00140 __signal_writer_removed.emit(iface);
00141 __queue_writer_removed.pop();
00142 }
00143 __queue_writer_removed.unlock();
00144 }
00145
00146
00147
00148
00149
00150 void
00151 InterfaceDispatcher::on_reader_added()
00152 {
00153 __queue_reader_added.lock();
00154 while (! __queue_reader_added.empty()) {
00155 Interface *iface = __queue_reader_added.front();
00156 __signal_reader_added.emit(iface);
00157 __queue_reader_added.pop();
00158 }
00159 __queue_reader_added.unlock();
00160 }
00161
00162
00163
00164
00165
00166 void
00167 InterfaceDispatcher::on_reader_removed()
00168 {
00169 __queue_reader_removed.lock();
00170 while (! __queue_reader_removed.empty()) {
00171 Interface *iface = __queue_reader_removed.front();
00172 __signal_reader_removed.emit(iface);
00173 __queue_reader_removed.pop();
00174 }
00175 __queue_reader_removed.unlock();
00176 }
00177
00178
00179 void
00180 InterfaceDispatcher::bb_interface_data_changed(Interface *interface) throw()
00181 {
00182 __queue_data_changed.push_locked(interface);
00183 __dispatcher_data_changed();
00184 }
00185
00186 bool
00187 InterfaceDispatcher::bb_interface_message_received(Interface *interface, Message *message) throw()
00188 {
00189 message->ref();
00190 __queue_message_received.push_locked(std::make_pair(interface, message));
00191 __dispatcher_message_received();
00192 return __message_enqueueing;
00193 }
00194
00195 void
00196 InterfaceDispatcher::bb_interface_writer_added(Interface *interface,
00197 unsigned int instance_serial) throw()
00198 {
00199 __queue_writer_added.push_locked(interface);
00200 __dispatcher_writer_added();
00201 }
00202
00203 void
00204 InterfaceDispatcher::bb_interface_writer_removed(Interface *interface,
00205 unsigned int instance_serial) throw()
00206 {
00207 __queue_writer_removed.push_locked(interface);
00208 __dispatcher_writer_removed();
00209 }
00210
00211 void
00212 InterfaceDispatcher::bb_interface_reader_added(Interface *interface,
00213 unsigned int instance_serial) throw()
00214 {
00215 __queue_reader_added.push_locked(interface);
00216 __dispatcher_reader_added();
00217 }
00218
00219 void
00220 InterfaceDispatcher::bb_interface_reader_removed(Interface *interface,
00221 unsigned int instance_serial) throw()
00222 {
00223 __queue_reader_removed.push_locked(interface);
00224 __dispatcher_reader_removed();
00225 }
00226
00227
00228
00229
00230
00231 sigc::signal<void, Interface *>
00232 InterfaceDispatcher::signal_data_changed()
00233 {
00234 return __signal_data_changed;
00235 }
00236
00237
00238
00239
00240
00241
00242
00243
00244 sigc::signal<void, Interface *, Message *>
00245 InterfaceDispatcher::signal_message_received()
00246 {
00247 return __signal_message_received;
00248 }
00249
00250
00251
00252
00253
00254
00255 sigc::signal<void, Interface *>
00256 InterfaceDispatcher::signal_writer_added()
00257 {
00258 return __signal_writer_added;
00259 }
00260
00261
00262
00263
00264
00265
00266 sigc::signal<void, Interface *>
00267 InterfaceDispatcher::signal_writer_removed()
00268 {
00269 return __signal_writer_removed;
00270 }
00271
00272
00273
00274
00275
00276
00277 sigc::signal<void, Interface *>
00278 InterfaceDispatcher::signal_reader_added()
00279 {
00280 return __signal_reader_added;
00281 }
00282
00283
00284
00285
00286
00287
00288 sigc::signal<void, Interface *>
00289 InterfaceDispatcher::signal_reader_removed()
00290 {
00291 return __signal_reader_removed;
00292 }
00293
00294
00295 }