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