blob: 748832c234f372914440c8f1f2e1c7298b316d13 [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"
14#include "shill/property_store_interface.h"
15
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 Masone8fe2c7e2011-06-09 15:51:19 -070034bool DBusAdaptor::DispatchOnType(PropertyStoreInterface *store,
35 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
127::DBus::Variant DBusAdaptor::StringsToVariant(const vector<string> &value) {
128 ::DBus::Variant v;
129 ::DBus::MessageIter writer = v.writer();
130 writer << value;
131 return v;
132}
133
134// static
135::DBus::Variant DBusAdaptor::Uint16ToVariant(uint16 value) {
136 ::DBus::Variant v;
137 v.writer().append_uint16(value);
138 return v;
139}
140
141// static
142::DBus::Variant DBusAdaptor::Uint32ToVariant(uint32 value) {
143 ::DBus::Variant v;
144 v.writer().append_uint32(value);
145 return v;
146}
147
148// static
149bool DBusAdaptor::IsBool(::DBus::Signature signature) {
150 return signature == ::DBus::type<bool>::sig();
151}
152
153// static
154bool DBusAdaptor::IsByte(::DBus::Signature signature) {
155 return signature == ::DBus::type<uint8>::sig();
156}
157
158// static
159bool DBusAdaptor::IsInt16(::DBus::Signature signature) {
160 return signature == ::DBus::type<int16>::sig();
161}
162
163// static
164bool DBusAdaptor::IsInt32(::DBus::Signature signature) {
165 return signature == ::DBus::type<int32>::sig();
166}
167
168// static
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700169bool DBusAdaptor::IsPath(::DBus::Signature signature) {
170 return signature == ::DBus::type< ::DBus::Path >::sig();
171}
172
173// static
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700174bool DBusAdaptor::IsString(::DBus::Signature signature) {
175 return signature == ::DBus::type<string>::sig();
176}
177
178// static
179bool DBusAdaptor::IsStringmap(::DBus::Signature signature) {
180 return signature == DBusAdaptor::kStringmapSig;
181}
182
183// static
184bool DBusAdaptor::IsStrings(::DBus::Signature signature) {
185 return signature == DBusAdaptor::kStringsSig;
186}
187
188// static
189bool DBusAdaptor::IsUint16(::DBus::Signature signature) {
190 return signature == ::DBus::type<uint16>::sig();
191}
192
193// static
194bool DBusAdaptor::IsUint32(::DBus::Signature signature) {
195 return signature == ::DBus::type<uint32>::sig();
196}
197
Chris Masoned0ceb8c2011-06-02 10:05:39 -0700198} // namespace shill