udp_socket_private_resource.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/udp_socket_private_resource.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cstring> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_bool.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_completion_callback.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace proxy { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32_t UDPSocketPrivateResource::kMaxReadSize = 1024 * 1024; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int32_t UDPSocketPrivateResource::kMaxWriteSize = 1024 * 1024; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UDPSocketPrivateResource::UDPSocketPrivateResource(Connection connection, 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PluginResource(connection, instance), 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_(false), 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) closed_(false), 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_buffer_(NULL), 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bytes_to_read_(-1) { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recvfrom_addr_.size = 0; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memset(recvfrom_addr_.data, 0, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arraysize(recvfrom_addr_.data) * sizeof(*recvfrom_addr_.data)); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_addr_.size = 0; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memset(bound_addr_.data, 0, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arraysize(bound_addr_.data) * sizeof(*bound_addr_.data)); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCreate(BROWSER, PpapiHostMsg_UDPSocketPrivate_Create()); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UDPSocketPrivateResource::~UDPSocketPrivateResource() { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)thunk::PPB_UDPSocket_Private_API* 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UDPSocketPrivateResource::AsPPB_UDPSocket_Private_API() { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return this; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t UDPSocketPrivateResource::SetSocketFeature( 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_UDPSocketFeature_Private name, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Var value) { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (bound_ || closed_) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (name) { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_UDPSOCKETFEATURE_ADDRESS_REUSE: 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_UDPSOCKETFEATURE_BROADCAST: 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value.type != PP_VARTYPE_BOOL) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_BADARGUMENT; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendBoolSocketFeature(static_cast<int32_t>(name), 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_ToBool(value.value.as_bool)); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_BADARGUMENT; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t UDPSocketPrivateResource::Bind( 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_NetAddress_Private* addr, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!addr) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_BADARGUMENT; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (bound_ || closed_) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(bind_callback_)) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_INPROGRESS; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bind_callback_ = callback; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Send the request, the browser will call us back via BindReply. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendBind(*addr); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool UDPSocketPrivateResource::GetBoundAddress(PP_NetAddress_Private* addr) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!addr || !bound_ || closed_) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FALSE; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *addr = bound_addr_; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_TRUE; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t UDPSocketPrivateResource::RecvFrom( 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char* buffer, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t num_bytes, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!buffer || num_bytes <= 0) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_BADARGUMENT; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!bound_) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(recvfrom_callback_)) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_INPROGRESS; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_buffer_ = buffer; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bytes_to_read_ = std::min(num_bytes, kMaxReadSize); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recvfrom_callback_ = callback; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Send the request, the browser will call us back via RecvFromReply. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendRecvFrom(bytes_to_read_); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool UDPSocketPrivateResource::GetRecvFromAddress( 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_NetAddress_Private* addr) { 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!addr) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FALSE; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *addr = recvfrom_addr_; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_TRUE; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::PostAbortIfNecessary( 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback>* callback) { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(*callback)) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*callback)->PostAbort(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t UDPSocketPrivateResource::SendTo( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* buffer, 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t num_bytes, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_NetAddress_Private* addr, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!buffer || num_bytes <= 0 || !addr) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_BADARGUMENT; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!bound_) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(sendto_callback_)) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_INPROGRESS; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_bytes > kMaxWriteSize) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_bytes = kMaxWriteSize; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sendto_callback_ = callback; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Send the request, the browser will call us back via SendToReply. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendSendTo(std::string(buffer, num_bytes), *addr); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::Close() { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if(closed_) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_ = false; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) closed_ = true; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendClose(); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostAbortIfNecessary(&bind_callback_); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostAbortIfNecessary(&recvfrom_callback_); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostAbortIfNecessary(&sendto_callback_); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::SendBoolSocketFeature(int32_t name, bool value) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_UDPSocketPrivate_SetBoolSocketFeature msg(name, value); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(BROWSER, msg); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::SendBind(const PP_NetAddress_Private& addr) { 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_UDPSocketPrivate_Bind msg(addr); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_UDPSocketPrivate_BindReply>( 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BROWSER, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&UDPSocketPrivateResource::OnPluginMsgBindReply, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::SendRecvFrom(int32_t num_bytes) { 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_UDPSocketPrivate_RecvFrom msg(num_bytes); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_UDPSocketPrivate_RecvFromReply>( 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BROWSER, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&UDPSocketPrivateResource::OnPluginMsgRecvFromReply, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::SendSendTo(const std::string& buffer, 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_NetAddress_Private& addr) { 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_UDPSocketPrivate_SendTo msg(buffer, addr); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_UDPSocketPrivate_SendToReply>( 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BROWSER, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) msg, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&UDPSocketPrivateResource::OnPluginMsgSendToReply, 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::SendClose() { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_UDPSocketPrivate_Close msg; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(BROWSER, msg); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::OnPluginMsgBindReply( 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_NetAddress_Private& bound_addr) { 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!TrackedCallback::IsPending(bind_callback_)) { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.result() == PP_OK) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_ = true; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_addr_ = bound_addr; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bind_callback_->Run(params.result()); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::OnPluginMsgRecvFromReply( 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& data, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_NetAddress_Private& addr) { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!TrackedCallback::IsPending(recvfrom_callback_) || !read_buffer_) { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool succeeded = (params.result() == PP_OK); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (succeeded) { 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!data.empty()) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memcpy(read_buffer_, data.c_str(), data.size()); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) read_buffer_ = NULL; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bytes_to_read_ = -1; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recvfrom_addr_ = addr; 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (succeeded) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recvfrom_callback_->Run(static_cast<int32_t>(data.size())); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recvfrom_callback_->Run(params.result()); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UDPSocketPrivateResource::OnPluginMsgSendToReply( 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t bytes_written) { 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!TrackedCallback::IsPending(sendto_callback_)) { 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.result() == PP_OK) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sendto_callback_->Run(bytes_written); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sendto_callback_->Run(params.result()); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace proxy 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 253