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

Side by Side Diff: ppapi/proxy/vpn_provider_resource.cc

Issue 1307173009: rebased ppapi vpnProvider (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lkcr
Patch Set: fix compile Created 5 years, 3 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
« no previous file with comments | « ppapi/proxy/vpn_provider_resource.h ('k') | ppapi/shared_impl/resource.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 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 "ppapi/proxy/vpn_provider_resource.h"
6
7 #include "base/bind.h"
8 #include "base/numerics/safe_conversions.h"
9 #include "base/strings/string_split.h"
10 #include "base/strings/string_util.h"
11 #include "ppapi/c/pp_errors.h"
12 #include "ppapi/proxy/dispatch_reply_message.h"
13 #include "ppapi/proxy/ppapi_messages.h"
14 #include "ppapi/shared_impl/array_var.h"
15 #include "ppapi/shared_impl/dictionary_var.h"
16 #include "ppapi/shared_impl/ppapi_globals.h"
17 #include "ppapi/shared_impl/proxy_lock.h"
18 #include "ppapi/shared_impl/tracked_callback.h"
19 #include "ppapi/shared_impl/var.h"
20 #include "ppapi/shared_impl/var_tracker.h"
21
22 namespace ppapi {
23 namespace proxy {
24 VpnProviderResource::VpnProviderResource(Connection connection,
25 PP_Instance instance)
26 : PluginResource(connection, instance),
27 create_config_callback_var_(NULL),
28 get_packet_callback_var_(NULL),
29 get_platform_message_callback_var_(NULL),
30 get_config_message_callback_var_(NULL),
31 get_ui_message_callback_var_(NULL) {
32 SendCreate(BROWSER, PpapiHostMsg_VpnProvider_Create());
33 }
34
35 VpnProviderResource::~VpnProviderResource() {
36 }
37
38 thunk::PPB_VpnProvider_API* VpnProviderResource::AsPPB_VpnProvider_API() {
39 return this;
40 }
41
42 void VpnProviderResource::OnReplyReceived(
43 const ResourceMessageReplyParams& params,
44 const IPC::Message& msg) {
45 PPAPI_BEGIN_MESSAGE_MAP(VpnProviderResource, msg)
46 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(
47 PpapiPluginMsg_VpnProvider_OnPlatformMessage,
48 OnPluginMsgOnPlatformMessage)
49 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(
50 PpapiPluginMsg_VpnProvider_OnPacketReceived, OnPluginMsgOnPacketReceived)
51 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(PpapiPluginMsg_VpnProvider_OnConfigEvent,
52 OnPluginMsgOnConfigEvent)
53 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(PpapiPluginMsg_VpnProvider_OnUIEvent,
54 OnPluginMsgOnUIEvent)
55 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL_UNHANDLED(
56 PluginResource::OnReplyReceived(params, msg))
57 PPAPI_END_MESSAGE_MAP()
58 }
59
60 int32_t VpnProviderResource::CreateConfig(
61 const PP_Var& name,
62 PP_Var* id,
63 const scoped_refptr<TrackedCallback>& callback) {
64 StringVar* name_var = StringVar::FromPPVar(name);
65 if (!name_var)
66 return PP_ERROR_BADARGUMENT;
67
68 if (TrackedCallback::IsPending(create_config_callback_))
69 return PP_ERROR_INPROGRESS;
70
71 create_config_callback_var_ = id;
72 create_config_callback_ = callback;
73
74 Call<PpapiPluginMsg_VpnProvider_CreateConfigReply>(
75 BROWSER, PpapiHostMsg_VpnProvider_CreateConfig(name_var->value()),
76 base::Bind(&VpnProviderResource::OnPluginMsgCreateConfigReply, this));
77
78 return PP_OK_COMPLETIONPENDING;
79 }
80
81 int32_t VpnProviderResource::DestroyConfig(
82 const PP_Var& id,
83 const scoped_refptr<TrackedCallback>& callback) {
84 StringVar* name_var = StringVar::FromPPVar(id);
85 if (!name_var)
86 return PP_ERROR_BADARGUMENT;
87
88 if (TrackedCallback::IsPending(destroy_config_callback_))
89 return PP_ERROR_INPROGRESS;
90
91 destroy_config_callback_ = callback;
92
93 Call<PpapiPluginMsg_VpnProvider_DestroyConfigReply>(
94 BROWSER, PpapiHostMsg_VpnProvider_DestroyConfig(name_var->value()),
95 base::Bind(&VpnProviderResource::OnPluginMsgDestroyConfigReply, this));
96
97 return PP_OK_COMPLETIONPENDING;
98 }
99
100 int32_t VpnProviderResource::SetParameters(
101 const PP_Var& address,
102 const PP_Var& broadcast_address,
103 int32_t mtu,
104 const PP_Var& exclusion_list,
105 const PP_Var& inclusion_list,
106 const PP_Var& domain_search,
107 const PP_Var& dns_servers,
108 const scoped_refptr<TrackedCallback>& callback) {
109 if (TrackedCallback::IsPending(set_parameters_callback_))
110 return PP_ERROR_INPROGRESS;
111
112 set_parameters_callback_ = callback;
113
114 SerializedVpnProviderParameters params;
115 StringVar* address_var = StringVar::FromPPVar(address);
116 if (!address_var)
117 return PP_ERROR_BADARGUMENT;
118 std::string address_str = address_var->value();
119 std::vector<std::string> cidr_parts = base::SplitString(
120 address_str, "/", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
121 CHECK(cidr_parts.size() == 2);
122 params.address = cidr_parts[0];
123 params.subnet = cidr_parts[1];
124
125 ArrayVar* exclusion_list_array = ArrayVar::FromPPVar(exclusion_list);
126 if (!exclusion_list_array) {
127 return PP_ERROR_BADARGUMENT;
128 }
129 for (uint32_t i = 0; i < exclusion_list_array->GetLength(); i++) {
130 StringVar* exclusion_list_var =
131 StringVar::FromPPVar(exclusion_list_array->Get(i));
132 if (!exclusion_list_var) {
133 return PP_ERROR_BADARGUMENT;
134 }
135 params.exclusion_list.push_back(exclusion_list_var->value());
136 }
137
138 ArrayVar* inclusion_list_array = ArrayVar::FromPPVar(inclusion_list);
139 if (!inclusion_list_array) {
140 return PP_ERROR_BADARGUMENT;
141 }
142 for (uint32_t i = 0; i < inclusion_list_array->GetLength(); i++) {
143 StringVar* inclusion_list_var =
144 StringVar::FromPPVar(inclusion_list_array->Get(i));
145 if (!inclusion_list_var) {
146 return PP_ERROR_BADARGUMENT;
147 }
148 params.inclusion_list.push_back(inclusion_list_var->value());
149 }
150
151 params.mtu = mtu;
152
153 StringVar* broadcast_address_var = StringVar::FromPPVar(broadcast_address);
154 if (!broadcast_address_var)
155 return PP_ERROR_BADARGUMENT;
156 params.broadcast_address = broadcast_address_var->value();
157
158 ArrayVar* domain_search_array = ArrayVar::FromPPVar(domain_search);
159 if (!domain_search_array) {
160 return PP_ERROR_BADARGUMENT;
161 }
162 for (uint32_t i = 0; i < domain_search_array->GetLength(); i++) {
163 StringVar* domain_search_var =
164 StringVar::FromPPVar(domain_search_array->Get(i));
165 if (!domain_search_var) {
166 return PP_ERROR_BADARGUMENT;
167 }
168 params.domain_search.push_back(domain_search_var->value());
169 }
170
171 ArrayVar* dns_servers_array = ArrayVar::FromPPVar(dns_servers);
172 if (!dns_servers_array)
173 return PP_ERROR_BADARGUMENT;
174 for (uint32_t i = 0; i < dns_servers_array->GetLength(); i++) {
175 StringVar* dns_servers_var =
176 StringVar::FromPPVar(dns_servers_array->Get(i));
177 if (!dns_servers_var) {
178 return PP_ERROR_BADARGUMENT;
179 }
180 params.dns_servers.push_back(dns_servers_var->value());
181 }
182
183 Call<PpapiPluginMsg_VpnProvider_SetParametersReply>(
184 BROWSER, PpapiHostMsg_VpnProvider_SetParameters(params),
185 base::Bind(&VpnProviderResource::OnPluginMsgSetParametersReply, this));
186
187 return PP_OK_COMPLETIONPENDING;
188 }
189
190 int32_t VpnProviderResource::SendPacket(const PP_Var& data) {
191 // Convert data to std::vector<char>, then send it.
192 scoped_refptr<ArrayBufferVar> data_arraybuffer =
193 ArrayBufferVar::FromPPVar(data);
194 if (!data_arraybuffer.get())
195 return PP_ERROR_BADARGUMENT;
196 char* data_pointer = static_cast<char*>(data_arraybuffer->Map());
197 uint32 data_length = data_arraybuffer->ByteLength();
198 std::vector<char> data_vector(data_pointer, data_pointer + data_length);
199 data_arraybuffer->Unmap();
200
201 Post(BROWSER, PpapiHostMsg_VpnProvider_SendPacket(data_vector));
202
203 return PP_OK;
204 }
205
206 int32_t VpnProviderResource::NotifyConnectionStateChanged(
207 PP_VpnProvider_VpnConnectionState status,
208 const scoped_refptr<TrackedCallback>& callback) {
209 if (TrackedCallback::IsPending(send_state_change_notification_callback_))
210 return PP_ERROR_INPROGRESS;
211
212 send_state_change_notification_callback_ = callback;
213
214 Call<PpapiPluginMsg_VpnProvider_NotifyConnectionStateChangedReply>(
215 BROWSER, PpapiHostMsg_VpnProvider_NotifyConnectionStateChanged(status),
216 base::Bind(
217 &VpnProviderResource::OnPluginMsgNotifyConnectionStateChangedReply,
218 this));
219
220 return PP_OK_COMPLETIONPENDING;
221 }
222
223 int32_t VpnProviderResource::GetPacket(
224 PP_Var* data,
225 const scoped_refptr<TrackedCallback>& callback) {
226 if (TrackedCallback::IsPending(get_packet_callback_))
227 return PP_ERROR_INPROGRESS;
228
229 // Just return received packets if any received packet is queued.
230 if (!received_packets_.empty()) {
231 get_packet_callback_var_ = data;
232 WritePacket();
233 return PP_OK;
234 }
235
236 // Or retain |packet| as buffer to store and install |callback|.
237 get_packet_callback_var_ = data;
238 get_packet_callback_ = callback;
239
240 return PP_OK_COMPLETIONPENDING;
241 }
242
243 int32_t VpnProviderResource::GetPlatformMessage(
244 PP_Var* message,
245 const scoped_refptr<TrackedCallback>& callback) {
246 if (TrackedCallback::IsPending(get_platform_message_callback_))
247 return PP_ERROR_INPROGRESS;
248
249 // Just return received messages if any received message is queued.
250 if (!received_platform_messages_.empty()) {
251 get_platform_message_callback_var_ = message;
252 WritePlatformMessage();
253 return PP_OK;
254 }
255
256 // Or retain |message| as buffer to store and install |callback|.
257 get_platform_message_callback_var_ = message;
258 get_platform_message_callback_ = callback;
259
260 return PP_OK_COMPLETIONPENDING;
261 }
262
263 int32_t VpnProviderResource::GetConfigMessage(
264 PP_Var* message,
265 const scoped_refptr<TrackedCallback>& callback) {
266 if (TrackedCallback::IsPending(get_config_message_callback_))
267 return PP_ERROR_INPROGRESS;
268
269 // Just return received messages if any received message is queued.
270 if (!received_config_messages_.empty()) {
271 get_config_message_callback_var_ = message;
272 WriteConfigMessage();
273 return PP_OK;
274 }
275
276 // Or retain |message| as buffer to store and install |callback|.
277 get_config_message_callback_var_ = message;
278 get_config_message_callback_ = callback;
279
280 return PP_OK_COMPLETIONPENDING;
281 }
282
283 int32_t VpnProviderResource::GetUIMessage(
284 PP_Var* message,
285 const scoped_refptr<TrackedCallback>& callback) {
286 if (TrackedCallback::IsPending(get_ui_message_callback_))
287 return PP_ERROR_INPROGRESS;
288
289 // Just return received messages if any received message is queued.
290 if (!received_ui_messages_.empty()) {
291 get_ui_message_callback_var_ = message;
292 WriteUIMessage();
293 return PP_OK;
294 }
295
296 // Or retain |message| as buffer to store and install |callback|.
297 get_ui_message_callback_var_ = message;
298 get_ui_message_callback_ = callback;
299
300 return PP_OK_COMPLETIONPENDING;
301 }
302
303 // Responds to PpapiPluginMsg_VpnProvider_OnPlatformMessage
304 void VpnProviderResource::OnPluginMsgOnPlatformMessage(
305 const ResourceMessageReplyParams& params,
306 const std::string& id,
307 PP_VpnProvider_PlatformMessage message,
308 const std::string& error) {
309 DictionaryVar* platform_message = new DictionaryVar();
310 platform_message->SetWithStringKey("id", StringVar::StringToPPVar(id));
311 platform_message->SetWithStringKey("message", PP_MakeInt32(message));
312 platform_message->SetWithStringKey("error", StringVar::StringToPPVar(error));
313
314 // Append received message to queue.
315 received_platform_messages_.push(scoped_refptr<Var>(platform_message));
316
317 if (!TrackedCallback::IsPending(get_platform_message_callback_) ||
318 TrackedCallback::IsScheduledToRun(get_platform_message_callback_)) {
319 return;
320 }
321
322 // The plugin may call GetPlatformMessage in its callback.
323 scoped_refptr<TrackedCallback> callback;
324 callback.swap(get_platform_message_callback_);
325 WritePlatformMessage();
326 callback->Run(PP_OK);
327 }
328
329 // Responds to PpapiPluginMsg_VpnProvider_OnPacketReceived
330 void VpnProviderResource::OnPluginMsgOnPacketReceived(
331 const ResourceMessageReplyParams& params,
332 const std::vector<char>& data) {
333 // Append received packet to queue.
334 scoped_refptr<Var> data_var(
335 PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferVar(
336 base::checked_cast<uint32_t>(data.size()), &data.front()));
337 received_packets_.push(data_var);
338
339 if (!TrackedCallback::IsPending(get_packet_callback_) ||
340 TrackedCallback::IsScheduledToRun(get_packet_callback_)) {
341 return;
342 }
343
344 // The plugin may call GetPacket in its callback.
345 scoped_refptr<TrackedCallback> callback;
346 callback.swap(get_packet_callback_);
347 WritePacket();
348 callback->Run(PP_OK);
349 }
350
351 // Responds to PpapiPluginMsg_VpnProvider_OnConfigEvent
352 void VpnProviderResource::OnPluginMsgOnConfigEvent(
353 const ResourceMessageReplyParams& params,
354 const std::string& id,
355 PP_VpnProvider_ConfigMessage message,
356 const std::string& name,
357 const std::string& data) {
358 DictionaryVar* config_message = new DictionaryVar();
359 config_message->SetWithStringKey("id", StringVar::StringToPPVar(id));
360 config_message->SetWithStringKey("message", PP_MakeInt32(message));
361 if (message == PP_VPN_PROVIDER_CONFIG_CREATED) {
362 config_message->SetWithStringKey("name", StringVar::StringToPPVar(name));
363 config_message->SetWithStringKey("data", StringVar::StringToPPVar(data));
364 }
365
366 // Append received message to queue.
367 received_config_messages_.push(scoped_refptr<Var>(config_message));
368
369 if (!TrackedCallback::IsPending(get_config_message_callback_) ||
370 TrackedCallback::IsScheduledToRun(get_config_message_callback_)) {
371 return;
372 }
373
374 // The plugin may call GetConfigMessage in its callback.
375 scoped_refptr<TrackedCallback> callback;
376 callback.swap(get_config_message_callback_);
377 WriteConfigMessage();
378 callback->Run(PP_OK);
379 }
380
381 // Responds to PpapiPluginMsg_VpnProvider_OnUIEvent
382 void VpnProviderResource::OnPluginMsgOnUIEvent(
383 const ResourceMessageReplyParams& params,
384 PP_VpnProvider_UIEvent event,
385 const std::string& id) {
386 DictionaryVar* ui_event = new DictionaryVar();
387 ui_event->SetWithStringKey("event", PP_MakeInt32(event));
388 ui_event->SetWithStringKey("id", StringVar::StringToPPVar(id));
389
390 // Append received message to queue.
391 received_ui_messages_.push(scoped_refptr<Var>(ui_event));
392
393 if (!TrackedCallback::IsPending(get_config_message_callback_) ||
394 TrackedCallback::IsScheduledToRun(get_config_message_callback_)) {
395 return;
396 }
397
398 // The plugin may call GetUIMessage in its callback.
399 scoped_refptr<TrackedCallback> callback;
400 callback.swap(get_ui_message_callback_);
401 WriteUIMessage();
402 callback->Run(PP_OK);
403 }
404
405 // Responds to PpapiPluginMsg_VpnProvider_CreateConfigReply
406 // Forwards to create_config_callback_
407 void VpnProviderResource::OnPluginMsgCreateConfigReply(
408 const ResourceMessageReplyParams& params,
409 int32_t result,
410 const std::string& id) {
411 // The callback may have been aborted by Close().
412 if (TrackedCallback::IsPending(create_config_callback_)) {
413 *create_config_callback_var_ = StringVar::StringToPPVar(id);
414 // The plugin may call CreateConfig in its callback.
415 scoped_refptr<TrackedCallback> callback;
416 callback.swap(create_config_callback_);
417 // On error: Pass return code
418 // On succes: Pass message
419 callback->Run(params.result() ? params.result() : result);
420 }
421 }
422
423 // Responds to PpapiPluginMsg_VpnProvider_DestroyConfigReply
424 // Forwards to destroy_config_callback_
425 void VpnProviderResource::OnPluginMsgDestroyConfigReply(
426 const ResourceMessageReplyParams& params,
427 int32_t result) {
428 // The callback may have been aborted by Close().
429 if (TrackedCallback::IsPending(destroy_config_callback_)) {
430 // The plugin may call DestroyConfig in its callback.
431 scoped_refptr<TrackedCallback> callback;
432 callback.swap(destroy_config_callback_);
433 // On error: Pass return code
434 // On succes: Pass message
435 callback->Run(params.result() ? params.result() : result);
436 }
437 }
438
439 // Responds to PpapiPluginMsg_VpnProvider_SetParametersReply
440 // Forwards to set_parameters_callback_
441 void VpnProviderResource::OnPluginMsgSetParametersReply(
442 const ResourceMessageReplyParams& params,
443 int32_t result) {
444 // The callback may have been aborted by Close().
445 if (TrackedCallback::IsPending(set_parameters_callback_)) {
446 // The plugin may call SetParameters in its callback.
447 scoped_refptr<TrackedCallback> callback;
448 callback.swap(set_parameters_callback_);
449 // On error: Pass return code
450 // On succes: Pass message
451 callback->Run(params.result() ? params.result() : result);
452 }
453 }
454
455 // Responds to PpapiPluginMsg_VpnProvider_NotifyConnectionStateChangedReply
456 // Forwards to send_state_change_notification_callback_
457 void VpnProviderResource::OnPluginMsgNotifyConnectionStateChangedReply(
458 const ResourceMessageReplyParams& params,
459 int32_t result) {
460 // The callback may have been aborted by Close().
461 if (TrackedCallback::IsPending(send_state_change_notification_callback_)) {
462 // The plugin may call NotifyConnectionStateChanged in its callback.
463 scoped_refptr<TrackedCallback> callback;
464 callback.swap(send_state_change_notification_callback_);
465 // On error: Pass return code
466 // On succes: Pass message
467 callback->Run(params.result() ? params.result() : result);
468 }
469 }
470
471 void VpnProviderResource::WritePacket() {
472 if (!get_packet_callback_var_)
473 return;
474
475 *get_packet_callback_var_ = received_packets_.front()->GetPPVar();
476 received_packets_.pop();
477 get_packet_callback_var_ = NULL;
478 }
479
480 void VpnProviderResource::WritePlatformMessage() {
481 if (!get_platform_message_callback_var_)
482 return;
483
484 *get_platform_message_callback_var_ =
485 received_platform_messages_.front()->GetPPVar();
486 received_platform_messages_.pop();
487 get_platform_message_callback_var_ = NULL;
488 }
489
490 void VpnProviderResource::WriteConfigMessage() {
491 if (!get_config_message_callback_var_)
492 return;
493
494 *get_config_message_callback_var_ =
495 received_config_messages_.front()->GetPPVar();
496 received_config_messages_.pop();
497 get_config_message_callback_var_ = NULL;
498 }
499
500 void VpnProviderResource::WriteUIMessage() {
501 if (!get_ui_message_callback_var_)
502 return;
503
504 *get_ui_message_callback_var_ = received_ui_messages_.front()->GetPPVar();
505 received_ui_messages_.pop();
506 get_ui_message_callback_var_ = NULL;
507 }
508
509 } // namespace proxy
510 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/proxy/vpn_provider_resource.h ('k') | ppapi/shared_impl/resource.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698