11 #include "wvdbusmsg.h"
12 #include "wvdbusconn.h"
14 #undef interface // windows
15 #include <dbus/dbus.h>
34 WvDBusMsg::Iter::Iter(
const WvDBusMsg &_msg)
35 : first(new DBusMessageIter), it(new DBusMessageIter)
37 dbus_message_iter_init(_msg, first);
43 : first(new DBusMessageIter), it(new DBusMessageIter)
50 WvDBusMsg::Iter::Iter(
const DBusMessageIter &_first)
51 : first(new DBusMessageIter), it(new DBusMessageIter)
58 WvDBusMsg::Iter::~Iter()
75 else if (type() != DBUS_TYPE_INVALID)
76 dbus_message_iter_next(it);
78 return type() != DBUS_TYPE_INVALID;
84 return dbus_message_iter_get_arg_type(it);
91 dbus_message_iter_recurse(it, &sub);
98 return !rewound && type() != DBUS_TYPE_INVALID;
105 for (rewind(); next() && items < 20; items++)
106 list.append(get_str());
116 return list.
join(
",");
131 case DBUS_TYPE_BOOLEAN:
133 case DBUS_TYPE_INT16:
134 case DBUS_TYPE_INT32:
135 case DBUS_TYPE_INT64:
137 case DBUS_TYPE_UINT16:
138 case DBUS_TYPE_UINT32:
139 case DBUS_TYPE_UINT64:
141 case DBUS_TYPE_DOUBLE:
142 dbus_message_iter_get_basic(it, &d);
144 case DBUS_TYPE_STRING:
145 dbus_message_iter_get_basic(it, &s);
147 case DBUS_TYPE_VARIANT:
148 return WvString(
"{%s}", open().getnext().get_str());
149 case DBUS_TYPE_STRUCT:
150 case DBUS_TYPE_ARRAY:
151 return WvString(
"[%s]", open().get_all());
152 case DBUS_TYPE_INVALID:
155 return WvString(
"UNKNOWN_TYPE(%c)", type());
172 dbus_message_iter_get_basic(it, &c);
175 case DBUS_TYPE_BOOLEAN:
176 dbus_message_iter_get_basic(it, &b);
179 case DBUS_TYPE_INT16:
180 case DBUS_TYPE_UINT16:
181 dbus_message_iter_get_basic(it, &s);
184 case DBUS_TYPE_INT32:
185 case DBUS_TYPE_UINT32:
186 dbus_message_iter_get_basic(it, &i);
189 case DBUS_TYPE_INT64:
190 case DBUS_TYPE_UINT64:
191 dbus_message_iter_get_basic(it, &l);
194 case DBUS_TYPE_STRING:
195 dbus_message_iter_get_basic(it, &str);
198 case DBUS_TYPE_VARIANT:
199 return open().getnext().get_int();
219 dbus_message_iter_get_basic(it, &c);
222 case DBUS_TYPE_BOOLEAN:
223 dbus_message_iter_get_basic(it, &b);
226 case DBUS_TYPE_INT16:
227 case DBUS_TYPE_UINT16:
228 dbus_message_iter_get_basic(it, &s);
231 case DBUS_TYPE_INT32:
232 case DBUS_TYPE_UINT32:
233 dbus_message_iter_get_basic(it, &i);
236 case DBUS_TYPE_INT64:
237 case DBUS_TYPE_UINT64:
238 dbus_message_iter_get_basic(it, &l);
241 case DBUS_TYPE_STRING:
242 dbus_message_iter_get_basic(it, &str);
245 case DBUS_TYPE_VARIANT:
246 return open().getnext().get_uint();
266 case DBUS_TYPE_DOUBLE:
267 dbus_message_iter_get_basic(it, &d);
271 dbus_message_iter_get_basic(it, &c);
274 case DBUS_TYPE_BOOLEAN:
275 dbus_message_iter_get_basic(it, &b);
278 case DBUS_TYPE_INT16:
279 case DBUS_TYPE_UINT16:
280 dbus_message_iter_get_basic(it, &s);
283 case DBUS_TYPE_INT32:
284 case DBUS_TYPE_UINT32:
285 dbus_message_iter_get_basic(it, &i);
288 case DBUS_TYPE_INT64:
289 case DBUS_TYPE_UINT64:
290 dbus_message_iter_get_basic(it, &l);
293 case DBUS_TYPE_STRING:
294 dbus_message_iter_get_basic(it, &str);
297 case DBUS_TYPE_VARIANT:
298 return open().getnext().get_double();
315 static DBusMessageIter *new_append_iter(
WvDBusMsg &msg)
317 DBusMessageIter *it =
new DBusMessageIter;
318 dbus_message_iter_init_append(msg, it);
324 WvStringParm interface, WvStringParm method)
326 msg = dbus_message_new_method_call(busname, objectname, interface, method);
327 itlist.
prepend(new_append_iter(*
this),
true);
334 dbus_message_ref(msg);
335 itlist.
prepend(new_append_iter(*
this),
true);
342 dbus_message_ref(msg);
343 itlist.
prepend(new_append_iter(*
this),
true);
347 WvDBusMsg::~WvDBusMsg()
349 dbus_message_unref(msg);
353 WvDBusMsg::operator DBusMessage* ()
const
359 WvString WvDBusMsg::get_sender()
const
361 return dbus_message_get_sender(msg);
365 WvString WvDBusMsg::get_dest()
const
367 return dbus_message_get_destination(msg);
371 WvString WvDBusMsg::get_path()
const
373 return dbus_message_get_path(msg);
377 WvString WvDBusMsg::get_interface()
const
379 return dbus_message_get_interface(msg);
383 WvString WvDBusMsg::get_member()
const
385 return dbus_message_get_member(msg);
389 WvString WvDBusMsg::get_error()
const
392 return dbus_message_get_error_name(msg);
394 return WvString::null;
397 bool WvDBusMsg::is_reply()
const
402 return get_replyserial() != 0;
406 uint32_t WvDBusMsg::get_serial()
const
408 return dbus_message_get_serial(msg);
412 uint32_t WvDBusMsg::get_replyserial()
const
414 return dbus_message_get_reply_serial(msg);
420 Iter(*this).get_all(list);
424 WvString WvDBusMsg::get_argstr()
const
426 return Iter(*this).get_all();
430 WvDBusMsg::operator
WvString()
const
440 return WvString(
"ERR#%s->%s#%s(%s)",
441 get_serial(), dest, get_replyserial(),
444 return WvString(
"REPLY#%s->%s#%s(%s)",
445 get_serial(), dest, get_replyserial(),
452 get_path(), get_interface(), get_member(),
453 get_argstr(), get_serial());
454 s =
strreplace(s,
"org.freedesktop.DBus",
"o.f.D");
455 s =
strreplace(s,
"org/freedesktop/DBus",
"o/f/D");
465 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_STRING, &s);
474 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_BOOLEAN, &bb);
482 dbus_unichar_t cc = c;
483 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_BYTE, &cc);
491 dbus_unichar_t cc = c;
492 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_BYTE, &cc);
500 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_INT16, &i);
508 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_UINT16, &i);
516 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_INT32, &i);
524 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_UINT32, &i);
532 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_INT64, &i);
540 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_UINT64, &i);
548 dbus_message_iter_append_basic(itlist.
first(), DBUS_TYPE_DOUBLE, &d);
555 DBusMessageIter *parent = itlist.
first();
556 DBusMessageIter *sub =
new DBusMessageIter;
557 dbus_message_iter_open_container(parent,
558 DBUS_TYPE_VARIANT, element_type, sub);
566 assert(itlist.
count() >= 2);
569 i.rewind(); i.next();
570 DBusMessageIter *sub = i.ptr();
572 DBusMessageIter *parent = i.ptr();
574 dbus_message_iter_close_container(parent, sub);
582 DBusMessageIter *parent = itlist.
first();
583 DBusMessageIter *sub =
new DBusMessageIter;
584 dbus_message_iter_open_container(parent,
585 DBUS_TYPE_STRUCT, 0, sub);
599 DBusMessageIter *parent = itlist.
first();
600 DBusMessageIter *sub =
new DBusMessageIter;
601 dbus_message_iter_open_container(parent,
602 DBUS_TYPE_ARRAY, element_type, sub);
623 assert(itlist.
count() >= 3);
637 return dbus_message_get_type(msg) == DBUS_MESSAGE_TYPE_ERROR;
648 :
WvDBusMsg(dbus_message_new_method_return(_msg))
650 dbus_message_unref(msg);
654 WvDBusSignal::WvDBusSignal(WvStringParm objectname, WvStringParm interface,
656 :
WvDBusMsg(dbus_message_new_signal(objectname, interface, name))
658 dbus_message_unref(msg);
662 DBusMessage *WvDBusError::setup1(
WvDBusMsg &in_reply_to,
663 WvStringParm errname, WvStringParm message)
665 return dbus_message_new_error(in_reply_to, errname, message);
668 void WvDBusError::setup2()
670 dbus_message_unref(msg);