blob: bccecbb50862aa27fde42a57d8367d1b74b91cfa [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
24const char DBusAdaptor::kStringmapSig[] = "a{ss}";
25// static
Chris Masone27c4aa52011-07-02 13:10:14 -070026const char DBusAdaptor::kStringmapsSig[] = "aa{ss}";
27// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070028const char DBusAdaptor::kStringsSig[] = "as";
29
30DBusAdaptor::DBusAdaptor(DBus::Connection* conn, const string &object_path)
Chris Masoned0ceb8c2011-06-02 10:05:39 -070031 : DBus::ObjectAdaptor(*conn, object_path) {
32}
33
34DBusAdaptor::~DBusAdaptor() {}
35
36// static
Chris Masoneb925cc82011-06-22 15:39:57 -070037bool DBusAdaptor::DispatchOnType(PropertyStore *store,
Chris Masone8fe2c7e2011-06-09 15:51:19 -070038 const string &name,
39 const ::DBus::Variant &value,
Chris Masonea8a2c252011-06-27 22:16:30 -070040 ::DBus::Error *error) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -070041 bool set = false;
42 Error e(Error::kInvalidArguments, "Could not write " + name);
43
44 if (DBusAdaptor::IsBool(value.signature()))
45 set = store->SetBoolProperty(name, value.reader().get_bool(), &e);
46 else if (DBusAdaptor::IsByte(value.signature()))
47 set = store->SetUint8Property(name, value.reader().get_byte(), &e);
48 else if (DBusAdaptor::IsInt16(value.signature()))
49 set = store->SetInt16Property(name, value.reader().get_int16(), &e);
50 else if (DBusAdaptor::IsInt32(value.signature()))
51 set = store->SetInt32Property(name, value.reader().get_int32(), &e);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070052 else if (DBusAdaptor::IsPath(value.signature()))
53 set = store->SetStringProperty(name, value.reader().get_path(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070054 else if (DBusAdaptor::IsString(value.signature()))
55 set = store->SetStringProperty(name, value.reader().get_string(), &e);
56 else if (DBusAdaptor::IsStringmap(value.signature()))
57 set = store->SetStringmapProperty(name,
58 value.operator map<string, string>(),
59 &e);
Chris Masone27c4aa52011-07-02 13:10:14 -070060 else if (DBusAdaptor::IsStringmaps(value.signature()))
61 VLOG(1) << " can't yet handle setting type " << value.signature();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070062 else if (DBusAdaptor::IsStrings(value.signature()))
63 set = store->SetStringsProperty(name, value.operator vector<string>(), &e);
64 else if (DBusAdaptor::IsUint16(value.signature()))
65 set = store->SetUint16Property(name, value.reader().get_uint16(), &e);
66 else if (DBusAdaptor::IsUint32(value.signature()))
67 set = store->SetUint32Property(name, value.reader().get_uint32(), &e);
68 else
Chris Masone27c4aa52011-07-02 13:10:14 -070069 NOTREACHED() << " unknown type: " << value.signature();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070070
Chris Masone27c4aa52011-07-02 13:10:14 -070071 if (!set && error) {
72 if (!store->Contains(name))
73 Error(Error::kInvalidProperty, name + " is invalid.").ToDBusError(error);
74 else
75 e.ToDBusError(error);
76 }
Chris Masone8fe2c7e2011-06-09 15:51:19 -070077 return set;
78}
79
80// static
Chris Masonea8a2c252011-06-27 22:16:30 -070081bool DBusAdaptor::GetProperties(PropertyStore *store,
82 map<string, ::DBus::Variant> *out,
83 ::DBus::Error *error) {
84 {
85 PropertyConstIterator<bool> it = store->GetBoolPropertiesIter();
86 for ( ; !it.AtEnd(); it.Advance())
87 (*out)[it.Key()] = BoolToVariant(it.Value());
88 }
89 {
90 PropertyConstIterator<int16> it = store->GetInt16PropertiesIter();
91 for ( ; !it.AtEnd(); it.Advance())
92 (*out)[it.Key()] = Int16ToVariant(it.Value());
93 }
94 {
95 PropertyConstIterator<int32> it = store->GetInt32PropertiesIter();
96 for ( ; !it.AtEnd(); it.Advance())
97 (*out)[it.Key()] = Int32ToVariant(it.Value());
98 }
99 {
100 PropertyConstIterator<string> it = store->GetStringPropertiesIter();
101 for ( ; !it.AtEnd(); it.Advance())
102 (*out)[it.Key()] = StringToVariant(it.Value());
103 }
104 {
105 PropertyConstIterator<Stringmap> it = store->GetStringmapPropertiesIter();
106 for ( ; !it.AtEnd(); it.Advance())
107 (*out)[it.Key()] = StringmapToVariant(it.Value());
108 }
109 {
110 PropertyConstIterator<Strings> it = store->GetStringsPropertiesIter();
111 for ( ; !it.AtEnd(); it.Advance())
112 (*out)[it.Key()] = StringsToVariant(it.Value());
113 }
114 {
115 PropertyConstIterator<uint8> it = store->GetUint8PropertiesIter();
116 for ( ; !it.AtEnd(); it.Advance())
117 (*out)[it.Key()] = ByteToVariant(it.Value());
118 }
119 {
120 PropertyConstIterator<uint16> it = store->GetUint16PropertiesIter();
121 for ( ; !it.AtEnd(); it.Advance())
122 (*out)[it.Key()] = Uint16ToVariant(it.Value());
123 }
124 {
125 PropertyConstIterator<uint32> it = store->GetUint32PropertiesIter();
126 for ( ; !it.AtEnd(); it.Advance())
127 (*out)[it.Key()] = Uint32ToVariant(it.Value());
128 }
129 return true;
130}
131
132// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700133::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
134 ::DBus::Variant v;
135 v.writer().append_bool(value);
136 return v;
137}
138
139// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700140::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700141 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700142 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700143 return v;
144}
145
146// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700147::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
148 ::DBus::Variant v;
149 v.writer().append_int16(value);
150 return v;
151}
152
153// static
154::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700155 ::DBus::Variant v;
156 v.writer().append_int32(value);
157 return v;
158}
159
160// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700161::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
162 ::DBus::Variant v;
163 v.writer().append_path(value.c_str());
164 return v;
165}
166
167// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700168::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700169 ::DBus::Variant v;
170 v.writer().append_string(value.c_str());
171 return v;
172}
173
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700174// static
Chris Masone889666b2011-07-03 12:58:50 -0700175::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700176 ::DBus::Variant v;
177 ::DBus::MessageIter writer = v.writer();
178 writer << value;
179 return v;
180}
181
182// static
Chris Masone889666b2011-07-03 12:58:50 -0700183::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700184 ::DBus::Variant v;
185 ::DBus::MessageIter writer = v.writer();
186 writer << value;
187 return v;
188}
189
190// static
Chris Masone889666b2011-07-03 12:58:50 -0700191::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &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::StrIntPairToVariant(const StrIntPair &value) {
200 ::DBus::Variant v;
201 ::DBus::MessageIter writer = v.writer();
202 writer << value.string_property();
203 writer << value.uint_property();
204 return v;
205}
206
207// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700208::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
209 ::DBus::Variant v;
210 v.writer().append_uint16(value);
211 return v;
212}
213
214// static
215::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
216 ::DBus::Variant v;
217 v.writer().append_uint32(value);
218 return v;
219}
220
221// static
222bool DBusAdaptor::IsBool(::DBus::Signature signature) {
223 return signature == ::DBus::type<bool>::sig();
224}
225
226// static
227bool DBusAdaptor::IsByte(::DBus::Signature signature) {
228 return signature == ::DBus::type<uint8>::sig();
229}
230
231// static
232bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
233 return signature == ::DBus::type<int16>::sig();
234}
235
236// static
237bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
238 return signature == ::DBus::type<int32>::sig();
239}
240
241// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700242bool DBusAdaptor::IsPath(::DBus::Signature signature) {
243 return signature == ::DBus::type< ::DBus::Path >::sig();
244}
245
246// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700247bool DBusAdaptor::IsString(::DBus::Signature signature) {
248 return signature == ::DBus::type<string>::sig();
249}
250
251// static
252bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
253 return signature == DBusAdaptor::kStringmapSig;
254}
255
256// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700257bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
258 return signature == DBusAdaptor::kStringmapsSig;
259}
260
261// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700262bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
263 return signature == DBusAdaptor::kStringsSig;
264}
265
266// static
267bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
268 return signature == ::DBus::type<uint16>::sig();
269}
270
271// static
272bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
273 return signature == ::DBus::type<uint32>::sig();
274}
275
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700276} // namespace shill