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 00028 class WvDBusMsg 00029 { 00030 public: 00036 WvDBusMsg(WvStringParm busname, WvStringParm objectname, 00037 WvStringParm ifc, WvStringParm method); 00038 00042 WvDBusMsg(WvDBusMsg &_msg); 00043 00048 WvDBusMsg(DBusMessage *_msg); 00049 00050 virtual ~WvDBusMsg(); 00051 00052 operator DBusMessage* () const; 00053 00061 static WvDBusMsg *demarshal(WvBuf &buf); 00062 00071 static size_t demarshal_bytes_needed(WvBuf &buf); 00072 00080 void marshal(WvBuf &buf); 00081 00082 WvString get_sender() const; 00083 WvString get_dest() const; 00084 WvString get_path() const; 00085 WvString get_interface() const; 00086 WvString get_member() const; 00087 WvString get_error() const; 00088 uint32_t get_serial() const; 00089 uint32_t get_replyserial() const; 00090 bool is_reply() const; 00091 operator WvString() const; 00092 00093 void get_arglist(WvStringList &list) const; 00094 WvString get_argstr() const; 00095 00100 WvDBusMsg &append(const char *s); 00101 WvDBusMsg &append(bool b); 00102 WvDBusMsg &append(signed char c); 00103 WvDBusMsg &append(unsigned char c); 00104 WvDBusMsg &append(int16_t i); 00105 WvDBusMsg &append(uint16_t i); 00106 WvDBusMsg &append(int32_t i); 00107 WvDBusMsg &append(uint32_t i); 00108 WvDBusMsg &append(int64_t i); 00109 WvDBusMsg &append(uint64_t i); 00110 WvDBusMsg &append(double d); 00111 00115 WvDBusMsg &variant_start(WvStringParm element_type); 00116 00120 WvDBusMsg &variant_end(); 00121 00127 WvDBusMsg &struct_start(WvStringParm element_type); 00128 00132 WvDBusMsg &struct_end(); 00133 00138 WvDBusMsg &array_start(WvStringParm element_type); 00139 00143 WvDBusMsg &array_end(); 00144 00153 WvDBusMsg &varray_start(WvStringParm element_type); 00154 00158 WvDBusMsg &varray_end(); 00159 00163 WvDBusMsg reply(); 00164 00168 bool iserror() const; 00169 00174 void send(WvDBusConn &conn); 00175 00176 class Iter 00177 { 00178 public: 00179 DBusMessageIter *const first, *const it; 00180 mutable WvString s; 00181 bool rewound; 00182 00183 Iter(const WvDBusMsg &_msg); 00184 Iter(const WvDBusMsg::Iter &_it); 00185 Iter(const DBusMessageIter &_first); 00186 ~Iter(); 00187 00192 void rewind(); 00193 00198 int type() const; 00199 00207 Iter open() const; 00208 00215 bool next(); 00216 00222 Iter &getnext() 00223 { next(); return *this; } 00224 00228 bool cur() const; 00229 00233 void get_all(WvStringList &list); 00234 00239 WvString get_all(); 00240 00244 WvString get_str() const; 00245 00250 int64_t get_int() const; 00251 operator int64_t() const { return get_int(); } 00252 operator int32_t() const { return get_int(); } 00253 operator int16_t() const { return get_int(); } 00254 operator int8_t() const { return get_int(); } 00255 operator bool() const { return get_int() != 0; } 00256 00261 uint64_t get_uint() const; 00262 operator uint64_t() const { return get_uint(); } 00263 operator uint32_t() const { return get_uint(); } 00264 operator uint16_t() const { return get_uint(); } 00265 operator uint8_t() const { return get_uint(); } 00266 00271 double get_double() const; 00272 operator double() const { return get_double(); } 00273 operator float() const { return get_double(); } 00274 00279 WvString *ptr() const; 00280 operator WvString() const { return *ptr(); } 00281 00282 WvIterStuff(WvString); 00283 }; 00284 00285 protected: 00286 mutable DBusMessage *msg; 00287 WvList<DBusMessageIter> itlist; 00288 }; 00289 00290 00291 class WvDBusSignal : public WvDBusMsg 00292 { 00293 public: 00294 WvDBusSignal(WvStringParm objectname, WvStringParm ifc, 00295 WvStringParm name); 00296 }; 00297 00298 00299 class WvDBusError : public WvDBusMsg 00300 { 00301 DBusMessage *setup1(WvDBusMsg &in_reply_to, 00302 WvStringParm errname, WvStringParm message); 00303 void setup2(); 00304 public: 00305 WvDBusError(WvDBusMsg &in_reply_to, 00306 WvStringParm errname, WvStringParm message) 00307 : WvDBusMsg(setup1(in_reply_to, errname, message)) 00308 { 00309 setup2(); 00310 } 00311 00312 WvDBusError(WvDBusMsg &in_reply_to, 00313 WvStringParm errname, WVSTRING_FORMAT_DECL) 00314 : WvDBusMsg(setup1(in_reply_to, errname, 00315 WvString(WVSTRING_FORMAT_CALL))) 00316 { 00317 setup2(); 00318 } 00319 }; 00320 00321 #endif // __WVDBUSMSG_H