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

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: Simplify IDL Created 4 years, 9 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 get_unbind_event_callback_(NULL),
28 get_packet_callback_var_(NULL),
29 received_unbind_event_(false) {
30 SendCreate(BROWSER, PpapiHostMsg_VpnProvider_Create());
31 }
32
33 VpnProviderResource::~VpnProviderResource() {}
34
35 thunk::PPB_VpnProvider_API* VpnProviderResource::AsPPB_VpnProvider_API() {
36 return this;
37 }
38
39 void VpnProviderResource::OnReplyReceived(
40 const ResourceMessageReplyParams& params,
41 const IPC::Message& msg) {
42 PPAPI_BEGIN_MESSAGE_MAP(VpnProviderResource, msg)
43 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(PpapiPluginMsg_VpnProvider_OnUnBind,
44 OnPluginMsgOnUnBindReceived)
45 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(
46 PpapiPluginMsg_VpnProvider_OnPacketReceived,
47 OnPluginMsgOnPacketReceived)
48 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL_UNHANDLED(
49 PluginResource::OnReplyReceived(params, msg))
50 PPAPI_END_MESSAGE_MAP()
51 }
52
53 int32_t VpnProviderResource::Bind(
54 const PP_Var& name,
55 const PP_Var& id,
56 const scoped_refptr<TrackedCallback>& callback) {
57 if (TrackedCallback::IsPending(bind_callback_))
58 return PP_ERROR_INPROGRESS;
59
60 StringVar* name_var = StringVar::FromPPVar(name);
61 if (!name_var)
62 return PP_ERROR_BADARGUMENT;
63 StringVar* id_var = StringVar::FromPPVar(id);
64 if (!id_var)
65 return PP_ERROR_BADARGUMENT;
66
67 bind_callback_ = callback;
68
69 Call<PpapiPluginMsg_VpnProvider_BindReply>(
70 BROWSER,
71 PpapiHostMsg_VpnProvider_Bind(name_var->value(), id_var->value()),
72 base::Bind(&VpnProviderResource::OnPluginMsgBindReply, this));
73
74 return PP_OK_COMPLETIONPENDING;
75 }
76
77 int32_t VpnProviderResource::GetUnBindEvent(
78 const scoped_refptr<TrackedCallback>& callback) {
79 if (TrackedCallback::IsPending(get_unbind_event_callback_))
80 return PP_ERROR_INPROGRESS;
81
82 // Just return received packets if any received packet is queued.
83 if (received_unbind_event_) {
84 return PP_OK;
85 }
86
87 // Or install |callback|.
88 get_unbind_event_callback_ = callback;
89
90 return PP_OK_COMPLETIONPENDING;
91 }
92
93 // TODO(adrian.belgun): Implement a queue here to optimize performance.
94 // After adding the callback, the performance of this API was impacted due to
95 // limiting to one the number of packets in flight.
96 int32_t VpnProviderResource::SendPacket(
97 const PP_Var& data,
98 const scoped_refptr<TrackedCallback>& callback) {
99 if (TrackedCallback::IsPending(send_packet_callback_))
100 return PP_ERROR_INPROGRESS;
101
102 send_packet_callback_ = callback;
103
104 // Convert data to std::vector<char>, then send it.
105 scoped_refptr<ArrayBufferVar> data_arraybuffer =
106 ArrayBufferVar::FromPPVar(data);
107 if (!data_arraybuffer.get())
108 return PP_ERROR_BADARGUMENT;
109 char* data_pointer = static_cast<char*>(data_arraybuffer->Map());
110 uint32_t data_length = data_arraybuffer->ByteLength();
111 std::vector<char> data_vector(data_pointer, data_pointer + data_length);
112 data_arraybuffer->Unmap();
113
114 Call<PpapiPluginMsg_VpnProvider_SendPacketReply>(
115 BROWSER, PpapiHostMsg_VpnProvider_SendPacket(data_vector),
116 base::Bind(&VpnProviderResource::OnPluginMsgSendPacketReply, this));
117
118 return PP_OK_COMPLETIONPENDING;
119 }
120
121 int32_t VpnProviderResource::GetPacket(
122 PP_Var* data,
123 const scoped_refptr<TrackedCallback>& callback) {
124 if (TrackedCallback::IsPending(get_packet_callback_))
125 return PP_ERROR_INPROGRESS;
126
127 // Just return received packets if any received packet is queued.
128 if (!received_packets_.empty()) {
129 get_packet_callback_var_ = data;
130 WritePacket();
131 return PP_OK;
132 }
133
134 // Or retain |packet| as buffer to store and install |callback|.
135 get_packet_callback_var_ = data;
136 get_packet_callback_ = callback;
137
138 return PP_OK_COMPLETIONPENDING;
139 }
140
141 // Responds to PpapiPluginMsg_VpnProvider_OnUnBind
142 void VpnProviderResource::OnPluginMsgOnUnBindReceived(
143 const ResourceMessageReplyParams& params) {
144 if (!TrackedCallback::IsPending(get_unbind_event_callback_) ||
145 TrackedCallback::IsScheduledToRun(get_unbind_event_callback_)) {
146 return;
147 }
148
149 // The plugin may call GetPacket in its callback.
150 scoped_refptr<TrackedCallback> callback;
151 callback.swap(get_unbind_event_callback_);
152 callback->Run(PP_OK);
153 }
154
155 // Responds to PpapiPluginMsg_VpnProvider_OnPacketReceived
156 void VpnProviderResource::OnPluginMsgOnPacketReceived(
157 const ResourceMessageReplyParams& params,
158 const std::vector<char>& data) {
159 // Append received packet to queue.
160 scoped_refptr<Var> data_var(
161 PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferVar(
162 base::checked_cast<uint32_t>(data.size()), &data.front()));
163 received_packets_.push(data_var);
164
165 if (!TrackedCallback::IsPending(get_packet_callback_) ||
166 TrackedCallback::IsScheduledToRun(get_packet_callback_)) {
167 return;
168 }
169
170 // The plugin may call GetPacket in its callback.
171 scoped_refptr<TrackedCallback> callback;
172 callback.swap(get_packet_callback_);
173 WritePacket();
174 callback->Run(PP_OK);
175 }
176
177 // Responds to PpapiPluginMsg_VpnProvider_BindReply
178 // Forwards to bind_callback_
179 void VpnProviderResource::OnPluginMsgBindReply(
180 const ResourceMessageReplyParams& params,
181 int32_t result) {
182 // The callback may have been aborted by Close().
183 if (TrackedCallback::IsPending(bind_callback_)) {
184 // The plugin may call DestroyConfig in its callback.
185 scoped_refptr<TrackedCallback> callback;
186 callback.swap(bind_callback_);
187 // On error: Pass return code
188 // On succes: Pass message
189 callback->Run(params.result() ? params.result() : result);
190 }
191 }
192
193 // Responds to PpapiPluginMsg_VpnProvider_SendPacketReply
194 // Forwards to send_packet_callback_
195 void VpnProviderResource::OnPluginMsgSendPacketReply(
196 const ResourceMessageReplyParams& params,
197 int32_t result) {
198 // The callback may have been aborted by Close().
199 if (TrackedCallback::IsPending(send_packet_callback_)) {
200 // The plugin may call SendPacket in its callback.
201 scoped_refptr<TrackedCallback> callback;
202 callback.swap(send_packet_callback_);
203 // On error: Pass return code
204 // On succes: Pass message
205 callback->Run(params.result() ? params.result() : result);
206 }
207 }
208 void VpnProviderResource::WritePacket() {
209 if (!get_packet_callback_var_)
210 return;
211
212 *get_packet_callback_var_ = received_packets_.front()->GetPPVar();
213 received_packets_.pop();
214 get_packet_callback_var_ = NULL;
215 }
216
217 } // namespace proxy
218 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698