Fawkes API  Fawkes Development Version
sync_listener.cpp
1 
2 /***************************************************************************
3  * sync_listener.cpp - Sync Interface Listener
4  *
5  * Created: Fri Jun 05 11:01:23 2009
6  * Copyright 2006-2009 Tim Niemueller [www.niemueller.de]
7  *
8  ****************************************************************************/
9 
10 /* This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Library General Public License for more details.
19  *
20  * Read the full text in the LICENSE.GPL file in the doc directory.
21  */
22 
23 #include "sync_listener.h"
24 
25 #include <blackboard/blackboard.h>
26 #include <logging/logger.h>
27 
28 using namespace fawkes;
29 
30 /** @class SyncInterfaceListener "sync_listener.h"
31  * Synchronize two interfaces.
32  * This class synchronizes two interfaces, a reading and a writing instance
33  * of the same type. To accomplish this it listens for data changed and message
34  * events and forwards them as appropriate to "the other side".
35  * @author Tim Niemueller
36  */
37 
38 /** Constructor.
39  * Automatically registers the listener with the (two) blackboards as
40  * appropriate. It also automatically unregisters in the destructor.
41  * @param logger logger to write informational output to
42  * @param reader reading interface instance
43  * @param writer writing interface instance of the same type as \p reader
44  * @param reader_bb the BlackBoard instance the reading instance has been
45  * created on
46  * @param writer_bb the BlackBoard instance the writing instance has been
47  * created on
48  */
50  fawkes::Interface * reader,
51  fawkes::Interface * writer,
52  fawkes::BlackBoard *reader_bb,
53  fawkes::BlackBoard *writer_bb)
54 : BlackBoardInterfaceListener("SyncInterfaceListener(%s-%s)", writer->uid(), reader->id())
55 {
56  logger_ = logger;
57  reader_ = reader;
58  writer_ = writer;
59  reader_bb_ = reader_bb;
60  writer_bb_ = writer_bb;
61 
62  bbil_add_data_interface(reader_);
65 
66  reader_bb_->register_listener(this, BlackBoard::BBIL_FLAG_DATA);
67  writer_bb_->register_listener(this, BlackBoard::BBIL_FLAG_MESSAGES);
68 }
69 
70 /** Destructor. */
72 {
73  reader_bb_->unregister_listener(this);
74  writer_bb_->unregister_listener(this);
75 }
76 
77 bool
79  Message * message) noexcept
80 {
81  try {
82  if (interface == writer_) {
83  //logger_->log_debug(bbil_name(), "Forwarding message");
84  logger_->log_debug(bbil_name(),
85  "Forwarding message from sender %s, source %s",
86  message->sender_id().get_string().c_str(),
87  message->source_id().get_string().c_str());
88  Message *m = message->clone();
89  m->set_hops(message->hops());
90  m->ref();
91  reader_->msgq_enqueue(m, true);
92  message->set_id(m->id());
93  logger_->log_debug(bbil_name(),
94  "Sender after enqueueing: %s",
95  m->sender_id().get_string().c_str());
96  logger_->log_debug(bbil_name(),
97  "Source after enqueueing: %s",
98  m->source_id().get_string().c_str());
99  m->unref();
100  return false;
101  } else {
102  // Don't know why we were called, let 'em enqueue
103  logger_->log_error(bbil_name(), "Message received for unknown interface");
104  return true;
105  }
106  } catch (Exception &e) {
107  logger_->log_error(bbil_name(), "Exception when message received");
108  logger_->log_error("SyncInterfaceListener", e);
109  return false;
110  }
111 }
112 
113 void
115 {
116  try {
117  if (interface == reader_) {
118  //logger_->log_debug(bbil_name(), "Copying data");
119  reader_->read();
120  writer_->copy_values(reader_);
121  writer_->write();
122  } else {
123  // Don't know why we were called, let 'em enqueue
124  logger_->log_error(bbil_name(), "Data changed for unknown interface");
125  }
126  } catch (Exception &e) {
127  logger_->log_error(bbil_name(), "Exception when data changed");
128  logger_->log_error(bbil_name(), e);
129  }
130 }
virtual ~SyncInterfaceListener()
Destructor.
virtual bool bb_interface_message_received(fawkes::Interface *interface, fawkes::Message *message) noexcept
BlackBoard message received notification.
virtual void bb_interface_data_refreshed(fawkes::Interface *interface) noexcept
BlackBoard data refreshed notification.
SyncInterfaceListener(fawkes::Logger *logger, fawkes::Interface *reader, fawkes::Interface *writer, fawkes::BlackBoard *reader_bb, fawkes::BlackBoard *writer_bb)
Constructor.
BlackBoard interface listener.
void bbil_add_message_interface(Interface *interface)
Add an interface to the message received watch list.
void bbil_add_data_interface(Interface *interface)
Add an interface to the data modification watch list.
The BlackBoard abstract class.
Definition: blackboard.h:46
virtual void unregister_listener(BlackBoardInterfaceListener *listener)
Unregister BB interface listener.
Definition: blackboard.cpp:212
virtual void register_listener(BlackBoardInterfaceListener *listener, ListenerRegisterFlag flag=BBIL_FLAG_ALL)
Register BB event listener.
Definition: blackboard.cpp:185
Base class for exceptions in Fawkes.
Definition: exception.h:36
Base class for all Fawkes BlackBoard interfaces.
Definition: interface.h:80
Interface for logging.
Definition: logger.h:42
Base class for all messages passed through interfaces in Fawkes BlackBoard.
Definition: message.h:44
Uuid source_id() const
Get ID of the original source of the message.
Definition: message.cpp:346
Uuid sender_id() const
Get ID of the immediate sender, not necessarily the creator of the message.
Definition: message.cpp:336
void set_hops(unsigned int hops)
Set number of hops.
Definition: message.cpp:227
virtual Message * clone() const
Clone this message.
Definition: message.cpp:418
unsigned int id() const
Get message ID.
Definition: message.cpp:181
void unref()
Decrement reference count and conditionally delete this instance.
Definition: refcount.cpp:95
void ref()
Increment reference count.
Definition: refcount.cpp:67
std::string get_string() const
Get the string representation of the Uuid.
Definition: uuid.cpp:107
Fawkes library namespace.