blob: f73090eb693532825a7f6024fc6ff90b9c82f8d9 [file] [log] [blame]
Darin Petkov63138a92012-02-06 14:09:15 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masoned0ceb8c2011-06-02 10:05:39 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Deymocddd2d02014-11-10 19:55:35 -08005#include "shill/dbus_adaptor.h"
6
Chris Masone8fe2c7e2011-06-09 15:51:19 -07007#include <map>
Chris Masoned0ceb8c2011-06-02 10:05:39 -07008#include <string>
Chris Masone8fe2c7e2011-06-09 15:51:19 -07009#include <vector>
Chris Masoned0ceb8c2011-06-02 10:05:39 -070010
Eric Shienbrood9a245532012-03-07 14:20:39 -050011#include <base/bind.h>
12#include <base/callback.h>
Chris Masoned0ceb8c2011-06-02 10:05:39 -070013#include <dbus-c++/dbus.h>
14
Chris Masone889666b2011-07-03 12:58:50 -070015#include "shill/accessor_interface.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070016#include "shill/error.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070017#include "shill/key_value_store.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070018#include "shill/logging.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070019#include "shill/property_store.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070020
Eric Shienbrood9a245532012-03-07 14:20:39 -050021using base::Bind;
22using base::Owned;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070023using std::map;
24using std::string;
25using std::vector;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070026
27namespace shill {
28
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070029namespace Logging {
30static auto kModuleLogScope = ScopeLogger::kDBus;
31static string ObjectID(DBusAdaptor *d) {
32 if (d == nullptr)
33 return "(dbus_adaptor)";
34 return d->path();
35}
36}
37
mukesh agrawalcbfb34e2013-04-17 19:33:25 -070038// public static
39const char DBusAdaptor::kNullPath[] = "/";
Chris Masone8fe2c7e2011-06-09 15:51:19 -070040
41DBusAdaptor::DBusAdaptor(DBus::Connection* conn, const string &object_path)
Chris Masoned0ceb8c2011-06-02 10:05:39 -070042 : DBus::ObjectAdaptor(*conn, object_path) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070043 SLOG(this, 2) << "DBusAdaptor: " << object_path;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070044}
45
46DBusAdaptor::~DBusAdaptor() {}
47
48// static
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080049bool DBusAdaptor::SetProperty(PropertyStore *store,
50 const string &name,
51 const ::DBus::Variant &value,
52 ::DBus::Error *error) {
mukesh agrawalffa3d042011-10-06 15:26:10 -070053 Error e;
mukesh agrawalbebf1b82013-04-23 15:06:33 -070054 bool ret;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070055
Alex Vakulenko8a532292014-06-16 17:18:44 -070056 if (DBusAdaptor::IsBool(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070057 ret = store->SetBoolProperty(name, value.reader().get_bool(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070058 } else if (DBusAdaptor::IsByte(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070059 ret = store->SetUint8Property(name, value.reader().get_byte(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070060 } else if (DBusAdaptor::IsInt16(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070061 ret = store->SetInt16Property(name, value.reader().get_int16(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070062 } else if (DBusAdaptor::IsInt32(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070063 ret = store->SetInt32Property(name, value.reader().get_int32(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070064 } else if (DBusAdaptor::IsPath(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070065 ret = store->SetStringProperty(name, value.reader().get_path(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070066 } else if (DBusAdaptor::IsString(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070067 ret = store->SetStringProperty(name, value.reader().get_string(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070068 } else if (DBusAdaptor::IsStringmap(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070069 ret = store->SetStringmapProperty(name,
70 value.operator map<string, string>(),
71 &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070072 } else if (DBusAdaptor::IsStringmaps(value.signature())) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070073 SLOG(nullptr, 1) << " can't yet handle setting type " << value.signature();
mukesh agrawalbebf1b82013-04-23 15:06:33 -070074 ret = false;
mukesh agrawalffa3d042011-10-06 15:26:10 -070075 e.Populate(Error::kInternalError);
Alex Vakulenko8a532292014-06-16 17:18:44 -070076 } else if (DBusAdaptor::IsStrings(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070077 ret = store->SetStringsProperty(name, value.operator vector<string>(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070078 } else if (DBusAdaptor::IsUint16(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070079 ret = store->SetUint16Property(name, value.reader().get_uint16(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070080 } else if (DBusAdaptor::IsUint16s(value.signature())) {
Ben Chan7fab8972014-08-10 17:14:46 -070081 ret =
82 store->SetUint16sProperty(name, value.operator vector<uint16_t>(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070083 } else if (DBusAdaptor::IsUint32(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070084 ret = store->SetUint32Property(name, value.reader().get_uint32(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070085 } else if (DBusAdaptor::IsUint64(value.signature())) {
mukesh agrawalbebf1b82013-04-23 15:06:33 -070086 ret = store->SetUint64Property(name, value.reader().get_uint64(), &e);
Alex Vakulenko8a532292014-06-16 17:18:44 -070087 } else if (DBusAdaptor::IsKeyValueStore(value.signature())) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070088 SLOG(nullptr, 1) << " can't yet handle setting type " << value.signature();
mukesh agrawalbebf1b82013-04-23 15:06:33 -070089 ret = false;
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050090 e.Populate(Error::kInternalError);
91 } else {
Chris Masone27c4aa52011-07-02 13:10:14 -070092 NOTREACHED() << " unknown type: " << value.signature();
mukesh agrawalbebf1b82013-04-23 15:06:33 -070093 ret = false;
mukesh agrawalffa3d042011-10-06 15:26:10 -070094 e.Populate(Error::kInternalError);
Chris Masone27c4aa52011-07-02 13:10:14 -070095 }
mukesh agrawalffa3d042011-10-06 15:26:10 -070096
Ben Chancc225ef2014-09-30 13:26:51 -070097 if (error != nullptr) {
mukesh agrawalffa3d042011-10-06 15:26:10 -070098 e.ToDBusError(error);
99 }
100
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700101 return ret;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700102}
103
104// static
mukesh agrawalde29fa82011-09-16 16:16:36 -0700105bool DBusAdaptor::GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -0700106 map<string, ::DBus::Variant> *out,
mukesh agrawal1830fa12011-09-26 14:31:40 -0700107 ::DBus::Error */*error*/) {
Chris Masonea8a2c252011-06-27 22:16:30 -0700108 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800109 ReadablePropertyConstIterator<bool> it = store.GetBoolPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700110 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200111 (*out)[it.Key()] = BoolToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700112 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700113 }
114 {
Ben Chan7fab8972014-08-10 17:14:46 -0700115 ReadablePropertyConstIterator<int16_t> it = store.GetInt16PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700116 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200117 (*out)[it.Key()] = Int16ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700118 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700119 }
120 {
Ben Chan7fab8972014-08-10 17:14:46 -0700121 ReadablePropertyConstIterator<int32_t> it = store.GetInt32PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700122 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200123 (*out)[it.Key()] = Int32ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700124 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700125 }
126 {
Darin Petkov63138a92012-02-06 14:09:15 +0100127 ReadablePropertyConstIterator<KeyValueStore> it =
128 store.GetKeyValueStorePropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700129 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200130 (*out)[it.Key()] = KeyValueStoreToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700131 }
Darin Petkov63138a92012-02-06 14:09:15 +0100132 }
133 {
mukesh agrawal2366eed2012-03-20 18:21:50 -0700134 ReadablePropertyConstIterator<RpcIdentifiers> it =
135 store.GetRpcIdentifiersPropertiesIter();
136 for ( ; !it.AtEnd(); it.Advance()) {
mukesh agrawal2366eed2012-03-20 18:21:50 -0700137 vector < ::DBus::Path> rpc_identifiers_as_paths;
Paul Stewart48231832013-07-17 15:46:19 -0700138 for (const auto &path : it.value()) {
139 rpc_identifiers_as_paths.push_back(path);
mukesh agrawal2366eed2012-03-20 18:21:50 -0700140 }
141 (*out)[it.Key()] = PathsToVariant(rpc_identifiers_as_paths);
142 }
143 }
144 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800145 ReadablePropertyConstIterator<string> it = store.GetStringPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700146 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200147 (*out)[it.Key()] = StringToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700148 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700149 }
150 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800151 ReadablePropertyConstIterator<Stringmap> it =
152 store.GetStringmapPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700153 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200154 (*out)[it.Key()]= StringmapToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700155 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700156 }
157 {
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400158 ReadablePropertyConstIterator<Stringmaps> it =
159 store.GetStringmapsPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700160 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200161 (*out)[it.Key()]= StringmapsToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700162 }
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400163 }
164 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800165 ReadablePropertyConstIterator<Strings> it =
166 store.GetStringsPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700167 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200168 (*out)[it.Key()] = StringsToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700169 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700170 }
171 {
Ben Chan7fab8972014-08-10 17:14:46 -0700172 ReadablePropertyConstIterator<uint8_t> it = store.GetUint8PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700173 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200174 (*out)[it.Key()] = ByteToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700175 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700176 }
177 {
Ben Chan7fab8972014-08-10 17:14:46 -0700178 ReadablePropertyConstIterator<uint16_t> it =
179 store.GetUint16PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700180 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200181 (*out)[it.Key()] = Uint16ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700182 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700183 }
184 {
mukesh agrawale7c7e652013-06-18 17:19:39 -0700185 ReadablePropertyConstIterator<Uint16s> it =
186 store.GetUint16sPropertiesIter();
187 for ( ; !it.AtEnd(); it.Advance()) {
188 (*out)[it.Key()] = Uint16sToVariant(it.value());
189 }
190 }
191 {
Ben Chan7fab8972014-08-10 17:14:46 -0700192 ReadablePropertyConstIterator<uint32_t> it =
193 store.GetUint32PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700194 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200195 (*out)[it.Key()] = Uint32ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700196 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700197 }
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400198 {
Ben Chan7fab8972014-08-10 17:14:46 -0700199 ReadablePropertyConstIterator<uint64_t> it =
200 store.GetUint64PropertiesIter();
Paul Stewarte18c33b2012-07-10 20:48:44 -0700201 for ( ; !it.AtEnd(); it.Advance()) {
Paul Stewarte18c33b2012-07-10 20:48:44 -0700202 (*out)[it.Key()] = Uint64ToVariant(it.value());
203 }
204 }
205 {
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400206 ReadablePropertyConstIterator<RpcIdentifier> it =
207 store.GetRpcIdentifierPropertiesIter();
208 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200209 (*out)[it.Key()] = PathToVariant(it.value());
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400210 }
211 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700212 return true;
213}
214
215// static
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800216bool DBusAdaptor::ClearProperty(PropertyStore *store,
217 const string &name,
218 ::DBus::Error *error) {
219 Error e;
220 store->ClearProperty(name, &e);
221
Ben Chancc225ef2014-09-30 13:26:51 -0700222 if (error != nullptr) {
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800223 e.ToDBusError(error);
224 }
225
226 return e.IsSuccess();
227}
228
229// static
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700230void DBusAdaptor::ArgsToKeyValueStore(
231 const map<string, ::DBus::Variant> &args,
232 KeyValueStore *out,
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800233 Error *error) { // TODO(quiche): Should be ::DBus::Error?
Paul Stewart48231832013-07-17 15:46:19 -0700234 for (const auto &key_value_pair : args) {
235 string key = key_value_pair.first;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700236 DBus::type<string> string_type;
237 DBus::type<bool> bool_type;
Ben Chan7fab8972014-08-10 17:14:46 -0700238 DBus::type<int32_t> int32_type;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700239
Paul Stewart48231832013-07-17 15:46:19 -0700240 if (key_value_pair.second.signature() == bool_type.sig()) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700241 SLOG(nullptr, 5) << "Got bool property " << key;
Paul Stewart48231832013-07-17 15:46:19 -0700242 out->SetBool(key, key_value_pair.second.reader().get_bool());
243 } else if (key_value_pair.second.signature() == int32_type.sig()) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700244 SLOG(nullptr, 5) << "Got int32_t property " << key;
Paul Stewart48231832013-07-17 15:46:19 -0700245 out->SetInt(key, key_value_pair.second.reader().get_int32());
246 } else if (key_value_pair.second.signature() == string_type.sig()) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700247 SLOG(nullptr, 5) << "Got string property " << key;
Paul Stewart48231832013-07-17 15:46:19 -0700248 out->SetString(key, key_value_pair.second.reader().get_string());
249 } else if (DBusAdaptor::IsStrings(key_value_pair.second.signature())) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700250 SLOG(nullptr, 5) << "Got strings property " << key;
Paul Stewart48231832013-07-17 15:46:19 -0700251 out->SetStrings(key, key_value_pair.second.operator vector<string>());
Arman Uguray631c7e42013-07-30 16:41:12 -0700252 } else if (DBusAdaptor::IsStringmap(key_value_pair.second.signature())) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700253 SLOG(nullptr, 5) << "Got stringmap property " << key;
Arman Uguray631c7e42013-07-30 16:41:12 -0700254 out->SetStringmap(
255 key, key_value_pair.second.operator map<string, string>());
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700256 } else {
mukesh agrawal06175d72012-04-23 16:46:01 -0700257 Error::PopulateAndLog(error, Error::kInternalError,
258 "unsupported type for property " + key);
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800259 return; // Skip remaining args after error.
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700260 }
261 }
262}
263
264// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700265::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
266 ::DBus::Variant v;
267 v.writer().append_bool(value);
268 return v;
269}
270
271// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800272::DBus::Variant DBusAdaptor::ByteArraysToVariant(const ByteArrays &value) {
273 ::DBus::MessageIter writer;
274 ::DBus::Variant v;
275
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800276
277 // We have to use a local because the operator<< needs a reference
278 // to work on (the lhs) but writer() returns by-value. C++ prohibits
279 // initializing non-const references from a temporary.
280 // So:
281 // v.writer() << value;
282 // would NOT automagically promote the returned value of v.writer() to
283 // a non-const reference (if you think about it, that's almost always not what
284 // you'd want. see: http://gcc.gnu.org/ml/gcc-help/2006-04/msg00075.html).
285 //
286 // One could consider changing writer() to return a reference, but then it
287 // changes writer() semantics as it can not be a const reference. writer()
288 // currently doesn't modify the original object on which it's called.
Paul Stewartced6a0b2011-11-08 15:32:04 -0800289 writer = v.writer();
290 writer << value;
291 return v;
292}
293
294// static
Ben Chan7fab8972014-08-10 17:14:46 -0700295::DBus::Variant DBusAdaptor::ByteToVariant(uint8_t value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700296 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700297 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700298 return v;
299}
300
301// static
Ben Chan7fab8972014-08-10 17:14:46 -0700302::DBus::Variant DBusAdaptor::Int16ToVariant(int16_t value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700303 ::DBus::Variant v;
304 v.writer().append_int16(value);
305 return v;
306}
307
308// static
Ben Chan7fab8972014-08-10 17:14:46 -0700309::DBus::Variant DBusAdaptor::Int32ToVariant(int32_t value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700310 ::DBus::Variant v;
311 v.writer().append_int32(value);
312 return v;
313}
314
315// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700316::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
317 ::DBus::Variant v;
318 v.writer().append_path(value.c_str());
319 return v;
320}
321
322// static
Ben Chane2ee5e02014-09-19 19:29:42 -0700323::DBus::Variant DBusAdaptor::PathsToVariant(const vector<::DBus::Path> &value) {
mukesh agrawal32399322011-09-01 10:53:43 -0700324 ::DBus::MessageIter writer;
325 ::DBus::Variant v;
326
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800327 // See note above on why we need to use a local.
mukesh agrawal32399322011-09-01 10:53:43 -0700328 writer = v.writer();
329 writer << value;
330 return v;
331}
332
333// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700334::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700335 ::DBus::Variant v;
336 v.writer().append_string(value.c_str());
337 return v;
338}
339
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700340// static
Chris Masone889666b2011-07-03 12:58:50 -0700341::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700342 ::DBus::Variant v;
343 ::DBus::MessageIter writer = v.writer();
344 writer << value;
345 return v;
346}
347
348// static
Chris Masone889666b2011-07-03 12:58:50 -0700349::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700350 ::DBus::Variant v;
351 ::DBus::MessageIter writer = v.writer();
352 writer << value;
353 return v;
354}
355
356// static
Chris Masone889666b2011-07-03 12:58:50 -0700357::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700358 ::DBus::Variant v;
359 ::DBus::MessageIter writer = v.writer();
360 writer << value;
361 return v;
362}
363
364// static
Darin Petkov63138a92012-02-06 14:09:15 +0100365::DBus::Variant DBusAdaptor::KeyValueStoreToVariant(
366 const KeyValueStore &value) {
Darin Petkov25665aa2012-05-21 14:08:12 +0200367 DBusPropertiesMap props;
368 DBusProperties::ConvertKeyValueStoreToMap(value, &props);
Chris Masone889666b2011-07-03 12:58:50 -0700369 ::DBus::Variant v;
370 ::DBus::MessageIter writer = v.writer();
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500371 writer << props;
Chris Masone889666b2011-07-03 12:58:50 -0700372 return v;
373}
374
375// static
Ben Chan7fab8972014-08-10 17:14:46 -0700376::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16_t value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700377 ::DBus::Variant v;
378 v.writer().append_uint16(value);
379 return v;
380}
381
382// static
mukesh agrawale7c7e652013-06-18 17:19:39 -0700383::DBus::Variant DBusAdaptor::Uint16sToVariant(const Uint16s &value) {
384 ::DBus::Variant v;
385 ::DBus::MessageIter writer = v.writer();
386 writer << value;
387 return v;
388}
389
390// static
Ben Chan7fab8972014-08-10 17:14:46 -0700391::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32_t value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700392 ::DBus::Variant v;
393 v.writer().append_uint32(value);
394 return v;
395}
396
397// static
Ben Chan7fab8972014-08-10 17:14:46 -0700398::DBus::Variant DBusAdaptor::Uint64ToVariant(uint64_t value) {
Paul Stewarte18c33b2012-07-10 20:48:44 -0700399 ::DBus::Variant v;
400 v.writer().append_uint64(value);
401 return v;
402}
403
404// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700405bool DBusAdaptor::IsBool(::DBus::Signature signature) {
406 return signature == ::DBus::type<bool>::sig();
407}
408
409// static
410bool DBusAdaptor::IsByte(::DBus::Signature signature) {
Ben Chan7fab8972014-08-10 17:14:46 -0700411 return signature == ::DBus::type<uint8_t>::sig();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700412}
413
414// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800415bool DBusAdaptor::IsByteArrays(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800416 return signature == ::DBus::type<ByteArrays>::sig();
Paul Stewartced6a0b2011-11-08 15:32:04 -0800417}
418
419// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700420bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
Ben Chan7fab8972014-08-10 17:14:46 -0700421 return signature == ::DBus::type<int16_t>::sig();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700422}
423
424// static
425bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
Ben Chan7fab8972014-08-10 17:14:46 -0700426 return signature == ::DBus::type<int32_t>::sig();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700427}
428
429// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700430bool DBusAdaptor::IsPath(::DBus::Signature signature) {
Ben Chane2ee5e02014-09-19 19:29:42 -0700431 return signature == ::DBus::type<::DBus::Path>::sig();
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700432}
433
434// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700435bool DBusAdaptor::IsPaths(::DBus::Signature signature) {
Ben Chane2ee5e02014-09-19 19:29:42 -0700436 return signature == ::DBus::type<vector<::DBus::Path>>::sig();
mukesh agrawal32399322011-09-01 10:53:43 -0700437}
438
439// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700440bool DBusAdaptor::IsString(::DBus::Signature signature) {
441 return signature == ::DBus::type<string>::sig();
442}
443
444// static
445bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800446 return signature == ::DBus::type<Stringmap>::sig();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700447}
448
449// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700450bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800451 return signature == ::DBus::type<Stringmaps>::sig();
Chris Masone27c4aa52011-07-02 13:10:14 -0700452}
453
454// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700455bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800456 return signature == ::DBus::type<Strings>::sig();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700457}
458
459// static
460bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
Ben Chan7fab8972014-08-10 17:14:46 -0700461 return signature == ::DBus::type<uint16_t>::sig();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700462}
463
464// static
mukesh agrawale7c7e652013-06-18 17:19:39 -0700465bool DBusAdaptor::IsUint16s(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800466 return signature == ::DBus::type<Uint16s>::sig();
mukesh agrawale7c7e652013-06-18 17:19:39 -0700467}
468
469// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700470bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
Ben Chan7fab8972014-08-10 17:14:46 -0700471 return signature == ::DBus::type<uint32_t>::sig();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700472}
473
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100474// static
Paul Stewarte18c33b2012-07-10 20:48:44 -0700475bool DBusAdaptor::IsUint64(::DBus::Signature signature) {
Ben Chan7fab8972014-08-10 17:14:46 -0700476 return signature == ::DBus::type<uint64_t>::sig();
Paul Stewarte18c33b2012-07-10 20:48:44 -0700477}
478
479// static
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500480bool DBusAdaptor::IsKeyValueStore(::DBus::Signature signature) {
Ben Chane2ee5e02014-09-19 19:29:42 -0700481 return signature == ::DBus::type<map<string, ::DBus::Variant>>::sig();
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500482}
483
Eric Shienbrood9a245532012-03-07 14:20:39 -0500484void DBusAdaptor::DeferReply(const DBus::Tag *tag) {
485 return_later(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100486}
487
Eric Shienbrood9a245532012-03-07 14:20:39 -0500488void DBusAdaptor::ReplyNow(const DBus::Tag *tag) {
489 Continuation *cont = find_continuation(tag);
mukesh agrawal46c27cc2013-07-10 16:39:10 -0700490 CHECK(cont) << "Failed to find continuation.";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500491 return_now(cont);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100492}
493
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800494template <typename T>
495void DBusAdaptor::TypedReplyNow(const DBus::Tag *tag, const T &value) {
496 Continuation *cont = find_continuation(tag);
mukesh agrawal46c27cc2013-07-10 16:39:10 -0700497 CHECK(cont) << "Failed to find continuation.";
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800498 cont->writer() << value;
499 return_now(cont);
500}
501
Eric Shienbrood9a245532012-03-07 14:20:39 -0500502void DBusAdaptor::ReplyNowWithError(const DBus::Tag *tag,
503 const DBus::Error &error) {
504 Continuation *cont = find_continuation(tag);
mukesh agrawal46c27cc2013-07-10 16:39:10 -0700505 CHECK(cont) << "Failed to find continuation.";
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700506 SLOG(this, 1) << "Returning error: (" << error.name() << ": "
Prathmesh Prabhu51a4f932014-08-13 13:13:27 -0700507 << error.message() << ")";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500508 return_error(cont, error);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100509}
510
Eric Shienbrood9a245532012-03-07 14:20:39 -0500511ResultCallback DBusAdaptor::GetMethodReplyCallback(
512 const DBus::Tag *tag) {
513 return Bind(&DBusAdaptor::MethodReplyCallback, AsWeakPtr(), Owned(tag));
514}
515
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800516ResultStringCallback DBusAdaptor::GetStringMethodReplyCallback(
517 const DBus::Tag *tag) {
518 return Bind(&DBusAdaptor::StringMethodReplyCallback, AsWeakPtr(), Owned(tag));
519}
520
521ResultBoolCallback DBusAdaptor::GetBoolMethodReplyCallback(
522 const DBus::Tag *tag) {
523 return Bind(&DBusAdaptor::BoolMethodReplyCallback, AsWeakPtr(), Owned(tag));
524}
525
526template<typename T>
527void DBusAdaptor::TypedMethodReplyCallback(const DBus::Tag *tag,
528 const Error &error,
529 const T &returned) {
530 if (error.IsFailure()) {
531 DBus::Error dberror;
532 error.ToDBusError(&dberror);
533 ReplyNowWithError(tag, dberror);
534 } else {
535 TypedReplyNow(tag, returned);
536 }
537}
538
Eric Shienbrood9a245532012-03-07 14:20:39 -0500539void DBusAdaptor::ReturnResultOrDefer(const DBus::Tag *tag,
540 const Error &error,
541 DBus::Error *dberror) {
542 if (error.IsOngoing()) {
543 DeferReply(tag);
544 } else if (error.IsFailure()) {
545 error.ToDBusError(dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100546 }
547}
548
Eric Shienbrood9a245532012-03-07 14:20:39 -0500549void DBusAdaptor::MethodReplyCallback(const DBus::Tag *tag,
550 const Error &error) {
551 if (error.IsFailure()) {
552 DBus::Error dberror;
553 error.ToDBusError(&dberror);
554 ReplyNowWithError(tag, dberror);
555 } else {
556 ReplyNow(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100557 }
558}
559
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800560void DBusAdaptor::StringMethodReplyCallback(const DBus::Tag *tag,
561 const Error &error,
562 const string &returned) {
563 TypedMethodReplyCallback(tag, error, returned);
564}
565
566void DBusAdaptor::BoolMethodReplyCallback(const DBus::Tag *tag,
567 const Error &error,
568 bool returned) {
569 TypedMethodReplyCallback(tag, error, returned);
570}
571
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700572} // namespace shill