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);
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);
424 WvString WvDBusMsg::get_argstr()
const 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);
656 :
WvDBusMsg(dbus_message_new_signal(objectname, interface, name))
658 dbus_message_unref(msg);
662 DBusMessage *WvDBusError::setup1(
WvDBusMsg &in_reply_to,
665 return dbus_message_new_error(in_reply_to, errname, message);
668 void WvDBusError::setup2()
670 dbus_message_unref(msg);
WvDBusReplyMsg(DBusMessage *_msg)
Constructs a new reply message (a message intended to be a reply to an existing D-Bus message)...
A WvFastString acts exactly like a WvString, but can take (const char *) strings without needing to a...
void rewind()
Rewinds the iterator to make it point to an imaginary element preceeding the first element of the lis...
uint64_t get_uint() const
Get the current element as a uint64_t (possible for all integer types)
double get_double() const
Get the current element as a double (possible for all integer and floating point types) ...
int64_t get_int() const
Get the current element as an int64_t (possible for all integer types)
WvString get_str() const
Get the current element as a string (possible for all types).
int num() const
Return a stdc++ string with the contents of this string.
int type() const
Returns the data type of the current element.
T * first() const
Returns a pointer to the first element in the linked list.
WvDBusMsg & array_end()
End an array started with array_start().
WvString get_all()
Return a WvString representation of all elements in a single string.
Iter open() const
Returns a sub-iterator for walking through recursive types, such as arrays, structs, and variants.
void get_all(WvStringList &list)
Fill a WvStringList with a string for each element of the iter.
WvDBusMsg & varray_end()
End an array started with array_start().
WvDBusMsg & struct_start(WvStringParm element_type)
Start a struct.
uint32_t send(WvDBusMsg msg)
Send a message on the bus, not expecting any reply.
WvString join(const char *joinchars=" ") const
concatenates all elements of the list seperating on joinchars
WvDBusMsg & append(const char *s)
The following methods are designed to allow appending various arguments to the message.
WvDBusMsg & varray_start(WvStringParm element_type)
Start a variant-array.
void send(WvDBusConn &conn)
A shortcut for sending this message on the given connection.
bool iserror() const
Return true if this message is an error response.
void prepend(T *data, bool autofree, const char *id=NULL)
Prepends the element to the beginning of the list.
WvDBusMsg & struct_end()
End a struct started with struct_start().
WvString * ptr() const
Returns a pointer to the WvString at the iterator's current location.
WvString strreplace(WvStringParm s, WvStringParm a, WvStringParm b)
Replace any instances of "a" with "b" in "s".
This is a WvList of WvStrings, and is a really handy way to parse strings.
WvDBusMsg & variant_end()
End a variant.
bool next()
Moves the iterator along the list to point to the next element.
bool cur() const
Returns: true if the current link is valid.
Various little string functions.
WvDBusMsg & variant_start(WvStringParm element_type)
Start a variant.
A linked list container class.
WvDBusMsg(WvStringParm busname, WvStringParm objectname, WvStringParm ifc, WvStringParm method)
Constructs a new WvDBus message.
WvDBusMsg reply()
Generate a message that will be a reply to this one.
WvString is an implementation of a simple and efficient printable-string class.
void unlink_first()
Unlinks the first element from the list.
size_t count() const
Returns the number of elements in the list.
WvDBusMsg & array_start(WvStringParm element_type)
Start an array.