void MessageIter::copy_data(MessageIter &to) { for (MessageIter &from = *this; !from.at_end(); ++from) { if (is_basic_type(from.type())) { debug_log("copying basic type: %c", from.type()); unsigned char value[8]; from.get_basic(from.type(), &value); to.append_basic(from.type(), &value); } else { MessageIter from_container = from.recurse(); char *sig = from_container.signature(); debug_log("copying compound type: %c[%s]", from.type(), sig); MessageIter to_container (to.msg()); dbus_message_iter_open_container ( (DBusMessageIter *)&(to._iter), from.type(), from.type() == DBUS_TYPE_VARIANT ? NULL : sig, (DBusMessageIter *)&(to_container._iter) ); from_container.copy_data(to_container); to.close_container(to_container); free(sig); } } }
MessageIter &operator << (MessageIter &iter, const Variant &val) { const Signature sig = val.signature(); MessageIter rit = val.reader(); MessageIter wit = iter.new_variant(sig.c_str()); rit.copy_data(wit); iter.close_container(wit); return iter; }
void MessageIter::copy_data(MessageIter &to) { for (MessageIter &from = *this; !from.at_end(); ++from) { if (is_basic_type(from.type())) { debug_log("copying basic type: %c", from.type()); unsigned char value[8]; from.get_basic(from.type(), &value); to.append_basic(from.type(), &value); } else { MessageIter from_container = from.recurse(); char *sig = from_container.signature(); debug_log("copying compound type: %c[%s]", from.type(), sig); MessageIter to_container(to.msg()); /** * Replaced dbus_message_iter_open_container ( (DBusMessageIter *) & (to._iter), from.type(), from.type() == DBUS_TYPE_VARIANT ? NULL : sig, (DBusMessageIter *) & (to_container._iter) ); */ /** * Added by toolmmy <*****@*****.**> * see https://bugs.launchpad.net/ubuntu/+source/dbus-c++/+bug/1098723 */ dbus_message_iter_open_container( (DBusMessageIter *) &(to._iter), from.type(), ((from.type() == DBUS_TYPE_STRUCT) || (from.type() == DBUS_TYPE_DICT_ENTRY) ? NULL : sig), (DBusMessageIter *) &(to_container._iter) ); from_container.copy_data(to_container); to.close_container(to_container); free(sig); } } }