| OLD | NEW |
| 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 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 namespace ppapi { | 21 namespace ppapi { |
| 22 namespace proxy { | 22 namespace proxy { |
| 23 | 23 |
| 24 const int32_t UDPSocketResourceBase::kMaxReadSize = 128 * 1024; | 24 const int32_t UDPSocketResourceBase::kMaxReadSize = 128 * 1024; |
| 25 const int32_t UDPSocketResourceBase::kMaxWriteSize = 128 * 1024; | 25 const int32_t UDPSocketResourceBase::kMaxWriteSize = 128 * 1024; |
| 26 const int32_t UDPSocketResourceBase::kMaxSendBufferSize = | 26 const int32_t UDPSocketResourceBase::kMaxSendBufferSize = |
| 27 1024 * UDPSocketResourceBase::kMaxWriteSize; | 27 1024 * UDPSocketResourceBase::kMaxWriteSize; |
| 28 const int32_t UDPSocketResourceBase::kMaxReceiveBufferSize = | 28 const int32_t UDPSocketResourceBase::kMaxReceiveBufferSize = |
| 29 1024 * UDPSocketResourceBase::kMaxReadSize; | 29 1024 * UDPSocketResourceBase::kMaxReadSize; |
| 30 const size_t UDPSocketResourceBase::kPluginReceiveBufferSlots = 32u; | 30 const size_t UDPSocketResourceBase::kPluginReceiveBufferSlots = 32u; |
| 31 const size_t UDPSocketResourceBase::kPluginSendBufferSlots = 8u; |
| 31 | 32 |
| 32 UDPSocketResourceBase::UDPSocketResourceBase(Connection connection, | 33 UDPSocketResourceBase::UDPSocketResourceBase(Connection connection, |
| 33 PP_Instance instance, | 34 PP_Instance instance, |
| 34 bool private_api) | 35 bool private_api) |
| 35 : PluginResource(connection, instance), | 36 : PluginResource(connection, instance), |
| 36 private_api_(private_api), | 37 private_api_(private_api), |
| 37 bind_called_(false), | 38 bind_called_(false), |
| 38 bound_(false), | 39 bound_(false), |
| 39 closed_(false), | 40 closed_(false), |
| 40 read_buffer_(NULL), | 41 read_buffer_(NULL), |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 187 |
| 187 int32_t UDPSocketResourceBase::SendToImpl( | 188 int32_t UDPSocketResourceBase::SendToImpl( |
| 188 const char* buffer, | 189 const char* buffer, |
| 189 int32_t num_bytes, | 190 int32_t num_bytes, |
| 190 const PP_NetAddress_Private* addr, | 191 const PP_NetAddress_Private* addr, |
| 191 scoped_refptr<TrackedCallback> callback) { | 192 scoped_refptr<TrackedCallback> callback) { |
| 192 if (!buffer || num_bytes <= 0 || !addr) | 193 if (!buffer || num_bytes <= 0 || !addr) |
| 193 return PP_ERROR_BADARGUMENT; | 194 return PP_ERROR_BADARGUMENT; |
| 194 if (!bound_) | 195 if (!bound_) |
| 195 return PP_ERROR_FAILED; | 196 return PP_ERROR_FAILED; |
| 196 if (TrackedCallback::IsPending(sendto_callback_)) | 197 if (sendto_callbacks_.size() == kPluginSendBufferSlots) |
| 197 return PP_ERROR_INPROGRESS; | 198 return PP_ERROR_INPROGRESS; |
| 198 | 199 |
| 199 if (num_bytes > kMaxWriteSize) | 200 if (num_bytes > kMaxWriteSize) |
| 200 num_bytes = kMaxWriteSize; | 201 num_bytes = kMaxWriteSize; |
| 201 | 202 |
| 202 sendto_callback_ = callback; | 203 sendto_callbacks_.push(callback); |
| 203 | 204 |
| 204 // Send the request, the browser will call us back via SendToReply. | 205 // Send the request, the browser will call us back via SendToReply. |
| 205 Call<PpapiPluginMsg_UDPSocket_SendToReply>( | 206 Call<PpapiPluginMsg_UDPSocket_SendToReply>( |
| 206 BROWSER, | 207 BROWSER, |
| 207 PpapiHostMsg_UDPSocket_SendTo(std::string(buffer, num_bytes), *addr), | 208 PpapiHostMsg_UDPSocket_SendTo(std::string(buffer, num_bytes), *addr), |
| 208 base::Bind(&UDPSocketResourceBase::OnPluginMsgSendToReply, | 209 base::Bind(&UDPSocketResourceBase::OnPluginMsgSendToReply, |
| 209 base::Unretained(this)), | 210 base::Unretained(this)), |
| 210 callback); | 211 callback); |
| 211 return PP_OK_COMPLETIONPENDING; | 212 return PP_OK_COMPLETIONPENDING; |
| 212 } | 213 } |
| 213 | 214 |
| 214 void UDPSocketResourceBase::CloseImpl() { | 215 void UDPSocketResourceBase::CloseImpl() { |
| 215 if(closed_) | 216 if(closed_) |
| 216 return; | 217 return; |
| 217 | 218 |
| 218 bound_ = false; | 219 bound_ = false; |
| 219 closed_ = true; | 220 closed_ = true; |
| 220 | 221 |
| 221 Post(BROWSER, PpapiHostMsg_UDPSocket_Close()); | 222 Post(BROWSER, PpapiHostMsg_UDPSocket_Close()); |
| 222 | 223 |
| 223 PostAbortIfNecessary(&bind_callback_); | 224 PostAbortIfNecessary(&bind_callback_); |
| 224 PostAbortIfNecessary(&recvfrom_callback_); | 225 PostAbortIfNecessary(&recvfrom_callback_); |
| 225 PostAbortIfNecessary(&sendto_callback_); | 226 while (!sendto_callbacks_.empty()) { |
| 227 scoped_refptr<TrackedCallback> callback = sendto_callbacks_.front(); |
| 228 sendto_callbacks_.pop(); |
| 229 PostAbortIfNecessary(&callback); |
| 230 } |
| 226 | 231 |
| 227 read_buffer_ = NULL; | 232 read_buffer_ = NULL; |
| 228 bytes_to_read_ = -1; | 233 bytes_to_read_ = -1; |
| 229 } | 234 } |
| 230 | 235 |
| 231 void UDPSocketResourceBase::OnReplyReceived( | 236 void UDPSocketResourceBase::OnReplyReceived( |
| 232 const ResourceMessageReplyParams& params, | 237 const ResourceMessageReplyParams& params, |
| 233 const IPC::Message& msg) { | 238 const IPC::Message& msg) { |
| 234 PPAPI_BEGIN_MESSAGE_MAP(UDPSocketResourceBase, msg) | 239 PPAPI_BEGIN_MESSAGE_MAP(UDPSocketResourceBase, msg) |
| 235 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( | 240 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 read_buffer_ = NULL; | 313 read_buffer_ = NULL; |
| 309 bytes_to_read_ = -1; | 314 bytes_to_read_ = -1; |
| 310 recvfrom_addr_resource_ = NULL; | 315 recvfrom_addr_resource_ = NULL; |
| 311 | 316 |
| 312 RunCallback(recvfrom_callback_, result); | 317 RunCallback(recvfrom_callback_, result); |
| 313 } | 318 } |
| 314 | 319 |
| 315 void UDPSocketResourceBase::OnPluginMsgSendToReply( | 320 void UDPSocketResourceBase::OnPluginMsgSendToReply( |
| 316 const ResourceMessageReplyParams& params, | 321 const ResourceMessageReplyParams& params, |
| 317 int32_t bytes_written) { | 322 int32_t bytes_written) { |
| 318 if (!TrackedCallback::IsPending(sendto_callback_)) | 323 scoped_refptr<TrackedCallback> callback = sendto_callbacks_.front(); |
| 324 sendto_callbacks_.pop(); |
| 325 if (!TrackedCallback::IsPending(callback)) |
| 319 return; | 326 return; |
| 320 | 327 |
| 321 if (params.result() == PP_OK) | 328 if (params.result() == PP_OK) |
| 322 RunCallback(sendto_callback_, bytes_written); | 329 RunCallback(callback, bytes_written); |
| 323 else | 330 else |
| 324 RunCallback(sendto_callback_, params.result()); | 331 RunCallback(callback, params.result()); |
| 325 } | 332 } |
| 326 | 333 |
| 327 void UDPSocketResourceBase::RunCallback(scoped_refptr<TrackedCallback> callback, | 334 void UDPSocketResourceBase::RunCallback(scoped_refptr<TrackedCallback> callback, |
| 328 int32_t pp_result) { | 335 int32_t pp_result) { |
| 329 callback->Run(ConvertNetworkAPIErrorForCompatibility(pp_result, | 336 callback->Run(ConvertNetworkAPIErrorForCompatibility(pp_result, |
| 330 private_api_)); | 337 private_api_)); |
| 331 } | 338 } |
| 332 | 339 |
| 333 int32_t UDPSocketResourceBase::SetRecvFromOutput( | 340 int32_t UDPSocketResourceBase::SetRecvFromOutput( |
| 334 int32_t browser_result, | 341 int32_t browser_result, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 353 if (result == PP_OK && !data.empty()) | 360 if (result == PP_OK && !data.empty()) |
| 354 memcpy(output_buffer, data.c_str(), data.size()); | 361 memcpy(output_buffer, data.c_str(), data.size()); |
| 355 | 362 |
| 356 recvfrom_addr_ = addr; | 363 recvfrom_addr_ = addr; |
| 357 | 364 |
| 358 return result == PP_OK ? static_cast<int32_t>(data.size()) : result; | 365 return result == PP_OK ? static_cast<int32_t>(data.size()) : result; |
| 359 } | 366 } |
| 360 | 367 |
| 361 } // namespace proxy | 368 } // namespace proxy |
| 362 } // namespace ppapi | 369 } // namespace ppapi |
| OLD | NEW |