3 * D-Bus++ - C++ bindings for D-Bus
5 * Copyright (C) 2005-2009 Paolo Durante <shackan@gmail.com>
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.
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.
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
25 #ifndef __DBUSXX_TYPES_H
26 #define __DBUSXX_TYPES_H
40 struct DBUSXXAPI Path
: public std::string
43 Path(const std::string
&s
) : std::string(s
) {}
44 Path(const char *c
) : std::string(c
) {}
45 Path
&operator = (std::string
&s
)
47 std::string::operator = (s
);
52 struct DBUSXXAPI Signature
: public std::string
55 Signature(const std::string
&s
) : std::string(s
) {}
56 Signature(const char *c
) : std::string(c
) {}
57 Signature
&operator = (std::string
&s
)
59 std::string::operator = (s
);
64 struct DBUSXXAPI Invalid
{};
66 class DBUSXXAPI Variant
72 Variant(MessageIter
&it
);
74 Variant
&operator = (const Variant
&v
);
76 const Signature
signature() const;
80 MessageIter
reader() const
94 MessageIter ri
= _msg
.reader();
106 typename T2
= Invalid
,
107 typename T3
= Invalid
,
108 typename T4
= Invalid
,
109 typename T5
= Invalid
,
110 typename T6
= Invalid
,
111 typename T7
= Invalid
,
112 typename T8
= Invalid
// who needs more than eight?
116 T1 _1
; T2 _2
; T3 _3
; T4 _4
; T5 _5
; T6 _6
; T7 _7
; T8 _8
;
119 template<typename K
, typename V
>
120 inline bool dict_has_key(const std::map
<K
,V
>& map
, const K
&key
)
122 return map
.find(key
) != map
.end();
125 template <typename T
>
128 static std::string
sig()
130 throw ErrorInvalidArgs("unknown type");
135 template <> struct type
<Variant
> { static std::string
sig(){ return "v"; } };
136 template <> struct type
<uint8_t> { static std::string
sig(){ return "y"; } };
137 template <> struct type
<bool> { static std::string
sig(){ return "b"; } };
138 template <> struct type
<int16_t> { static std::string
sig(){ return "n"; } };
139 template <> struct type
<uint16_t> { static std::string
sig(){ return "q"; } };
140 template <> struct type
<int32_t> { static std::string
sig(){ return "i"; } };
141 template <> struct type
<uint32_t> { static std::string
sig(){ return "u"; } };
142 template <> struct type
<int64_t> { static std::string
sig(){ return "x"; } };
143 template <> struct type
<uint64_t> { static std::string
sig(){ return "t"; } };
144 template <> struct type
<double> { static std::string
sig(){ return "d"; } };
145 template <> struct type
<std::string
> { static std::string
sig(){ return "s"; } };
146 template <> struct type
<Path
> { static std::string
sig(){ return "o"; } };
147 template <> struct type
<Signature
> { static std::string
sig(){ return "g"; } };
148 template <> struct type
<Invalid
> { static std::string
sig(){ return ""; } };
150 template <typename E
>
151 struct type
< std::vector
<E
> >
152 { static std::string
sig(){ return "a" + type
<E
>::sig(); } };
154 template <typename K
, typename V
>
155 struct type
< std::map
<K
,V
> >
156 { static std::string
sig(){ return "a{" + type
<K
>::sig() + type
<V
>::sig() + "}"; } };
166 typename T8
// who needs more than eight?
168 struct type
< Struct
<T1
,T2
,T3
,T4
,T5
,T6
,T7
,T8
> >
170 static std::string
sig()
185 } /* namespace DBus */
187 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const DBus::Invalid
&)
192 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const uint8_t &val
)
194 iter
.append_byte(val
);
198 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const bool &val
)
200 iter
.append_bool(val
);
204 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const int16_t& val
)
206 iter
.append_int16(val
);
210 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const uint16_t& val
)
212 iter
.append_uint16(val
);
216 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const int32_t& val
)
218 iter
.append_int32(val
);
222 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const uint32_t& val
)
224 iter
.append_uint32(val
);
228 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const int64_t& val
)
230 iter
.append_int64(val
);
234 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const uint64_t& val
)
236 iter
.append_uint64(val
);
240 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const double &val
)
242 iter
.append_double(val
);
246 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const std::string
&val
)
248 iter
.append_string(val
.c_str());
252 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const DBus::Path
&val
)
254 iter
.append_path(val
.c_str());
258 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const DBus::Signature
&val
)
260 iter
.append_signature(val
.c_str());
265 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const std::vector
<E
>& val
)
267 const std::string sig
= DBus::type
<E
>::sig();
268 DBus::MessageIter ait
= iter
.new_array(sig
.c_str());
270 typename
std::vector
<E
>::const_iterator vit
;
271 for (vit
= val
.begin(); vit
!= val
.end(); ++vit
)
276 iter
.close_container(ait
);
281 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const std::vector
<uint8_t>& val
)
283 DBus::MessageIter ait
= iter
.new_array("y");
284 ait
.append_array('y', &val
.front(), val
.size());
285 iter
.close_container(ait
);
289 template<typename K
, typename V
>
290 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const std::map
<K
,V
>& val
)
292 const std::string sig
= "{" + DBus::type
<K
>::sig() + DBus::type
<V
>::sig() + "}";
293 DBus::MessageIter ait
= iter
.new_array(sig
.c_str());
295 typename
std::map
<K
,V
>::const_iterator mit
;
296 for (mit
= val
.begin(); mit
!= val
.end(); ++mit
)
298 DBus::MessageIter eit
= ait
.new_dict_entry();
300 eit
<< mit
->first
<< mit
->second
;
302 ait
.close_container(eit
);
305 iter
.close_container(ait
);
319 inline DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const DBus::Struct
<T1
,T2
,T3
,T4
,T5
,T6
,T7
,T8
>& val
)
321 /* const std::string sig =
322 DBus::type<T1>::sig() + DBus::type<T2>::sig() + DBus::type<T3>::sig() + DBus::type<T4>::sig() +
323 DBus::type<T5>::sig() + DBus::type<T6>::sig() + DBus::type<T7>::sig() + DBus::type<T8>::sig();
325 DBus::MessageIter sit
= iter
.new_struct(/*sig.c_str()*/);
327 sit
<< val
._1
<< val
._2
<< val
._3
<< val
._4
<< val
._5
<< val
._6
<< val
._7
<< val
._8
;
329 iter
.close_container(sit
);
334 extern DBUSXXAPI
DBus::MessageIter
&operator << (DBus::MessageIter
&iter
, const DBus::Variant
&val
);
339 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, DBus::Invalid
&)
344 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, uint8_t &val
)
346 val
= iter
.get_byte();
350 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, bool &val
)
352 val
= iter
.get_bool();
356 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, int16_t& val
)
358 val
= iter
.get_int16();
362 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, uint16_t& val
)
364 val
= iter
.get_uint16();
368 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, int32_t& val
)
370 val
= iter
.get_int32();
374 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, uint32_t& val
)
376 val
= iter
.get_uint32();
380 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, int64_t& val
)
382 val
= iter
.get_int64();
386 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, uint64_t& val
)
388 val
= iter
.get_uint64();
392 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, double &val
)
394 val
= iter
.get_double();
398 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, std::string
&val
)
400 val
= iter
.get_string();
404 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, DBus::Path
&val
)
406 val
= iter
.get_path();
410 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, DBus::Signature
&val
)
412 val
= iter
.get_signature();
417 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, std::vector
<E
>& val
)
419 if (!iter
.is_array())
420 throw DBus::ErrorInvalidArgs("array expected");
422 DBus::MessageIter ait
= iter
.recurse();
424 while (!ait
.at_end())
436 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, std::vector
<uint8_t>& val
)
438 if (!iter
.is_array())
439 throw DBus::ErrorInvalidArgs("array expected");
441 if (iter
.array_type() != 'y')
442 throw DBus::ErrorInvalidArgs("byte-array expected");
444 DBus::MessageIter ait
= iter
.recurse();
447 size_t length
= ait
.get_array(&array
);
449 val
.insert(val
.end(), array
, array
+length
);
454 template<typename K
, typename V
>
455 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, std::map
<K
,V
>& val
)
458 throw DBus::ErrorInvalidArgs("dictionary value expected");
460 DBus::MessageIter mit
= iter
.recurse();
462 while (!mit
.at_end())
466 DBus::MessageIter eit
= mit
.recurse();
488 inline DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, DBus::Struct
<T1
,T2
,T3
,T4
,T5
,T6
,T7
,T8
>& val
)
490 DBus::MessageIter sit
= iter
.recurse();
492 sit
>> val
._1
>> val
._2
>> val
._3
>> val
._4
>> val
._5
>> val
._6
>> val
._7
>> val
._8
;
497 extern DBUSXXAPI
DBus::MessageIter
&operator >> (DBus::MessageIter
&iter
, DBus::Variant
&val
);
499 #endif//__DBUSXX_TYPES_H