WvStreams
wvdbusmsg.h
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