00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __WVDBUSMSG_H
00015 #define __WVDBUSMSG_H
00016
00017 #include "wvstringlist.h"
00018 #include "wvbuf.h"
00019 #include <stdint.h>
00020
00021 struct DBusMessageIter;
00022 struct DBusMessage;
00023
00024 class WvDBusMsg;
00025 class WvDBusConn;
00026
00027
00028 extern "C" {
00029 size_t wvdbus_message_length(const void *buf, size_t len);
00030 DBusMessage *wvdbus_demarshal(const void *buf, size_t len, size_t *used);
00031 int wvdbus_marshal(DBusMessage *msg, char **cbuf, size_t *len);
00032 }
00033
00034
00035 class WvDBusMsg
00036 {
00037 public:
00043 WvDBusMsg(WvStringParm busname, WvStringParm objectname,
00044 WvStringParm ifc, WvStringParm method);
00045
00049 WvDBusMsg(WvDBusMsg &_msg);
00050
00055 WvDBusMsg(DBusMessage *_msg);
00056
00057 virtual ~WvDBusMsg();
00058
00059 operator DBusMessage* () const;
00060
00068 static WvDBusMsg *demarshal(WvBuf &buf);
00069
00078 static size_t demarshal_bytes_needed(WvBuf &buf);
00079
00087 void marshal(WvBuf &buf);
00088
00089 WvString get_sender() const;
00090 WvString get_dest() const;
00091 WvString get_path() const;
00092 WvString get_interface() const;
00093 WvString get_member() const;
00094 WvString get_error() const;
00095 uint32_t get_serial() const;
00096 uint32_t get_replyserial() const;
00097 bool is_reply() const;
00098 operator WvString() const;
00099
00100 void get_arglist(WvStringList &list) const;
00101 WvString get_argstr() const;
00102
00107 WvDBusMsg &append(const char *s);
00108 WvDBusMsg &append(bool b);
00109 WvDBusMsg &append(signed char c);
00110 WvDBusMsg &append(unsigned char c);
00111 WvDBusMsg &append(int16_t i);
00112 WvDBusMsg &append(uint16_t i);
00113 WvDBusMsg &append(int32_t i);
00114 WvDBusMsg &append(uint32_t i);
00115 WvDBusMsg &append(int64_t i);
00116 WvDBusMsg &append(uint64_t i);
00117 WvDBusMsg &append(double d);
00118
00122 WvDBusMsg &variant_start(WvStringParm element_type);
00123
00127 WvDBusMsg &variant_end();
00128
00134 WvDBusMsg &struct_start(WvStringParm element_type);
00135
00139 WvDBusMsg &struct_end();
00140
00145 WvDBusMsg &array_start(WvStringParm element_type);
00146
00150 WvDBusMsg &array_end();
00151
00160 WvDBusMsg &varray_start(WvStringParm element_type);
00161
00165 WvDBusMsg &varray_end();
00166
00170 WvDBusMsg reply();
00171
00175 bool iserror() const;
00176
00181 void send(WvDBusConn &conn);
00182
00183 class Iter
00184 {
00185 public:
00186 DBusMessageIter *const first, *const it;
00187 mutable WvString s;
00188 bool rewound;
00189
00190 Iter(const WvDBusMsg &_msg);
00191 Iter(const WvDBusMsg::Iter &_it);
00192 Iter(const DBusMessageIter &_first);
00193 ~Iter();
00194
00199 void rewind();
00200
00205 int type() const;
00206
00214 Iter open() const;
00215
00222 bool next();
00223
00229 Iter &getnext()
00230 { next(); return *this; }
00231
00235 bool cur() const;
00236
00240 void get_all(WvStringList &list);
00241
00246 WvString get_all();
00247
00251 WvString get_str() const;
00252
00257 int64_t get_int() const;
00258 operator int64_t() const { return get_int(); }
00259 operator int32_t() const { return get_int(); }
00260 operator int16_t() const { return get_int(); }
00261 operator int8_t() const { return get_int(); }
00262 operator bool() const { return get_int() != 0; }
00263
00268 uint64_t get_uint() const;
00269 operator uint64_t() const { return get_uint(); }
00270 operator uint32_t() const { return get_uint(); }
00271 operator uint16_t() const { return get_uint(); }
00272 operator uint8_t() const { return get_uint(); }
00273
00278 double get_double() const;
00279 operator double() const { return get_double(); }
00280 operator float() const { return get_double(); }
00281
00286 WvString *ptr() const;
00287 operator WvString() const { return *ptr(); }
00288
00289 WvIterStuff(WvString);
00290 };
00291
00292 protected:
00293 mutable DBusMessage *msg;
00294 WvList<DBusMessageIter> itlist;
00295 };
00296
00297
00298 class WvDBusSignal : public WvDBusMsg
00299 {
00300 public:
00301 WvDBusSignal(WvStringParm objectname, WvStringParm ifc,
00302 WvStringParm name);
00303 };
00304
00305
00306 class WvDBusError : public WvDBusMsg
00307 {
00308 DBusMessage *setup1(WvDBusMsg &in_reply_to,
00309 WvStringParm errname, WvStringParm message);
00310 void setup2();
00311 public:
00312 WvDBusError(WvDBusMsg &in_reply_to,
00313 WvStringParm errname, WvStringParm message)
00314 : WvDBusMsg(setup1(in_reply_to, errname, message))
00315 {
00316 setup2();
00317 }
00318
00319 WvDBusError(WvDBusMsg &in_reply_to,
00320 WvStringParm errname, WVSTRING_FORMAT_DECL)
00321 : WvDBusMsg(setup1(in_reply_to, errname,
00322 WvString(WVSTRING_FORMAT_CALL)))
00323 {
00324 setup2();
00325 }
00326 };
00327
00328 #endif // __WVDBUSMSG_H