00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __DBUSXX_MESSAGE_H
00026 #define __DBUSXX_MESSAGE_H
00027
00028 #include <string>
00029 #include <map>
00030
00031 #include "api.h"
00032 #include "util.h"
00033
00034 namespace DBus {
00035
00036 class Message;
00037 class ErrorMessage;
00038 class SignalMessage;
00039 class ReturnMessage;
00040 class Error;
00041 class Connection;
00042
00043 class DXXAPI MessageIter
00044 {
00045 public:
00046
00047 MessageIter() {}
00048
00049 int type();
00050
00051 bool at_end();
00052
00053 bool has_next();
00054
00055 MessageIter &operator ++();
00056
00057 MessageIter operator ++(int);
00058
00059 bool append_byte(unsigned char byte);
00060
00061 unsigned char get_byte();
00062
00063 bool append_bool(bool b);
00064
00065 bool get_bool();
00066
00067 bool append_int16(signed short i);
00068
00069 signed short get_int16();
00070
00071 bool append_uint16(unsigned short u);
00072
00073 unsigned short get_uint16();
00074
00075 bool append_int32(signed int i);
00076
00077 signed int get_int32();
00078
00079 bool append_uint32(unsigned int u);
00080
00081 unsigned int get_uint32();
00082
00083 bool append_int64(signed long long i);
00084
00085 signed long long get_int64();
00086
00087 bool append_uint64(unsigned long long i);
00088
00089 unsigned long long get_uint64();
00090
00091 bool append_double(double d);
00092
00093 double get_double();
00094
00095 bool append_string(const char *chars);
00096
00097 const char *get_string();
00098
00099 bool append_path(const char *chars);
00100
00101 const char *get_path();
00102
00103 bool append_signature(const char *chars);
00104
00105 const char *get_signature();
00106
00107 char *signature() const;
00108
00109 MessageIter recurse();
00110
00111 bool append_array(char type, const void *ptr, size_t length);
00112
00113 int array_type();
00114
00115 int get_array(void *ptr);
00116
00117 bool is_array();
00118
00119 bool is_dict();
00120
00121 MessageIter new_array(const char *sig);
00122
00123 MessageIter new_variant(const char *sig);
00124
00125 MessageIter new_struct();
00126
00127 MessageIter new_dict_entry();
00128
00129 void close_container(MessageIter &container);
00130
00131 void copy_data(MessageIter &to);
00132
00133 Message &msg() const
00134 {
00135 return *_msg;
00136 }
00137
00138 private:
00139
00140 DXXAPILOCAL MessageIter(Message &msg) : _msg(&msg) {}
00141
00142 DXXAPILOCAL bool append_basic(int type_id, void *value);
00143
00144 DXXAPILOCAL void get_basic(int type_id, void *ptr);
00145
00146 private:
00147
00148
00149
00150 unsigned char _iter[sizeof(void *)*3+sizeof(int)*11];
00151
00152 Message *_msg;
00153
00154 friend class Message;
00155 };
00156
00157 class DXXAPI Message
00158 {
00159 public:
00160
00161 struct Private;
00162
00163 Message(Private *, bool incref = true);
00164
00165 Message(const Message &m);
00166
00167 ~Message();
00168
00169 Message &operator = (const Message &m);
00170
00171 Message copy();
00172
00173 int type() const;
00174
00175 int serial() const;
00176
00177 int reply_serial() const;
00178
00179 bool reply_serial(int);
00180
00181 const char *sender() const;
00182
00183 bool sender(const char *s);
00184
00185 const char *destination() const;
00186
00187 bool destination(const char *s);
00188
00189 bool is_error() const;
00190
00191 bool is_signal(const char *interface, const char *member) const;
00192
00193 MessageIter reader() const;
00194
00195 MessageIter writer();
00196
00197 bool append(int first_type, ...);
00198
00199 void terminate();
00200
00201 protected:
00202
00203 Message();
00204
00205 protected:
00206
00207 RefPtrI<Private> _pvt;
00208
00209
00210
00211 friend class ErrorMessage;
00212 friend class ReturnMessage;
00213 friend class MessageIter;
00214 friend class Error;
00215 friend class Connection;
00216 };
00217
00218
00219
00220
00221 class DXXAPI ErrorMessage : public Message
00222 {
00223 public:
00224
00225 ErrorMessage();
00226
00227 ErrorMessage(const Message &, const char *name, const char *message);
00228
00229 const char *name() const;
00230
00231 bool name(const char *n);
00232
00233 bool operator == (const ErrorMessage &) const;
00234 };
00235
00236
00237
00238
00239 class DXXAPI SignalMessage : public Message
00240 {
00241 public:
00242
00243 SignalMessage(const char *name);
00244
00245 SignalMessage(const char *path, const char *interface, const char *name);
00246
00247 const char *interface() const;
00248
00249 bool interface(const char *i);
00250
00251 const char *member() const;
00252
00253 bool member(const char *m);
00254
00255 const char *path() const;
00256
00257 char ** path_split() const;
00258
00259 bool path(const char *p);
00260
00261 bool operator == (const SignalMessage &) const;
00262 };
00263
00264
00265
00266
00267 class DXXAPI CallMessage : public Message
00268 {
00269 public:
00270
00271 CallMessage();
00272
00273 CallMessage(const char *dest, const char *path, const char *iface, const char *method);
00274
00275 const char *interface() const;
00276
00277 bool interface(const char *i);
00278
00279 const char *member() const;
00280
00281 bool member(const char *m);
00282
00283 const char *path() const;
00284
00285 char ** path_split() const;
00286
00287 bool path(const char *p);
00288
00289 const char *signature() const;
00290
00291 bool operator == (const CallMessage &) const;
00292 };
00293
00294
00295
00296
00297 class DXXAPI ReturnMessage : public Message
00298 {
00299 public:
00300
00301 ReturnMessage(const CallMessage &callee);
00302
00303 const char *signature() const;
00304 };
00305
00306 }
00307
00308 #endif//__DBUSXX_MESSAGE_H