blob: 808b32567a582e1ba0da6c2cfa4e2a93ec928b42 [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
mukesh agrawal32399322011-09-01 10:53:43 -070025const char DBusAdaptor::kPathArraySig[] = "ao";
26// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070027const char DBusAdaptor::kStringmapSig[] = "a{ss}";
28// static
Chris Masone27c4aa52011-07-02 13:10:14 -070029const char DBusAdaptor::kStringmapsSig[] = "aa{ss}";
30// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070031const char DBusAdaptor::kStringsSig[] = "as";
32
33DBusAdaptor::DBusAdaptor(DBus::Connection* conn, const string &object_path)
Chris Masoned0ceb8c2011-06-02 10:05:39 -070034 : DBus::ObjectAdaptor(*conn, object_path) {
Darin Petkov67d8ecf2011-07-26 16:03:30 -070035 VLOG(2) << "DBusAdaptor: " << object_path;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070036}
37
38DBusAdaptor::~DBusAdaptor() {}
39
40// static
Chris Masoneb925cc82011-06-22 15:39:57 -070041bool DBusAdaptor::DispatchOnType(PropertyStore *store,
Chris Masone8fe2c7e2011-06-09 15:51:19 -070042 const string &name,
43 const ::DBus::Variant &value,
Chris Masonea8a2c252011-06-27 22:16:30 -070044 ::DBus::Error *error) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -070045 bool set = false;
46 Error e(Error::kInvalidArguments, "Could not write " + name);
47
48 if (DBusAdaptor::IsBool(value.signature()))
49 set = store->SetBoolProperty(name, value.reader().get_bool(), &e);
50 else if (DBusAdaptor::IsByte(value.signature()))
51 set = store->SetUint8Property(name, value.reader().get_byte(), &e);
52 else if (DBusAdaptor::IsInt16(value.signature()))
53 set = store->SetInt16Property(name, value.reader().get_int16(), &e);
54 else if (DBusAdaptor::IsInt32(value.signature()))
55 set = store->SetInt32Property(name, value.reader().get_int32(), &e);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070056 else if (DBusAdaptor::IsPath(value.signature()))
57 set = store->SetStringProperty(name, value.reader().get_path(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070058 else if (DBusAdaptor::IsString(value.signature()))
59 set = store->SetStringProperty(name, value.reader().get_string(), &e);
60 else if (DBusAdaptor::IsStringmap(value.signature()))
61 set = store->SetStringmapProperty(name,
62 value.operator map<string, string>(),
63 &e);
Chris Masone27c4aa52011-07-02 13:10:14 -070064 else if (DBusAdaptor::IsStringmaps(value.signature()))
65 VLOG(1) << " can't yet handle setting type " << value.signature();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070066 else if (DBusAdaptor::IsStrings(value.signature()))
67 set = store->SetStringsProperty(name, value.operator vector<string>(), &e);
68 else if (DBusAdaptor::IsUint16(value.signature()))
69 set = store->SetUint16Property(name, value.reader().get_uint16(), &e);
70 else if (DBusAdaptor::IsUint32(value.signature()))
71 set = store->SetUint32Property(name, value.reader().get_uint32(), &e);
72 else
Chris Masone27c4aa52011-07-02 13:10:14 -070073 NOTREACHED() << " unknown type: " << value.signature();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070074
Chris Masone27c4aa52011-07-02 13:10:14 -070075 if (!set && error) {
76 if (!store->Contains(name))
77 Error(Error::kInvalidProperty, name + " is invalid.").ToDBusError(error);
78 else
79 e.ToDBusError(error);
80 }
Chris Masone8fe2c7e2011-06-09 15:51:19 -070081 return set;
82}
83
84// static
mukesh agrawalde29fa82011-09-16 16:16:36 -070085bool DBusAdaptor::GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -070086 map<string, ::DBus::Variant> *out,
87 ::DBus::Error *error) {
88 {
mukesh agrawalde29fa82011-09-16 16:16:36 -070089 PropertyConstIterator<bool> it = store.GetBoolPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -070090 for ( ; !it.AtEnd(); it.Advance())
91 (*out)[it.Key()] = BoolToVariant(it.Value());
92 }
93 {
mukesh agrawalde29fa82011-09-16 16:16:36 -070094 PropertyConstIterator<int16> it = store.GetInt16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -070095 for ( ; !it.AtEnd(); it.Advance())
96 (*out)[it.Key()] = Int16ToVariant(it.Value());
97 }
98 {
mukesh agrawalde29fa82011-09-16 16:16:36 -070099 PropertyConstIterator<int32> it = store.GetInt32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700100 for ( ; !it.AtEnd(); it.Advance())
101 (*out)[it.Key()] = Int32ToVariant(it.Value());
102 }
103 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700104 PropertyConstIterator<string> it = store.GetStringPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700105 for ( ; !it.AtEnd(); it.Advance())
106 (*out)[it.Key()] = StringToVariant(it.Value());
107 }
108 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700109 PropertyConstIterator<Stringmap> it = store.GetStringmapPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700110 for ( ; !it.AtEnd(); it.Advance())
111 (*out)[it.Key()] = StringmapToVariant(it.Value());
112 }
113 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700114 PropertyConstIterator<Strings> it = store.GetStringsPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700115 for ( ; !it.AtEnd(); it.Advance())
116 (*out)[it.Key()] = StringsToVariant(it.Value());
117 }
118 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700119 PropertyConstIterator<uint8> it = store.GetUint8PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700120 for ( ; !it.AtEnd(); it.Advance())
121 (*out)[it.Key()] = ByteToVariant(it.Value());
122 }
123 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700124 PropertyConstIterator<uint16> it = store.GetUint16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700125 for ( ; !it.AtEnd(); it.Advance())
126 (*out)[it.Key()] = Uint16ToVariant(it.Value());
127 }
128 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700129 PropertyConstIterator<uint32> it = store.GetUint32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700130 for ( ; !it.AtEnd(); it.Advance())
131 (*out)[it.Key()] = Uint32ToVariant(it.Value());
132 }
133 return true;
134}
135
136// static
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700137void DBusAdaptor::ArgsToKeyValueStore(
138 const map<string, ::DBus::Variant> &args,
139 KeyValueStore *out,
140 Error *error) { // XXX should be ::DBus::Error?
141 for (map<string, ::DBus::Variant>::const_iterator it = args.begin();
142 it != args.end();
143 ++it) {
144 DBus::type<string> string_type;
145 DBus::type<bool> bool_type;
146
147 if (it->second.signature() == string_type.sig()) {
148 out->SetString(it->first, it->second.reader().get_string());
149 } else if (it->second.signature() == bool_type.sig()) {
150 out->SetBool(it->first, it->second.reader().get_bool());
151 } else {
152 error->Populate(Error::kInternalError);
153 return; // skip remaining args after error
154 }
155 }
156}
157
158// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700159::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
160 ::DBus::Variant v;
161 v.writer().append_bool(value);
162 return v;
163}
164
165// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700166::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700167 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700168 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700169 return v;
170}
171
172// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700173::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
174 ::DBus::Variant v;
175 v.writer().append_int16(value);
176 return v;
177}
178
179// static
180::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700181 ::DBus::Variant v;
182 v.writer().append_int32(value);
183 return v;
184}
185
186// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700187::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
188 ::DBus::Variant v;
189 v.writer().append_path(value.c_str());
190 return v;
191}
192
193// static
mukesh agrawal32399322011-09-01 10:53:43 -0700194::DBus::Variant DBusAdaptor::PathArrayToVariant(
195 const vector< ::DBus::Path> &value) {
196 ::DBus::MessageIter writer;
197 ::DBus::Variant v;
198
199 // TODO(quiche): figure out why we can't use operator<< without the
200 // temporary variable.
201 writer = v.writer();
202 writer << value;
203 return v;
204}
205
206// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700207::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700208 ::DBus::Variant v;
209 v.writer().append_string(value.c_str());
210 return v;
211}
212
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700213// static
Chris Masone889666b2011-07-03 12:58:50 -0700214::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700215 ::DBus::Variant v;
216 ::DBus::MessageIter writer = v.writer();
217 writer << value;
218 return v;
219}
220
221// static
Chris Masone889666b2011-07-03 12:58:50 -0700222::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700223 ::DBus::Variant v;
224 ::DBus::MessageIter writer = v.writer();
225 writer << value;
226 return v;
227}
228
229// static
Chris Masone889666b2011-07-03 12:58:50 -0700230::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700231 ::DBus::Variant v;
232 ::DBus::MessageIter writer = v.writer();
233 writer << value;
234 return v;
235}
236
237// static
Chris Masone889666b2011-07-03 12:58:50 -0700238::DBus::Variant DBusAdaptor::StrIntPairToVariant(const StrIntPair &value) {
239 ::DBus::Variant v;
240 ::DBus::MessageIter writer = v.writer();
241 writer << value.string_property();
242 writer << value.uint_property();
243 return v;
244}
245
246// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700247::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
248 ::DBus::Variant v;
249 v.writer().append_uint16(value);
250 return v;
251}
252
253// static
254::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
255 ::DBus::Variant v;
256 v.writer().append_uint32(value);
257 return v;
258}
259
260// static
261bool DBusAdaptor::IsBool(::DBus::Signature signature) {
262 return signature == ::DBus::type<bool>::sig();
263}
264
265// static
266bool DBusAdaptor::IsByte(::DBus::Signature signature) {
267 return signature == ::DBus::type<uint8>::sig();
268}
269
270// static
271bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
272 return signature == ::DBus::type<int16>::sig();
273}
274
275// static
276bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
277 return signature == ::DBus::type<int32>::sig();
278}
279
280// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700281bool DBusAdaptor::IsPath(::DBus::Signature signature) {
282 return signature == ::DBus::type< ::DBus::Path >::sig();
283}
284
285// static
mukesh agrawal32399322011-09-01 10:53:43 -0700286bool DBusAdaptor::IsPathArray(::DBus::Signature signature) {
287 return signature == DBusAdaptor::kPathArraySig;
288}
289
290// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700291bool DBusAdaptor::IsString(::DBus::Signature signature) {
292 return signature == ::DBus::type<string>::sig();
293}
294
295// static
296bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
297 return signature == DBusAdaptor::kStringmapSig;
298}
299
300// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700301bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
302 return signature == DBusAdaptor::kStringmapsSig;
303}
304
305// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700306bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
307 return signature == DBusAdaptor::kStringsSig;
308}
309
310// static
311bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
312 return signature == ::DBus::type<uint16>::sig();
313}
314
315// static
316bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
317 return signature == ::DBus::type<uint32>::sig();
318}
319
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700320} // namespace shill