blob: cf98f8f39f14c3854e3d60f40b9c14c4582efa0a [file] [log] [blame]
Chris Masoned0ceb8c2011-06-02 10:05:39 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// 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
Chris Masone8fe2c7e2011-06-09 15:51:19 -07009#include <base/logging.h>
Chris Masoned0ceb8c2011-06-02 10:05:39 -070010#include <dbus-c++/dbus.h>
11
Chris Masone889666b2011-07-03 12:58:50 -070012#include "shill/accessor_interface.h"
Chris Masoned0ceb8c2011-06-02 10:05:39 -070013#include "shill/dbus_adaptor.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070014#include "shill/error.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070015#include "shill/key_value_store.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070016#include "shill/property_store.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070017
18using std::map;
19using std::string;
20using std::vector;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070021
22namespace shill {
23
Chris Masone8fe2c7e2011-06-09 15:51:19 -070024// static
Paul Stewartced6a0b2011-11-08 15:32:04 -080025const char DBusAdaptor::kByteArraysSig[] = "aay";
26// static
mukesh agrawal32399322011-09-01 10:53:43 -070027const char DBusAdaptor::kPathArraySig[] = "ao";
28// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070029const char DBusAdaptor::kStringmapSig[] = "a{ss}";
30// static
Chris Masone27c4aa52011-07-02 13:10:14 -070031const char DBusAdaptor::kStringmapsSig[] = "aa{ss}";
32// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070033const char DBusAdaptor::kStringsSig[] = "as";
34
35DBusAdaptor::DBusAdaptor(DBus::Connection* conn, const string &object_path)
Chris Masoned0ceb8c2011-06-02 10:05:39 -070036 : DBus::ObjectAdaptor(*conn, object_path) {
Darin Petkov67d8ecf2011-07-26 16:03:30 -070037 VLOG(2) << "DBusAdaptor: " << object_path;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070038}
39
40DBusAdaptor::~DBusAdaptor() {}
41
42// static
Chris Masoneb925cc82011-06-22 15:39:57 -070043bool DBusAdaptor::DispatchOnType(PropertyStore *store,
Chris Masone8fe2c7e2011-06-09 15:51:19 -070044 const string &name,
45 const ::DBus::Variant &value,
Chris Masonea8a2c252011-06-27 22:16:30 -070046 ::DBus::Error *error) {
mukesh agrawalffa3d042011-10-06 15:26:10 -070047 Error e;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070048
49 if (DBusAdaptor::IsBool(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070050 store->SetBoolProperty(name, value.reader().get_bool(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070051 else if (DBusAdaptor::IsByte(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070052 store->SetUint8Property(name, value.reader().get_byte(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070053 else if (DBusAdaptor::IsInt16(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070054 store->SetInt16Property(name, value.reader().get_int16(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070055 else if (DBusAdaptor::IsInt32(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070056 store->SetInt32Property(name, value.reader().get_int32(), &e);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070057 else if (DBusAdaptor::IsPath(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070058 store->SetStringProperty(name, value.reader().get_path(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070059 else if (DBusAdaptor::IsString(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070060 store->SetStringProperty(name, value.reader().get_string(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070061 else if (DBusAdaptor::IsStringmap(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070062 store->SetStringmapProperty(name,
63 value.operator map<string, string>(),
64 &e);
65 else if (DBusAdaptor::IsStringmaps(value.signature())) {
Chris Masone27c4aa52011-07-02 13:10:14 -070066 VLOG(1) << " can't yet handle setting type " << value.signature();
mukesh agrawalffa3d042011-10-06 15:26:10 -070067 e.Populate(Error::kInternalError);
68 } else if (DBusAdaptor::IsStrings(value.signature()))
69 store->SetStringsProperty(name, value.operator vector<string>(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070070 else if (DBusAdaptor::IsUint16(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070071 store->SetUint16Property(name, value.reader().get_uint16(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070072 else if (DBusAdaptor::IsUint32(value.signature()))
mukesh agrawalffa3d042011-10-06 15:26:10 -070073 store->SetUint32Property(name, value.reader().get_uint32(), &e);
74 else {
Chris Masone27c4aa52011-07-02 13:10:14 -070075 NOTREACHED() << " unknown type: " << value.signature();
mukesh agrawalffa3d042011-10-06 15:26:10 -070076 e.Populate(Error::kInternalError);
Chris Masone27c4aa52011-07-02 13:10:14 -070077 }
mukesh agrawalffa3d042011-10-06 15:26:10 -070078
79 if (error != NULL) {
80 e.ToDBusError(error);
81 }
82
83 return e.IsSuccess();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070084}
85
86// static
mukesh agrawalde29fa82011-09-16 16:16:36 -070087bool DBusAdaptor::GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -070088 map<string, ::DBus::Variant> *out,
mukesh agrawal1830fa12011-09-26 14:31:40 -070089 ::DBus::Error */*error*/) {
Chris Masonea8a2c252011-06-27 22:16:30 -070090 {
mukesh agrawalde29fa82011-09-16 16:16:36 -070091 PropertyConstIterator<bool> it = store.GetBoolPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -070092 for ( ; !it.AtEnd(); it.Advance())
93 (*out)[it.Key()] = BoolToVariant(it.Value());
94 }
95 {
mukesh agrawalde29fa82011-09-16 16:16:36 -070096 PropertyConstIterator<int16> it = store.GetInt16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -070097 for ( ; !it.AtEnd(); it.Advance())
98 (*out)[it.Key()] = Int16ToVariant(it.Value());
99 }
100 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700101 PropertyConstIterator<int32> it = store.GetInt32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700102 for ( ; !it.AtEnd(); it.Advance())
103 (*out)[it.Key()] = Int32ToVariant(it.Value());
104 }
105 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700106 PropertyConstIterator<string> it = store.GetStringPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700107 for ( ; !it.AtEnd(); it.Advance())
108 (*out)[it.Key()] = StringToVariant(it.Value());
109 }
110 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700111 PropertyConstIterator<Stringmap> it = store.GetStringmapPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700112 for ( ; !it.AtEnd(); it.Advance())
113 (*out)[it.Key()] = StringmapToVariant(it.Value());
114 }
115 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700116 PropertyConstIterator<Strings> it = store.GetStringsPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700117 for ( ; !it.AtEnd(); it.Advance())
118 (*out)[it.Key()] = StringsToVariant(it.Value());
119 }
120 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700121 PropertyConstIterator<uint8> it = store.GetUint8PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700122 for ( ; !it.AtEnd(); it.Advance())
123 (*out)[it.Key()] = ByteToVariant(it.Value());
124 }
125 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700126 PropertyConstIterator<uint16> it = store.GetUint16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700127 for ( ; !it.AtEnd(); it.Advance())
128 (*out)[it.Key()] = Uint16ToVariant(it.Value());
129 }
130 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700131 PropertyConstIterator<uint32> it = store.GetUint32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700132 for ( ; !it.AtEnd(); it.Advance())
133 (*out)[it.Key()] = Uint32ToVariant(it.Value());
134 }
135 return true;
136}
137
138// static
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700139void DBusAdaptor::ArgsToKeyValueStore(
140 const map<string, ::DBus::Variant> &args,
141 KeyValueStore *out,
142 Error *error) { // XXX should be ::DBus::Error?
143 for (map<string, ::DBus::Variant>::const_iterator it = args.begin();
144 it != args.end();
145 ++it) {
146 DBus::type<string> string_type;
147 DBus::type<bool> bool_type;
148
149 if (it->second.signature() == string_type.sig()) {
150 out->SetString(it->first, it->second.reader().get_string());
151 } else if (it->second.signature() == bool_type.sig()) {
152 out->SetBool(it->first, it->second.reader().get_bool());
153 } else {
154 error->Populate(Error::kInternalError);
155 return; // skip remaining args after error
156 }
157 }
158}
159
160// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700161::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
162 ::DBus::Variant v;
163 v.writer().append_bool(value);
164 return v;
165}
166
167// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800168::DBus::Variant DBusAdaptor::ByteArraysToVariant(const ByteArrays &value) {
169 ::DBus::MessageIter writer;
170 ::DBus::Variant v;
171
172 // TODO(quiche): figure out why we can't use operator<< without the
173 // temporary variable.
174 writer = v.writer();
175 writer << value;
176 return v;
177}
178
179// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700180::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700181 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700182 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700183 return v;
184}
185
186// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700187::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
188 ::DBus::Variant v;
189 v.writer().append_int16(value);
190 return v;
191}
192
193// static
194::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700195 ::DBus::Variant v;
196 v.writer().append_int32(value);
197 return v;
198}
199
200// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700201::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
202 ::DBus::Variant v;
203 v.writer().append_path(value.c_str());
204 return v;
205}
206
207// static
mukesh agrawal32399322011-09-01 10:53:43 -0700208::DBus::Variant DBusAdaptor::PathArrayToVariant(
209 const vector< ::DBus::Path> &value) {
210 ::DBus::MessageIter writer;
211 ::DBus::Variant v;
212
213 // TODO(quiche): figure out why we can't use operator<< without the
214 // temporary variable.
215 writer = v.writer();
216 writer << value;
217 return v;
218}
219
220// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700221::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700222 ::DBus::Variant v;
223 v.writer().append_string(value.c_str());
224 return v;
225}
226
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700227// static
Chris Masone889666b2011-07-03 12:58:50 -0700228::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700229 ::DBus::Variant v;
230 ::DBus::MessageIter writer = v.writer();
231 writer << value;
232 return v;
233}
234
235// static
Chris Masone889666b2011-07-03 12:58:50 -0700236::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700237 ::DBus::Variant v;
238 ::DBus::MessageIter writer = v.writer();
239 writer << value;
240 return v;
241}
242
243// static
Chris Masone889666b2011-07-03 12:58:50 -0700244::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700245 ::DBus::Variant v;
246 ::DBus::MessageIter writer = v.writer();
247 writer << value;
248 return v;
249}
250
251// static
Chris Masone889666b2011-07-03 12:58:50 -0700252::DBus::Variant DBusAdaptor::StrIntPairToVariant(const StrIntPair &value) {
253 ::DBus::Variant v;
254 ::DBus::MessageIter writer = v.writer();
255 writer << value.string_property();
256 writer << value.uint_property();
257 return v;
258}
259
260// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700261::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
262 ::DBus::Variant v;
263 v.writer().append_uint16(value);
264 return v;
265}
266
267// static
268::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
269 ::DBus::Variant v;
270 v.writer().append_uint32(value);
271 return v;
272}
273
274// static
275bool DBusAdaptor::IsBool(::DBus::Signature signature) {
276 return signature == ::DBus::type<bool>::sig();
277}
278
279// static
280bool DBusAdaptor::IsByte(::DBus::Signature signature) {
281 return signature == ::DBus::type<uint8>::sig();
282}
283
284// static
Paul Stewartced6a0b2011-11-08 15:32:04 -0800285bool DBusAdaptor::IsByteArrays(::DBus::Signature signature) {
286 return signature == DBusAdaptor::kByteArraysSig;
287}
288
289// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700290bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
291 return signature == ::DBus::type<int16>::sig();
292}
293
294// static
295bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
296 return signature == ::DBus::type<int32>::sig();
297}
298
299// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700300bool DBusAdaptor::IsPath(::DBus::Signature signature) {
301 return signature == ::DBus::type< ::DBus::Path >::sig();
302}
303
304// static
mukesh agrawal32399322011-09-01 10:53:43 -0700305bool DBusAdaptor::IsPathArray(::DBus::Signature signature) {
306 return signature == DBusAdaptor::kPathArraySig;
307}
308
309// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700310bool DBusAdaptor::IsString(::DBus::Signature signature) {
311 return signature == ::DBus::type<string>::sig();
312}
313
314// static
315bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
316 return signature == DBusAdaptor::kStringmapSig;
317}
318
319// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700320bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
321 return signature == DBusAdaptor::kStringmapsSig;
322}
323
324// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700325bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
326 return signature == DBusAdaptor::kStringsSig;
327}
328
329// static
330bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
331 return signature == ::DBus::type<uint16>::sig();
332}
333
334// static
335bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
336 return signature == ::DBus::type<uint32>::sig();
337}
338
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700339} // namespace shill