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

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

Issue 16959005: Implement PPB_UDPSocket_Dev: part 2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Changes in response to Cris and Bill's suggestions. Created 7 years, 6 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ppapi/proxy/udp_socket_resource_base.h" 5 #include "ppapi/proxy/udp_socket_resource_base.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 #include <vector>
9 10
10 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/values.h"
11 #include "ppapi/c/pp_bool.h" 14 #include "ppapi/c/pp_bool.h"
12 #include "ppapi/c/pp_completion_callback.h" 15 #include "ppapi/c/pp_completion_callback.h"
13 #include "ppapi/c/pp_errors.h" 16 #include "ppapi/c/pp_errors.h"
14 #include "ppapi/proxy/ppapi_messages.h" 17 #include "ppapi/proxy/ppapi_messages.h"
18 #include "ppapi/shared_impl/var_value_conversions.h"
15 #include "ppapi/thunk/enter.h" 19 #include "ppapi/thunk/enter.h"
16 #include "ppapi/thunk/resource_creation_api.h" 20 #include "ppapi/thunk/resource_creation_api.h"
17 21
18 namespace ppapi { 22 namespace ppapi {
19 namespace proxy { 23 namespace proxy {
20 24
25 namespace {
26
27 int32_t ConvertPPError(int32_t pp_error, bool private_api) {
28 // The private API doesn't return network-specific error codes or
29 // PP_ERROR_NOACCESS. In order to preserve the behavior, we convert those to
30 // PP_ERROR_FAILED.
31 if (private_api &&
32 (pp_error <= PP_ERROR_CONNECTION_CLOSED ||
33 pp_error == PP_ERROR_NOACCESS)) {
34 return PP_ERROR_FAILED;
35 }
36
37 return pp_error;
38 }
39
40 } // namespace
41
21 const int32_t UDPSocketResourceBase::kMaxReadSize = 1024 * 1024; 42 const int32_t UDPSocketResourceBase::kMaxReadSize = 1024 * 1024;
22 const int32_t UDPSocketResourceBase::kMaxWriteSize = 1024 * 1024; 43 const int32_t UDPSocketResourceBase::kMaxWriteSize = 1024 * 1024;
44 const int32_t UDPSocketResourceBase::kMaxSendBufferSize =
45 1024 * UDPSocketResourceBase::kMaxWriteSize;
46 const int32_t UDPSocketResourceBase::kMaxReceiveBufferSize =
47 1024 * UDPSocketResourceBase::kMaxReadSize;
48
23 49
24 UDPSocketResourceBase::UDPSocketResourceBase(Connection connection, 50 UDPSocketResourceBase::UDPSocketResourceBase(Connection connection,
25 PP_Instance instance) 51 PP_Instance instance,
52 bool private_api)
26 : PluginResource(connection, instance), 53 : PluginResource(connection, instance),
54 private_api_(private_api),
27 bound_(false), 55 bound_(false),
28 closed_(false), 56 closed_(false),
29 read_buffer_(NULL), 57 read_buffer_(NULL),
30 bytes_to_read_(-1) { 58 bytes_to_read_(-1) {
31 recvfrom_addr_.size = 0; 59 recvfrom_addr_.size = 0;
32 memset(recvfrom_addr_.data, 0, 60 memset(recvfrom_addr_.data, 0,
33 arraysize(recvfrom_addr_.data) * sizeof(*recvfrom_addr_.data)); 61 arraysize(recvfrom_addr_.data) * sizeof(*recvfrom_addr_.data));
34 bound_addr_.size = 0; 62 bound_addr_.size = 0;
35 memset(bound_addr_.data, 0, 63 memset(bound_addr_.data, 0,
36 arraysize(bound_addr_.data) * sizeof(*bound_addr_.data)); 64 arraysize(bound_addr_.data) * sizeof(*bound_addr_.data));
37 65
38 SendCreate(BROWSER, PpapiHostMsg_UDPSocketPrivate_Create()); 66 if (private_api)
67 SendCreate(BROWSER, PpapiHostMsg_UDPSocket_CreatePrivate());
68 else
69 SendCreate(BROWSER, PpapiHostMsg_UDPSocket_Create());
39 } 70 }
40 71
41 UDPSocketResourceBase::~UDPSocketResourceBase() { 72 UDPSocketResourceBase::~UDPSocketResourceBase() {
42 } 73 }
43 74
44 int32_t UDPSocketResourceBase::SetSocketFeatureImpl( 75 int32_t UDPSocketResourceBase::SetOptionImpl(
45 PP_UDPSocketFeature_Private name, 76 PP_UDPSocket_Option_Dev name,
46 const PP_Var& value) { 77 const PP_Var& value,
47 if (bound_ || closed_) 78 scoped_refptr<TrackedCallback> callback) {
79 if (closed_)
48 return PP_ERROR_FAILED; 80 return PP_ERROR_FAILED;
49 81
50 switch (name) { 82 switch (name) {
51 case PP_UDPSOCKETFEATURE_ADDRESS_REUSE: 83 case PP_UDPSOCKET_OPTION_ADDRESS_REUSE:
52 case PP_UDPSOCKETFEATURE_BROADCAST: { 84 case PP_UDPSOCKET_OPTION_BROADCAST: {
53 if (value.type != PP_VARTYPE_BOOL) 85 if (value.type != PP_VARTYPE_BOOL)
54 return PP_ERROR_BADARGUMENT; 86 return PP_ERROR_BADARGUMENT;
55 Post(BROWSER, 87 if (bound_)
56 PpapiHostMsg_UDPSocketPrivate_SetBoolSocketFeature( 88 return PP_ERROR_FAILED;
57 static_cast<int32_t>(name), PP_ToBool(value.value.as_bool))); 89 break;
90 }
91 case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE:
92 case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: {
93 if (value.type != PP_VARTYPE_INT32)
94 return PP_ERROR_BADARGUMENT;
95 if (!bound_)
96 return PP_ERROR_FAILED;
58 break; 97 break;
59 } 98 }
60 default: { 99 default: {
100 NOTREACHED();
61 return PP_ERROR_BADARGUMENT; 101 return PP_ERROR_BADARGUMENT;
62 } 102 }
63 } 103 }
64 return PP_OK; 104
105 scoped_ptr<base::ListValue> list_value(
106 CreateListValueFromVarVector(std::vector<PP_Var>(1, value)));
107 if (!list_value.get())
108 return PP_ERROR_FAILED;
109
110 Call<PpapiPluginMsg_UDPSocket_SetOptionReply>(
111 BROWSER,
112 PpapiHostMsg_UDPSocket_SetOption(name, *list_value),
113 base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply,
114 base::Unretained(this),
115 callback));
116 return PP_OK_COMPLETIONPENDING;
65 } 117 }
66 118
67 int32_t UDPSocketResourceBase::BindImpl( 119 int32_t UDPSocketResourceBase::BindImpl(
68 const PP_NetAddress_Private* addr, 120 const PP_NetAddress_Private* addr,
69 scoped_refptr<TrackedCallback> callback) { 121 scoped_refptr<TrackedCallback> callback) {
70 if (!addr) 122 if (!addr)
71 return PP_ERROR_BADARGUMENT; 123 return PP_ERROR_BADARGUMENT;
72 if (bound_ || closed_) 124 if (bound_ || closed_)
73 return PP_ERROR_FAILED; 125 return PP_ERROR_FAILED;
74 if (TrackedCallback::IsPending(bind_callback_)) 126 if (TrackedCallback::IsPending(bind_callback_))
75 return PP_ERROR_INPROGRESS; 127 return PP_ERROR_INPROGRESS;
76 128
77 bind_callback_ = callback; 129 bind_callback_ = callback;
78 130
79 // Send the request, the browser will call us back via BindReply. 131 // Send the request, the browser will call us back via BindReply.
80 Call<PpapiPluginMsg_UDPSocketPrivate_BindReply>( 132 Call<PpapiPluginMsg_UDPSocket_BindReply>(
81 BROWSER, 133 BROWSER,
82 PpapiHostMsg_UDPSocketPrivate_Bind(*addr), 134 PpapiHostMsg_UDPSocket_Bind(*addr),
83 base::Bind(&UDPSocketResourceBase::OnPluginMsgBindReply, 135 base::Bind(&UDPSocketResourceBase::OnPluginMsgBindReply,
84 base::Unretained(this))); 136 base::Unretained(this)));
85 return PP_OK_COMPLETIONPENDING; 137 return PP_OK_COMPLETIONPENDING;
86 } 138 }
87 139
88 PP_Bool UDPSocketResourceBase::GetBoundAddressImpl( 140 PP_Bool UDPSocketResourceBase::GetBoundAddressImpl(
89 PP_NetAddress_Private* addr) { 141 PP_NetAddress_Private* addr) {
90 if (!addr || !bound_ || closed_) 142 if (!addr || !bound_ || closed_)
91 return PP_FALSE; 143 return PP_FALSE;
92 144
(...skipping 11 matching lines...) Expand all
104 if (!bound_) 156 if (!bound_)
105 return PP_ERROR_FAILED; 157 return PP_ERROR_FAILED;
106 if (TrackedCallback::IsPending(recvfrom_callback_)) 158 if (TrackedCallback::IsPending(recvfrom_callback_))
107 return PP_ERROR_INPROGRESS; 159 return PP_ERROR_INPROGRESS;
108 160
109 read_buffer_ = buffer; 161 read_buffer_ = buffer;
110 bytes_to_read_ = std::min(num_bytes, kMaxReadSize); 162 bytes_to_read_ = std::min(num_bytes, kMaxReadSize);
111 recvfrom_callback_ = callback; 163 recvfrom_callback_ = callback;
112 164
113 // Send the request, the browser will call us back via RecvFromReply. 165 // Send the request, the browser will call us back via RecvFromReply.
114 Call<PpapiPluginMsg_UDPSocketPrivate_RecvFromReply>( 166 Call<PpapiPluginMsg_UDPSocket_RecvFromReply>(
115 BROWSER, 167 BROWSER,
116 PpapiHostMsg_UDPSocketPrivate_RecvFrom(bytes_to_read_), 168 PpapiHostMsg_UDPSocket_RecvFrom(bytes_to_read_),
117 base::Bind(&UDPSocketResourceBase::OnPluginMsgRecvFromReply, 169 base::Bind(&UDPSocketResourceBase::OnPluginMsgRecvFromReply,
118 base::Unretained(this), addr)); 170 base::Unretained(this), addr));
119 return PP_OK_COMPLETIONPENDING; 171 return PP_OK_COMPLETIONPENDING;
120 } 172 }
121 173
122 PP_Bool UDPSocketResourceBase::GetRecvFromAddressImpl( 174 PP_Bool UDPSocketResourceBase::GetRecvFromAddressImpl(
123 PP_NetAddress_Private* addr) { 175 PP_NetAddress_Private* addr) {
124 if (!addr) 176 if (!addr)
125 return PP_FALSE; 177 return PP_FALSE;
126 *addr = recvfrom_addr_; 178 *addr = recvfrom_addr_;
(...skipping 11 matching lines...) Expand all
138 return PP_ERROR_FAILED; 190 return PP_ERROR_FAILED;
139 if (TrackedCallback::IsPending(sendto_callback_)) 191 if (TrackedCallback::IsPending(sendto_callback_))
140 return PP_ERROR_INPROGRESS; 192 return PP_ERROR_INPROGRESS;
141 193
142 if (num_bytes > kMaxWriteSize) 194 if (num_bytes > kMaxWriteSize)
143 num_bytes = kMaxWriteSize; 195 num_bytes = kMaxWriteSize;
144 196
145 sendto_callback_ = callback; 197 sendto_callback_ = callback;
146 198
147 // Send the request, the browser will call us back via SendToReply. 199 // Send the request, the browser will call us back via SendToReply.
148 Call<PpapiPluginMsg_UDPSocketPrivate_SendToReply>( 200 Call<PpapiPluginMsg_UDPSocket_SendToReply>(
149 BROWSER, 201 BROWSER,
150 PpapiHostMsg_UDPSocketPrivate_SendTo( 202 PpapiHostMsg_UDPSocket_SendTo(std::string(buffer, num_bytes), *addr),
151 std::string(buffer, num_bytes), *addr),
152 base::Bind(&UDPSocketResourceBase::OnPluginMsgSendToReply, 203 base::Bind(&UDPSocketResourceBase::OnPluginMsgSendToReply,
153 base::Unretained(this))); 204 base::Unretained(this)));
154 return PP_OK_COMPLETIONPENDING; 205 return PP_OK_COMPLETIONPENDING;
155 } 206 }
156 207
157 void UDPSocketResourceBase::CloseImpl() { 208 void UDPSocketResourceBase::CloseImpl() {
158 if(closed_) 209 if(closed_)
159 return; 210 return;
160 211
161 bound_ = false; 212 bound_ = false;
162 closed_ = true; 213 closed_ = true;
163 214
164 Post(BROWSER, PpapiHostMsg_UDPSocketPrivate_Close()); 215 Post(BROWSER, PpapiHostMsg_UDPSocket_Close());
165 216
166 PostAbortIfNecessary(&bind_callback_); 217 PostAbortIfNecessary(&bind_callback_);
167 PostAbortIfNecessary(&recvfrom_callback_); 218 PostAbortIfNecessary(&recvfrom_callback_);
168 PostAbortIfNecessary(&sendto_callback_); 219 PostAbortIfNecessary(&sendto_callback_);
169 } 220 }
170 221
171 void UDPSocketResourceBase::PostAbortIfNecessary( 222 void UDPSocketResourceBase::PostAbortIfNecessary(
172 scoped_refptr<TrackedCallback>* callback) { 223 scoped_refptr<TrackedCallback>* callback) {
173 if (TrackedCallback::IsPending(*callback)) 224 if (TrackedCallback::IsPending(*callback))
174 (*callback)->PostAbort(); 225 (*callback)->PostAbort();
175 } 226 }
176 227
228 void UDPSocketResourceBase::OnPluginMsgSetOptionReply(
229 scoped_refptr<TrackedCallback> callback,
230 const ResourceMessageReplyParams& params) {
231 if (TrackedCallback::IsPending(callback))
232 callback->Run(ConvertPPError(params.result(), private_api_));
233 }
234
177 void UDPSocketResourceBase::OnPluginMsgBindReply( 235 void UDPSocketResourceBase::OnPluginMsgBindReply(
178 const ResourceMessageReplyParams& params, 236 const ResourceMessageReplyParams& params,
179 const PP_NetAddress_Private& bound_addr) { 237 const PP_NetAddress_Private& bound_addr) {
180 if (!TrackedCallback::IsPending(bind_callback_)) { 238 if (!TrackedCallback::IsPending(bind_callback_)) {
181 NOTREACHED(); 239 NOTREACHED();
182 return; 240 return;
183 } 241 }
184 if (params.result() == PP_OK) 242 if (params.result() == PP_OK)
185 bound_ = true; 243 bound_ = true;
186 bound_addr_ = bound_addr; 244 bound_addr_ = bound_addr;
187 bind_callback_->Run(params.result()); 245 bind_callback_->Run(ConvertPPError(params.result(), private_api_));
188 } 246 }
189 247
190 void UDPSocketResourceBase::OnPluginMsgRecvFromReply( 248 void UDPSocketResourceBase::OnPluginMsgRecvFromReply(
191 PP_Resource* output_addr, 249 PP_Resource* output_addr,
192 const ResourceMessageReplyParams& params, 250 const ResourceMessageReplyParams& params,
193 const std::string& data, 251 const std::string& data,
194 const PP_NetAddress_Private& addr) { 252 const PP_NetAddress_Private& addr) {
195 if (!TrackedCallback::IsPending(recvfrom_callback_)) { 253 if (!TrackedCallback::IsPending(recvfrom_callback_)) {
196 NOTREACHED(); 254 NOTREACHED();
197 return; 255 return;
(...skipping 15 matching lines...) Expand all
213 memcpy(read_buffer_, data.c_str(), data.size()); 271 memcpy(read_buffer_, data.c_str(), data.size());
214 } 272 }
215 273
216 read_buffer_ = NULL; 274 read_buffer_ = NULL;
217 bytes_to_read_ = -1; 275 bytes_to_read_ = -1;
218 recvfrom_addr_ = addr; 276 recvfrom_addr_ = addr;
219 277
220 if (succeeded) 278 if (succeeded)
221 recvfrom_callback_->Run(static_cast<int32_t>(data.size())); 279 recvfrom_callback_->Run(static_cast<int32_t>(data.size()));
222 else 280 else
223 recvfrom_callback_->Run(params.result()); 281 recvfrom_callback_->Run(ConvertPPError(params.result(), private_api_));
224 } 282 }
225 283
226 void UDPSocketResourceBase::OnPluginMsgSendToReply( 284 void UDPSocketResourceBase::OnPluginMsgSendToReply(
227 const ResourceMessageReplyParams& params, 285 const ResourceMessageReplyParams& params,
228 int32_t bytes_written) { 286 int32_t bytes_written) {
229 if (!TrackedCallback::IsPending(sendto_callback_)) { 287 if (!TrackedCallback::IsPending(sendto_callback_)) {
230 NOTREACHED(); 288 NOTREACHED();
231 return; 289 return;
232 } 290 }
233 if (params.result() == PP_OK) 291 if (params.result() == PP_OK)
234 sendto_callback_->Run(bytes_written); 292 sendto_callback_->Run(bytes_written);
235 else 293 else
236 sendto_callback_->Run(params.result()); 294 sendto_callback_->Run(ConvertPPError(params.result(), private_api_));
237 } 295 }
238 296
239 } // namespace proxy 297 } // namespace proxy
240 } // namespace ppapi 298 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698