Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(834)

Side by Side Diff: chrome/browser/chromeos/extensions/networking_private_api.cc

Issue 11975015: This adds a private extension API to use for simple networking (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix permission_set_unittest Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium 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 "chrome/browser/chromeos/extensions/networking_private_api.h"
6
7 #include "base/bind_helpers.h"
8 #include "chrome/browser/chromeos/extensions/networking_private_api_factory.h"
9 #include "chrome/browser/extensions/extension_function_registry.h"
10 #include "chromeos/dbus/dbus_thread_manager.h"
11 #include "chromeos/dbus/shill_manager_client.h"
12 #include "chromeos/dbus/shill_service_client.h"
13 #include "dbus/object_path.h"
14 #include "third_party/cros_system_api/dbus/service_constants.h"
15
16 namespace chromeos {
17
18 namespace {
19
20 // These are keys used by the JavaScript code to access information in the
21 // result.
22 const char kBssid[] = "bssid";
23 const char kName[] = "name";
24 const char kNetworkId[] = "networkId";
25 const char kNetworkTypeAll[] = "all";
26 const char kStatus[] = "status";
27 const char kType[] = "type";
28
29 // This creates a new dictionary that only contains the information we're
30 // interested in passing on to JavaScript.
stevenjb 2013/01/17 00:04:30 I thought we were going to use ONC properties for
Greg Spencer (Chromium) 2013/01/17 00:10:23 Good point on the ONC, I'll switch it to that form
31 base::DictionaryValue* CreateFilteredResult(
32 const base::DictionaryValue& properties) {
33 scoped_ptr<base::DictionaryValue> filtered_result(new base::DictionaryValue);
34
35 std::string bssid;
36 if (properties.GetString(flimflam::kWifiBSsid, &bssid))
37 filtered_result->SetString(kBssid, bssid);
38 std::string name;
39 if (properties.GetString(flimflam::kNameProperty, &name))
40 filtered_result->SetString(kName, name);
41 std::string type;
42 if (properties.GetString(flimflam::kTypeProperty, &type))
43 filtered_result->SetString(kType, type);
44 std::string state;
45 if (properties.GetString(flimflam::kStateProperty, &state)) {
46 if (state == flimflam::kStateReady || state == flimflam::kStateOnline) {
stevenjb 2013/01/17 00:04:30 This should use NetworkState::StateIsConnected()
47 filtered_result->SetString(kStatus, "connected");
48 } else if (state == flimflam::kStateAssociation ||
49 state == flimflam::kStatePortal ||
50 state == flimflam::kStateConfiguration) {
stevenjb 2013/01/17 00:04:30 This should use NetworkState::StateIsConnecting()
51 filtered_result->SetString(kStatus, "connecting");
stevenjb 2013/01/17 00:04:30 This should also be a const defined above
52 } else {
53 filtered_result->SetString(kStatus, "notConnected");
stevenjb 2013/01/17 00:04:30 ditto
54 }
55 }
56
57 return filtered_result.release();
58 }
59
60 } // namespace
61
62
63 ////////////////////////////////////////////////////////////////////////////////
64 // NetworkingGetPropertiesFunction
65
66 NetworkingGetPropertiesFunction::~NetworkingGetPropertiesFunction() {}
stevenjb 2013/01/17 00:04:30 nit: I generally see/prefer } on a second line out
Greg Spencer (Chromium) 2013/01/18 01:20:30 Done.
67
68 bool NetworkingGetPropertiesFunction::RunImpl() {
69 std::string service_path;
70 if (!args_->GetString(0, &service_path))
71 return false;
72
73 DBusThreadManager::Get()->GetShillServiceClient()->GetProperties(
74 dbus::ObjectPath(service_path), base::Bind(
75 &NetworkingGetPropertiesFunction::ResultCallback, this));
76 return true;
77 }
78
79 void NetworkingGetPropertiesFunction::ResultCallback(
80 DBusMethodCallStatus call_status,
81 const base::DictionaryValue& result) {
82 scoped_ptr<base::DictionaryValue> filtered_result(
83 CreateFilteredResult(result));
84
85 SetResult(filtered_result.release());
86 SendResponse(true);
87 }
88
89 ////////////////////////////////////////////////////////////////////////////////
90 // NetworkingGetVisibleNetworksFunction::ScopedDecrementer
91
92 NetworkingGetVisibleNetworksFunction::ScopedDecrementer::ScopedDecrementer(
93 NetworkingGetVisibleNetworksFunction* parent,
94 scoped_refptr<NetworkingGetVisibleNetworksFunction::ResultList> result_list)
95 : parent_(parent), result_list_(result_list) {
stevenjb 2013/01/17 00:04:30 align, separate line per member
Greg Spencer (Chromium) 2013/01/18 01:20:30 Done.
96 }
97
98 NetworkingGetVisibleNetworksFunction::ScopedDecrementer::~ScopedDecrementer() {
99 result_list_->count--;
stevenjb 2013/01/17 00:04:30 pre-decrement
Greg Spencer (Chromium) 2013/01/18 01:20:30 Done.
100 if (result_list_->count == 0) {
101 parent_->SetResult(result_list_->list.release());
102 parent_->SendResponse(true);
103 }
104 }
105
106 ////////////////////////////////////////////////////////////////////////////////
107 // NetworkingGetVisibleNetworksFunction
108
109 NetworkingGetVisibleNetworksFunction::~NetworkingGetVisibleNetworksFunction() {}
110
111 bool NetworkingGetVisibleNetworksFunction::RunImpl() {
112 std::string network_type;
113 if (!args_->GetString(0, &network_type))
114 return false;
115
116 DBusThreadManager::Get()->GetShillManagerClient()->GetProperties(
117 base::Bind(
118 &NetworkingGetVisibleNetworksFunction::ManagerPropertiesCallback,
119 this,
120 network_type));
121 return true;
122 }
123
124 // For each of the available services, fire off a request for its properties.
125 void NetworkingGetVisibleNetworksFunction::ManagerPropertiesCallback(
126 const std::string& network_type,
127 DBusMethodCallStatus call_status,
128 const base::DictionaryValue& result) {
129 const base::ListValue* available_services;
130 if (!result.GetList(flimflam::kServicesProperty, &available_services)) {
131 error_ = "Error.noServices";
132 SendResponse(false);
133 return;
134 }
135
136 scoped_refptr<ResultList> results(new ResultList);
137 results->count = available_services->GetSize();
138 for (size_t i = 0; i < available_services->GetSize(); ++i) {
139 std::string service_path;
140 available_services->GetString(i, &service_path);
141 DBusThreadManager::Get()->GetShillServiceClient()->GetProperties(
142 dbus::ObjectPath(service_path),
143 base::Bind(
144 &NetworkingGetVisibleNetworksFunction::ServicePropertiesCallback,
145 this,
146 service_path,
147 network_type,
148 results));
149 }
150 }
151
152 // If this network is of the appropriate type, add it to the results and
153 // decrement the count. If the count hits zero, then send the result.
154 void NetworkingGetVisibleNetworksFunction::ServicePropertiesCallback(
155 const std::string& service_path,
156 const std::string& network_type,
157 scoped_refptr<ResultList> result_list,
158 DBusMethodCallStatus call_status,
159 const base::DictionaryValue& result) {
160 // We must decrement the count each time we get a callback, regardless of the
161 // outcome.
162 ScopedDecrementer decrementer(this, result_list);
163
164 if (call_status != DBUS_METHOD_CALL_SUCCESS)
165 return;
166
167 std::string type;
168 if (!result.GetString(flimflam::kTypeProperty, &type))
169 return;
170
171 if (type == network_type || network_type == kNetworkTypeAll) {
172 scoped_ptr<base::DictionaryValue> network_properties(
173 CreateFilteredResult(result));
174 network_properties->SetString(kNetworkId, service_path);
175 result_list->list->Append(network_properties.release());
176 }
177 }
178
179 ////////////////////////////////////////////////////////////////////////////////
180 // NetworkingRequestConnectFunction
181
182 NetworkingRequestConnectFunction::~NetworkingRequestConnectFunction() {}
183
184 void NetworkingRequestConnectFunction::ConnectSuccess() {
185 SendResponse(true);
186 }
187
188 void NetworkingRequestConnectFunction::ConnectFailed(
189 const std::string& errorName,
190 const std::string& errorMessage) {
191 error_ = errorName;
192 SendResponse(false);
193 }
194
195 bool NetworkingRequestConnectFunction::RunImpl() {
196 std::string service_path;
197 if (!args_->GetString(0, &service_path))
198 return false;
199
200 DBusThreadManager::Get()->GetShillServiceClient()->Connect(
201 dbus::ObjectPath(service_path),
202 base::Bind(&NetworkingRequestConnectFunction::ConnectSuccess, this),
203 base::Bind(&NetworkingRequestConnectFunction::ConnectFailed, this));
204 return true;
205 }
206
207 ////////////////////////////////////////////////////////////////////////////////
208 // NetworkingRequestDisconnectFunction
209
210 NetworkingRequestDisconnectFunction::~NetworkingRequestDisconnectFunction() {}
211
212 void NetworkingRequestDisconnectFunction::ConnectSuccess() {
213 SendResponse(true);
stevenjb 2013/01/17 00:04:30 Note: this does not mean that we connected, just t
Greg Spencer (Chromium) 2013/01/18 01:20:30 I documented it. The Javascript can wait for a pr
214 }
215
216 void NetworkingRequestDisconnectFunction::ConnectFailed(
217 const std::string& errorName,
218 const std::string& errorMessage) {
219 error_ = errorName;
220 SendResponse(false);
221 }
222
223 bool NetworkingRequestDisconnectFunction::RunImpl() {
224 std::string service_path;
225 if (!args_->GetString(0, &service_path))
226 return false;
227
228 DBusThreadManager::Get()->GetShillServiceClient()->Connect(
229 dbus::ObjectPath(service_path),
230 base::Bind(&NetworkingRequestDisconnectFunction::ConnectSuccess, this),
231 base::Bind(&NetworkingRequestDisconnectFunction::ConnectFailed, this));
232 return true;
233 }
234
235 ////////////////////////////////////////////////////////////////////////////////
236 // NetworkingPrivateAPI
237
238 NetworkingPrivateAPI::NetworkingPrivateAPI(Profile* profile) {
239 ExtensionFunctionRegistry* registry =
240 ExtensionFunctionRegistry::GetInstance();
241 registry->RegisterFunction<NetworkingGetPropertiesFunction>();
242 registry->RegisterFunction<NetworkingGetVisibleNetworksFunction>();
243 registry->RegisterFunction<NetworkingRequestConnectFunction>();
244 registry->RegisterFunction<NetworkingRequestDisconnectFunction>();
245 }
246
247 NetworkingPrivateAPI::~NetworkingPrivateAPI() {
248 }
249
250 void NetworkingPrivateAPI::Shutdown() {
251 }
252
253 // static
254 NetworkingPrivateAPI* NetworkingPrivateAPI::Get(Profile* profile) {
255 return NetworkingPrivateAPIFactory::GetForProfile(profile);
256 }
257
258 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698