WvStreams
|
00001 /* -*- Mode: C++ -*- 00002 * Worldvisions Weaver Software: 00003 * Copyright (C) 2004-2006 Net Integration Technologies, Inc. 00004 * 00005 * Pathfinder Software: 00006 * Copyright (C) 2007, Carillon Information Security Inc. 00007 * 00008 * This library is licensed under the LGPL, please read LICENSE for details. 00009 * 00010 * WvDBusMsg is intended to be an easy-to-use abstraction over the low-level 00011 * D-Bus DBusMessage structure. It represents a message being passed around on 00012 * the bus. 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 // see wvdbusmarshal_c.c 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