blob: f5bdaa0495b86b08bf95d28d9ac37bf37f275fd1 [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 Masone8fe2c7e2011-06-09 15:51:19 -070011#include <base/logging.h>
Chris Masoned0ceb8c2011-06-02 10:05:39 -070012#include <dbus-c++/dbus.h>
13
Chris Masone889666b2011-07-03 12:58:50 -070014#include "shill/accessor_interface.h"
Chris Masoned0ceb8c2011-06-02 10:05:39 -070015#include "shill/dbus_adaptor.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"
Chris Masoneb925cc82011-06-22 15:39:57 -070018#include "shill/property_store.h"
Ben Chanfad4a0b2012-04-18 15:49:59 -070019#include "shill/scope_logger.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
Chris Masone8fe2c7e2011-06-09 15:51:19 -070029// static
Paul Stewartced6a0b2011-11-08 15:32:04 -080030const char DBusAdaptor::kByteArraysSig[] = "aay";
31// static
mukesh agrawal2366eed2012-03-20 18:21:50 -070032const char DBusAdaptor::kPathsSig[] = "ao";
mukesh agrawal32399322011-09-01 10:53:43 -070033// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070034const char DBusAdaptor::kStringmapSig[] = "a{ss}";
35// static
Chris Masone27c4aa52011-07-02 13:10:14 -070036const char DBusAdaptor::kStringmapsSig[] = "aa{ss}";
37// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070038const char DBusAdaptor::kStringsSig[] = "as";
39
40DBusAdaptor::DBusAdaptor(DBus::Connection* conn, const string &object_path)
Chris Masoned0ceb8c2011-06-02 10:05:39 -070041 : DBus::ObjectAdaptor(*conn, object_path) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070042 SLOG(DBus, 2) << "DBusAdaptor: " << object_path;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070043}
44
45DBusAdaptor::~DBusAdaptor() {}
46
47// static
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080048bool DBusAdaptor::SetProperty(PropertyStore *store,
49 const string &name,
50 const ::DBus::Variant &value,
51 ::DBus::Error *error) {
mukesh agrawalffa3d042011-10-06 15:26:10 -070052 Error e;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070053
54 if (DBusAdaptor::IsBool(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070055 store->SetBoolProperty(name, value.reader().get_bool(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070056 else if (DBusAdaptor::IsByte(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070057 store->SetUint8Property(name, value.reader().get_byte(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070058 else if (DBusAdaptor::IsInt16(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070059 store->SetInt16Property(name, value.reader().get_int16(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070060 else if (DBusAdaptor::IsInt32(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070061 store->SetInt32Property(name, value.reader().get_int32(), &e);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070062 else if (DBusAdaptor::IsPath(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070063 store->SetStringProperty(name, value.reader().get_path(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070064 else if (DBusAdaptor::IsString(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070065 store->SetStringProperty(name, value.reader().get_string(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070066 else if (DBusAdaptor::IsStringmap(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070067 store->SetStringmapProperty(name,
68 value.operator map<string, string>(),
69 &e);
70 else if (DBusAdaptor::IsStringmaps(value.signature())) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070071 SLOG(DBus, 1) << " can't yet handle setting type " << value.signature();
mukesh agrawalffa3d042011-10-06 15:26:10 -070072 e.Populate(Error::kInternalError);
73 } else if (DBusAdaptor::IsStrings(value.signature()))
74 store->SetStringsProperty(name, value.operator vector<string>(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070075 else if (DBusAdaptor::IsUint16(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070076 store->SetUint16Property(name, value.reader().get_uint16(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070077 else if (DBusAdaptor::IsUint32(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070078 store->SetUint32Property(name, value.reader().get_uint32(), &e);
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050079 else if (DBusAdaptor::IsKeyValueStore(value.signature())) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070080 SLOG(DBus, 1) << " can't yet handle setting type " << value.signature();
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050081 e.Populate(Error::kInternalError);
82 } else {
Chris Masone27c4aa52011-07-02 13:10:14 -070083 NOTREACHED() << " unknown type: " << value.signature();
mukesh agrawalffa3d042011-10-06 15:26:10 -070084 e.Populate(Error::kInternalError);
Chris Masone27c4aa52011-07-02 13:10:14 -070085 }
mukesh agrawalffa3d042011-10-06 15:26:10 -070086
87 if (error != NULL) {
88 e.ToDBusError(error);
89 }
90
91 return e.IsSuccess();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070092}
93
94// static
mukesh agrawalde29fa82011-09-16 16:16:36 -070095bool DBusAdaptor::GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -070096 map<string, ::DBus::Variant> *out,
mukesh agrawal1830fa12011-09-26 14:31:40 -070097 ::DBus::Error */*error*/) {
Gaurav Shah1b7a6162011-11-09 11:41:01 -080098 Error e;
Chris Masonea8a2c252011-06-27 22:16:30 -070099 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800100 ReadablePropertyConstIterator<bool> it = store.GetBoolPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700101 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800102 (*out)[it.Key()] = BoolToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700103 }
104 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800105 ReadablePropertyConstIterator<int16> it = store.GetInt16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700106 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800107 (*out)[it.Key()] = Int16ToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700108 }
109 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800110 ReadablePropertyConstIterator<int32> it = store.GetInt32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700111 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800112 (*out)[it.Key()] = Int32ToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700113 }
114 {
Darin Petkov63138a92012-02-06 14:09:15 +0100115 ReadablePropertyConstIterator<KeyValueStore> it =
116 store.GetKeyValueStorePropertiesIter();
117 for ( ; !it.AtEnd(); it.Advance())
118 (*out)[it.Key()] = KeyValueStoreToVariant(it.Value(&e));
119 }
120 {
mukesh agrawal2366eed2012-03-20 18:21:50 -0700121 ReadablePropertyConstIterator<RpcIdentifiers> it =
122 store.GetRpcIdentifiersPropertiesIter();
123 for ( ; !it.AtEnd(); it.Advance()) {
124 Strings rpc_identifiers_as_strings = it.Value(&e);
125 vector < ::DBus::Path> rpc_identifiers_as_paths;
126 for (Strings::const_iterator in = rpc_identifiers_as_strings.begin();
127 in != rpc_identifiers_as_strings.end();
128 ++in) {
129 rpc_identifiers_as_paths.push_back(*in);
130 }
131 (*out)[it.Key()] = PathsToVariant(rpc_identifiers_as_paths);
132 }
133 }
134 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800135 ReadablePropertyConstIterator<string> it = store.GetStringPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700136 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800137 (*out)[it.Key()] = StringToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700138 }
139 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800140 ReadablePropertyConstIterator<Stringmap> it =
141 store.GetStringmapPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700142 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800143 (*out)[it.Key()]= StringmapToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700144 }
145 {
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400146 ReadablePropertyConstIterator<Stringmaps> it =
147 store.GetStringmapsPropertiesIter();
148 for ( ; !it.AtEnd(); it.Advance())
149 (*out)[it.Key()]= StringmapsToVariant(it.Value(&e));
150 }
151 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800152 ReadablePropertyConstIterator<Strings> it =
153 store.GetStringsPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700154 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800155 (*out)[it.Key()] = StringsToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700156 }
157 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800158 ReadablePropertyConstIterator<uint8> it = store.GetUint8PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700159 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800160 (*out)[it.Key()] = ByteToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700161 }
162 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800163 ReadablePropertyConstIterator<uint16> it = store.GetUint16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700164 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800165 (*out)[it.Key()] = Uint16ToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700166 }
167 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800168 ReadablePropertyConstIterator<uint32> it = store.GetUint32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700169 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800170 (*out)[it.Key()] = Uint32ToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700171 }
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400172 {
173 ReadablePropertyConstIterator<RpcIdentifier> it =
174 store.GetRpcIdentifierPropertiesIter();
175 for ( ; !it.AtEnd(); it.Advance()) {
176 (*out)[it.Key()] = PathToVariant(it.Value(&e));
177 }
178 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700179 return true;
180}
181
182// static
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800183bool DBusAdaptor::ClearProperty(PropertyStore *store,
184 const string &name,
185 ::DBus::Error *error) {
186 Error e;
187 store->ClearProperty(name, &e);
188
189 if (error != NULL) {
190 e.ToDBusError(error);
191 }
192
193 return e.IsSuccess();
194}
195
196// static
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700197void DBusAdaptor::ArgsToKeyValueStore(
198 const map<string, ::DBus::Variant> &args,
199 KeyValueStore *out,
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800200 Error *error) { // TODO(quiche): Should be ::DBus::Error?
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700201 for (map<string, ::DBus::Variant>::const_iterator it = args.begin();
202 it != args.end();
203 ++it) {
mukesh agrawal06175d72012-04-23 16:46:01 -0700204 string key = it->first;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700205 DBus::type<string> string_type;
206 DBus::type<bool> bool_type;
207
208 if (it->second.signature() == string_type.sig()) {
mukesh agrawal06175d72012-04-23 16:46:01 -0700209 SLOG(DBus, 5) << "Got string property " << key;
210 out->SetString(key, it->second.reader().get_string());
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700211 } else if (it->second.signature() == bool_type.sig()) {
mukesh agrawal06175d72012-04-23 16:46:01 -0700212 SLOG(DBus, 5) << "Got bool property " << key;
213 out->SetBool(key, it->second.reader().get_bool());
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700214 } else {
mukesh agrawal06175d72012-04-23 16:46:01 -0700215 Error::PopulateAndLog(error, Error::kInternalError,
216 "unsupported type for property " + key);
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800217 return; // Skip remaining args after error.
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700218 }
219 }
220}
221
222// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700223::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
224 ::DBus::Variant v;
225 v.writer().append_bool(value);
226 return v;
227}
228
229// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800230::DBus::Variant DBusAdaptor::ByteArraysToVariant(const ByteArrays &value) {
231 ::DBus::MessageIter writer;
232 ::DBus::Variant v;
233
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800234
235 // We have to use a local because the operator<< needs a reference
236 // to work on (the lhs) but writer() returns by-value. C++ prohibits
237 // initializing non-const references from a temporary.
238 // So:
239 // v.writer() << value;
240 // would NOT automagically promote the returned value of v.writer() to
241 // a non-const reference (if you think about it, that's almost always not what
242 // you'd want. see: http://gcc.gnu.org/ml/gcc-help/2006-04/msg00075.html).
243 //
244 // One could consider changing writer() to return a reference, but then it
245 // changes writer() semantics as it can not be a const reference. writer()
246 // currently doesn't modify the original object on which it's called.
Paul Stewartced6a0b2011-11-08 15:32:04 -0800247 writer = v.writer();
248 writer << value;
249 return v;
250}
251
252// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700253::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700254 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700255 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700256 return v;
257}
258
259// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700260::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
261 ::DBus::Variant v;
262 v.writer().append_int16(value);
263 return v;
264}
265
266// static
267::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700268 ::DBus::Variant v;
269 v.writer().append_int32(value);
270 return v;
271}
272
273// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700274::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
275 ::DBus::Variant v;
276 v.writer().append_path(value.c_str());
277 return v;
278}
279
280// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700281::DBus::Variant DBusAdaptor::PathsToVariant(
mukesh agrawal32399322011-09-01 10:53:43 -0700282 const vector< ::DBus::Path> &value) {
283 ::DBus::MessageIter writer;
284 ::DBus::Variant v;
285
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800286 // See note above on why we need to use a local.
mukesh agrawal32399322011-09-01 10:53:43 -0700287 writer = v.writer();
288 writer << value;
289 return v;
290}
291
292// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700293::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700294 ::DBus::Variant v;
295 v.writer().append_string(value.c_str());
296 return v;
297}
298
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700299// static
Chris Masone889666b2011-07-03 12:58:50 -0700300::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700301 ::DBus::Variant v;
302 ::DBus::MessageIter writer = v.writer();
303 writer << value;
304 return v;
305}
306
307// static
Chris Masone889666b2011-07-03 12:58:50 -0700308::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700309 ::DBus::Variant v;
310 ::DBus::MessageIter writer = v.writer();
311 writer << value;
312 return v;
313}
314
315// static
Chris Masone889666b2011-07-03 12:58:50 -0700316::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700317 ::DBus::Variant v;
318 ::DBus::MessageIter writer = v.writer();
319 writer << value;
320 return v;
321}
322
323// static
Darin Petkov63138a92012-02-06 14:09:15 +0100324::DBus::Variant DBusAdaptor::KeyValueStoreToVariant(
325 const KeyValueStore &value) {
Chris Masone889666b2011-07-03 12:58:50 -0700326 ::DBus::Variant v;
327 ::DBus::MessageIter writer = v.writer();
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500328 map<string, ::DBus::Variant> props;
329 {
330 map<string, string>::const_iterator it;
331 for (it = value.string_properties().begin();
332 it != value.string_properties().end();
333 ++it) {
334 ::DBus::Variant vv;
335 ::DBus::MessageIter writer = vv.writer();
336 writer.append_string(it->second.c_str());
337 props[it->first] = vv;
338 }
339 }
340 {
341 map<string, bool>::const_iterator it;
342 for (it = value.bool_properties().begin();
343 it != value.bool_properties().end();
344 ++it) {
345 ::DBus::Variant vv;
346 ::DBus::MessageIter writer = vv.writer();
347 writer.append_bool(it->second);
348 props[it->first] = vv;
349 }
350 }
351 {
352 map<string, uint32>::const_iterator it;
353 for (it = value.uint_properties().begin();
354 it != value.uint_properties().end();
355 ++it) {
356 ::DBus::Variant vv;
357 ::DBus::MessageIter writer = vv.writer();
358 writer.append_uint32(it->second);
359 props[it->first] = vv;
360 }
361 }
362 writer << props;
Chris Masone889666b2011-07-03 12:58:50 -0700363 return v;
364}
365
366// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700367::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
368 ::DBus::Variant v;
369 v.writer().append_uint16(value);
370 return v;
371}
372
373// static
374::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
375 ::DBus::Variant v;
376 v.writer().append_uint32(value);
377 return v;
378}
379
380// static
381bool DBusAdaptor::IsBool(::DBus::Signature signature) {
382 return signature == ::DBus::type<bool>::sig();
383}
384
385// static
386bool DBusAdaptor::IsByte(::DBus::Signature signature) {
387 return signature == ::DBus::type<uint8>::sig();
388}
389
390// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800391bool DBusAdaptor::IsByteArrays(::DBus::Signature signature) {
392 return signature == DBusAdaptor::kByteArraysSig;
393}
394
395// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700396bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
397 return signature == ::DBus::type<int16>::sig();
398}
399
400// static
401bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
402 return signature == ::DBus::type<int32>::sig();
403}
404
405// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700406bool DBusAdaptor::IsPath(::DBus::Signature signature) {
407 return signature == ::DBus::type< ::DBus::Path >::sig();
408}
409
410// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700411bool DBusAdaptor::IsPaths(::DBus::Signature signature) {
412 return signature == DBusAdaptor::kPathsSig;
mukesh agrawal32399322011-09-01 10:53:43 -0700413}
414
415// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700416bool DBusAdaptor::IsString(::DBus::Signature signature) {
417 return signature == ::DBus::type<string>::sig();
418}
419
420// static
421bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
422 return signature == DBusAdaptor::kStringmapSig;
423}
424
425// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700426bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
427 return signature == DBusAdaptor::kStringmapsSig;
428}
429
430// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700431bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
432 return signature == DBusAdaptor::kStringsSig;
433}
434
435// static
436bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
437 return signature == ::DBus::type<uint16>::sig();
438}
439
440// static
441bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
442 return signature == ::DBus::type<uint32>::sig();
443}
444
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100445// static
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500446bool DBusAdaptor::IsKeyValueStore(::DBus::Signature signature) {
447 return signature == ::DBus::type<map<string, ::DBus::Variant> >::sig();
448}
449
Eric Shienbrood9a245532012-03-07 14:20:39 -0500450void DBusAdaptor::DeferReply(const DBus::Tag *tag) {
451 return_later(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100452}
453
Eric Shienbrood9a245532012-03-07 14:20:39 -0500454void DBusAdaptor::ReplyNow(const DBus::Tag *tag) {
455 Continuation *cont = find_continuation(tag);
456 CHECK(cont);
457 return_now(cont);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100458}
459
Eric Shienbrood9a245532012-03-07 14:20:39 -0500460void DBusAdaptor::ReplyNowWithError(const DBus::Tag *tag,
461 const DBus::Error &error) {
462 Continuation *cont = find_continuation(tag);
463 CHECK(cont);
464 return_error(cont, error);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100465}
466
Eric Shienbrood9a245532012-03-07 14:20:39 -0500467ResultCallback DBusAdaptor::GetMethodReplyCallback(
468 const DBus::Tag *tag) {
469 return Bind(&DBusAdaptor::MethodReplyCallback, AsWeakPtr(), Owned(tag));
470}
471
472void DBusAdaptor::ReturnResultOrDefer(const DBus::Tag *tag,
473 const Error &error,
474 DBus::Error *dberror) {
475 if (error.IsOngoing()) {
476 DeferReply(tag);
477 } else if (error.IsFailure()) {
478 error.ToDBusError(dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100479 }
480}
481
Eric Shienbrood9a245532012-03-07 14:20:39 -0500482void DBusAdaptor::MethodReplyCallback(const DBus::Tag *tag,
483 const Error &error) {
484 if (error.IsFailure()) {
485 DBus::Error dberror;
486 error.ToDBusError(&dberror);
487 ReplyNowWithError(tag, dberror);
488 } else {
489 ReplyNow(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100490 }
491}
492
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700493} // namespace shill