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_deserialization.h
18 * @author Tomasz Swierczek (t.swierczek@samsung.com)
20 * @brief Header file for DBus data deserialization
23 #ifndef DPL_DBUS_DBUS_DESERIALIZATION_H_
24 #define DPL_DBUS_DBUS_DESERIALIZATION_H_
31 #include <dbus/dbus.h>
32 #include <dpl/dbus/dbus_signature.h>
37 struct Deserialization
40 static bool deserializePrimitive(
41 DBusMessageIter* responseIterator,
45 if (dbus_message_iter_get_arg_type(responseIterator) != type) {
48 dbus_message_iter_get_basic(responseIterator, arg);
52 // char* and all integer types + doubles
54 static bool deserialize(DBusMessageIter* responseIterator, T* arg)
56 if (dbus_message_iter_get_arg_type(responseIterator)
57 != SimpleType<T>::value) {
60 dbus_message_iter_get_basic(responseIterator, arg);
64 // float case - read as double
65 static bool deserialize(DBusMessageIter* responseIterator, float* arg)
68 if (!deserialize(responseIterator, &d)){
71 *arg = static_cast<float>(d);
76 static bool deserialize(
77 DBusMessageIter* responseIterator,
81 if (!deserialize(responseIterator, &str)){
84 *arg = std::string(str);
88 // dbus array deserialization
90 static bool deserializeContainer(
91 DBusMessageIter* responseIterator,
94 if (dbus_message_iter_get_arg_type(responseIterator)
98 DBusMessageIter subIterator;
99 dbus_message_iter_recurse(responseIterator, &subIterator);
100 while (dbus_message_iter_get_arg_type(&subIterator)
101 != DBUS_TYPE_INVALID) {
102 arg->push_back(typename T::value_type());
103 if (!deserialize(&subIterator, &arg->back())){
106 dbus_message_iter_next(&subIterator);
113 static bool deserialize(
114 DBusMessageIter* responseIterator,
117 return deserializeContainer(responseIterator, arg);
122 static bool deserialize(
123 DBusMessageIter* responseIterator,
126 return deserializeContainer(responseIterator, arg);
131 static bool deserialize(
132 DBusMessageIter* responseIterator,
135 if (dbus_message_iter_get_arg_type(responseIterator)
136 != DBUS_TYPE_ARRAY) {
139 DBusMessageIter subIterator;
140 dbus_message_iter_recurse(responseIterator, &subIterator);
141 while (dbus_message_iter_get_arg_type(&subIterator)
142 != DBUS_TYPE_INVALID) {
143 typename std::set<T>::value_type element;
144 if (!deserialize(&subIterator, &element)){
147 arg->insert(element);
148 dbus_message_iter_next(&subIterator);
154 template<typename A, typename B>
155 static bool deserialize(
156 DBusMessageIter* argsIterator,
157 const std::pair<A, B>* arg)
159 if (dbus_message_iter_get_arg_type(argsIterator)
160 != DBUS_TYPE_DICT_ENTRY) {
163 DBusMessageIter dictEntryIterator;
164 dbus_message_iter_recurse(argsIterator, &dictEntryIterator);
165 if (!deserialize(dictEntryIterator, &arg->first)){
168 dbus_message_iter_next(&dictEntryIterator);
169 if (!deserialize(dictEntryIterator, &arg->second)){
176 template<typename K, typename V>
177 static bool deserialize(
178 DBusMessageIter* responseIterator,
179 const std::map<K, V>* arg)
181 if (dbus_message_iter_get_arg_type(responseIterator)
182 != DBUS_TYPE_ARRAY) {
185 DBusMessageIter subIterator;
186 dbus_message_iter_recurse(responseIterator, &subIterator);
187 while (dbus_message_iter_get_arg_type(&subIterator)
188 != DBUS_TYPE_INVALID) {
189 typename std::pair<K, V> element;
190 if (!deserialize(&subIterator, &element)){
193 arg->insert(element);
194 dbus_message_iter_next(&subIterator);
202 inline bool Deserialization::deserialize<bool>(
203 DBusMessageIter* responseIterator,
207 if (dbus_message_iter_get_arg_type(responseIterator)
208 != SimpleType<bool>::value) {
211 dbus_message_iter_get_basic(responseIterator, &value);
212 *arg = static_cast<bool>(value);
219 #endif // DPL_DBUS_DBUS_DESERIALIZATION_H_