blob: d84ee0a305e2ef8166c40034cde66b684e865ccd [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) {
Darin Petkov67d8ecf2011-07-26 16:03:30 -070032 VLOG(2) << "DBusAdaptor: " << object_path;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070033}
34
35DBusAdaptor::~DBusAdaptor() {}
36
37// static
Chris Masoneb925cc82011-06-22 15:39:57 -070038bool DBusAdaptor::DispatchOnType(PropertyStore *store,
Chris Masone8fe2c7e2011-06-09 15:51:19 -070039 const string &name,
40 const ::DBus::Variant &value,
Chris Masonea8a2c252011-06-27 22:16:30 -070041 ::DBus::Error *error) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -070042 bool set = false;
43 Error e(Error::kInvalidArguments, "Could not write " + name);
44
45 if (DBusAdaptor::IsBool(value.signature()))
46 set = store->SetBoolProperty(name, value.reader().get_bool(), &e);
47 else if (DBusAdaptor::IsByte(value.signature()))
48 set = store->SetUint8Property(name, value.reader().get_byte(), &e);
49 else if (DBusAdaptor::IsInt16(value.signature()))
50 set = store->SetInt16Property(name, value.reader().get_int16(), &e);
51 else if (DBusAdaptor::IsInt32(value.signature()))
52 set = store->SetInt32Property(name, value.reader().get_int32(), &e);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070053 else if (DBusAdaptor::IsPath(value.signature()))
54 set = store->SetStringProperty(name, value.reader().get_path(), &e);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070055 else if (DBusAdaptor::IsString(value.signature()))
56 set = store->SetStringProperty(name, value.reader().get_string(), &e);
57 else if (DBusAdaptor::IsStringmap(value.signature()))
58 set = store->SetStringmapProperty(name,
59 value.operator map<string, string>(),
60 &e);
Chris Masone27c4aa52011-07-02 13:10:14 -070061 else if (DBusAdaptor::IsStringmaps(value.signature()))
62 VLOG(1) << " can't yet handle setting type " << value.signature();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070063 else if (DBusAdaptor::IsStrings(value.signature()))
64 set = store->SetStringsProperty(name, value.operator vector<string>(), &e);
65 else if (DBusAdaptor::IsUint16(value.signature()))
66 set = store->SetUint16Property(name, value.reader().get_uint16(), &e);
67 else if (DBusAdaptor::IsUint32(value.signature()))
68 set = store->SetUint32Property(name, value.reader().get_uint32(), &e);
69 else
Chris Masone27c4aa52011-07-02 13:10:14 -070070 NOTREACHED() << " unknown type: " << value.signature();
Chris Masone8fe2c7e2011-06-09 15:51:19 -070071
Chris Masone27c4aa52011-07-02 13:10:14 -070072 if (!set && error) {
73 if (!store->Contains(name))
74 Error(Error::kInvalidProperty, name + " is invalid.").ToDBusError(error);
75 else
76 e.ToDBusError(error);
77 }
Chris Masone8fe2c7e2011-06-09 15:51:19 -070078 return set;
79}
80
81// static
Chris Masonea8a2c252011-06-27 22:16:30 -070082bool DBusAdaptor::GetProperties(PropertyStore *store,
83 map<string, ::DBus::Variant> *out,
84 ::DBus::Error *error) {
85 {
86 PropertyConstIterator<bool> it = store->GetBoolPropertiesIter();
87 for ( ; !it.AtEnd(); it.Advance())
88 (*out)[it.Key()] = BoolToVariant(it.Value());
89 }
90 {
91 PropertyConstIterator<int16> it = store->GetInt16PropertiesIter();
92 for ( ; !it.AtEnd(); it.Advance())
93 (*out)[it.Key()] = Int16ToVariant(it.Value());
94 }
95 {
96 PropertyConstIterator<int32> it = store->GetInt32PropertiesIter();
97 for ( ; !it.AtEnd(); it.Advance())
98 (*out)[it.Key()] = Int32ToVariant(it.Value());
99 }
100 {
101 PropertyConstIterator<string> it = store->GetStringPropertiesIter();
102 for ( ; !it.AtEnd(); it.Advance())
103 (*out)[it.Key()] = StringToVariant(it.Value());
104 }
105 {
106 PropertyConstIterator<Stringmap> it = store->GetStringmapPropertiesIter();
107 for ( ; !it.AtEnd(); it.Advance())
108 (*out)[it.Key()] = StringmapToVariant(it.Value());
109 }
110 {
111 PropertyConstIterator<Strings> it = store->GetStringsPropertiesIter();
112 for ( ; !it.AtEnd(); it.Advance())
113 (*out)[it.Key()] = StringsToVariant(it.Value());
114 }
115 {
116 PropertyConstIterator<uint8> it = store->GetUint8PropertiesIter();
117 for ( ; !it.AtEnd(); it.Advance())
118 (*out)[it.Key()] = ByteToVariant(it.Value());
119 }
120 {
121 PropertyConstIterator<uint16> it = store->GetUint16PropertiesIter();
122 for ( ; !it.AtEnd(); it.Advance())
123 (*out)[it.Key()] = Uint16ToVariant(it.Value());
124 }
125 {
126 PropertyConstIterator<uint32> it = store->GetUint32PropertiesIter();
127 for ( ; !it.AtEnd(); it.Advance())
128 (*out)[it.Key()] = Uint32ToVariant(it.Value());
129 }
130 return true;
131}
132
133// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700134::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
135 ::DBus::Variant v;
136 v.writer().append_bool(value);
137 return v;
138}
139
140// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700141::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700142 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700143 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700144 return v;
145}
146
147// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700148::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
149 ::DBus::Variant v;
150 v.writer().append_int16(value);
151 return v;
152}
153
154// static
155::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700156 ::DBus::Variant v;
157 v.writer().append_int32(value);
158 return v;
159}
160
161// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700162::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
163 ::DBus::Variant v;
164 v.writer().append_path(value.c_str());
165 return v;
166}
167
168// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700169::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700170 ::DBus::Variant v;
171 v.writer().append_string(value.c_str());
172 return v;
173}
174
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700175// static
Chris Masone889666b2011-07-03 12:58:50 -0700176::DBus::Variant DBusAdaptor::StringmapToVariant(const Stringmap &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700177 ::DBus::Variant v;
178 ::DBus::MessageIter writer = v.writer();
179 writer << value;
180 return v;
181}
182
183// static
Chris Masone889666b2011-07-03 12:58:50 -0700184::DBus::Variant DBusAdaptor::StringmapsToVariant(const Stringmaps &value) {
Chris Masoneb925cc82011-06-22 15:39:57 -0700185 ::DBus::Variant v;
186 ::DBus::MessageIter writer = v.writer();
187 writer << value;
188 return v;
189}
190
191// static
Chris Masone889666b2011-07-03 12:58:50 -0700192::DBus::Variant DBusAdaptor::StringsToVariant(const Strings &value) {
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700193 ::DBus::Variant v;
194 ::DBus::MessageIter writer = v.writer();
195 writer << value;
196 return v;
197}
198
199// static
Chris Masone889666b2011-07-03 12:58:50 -0700200::DBus::Variant DBusAdaptor::StrIntPairToVariant(const StrIntPair &value) {
201 ::DBus::Variant v;
202 ::DBus::MessageIter writer = v.writer();
203 writer << value.string_property();
204 writer << value.uint_property();
205 return v;
206}
207
208// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700209::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
210 ::DBus::Variant v;
211 v.writer().append_uint16(value);
212 return v;
213}
214
215// static
216::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
217 ::DBus::Variant v;
218 v.writer().append_uint32(value);
219 return v;
220}
221
222// static
223bool DBusAdaptor::IsBool(::DBus::Signature signature) {
224 return signature == ::DBus::type<bool>::sig();
225}
226
227// static
228bool DBusAdaptor::IsByte(::DBus::Signature signature) {
229 return signature == ::DBus::type<uint8>::sig();
230}
231
232// static
233bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
234 return signature == ::DBus::type<int16>::sig();
235}
236
237// static
238bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
239 return signature == ::DBus::type<int32>::sig();
240}
241
242// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700243bool DBusAdaptor::IsPath(::DBus::Signature signature) {
244 return signature == ::DBus::type< ::DBus::Path >::sig();
245}
246
247// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700248bool DBusAdaptor::IsString(::DBus::Signature signature) {
249 return signature == ::DBus::type<string>::sig();
250}
251
252// static
253bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
254 return signature == DBusAdaptor::kStringmapSig;
255}
256
257// static
Chris Masone27c4aa52011-07-02 13:10:14 -0700258bool DBusAdaptor::IsStringmaps(::DBus::Signature signature) {
259 return signature == DBusAdaptor::kStringmapsSig;
260}
261
262// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700263bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
264 return signature == DBusAdaptor::kStringsSig;
265}
266
267// static
268bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
269 return signature == ::DBus::type<uint16>::sig();
270}
271
272// static
273bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
274 return signature == ::DBus::type<uint32>::sig();
275}
276
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700277} // namespace shill