blob: 3873c6fac0a9d542d8e385c99720abb71be19ca0 [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 }
171 return true;
172}
173
174// static
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800175bool DBusAdaptor::ClearProperty(PropertyStore *store,
176 const string &name,
177 ::DBus::Error *error) {
178 Error e;
179 store->ClearProperty(name, &e);
180
181 if (error != NULL) {
182 e.ToDBusError(error);
183 }
184
185 return e.IsSuccess();
186}
187
188// static
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700189void DBusAdaptor::ArgsToKeyValueStore(
190 const map<string, ::DBus::Variant> &args,
191 KeyValueStore *out,
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800192 Error *error) { // TODO(quiche): Should be ::DBus::Error?
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700193 for (map<string, ::DBus::Variant>::const_iterator it = args.begin();
194 it != args.end();
195 ++it) {
196 DBus::type<string> string_type;
197 DBus::type<bool> bool_type;
198
199 if (it->second.signature() == string_type.sig()) {
200 out->SetString(it->first, it->second.reader().get_string());
201 } else if (it->second.signature() == bool_type.sig()) {
202 out->SetBool(it->first, it->second.reader().get_bool());
203 } else {
204 error->Populate(Error::kInternalError);
Gaurav Shah1b7a6162011-11-09 11:41:01 -0800205 return; // Skip remaining args after error.
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700206 }
207 }
208}
209
210// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700211::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
212 ::DBus::Variant v;
213 v.writer().append_bool(value);
214 return v;
215}
216
217// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800218::DBus::Variant DBusAdaptor::ByteArraysToVariant(const ByteArrays &value) {
219 ::DBus::MessageIter writer;
220 ::DBus::Variant v;
221
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800222
223 // We have to use a local because the operator<< needs a reference
224 // to work on (the lhs) but writer() returns by-value. C++ prohibits
225 // initializing non-const references from a temporary.
226 // So:
227 // v.writer() << value;
228 // would NOT automagically promote the returned value of v.writer() to
229 // a non-const reference (if you think about it, that's almost always not what
230 // you'd want. see: http://gcc.gnu.org/ml/gcc-help/2006-04/msg00075.html).
231 //
232 // One could consider changing writer() to return a reference, but then it
233 // changes writer() semantics as it can not be a const reference. writer()
234 // currently doesn't modify the original object on which it's called.
Paul Stewartced6a0b2011-11-08 15:32:04 -0800235 writer = v.writer();
236 writer << value;
237 return v;
238}
239
240// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700241::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700242 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700243 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700244 return v;
245}
246
247// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700248::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
249 ::DBus::Variant v;
250 v.writer().append_int16(value);
251 return v;
252}
253
254// static
255::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700256 ::DBus::Variant v;
257 v.writer().append_int32(value);
258 return v;
259}
260
261// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700262::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
263 ::DBus::Variant v;
264 v.writer().append_path(value.c_str());
265 return v;
266}
267
268// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700269::DBus::Variant DBusAdaptor::PathsToVariant(
mukesh agrawal32399322011-09-01 10:53:43 -0700270 const vector< ::DBus::Path> &value) {
271 ::DBus::MessageIter writer;
272 ::DBus::Variant v;
273
Gaurav Shah7ad8e532011-11-11 17:14:49 -0800274 // See note above on why we need to use a local.
mukesh agrawal32399322011-09-01 10:53:43 -0700275 writer = v.writer();
276 writer << value;
277 return v;
278}
279
280// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700281::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700282 ::DBus::Variant v;
283 v.writer().append_string(value.c_str());
284 return v;
285}
286
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700287// static
Chris Masone889666b2011-07-03 12:58:50 -0700288::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700289 ::DBus::Variant v;
290 ::DBus::MessageIter writer = v.writer();
291 writer << value;
292 return v;
293}
294
295// static
Chris Masone889666b2011-07-03 12:58:50 -0700296::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700297 ::DBus::Variant v;
298 ::DBus::MessageIter writer = v.writer();
299 writer << value;
300 return v;
301}
302
303// static
Chris Masone889666b2011-07-03 12:58:50 -0700304::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700305 ::DBus::Variant v;
306 ::DBus::MessageIter writer = v.writer();
307 writer << value;
308 return v;
309}
310
311// static
Darin Petkov63138a92012-02-06 14:09:15 +0100312::DBus::Variant DBusAdaptor::KeyValueStoreToVariant(
313 const KeyValueStore &value) {
Chris Masone889666b2011-07-03 12:58:50 -0700314 ::DBus::Variant v;
315 ::DBus::MessageIter writer = v.writer();
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500316 map<string, ::DBus::Variant> props;
317 {
318 map<string, string>::const_iterator it;
319 for (it = value.string_properties().begin();
320 it != value.string_properties().end();
321 ++it) {
322 ::DBus::Variant vv;
323 ::DBus::MessageIter writer = vv.writer();
324 writer.append_string(it->second.c_str());
325 props[it->first] = vv;
326 }
327 }
328 {
329 map<string, bool>::const_iterator it;
330 for (it = value.bool_properties().begin();
331 it != value.bool_properties().end();
332 ++it) {
333 ::DBus::Variant vv;
334 ::DBus::MessageIter writer = vv.writer();
335 writer.append_bool(it->second);
336 props[it->first] = vv;
337 }
338 }
339 {
340 map<string, uint32>::const_iterator it;
341 for (it = value.uint_properties().begin();
342 it != value.uint_properties().end();
343 ++it) {
344 ::DBus::Variant vv;
345 ::DBus::MessageIter writer = vv.writer();
346 writer.append_uint32(it->second);
347 props[it->first] = vv;
348 }
349 }
350 writer << props;
Chris Masone889666b2011-07-03 12:58:50 -0700351 return v;
352}
353
354// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700355::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
356 ::DBus::Variant v;
357 v.writer().append_uint16(value);
358 return v;
359}
360
361// static
362::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
363 ::DBus::Variant v;
364 v.writer().append_uint32(value);
365 return v;
366}
367
368// static
369bool DBusAdaptor::IsBool(::DBus::Signature signature) {
370 return signature == ::DBus::type<bool>::sig();
371}
372
373// static
374bool DBusAdaptor::IsByte(::DBus::Signature signature) {
375 return signature == ::DBus::type<uint8>::sig();
376}
377
378// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800379bool DBusAdaptor::IsByteArrays(::DBus::Signature signature) {
380 return signature == DBusAdaptor::kByteArraysSig;
381}
382
383// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700384bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
385 return signature == ::DBus::type<int16>::sig();
386}
387
388// static
389bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
390 return signature == ::DBus::type<int32>::sig();
391}
392
393// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700394bool DBusAdaptor::IsPath(::DBus::Signature signature) {
395 return signature == ::DBus::type< ::DBus::Path >::sig();
396}
397
398// static
mukesh agrawal2366eed2012-03-20 18:21:50 -0700399bool DBusAdaptor::IsPaths(::DBus::Signature signature) {
400 return signature == DBusAdaptor::kPathsSig;
mukesh agrawal32399322011-09-01 10:53:43 -0700401}
402
403// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700404bool DBusAdaptor::IsString(::DBus::Signature signature) {
405 return signature == ::DBus::type<string>::sig();
406}
407
408// static
409bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
410 return signature == DBusAdaptor::kStringmapSig;
411}
412
413// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700414bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
415 return signature == DBusAdaptor::kStringmapsSig;
416}
417
418// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700419bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
420 return signature == DBusAdaptor::kStringsSig;
421}
422
423// static
424bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
425 return signature == ::DBus::type<uint16>::sig();
426}
427
428// static
429bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
430 return signature == ::DBus::type<uint32>::sig();
431}
432
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100433// static
Eric Shienbroodb23d4b92012-02-16 12:32:42 -0500434bool DBusAdaptor::IsKeyValueStore(::DBus::Signature signature) {
435 return signature == ::DBus::type<map<string, ::DBus::Variant> >::sig();
436}
437
Eric Shienbrood9a245532012-03-07 14:20:39 -0500438void DBusAdaptor::DeferReply(const DBus::Tag *tag) {
439 return_later(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100440}
441
Eric Shienbrood9a245532012-03-07 14:20:39 -0500442void DBusAdaptor::ReplyNow(const DBus::Tag *tag) {
443 Continuation *cont = find_continuation(tag);
444 CHECK(cont);
445 return_now(cont);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100446}
447
Eric Shienbrood9a245532012-03-07 14:20:39 -0500448void DBusAdaptor::ReplyNowWithError(const DBus::Tag *tag,
449 const DBus::Error &error) {
450 Continuation *cont = find_continuation(tag);
451 CHECK(cont);
452 return_error(cont, error);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100453}
454
Eric Shienbrood9a245532012-03-07 14:20:39 -0500455ResultCallback DBusAdaptor::GetMethodReplyCallback(
456 const DBus::Tag *tag) {
457 return Bind(&DBusAdaptor::MethodReplyCallback, AsWeakPtr(), Owned(tag));
458}
459
460void DBusAdaptor::ReturnResultOrDefer(const DBus::Tag *tag,
461 const Error &error,
462 DBus::Error *dberror) {
463 if (error.IsOngoing()) {
464 DeferReply(tag);
465 } else if (error.IsFailure()) {
466 error.ToDBusError(dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100467 }
468}
469
Eric Shienbrood9a245532012-03-07 14:20:39 -0500470void DBusAdaptor::MethodReplyCallback(const DBus::Tag *tag,
471 const Error &error) {
472 if (error.IsFailure()) {
473 DBus::Error dberror;
474 error.ToDBusError(&dberror);
475 ReplyNowWithError(tag, dberror);
476 } else {
477 ReplyNow(tag);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100478 }
479}
480
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700481} // namespace shill