OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "content/browser/renderer_host/pepper/pepper_udp_socket_private_host.h" |
| 6 |
| 7 #include <vector> |
| 8 |
| 9 #include "base/logging.h" |
| 10 #include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h" |
| 11 #include "content/browser/renderer_host/pepper/pepper_utils.h" |
| 12 #include "content/public/browser/browser_thread.h" |
| 13 #include "content/public/common/process_type.h" |
| 14 #include "content/public/common/socket_permission_request.h" |
| 15 #include "ipc/ipc_message_macros.h" |
| 16 #include "ppapi/c/pp_errors.h" |
| 17 #include "ppapi/c/private/ppb_net_address_private.h" |
| 18 #include "ppapi/host/dispatch_host_message.h" |
| 19 #include "ppapi/host/host_message_context.h" |
| 20 #include "ppapi/host/ppapi_host.h" |
| 21 #include "ppapi/proxy/ppapi_messages.h" |
| 22 |
| 23 namespace content { |
| 24 |
| 25 PepperUDPSocketPrivateHost::PepperUDPSocketPrivateHost( |
| 26 BrowserPpapiHostImpl* host, |
| 27 PP_Instance instance, |
| 28 PP_Resource resource) |
| 29 : ResourceHost(host->GetPpapiHost(), instance, resource), |
| 30 host_(host), |
| 31 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| 32 DCHECK(host_); |
| 33 } |
| 34 |
| 35 PepperUDPSocketPrivateHost::~PepperUDPSocketPrivateHost() { |
| 36 } |
| 37 |
| 38 int32_t PepperUDPSocketPrivateHost::OnResourceMessageReceived( |
| 39 const IPC::Message& msg, |
| 40 ppapi::host::HostMessageContext* context) { |
| 41 IPC_BEGIN_MESSAGE_MAP(PepperUDPSocketPrivateHost, msg) |
| 42 PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
| 43 PpapiHostMsg_UDPSocketPrivate_SetBoolSocketFeature, |
| 44 OnMsgSetBoolSocketFeature) |
| 45 PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
| 46 PpapiHostMsg_UDPSocketPrivate_Bind, |
| 47 OnMsgBind) |
| 48 PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
| 49 PpapiHostMsg_UDPSocketPrivate_RecvFrom, |
| 50 OnMsgRecvFrom) |
| 51 PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_UDPSocketPrivate_SendTo, |
| 52 OnMsgSendTo) |
| 53 PPAPI_DISPATCH_HOST_RESOURCE_CALL_0( |
| 54 PpapiHostMsg_UDPSocketPrivate_Close, |
| 55 OnMsgClose) |
| 56 IPC_END_MESSAGE_MAP() |
| 57 return PP_ERROR_FAILED; |
| 58 } |
| 59 |
| 60 int32_t PepperUDPSocketPrivateHost::OnMsgSetBoolSocketFeature( |
| 61 const ppapi::host::HostMessageContext* context, |
| 62 int32_t name, |
| 63 bool value) { |
| 64 SetBoolSocketFeature(name, value); |
| 65 return PP_OK; |
| 66 } |
| 67 |
| 68 int32_t PepperUDPSocketPrivateHost::OnMsgBind( |
| 69 const ppapi::host::HostMessageContext* context, |
| 70 const PP_NetAddress_Private& addr) { |
| 71 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 72 DCHECK(context); |
| 73 |
| 74 if (bind_context_.get()) |
| 75 return PP_ERROR_INPROGRESS; |
| 76 bind_context_.reset( |
| 77 new ppapi::host::ReplyMessageContext(context->MakeReplyMessageContext())); |
| 78 |
| 79 SocketPermissionRequest params = PepperUtils::CreateSocketPermissionRequest( |
| 80 SocketPermissionRequest::UDP_BIND, addr); |
| 81 CheckSocketPermissionsAndReply(params, |
| 82 base::Bind(&PepperUDPSocketPrivateHost::DoBind, |
| 83 weak_factory_.GetWeakPtr(), |
| 84 addr)); |
| 85 return PP_OK_COMPLETIONPENDING; |
| 86 } |
| 87 |
| 88 void PepperUDPSocketPrivateHost::DoBind(const PP_NetAddress_Private& addr, |
| 89 bool allowed) { |
| 90 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 91 |
| 92 if (!allowed) { |
| 93 SendBindError(); |
| 94 return; |
| 95 } |
| 96 Bind(addr); |
| 97 } |
| 98 |
| 99 int32_t PepperUDPSocketPrivateHost::OnMsgRecvFrom( |
| 100 const ppapi::host::HostMessageContext* context, |
| 101 int32_t num_bytes) { |
| 102 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 103 DCHECK(context); |
| 104 |
| 105 if (recv_from_context_.get()) |
| 106 return PP_ERROR_INPROGRESS; |
| 107 recv_from_context_.reset( |
| 108 new ppapi::host::ReplyMessageContext(context->MakeReplyMessageContext())); |
| 109 RecvFrom(num_bytes); |
| 110 return PP_OK_COMPLETIONPENDING; |
| 111 } |
| 112 |
| 113 int32_t PepperUDPSocketPrivateHost::OnMsgSendTo( |
| 114 const ppapi::host::HostMessageContext* context, |
| 115 const std::string& data, |
| 116 const PP_NetAddress_Private& addr) { |
| 117 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 118 DCHECK(context); |
| 119 |
| 120 if (send_to_context_.get()) |
| 121 return PP_ERROR_INPROGRESS; |
| 122 send_to_context_.reset( |
| 123 new ppapi::host::ReplyMessageContext(context->MakeReplyMessageContext())); |
| 124 SocketPermissionRequest params = PepperUtils::CreateSocketPermissionRequest( |
| 125 SocketPermissionRequest::UDP_SEND_TO, addr); |
| 126 CheckSocketPermissionsAndReply(params, |
| 127 base::Bind( |
| 128 &PepperUDPSocketPrivateHost::DoSendTo, |
| 129 weak_factory_.GetWeakPtr(), |
| 130 data, |
| 131 addr)); |
| 132 return PP_OK_COMPLETIONPENDING; |
| 133 } |
| 134 |
| 135 void PepperUDPSocketPrivateHost::DoSendTo(const std::string& data, |
| 136 const PP_NetAddress_Private& addr, |
| 137 bool allowed) { |
| 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 139 |
| 140 if (!allowed) { |
| 141 SendSendToError(); |
| 142 return; |
| 143 } |
| 144 SendTo(data, addr); |
| 145 } |
| 146 |
| 147 int32_t PepperUDPSocketPrivateHost::OnMsgClose( |
| 148 const ppapi::host::HostMessageContext* context) { |
| 149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 150 |
| 151 Close(); |
| 152 return PP_OK; |
| 153 } |
| 154 |
| 155 void PepperUDPSocketPrivateHost::SendBindReply( |
| 156 bool succeeded, |
| 157 const PP_NetAddress_Private& addr) { |
| 158 DCHECK(bind_context_.get()); |
| 159 |
| 160 scoped_ptr<ppapi::host::ReplyMessageContext> context(bind_context_.release()); |
| 161 host()->SendReply(*context, |
| 162 PpapiPluginMsg_UDPSocketPrivate_BindReply(succeeded, addr)); |
| 163 } |
| 164 |
| 165 void PepperUDPSocketPrivateHost::SendRecvFromReply( |
| 166 bool succeeded, |
| 167 const std::string& data, |
| 168 const PP_NetAddress_Private& addr) { |
| 169 DCHECK(recv_from_context_.get()); |
| 170 |
| 171 scoped_ptr<ppapi::host::ReplyMessageContext> context( |
| 172 recv_from_context_.release()); |
| 173 host()->SendReply(*context, |
| 174 PpapiPluginMsg_UDPSocketPrivate_RecvFromReply(succeeded, |
| 175 data, |
| 176 addr)); |
| 177 } |
| 178 |
| 179 void PepperUDPSocketPrivateHost::SendSendToReply(bool succeeded, |
| 180 int32_t bytes_written) { |
| 181 DCHECK(send_to_context_.get()); |
| 182 |
| 183 scoped_ptr<ppapi::host::ReplyMessageContext> context( |
| 184 send_to_context_.release()); |
| 185 host()->SendReply(*context, |
| 186 PpapiPluginMsg_UDPSocketPrivate_SendToReply(succeeded, |
| 187 bytes_written)); |
| 188 } |
| 189 |
| 190 void PepperUDPSocketPrivateHost::CheckSocketPermissionsAndReply( |
| 191 const SocketPermissionRequest& params, |
| 192 const RequestCallback& callback) { |
| 193 host_->PostOnUIThreadWithRenderViewHostAndReply( |
| 194 FROM_HERE, |
| 195 pp_instance(), |
| 196 base::Bind(&PepperUtils::CanUseSocketAPIs, |
| 197 host_->plugin_process_type(), params), |
| 198 callback); |
| 199 } |
| 200 |
| 201 } // namespace content |
OLD | NEW |