types.h
Go to the documentation of this file.
1/*
2 *
3 * D-Bus++ - C++ bindings for D-Bus
4 *
5 * Copyright (C) 2005-2007 Paolo Durante <shackan@gmail.com>
6 *
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 */
23
24
25#ifndef __DBUSXX_TYPES_H
26#define __DBUSXX_TYPES_H
27
28#include <stdint.h>
29#include <string>
30#include <vector>
31#include <map>
32
33#include "api.h"
34#include "util.h"
35#include "message.h"
36#include "error.h"
37
38namespace DBus
39{
40
41struct DXXAPI Path : public std::string
42{
43 Path() {}
44 Path(const std::string &s) : std::string(s) {}
45 Path(const char *c) : std::string(c) {}
46 Path &operator = (std::string &s)
47 {
48 std::string::operator = (s);
49 return *this;
50 }
51};
52
53struct DXXAPI Signature : public std::string
54{
56 Signature(const std::string &s) : std::string(s) {}
57 Signature(const char *c) : std::string(c) {}
58 Signature &operator = (std::string &s)
59 {
60 std::string::operator = (s);
61 return *this;
62 }
63};
64
65struct DXXAPI Invalid {};
66
68{
69public:
70
71 Variant();
72
74
75 Variant &operator = (const Variant &v);
76
77 const Signature signature() const;
78
79 void clear();
80
82 {
83 return _msg.reader();
84 }
85
87 {
88 return _msg.writer();
89 }
90
91 template <typename T>
92 operator T() const;
93
94private:
95
97};
98
99template <
100typename T1,
101 typename T2 = Invalid,
102 typename T3 = Invalid,
103 typename T4 = Invalid,
104 typename T5 = Invalid,
105 typename T6 = Invalid,
106 typename T7 = Invalid,
107 typename T8 = Invalid,
108 typename T9 = Invalid,
109 typename T10 = Invalid,
110 typename T11 = Invalid,
111 typename T12 = Invalid,
112 typename T13 = Invalid,
113 typename T14 = Invalid,
114 typename T15 = Invalid,
115 typename T16 = Invalid // nobody needs more than 16
116 >
117struct Struct
118{
119 T1 _1;
120 T2 _2;
121 T3 _3;
122 T4 _4;
123 T5 _5;
124 T6 _6;
125 T7 _7;
126 T8 _8;
127 T9 _9;
128 T10 _10;
129 T11 _11;
130 T12 _12;
131 T13 _13;
132 T14 _14;
133 T15 _15;
134 T16 _16;
135};
136
137template<typename K, typename V>
138inline bool dict_has_key(const std::map<K, V>& map, const K &key)
139{
140 return map.find(key) != map.end();
141}
142
143template <typename T>
144struct type
145{
146 static std::string sig()
147 {
148 throw ErrorInvalidArgs("unknown type");
149 return "";
150 }
151};
152
153template <> struct type<Variant>
154{
155 static std::string sig()
156 {
157 return "v";
158 }
159};
160template <> struct type<uint8_t>
161{
162 static std::string sig()
163 {
164 return "y";
165 }
166};
167template <> struct type<bool>
168{
169 static std::string sig()
170 {
171 return "b";
172 }
173};
174template <> struct type<int16_t>
175{
176 static std::string sig()
177 {
178 return "n";
179 }
180};
181template <> struct type<uint16_t>
182{
183 static std::string sig()
184 {
185 return "q";
186 }
187};
188template <> struct type<int32_t>
189{
190 static std::string sig()
191 {
192 return "i";
193 }
194};
195template <> struct type<uint32_t>
196{
197 static std::string sig()
198 {
199 return "u";
200 }
201};
202template <> struct type<int64_t>
203{
204 static std::string sig()
205 {
206 return "x";
207 }
208};
209template <> struct type<uint64_t>
210{
211 static std::string sig()
212 {
213 return "t";
214 }
215};
216template <> struct type<double>
217{
218 static std::string sig()
219 {
220 return "d";
221 }
222};
223template <> struct type<std::string>
224{
225 static std::string sig()
226 {
227 return "s";
228 }
229};
230template <> struct type<Path>
231{
232 static std::string sig()
233 {
234 return "o";
235 }
236};
237template <> struct type<Signature>
238{
239 static std::string sig()
240 {
241 return "g";
242 }
243};
244template <> struct type<Invalid>
245{
246 static std::string sig()
247 {
248 return "";
249 }
250};
251
252template <typename E>
253struct type< std::vector<E> >
254{
255 static std::string sig()
256 {
257 return "a" + type<E>::sig();
258 }
259};
260
261template <typename K, typename V>
262struct type< std::map<K, V> >
263{
264 static std::string sig()
265 {
266 return "a{" + type<K>::sig() + type<V>::sig() + "}";
267 }
268};
269
270template <
271typename T1,
272 typename T2,
273 typename T3,
274 typename T4,
275 typename T5,
276 typename T6,
277 typename T7,
278 typename T8,
279 typename T9,
280 typename T10,
281 typename T11,
282 typename T12,
283 typename T13,
284 typename T14,
285 typename T15,
286 typename T16 // nobody needs more than 16
287 >
288struct type< Struct<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> >
289{
290 static std::string sig()
291 {
292 return "("
293 + type<T1>::sig()
294 + type<T2>::sig()
295 + type<T3>::sig()
296 + type<T4>::sig()
297 + type<T5>::sig()
298 + type<T6>::sig()
299 + type<T7>::sig()
300 + type<T8>::sig()
301 + type<T9>::sig()
309 + ")";
310 }
311};
312
314
316{
317 return iter;
318}
319
320inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const uint8_t &val)
321{
322 iter.append_byte(val);
323 return iter;
324}
325
326inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const bool &val)
327{
328 iter.append_bool(val);
329 return iter;
330}
331
332inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const int16_t &val)
333{
334 iter.append_int16(val);
335 return iter;
336}
337
338inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const uint16_t &val)
339{
340 iter.append_uint16(val);
341 return iter;
342}
343
344inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const int32_t &val)
345{
346 iter.append_int32(val);
347 return iter;
348}
349
350inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const uint32_t &val)
351{
352 iter.append_uint32(val);
353 return iter;
354}
355
356inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const int64_t &val)
357{
358 iter.append_int64(val);
359 return iter;
360}
361
362inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const uint64_t &val)
363{
364 iter.append_uint64(val);
365 return iter;
366}
367
368inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const double &val)
369{
370 iter.append_double(val);
371 return iter;
372}
373
374inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const std::string &val)
375{
376 iter.append_string(val.c_str());
377 return iter;
378}
379
381{
382 iter.append_path(val.c_str());
383 return iter;
384}
385
387{
388 iter.append_signature(val.c_str());
389 return iter;
390}
391
392template<typename E>
393inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const std::vector<E>& val)
394{
395 const std::string sig = DBus::type<E>::sig();
396 DBus::MessageIter ait = iter.new_array(sig.c_str());
397
398 typename std::vector<E>::const_iterator vit;
399 for (vit = val.begin(); vit != val.end(); ++vit)
400 {
401 ait << *vit;
402 }
403
404 iter.close_container(ait);
405 return iter;
406}
407
408template<>
409inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const std::vector<uint8_t>& val)
410{
411 DBus::MessageIter ait = iter.new_array("y");
412 ait.append_array('y', &val.front(), val.size());
413 iter.close_container(ait);
414 return iter;
415}
416
417template<typename K, typename V>
418inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const std::map<K, V>& val)
419{
420 const std::string sig = "{" + DBus::type<K>::sig() + DBus::type<V>::sig() + "}";
421 DBus::MessageIter ait = iter.new_array(sig.c_str());
422
423 typename std::map<K, V>::const_iterator mit;
424 for (mit = val.begin(); mit != val.end(); ++mit)
425 {
427
428 eit << mit->first << mit->second;
429
430 ait.close_container(eit);
431 }
432
433 iter.close_container(ait);
434 return iter;
435}
436
437template <
438typename T1,
439 typename T2,
440 typename T3,
441 typename T4,
442 typename T5,
443 typename T6,
444 typename T7,
445 typename T8,
446 typename T9,
447 typename T10,
448 typename T11,
449 typename T12,
450 typename T13,
451 typename T14,
452 typename T15,
453 typename T16
454 >
456{
457 DBus::MessageIter sit = iter.new_struct();
458
459 sit << val._1 << val._2 << val._3 << val._4
460 << val._5 << val._6 << val._7 << val._8
461 << val._9 << val._10 << val._11 << val._12
462 << val._13 << val._14 << val._15 << val._16;
463
464 iter.close_container(sit);
465
466 return iter;
467}
468
470
472{
473 return iter;
474}
475
477{
478 val = iter.get_byte();
479 return ++iter;
480}
481
483{
484 val = iter.get_bool();
485 return ++iter;
486}
487
489{
490 val = iter.get_int16();
491 return ++iter;
492}
493
495{
496 val = iter.get_uint16();
497 return ++iter;
498}
499
501{
502 val = iter.get_int32();
503 return ++iter;
504}
505
507{
508 val = iter.get_uint32();
509 return ++iter;
510}
511
513{
514 val = iter.get_int64();
515 return ++iter;
516}
517
519{
520 val = iter.get_uint64();
521 return ++iter;
522}
523
525{
526 val = iter.get_double();
527 return ++iter;
528}
529
530inline DBus::MessageIter &operator >> (DBus::MessageIter &iter, std::string &val)
531{
532 val = iter.get_string();
533 return ++iter;
534}
535
537{
538 val = iter.get_path();
539 return ++iter;
540}
541
543{
544 val = iter.get_signature();
545 return ++iter;
546}
547
549
550template<typename E>
551inline DBus::MessageIter &operator >> (DBus::MessageIter &iter, std::vector<E>& val)
552{
553 if (!iter.is_array())
554 throw DBus::ErrorInvalidArgs("array expected");
555
556 DBus::MessageIter ait = iter.recurse();
557
558 while (!ait.at_end())
559 {
560 E elem;
561
562 ait >> elem;
563
564 val.push_back(elem);
565 }
566 return ++iter;
567}
568
569template<>
570inline DBus::MessageIter &operator >> (DBus::MessageIter &iter, std::vector<uint8_t>& val)
571{
572 if (!iter.is_array())
573 throw DBus::ErrorInvalidArgs("array expected");
574
575 if (iter.array_type() != 'y')
576 throw DBus::ErrorInvalidArgs("byte-array expected");
577
578 DBus::MessageIter ait = iter.recurse();
579
580 uint8_t *array;
581 size_t length = ait.get_array(&array);
582
583 val.insert(val.end(), array, array + length);
584
585 return ++iter;
586}
587
588template<typename K, typename V>
589inline DBus::MessageIter &operator >> (DBus::MessageIter &iter, std::map<K, V>& val)
590{
591 if (!iter.is_dict())
592 throw DBus::ErrorInvalidArgs("dictionary value expected");
593
594 DBus::MessageIter mit = iter.recurse();
595
596 while (!mit.at_end())
597 {
598 K key;
599 V value;
600
601 DBus::MessageIter eit = mit.recurse();
602
603 eit >> key >> value;
604
605 val[key] = value;
606
607 ++mit;
608 }
609
610 return ++iter;
611}
612
613template <
614typename T1,
615 typename T2,
616 typename T3,
617 typename T4,
618 typename T5,
619 typename T6,
620 typename T7,
621 typename T8,
622 typename T9,
623 typename T10,
624 typename T11,
625 typename T12,
626 typename T13,
627 typename T14,
628 typename T15,
629 typename T16
630 >
632{
633 DBus::MessageIter sit = iter.recurse();
634
635 sit >> val._1 >> val._2 >> val._3 >> val._4
636 >> val._5 >> val._6 >> val._7 >> val._8
637 >> val._9 >> val._10 >> val._11 >> val._12
638 >> val._13 >> val._14 >> val._15 >> val._16;
639
640 return ++iter;
641}
642
643template <typename T>
644inline DBus::Variant::operator T() const
645{
646 T cast;
647 DBus::MessageIter ri = _msg.reader();
648 ri >> cast;
649 return cast;
650}
651
652} /* namespace DBus */
653
654#endif//__DBUSXX_TYPES_H
655
#define DXXAPI
Definition api.h:36
MessageIter new_struct()
Definition message.cpp:284
signed long long get_int64()
Definition message.cpp:155
const char * get_path()
Definition message.cpp:208
bool append_byte(unsigned char byte)
Definition message.cpp:82
bool append_array(char type, const void *ptr, size_t length)
Definition message.cpp:239
const char * get_string()
Definition message.cpp:196
unsigned short get_uint16()
Definition message.cpp:124
unsigned long long get_uint64()
Definition message.cpp:167
const char * get_signature()
Definition message.cpp:220
unsigned int get_uint32()
Definition message.cpp:148
bool append_signature(const char *chars)
Definition message.cpp:215
MessageIter new_dict_entry()
Definition message.cpp:293
bool append_double(double d)
Definition message.cpp:186
int get_array(void *ptr)
Definition message.cpp:249
bool append_uint32(unsigned int u)
Definition message.cpp:143
unsigned char get_byte()
Definition message.cpp:87
bool append_int16(signed short i)
Definition message.cpp:107
bool append_path(const char *chars)
Definition message.cpp:203
signed short get_int16()
Definition message.cpp:112
bool append_uint64(unsigned long long i)
Definition message.cpp:174
bool append_int32(signed int i)
Definition message.cpp:131
bool append_bool(bool b)
Definition message.cpp:94
bool append_int64(signed long long i)
Definition message.cpp:162
void close_container(MessageIter &container)
Definition message.cpp:302
bool append_string(const char *chars)
Definition message.cpp:191
MessageIter recurse()
Definition message.cpp:227
bool append_uint16(unsigned short u)
Definition message.cpp:119
double get_double()
Definition message.cpp:179
signed int get_int32()
Definition message.cpp:136
MessageIter new_array(const char *sig)
Definition message.cpp:266
MessageIter reader() const
Definition types.h:81
void clear()
Definition types.cpp:61
Message _msg
Definition types.h:96
MessageIter writer()
Definition types.h:86
const Signature signature() const
Definition types.cpp:67
bool dict_has_key(const std::map< K, V > &map, const K &key)
Definition types.h:138
MessageIter & operator<<(MessageIter &iter, const Variant &val)
Definition types.cpp:78
MessageIter & operator>>(MessageIter &iter, Variant &val)
Definition types.cpp:92
Path(const char *c)
Definition types.h:45
Path(const std::string &s)
Definition types.h:44
Signature(const char *c)
Definition types.h:57
Signature(const std::string &s)
Definition types.h:56
static std::string sig()
Definition types.h:246
static std::string sig()
Definition types.h:232
static std::string sig()
Definition types.h:239
static std::string sig()
Definition types.h:155
static std::string sig()
Definition types.h:169
static std::string sig()
Definition types.h:218
static std::string sig()
Definition types.h:176
static std::string sig()
Definition types.h:190
static std::string sig()
Definition types.h:204
static std::string sig()
Definition types.h:264
static std::string sig()
Definition types.h:225
static std::string sig()
Definition types.h:255
static std::string sig()
Definition types.h:183
static std::string sig()
Definition types.h:197
static std::string sig()
Definition types.h:211
static std::string sig()
Definition types.h:162
static std::string sig()
Definition types.h:146