blob: 005fcc6015ac814e0c17f261948b32af13cbc419 [file] [log] [blame]
Darin Petkov096b3472012-05-15 10:26:22 +02001// Copyright (c) 2012 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
5#include "shill/wimax_device_proxy.h"
6
7#include <base/bind.h>
Ben Chanb879d142012-05-15 11:10:32 -07008#include <chromeos/dbus/service_constants.h>
Darin Petkov096b3472012-05-15 10:26:22 +02009
10#include "shill/error.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070011#include "shill/logging.h"
Darin Petkov096b3472012-05-15 10:26:22 +020012
13using base::Bind;
14using base::Callback;
15using base::Unretained;
16using std::string;
Darin Petkov9893d9c2012-05-17 15:27:31 -070017using std::vector;
Darin Petkov8ea0eaf2012-05-29 11:21:33 +020018using wimax_manager::DeviceStatus;
Darin Petkov096b3472012-05-15 10:26:22 +020019
20namespace shill {
21
Darin Petkov096b3472012-05-15 10:26:22 +020022WiMaxDeviceProxy::WiMaxDeviceProxy(DBus::Connection *connection,
23 const DBus::Path &path)
24 : proxy_(connection, path) {}
25
26WiMaxDeviceProxy::~WiMaxDeviceProxy() {}
27
28void WiMaxDeviceProxy::Enable(Error *error,
29 const ResultCallback &callback,
30 int timeout) {
31 SLOG(DBus, 2) << __func__ << "(" << timeout << ")";
32 Invoke(Bind((void (Proxy::*)(void *, int))&Proxy::Enable,
33 Unretained(&proxy_)),
34 error, callback, timeout);
35}
36
37void WiMaxDeviceProxy::Disable(Error *error,
38 const ResultCallback &callback,
39 int timeout) {
40 SLOG(DBus, 2) << __func__ << "(" << timeout << ")";
41 Invoke(Bind((void (Proxy::*)(void *, int))&Proxy::Disable,
42 Unretained(&proxy_)),
43 error, callback, timeout);
44}
45
Darin Petkov9893d9c2012-05-17 15:27:31 -070046void WiMaxDeviceProxy::ScanNetworks(Error *error,
47 const ResultCallback &callback,
48 int timeout) {
49 SLOG(DBus, 2) << __func__ << "(" << timeout << ")";
50 Invoke(Bind((void (Proxy::*)(void *, int))&Proxy::ScanNetworks,
51 Unretained(&proxy_)),
52 error, callback, timeout);
53}
54
Darin Petkov25665aa2012-05-21 14:08:12 +020055void WiMaxDeviceProxy::Connect(const RpcIdentifier &network,
56 const KeyValueStore &parameters,
Ben Chan4e5c1312012-05-18 18:45:38 -070057 Error *error,
Darin Petkov096b3472012-05-15 10:26:22 +020058 const ResultCallback &callback,
59 int timeout) {
60 SLOG(DBus, 2) << __func__ << "(" << timeout << ")";
Darin Petkov25665aa2012-05-21 14:08:12 +020061 DBus::Path path = network;
62 DBusPropertiesMap args;
63 DBusProperties::ConvertKeyValueStoreToMap(parameters, &args);
Ben Chan4e5c1312012-05-18 18:45:38 -070064 Invoke(Bind((void (Proxy::*)(const DBus::Path &, const DBusPropertiesMap &,
65 void *, int))&Proxy::Connect,
Darin Petkov25665aa2012-05-21 14:08:12 +020066 Unretained(&proxy_), path, args),
Darin Petkov096b3472012-05-15 10:26:22 +020067 error, callback, timeout);
68}
69
70void WiMaxDeviceProxy::Disconnect(Error *error,
71 const ResultCallback &callback,
72 int timeout) {
73 SLOG(DBus, 2) << __func__ << "(" << timeout << ")";
74 Invoke(Bind((void (Proxy::*)(void *, int))&Proxy::Disconnect,
75 Unretained(&proxy_)),
76 error, callback, timeout);
77}
78
Darin Petkov9893d9c2012-05-17 15:27:31 -070079void WiMaxDeviceProxy::set_networks_changed_callback(
80 const NetworksChangedCallback &callback) {
81 proxy_.set_networks_changed_callback(callback);
82}
83
Darin Petkov8ea0eaf2012-05-29 11:21:33 +020084void WiMaxDeviceProxy::set_status_changed_callback(
85 const StatusChangedCallback &callback) {
86 proxy_.set_status_changed_callback(callback);
87}
88
Darin Petkov096b3472012-05-15 10:26:22 +020089uint8 WiMaxDeviceProxy::Index(Error *error) {
90 SLOG(DBus, 2) << __func__;
91 try {
92 return proxy_.Index();
93 } catch (const DBus::Error &e) {
94 FromDBusError(e, error);
95 }
96 return 0;
97}
98
99string WiMaxDeviceProxy::Name(Error *error) {
100 SLOG(DBus, 2) << __func__;
101 try {
102 return proxy_.Name();
103 } catch (const DBus::Error &e) {
104 FromDBusError(e, error);
105 }
106 return string();
107}
108
Darin Petkov59f2d692012-06-07 15:57:46 +0200109RpcIdentifiers WiMaxDeviceProxy::Networks(Error *error) {
110 SLOG(DBus, 2) << __func__;
111 vector<DBus::Path> dbus_paths;
112 try {
113 dbus_paths = proxy_.Networks();
114 } catch (const DBus::Error &e) {
115 FromDBusError(e, error);
116 return RpcIdentifiers();
117 }
118 RpcIdentifiers rpc_networks;
119 DBusProperties::ConvertPathsToRpcIdentifiers(dbus_paths, &rpc_networks);
120 return rpc_networks;
121}
122
Darin Petkov096b3472012-05-15 10:26:22 +0200123void WiMaxDeviceProxy::Invoke(const Callback<void(void *, int)> &method,
124 Error *error,
125 const ResultCallback &callback,
126 int timeout) {
127 scoped_ptr<ResultCallback> cb(new ResultCallback(callback));
128 try {
129 method.Run(cb.get(), timeout);
130 cb.release();
131 } catch (const DBus::Error &e) {
132 FromDBusError(e, error);
133 }
134}
135
136// static
137void WiMaxDeviceProxy::FromDBusError(const DBus::Error &dbus_error,
138 Error *error) {
139 if (!error) {
140 return;
141 }
142 if (!dbus_error.is_set()) {
143 error->Reset();
144 return;
145 }
146 Error::PopulateAndLog(error, Error::kOperationFailed, dbus_error.what());
147}
148
149WiMaxDeviceProxy::Proxy::Proxy(DBus::Connection *connection,
150 const DBus::Path &path)
Ben Chanb879d142012-05-15 11:10:32 -0700151 : DBus::ObjectProxy(*connection, path,
152 wimax_manager::kWiMaxManagerServiceName) {}
Darin Petkov096b3472012-05-15 10:26:22 +0200153
154WiMaxDeviceProxy::Proxy::~Proxy() {}
155
Darin Petkov9893d9c2012-05-17 15:27:31 -0700156void WiMaxDeviceProxy::Proxy::set_networks_changed_callback(
157 const NetworksChangedCallback &callback) {
158 networks_changed_callback_ = callback;
159}
160
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200161void WiMaxDeviceProxy::Proxy::set_status_changed_callback(
162 const StatusChangedCallback &callback) {
163 status_changed_callback_ = callback;
164}
165
Darin Petkov9893d9c2012-05-17 15:27:31 -0700166void WiMaxDeviceProxy::Proxy::NetworksChanged(
167 const vector<DBus::Path> &networks) {
168 SLOG(DBus, 2) << __func__ << "(" << networks.size() << ")";
169 if (networks_changed_callback_.is_null()) {
170 return;
171 }
172 RpcIdentifiers rpc_networks;
173 DBusProperties::ConvertPathsToRpcIdentifiers(networks, &rpc_networks);
174 networks_changed_callback_.Run(rpc_networks);
175}
176
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200177void WiMaxDeviceProxy::Proxy::StatusChanged(const int32 &status) {
178 SLOG(DBus, 2) << __func__ << "(" << status << ")";
179 if (status_changed_callback_.is_null()) {
180 return;
181 }
182 status_changed_callback_.Run(static_cast<DeviceStatus>(status));
183}
184
Darin Petkov096b3472012-05-15 10:26:22 +0200185void WiMaxDeviceProxy::Proxy::EnableCallback(const DBus::Error &error,
186 void *data) {
187 SLOG(DBus, 2) << __func__;
188 HandleCallback(error, data);
189}
190
191void WiMaxDeviceProxy::Proxy::DisableCallback(const DBus::Error &error,
192 void *data) {
193 SLOG(DBus, 2) << __func__;
194 HandleCallback(error, data);
195}
196
Darin Petkov9893d9c2012-05-17 15:27:31 -0700197void WiMaxDeviceProxy::Proxy::ScanNetworksCallback(const DBus::Error &error,
198 void *data) {
199 SLOG(DBus, 2) << __func__;
200 HandleCallback(error, data);
201}
202
Darin Petkov096b3472012-05-15 10:26:22 +0200203void WiMaxDeviceProxy::Proxy::ConnectCallback(const DBus::Error &error,
204 void *data) {
205 SLOG(DBus, 2) << __func__;
206 HandleCallback(error, data);
207}
208
209void WiMaxDeviceProxy::Proxy::DisconnectCallback(const DBus::Error &error,
210 void *data) {
211 SLOG(DBus, 2) << __func__;
212 HandleCallback(error, data);
213}
214
215// static
216void WiMaxDeviceProxy::Proxy::HandleCallback(const DBus::Error &error,
217 void *data) {
218 scoped_ptr<ResultCallback> callback(reinterpret_cast<ResultCallback *>(data));
219 Error e;
220 FromDBusError(error, &e);
221 callback->Run(e);
222}
223
224} // namespace shill