blob: 2514f9e77c8053044c8b5bc827afd08cec6b857f [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"
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) {
Darin Petkov67d8ecf2011-07-26 16:03:30 -070041 VLOG(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())) {
Chris Masone27c4aa52011-07-02 13:10:14 -070070 VLOG(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);
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050078 else if (DBusAdaptor::IsKeyValueStore(value.signature())) {
79 VLOG(1) << " can't yet handle setting type " << value.signature();
80 e.Populate(Error::kInternalError);
81 } else {
Chris Masone27c4aa52011-07-02 13:10:14 -070082 NOTREACHED() << " unknown type: " << value.signature();
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
90 return e.IsSuccess();
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*/) {
Gaurav Shah1b7a6162011-11-09 11:41:01 -080097 Error e;
Chris Masonea8a2c252011-06-27 22:16:30 -070098 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -080099 ReadablePropertyConstIterator<bool> it = store.GetBoolPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700100 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800101 (*out)[it.Key()] = BoolToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700102 }
103 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800104 ReadablePropertyConstIterator<int16> it = store.GetInt16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700105 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800106 (*out)[it.Key()] = Int16ToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700107 }
108 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800109 ReadablePropertyConstIterator<int32> it = store.GetInt32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700110 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800111 (*out)[it.Key()] = Int32ToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700112 }
113 {
Darin Petkov63138a92012-02-06 14:09:15 +0100114 ReadablePropertyConstIterator<KeyValueStore> it =
115 store.GetKeyValueStorePropertiesIter();
116 for ( ; !it.AtEnd(); it.Advance())
117 (*out)[it.Key()] = KeyValueStoreToVariant(it.Value(&e));
118 }
119 {
mukesh agrawal2366eed2012-03-20 18:21:50 -0700120 ReadablePropertyConstIterator<RpcIdentifiers> it =
121 store.GetRpcIdentifiersPropertiesIter();
122 for ( ; !it.AtEnd(); it.Advance()) {
123 Strings rpc_identifiers_as_strings = it.Value(&e);
124 vector < ::DBus::Path> rpc_identifiers_as_paths;
125 for (Strings::const_iterator in = rpc_identifiers_as_strings.begin();
126 in != rpc_identifiers_as_strings.end();
127 ++in) {
128 rpc_identifiers_as_paths.push_back(*in);
129 }
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();
Chris Masonea8a2c252011-06-27 22:16:30 -0700135 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800136 (*out)[it.Key()] = StringToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700137 }
138 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800139 ReadablePropertyConstIterator<Stringmap> it =
140 store.GetStringmapPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700141 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800142 (*out)[it.Key()]= StringmapToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700143 }
144 {
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400145 ReadablePropertyConstIterator<Stringmaps> it =
146 store.GetStringmapsPropertiesIter();
147 for ( ; !it.AtEnd(); it.Advance())
148 (*out)[it.Key()]= StringmapsToVariant(it.Value(&e));
149 }
150 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800151 ReadablePropertyConstIterator<Strings> it =
152 store.GetStringsPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700153 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800154 (*out)[it.Key()] = StringsToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700155 }
156 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800157 ReadablePropertyConstIterator<uint8> it = store.GetUint8PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700158 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800159 (*out)[it.Key()] = ByteToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700160 }
161 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800162 ReadablePropertyConstIterator<uint16> it = store.GetUint16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700163 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800164 (*out)[it.Key()] = Uint16ToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700165 }
166 {
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800167 ReadablePropertyConstIterator<uint32> it = store.GetUint32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700168 for ( ; !it.AtEnd(); it.Advance())
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800169 (*out)[it.Key()] = Uint32ToVariant(it.Value(&e));
Chris Masonea8a2c252011-06-27 22:16:30 -0700170 }
Jason Glasgowacdc11f2012-03-30 14:12:22 -0400171 {
172 ReadablePropertyConstIterator<RpcIdentifier> it =
173 store.GetRpcIdentifierPropertiesIter();
174 for ( ; !it.AtEnd(); it.Advance()) {
175 (*out)[it.Key()] = PathToVariant(it.Value(&e));
176 }
177 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700178 return true;
179}
180
181// static
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800182bool DBusAdaptor::ClearProperty(PropertyStore *store,
183 const string &name,
184 ::DBus::Error *error) {
185 Error e;
186 store->ClearProperty(name, &e);
187
188 if (error != NULL) {
189 e.ToDBusError(error);
190 }
191
192 return e.IsSuccess();
193}
194
195// static
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700196void DBusAdaptor::ArgsToKeyValueStore(
197 const map<string, ::DBus::Variant> &args,
198 KeyValueStore *out,
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800199 Error *error) { // TODO(quiche): Should be ::DBus::Error?
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700200 for (map<string, ::DBus::Variant>::const_iterator it = args.begin();
201 it != args.end();
202 ++it) {
203 DBus::type<string> string_type;
204 DBus::type<bool> bool_type;
205
206 if (it->second.signature() == string_type.sig()) {
207 out->SetString(it->first, it->second.reader().get_string());
208 } else if (it->second.signature() == bool_type.sig()) {
209 out->SetBool(it->first, it->second.reader().get_bool());
210 } else {
211 error->Populate(Error::kInternalError);
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800212 return; // Skip remaining args after error.
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700213 }
214 }
215}
216
217// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700218::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
219 ::DBus::Variant v;
220 v.writer().append_bool(value);
221 return v;
222}
223
224// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800225::DBus::Variant DBusAdaptor::ByteArraysToVariant(const ByteArrays &value) {
226 ::DBus::MessageIter writer;
227 ::DBus::Variant v;
228
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800229
230 // We have to use a local because the operator<< needs a reference
231 // to work on (the lhs) but writer() returns by-value. C++ prohibits
232 // initializing non-const references from a temporary.
233 // So:
234 // v.writer() << value;
235 // would NOT automagically promote the returned value of v.writer() to
236 // a non-const reference (if you think about it, that's almost always not what
237 // you'd want. see: http://gcc.gnu.org/ml/gcc-help/2006-04/msg00075.html).
238 //
239 // One could consider changing writer() to return a reference, but then it
240 // changes writer() semantics as it can not be a const reference. writer()
241 // currently doesn't modify the original object on which it's called.
Paul Stewartced6a0b2011-11-08 15:32:04 -0800242 writer = v.writer();
243 writer << value;
244 return v;
245}
246
247// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700248::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700249 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700250 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700251 return v;
252}
253
254// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700255::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
256 ::DBus::Variant v;
257 v.writer().append_int16(value);
258 return v;
259}
260
261// static
262::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700263 ::DBus::Variant v;
264 v.writer().append_int32(value);
265 return v;
266}
267
268// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700269::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
270 ::DBus::Variant v;
271 v.writer().append_path(value.c_str());
272 return v;
273}
274
275// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700276::DBus::Variant DBusAdaptor::PathsToVariant(
mukesh agrawal32399322011-09-01 10:53:43 -0700277 const vector< ::DBus::Path> &value) {
278 ::DBus::MessageIter writer;
279 ::DBus::Variant v;
280
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800281 // See note above on why we need to use a local.
mukesh agrawal32399322011-09-01 10:53:43 -0700282 writer = v.writer();
283 writer << value;
284 return v;
285}
286
287// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700288::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700289 ::DBus::Variant v;
290 v.writer().append_string(value.c_str());
291 return v;
292}
293
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700294// static
Chris Masone889666b2011-07-03 12:58:50 -0700295::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700296 ::DBus::Variant v;
297 ::DBus::MessageIter writer = v.writer();
298 writer << value;
299 return v;
300}
301
302// static
Chris Masone889666b2011-07-03 12:58:50 -0700303::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700304 ::DBus::Variant v;
305 ::DBus::MessageIter writer = v.writer();
306 writer << value;
307 return v;
308}
309
310// static
Chris Masone889666b2011-07-03 12:58:50 -0700311::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700312 ::DBus::Variant v;
313 ::DBus::MessageIter writer = v.writer();
314 writer << value;
315 return v;
316}
317
318// static
Darin Petkov63138a92012-02-06 14:09:15 +0100319::DBus::Variant DBusAdaptor::KeyValueStoreToVariant(
320 const KeyValueStore &value) {
Chris Masone889666b2011-07-03 12:58:50 -0700321 ::DBus::Variant v;
322 ::DBus::MessageIter writer = v.writer();
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500323 map<string, ::DBus::Variant> props;
324 {
325 map<string, string>::const_iterator it;
326 for (it = value.string_properties().begin();
327 it != value.string_properties().end();
328 ++it) {
329 ::DBus::Variant vv;
330 ::DBus::MessageIter writer = vv.writer();
331 writer.append_string(it->second.c_str());
332 props[it->first] = vv;
333 }
334 }
335 {
336 map<string, bool>::const_iterator it;
337 for (it = value.bool_properties().begin();
338 it != value.bool_properties().end();
339 ++it) {
340 ::DBus::Variant vv;
341 ::DBus::MessageIter writer = vv.writer();
342 writer.append_bool(it->second);
343 props[it->first] = vv;
344 }
345 }
346 {
347 map<string, uint32>::const_iterator it;
348 for (it = value.uint_properties().begin();
349 it != value.uint_properties().end();
350 ++it) {
351 ::DBus::Variant vv;
352 ::DBus::MessageIter writer = vv.writer();
353 writer.append_uint32(it->second);
354 props[it->first] = vv;
355 }
356 }
357 writer << props;
Chris Masone889666b2011-07-03 12:58:50 -0700358 return v;
359}
360
361// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700362::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
363 ::DBus::Variant v;
364 v.writer().append_uint16(value);
365 return v;
366}
367
368// static
369::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
370 ::DBus::Variant v;
371 v.writer().append_uint32(value);
372 return v;
373}
374
375// static
376bool DBusAdaptor::IsBool(::DBus::Signature signature) {
377 return signature == ::DBus::type<bool>::sig();
378}
379
380// static
381bool DBusAdaptor::IsByte(::DBus::Signature signature) {
382 return signature == ::DBus::type<uint8>::sig();
383}
384
385// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800386bool DBusAdaptor::IsByteArrays(::DBus::Signature signature) {
387 return signature == DBusAdaptor::kByteArraysSig;
388}
389
390// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700391bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
392 return signature == ::DBus::type<int16>::sig();
393}
394
395// static
396bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
397 return signature == ::DBus::type<int32>::sig();
398}
399
400// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700401bool DBusAdaptor::IsPath(::DBus::Signature signature) {
402 return signature == ::DBus::type< ::DBus::Path >::sig();
403}
404
405// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700406bool DBusAdaptor::IsPaths(::DBus::Signature signature) {
407 return signature == DBusAdaptor::kPathsSig;
mukesh agrawal32399322011-09-01 10:53:43 -0700408}
409
410// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700411bool DBusAdaptor::IsString(::DBus::Signature signature) {
412 return signature == ::DBus::type<string>::sig();
413}
414
415// static
416bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
417 return signature == DBusAdaptor::kStringmapSig;
418}
419
420// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700421bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
422 return signature == DBusAdaptor::kStringmapsSig;
423}
424
425// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700426bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
427 return signature == DBusAdaptor::kStringsSig;
428}
429
430// static
431bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
432 return signature == ::DBus::type<uint16>::sig();
433}
434
435// static
436bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
437 return signature == ::DBus::type<uint32>::sig();
438}
439
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100440// static
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500441bool DBusAdaptor::IsKeyValueStore(::DBus::Signature signature) {
442 return signature == ::DBus::type<map<string, ::DBus::Variant> >::sig();
443}
444
Eric Shienbrood9a245532012-03-07 14:20:39 -0500445void DBusAdaptor::DeferReply(const DBus::Tag *tag) {
446 return_later(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100447}
448
Eric Shienbrood9a245532012-03-07 14:20:39 -0500449void DBusAdaptor::ReplyNow(const DBus::Tag *tag) {
450 Continuation *cont = find_continuation(tag);
451 CHECK(cont);
452 return_now(cont);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100453}
454
Eric Shienbrood9a245532012-03-07 14:20:39 -0500455void DBusAdaptor::ReplyNowWithError(const DBus::Tag *tag,
456 const DBus::Error &error) {
457 Continuation *cont = find_continuation(tag);
458 CHECK(cont);
459 return_error(cont, error);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100460}
461
Eric Shienbrood9a245532012-03-07 14:20:39 -0500462ResultCallback DBusAdaptor::GetMethodReplyCallback(
463 const DBus::Tag *tag) {
464 return Bind(&DBusAdaptor::MethodReplyCallback, AsWeakPtr(), Owned(tag));
465}
466
467void DBusAdaptor::ReturnResultOrDefer(const DBus::Tag *tag,
468 const Error &error,
469 DBus::Error *dberror) {
470 if (error.IsOngoing()) {
471 DeferReply(tag);
472 } else if (error.IsFailure()) {
473 error.ToDBusError(dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100474 }
475}
476
Eric Shienbrood9a245532012-03-07 14:20:39 -0500477void DBusAdaptor::MethodReplyCallback(const DBus::Tag *tag,
478 const Error &error) {
479 if (error.IsFailure()) {
480 DBus::Error dberror;
481 error.ToDBusError(&dberror);
482 ReplyNowWithError(tag, dberror);
483 } else {
484 ReplyNow(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100485 }
486}
487
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700488} // namespace shill