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>
34 using namespace fawkes;
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();