23 #include "multi_copy.h" 25 #include <core/threading/mutex_locker.h> 26 #include <blackboard/blackboard.h> 27 #include <interface/interface.h> 28 #include <core/exceptions/system.h> 58 const char *from_id_pattern,
59 const char *to_id_format)
61 __blackboard = blackboard;
62 __from_id_pattern = from_id_pattern;
63 __to_id_format = to_id_format;
65 std::string::size_type loc = 0;
66 loc = __to_id_format.find(
"%");
67 if ( (loc == std::string::npos) ||
68 (__to_id_format.find(
"%", loc+1) != std::string::npos) ||
69 (__to_id_format.find(
"%u") == std::string::npos) ) {
70 throw Exception(
"to_id_format ('%s') must contain exactly one occurrence of %%u", to_id_format);
73 std::list<Interface *> exifs;
77 for (std::list<Interface *>::iterator i = exifs.begin(); i != exifs.end(); ++i) {
79 if (asprintf(&tid, to_id_format, ++u) != -1) {
80 std::string sid = tid;
89 for (std::list<Interface *>::iterator i = exifs.begin(); i != exifs.end(); ++i) {
90 blackboard->
close(*i);
92 for (__imi = __ifmap.begin(); __imi != __ifmap.end(); ++__imi) {
93 blackboard->
close(__imi->second);
98 bbio_add_observed_create(type, from_id_pattern);
106 __blackboard->unregister_observer(
this);
109 for (__imi = __ifmap.begin(); __imi != __ifmap.end(); ++__imi) {
110 __blackboard->close(__imi->first);
111 __blackboard->close(__imi->second);
122 if (sscanf(
id, __to_id_format.c_str(), &u) == 1) {
129 if (asprintf(&tid, __to_id_format.c_str(), u) == -1) {
130 printf(
"Could not create ID string, asprintf() ran out of memory");
133 std::string sid = tid;
140 from_if = __blackboard->open_for_reading(type,
id);
141 to_if = __blackboard->open_for_writing(type, sid.c_str());
144 __ifmap[from_if] = to_if;
147 __blackboard->close(from_if);
148 __blackboard->close(to_if);
158 for (__imi = __ifmap.begin(); __imi != __ifmap.end(); ++__imi) {
159 if (__imi->first->has_writer()) {
160 __imi->first->read();
161 __imi->second->copy_values(__imi->first);
162 __imi->second->write();
virtual void register_observer(BlackBoardInterfaceObserver *observer)
Register BB interface observer.
Fawkes library namespace.
Base class for all Fawkes BlackBoard interfaces.
virtual Interface * open_for_writing(const char *interface_type, const char *identifier)=0
Open interface for writing.
~WorldModelMultiCopyFuser()
Destructor.
Base class for exceptions in Fawkes.
virtual void fuse()
The single function that makes fusers work.
void print_trace()
Prints trace to stderr.
virtual void bb_interface_created(const char *type, const char *id)
BlackBoard interface created notification.
The BlackBoard abstract class.
virtual std::list< Interface * > open_multiple_for_reading(const char *type_pattern, const char *id_pattern="*")=0
Open multiple interfaces for reading.
WorldModelMultiCopyFuser(fawkes::BlackBoard *blackboard, const char *type, const char *from_id_pattern, const char *to_id_format)
Constructor.
System ran out of memory and desired operation could not be fulfilled.
virtual void close(Interface *interface)=0
Close interface.