message.hpp (77e62c83d54e15716b16dcaae403b273665f0d50) message.hpp (377e76abd1f1deb498e8495c61fb160675584eec)
1// Copyright (c) Benjamin Kietzman (github.com/bkietz)
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6#ifndef DBUS_MESSAGE_HPP
7#define DBUS_MESSAGE_HPP
8

--- 160 unchanged lines hidden (view full) ---

169
170template <typename Element>
171typename boost::enable_if<is_fixed_type<Element>, message::packer&>::type
172operator<<(message::packer& p, const Element& e) {
173 p.iter_.append_basic(element<Element>::code, &e);
174 return p;
175}
176
1// Copyright (c) Benjamin Kietzman (github.com/bkietz)
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6#ifndef DBUS_MESSAGE_HPP
7#define DBUS_MESSAGE_HPP
8

--- 160 unchanged lines hidden (view full) ---

169
170template <typename Element>
171typename boost::enable_if<is_fixed_type<Element>, message::packer&>::type
172operator<<(message::packer& p, const Element& e) {
173 p.iter_.append_basic(element<Element>::code, &e);
174 return p;
175}
176
177// Specialization used to represent "dict" in dbus.
178// TODO(ed) generalize for all "map like" types instead of using vector
177template <typename Key, typename Value>
178message::packer& operator<<(message::packer& p,
179 const std::vector<std::pair<Key, Value>>& v) {
180 message::packer sub;
179template <typename Key, typename Value>
180message::packer& operator<<(message::packer& p,
181 const std::vector<std::pair<Key, Value>>& v) {
182 message::packer sub;
181 char signature[] = {'{', element<Key>::code, element<Value>::code, '}', 0};
182
183 p.iter_.open_container(DBUS_TYPE_ARRAY, signature, sub.iter_);
183 static const constexpr auto sig =
184 element_signature<std::vector<std::pair<Key, Value>>>::code;
185 static_assert(std::tuple_size<decltype(sig)>::value > 2,
186 "Signature size must be greater than 2 characters long");
187 // Skip over the array part "a" of the signature to get the element signature.
188 // Open container expects JUST the portion after the "a"
189 p.iter_.open_container(sig[0], &sig[1], sub.iter_);
184 for (auto& element : v) {
185 sub << element;
186 }
187
188 p.iter_.close_container(sub.iter_);
189 return p;
190}
191
192template <typename Element>
193message::packer& operator<<(message::packer& p, const std::vector<Element>& v) {
194 message::packer sub;
190 for (auto& element : v) {
191 sub << element;
192 }
193
194 p.iter_.close_container(sub.iter_);
195 return p;
196}
197
198template <typename Element>
199message::packer& operator<<(message::packer& p, const std::vector<Element>& v) {
200 message::packer sub;
195 char signature[] = {element<Element>::code, 0};
196 p.iter_.open_container(element<std::vector<Element>>::code, signature,
197 sub.iter_);
201 static const constexpr auto signature =
202 element_signature<std::vector<Element>>::code;
203 static_assert(std::tuple_size<decltype(signature)>::value > 2,
204 "Signature size must be greater than 2 characters long");
205 p.iter_.open_container(signature[0], &signature[1], sub.iter_);
198 for (auto& element : v) {
199 sub << element;
200 }
201
202 p.iter_.close_container(sub.iter_);
203 return p;
204}
205

--- 15 unchanged lines hidden (view full) ---

221
222inline message::packer& operator<<(message::packer& p, const string& e) {
223 const char* c = e.c_str();
224 return p << c;
225}
226
227inline message::packer& operator<<(message::packer& p, const dbus_variant& v) {
228 // Get the dbus typecode of the variant being packed
206 for (auto& element : v) {
207 sub << element;
208 }
209
210 p.iter_.close_container(sub.iter_);
211 return p;
212}
213

--- 15 unchanged lines hidden (view full) ---

229
230inline message::packer& operator<<(message::packer& p, const string& e) {
231 const char* c = e.c_str();
232 return p << c;
233}
234
235inline message::packer& operator<<(message::packer& p, const dbus_variant& v) {
236 // Get the dbus typecode of the variant being packed
229 char type = boost::apply_visitor(
230 [&](auto val) { return element<decltype(val)>::code; }, v);
231 char signature[] = {type, 0};
237 const char* type = boost::apply_visitor(
238 [&](auto val) {
239 static const constexpr auto sig =
240 element_signature<decltype(val)>::code;
241 static_assert(std::tuple_size<decltype(sig)>::value == 2,
242 "Element signature for dbus_variant too long. Expected "
243 "length of 1");
244 return &sig[0];
245 },
246 v);
232
233 message::packer sub;
247
248 message::packer sub;
234 p.iter_.open_container(element<dbus_variant>::code, signature, sub.iter_);
249 p.iter_.open_container(element<dbus_variant>::code, type, sub.iter_);
235 boost::apply_visitor([&](auto val) { sub << val; }, v);
236 p.iter_.close_container(sub.iter_);
237
238 return p;
239}
240
241template <typename Element>
242message::unpacker operator>>(message m, Element& e) {

--- 80 unchanged lines hidden ---
250 boost::apply_visitor([&](auto val) { sub << val; }, v);
251 p.iter_.close_container(sub.iter_);
252
253 return p;
254}
255
256template <typename Element>
257message::unpacker operator>>(message m, Element& e) {

--- 80 unchanged lines hidden ---