interface_dispatcher.h

00001 
00002 /***************************************************************************
00003  *  interface_dispatcher.cpp - BlackBoard listener and dispatcher
00004  *
00005  *  Created: Thu Oct 09 23:04:59 2008
00006  *  Copyright  2008  Tim Niemueller [www.niemueller.de]
00007  *
00008  ****************************************************************************/
00009 
00010 /*  This program is free software; you can redistribute it and/or modify
00011  *  it under the terms of the GNU General Public License as published by
00012  *  the Free Software Foundation; either version 2 of the License, or
00013  *  (at your option) any later version. A runtime exception applies to
00014  *  this software (see LICENSE.GPL_WRE file mentioned below for details).
00015  *
00016  *  This program is distributed in the hope that it will be useful,
00017  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  *  GNU Library General Public License for more details.
00020  *
00021  *  Read the full text in the LICENSE.GPL_WRE file in the doc directory.
00022  */
00023 
00024 #ifndef __LIBS_GUI_UTILS_INTERFACE_DISPATCHER_H_
00025 #define __LIBS_GUI_UTILS_INTERFACE_DISPATCHER_H_
00026 
00027 #include <glibmm/dispatcher.h>
00028 #include <blackboard/interface_listener.h>
00029 #include <core/utils/lock_queue.h>
00030 
00031 namespace fawkes {
00032 class Interface;
00033 
00034 class InterfaceDispatcher
00035 : public BlackBoardInterfaceListener
00036 {
00037  public:
00038   InterfaceDispatcher(const char *listener_name, fawkes::Interface *iface,
00039                       bool message_enqueueing = true);
00040 
00041   void set_message_enqueueing(bool enqueue);
00042 
00043   sigc::signal<void, Interface *>               signal_data_changed();
00044   sigc::signal<void, Interface *, Message *>    signal_message_received();
00045   sigc::signal<void, Interface *>               signal_writer_added();
00046   sigc::signal<void, Interface *>               signal_writer_removed();
00047   sigc::signal<void, Interface *>               signal_reader_added();
00048   sigc::signal<void, Interface *>               signal_reader_removed();
00049 
00050   virtual void bb_interface_data_changed(Interface *interface) throw();
00051   virtual bool bb_interface_message_received(Interface *interface, Message *message) throw();
00052   virtual void bb_interface_writer_added(Interface *interface,
00053                                          unsigned int instance_serial) throw();
00054   virtual void bb_interface_writer_removed(Interface *interface,
00055                                            unsigned int instance_serial) throw();
00056   virtual void bb_interface_reader_added(Interface *interface,
00057                                          unsigned int instance_serial) throw();
00058   virtual void bb_interface_reader_removed(Interface *interface,
00059                                            unsigned int instance_serial) throw();
00060 
00061  protected:
00062   virtual void on_data_changed();
00063   virtual void on_message_received();
00064   virtual void on_writer_added();
00065   virtual void on_writer_removed();
00066   virtual void on_reader_added();
00067   virtual void on_reader_removed();
00068 
00069 
00070  private:
00071   bool                                           __message_enqueueing;
00072 
00073   Glib::Dispatcher                               __dispatcher_data_changed;
00074   Glib::Dispatcher                               __dispatcher_message_received;
00075   Glib::Dispatcher                               __dispatcher_writer_added;
00076   Glib::Dispatcher                               __dispatcher_writer_removed;
00077   Glib::Dispatcher                               __dispatcher_reader_added;
00078   Glib::Dispatcher                               __dispatcher_reader_removed;
00079 
00080   sigc::signal<void, Interface *>                __signal_data_changed;
00081   sigc::signal<void, Interface *, Message *>     __signal_message_received;
00082   sigc::signal<void, Interface *>                __signal_writer_added;
00083   sigc::signal<void, Interface *>                __signal_writer_removed;
00084   sigc::signal<void, Interface *>                __signal_reader_added;
00085   sigc::signal<void, Interface *>                __signal_reader_removed;
00086 
00087   LockQueue<Interface *>                         __queue_data_changed;
00088   LockQueue<std::pair<Interface *, Message *> >  __queue_message_received;
00089   LockQueue<Interface *>                         __queue_writer_added;
00090   LockQueue<Interface *>                         __queue_writer_removed;
00091   LockQueue<Interface *>                         __queue_reader_added;
00092   LockQueue<Interface *>                         __queue_reader_removed;
00093 };
00094 
00095 }
00096 
00097 #endif