Index: content/browser/renderer_host/pepper/pepper_udp_socket_private_message_filter.cc |
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_private_message_filter.cc b/content/browser/renderer_host/pepper/pepper_udp_socket_private_message_filter.cc |
deleted file mode 100644 |
index c88c5d01351bb57b3921c32630c60ae0283b77ee..0000000000000000000000000000000000000000 |
--- a/content/browser/renderer_host/pepper/pepper_udp_socket_private_message_filter.cc |
+++ /dev/null |
@@ -1,402 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/browser/renderer_host/pepper/pepper_udp_socket_private_message_filter.h" |
- |
-#include <cstring> |
-#include <limits> |
- |
-#include "base/compiler_specific.h" |
-#include "base/logging.h" |
-#include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h" |
-#include "content/browser/renderer_host/pepper/pepper_socket_utils.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/common/process_type.h" |
-#include "content/public/common/socket_permission_request.h" |
-#include "ipc/ipc_message_macros.h" |
-#include "net/base/io_buffer.h" |
-#include "net/base/net_errors.h" |
-#include "net/udp/udp_server_socket.h" |
-#include "ppapi/c/pp_errors.h" |
-#include "ppapi/c/private/ppb_net_address_private.h" |
-#include "ppapi/c/private/ppb_udp_socket_private.h" |
-#include "ppapi/host/dispatch_host_message.h" |
-#include "ppapi/host/host_message_context.h" |
-#include "ppapi/host/ppapi_host.h" |
-#include "ppapi/proxy/ppapi_messages.h" |
-#include "ppapi/proxy/udp_socket_private_resource.h" |
-#include "ppapi/shared_impl/private/net_address_private_impl.h" |
- |
-using ppapi::NetAddressPrivateImpl; |
- |
-namespace content { |
- |
-namespace { |
- |
-bool CanUseSocketAPIs(const SocketPermissionRequest& request, |
- bool external_plugin, |
- int render_process_id, |
- int render_view_id) { |
- RenderViewHost* render_view_host = RenderViewHost::FromID(render_process_id, |
- render_view_id); |
- return render_view_host && |
- pepper_socket_utils::CanUseSocketAPIs(external_plugin, |
- true, |
- request, |
- render_view_host); |
-} |
- |
-} // namespace |
- |
-PepperUDPSocketPrivateMessageFilter::PepperUDPSocketPrivateMessageFilter( |
- BrowserPpapiHostImpl* host, |
- PP_Instance instance) |
- : allow_address_reuse_(false), |
- allow_broadcast_(false), |
- closed_(false), |
- external_plugin_(host->external_plugin()), |
- render_process_id_(0), |
- render_view_id_(0) { |
- DCHECK(host); |
- |
- if (!host->GetRenderViewIDsForInstance( |
- instance, |
- &render_process_id_, |
- &render_view_id_)) { |
- NOTREACHED(); |
- } |
-} |
- |
-PepperUDPSocketPrivateMessageFilter::~PepperUDPSocketPrivateMessageFilter() { |
- Close(); |
-} |
- |
-scoped_refptr<base::TaskRunner> |
-PepperUDPSocketPrivateMessageFilter::OverrideTaskRunnerForMessage( |
- const IPC::Message& message) { |
- switch (message.type()) { |
- case PpapiHostMsg_UDPSocketPrivate_SetBoolSocketFeature::ID: |
- case PpapiHostMsg_UDPSocketPrivate_RecvFrom::ID: |
- case PpapiHostMsg_UDPSocketPrivate_Close::ID: |
- return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); |
- case PpapiHostMsg_UDPSocketPrivate_Bind::ID: |
- case PpapiHostMsg_UDPSocketPrivate_SendTo::ID: |
- return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); |
- } |
- return NULL; |
-} |
- |
-int32_t PepperUDPSocketPrivateMessageFilter::OnResourceMessageReceived( |
- const IPC::Message& msg, |
- ppapi::host::HostMessageContext* context) { |
- IPC_BEGIN_MESSAGE_MAP(PepperUDPSocketPrivateMessageFilter, msg) |
- PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
- PpapiHostMsg_UDPSocketPrivate_SetBoolSocketFeature, |
- OnMsgSetBoolSocketFeature) |
- PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
- PpapiHostMsg_UDPSocketPrivate_Bind, |
- OnMsgBind) |
- PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
- PpapiHostMsg_UDPSocketPrivate_RecvFrom, |
- OnMsgRecvFrom) |
- PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
- PpapiHostMsg_UDPSocketPrivate_SendTo, |
- OnMsgSendTo) |
- PPAPI_DISPATCH_HOST_RESOURCE_CALL_0( |
- PpapiHostMsg_UDPSocketPrivate_Close, |
- OnMsgClose) |
- IPC_END_MESSAGE_MAP() |
- return PP_ERROR_FAILED; |
-} |
- |
-int32_t PepperUDPSocketPrivateMessageFilter::OnMsgSetBoolSocketFeature( |
- const ppapi::host::HostMessageContext* context, |
- int32_t name, |
- bool value) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK(!socket_.get()); |
- |
- if (closed_) |
- return PP_ERROR_FAILED; |
- |
- switch(static_cast<PP_UDPSocketFeature_Private>(name)) { |
- case PP_UDPSOCKETFEATURE_ADDRESS_REUSE: |
- allow_address_reuse_ = value; |
- break; |
- case PP_UDPSOCKETFEATURE_BROADCAST: |
- allow_broadcast_ = value; |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- return PP_OK; |
-} |
- |
-int32_t PepperUDPSocketPrivateMessageFilter::OnMsgBind( |
- const ppapi::host::HostMessageContext* context, |
- const PP_NetAddress_Private& addr) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(context); |
- |
- SocketPermissionRequest request = |
- pepper_socket_utils::CreateSocketPermissionRequest( |
- SocketPermissionRequest::UDP_BIND, addr); |
- if (!CanUseSocketAPIs(request, external_plugin_, |
- render_process_id_, render_view_id_)) { |
- return PP_ERROR_FAILED; |
- } |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&PepperUDPSocketPrivateMessageFilter::DoBind, this, |
- context->MakeReplyMessageContext(), |
- addr)); |
- return PP_OK_COMPLETIONPENDING; |
-} |
- |
-int32_t PepperUDPSocketPrivateMessageFilter::OnMsgRecvFrom( |
- const ppapi::host::HostMessageContext* context, |
- int32_t num_bytes) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK(context); |
- DCHECK(socket_.get()); |
- |
- if (closed_) |
- return PP_ERROR_FAILED; |
- |
- if (recvfrom_buffer_.get()) |
- return PP_ERROR_INPROGRESS; |
- if (num_bytes > ppapi::proxy::UDPSocketPrivateResource::kMaxReadSize) { |
- // |num_bytes| value is checked on the plugin side. |
- NOTREACHED(); |
- num_bytes = ppapi::proxy::UDPSocketPrivateResource::kMaxReadSize; |
- } |
- recvfrom_buffer_ = new net::IOBuffer(num_bytes); |
- int result = socket_->RecvFrom( |
- recvfrom_buffer_.get(), |
- num_bytes, |
- &recvfrom_address_, |
- base::Bind(&PepperUDPSocketPrivateMessageFilter::OnRecvFromCompleted, |
- this, |
- context->MakeReplyMessageContext())); |
- if (result != net::ERR_IO_PENDING) |
- OnRecvFromCompleted(context->MakeReplyMessageContext(), result); |
- return PP_OK_COMPLETIONPENDING; |
-} |
- |
-int32_t PepperUDPSocketPrivateMessageFilter::OnMsgSendTo( |
- const ppapi::host::HostMessageContext* context, |
- const std::string& data, |
- const PP_NetAddress_Private& addr) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(context); |
- |
- SocketPermissionRequest request = |
- pepper_socket_utils::CreateSocketPermissionRequest( |
- SocketPermissionRequest::UDP_SEND_TO, addr); |
- if (!CanUseSocketAPIs(request, external_plugin_, |
- render_process_id_, render_view_id_)) { |
- return PP_ERROR_FAILED; |
- } |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&PepperUDPSocketPrivateMessageFilter::DoSendTo, this, |
- context->MakeReplyMessageContext(), data, addr)); |
- return PP_OK_COMPLETIONPENDING; |
-} |
- |
-int32_t PepperUDPSocketPrivateMessageFilter::OnMsgClose( |
- const ppapi::host::HostMessageContext* context) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- Close(); |
- return PP_OK; |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::DoBind( |
- const ppapi::host::ReplyMessageContext& context, |
- const PP_NetAddress_Private& addr) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- if (closed_) { |
- SendBindError(context, PP_ERROR_FAILED); |
- return; |
- } |
- |
- socket_.reset(new net::UDPServerSocket(NULL, net::NetLog::Source())); |
- |
- net::IPAddressNumber address; |
- int port; |
- if (!socket_.get() || |
- !NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &address, &port)) { |
- SendBindError(context, PP_ERROR_FAILED); |
- return; |
- } |
- |
- if (allow_address_reuse_) |
- socket_->AllowAddressReuse(); |
- if (allow_broadcast_) |
- socket_->AllowBroadcast(); |
- |
- int result = socket_->Listen(net::IPEndPoint(address, port)); |
- |
- net::IPEndPoint bound_address; |
- PP_NetAddress_Private net_address = NetAddressPrivateImpl::kInvalidNetAddress; |
- if (result != net::OK || |
- socket_->GetLocalAddress(&bound_address) != net::OK || |
- !NetAddressPrivateImpl::IPEndPointToNetAddress(bound_address.address(), |
- bound_address.port(), |
- &net_address)) { |
- SendBindError(context, PP_ERROR_FAILED); |
- } else { |
- SendBindReply(context, PP_OK, net_address); |
- } |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::DoSendTo( |
- const ppapi::host::ReplyMessageContext& context, |
- const std::string& data, |
- const PP_NetAddress_Private& addr) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK(socket_.get()); |
- |
- if (closed_) { |
- SendSendToError(context, PP_ERROR_FAILED); |
- return; |
- } |
- |
- if (sendto_buffer_.get()) { |
- SendSendToError(context, PP_ERROR_INPROGRESS); |
- return; |
- } |
- |
- if (data.empty() || |
- data.size() > static_cast<size_t>(std::numeric_limits<int>::max())) { |
- SendSendToError(context, PP_ERROR_BADARGUMENT); |
- return; |
- } |
- size_t num_bytes = data.size(); |
- if (num_bytes > static_cast<size_t>( |
- ppapi::proxy::UDPSocketPrivateResource::kMaxWriteSize)) { |
- // Size of |data| is checked on the plugin side. |
- NOTREACHED(); |
- num_bytes = static_cast<size_t>( |
- ppapi::proxy::UDPSocketPrivateResource::kMaxWriteSize); |
- } |
- sendto_buffer_ = new net::IOBufferWithSize(num_bytes); |
- memcpy(sendto_buffer_->data(), data.data(), num_bytes); |
- |
- net::IPAddressNumber address; |
- int port; |
- if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &address, &port)) { |
- SendSendToError(context, PP_ERROR_FAILED); |
- return; |
- } |
- |
- int result = socket_->SendTo( |
- sendto_buffer_.get(), |
- sendto_buffer_->size(), |
- net::IPEndPoint(address, port), |
- base::Bind(&PepperUDPSocketPrivateMessageFilter::OnSendToCompleted, |
- this, |
- context)); |
- if (result != net::ERR_IO_PENDING) |
- OnSendToCompleted(context, result); |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::Close() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- if (socket_.get() && !closed_) |
- socket_->Close(); |
- closed_ = true; |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::OnRecvFromCompleted( |
- const ppapi::host::ReplyMessageContext& context, |
- int32_t result) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK(recvfrom_buffer_.get()); |
- |
- // Convert IPEndPoint we get back from RecvFrom to a PP_NetAddress_Private, |
- // to send back. |
- PP_NetAddress_Private addr = NetAddressPrivateImpl::kInvalidNetAddress; |
- if (result < 0 || |
- !NetAddressPrivateImpl::IPEndPointToNetAddress( |
- recvfrom_address_.address(), |
- recvfrom_address_.port(), |
- &addr)) { |
- SendRecvFromError(context, PP_ERROR_FAILED); |
- } else { |
- SendRecvFromReply(context, PP_OK, |
- std::string(recvfrom_buffer_->data(), result), addr); |
- } |
- |
- recvfrom_buffer_ = NULL; |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::OnSendToCompleted( |
- const ppapi::host::ReplyMessageContext& context, |
- int32_t result) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK(sendto_buffer_.get()); |
- if (result < 0) |
- SendSendToError(context, PP_ERROR_FAILED); |
- else |
- SendSendToReply(context, PP_OK, result); |
- sendto_buffer_ = NULL; |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::SendBindReply( |
- const ppapi::host::ReplyMessageContext& context, |
- int32_t result, |
- const PP_NetAddress_Private& addr) { |
- ppapi::host::ReplyMessageContext reply_context(context); |
- reply_context.params.set_result(result); |
- SendReply(reply_context, PpapiPluginMsg_UDPSocketPrivate_BindReply(addr)); |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::SendRecvFromReply( |
- const ppapi::host::ReplyMessageContext& context, |
- int32_t result, |
- const std::string& data, |
- const PP_NetAddress_Private& addr) { |
- ppapi::host::ReplyMessageContext reply_context(context); |
- reply_context.params.set_result(result); |
- SendReply(reply_context, |
- PpapiPluginMsg_UDPSocketPrivate_RecvFromReply(data, addr)); |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::SendSendToReply( |
- const ppapi::host::ReplyMessageContext& context, |
- int32_t result, |
- int32_t bytes_written) { |
- ppapi::host::ReplyMessageContext reply_context(context); |
- reply_context.params.set_result(result); |
- SendReply(reply_context, |
- PpapiPluginMsg_UDPSocketPrivate_SendToReply(bytes_written)); |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::SendBindError( |
- const ppapi::host::ReplyMessageContext& context, |
- int32_t result) { |
- SendBindReply(context, result, NetAddressPrivateImpl::kInvalidNetAddress); |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::SendRecvFromError( |
- const ppapi::host::ReplyMessageContext& context, |
- int32_t result) { |
- SendRecvFromReply(context, |
- result, |
- std::string(), |
- NetAddressPrivateImpl::kInvalidNetAddress); |
-} |
- |
-void PepperUDPSocketPrivateMessageFilter::SendSendToError( |
- const ppapi::host::ReplyMessageContext& context, |
- int32_t result) { |
- SendSendToReply(context, result, 0); |
-} |
- |
-} // namespace content |