blob: a8cbc4576d2eea3f63f0ef32203d35ad6d390b55 [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"
Chris Masoneb925cc82011-06-22 15:39:57 -070015#include "shill/property_store.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070016
17using std::map;
18using std::string;
19using std::vector;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070020
21namespace shill {
22
Chris Masone8fe2c7e2011-06-09 15:51:19 -070023// static
mukesh agrawal32399322011-09-01 10:53:43 -070024const char DBusAdaptor::kPathArraySig[] = "ao";
25// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070026const char DBusAdaptor::kStringmapSig[] = "a{ss}";
27// static
Chris Masone27c4aa52011-07-02 13:10:14 -070028const char DBusAdaptor::kStringmapsSig[] = "aa{ss}";
29// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070030const char DBusAdaptor::kStringsSig[] = "as";
31
32DBusAdaptor::DBusAdaptor(DBus::Connection* conn, const string &object_path)
Chris Masoned0ceb8c2011-06-02 10:05:39 -070033 : DBus::ObjectAdaptor(*conn, object_path) {
Darin Petkov67d8ecf2011-07-26 16:03:30 -070034 VLOG(2) << "DBusAdaptor: " << object_path;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070035}
36
37DBusAdaptor::~DBusAdaptor() {}
38
39// static
Chris Masoneb925cc82011-06-22 15:39:57 -070040bool DBusAdaptor::DispatchOnType(PropertyStore *store,
Chris Masone8fe2c7e2011-06-09 15:51:19 -070041 const string &name,
42 const ::DBus::Variant &value,
Chris Masonea8a2c252011-06-27 22:16:30 -070043 ::DBus::Error *error) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -070044 bool set = false;
45 Error e(Error::kInvalidArguments, "Could not write " + name);
46
47 if (DBusAdaptor::IsBool(value.signature()))
48 set = store->SetBoolProperty(name, value.reader().get_bool(), &e);
49 else if (DBusAdaptor::IsByte(value.signature()))
50 set = store->SetUint8Property(name, value.reader().get_byte(), &e);
51 else if (DBusAdaptor::IsInt16(value.signature()))
52 set = store->SetInt16Property(name, value.reader().get_int16(), &e);
53 else if (DBusAdaptor::IsInt32(value.signature()))
54 set = store->SetInt32Property(name, value.reader().get_int32(), &e);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070055 else if (DBusAdaptor::IsPath(value.signature()))
56 set = store->SetStringProperty(name, value.reader().get_path(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070057 else if (DBusAdaptor::IsString(value.signature()))
58 set = store->SetStringProperty(name, value.reader().get_string(), &e);
59 else if (DBusAdaptor::IsStringmap(value.signature()))
60 set = store->SetStringmapProperty(name,
61 value.operator map<string, string>(),
62 &e);
Chris Masone27c4aa52011-07-02 13:10:14 -070063 else if (DBusAdaptor::IsStringmaps(value.signature()))
64 VLOG(1) << " can't yet handle setting type " << value.signature();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070065 else if (DBusAdaptor::IsStrings(value.signature()))
66 set = store->SetStringsProperty(name, value.operator vector<string>(), &e);
67 else if (DBusAdaptor::IsUint16(value.signature()))
68 set = store->SetUint16Property(name, value.reader().get_uint16(), &e);
69 else if (DBusAdaptor::IsUint32(value.signature()))
70 set = store->SetUint32Property(name, value.reader().get_uint32(), &e);
71 else
Chris Masone27c4aa52011-07-02 13:10:14 -070072 NOTREACHED() << " unknown type: " << value.signature();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070073
Chris Masone27c4aa52011-07-02 13:10:14 -070074 if (!set && error) {
75 if (!store->Contains(name))
76 Error(Error::kInvalidProperty, name + " is invalid.").ToDBusError(error);
77 else
78 e.ToDBusError(error);
79 }
Chris Masone8fe2c7e2011-06-09 15:51:19 -070080 return set;
81}
82
83// static
mukesh agrawalde29fa82011-09-16 16:16:36 -070084bool DBusAdaptor::GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -070085 map<string, ::DBus::Variant> *out,
86 ::DBus::Error *error) {
87 {
mukesh agrawalde29fa82011-09-16 16:16:36 -070088 PropertyConstIterator<bool> it = store.GetBoolPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -070089 for ( ; !it.AtEnd(); it.Advance())
90 (*out)[it.Key()] = BoolToVariant(it.Value());
91 }
92 {
mukesh agrawalde29fa82011-09-16 16:16:36 -070093 PropertyConstIterator<int16> it = store.GetInt16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -070094 for ( ; !it.AtEnd(); it.Advance())
95 (*out)[it.Key()] = Int16ToVariant(it.Value());
96 }
97 {
mukesh agrawalde29fa82011-09-16 16:16:36 -070098 PropertyConstIterator<int32> it = store.GetInt32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -070099 for ( ; !it.AtEnd(); it.Advance())
100 (*out)[it.Key()] = Int32ToVariant(it.Value());
101 }
102 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700103 PropertyConstIterator<string> it = store.GetStringPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700104 for ( ; !it.AtEnd(); it.Advance())
105 (*out)[it.Key()] = StringToVariant(it.Value());
106 }
107 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700108 PropertyConstIterator<Stringmap> it = store.GetStringmapPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700109 for ( ; !it.AtEnd(); it.Advance())
110 (*out)[it.Key()] = StringmapToVariant(it.Value());
111 }
112 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700113 PropertyConstIterator<Strings> it = store.GetStringsPropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700114 for ( ; !it.AtEnd(); it.Advance())
115 (*out)[it.Key()] = StringsToVariant(it.Value());
116 }
117 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700118 PropertyConstIterator<uint8> it = store.GetUint8PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700119 for ( ; !it.AtEnd(); it.Advance())
120 (*out)[it.Key()] = ByteToVariant(it.Value());
121 }
122 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700123 PropertyConstIterator<uint16> it = store.GetUint16PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700124 for ( ; !it.AtEnd(); it.Advance())
125 (*out)[it.Key()] = Uint16ToVariant(it.Value());
126 }
127 {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700128 PropertyConstIterator<uint32> it = store.GetUint32PropertiesIter();
Chris Masonea8a2c252011-06-27 22:16:30 -0700129 for ( ; !it.AtEnd(); it.Advance())
130 (*out)[it.Key()] = Uint32ToVariant(it.Value());
131 }
132 return true;
133}
134
135// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700136::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
137 ::DBus::Variant v;
138 v.writer().append_bool(value);
139 return v;
140}
141
142// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700143::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700144 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700145 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700146 return v;
147}
148
149// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700150::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
151 ::DBus::Variant v;
152 v.writer().append_int16(value);
153 return v;
154}
155
156// static
157::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700158 ::DBus::Variant v;
159 v.writer().append_int32(value);
160 return v;
161}
162
163// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700164::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
165 ::DBus::Variant v;
166 v.writer().append_path(value.c_str());
167 return v;
168}
169
170// static
mukesh agrawal32399322011-09-01 10:53:43 -0700171::DBus::Variant DBusAdaptor::PathArrayToVariant(
172 const vector< ::DBus::Path> &value) {
173 ::DBus::MessageIter writer;
174 ::DBus::Variant v;
175
176 // TODO(quiche): figure out why we can't use operator<< without the
177 // temporary variable.
178 writer = v.writer();
179 writer << value;
180 return v;
181}
182
183// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700184::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700185 ::DBus::Variant v;
186 v.writer().append_string(value.c_str());
187 return v;
188}
189
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700190// static
Chris Masone889666b2011-07-03 12:58:50 -0700191::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700192 ::DBus::Variant v;
193 ::DBus::MessageIter writer = v.writer();
194 writer << value;
195 return v;
196}
197
198// static
Chris Masone889666b2011-07-03 12:58:50 -0700199::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700200 ::DBus::Variant v;
201 ::DBus::MessageIter writer = v.writer();
202 writer << value;
203 return v;
204}
205
206// static
Chris Masone889666b2011-07-03 12:58:50 -0700207::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700208 ::DBus::Variant v;
209 ::DBus::MessageIter writer = v.writer();
210 writer << value;
211 return v;
212}
213
214// static
Chris Masone889666b2011-07-03 12:58:50 -0700215::DBus::Variant DBusAdaptor::StrIntPairToVariant(const StrIntPair &value) {
216 ::DBus::Variant v;
217 ::DBus::MessageIter writer = v.writer();
218 writer << value.string_property();
219 writer << value.uint_property();
220 return v;
221}
222
223// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700224::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
225 ::DBus::Variant v;
226 v.writer().append_uint16(value);
227 return v;
228}
229
230// static
231::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
232 ::DBus::Variant v;
233 v.writer().append_uint32(value);
234 return v;
235}
236
237// static
238bool DBusAdaptor::IsBool(::DBus::Signature signature) {
239 return signature == ::DBus::type<bool>::sig();
240}
241
242// static
243bool DBusAdaptor::IsByte(::DBus::Signature signature) {
244 return signature == ::DBus::type<uint8>::sig();
245}
246
247// static
248bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
249 return signature == ::DBus::type<int16>::sig();
250}
251
252// static
253bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
254 return signature == ::DBus::type<int32>::sig();
255}
256
257// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700258bool DBusAdaptor::IsPath(::DBus::Signature signature) {
259 return signature == ::DBus::type< ::DBus::Path >::sig();
260}
261
262// static
mukesh agrawal32399322011-09-01 10:53:43 -0700263bool DBusAdaptor::IsPathArray(::DBus::Signature signature) {
264 return signature == DBusAdaptor::kPathArraySig;
265}
266
267// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700268bool DBusAdaptor::IsString(::DBus::Signature signature) {
269 return signature == ::DBus::type<string>::sig();
270}
271
272// static
273bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
274 return signature == DBusAdaptor::kStringmapSig;
275}
276
277// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700278bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
279 return signature == DBusAdaptor::kStringmapsSig;
280}
281
282// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700283bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
284 return signature == DBusAdaptor::kStringsSig;
285}
286
287// static
288bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
289 return signature == ::DBus::type<uint16>::sig();
290}
291
292// static
293bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
294 return signature == ::DBus::type<uint32>::sig();
295}
296
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700297} // namespace shill