blob: 6dd566defcfeb512a5b726265509f8d7deaf40ff [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
Chris Masone8fe2c7e2011-06-09 15:51:19 -070028// static
Paul Stewartced6a0b2011-11-08 15:32:04 -080029const char DBusAdaptor::kByteArraysSig[] = "aay";
30// static
mukesh agrawal2366eed2012-03-20 18:21:50 -070031const char DBusAdaptor::kPathsSig[] = "ao";
mukesh agrawal32399322011-09-01 10:53:43 -070032// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070033const char DBusAdaptor::kStringmapSig[] = "a{ss}";
34// static
Chris Masone27c4aa52011-07-02 13:10:14 -070035const char DBusAdaptor::kStringmapsSig[] = "aa{ss}";
36// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070037const char DBusAdaptor::kStringsSig[] = "as";
38
39DBusAdaptor::DBusAdaptor(DBus::Connection* conn, const string &object_path)
Chris Masoned0ceb8c2011-06-02 10:05:39 -070040 : DBus::ObjectAdaptor(*conn, object_path) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070041 SLOG(DBus, 2) << "DBusAdaptor: " << object_path;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070042}
43
44DBusAdaptor::~DBusAdaptor() {}
45
46// static
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080047bool DBusAdaptor::SetProperty(PropertyStore *store,
48 const string &name,
49 const ::DBus::Variant &value,
50 ::DBus::Error *error) {
mukesh agrawalffa3d042011-10-06 15:26:10 -070051 Error e;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070052
53 if (DBusAdaptor::IsBool(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070054 store->SetBoolProperty(name, value.reader().get_bool(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070055 else if (DBusAdaptor::IsByte(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070056 store->SetUint8Property(name, value.reader().get_byte(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070057 else if (DBusAdaptor::IsInt16(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070058 store->SetInt16Property(name, value.reader().get_int16(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070059 else if (DBusAdaptor::IsInt32(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070060 store->SetInt32Property(name, value.reader().get_int32(), &e);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070061 else if (DBusAdaptor::IsPath(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070062 store->SetStringProperty(name, value.reader().get_path(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070063 else if (DBusAdaptor::IsString(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070064 store->SetStringProperty(name, value.reader().get_string(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070065 else if (DBusAdaptor::IsStringmap(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070066 store->SetStringmapProperty(name,
67 value.operator map<string, string>(),
68 &e);
69 else if (DBusAdaptor::IsStringmaps(value.signature())) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070070 SLOG(DBus, 1) << " can't yet handle setting type " << value.signature();
mukesh agrawalffa3d042011-10-06 15:26:10 -070071 e.Populate(Error::kInternalError);
72 } else if (DBusAdaptor::IsStrings(value.signature()))
73 store->SetStringsProperty(name, value.operator vector<string>(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070074 else if (DBusAdaptor::IsUint16(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070075 store->SetUint16Property(name, value.reader().get_uint16(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070076 else if (DBusAdaptor::IsUint32(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070077 store->SetUint32Property(name, value.reader().get_uint32(), &e);
Paul Stewarte18c33b2012-07-10 20:48:44 -070078 else if (DBusAdaptor::IsUint64(value.signature()))
79 store->SetUint64Property(name, value.reader().get_uint64(), &e);
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050080 else if (DBusAdaptor::IsKeyValueStore(value.signature())) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070081 SLOG(DBus, 1) << " can't yet handle setting type " << value.signature();
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050082 e.Populate(Error::kInternalError);
83 } else {
Chris Masone27c4aa52011-07-02 13:10:14 -070084 NOTREACHED() << " unknown type: " << value.signature();
mukesh agrawalffa3d042011-10-06 15:26:10 -070085 e.Populate(Error::kInternalError);
Chris Masone27c4aa52011-07-02 13:10:14 -070086 }
mukesh agrawalffa3d042011-10-06 15:26:10 -070087
88 if (error != NULL) {
89 e.ToDBusError(error);
90 }
91
92 return e.IsSuccess();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070093}
94
95// static
mukesh agrawalde29fa82011-09-16 16:16:36 -070096bool DBusAdaptor::GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -070097 map<string, ::DBus::Variant> *out,
mukesh agrawal1830fa12011-09-26 14:31:40 -070098 ::DBus::Error */*error*/) {
Chris Masonea8a2c252011-06-27 22:16:30 -070099 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800100 ReadablePropertyConstIterator<bool> it = store.GetBoolPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700101 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200102 (*out)[it.Key()] = BoolToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700103 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700104 }
105 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800106 ReadablePropertyConstIterator<int16> it = store.GetInt16PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700107 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200108 (*out)[it.Key()] = Int16ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700109 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700110 }
111 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800112 ReadablePropertyConstIterator<int32> it = store.GetInt32PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700113 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200114 (*out)[it.Key()] = Int32ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700115 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700116 }
117 {
Darin Petkov63138a92012-02-06 14:09:15 +0100118 ReadablePropertyConstIterator<KeyValueStore> it =
119 store.GetKeyValueStorePropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700120 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200121 (*out)[it.Key()] = KeyValueStoreToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700122 }
Darin Petkov63138a92012-02-06 14:09:15 +0100123 }
124 {
mukesh agrawal2366eed2012-03-20 18:21:50 -0700125 ReadablePropertyConstIterator<RpcIdentifiers> it =
126 store.GetRpcIdentifiersPropertiesIter();
127 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200128 const Strings &rpc_identifiers_as_strings = it.value();
mukesh agrawal2366eed2012-03-20 18:21:50 -0700129 vector < ::DBus::Path> rpc_identifiers_as_paths;
130 for (Strings::const_iterator in = rpc_identifiers_as_strings.begin();
131 in != rpc_identifiers_as_strings.end();
132 ++in) {
133 rpc_identifiers_as_paths.push_back(*in);
134 }
135 (*out)[it.Key()] = PathsToVariant(rpc_identifiers_as_paths);
136 }
137 }
138 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800139 ReadablePropertyConstIterator<string> it = store.GetStringPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700140 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200141 (*out)[it.Key()] = StringToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700142 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700143 }
144 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800145 ReadablePropertyConstIterator<Stringmap> it =
146 store.GetStringmapPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700147 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200148 (*out)[it.Key()]= StringmapToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700149 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700150 }
151 {
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400152 ReadablePropertyConstIterator<Stringmaps> it =
153 store.GetStringmapsPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700154 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200155 (*out)[it.Key()]= StringmapsToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700156 }
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400157 }
158 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800159 ReadablePropertyConstIterator<Strings> it =
160 store.GetStringsPropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700161 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200162 (*out)[it.Key()] = StringsToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700163 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700164 }
165 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800166 ReadablePropertyConstIterator<uint8> it = store.GetUint8PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700167 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200168 (*out)[it.Key()] = ByteToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700169 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700170 }
171 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800172 ReadablePropertyConstIterator<uint16> it = store.GetUint16PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700173 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200174 (*out)[it.Key()] = Uint16ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700175 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700176 }
177 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800178 ReadablePropertyConstIterator<uint32> it = store.GetUint32PropertiesIter();
mukesh agrawal465331c2012-05-30 11:26:11 -0700179 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200180 (*out)[it.Key()] = Uint32ToVariant(it.value());
mukesh agrawal465331c2012-05-30 11:26:11 -0700181 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700182 }
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400183 {
Paul Stewarte18c33b2012-07-10 20:48:44 -0700184 ReadablePropertyConstIterator<uint64> it = store.GetUint64PropertiesIter();
185 for ( ; !it.AtEnd(); it.Advance()) {
Paul Stewarte18c33b2012-07-10 20:48:44 -0700186 (*out)[it.Key()] = Uint64ToVariant(it.value());
187 }
188 }
189 {
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400190 ReadablePropertyConstIterator<RpcIdentifier> it =
191 store.GetRpcIdentifierPropertiesIter();
192 for ( ; !it.AtEnd(); it.Advance()) {
Darin Petkov4682aa82012-05-31 16:24:11 +0200193 (*out)[it.Key()] = PathToVariant(it.value());
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400194 }
195 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700196 return true;
197}
198
199// static
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800200bool DBusAdaptor::ClearProperty(PropertyStore *store,
201 const string &name,
202 ::DBus::Error *error) {
203 Error e;
204 store->ClearProperty(name, &e);
205
206 if (error != NULL) {
207 e.ToDBusError(error);
208 }
209
210 return e.IsSuccess();
211}
212
213// static
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700214void DBusAdaptor::ArgsToKeyValueStore(
215 const map<string, ::DBus::Variant> &args,
216 KeyValueStore *out,
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800217 Error *error) { // TODO(quiche): Should be ::DBus::Error?
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700218 for (map<string, ::DBus::Variant>::const_iterator it = args.begin();
219 it != args.end();
220 ++it) {
mukesh agrawal06175d72012-04-23 16:46:01 -0700221 string key = it->first;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700222 DBus::type<string> string_type;
223 DBus::type<bool> bool_type;
224
225 if (it->second.signature() == string_type.sig()) {
mukesh agrawal06175d72012-04-23 16:46:01 -0700226 SLOG(DBus, 5) << "Got string property " << key;
227 out->SetString(key, it->second.reader().get_string());
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700228 } else if (it->second.signature() == bool_type.sig()) {
mukesh agrawal06175d72012-04-23 16:46:01 -0700229 SLOG(DBus, 5) << "Got bool property " << key;
230 out->SetBool(key, it->second.reader().get_bool());
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700231 } else {
mukesh agrawal06175d72012-04-23 16:46:01 -0700232 Error::PopulateAndLog(error, Error::kInternalError,
233 "unsupported type for property " + key);
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800234 return; // Skip remaining args after error.
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700235 }
236 }
237}
238
239// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700240::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
241 ::DBus::Variant v;
242 v.writer().append_bool(value);
243 return v;
244}
245
246// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800247::DBus::Variant DBusAdaptor::ByteArraysToVariant(const ByteArrays &value) {
248 ::DBus::MessageIter writer;
249 ::DBus::Variant v;
250
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800251
252 // We have to use a local because the operator<< needs a reference
253 // to work on (the lhs) but writer() returns by-value. C++ prohibits
254 // initializing non-const references from a temporary.
255 // So:
256 // v.writer() << value;
257 // would NOT automagically promote the returned value of v.writer() to
258 // a non-const reference (if you think about it, that's almost always not what
259 // you'd want. see: http://gcc.gnu.org/ml/gcc-help/2006-04/msg00075.html).
260 //
261 // One could consider changing writer() to return a reference, but then it
262 // changes writer() semantics as it can not be a const reference. writer()
263 // currently doesn't modify the original object on which it's called.
Paul Stewartced6a0b2011-11-08 15:32:04 -0800264 writer = v.writer();
265 writer << value;
266 return v;
267}
268
269// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700270::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700271 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700272 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700273 return v;
274}
275
276// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700277::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
278 ::DBus::Variant v;
279 v.writer().append_int16(value);
280 return v;
281}
282
283// static
284::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700285 ::DBus::Variant v;
286 v.writer().append_int32(value);
287 return v;
288}
289
290// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700291::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
292 ::DBus::Variant v;
293 v.writer().append_path(value.c_str());
294 return v;
295}
296
297// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700298::DBus::Variant DBusAdaptor::PathsToVariant(
mukesh agrawal32399322011-09-01 10:53:43 -0700299 const vector< ::DBus::Path> &value) {
300 ::DBus::MessageIter writer;
301 ::DBus::Variant v;
302
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800303 // See note above on why we need to use a local.
mukesh agrawal32399322011-09-01 10:53:43 -0700304 writer = v.writer();
305 writer << value;
306 return v;
307}
308
309// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700310::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700311 ::DBus::Variant v;
312 v.writer().append_string(value.c_str());
313 return v;
314}
315
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700316// static
Chris Masone889666b2011-07-03 12:58:50 -0700317::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700318 ::DBus::Variant v;
319 ::DBus::MessageIter writer = v.writer();
320 writer << value;
321 return v;
322}
323
324// static
Chris Masone889666b2011-07-03 12:58:50 -0700325::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700326 ::DBus::Variant v;
327 ::DBus::MessageIter writer = v.writer();
328 writer << value;
329 return v;
330}
331
332// static
Chris Masone889666b2011-07-03 12:58:50 -0700333::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700334 ::DBus::Variant v;
335 ::DBus::MessageIter writer = v.writer();
336 writer << value;
337 return v;
338}
339
340// static
Darin Petkov63138a92012-02-06 14:09:15 +0100341::DBus::Variant DBusAdaptor::KeyValueStoreToVariant(
342 const KeyValueStore &value) {
Darin Petkov25665aa2012-05-21 14:08:12 +0200343 DBusPropertiesMap props;
344 DBusProperties::ConvertKeyValueStoreToMap(value, &props);
Chris Masone889666b2011-07-03 12:58:50 -0700345 ::DBus::Variant v;
346 ::DBus::MessageIter writer = v.writer();
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500347 writer << props;
Chris Masone889666b2011-07-03 12:58:50 -0700348 return v;
349}
350
351// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700352::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
353 ::DBus::Variant v;
354 v.writer().append_uint16(value);
355 return v;
356}
357
358// static
359::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
360 ::DBus::Variant v;
361 v.writer().append_uint32(value);
362 return v;
363}
364
365// static
Paul Stewarte18c33b2012-07-10 20:48:44 -0700366::DBus::Variant DBusAdaptor::Uint64ToVariant(uint64 value) {
367 ::DBus::Variant v;
368 v.writer().append_uint64(value);
369 return v;
370}
371
372// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700373bool DBusAdaptor::IsBool(::DBus::Signature signature) {
374 return signature == ::DBus::type<bool>::sig();
375}
376
377// static
378bool DBusAdaptor::IsByte(::DBus::Signature signature) {
379 return signature == ::DBus::type<uint8>::sig();
380}
381
382// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800383bool DBusAdaptor::IsByteArrays(::DBus::Signature signature) {
384 return signature == DBusAdaptor::kByteArraysSig;
385}
386
387// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700388bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
389 return signature == ::DBus::type<int16>::sig();
390}
391
392// static
393bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
394 return signature == ::DBus::type<int32>::sig();
395}
396
397// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700398bool DBusAdaptor::IsPath(::DBus::Signature signature) {
399 return signature == ::DBus::type< ::DBus::Path >::sig();
400}
401
402// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700403bool DBusAdaptor::IsPaths(::DBus::Signature signature) {
404 return signature == DBusAdaptor::kPathsSig;
mukesh agrawal32399322011-09-01 10:53:43 -0700405}
406
407// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700408bool DBusAdaptor::IsString(::DBus::Signature signature) {
409 return signature == ::DBus::type<string>::sig();
410}
411
412// static
413bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
414 return signature == DBusAdaptor::kStringmapSig;
415}
416
417// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700418bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
419 return signature == DBusAdaptor::kStringmapsSig;
420}
421
422// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700423bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
424 return signature == DBusAdaptor::kStringsSig;
425}
426
427// static
428bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
429 return signature == ::DBus::type<uint16>::sig();
430}
431
432// static
433bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
434 return signature == ::DBus::type<uint32>::sig();
435}
436
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100437// static
Paul Stewarte18c33b2012-07-10 20:48:44 -0700438bool DBusAdaptor::IsUint64(::DBus::Signature signature) {
439 return signature == ::DBus::type<uint64>::sig();
440}
441
442// static
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500443bool DBusAdaptor::IsKeyValueStore(::DBus::Signature signature) {
444 return signature == ::DBus::type<map<string, ::DBus::Variant> >::sig();
445}
446
Eric Shienbrood9a245532012-03-07 14:20:39 -0500447void DBusAdaptor::DeferReply(const DBus::Tag *tag) {
448 return_later(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100449}
450
Eric Shienbrood9a245532012-03-07 14:20:39 -0500451void DBusAdaptor::ReplyNow(const DBus::Tag *tag) {
452 Continuation *cont = find_continuation(tag);
453 CHECK(cont);
454 return_now(cont);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100455}
456
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800457template <typename T>
458void DBusAdaptor::TypedReplyNow(const DBus::Tag *tag, const T &value) {
459 Continuation *cont = find_continuation(tag);
460 CHECK(cont);
461 cont->writer() << value;
462 return_now(cont);
463}
464
Eric Shienbrood9a245532012-03-07 14:20:39 -0500465void DBusAdaptor::ReplyNowWithError(const DBus::Tag *tag,
466 const DBus::Error &error) {
467 Continuation *cont = find_continuation(tag);
468 CHECK(cont);
469 return_error(cont, error);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100470}
471
Eric Shienbrood9a245532012-03-07 14:20:39 -0500472ResultCallback DBusAdaptor::GetMethodReplyCallback(
473 const DBus::Tag *tag) {
474 return Bind(&DBusAdaptor::MethodReplyCallback, AsWeakPtr(), Owned(tag));
475}
476
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800477ResultStringCallback DBusAdaptor::GetStringMethodReplyCallback(
478 const DBus::Tag *tag) {
479 return Bind(&DBusAdaptor::StringMethodReplyCallback, AsWeakPtr(), Owned(tag));
480}
481
482ResultBoolCallback DBusAdaptor::GetBoolMethodReplyCallback(
483 const DBus::Tag *tag) {
484 return Bind(&DBusAdaptor::BoolMethodReplyCallback, AsWeakPtr(), Owned(tag));
485}
486
487template<typename T>
488void DBusAdaptor::TypedMethodReplyCallback(const DBus::Tag *tag,
489 const Error &error,
490 const T &returned) {
491 if (error.IsFailure()) {
492 DBus::Error dberror;
493 error.ToDBusError(&dberror);
494 ReplyNowWithError(tag, dberror);
495 } else {
496 TypedReplyNow(tag, returned);
497 }
498}
499
Eric Shienbrood9a245532012-03-07 14:20:39 -0500500void DBusAdaptor::ReturnResultOrDefer(const DBus::Tag *tag,
501 const Error &error,
502 DBus::Error *dberror) {
503 if (error.IsOngoing()) {
504 DeferReply(tag);
505 } else if (error.IsFailure()) {
506 error.ToDBusError(dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100507 }
508}
509
Eric Shienbrood9a245532012-03-07 14:20:39 -0500510void DBusAdaptor::MethodReplyCallback(const DBus::Tag *tag,
511 const Error &error) {
512 if (error.IsFailure()) {
513 DBus::Error dberror;
514 error.ToDBusError(&dberror);
515 ReplyNowWithError(tag, dberror);
516 } else {
517 ReplyNow(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100518 }
519}
520
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800521void DBusAdaptor::StringMethodReplyCallback(const DBus::Tag *tag,
522 const Error &error,
523 const string &returned) {
524 TypedMethodReplyCallback(tag, error, returned);
525}
526
527void DBusAdaptor::BoolMethodReplyCallback(const DBus::Tag *tag,
528 const Error &error,
529 bool returned) {
530 TypedMethodReplyCallback(tag, error, returned);
531}
532
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700533} // namespace shill