blob: e93efd79822abee9d495027a072d4707049d9555 [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
12#include "shill/dbus_adaptor.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070013#include "shill/error.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070014#include "shill/property_store.h"
Chris Masone8fe2c7e2011-06-09 15:51:19 -070015
16using std::map;
17using std::string;
18using std::vector;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070019
20namespace shill {
21
Chris Masone8fe2c7e2011-06-09 15:51:19 -070022// static
23const char DBusAdaptor::kStringmapSig[] = "a{ss}";
24// static
25const char DBusAdaptor::kStringsSig[] = "as";
26
27DBusAdaptor::DBusAdaptor(DBus::Connection* conn, const string &object_path)
Chris Masoned0ceb8c2011-06-02 10:05:39 -070028 : DBus::ObjectAdaptor(*conn, object_path) {
29}
30
31DBusAdaptor::~DBusAdaptor() {}
32
33// static
Chris Masoneb925cc82011-06-22 15:39:57 -070034bool DBusAdaptor::DispatchOnType(PropertyStore *store,
Chris Masone8fe2c7e2011-06-09 15:51:19 -070035 const string &name,
36 const ::DBus::Variant &value,
37 ::DBus::Error &error) {
Chris Masone3bd3c8c2011-06-13 08:20:26 -070038 if (!store->Contains(name)) {
39 Error(Error::kInvalidProperty, name + " is invalid.").ToDBusError(&error);
40 return false;
41 }
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);
61 else if (DBusAdaptor::IsStrings(value.signature()))
62 set = store->SetStringsProperty(name, value.operator vector<string>(), &e);
63 else if (DBusAdaptor::IsUint16(value.signature()))
64 set = store->SetUint16Property(name, value.reader().get_uint16(), &e);
65 else if (DBusAdaptor::IsUint32(value.signature()))
66 set = store->SetUint32Property(name, value.reader().get_uint32(), &e);
67 else
68 NOTREACHED();
69
70 if (!set)
71 e.ToDBusError(&error);
72 return set;
73}
74
75// static
Chris Masoned0ceb8c2011-06-02 10:05:39 -070076::DBus::Variant DBusAdaptor::BoolToVariant(bool value) {
77 ::DBus::Variant v;
78 v.writer().append_bool(value);
79 return v;
80}
81
82// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070083::DBus::Variant DBusAdaptor::ByteToVariant(uint8 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -070084 ::DBus::Variant v;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070085 v.writer().append_byte(value);
Chris Masoned0ceb8c2011-06-02 10:05:39 -070086 return v;
87}
88
89// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -070090::DBus::Variant DBusAdaptor::Int16ToVariant(int16 value) {
91 ::DBus::Variant v;
92 v.writer().append_int16(value);
93 return v;
94}
95
96// static
97::DBus::Variant DBusAdaptor::Int32ToVariant(int32 value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -070098 ::DBus::Variant v;
99 v.writer().append_int32(value);
100 return v;
101}
102
103// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700104::DBus::Variant DBusAdaptor::PathToVariant(const ::DBus::Path &value) {
105 ::DBus::Variant v;
106 v.writer().append_path(value.c_str());
107 return v;
108}
109
110// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700111::DBus::Variant DBusAdaptor::StringToVariant(const string &value) {
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700112 ::DBus::Variant v;
113 v.writer().append_string(value.c_str());
114 return v;
115}
116
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700117// static
118::DBus::Variant DBusAdaptor::StringmapToVariant(
119 const map<string, string> &value) {
120 ::DBus::Variant v;
121 ::DBus::MessageIter writer = v.writer();
122 writer << value;
123 return v;
124}
125
126// static
Chris Masoneb925cc82011-06-22 15:39:57 -0700127::DBus::Variant DBusAdaptor::StringmapsToVariant(
128 const vector<map<string, string> > &value) {
129 ::DBus::Variant v;
130 ::DBus::MessageIter writer = v.writer();
131 writer << value;
132 return v;
133}
134
135// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700136::DBus::Variant DBusAdaptor::StringsToVariant(const vector<string> &value) {
137 ::DBus::Variant v;
138 ::DBus::MessageIter writer = v.writer();
139 writer << value;
140 return v;
141}
142
143// static
144::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
145 ::DBus::Variant v;
146 v.writer().append_uint16(value);
147 return v;
148}
149
150// static
151::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
152 ::DBus::Variant v;
153 v.writer().append_uint32(value);
154 return v;
155}
156
157// static
158bool DBusAdaptor::IsBool(::DBus::Signature signature) {
159 return signature == ::DBus::type<bool>::sig();
160}
161
162// static
163bool DBusAdaptor::IsByte(::DBus::Signature signature) {
164 return signature == ::DBus::type<uint8>::sig();
165}
166
167// static
168bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
169 return signature == ::DBus::type<int16>::sig();
170}
171
172// static
173bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
174 return signature == ::DBus::type<int32>::sig();
175}
176
177// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700178bool DBusAdaptor::IsPath(::DBus::Signature signature) {
179 return signature == ::DBus::type< ::DBus::Path >::sig();
180}
181
182// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700183bool DBusAdaptor::IsString(::DBus::Signature signature) {
184 return signature == ::DBus::type<string>::sig();
185}
186
187// static
188bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
189 return signature == DBusAdaptor::kStringmapSig;
190}
191
192// static
193bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
194 return signature == DBusAdaptor::kStringsSig;
195}
196
197// static
198bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
199 return signature == ::DBus::type<uint16>::sig();
200}
201
202// static
203bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
204 return signature == ::DBus::type<uint32>::sig();
205}
206
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700207} // namespace shill