2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * @file dbus_serialization.h
18 * @author Tomasz Swierczek (t.swierczek@samsung.com)
20 * @brief Header file for DBus data derialization
23 #ifndef DPL_DBUS_DBUS_SERIALIZATION_H_
24 #define DPL_DBUS_DBUS_SERIALIZATION_H_
31 #include <dbus/dbus.h>
32 #include <dpl/foreach.h>
33 #include <dpl/dbus/dbus_signature.h>
40 static bool serialize(
41 DBusMessageIter* argsIterator,
42 const std::string& str)
44 return serialize(argsIterator, str.c_str());
47 // float case - send as double
48 static bool serialize(DBusMessageIter* argsIterator, const float& arg)
50 const double d = static_cast<double>(arg);
51 return serialize(argsIterator, d);
54 // char* and all integer types + doubles
56 static bool serialize(DBusMessageIter* argsIterator, const T& arg)
58 return dbus_message_iter_append_basic(argsIterator,
63 // dbus array serialization
65 static bool serializeContainer(
66 DBusMessageIter* argsIterator,
69 typename T::const_iterator containerIt;
70 DBusMessageIter subIterator;
71 if (!dbus_message_iter_open_container(argsIterator, DBUS_TYPE_ARRAY,
72 Signature<typename T::value_type>
73 ::value(), &subIterator))
77 FOREACH(containerIt, arg) {
78 if (!serialize(&subIterator, *containerIt)) {
82 return dbus_message_iter_close_container(argsIterator, &subIterator);
87 static bool serialize(
88 DBusMessageIter* argsIterator,
89 const std::vector<T> &arg)
91 return serializeContainer(argsIterator, arg);
96 static bool serialize(
97 DBusMessageIter* argsIterator,
98 const std::list<T> &arg)
100 return serializeContainer(argsIterator, arg);
105 static bool serialize(
106 DBusMessageIter* argsIterator,
107 const std::set<T> &arg)
109 return serializeContainer(argsIterator, arg);
113 template<typename A, typename B>
114 static bool serialize(
115 DBusMessageIter* argsIterator,
116 const std::pair<A, B> &arg)
118 DBusMessageIter dictEntryIterator;
119 if (!dbus_message_iter_open_container(argsIterator,
120 DBUS_TYPE_DICT_ENTRY, NULL,
125 if (!serialize(dictEntryIterator, arg.first)) {
128 if (!serialize(dictEntryIterator, arg.second)) {
131 return dbus_message_iter_close_container(argsIterator,
136 template<typename K, typename V>
137 static bool serialize(
138 DBusMessageIter* argsIterator,
139 const std::map<K, V> &arg)
141 return serializeContainer(argsIterator, arg);
145 // char* and all integer types + doubles
147 inline bool Serialization::serialize<bool>(DBusMessageIter* argsIterator,
150 unsigned int value = static_cast<unsigned int>(arg);
151 return dbus_message_iter_append_basic(argsIterator,
152 SimpleType<bool>::value,
158 #endif // DPL_DBUS_DBUS_SERIALIZATION_H_