blob: 4a648997effdab1e3417c44e386b2b755d7a92cf [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
Chris Masone8fe2c7e2011-06-09 15:51:19 -07005#include <map>
Chris Masoned0ceb8c2011-06-02 10:05:39 -07006#include <string>
Chris Masone8fe2c7e2011-06-09 15:51:19 -07007#include <vector>
Chris Masoned0ceb8c2011-06-02 10:05:39 -07008
Eric Shienbrood9a245532012-03-07 14:20:39 -05009#include <base/bind.h>
10#include <base/callback.h>
Chris Masoned0ceb8c2011-06-02 10:05:39 -070011#include <dbus-c++/dbus.h>
12
Chris Masone889666b2011-07-03 12:58:50 -070013#include "shill/accessor_interface.h"
Chris Masoned0ceb8c2011-06-02 10:05:39 -070014#include "shill/dbus_adaptor.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070015#include "shill/error.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070016#include "shill/key_value_store.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070017#include "shill/logging.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070018#include "shill/property_store.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070019
Eric Shienbrood9a245532012-03-07 14:20:39 -050020using base::Bind;
21using base::Owned;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070022using std::map;
23using std::string;
24using std::vector;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070025
26namespace shill {
27
mukesh agrawalcbfb34e2013-04-17 19:33:25 -070028// public static
29const char DBusAdaptor::kNullPath[] = "/";
Chris Masone8fe2c7e2011-06-09 15:51:19 -070030
31DBusAdaptor::DBusAdaptor(DBus::Connection* conn, const string &object_path)
Chris Masoned0ceb8c2011-06-02 10:05:39 -070032 : DBus::ObjectAdaptor(*conn, object_path) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070033 SLOG(DBus, 2) << "DBusAdaptor: " << object_path;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070034}
35
36DBusAdaptor::~DBusAdaptor() {}
37
38// static
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080039bool DBusAdaptor::SetProperty(PropertyStore *store,
40 const string &name,
41 const ::DBus::Variant &value,
42 ::DBus::Error *error) {
mukesh agrawalffa3d042011-10-06 15:26:10 -070043 Error e;
mukesh agrawalbebf1b82013-04-23 15:06:33 -070044 bool ret;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070045
46 if (DBusAdaptor::IsBool(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070047 ret = store->SetBoolProperty(name, value.reader().get_bool(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070048 else if (DBusAdaptor::IsByte(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070049 ret = store->SetUint8Property(name, value.reader().get_byte(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070050 else if (DBusAdaptor::IsInt16(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070051 ret = store->SetInt16Property(name, value.reader().get_int16(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070052 else if (DBusAdaptor::IsInt32(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070053 ret = store->SetInt32Property(name, value.reader().get_int32(), &e);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070054 else if (DBusAdaptor::IsPath(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070055 ret = store->SetStringProperty(name, value.reader().get_path(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070056 else if (DBusAdaptor::IsString(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070057 ret = store->SetStringProperty(name, value.reader().get_string(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070058 else if (DBusAdaptor::IsStringmap(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070059 ret = store->SetStringmapProperty(name,
60 value.operator map<string, string>(),
61 &e);
mukesh agrawalffa3d042011-10-06 15:26:10 -070062 else if (DBusAdaptor::IsStringmaps(value.signature())) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070063 SLOG(DBus, 1) << " can't yet handle setting type " << value.signature();
mukesh agrawalbebf1b82013-04-23 15:06:33 -070064 ret = false;
mukesh agrawalffa3d042011-10-06 15:26:10 -070065 e.Populate(Error::kInternalError);
66 } else if (DBusAdaptor::IsStrings(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070067 ret = store->SetStringsProperty(name, value.operator vector<string>(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070068 else if (DBusAdaptor::IsUint16(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070069 ret = store->SetUint16Property(name, value.reader().get_uint16(), &e);
mukesh agrawale7c7e652013-06-18 17:19:39 -070070 else if (DBusAdaptor::IsUint16s(value.signature()))
71 ret = store->SetUint16sProperty(name, value.operator vector<uint16>(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070072 else if (DBusAdaptor::IsUint32(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070073 ret = store->SetUint32Property(name, value.reader().get_uint32(), &e);
Paul Stewarte18c33b2012-07-10 20:48:44 -070074 else if (DBusAdaptor::IsUint64(value.signature()))
mukesh agrawalbebf1b82013-04-23 15:06:33 -070075 ret = store->SetUint64Property(name, value.reader().get_uint64(), &e);
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050076 else if (DBusAdaptor::IsKeyValueStore(value.signature())) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070077 SLOG(DBus, 1) << " can't yet handle setting type " << value.signature();
mukesh agrawalbebf1b82013-04-23 15:06:33 -070078 ret = false;
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050079 e.Populate(Error::kInternalError);
80 } else {
Chris Masone27c4aa52011-07-02 13:10:14 -070081 NOTREACHED() << " unknown type: " << value.signature();
mukesh agrawalbebf1b82013-04-23 15:06:33 -070082 ret = false;
mukesh agrawalffa3d042011-10-06 15:26:10 -070083 e.Populate(Error::kInternalError);
Chris Masone27c4aa52011-07-02 13:10:14 -070084 }
mukesh agrawalffa3d042011-10-06 15:26:10 -070085
86 if (error != NULL) {
87 e.ToDBusError(error);
88 }
89
mukesh agrawalbebf1b82013-04-23 15:06:33 -070090 return ret;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070091}
92
93// static
mukesh agrawalde29fa82011-09-16 16:16:36 -070094bool DBusAdaptor::GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -070095 map<string, ::DBus::Variant> *out,
mukesh agrawal1830fa12011-09-26 14:31:40 -070096 ::DBus::Error */*error*/) {
Chris Masonea8a2c252011-06-27 22:16:30 -070097 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -080098 ReadablePropertyConstIterator<bool> it = store.GetBoolPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -070099 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200100 (*out)[it.Key()] = BoolToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700101 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700102 }
103 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800104 ReadablePropertyConstIterator<int16> it = store.GetInt16PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700105 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200106 (*out)[it.Key()] = Int16ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700107 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700108 }
109 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800110 ReadablePropertyConstIterator<int32> it = store.GetInt32PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700111 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200112 (*out)[it.Key()] = Int32ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700113 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700114 }
115 {
Darin Petkov63138a92012-02-06 14:09:15 +0100116 ReadablePropertyConstIterator<KeyValueStore> it =
117 store.GetKeyValueStorePropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700118 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200119 (*out)[it.Key()] = KeyValueStoreToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700120 }
Darin Petkov63138a92012-02-06 14:09:15 +0100121 }
122 {
mukesh agrawal2366eed2012-03-20 18:21:50 -0700123 ReadablePropertyConstIterator<RpcIdentifiers> it =
124 store.GetRpcIdentifiersPropertiesIter();
125 for ( ; !it.AtEnd(); it.Advance()) {
mukesh agrawal2366eed2012-03-20 18:21:50 -0700126 vector < ::DBus::Path> rpc_identifiers_as_paths;
Paul Stewart48231832013-07-17 15:46:19 -0700127 for (const auto &path : it.value()) {
128 rpc_identifiers_as_paths.push_back(path);
mukesh agrawal2366eed2012-03-20 18:21:50 -0700129 }
130 (*out)[it.Key()] = PathsToVariant(rpc_identifiers_as_paths);
131 }
132 }
133 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800134 ReadablePropertyConstIterator<string> it = store.GetStringPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700135 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200136 (*out)[it.Key()] = StringToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700137 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700138 }
139 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800140 ReadablePropertyConstIterator<Stringmap> it =
141 store.GetStringmapPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700142 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200143 (*out)[it.Key()]= StringmapToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700144 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700145 }
146 {
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400147 ReadablePropertyConstIterator<Stringmaps> it =
148 store.GetStringmapsPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700149 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200150 (*out)[it.Key()]= StringmapsToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700151 }
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400152 }
153 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800154 ReadablePropertyConstIterator<Strings> it =
155 store.GetStringsPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700156 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200157 (*out)[it.Key()] = StringsToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700158 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700159 }
160 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800161 ReadablePropertyConstIterator<uint8> it = store.GetUint8PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700162 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200163 (*out)[it.Key()] = ByteToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700164 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700165 }
166 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800167 ReadablePropertyConstIterator<uint16> it = store.GetUint16PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700168 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200169 (*out)[it.Key()] = Uint16ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700170 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700171 }
172 {
mukesh agrawale7c7e652013-06-18 17:19:39 -0700173 ReadablePropertyConstIterator<Uint16s> it =
174 store.GetUint16sPropertiesIter();
175 for ( ; !it.AtEnd(); it.Advance()) {
176 (*out)[it.Key()] = Uint16sToVariant(it.value());
177 }
178 }
179 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800180 ReadablePropertyConstIterator<uint32> it = store.GetUint32PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700181 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200182 (*out)[it.Key()] = Uint32ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700183 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700184 }
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400185 {
Paul Stewarte18c33b2012-07-10 20:48:44 -0700186 ReadablePropertyConstIterator<uint64> it = store.GetUint64PropertiesIter();
187 for ( ; !it.AtEnd(); it.Advance()) {
Paul Stewarte18c33b2012-07-10 20:48:44 -0700188 (*out)[it.Key()] = Uint64ToVariant(it.value());
189 }
190 }
191 {
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400192 ReadablePropertyConstIterator<RpcIdentifier> it =
193 store.GetRpcIdentifierPropertiesIter();
194 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200195 (*out)[it.Key()] = PathToVariant(it.value());
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400196 }
197 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700198 return true;
199}
200
201// static
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800202bool DBusAdaptor::ClearProperty(PropertyStore *store,
203 const string &name,
204 ::DBus::Error *error) {
205 Error e;
206 store->ClearProperty(name, &e);
207
208 if (error != NULL) {
209 e.ToDBusError(error);
210 }
211
212 return e.IsSuccess();
213}
214
215// static
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700216void DBusAdaptor::ArgsToKeyValueStore(
217 const map<string, ::DBus::Variant> &args,
218 KeyValueStore *out,
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800219 Error *error) { // TODO(quiche): Should be ::DBus::Error?
Paul Stewart48231832013-07-17 15:46:19 -0700220 for (const auto &key_value_pair : args) {
221 string key = key_value_pair.first;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700222 DBus::type<string> string_type;
223 DBus::type<bool> bool_type;
Paul Stewart48231832013-07-17 15:46:19 -0700224 DBus::type<int32> int32_type;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700225
Paul Stewart48231832013-07-17 15:46:19 -0700226 if (key_value_pair.second.signature() == bool_type.sig()) {
mukesh agrawal06175d72012-04-23 16:46:01 -0700227 SLOG(DBus, 5) << "Got bool property " << key;
Paul Stewart48231832013-07-17 15:46:19 -0700228 out->SetBool(key, key_value_pair.second.reader().get_bool());
229 } else if (key_value_pair.second.signature() == int32_type.sig()) {
230 SLOG(DBus, 5) << "Got int32 property " << key;
231 out->SetInt(key, key_value_pair.second.reader().get_int32());
232 } else if (key_value_pair.second.signature() == string_type.sig()) {
233 SLOG(DBus, 5) << "Got string property " << key;
234 out->SetString(key, key_value_pair.second.reader().get_string());
235 } else if (DBusAdaptor::IsStrings(key_value_pair.second.signature())) {
Paul Stewart99dc9f32013-06-27 07:39:25 -0700236 SLOG(DBus, 5) << "Got strings property " << key;
Paul Stewart48231832013-07-17 15:46:19 -0700237 out->SetStrings(key, key_value_pair.second.operator vector<string>());
Arman Uguray631c7e42013-07-30 16:41:12 -0700238 } else if (DBusAdaptor::IsStringmap(key_value_pair.second.signature())) {
239 SLOG(DBus, 5) << "Got stringmap property " << key;
240 out->SetStringmap(
241 key, key_value_pair.second.operator map<string, string>());
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700242 } else {
mukesh agrawal06175d72012-04-23 16:46:01 -0700243 Error::PopulateAndLog(error, Error::kInternalError,
244 "unsupported type for property " + key);
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800245 return; // Skip remaining args after error.
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700246 }
247 }
248}
249
250// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700251::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
252 ::DBus::Variant v;
253 v.writer().append_bool(value);
254 return v;
255}
256
257// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800258::DBus::Variant DBusAdaptor::ByteArraysToVariant(const ByteArrays &value) {
259 ::DBus::MessageIter writer;
260 ::DBus::Variant v;
261
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800262
263 // We have to use a local because the operator<< needs a reference
264 // to work on (the lhs) but writer() returns by-value. C++ prohibits
265 // initializing non-const references from a temporary.
266 // So:
267 // v.writer() << value;
268 // would NOT automagically promote the returned value of v.writer() to
269 // a non-const reference (if you think about it, that's almost always not what
270 // you'd want. see: http://gcc.gnu.org/ml/gcc-help/2006-04/msg00075.html).
271 //
272 // One could consider changing writer() to return a reference, but then it
273 // changes writer() semantics as it can not be a const reference. writer()
274 // currently doesn't modify the original object on which it's called.
Paul Stewartced6a0b2011-11-08 15:32:04 -0800275 writer = v.writer();
276 writer << value;
277 return v;
278}
279
280// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700281::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700282 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700283 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700284 return v;
285}
286
287// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700288::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
289 ::DBus::Variant v;
290 v.writer().append_int16(value);
291 return v;
292}
293
294// static
295::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700296 ::DBus::Variant v;
297 v.writer().append_int32(value);
298 return v;
299}
300
301// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700302::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
303 ::DBus::Variant v;
304 v.writer().append_path(value.c_str());
305 return v;
306}
307
308// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700309::DBus::Variant DBusAdaptor::PathsToVariant(
mukesh agrawal32399322011-09-01 10:53:43 -0700310 const vector< ::DBus::Path> &value) {
311 ::DBus::MessageIter writer;
312 ::DBus::Variant v;
313
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800314 // See note above on why we need to use a local.
mukesh agrawal32399322011-09-01 10:53:43 -0700315 writer = v.writer();
316 writer << value;
317 return v;
318}
319
320// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700321::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700322 ::DBus::Variant v;
323 v.writer().append_string(value.c_str());
324 return v;
325}
326
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700327// static
Chris Masone889666b2011-07-03 12:58:50 -0700328::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700329 ::DBus::Variant v;
330 ::DBus::MessageIter writer = v.writer();
331 writer << value;
332 return v;
333}
334
335// static
Chris Masone889666b2011-07-03 12:58:50 -0700336::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700337 ::DBus::Variant v;
338 ::DBus::MessageIter writer = v.writer();
339 writer << value;
340 return v;
341}
342
343// static
Chris Masone889666b2011-07-03 12:58:50 -0700344::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700345 ::DBus::Variant v;
346 ::DBus::MessageIter writer = v.writer();
347 writer << value;
348 return v;
349}
350
351// static
Darin Petkov63138a92012-02-06 14:09:15 +0100352::DBus::Variant DBusAdaptor::KeyValueStoreToVariant(
353 const KeyValueStore &value) {
Darin Petkov25665aa2012-05-21 14:08:12 +0200354 DBusPropertiesMap props;
355 DBusProperties::ConvertKeyValueStoreToMap(value, &props);
Chris Masone889666b2011-07-03 12:58:50 -0700356 ::DBus::Variant v;
357 ::DBus::MessageIter writer = v.writer();
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500358 writer << props;
Chris Masone889666b2011-07-03 12:58:50 -0700359 return v;
360}
361
362// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700363::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
364 ::DBus::Variant v;
365 v.writer().append_uint16(value);
366 return v;
367}
368
369// static
mukesh agrawale7c7e652013-06-18 17:19:39 -0700370::DBus::Variant DBusAdaptor::Uint16sToVariant(const Uint16s &value) {
371 ::DBus::Variant v;
372 ::DBus::MessageIter writer = v.writer();
373 writer << value;
374 return v;
375}
376
377// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700378::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
379 ::DBus::Variant v;
380 v.writer().append_uint32(value);
381 return v;
382}
383
384// static
Paul Stewarte18c33b2012-07-10 20:48:44 -0700385::DBus::Variant DBusAdaptor::Uint64ToVariant(uint64 value) {
386 ::DBus::Variant v;
387 v.writer().append_uint64(value);
388 return v;
389}
390
391// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700392bool DBusAdaptor::IsBool(::DBus::Signature signature) {
393 return signature == ::DBus::type<bool>::sig();
394}
395
396// static
397bool DBusAdaptor::IsByte(::DBus::Signature signature) {
398 return signature == ::DBus::type<uint8>::sig();
399}
400
401// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800402bool DBusAdaptor::IsByteArrays(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800403 return signature == ::DBus::type<ByteArrays>::sig();
Paul Stewartced6a0b2011-11-08 15:32:04 -0800404}
405
406// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700407bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
408 return signature == ::DBus::type<int16>::sig();
409}
410
411// static
412bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
413 return signature == ::DBus::type<int32>::sig();
414}
415
416// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700417bool DBusAdaptor::IsPath(::DBus::Signature signature) {
418 return signature == ::DBus::type< ::DBus::Path >::sig();
419}
420
421// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700422bool DBusAdaptor::IsPaths(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800423 return signature == ::DBus::type<vector< ::DBus::Path >>::sig();
mukesh agrawal32399322011-09-01 10:53:43 -0700424}
425
426// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700427bool DBusAdaptor::IsString(::DBus::Signature signature) {
428 return signature == ::DBus::type<string>::sig();
429}
430
431// static
432bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800433 return signature == ::DBus::type<Stringmap>::sig();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700434}
435
436// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700437bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800438 return signature == ::DBus::type<Stringmaps>::sig();
Chris Masone27c4aa52011-07-02 13:10:14 -0700439}
440
441// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700442bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800443 return signature == ::DBus::type<Strings>::sig();
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700444}
445
446// static
447bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
448 return signature == ::DBus::type<uint16>::sig();
449}
450
451// static
mukesh agrawale7c7e652013-06-18 17:19:39 -0700452bool DBusAdaptor::IsUint16s(::DBus::Signature signature) {
mukesh agrawal97ede7b2013-11-21 15:28:14 -0800453 return signature == ::DBus::type<Uint16s>::sig();
mukesh agrawale7c7e652013-06-18 17:19:39 -0700454}
455
456// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700457bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
458 return signature == ::DBus::type<uint32>::sig();
459}
460
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100461// static
Paul Stewarte18c33b2012-07-10 20:48:44 -0700462bool DBusAdaptor::IsUint64(::DBus::Signature signature) {
463 return signature == ::DBus::type<uint64>::sig();
464}
465
466// static
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500467bool DBusAdaptor::IsKeyValueStore(::DBus::Signature signature) {
468 return signature == ::DBus::type<map<string, ::DBus::Variant> >::sig();
469}
470
Eric Shienbrood9a245532012-03-07 14:20:39 -0500471void DBusAdaptor::DeferReply(const DBus::Tag *tag) {
472 return_later(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100473}
474
Eric Shienbrood9a245532012-03-07 14:20:39 -0500475void DBusAdaptor::ReplyNow(const DBus::Tag *tag) {
476 Continuation *cont = find_continuation(tag);
mukesh agrawal46c27cc2013-07-10 16:39:10 -0700477 CHECK(cont) << "Failed to find continuation.";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500478 return_now(cont);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100479}
480
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800481template <typename T>
482void DBusAdaptor::TypedReplyNow(const DBus::Tag *tag, const T &value) {
483 Continuation *cont = find_continuation(tag);
mukesh agrawal46c27cc2013-07-10 16:39:10 -0700484 CHECK(cont) << "Failed to find continuation.";
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800485 cont->writer() << value;
486 return_now(cont);
487}
488
Eric Shienbrood9a245532012-03-07 14:20:39 -0500489void DBusAdaptor::ReplyNowWithError(const DBus::Tag *tag,
490 const DBus::Error &error) {
491 Continuation *cont = find_continuation(tag);
mukesh agrawal46c27cc2013-07-10 16:39:10 -0700492 CHECK(cont) << "Failed to find continuation.";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500493 return_error(cont, error);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100494}
495
Eric Shienbrood9a245532012-03-07 14:20:39 -0500496ResultCallback DBusAdaptor::GetMethodReplyCallback(
497 const DBus::Tag *tag) {
498 return Bind(&DBusAdaptor::MethodReplyCallback, AsWeakPtr(), Owned(tag));
499}
500
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800501ResultStringCallback DBusAdaptor::GetStringMethodReplyCallback(
502 const DBus::Tag *tag) {
503 return Bind(&DBusAdaptor::StringMethodReplyCallback, AsWeakPtr(), Owned(tag));
504}
505
506ResultBoolCallback DBusAdaptor::GetBoolMethodReplyCallback(
507 const DBus::Tag *tag) {
508 return Bind(&DBusAdaptor::BoolMethodReplyCallback, AsWeakPtr(), Owned(tag));
509}
510
511template<typename T>
512void DBusAdaptor::TypedMethodReplyCallback(const DBus::Tag *tag,
513 const Error &error,
514 const T &returned) {
515 if (error.IsFailure()) {
516 DBus::Error dberror;
517 error.ToDBusError(&dberror);
518 ReplyNowWithError(tag, dberror);
519 } else {
520 TypedReplyNow(tag, returned);
521 }
522}
523
Eric Shienbrood9a245532012-03-07 14:20:39 -0500524void DBusAdaptor::ReturnResultOrDefer(const DBus::Tag *tag,
525 const Error &error,
526 DBus::Error *dberror) {
527 if (error.IsOngoing()) {
528 DeferReply(tag);
529 } else if (error.IsFailure()) {
530 error.ToDBusError(dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100531 }
532}
533
Eric Shienbrood9a245532012-03-07 14:20:39 -0500534void DBusAdaptor::MethodReplyCallback(const DBus::Tag *tag,
535 const Error &error) {
536 if (error.IsFailure()) {
537 DBus::Error dberror;
538 error.ToDBusError(&dberror);
539 ReplyNowWithError(tag, dberror);
540 } else {
541 ReplyNow(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100542 }
543}
544
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800545void DBusAdaptor::StringMethodReplyCallback(const DBus::Tag *tag,
546 const Error &error,
547 const string &returned) {
548 TypedMethodReplyCallback(tag, error, returned);
549}
550
551void DBusAdaptor::BoolMethodReplyCallback(const DBus::Tag *tag,
552 const Error &error,
553 bool returned) {
554 TypedMethodReplyCallback(tag, error, returned);
555}
556
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700557} // namespace shill