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

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

Issue 1726303003: ppapi: PPB_VpnProvider: Define API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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
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 thunk::PPB_VpnProvider_API* VpnProviderResource::AsPPB_VpnProvider_API() {
38 return this;
39 }
40
41 void VpnProviderResource::OnReplyReceived(
42 const ResourceMessageReplyParams& params,
43 const IPC::Message& msg) {
44 PPAPI_BEGIN_MESSAGE_MAP(VpnProviderResource, msg)
45 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(
46 PpapiPluginMsg_VpnProvider_OnPlatformMessage,
47 OnPluginMsgOnPlatformMessage)
48 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(
49 PpapiPluginMsg_VpnProvider_OnPacketReceived,
50 OnPluginMsgOnPacketReceived)
51 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(
52 PpapiPluginMsg_VpnProvider_OnConfigEvent, 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 const char kCIDRSeperator[] = "/";
116
117 StringVar* address_var = StringVar::FromPPVar(address);
118 if (!address_var)
119 return PP_ERROR_BADARGUMENT;
120 std::string address_str = address_var->value();
121 std::vector<std::string> cidr_parts =
122 base::SplitString(address_str, kCIDRSeperator, base::KEEP_WHITESPACE,
123 base::SPLIT_WANT_NONEMPTY);
124 CHECK_EQ(2u, cidr_parts.size());
125 params.address = cidr_parts[0];
126 params.subnet = cidr_parts[1];
127
128 ArrayVar* exclusion_list_array = ArrayVar::FromPPVar(exclusion_list);
129 if (!exclusion_list_array) {
130 return PP_ERROR_BADARGUMENT;
131 }
132 for (uint32_t i = 0; i < exclusion_list_array->GetLength(); i++) {
133 StringVar* exclusion_list_var =
134 StringVar::FromPPVar(exclusion_list_array->Get(i));
135 if (!exclusion_list_var) {
136 return PP_ERROR_BADARGUMENT;
137 }
138 params.exclusion_list.push_back(exclusion_list_var->value());
139 }
140
141 ArrayVar* inclusion_list_array = ArrayVar::FromPPVar(inclusion_list);
142 if (!inclusion_list_array) {
143 return PP_ERROR_BADARGUMENT;
144 }
145 for (uint32_t i = 0; i < inclusion_list_array->GetLength(); i++) {
146 StringVar* inclusion_list_var =
147 StringVar::FromPPVar(inclusion_list_array->Get(i));
148 if (!inclusion_list_var) {
149 return PP_ERROR_BADARGUMENT;
150 }
151 params.inclusion_list.push_back(inclusion_list_var->value());
152 }
153
154 params.mtu = mtu;
155
156 StringVar* broadcast_address_var = StringVar::FromPPVar(broadcast_address);
157 if (!broadcast_address_var)
158 return PP_ERROR_BADARGUMENT;
159 params.broadcast_address = broadcast_address_var->value();
160
161 ArrayVar* domain_search_array = ArrayVar::FromPPVar(domain_search);
162 if (!domain_search_array) {
163 return PP_ERROR_BADARGUMENT;
164 }
165 for (uint32_t i = 0; i < domain_search_array->GetLength(); i++) {
166 StringVar* domain_search_var =
167 StringVar::FromPPVar(domain_search_array->Get(i));
168 if (!domain_search_var) {
169 return PP_ERROR_BADARGUMENT;
170 }
171 params.domain_search.push_back(domain_search_var->value());
172 }
173
174 ArrayVar* dns_servers_array = ArrayVar::FromPPVar(dns_servers);
175 if (!dns_servers_array)
176 return PP_ERROR_BADARGUMENT;
177 for (uint32_t i = 0; i < dns_servers_array->GetLength(); i++) {
178 StringVar* dns_servers_var =
179 StringVar::FromPPVar(dns_servers_array->Get(i));
180 if (!dns_servers_var) {
181 return PP_ERROR_BADARGUMENT;
182 }
183 params.dns_servers.push_back(dns_servers_var->value());
184 }
185
186 Call<PpapiPluginMsg_VpnProvider_SetParametersReply>(
187 BROWSER, PpapiHostMsg_VpnProvider_SetParameters(params),
188 base::Bind(&VpnProviderResource::OnPluginMsgSetParametersReply, this));
189
190 return PP_OK_COMPLETIONPENDING;
191 }
192
193 int32_t VpnProviderResource::SendPacket(const PP_Var& data) {
194 // Convert data to std::vector<char>, then send it.
195 scoped_refptr<ArrayBufferVar> data_arraybuffer =
196 ArrayBufferVar::FromPPVar(data);
197 if (!data_arraybuffer.get())
198 return PP_ERROR_BADARGUMENT;
199 char* data_pointer = static_cast<char*>(data_arraybuffer->Map());
200 uint32_t data_length = data_arraybuffer->ByteLength();
201 std::vector<char> data_vector(data_pointer, data_pointer + data_length);
202 data_arraybuffer->Unmap();
203
204 Post(BROWSER, PpapiHostMsg_VpnProvider_SendPacket(data_vector));
205
206 return PP_OK;
207 }
208
209 int32_t VpnProviderResource::NotifyConnectionStateChanged(
210 PP_VpnProvider_VpnConnectionState status,
211 const scoped_refptr<TrackedCallback>& callback) {
212 if (TrackedCallback::IsPending(send_state_change_notification_callback_))
213 return PP_ERROR_INPROGRESS;
214
215 send_state_change_notification_callback_ = callback;
216
217 Call<PpapiPluginMsg_VpnProvider_NotifyConnectionStateChangedReply>(
218 BROWSER, PpapiHostMsg_VpnProvider_NotifyConnectionStateChanged(status),
219 base::Bind(
220 &VpnProviderResource::OnPluginMsgNotifyConnectionStateChangedReply,
221 this));
222
223 return PP_OK_COMPLETIONPENDING;
224 }
225
226 int32_t VpnProviderResource::GetPacket(
227 PP_Var* data,
228 const scoped_refptr<TrackedCallback>& callback) {
229 if (TrackedCallback::IsPending(get_packet_callback_))
230 return PP_ERROR_INPROGRESS;
231
232 // Just return received packets if any received packet is queued.
233 if (!received_packets_.empty()) {
234 get_packet_callback_var_ = data;
235 WritePacket();
236 return PP_OK;
237 }
238
239 // Or retain |packet| as buffer to store and install |callback|.
240 get_packet_callback_var_ = data;
241 get_packet_callback_ = callback;
242
243 return PP_OK_COMPLETIONPENDING;
244 }
245
246 int32_t VpnProviderResource::GetPlatformMessage(
247 PP_Var* message,
248 const scoped_refptr<TrackedCallback>& callback) {
249 if (TrackedCallback::IsPending(get_platform_message_callback_))
250 return PP_ERROR_INPROGRESS;
251
252 // Just return received messages if any received message is queued.
253 if (!received_platform_messages_.empty()) {
254 get_platform_message_callback_var_ = message;
255 WritePlatformMessage();
256 return PP_OK;
257 }
258
259 // Or retain |message| as buffer to store and install |callback|.
260 get_platform_message_callback_var_ = message;
261 get_platform_message_callback_ = callback;
262
263 return PP_OK_COMPLETIONPENDING;
264 }
265
266 int32_t VpnProviderResource::GetConfigMessage(
267 PP_Var* message,
268 const scoped_refptr<TrackedCallback>& callback) {
269 if (TrackedCallback::IsPending(get_config_message_callback_))
270 return PP_ERROR_INPROGRESS;
271
272 // Just return received messages if any received message is queued.
273 if (!received_config_messages_.empty()) {
274 get_config_message_callback_var_ = message;
275 WriteConfigMessage();
276 return PP_OK;
277 }
278
279 // Or retain |message| as buffer to store and install |callback|.
280 get_config_message_callback_var_ = message;
281 get_config_message_callback_ = callback;
282
283 return PP_OK_COMPLETIONPENDING;
284 }
285
286 int32_t VpnProviderResource::GetUIMessage(
287 PP_Var* message,
288 const scoped_refptr<TrackedCallback>& callback) {
289 if (TrackedCallback::IsPending(get_ui_message_callback_))
290 return PP_ERROR_INPROGRESS;
291
292 // Just return received messages if any received message is queued.
293 if (!received_ui_messages_.empty()) {
294 get_ui_message_callback_var_ = message;
295 WriteUIMessage();
296 return PP_OK;
297 }
298
299 // Or retain |message| as buffer to store and install |callback|.
300 get_ui_message_callback_var_ = message;
301 get_ui_message_callback_ = callback;
302
303 return PP_OK_COMPLETIONPENDING;
304 }
305
306 // Responds to PpapiPluginMsg_VpnProvider_OnPlatformMessage
307 void VpnProviderResource::OnPluginMsgOnPlatformMessage(
308 const ResourceMessageReplyParams& params,
309 const std::string& id,
310 PP_VpnProvider_PlatformMessage message,
311 const std::string& error) {
312 DictionaryVar* platform_message = new DictionaryVar();
313 platform_message->SetWithStringKey("id", StringVar::StringToPPVar(id));
314 platform_message->SetWithStringKey("message", PP_MakeInt32(message));
315 platform_message->SetWithStringKey("error", StringVar::StringToPPVar(error));
316
317 // Append received message to queue.
318 received_platform_messages_.push(scoped_refptr<Var>(platform_message));
319
320 if (!TrackedCallback::IsPending(get_platform_message_callback_) ||
321 TrackedCallback::IsScheduledToRun(get_platform_message_callback_)) {
322 return;
323 }
324
325 // The plugin may call GetPlatformMessage in its callback.
326 scoped_refptr<TrackedCallback> callback;
327 callback.swap(get_platform_message_callback_);
328 WritePlatformMessage();
329 callback->Run(PP_OK);
330 }
331
332 // Responds to PpapiPluginMsg_VpnProvider_OnPacketReceived
333 void VpnProviderResource::OnPluginMsgOnPacketReceived(
334 const ResourceMessageReplyParams& params,
335 const std::vector<char>& data) {
336 // Append received packet to queue.
337 scoped_refptr<Var> data_var(
338 PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferVar(
339 base::checked_cast<uint32_t>(data.size()), &data.front()));
340 received_packets_.push(data_var);
341
342 if (!TrackedCallback::IsPending(get_packet_callback_) ||
343 TrackedCallback::IsScheduledToRun(get_packet_callback_)) {
344 return;
345 }
346
347 // The plugin may call GetPacket in its callback.
348 scoped_refptr<TrackedCallback> callback;
349 callback.swap(get_packet_callback_);
350 WritePacket();
351 callback->Run(PP_OK);
352 }
353
354 // Responds to PpapiPluginMsg_VpnProvider_OnConfigEvent
355 void VpnProviderResource::OnPluginMsgOnConfigEvent(
356 const ResourceMessageReplyParams& params,
357 const std::string& id,
358 PP_VpnProvider_ConfigMessage message,
359 const std::string& name,
360 const std::string& data) {
361 DictionaryVar* config_message = new DictionaryVar();
362 config_message->SetWithStringKey("id", StringVar::StringToPPVar(id));
363 config_message->SetWithStringKey("message", PP_MakeInt32(message));
364 if (message == PP_VPN_PROVIDER_CONFIG_CREATED) {
365 config_message->SetWithStringKey("name", StringVar::StringToPPVar(name));
366 config_message->SetWithStringKey("data", StringVar::StringToPPVar(data));
367 }
368
369 // Append received message to queue.
370 received_config_messages_.push(scoped_refptr<Var>(config_message));
371
372 if (!TrackedCallback::IsPending(get_config_message_callback_) ||
373 TrackedCallback::IsScheduledToRun(get_config_message_callback_)) {
374 return;
375 }
376
377 // The plugin may call GetConfigMessage in its callback.
378 scoped_refptr<TrackedCallback> callback;
379 callback.swap(get_config_message_callback_);
380 WriteConfigMessage();
381 callback->Run(PP_OK);
382 }
383
384 // Responds to PpapiPluginMsg_VpnProvider_OnUIEvent
385 void VpnProviderResource::OnPluginMsgOnUIEvent(
386 const ResourceMessageReplyParams& params,
387 PP_VpnProvider_UIEvent event,
388 const std::string& id) {
389 DictionaryVar* ui_event = new DictionaryVar();
390 ui_event->SetWithStringKey("event", PP_MakeInt32(event));
391 ui_event->SetWithStringKey("id", StringVar::StringToPPVar(id));
392
393 // Append received message to queue.
394 received_ui_messages_.push(scoped_refptr<Var>(ui_event));
395
396 if (!TrackedCallback::IsPending(get_config_message_callback_) ||
397 TrackedCallback::IsScheduledToRun(get_config_message_callback_)) {
398 return;
399 }
400
401 // The plugin may call GetUIMessage in its callback.
402 scoped_refptr<TrackedCallback> callback;
403 callback.swap(get_ui_message_callback_);
404 WriteUIMessage();
405 callback->Run(PP_OK);
406 }
407
408 // Responds to PpapiPluginMsg_VpnProvider_CreateConfigReply
409 // Forwards to create_config_callback_
410 void VpnProviderResource::OnPluginMsgCreateConfigReply(
411 const ResourceMessageReplyParams& params,
412 int32_t result,
413 const std::string& id) {
414 // The callback may have been aborted by Close().
415 if (TrackedCallback::IsPending(create_config_callback_)) {
416 *create_config_callback_var_ = StringVar::StringToPPVar(id);
417 // The plugin may call CreateConfig in its callback.
418 scoped_refptr<TrackedCallback> callback;
419 callback.swap(create_config_callback_);
420 // On error: Pass return code
421 // On succes: Pass message
422 callback->Run(params.result() ? params.result() : result);
423 }
424 }
425
426 // Responds to PpapiPluginMsg_VpnProvider_DestroyConfigReply
427 // Forwards to destroy_config_callback_
428 void VpnProviderResource::OnPluginMsgDestroyConfigReply(
429 const ResourceMessageReplyParams& params,
430 int32_t result) {
431 // The callback may have been aborted by Close().
432 if (TrackedCallback::IsPending(destroy_config_callback_)) {
433 // The plugin may call DestroyConfig in its callback.
434 scoped_refptr<TrackedCallback> callback;
435 callback.swap(destroy_config_callback_);
436 // On error: Pass return code
437 // On succes: Pass message
438 callback->Run(params.result() ? params.result() : result);
439 }
440 }
441
442 // Responds to PpapiPluginMsg_VpnProvider_SetParametersReply
443 // Forwards to set_parameters_callback_
444 void VpnProviderResource::OnPluginMsgSetParametersReply(
445 const ResourceMessageReplyParams& params,
446 int32_t result) {
447 // The callback may have been aborted by Close().
448 if (TrackedCallback::IsPending(set_parameters_callback_)) {
449 // The plugin may call SetParameters in its callback.
450 scoped_refptr<TrackedCallback> callback;
451 callback.swap(set_parameters_callback_);
452 // On error: Pass return code
453 // On succes: Pass message
454 callback->Run(params.result() ? params.result() : result);
455 }
456 }
457
458 // Responds to PpapiPluginMsg_VpnProvider_NotifyConnectionStateChangedReply
459 // Forwards to send_state_change_notification_callback_
460 void VpnProviderResource::OnPluginMsgNotifyConnectionStateChangedReply(
461 const ResourceMessageReplyParams& params,
462 int32_t result) {
463 // The callback may have been aborted by Close().
464 if (TrackedCallback::IsPending(send_state_change_notification_callback_)) {
465 // The plugin may call NotifyConnectionStateChanged in its callback.
466 scoped_refptr<TrackedCallback> callback;
467 callback.swap(send_state_change_notification_callback_);
468 // On error: Pass return code
469 // On succes: Pass message
470 callback->Run(params.result() ? params.result() : result);
471 }
472 }
473
474 void VpnProviderResource::WritePacket() {
475 if (!get_packet_callback_var_)
476 return;
477
478 *get_packet_callback_var_ = received_packets_.front()->GetPPVar();
479 received_packets_.pop();
480 get_packet_callback_var_ = NULL;
481 }
482
483 void VpnProviderResource::WritePlatformMessage() {
484 if (!get_platform_message_callback_var_)
485 return;
486
487 *get_platform_message_callback_var_ =
488 received_platform_messages_.front()->GetPPVar();
489 received_platform_messages_.pop();
490 get_platform_message_callback_var_ = NULL;
491 }
492
493 void VpnProviderResource::WriteConfigMessage() {
494 if (!get_config_message_callback_var_)
495 return;
496
497 *get_config_message_callback_var_ =
498 received_config_messages_.front()->GetPPVar();
499 received_config_messages_.pop();
500 get_config_message_callback_var_ = NULL;
501 }
502
503 void VpnProviderResource::WriteUIMessage() {
504 if (!get_ui_message_callback_var_)
505 return;
506
507 *get_ui_message_callback_var_ = received_ui_messages_.front()->GetPPVar();
508 received_ui_messages_.pop();
509 get_ui_message_callback_var_ = NULL;
510 }
511
512 } // namespace proxy
513 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698