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>
42 static bool serialize(
43 DBusMessageIter* argsIterator,
44 const std::string& str)
46 return serialize(argsIterator, str.c_str());
49 // float case - send as double
50 static bool serialize(DBusMessageIter* argsIterator, const float& arg)
52 const double d = static_cast<double>(arg);
53 return serialize(argsIterator, d);
56 // char* and all integer types + doubles
58 static bool serialize(DBusMessageIter* argsIterator, const T& arg)
60 return dbus_message_iter_append_basic(argsIterator,
65 // dbus array serialization
67 static bool serializeContainer(
68 DBusMessageIter* argsIterator,
71 typename T::const_iterator containerIt;
72 DBusMessageIter subIterator;
73 if (!dbus_message_iter_open_container(argsIterator, DBUS_TYPE_ARRAY,
74 Signature<typename T::value_type>::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, &dictEntryIterator)) {
123 if (!serialize(dictEntryIterator, arg.first)){
126 if (!serialize(dictEntryIterator, arg.second)){
129 return dbus_message_iter_close_container(argsIterator,
134 template<typename K, typename V>
135 static bool serialize(
136 DBusMessageIter* argsIterator,
137 const std::map<K, V> &arg)
139 return serializeContainer(argsIterator, arg);
144 // char* and all integer types + doubles
146 inline bool Serialization::serialize<bool>(DBusMessageIter* argsIterator,
149 unsigned int value = static_cast<unsigned int>(arg);
150 return dbus_message_iter_append_basic(argsIterator,
151 SimpleType<bool>::value,
158 #endif // DPL_DBUS_DBUS_SERIALIZATION_H_