summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-15 09:39:56 +0000
committerygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-15 09:39:56 +0000
commit2d011e88f4d4106c1a3a2b4fae4ce2e46bb7d8b3 (patch)
treea1721b6061e1f4cc64350d6d6b61613ec7fe1118
parentc1c32c85357f14756247b04b8b5ae41b05bf2e16 (diff)
downloadchromium_src-2d011e88f4d4106c1a3a2b4fae4ce2e46bb7d8b3.zip
chromium_src-2d011e88f4d4106c1a3a2b4fae4ce2e46bb7d8b3.tar.gz
chromium_src-2d011e88f4d4106c1a3a2b4fae4ce2e46bb7d8b3.tar.bz2
Added out-of-process support for server sockets.
BUG=108277 TEST=OutOfProcessPPAPITest.TCPServerSocketPrivate Review URL: http://codereview.chromium.org/9669038 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126873 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/test/ui/ppapi_uitest.cc1
-rw-r--r--content/browser/renderer_host/pepper_message_filter.cc33
-rw-r--r--content/browser/renderer_host/pepper_message_filter.h10
-rw-r--r--content/browser/renderer_host/pepper_tcp_server_socket.cc33
-rw-r--r--content/browser/renderer_host/pepper_tcp_server_socket.h17
-rw-r--r--content/ppapi_plugin/ppapi_thread.cc4
-rw-r--r--content/renderer/pepper/pepper_plugin_delegate_impl.cc66
-rw-r--r--content/renderer/pepper/pepper_plugin_delegate_impl.h22
-rw-r--r--ppapi/ppapi_proxy.gypi2
-rw-r--r--ppapi/proxy/interface_list.cc1
-rw-r--r--ppapi/proxy/ppapi_messages.h17
-rw-r--r--ppapi/proxy/ppb_tcp_server_socket_private_proxy.cc202
-rw-r--r--ppapi/proxy/ppb_tcp_server_socket_private_proxy.h59
-rw-r--r--ppapi/proxy/ppb_tcp_socket_private_proxy.cc34
-rw-r--r--ppapi/proxy/ppb_tcp_socket_private_proxy.h7
-rw-r--r--ppapi/proxy/resource_creation_proxy.cc4
-rw-r--r--ppapi/shared_impl/api_id.h1
-rw-r--r--ppapi/shared_impl/private/ppb_tcp_server_socket_shared.cc19
-rw-r--r--ppapi/shared_impl/private/ppb_tcp_server_socket_shared.h12
-rw-r--r--ppapi/thunk/interfaces_ppb_private.h4
-rw-r--r--webkit/plugins/ppapi/mock_plugin_delegate.cc10
-rw-r--r--webkit/plugins/ppapi/mock_plugin_delegate.h9
-rw-r--r--webkit/plugins/ppapi/plugin_delegate.h12
-rw-r--r--webkit/plugins/ppapi/plugin_module.cc3
-rw-r--r--webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.cc12
-rw-r--r--webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.h5
26 files changed, 451 insertions, 148 deletions
diff --git a/chrome/test/ui/ppapi_uitest.cc b/chrome/test/ui/ppapi_uitest.cc
index ddecbc1..68b3ccd 100644
--- a/chrome/test/ui/ppapi_uitest.cc
+++ b/chrome/test/ui/ppapi_uitest.cc
@@ -477,6 +477,7 @@ TEST_PPAPI_NACL_VIA_HTTP_DISALLOWED_SOCKETS(TCPSocketPrivateDisallowed)
TEST_PPAPI_NACL_VIA_HTTP_DISALLOWED_SOCKETS(UDPSocketPrivateDisallowed)
TEST_PPAPI_IN_PROCESS_VIA_HTTP(TCPServerSocketPrivate)
+TEST_PPAPI_OUT_OF_PROCESS_VIA_HTTP(TCPServerSocketPrivate)
// TODO(ygorshenin): http://crbug.com/116480.
TEST_PPAPI_NACL_VIA_HTTP(DISABLED_TCPServerSocketPrivate)
diff --git a/content/browser/renderer_host/pepper_message_filter.cc b/content/browser/renderer_host/pepper_message_filter.cc
index 92a30ae..44302ec 100644
--- a/content/browser/renderer_host/pepper_message_filter.cc
+++ b/content/browser/renderer_host/pepper_message_filter.cc
@@ -175,8 +175,8 @@ uint32 PepperMessageFilter::AddAcceptedTCPSocket(
return tcp_socket_id;
}
-void PepperMessageFilter::RemoveTCPServerSocket(uint32 real_socket_id) {
- TCPServerSocketMap::iterator iter = tcp_server_sockets_.find(real_socket_id);
+void PepperMessageFilter::RemoveTCPServerSocket(uint32 socket_id) {
+ TCPServerSocketMap::iterator iter = tcp_server_sockets_.find(socket_id);
if (iter == tcp_server_sockets_.end()) {
NOTREACHED();
return;
@@ -567,7 +567,7 @@ void PepperMessageFilter::OnUDPClose(uint32 socket_id) {
void PepperMessageFilter::OnTCPServerListen(int32 routing_id,
uint32 plugin_dispatcher_id,
- uint32 temp_socket_id,
+ PP_Resource socket_resource,
const PP_NetAddress_Private& addr,
int32_t backlog) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -577,7 +577,7 @@ void PepperMessageFilter::OnTCPServerListen(int32 routing_id,
CanUseSocketAPIs(routing_id),
routing_id,
plugin_dispatcher_id,
- temp_socket_id,
+ socket_resource,
addr,
backlog));
}
@@ -585,41 +585,42 @@ void PepperMessageFilter::OnTCPServerListen(int32 routing_id,
void PepperMessageFilter::DoTCPServerListen(bool allowed,
int32 routing_id,
uint32 plugin_dispatcher_id,
- uint32 temp_socket_id,
+ PP_Resource socket_resource,
const PP_NetAddress_Private& addr,
int32_t backlog) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (!allowed) {
Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(routing_id,
plugin_dispatcher_id,
+ socket_resource,
0,
- temp_socket_id,
PP_ERROR_FAILED));
return;
}
- uint32 real_socket_id = GenerateSocketID();
- if (real_socket_id == kInvalidSocketID) {
+ uint32 socket_id = GenerateSocketID();
+ if (socket_id == kInvalidSocketID) {
Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(routing_id,
plugin_dispatcher_id,
- real_socket_id,
- temp_socket_id,
+ socket_resource,
+ 0,
PP_ERROR_NOSPACE));
return;
}
PepperTCPServerSocket* socket = new PepperTCPServerSocket(
- this, routing_id, plugin_dispatcher_id, real_socket_id, temp_socket_id);
- tcp_server_sockets_[real_socket_id] =
- linked_ptr<PepperTCPServerSocket>(socket);
+ this, routing_id, plugin_dispatcher_id, socket_resource, socket_id);
+ tcp_server_sockets_[socket_id] = linked_ptr<PepperTCPServerSocket>(socket);
socket->Listen(addr, backlog);
}
-void PepperMessageFilter::OnTCPServerAccept(uint32 real_socket_id) {
- TCPServerSocketMap::iterator iter = tcp_server_sockets_.find(real_socket_id);
+void PepperMessageFilter::OnTCPServerAccept(int32 tcp_client_socket_routing_id,
+ uint32 server_socket_id) {
+ TCPServerSocketMap::iterator iter =
+ tcp_server_sockets_.find(server_socket_id);
if (iter == tcp_server_sockets_.end()) {
NOTREACHED();
return;
}
- iter->second->Accept();
+ iter->second->Accept(tcp_client_socket_routing_id);
}
void PepperMessageFilter::OnHostResolverResolve(
diff --git a/content/browser/renderer_host/pepper_message_filter.h b/content/browser/renderer_host/pepper_message_filter.h
index a1a5610..c2b9a51 100644
--- a/content/browser/renderer_host/pepper_message_filter.h
+++ b/content/browser/renderer_host/pepper_message_filter.h
@@ -17,6 +17,7 @@
#include "content/public/browser/browser_message_filter.h"
#include "net/base/ssl_config_service.h"
#include "net/socket/stream_socket.h"
+#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_stdint.h"
class ListValue;
@@ -82,7 +83,7 @@ class PepperMessageFilter : public content::BrowserMessageFilter {
uint32 AddAcceptedTCPSocket(int32 routing_id,
uint32 plugin_dispatcher_id,
net::StreamSocket* socket);
- void RemoveTCPServerSocket(uint32 real_socket_id);
+ void RemoveTCPServerSocket(uint32 socket_id);
const net::SSLConfig& ssl_config() { return ssl_config_; }
@@ -160,10 +161,11 @@ class PepperMessageFilter : public content::BrowserMessageFilter {
void OnTCPServerListen(int32 routing_id,
uint32 plugin_dispatcher_id,
- uint32 temp_socket_id,
+ PP_Resource socket_resource,
const PP_NetAddress_Private& addr,
int32_t backlog);
- void OnTCPServerAccept(uint32 real_socket_id);
+ void OnTCPServerAccept(int32 tcp_client_socket_routing_id,
+ uint32 server_socket_id);
void OnHostResolverResolve(int32 routing_id,
uint32 plugin_dispatcher_id,
@@ -195,7 +197,7 @@ class PepperMessageFilter : public content::BrowserMessageFilter {
void DoTCPServerListen(bool allowed,
int32 routing_id,
uint32 plugin_dispatcher_id,
- uint32 temp_socket_id,
+ PP_Resource socket_resource,
const PP_NetAddress_Private& addr,
int32_t backlog);
void DoHostResolverResolve(bool allowed,
diff --git a/content/browser/renderer_host/pepper_tcp_server_socket.cc b/content/browser/renderer_host/pepper_tcp_server_socket.cc
index b108d0f..15a39c4 100644
--- a/content/browser/renderer_host/pepper_tcp_server_socket.cc
+++ b/content/browser/renderer_host/pepper_tcp_server_socket.cc
@@ -24,13 +24,13 @@ PepperTCPServerSocket::PepperTCPServerSocket(
PepperMessageFilter* manager,
int32 routing_id,
uint32 plugin_dispatcher_id,
- uint32 real_socket_id,
- uint32 temp_socket_id)
+ PP_Resource socket_resource,
+ uint32 socket_id)
: manager_(manager),
routing_id_(routing_id),
plugin_dispatcher_id_(plugin_dispatcher_id),
- real_socket_id_(real_socket_id),
- temp_socket_id_(temp_socket_id),
+ socket_resource_(socket_resource),
+ socket_id_(socket_id),
state_(BEFORE_LISTENING) {
DCHECK(manager);
}
@@ -57,7 +57,7 @@ void PepperTCPServerSocket::Listen(const PP_NetAddress_Private& addr,
OnListenCompleted(result);
}
-void PepperTCPServerSocket::Accept() {
+void PepperTCPServerSocket::Accept(int32 tcp_client_socket_routing_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (state_ != LISTENING) {
@@ -70,30 +70,31 @@ void PepperTCPServerSocket::Accept() {
int result = socket_->Accept(
&socket_buffer_,
base::Bind(&PepperTCPServerSocket::OnAcceptCompleted,
- base::Unretained(this)));
+ base::Unretained(this),
+ tcp_client_socket_routing_id));
if (result != net::ERR_IO_PENDING)
- OnAcceptCompleted(result);
+ OnAcceptCompleted(tcp_client_socket_routing_id, result);
}
void PepperTCPServerSocket::CancelListenRequest() {
manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(
routing_id_,
plugin_dispatcher_id_,
+ socket_resource_,
0,
- temp_socket_id_,
PP_ERROR_FAILED));
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
base::Bind(&PepperMessageFilter::RemoveTCPServerSocket, manager_,
- real_socket_id_));
+ socket_id_));
}
void PepperTCPServerSocket::SendAcceptACKError() {
manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK(
routing_id_,
plugin_dispatcher_id_,
- real_socket_id_,
+ socket_id_,
0,
NetAddressPrivateImpl::kInvalidNetAddress,
NetAddressPrivateImpl::kInvalidNetAddress));
@@ -108,14 +109,16 @@ void PepperTCPServerSocket::OnListenCompleted(int result) {
manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(
routing_id_,
plugin_dispatcher_id_,
- real_socket_id_,
- temp_socket_id_,
+ socket_resource_,
+ socket_id_,
PP_OK));
state_ = LISTENING;
}
}
-void PepperTCPServerSocket::OnAcceptCompleted(int result) {
+void PepperTCPServerSocket::OnAcceptCompleted(
+ int32 tcp_client_socket_routing_id,
+ int result) {
DCHECK(state_ == ACCEPT_IN_PROGRESS && socket_buffer_.get());
if (result != net::OK) {
@@ -139,14 +142,14 @@ void PepperTCPServerSocket::OnAcceptCompleted(int result) {
SendAcceptACKError();
} else {
uint32 accepted_socket_id =
- manager_->AddAcceptedTCPSocket(routing_id_,
+ manager_->AddAcceptedTCPSocket(tcp_client_socket_routing_id,
plugin_dispatcher_id_,
socket.release());
if (accepted_socket_id != 0) {
manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK(
routing_id_,
plugin_dispatcher_id_,
- real_socket_id_,
+ socket_id_,
accepted_socket_id,
local_addr,
remote_addr));
diff --git a/content/browser/renderer_host/pepper_tcp_server_socket.h b/content/browser/renderer_host/pepper_tcp_server_socket.h
index 77b5f43..27a4e2f 100644
--- a/content/browser/renderer_host/pepper_tcp_server_socket.h
+++ b/content/browser/renderer_host/pepper_tcp_server_socket.h
@@ -8,6 +8,7 @@
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
+#include "ppapi/c/pp_resource.h"
class PepperMessageFilter;
struct PP_NetAddress_Private;
@@ -25,12 +26,12 @@ class PepperTCPServerSocket {
PepperTCPServerSocket(PepperMessageFilter* manager,
int32 routing_id,
uint32 plugin_dispatcher_id,
- uint32 real_socket_id,
- uint32 temp_socket_id);
+ PP_Resource socket_resource,
+ uint32 socket_id);
~PepperTCPServerSocket();
void Listen(const PP_NetAddress_Private& addr, int32 backlog);
- void Accept();
+ void Accept(int32 tcp_client_socket_routing_id);
private:
enum State {
@@ -44,13 +45,17 @@ class PepperTCPServerSocket {
void SendAcceptACKError();
void OnListenCompleted(int result);
- void OnAcceptCompleted(int result);
+ void OnAcceptCompleted(int32 tcp_client_socket_routing_id,
+ int result);
PepperMessageFilter* manager_;
int32 routing_id_;
uint32 plugin_dispatcher_id_;
- uint32 real_socket_id_;
- uint32 temp_socket_id_;
+ // socket_resource_ is used only as an ID on the browser side. So we
+ // don't hold the ref to this resource and it may become invalid at
+ // the renderer/plugin side.
+ PP_Resource socket_resource_;
+ uint32 socket_id_;
State state_;
diff --git a/content/ppapi_plugin/ppapi_thread.cc b/content/ppapi_plugin/ppapi_thread.cc
index 08cada4..964127b 100644
--- a/content/ppapi_plugin/ppapi_thread.cc
+++ b/content/ppapi_plugin/ppapi_thread.cc
@@ -83,6 +83,10 @@ bool PpapiThread::OnMessageReceived(const IPC::Message& msg) {
IPC_BEGIN_MESSAGE_MAP(PpapiThread, msg)
IPC_MESSAGE_HANDLER(PpapiMsg_LoadPlugin, OnMsgLoadPlugin)
IPC_MESSAGE_HANDLER(PpapiMsg_CreateChannel, OnMsgCreateChannel)
+ IPC_MESSAGE_HANDLER_GENERIC(PpapiMsg_PPBTCPServerSocket_ListenACK,
+ OnPluginDispatcherMessageReceived(msg))
+ IPC_MESSAGE_HANDLER_GENERIC(PpapiMsg_PPBTCPServerSocket_AcceptACK,
+ OnPluginDispatcherMessageReceived(msg))
IPC_MESSAGE_HANDLER_GENERIC(PpapiMsg_PPBTCPSocket_ConnectACK,
OnPluginDispatcherMessageReceived(msg))
IPC_MESSAGE_HANDLER_GENERIC(PpapiMsg_PPBTCPSocket_SSLHandshakeACK,
diff --git a/content/renderer/pepper/pepper_plugin_delegate_impl.cc b/content/renderer/pepper/pepper_plugin_delegate_impl.cc
index 8118150..8945bdb 100644
--- a/content/renderer/pepper/pepper_plugin_delegate_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_delegate_impl.cc
@@ -64,6 +64,8 @@
#include "ppapi/shared_impl/platform_file.h"
#include "ppapi/shared_impl/ppapi_preferences.h"
#include "ppapi/shared_impl/ppb_device_ref_shared.h"
+#include "ppapi/thunk/enter.h"
+#include "ppapi/thunk/ppb_tcp_server_socket_private_api.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserCompletion.h"
@@ -1073,34 +1075,26 @@ void PepperPluginDelegateImpl::UDPSocketClose(uint32 socket_id) {
}
void PepperPluginDelegateImpl::TCPServerSocketListen(
- webkit::ppapi::PPB_TCPServerSocket_Private_Impl* socket,
- uint32 temp_socket_id,
+ PP_Resource socket_resource,
const PP_NetAddress_Private& addr,
int32_t backlog) {
- uninitialized_tcp_server_sockets_.AddWithID(socket, temp_socket_id);
render_view_->Send(
new PpapiHostMsg_PPBTCPServerSocket_Listen(
- render_view_->routing_id(), 0, temp_socket_id, addr, backlog));
+ render_view_->routing_id(), 0, socket_resource, addr, backlog));
}
-void PepperPluginDelegateImpl::TCPServerSocketAccept(uint32 real_socket_id) {
- DCHECK(tcp_server_sockets_.Lookup(real_socket_id));
+void PepperPluginDelegateImpl::TCPServerSocketAccept(uint32 server_socket_id) {
+ DCHECK(tcp_server_sockets_.Lookup(server_socket_id));
render_view_->Send(new PpapiHostMsg_PPBTCPServerSocket_Accept(
- real_socket_id));
+ render_view_->routing_id(), server_socket_id));
}
void PepperPluginDelegateImpl::TCPServerSocketStopListening(
- uint32 real_socket_id,
- uint32 temp_socket_id) {
- if (real_socket_id == 0) {
- if (uninitialized_tcp_server_sockets_.Lookup(temp_socket_id)) {
- // Pending Listen request.
- uninitialized_tcp_server_sockets_.Remove(temp_socket_id);
- }
- } else {
- render_view_->Send(
- new PpapiHostMsg_PPBTCPServerSocket_Destroy(real_socket_id));
- tcp_server_sockets_.Remove(real_socket_id);
+ PP_Resource socket_resource,
+ uint32 socket_id) {
+ if (socket_id != 0) {
+ render_view_->Send(new PpapiHostMsg_PPBTCPServerSocket_Destroy(socket_id));
+ tcp_server_sockets_.Remove(socket_id);
}
}
@@ -1517,38 +1511,40 @@ void PepperPluginDelegateImpl::OnUDPSocketSendToACK(uint32 plugin_dispatcher_id,
void PepperPluginDelegateImpl::OnTCPServerSocketListenACK(
uint32 plugin_dispatcher_id,
- uint32 real_socket_id,
- uint32 temp_socket_id,
+ PP_Resource socket_resource,
+ uint32 socket_id,
int32_t status) {
- webkit::ppapi::PPB_TCPServerSocket_Private_Impl* socket =
- uninitialized_tcp_server_sockets_.Lookup(temp_socket_id);
- if (socket == NULL) {
- // StopListening was called before completion of Listen.
- render_view_->Send(
- new PpapiHostMsg_PPBTCPServerSocket_Destroy(real_socket_id));
- } else {
- uninitialized_tcp_server_sockets_.Remove(temp_socket_id);
-
+ ppapi::thunk::EnterResource<ppapi::thunk::PPB_TCPServerSocket_Private_API>
+ enter(socket_resource, true);
+ if (enter.succeeded()) {
+ ppapi::PPB_TCPServerSocket_Shared* socket =
+ static_cast<ppapi::PPB_TCPServerSocket_Shared*>(enter.object());
if (status == PP_OK)
- tcp_server_sockets_.AddWithID(socket, real_socket_id);
- socket->OnListenCompleted(real_socket_id, status);
+ tcp_server_sockets_.AddWithID(socket, socket_id);
+ socket->OnListenCompleted(socket_id, status);
+ } else if (socket_id != 0 && status == PP_OK) {
+ // StopListening was called before completion of Listen.
+ render_view_->Send(new PpapiHostMsg_PPBTCPServerSocket_Destroy(socket_id));
}
}
void PepperPluginDelegateImpl::OnTCPServerSocketAcceptACK(
uint32 plugin_dispatcher_id,
- uint32 real_server_socket_id,
+ uint32 server_socket_id,
uint32 accepted_socket_id,
const PP_NetAddress_Private& local_addr,
const PP_NetAddress_Private& remote_addr) {
- webkit::ppapi::PPB_TCPServerSocket_Private_Impl* socket =
- tcp_server_sockets_.Lookup(real_server_socket_id);
+ ppapi::PPB_TCPServerSocket_Shared* socket =
+ tcp_server_sockets_.Lookup(server_socket_id);
if (socket) {
- bool succeeded = accepted_socket_id != 0;
+ bool succeeded = (accepted_socket_id != 0);
socket->OnAcceptCompleted(succeeded,
accepted_socket_id,
local_addr,
remote_addr);
+ } else if (accepted_socket_id != 0) {
+ render_view_->Send(
+ new PpapiHostMsg_PPBTCPSocket_Disconnect(accepted_socket_id));
}
}
diff --git a/content/renderer/pepper/pepper_plugin_delegate_impl.h b/content/renderer/pepper/pepper_plugin_delegate_impl.h
index 2f0b38c..08d1ed0 100644
--- a/content/renderer/pepper/pepper_plugin_delegate_impl.h
+++ b/content/renderer/pepper/pepper_plugin_delegate_impl.h
@@ -21,6 +21,7 @@
#include "content/renderer/mouse_lock_dispatcher.h"
#include "content/renderer/pepper/pepper_parent_context_provider.h"
#include "ppapi/shared_impl/private/ppb_host_resolver_shared.h"
+#include "ppapi/shared_impl/private/ppb_tcp_server_socket_shared.h"
#include "ppapi/shared_impl/private/tcp_socket_private_impl.h"
#include "ppapi/shared_impl/private/udp_socket_private_impl.h"
#include "ui/base/ime/text_input_type.h"
@@ -301,13 +302,13 @@ class PepperPluginDelegateImpl
const PP_NetAddress_Private& addr) OVERRIDE;
virtual void UDPSocketClose(uint32 socket_id) OVERRIDE;
virtual void TCPServerSocketListen(
- webkit::ppapi::PPB_TCPServerSocket_Private_Impl* socket,
- uint32 temp_socket_id,
+ PP_Resource socket_resource,
const PP_NetAddress_Private& addr,
int32_t backlog) OVERRIDE;
- virtual void TCPServerSocketAccept(uint32 real_socket_id) OVERRIDE;
- virtual void TCPServerSocketStopListening(uint32 real_socket_id,
- uint32 temp_socket_id) OVERRIDE;
+ virtual void TCPServerSocketAccept(uint32 server_socket_id) OVERRIDE;
+ virtual void TCPServerSocketStopListening(
+ PP_Resource socket_resource,
+ uint32 socket_id) OVERRIDE;
virtual void RegisterHostResolver(
ppapi::PPB_HostResolver_Shared* host_resolver,
@@ -402,11 +403,11 @@ class PepperPluginDelegateImpl
const std::string& data,
const PP_NetAddress_Private& addr);
void OnTCPServerSocketListenACK(uint32 plugin_dispatcher_id,
- uint32 real_socket_id,
- uint32 temp_socket_id,
+ PP_Resource socket_resource,
+ uint32 socket_id,
int32_t status);
void OnTCPServerSocketAcceptACK(uint32 plugin_dispatcher_id,
- uint32 real_server_socket_id,
+ uint32 socket_id,
uint32 accepted_socket_id,
const PP_NetAddress_Private& local_addr,
const PP_NetAddress_Private& remote_addr);
@@ -467,10 +468,7 @@ class PepperPluginDelegateImpl
IDMap<webkit::ppapi::PPB_UDPSocket_Private_Impl> udp_sockets_;
- IDMap<webkit::ppapi::PPB_TCPServerSocket_Private_Impl> tcp_server_sockets_;
-
- IDMap<webkit::ppapi::PPB_TCPServerSocket_Private_Impl>
- uninitialized_tcp_server_sockets_;
+ IDMap<ppapi::PPB_TCPServerSocket_Shared> tcp_server_sockets_;
IDMap<ppapi::PPB_HostResolver_Shared> host_resolvers_;
diff --git a/ppapi/ppapi_proxy.gypi b/ppapi/ppapi_proxy.gypi
index c23fd49..0f6c83a 100644
--- a/ppapi/ppapi_proxy.gypi
+++ b/ppapi/ppapi_proxy.gypi
@@ -107,6 +107,8 @@
'proxy/ppb_message_loop_proxy.h',
'proxy/ppb_pdf_proxy.cc',
'proxy/ppb_pdf_proxy.h',
+ 'proxy/ppb_tcp_server_socket_private_proxy.cc',
+ 'proxy/ppb_tcp_server_socket_private_proxy.h',
'proxy/ppb_tcp_socket_private_proxy.cc',
'proxy/ppb_tcp_socket_private_proxy.h',
'proxy/ppb_testing_proxy.cc',
diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc
index e746ffd..462148b 100644
--- a/ppapi/proxy/interface_list.cc
+++ b/ppapi/proxy/interface_list.cc
@@ -92,6 +92,7 @@
#include "ppapi/proxy/ppb_instance_proxy.h"
#include "ppapi/proxy/ppb_message_loop_proxy.h"
#include "ppapi/proxy/ppb_pdf_proxy.h"
+#include "ppapi/proxy/ppb_tcp_server_socket_private_proxy.h"
#include "ppapi/proxy/ppb_tcp_socket_private_proxy.h"
#include "ppapi/proxy/ppb_testing_proxy.h"
#include "ppapi/proxy/ppb_text_input_proxy.h"
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index 7a5c2f4..dbcbbd1 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -351,6 +351,8 @@ IPC_MESSAGE_ROUTED4(PpapiMsg_PPBUDPSocket_SendToACK,
// PPB_TCPServerSocket_Private.
+// |socket_resource| should not be used as Resource in browser. The
+// only purpose of this argument is to be echoed back.
// |status| == PP_ERROR_NOSPACE means that the socket table is full
// and new socket can't be initialized.
// |status| == PP_ERROR_FAILED means that socket is correctly
@@ -359,12 +361,12 @@ IPC_MESSAGE_ROUTED4(PpapiMsg_PPBUDPSocket_SendToACK,
// needed) and Listen call succeeds.
IPC_MESSAGE_ROUTED4(PpapiMsg_PPBTCPServerSocket_ListenACK,
uint32 /* plugin_dispatcher_id */,
- uint32 /* real_socket_id */,
- uint32 /* temp_socket_id */,
+ PP_Resource /* socket_resource */,
+ uint32 /* socket_id */,
int32_t /* status */)
IPC_MESSAGE_ROUTED5(PpapiMsg_PPBTCPServerSocket_AcceptACK,
uint32 /* plugin_dispatcher_id */,
- uint32 /* real_server_socket_id */,
+ uint32 /* server_socket_id */,
uint32 /* accepted_socket_id */,
PP_NetAddress_Private /* local_addr */,
PP_NetAddress_Private /* remote_addr */)
@@ -1289,13 +1291,14 @@ IPC_MESSAGE_CONTROL1(PpapiHostMsg_PPBUDPSocket_Close,
IPC_MESSAGE_CONTROL5(PpapiHostMsg_PPBTCPServerSocket_Listen,
int32 /* routing_id */,
uint32 /* plugin_dispatcher_id */,
- uint32 /* temp_socket_id */,
+ PP_Resource /* socket_resource */,
PP_NetAddress_Private /* addr */,
int32_t /* backlog */)
-IPC_MESSAGE_CONTROL1(PpapiHostMsg_PPBTCPServerSocket_Accept,
- uint32 /* real_socket_id */)
+IPC_MESSAGE_CONTROL2(PpapiHostMsg_PPBTCPServerSocket_Accept,
+ int32 /* tcp_client_socket_routing_id */,
+ uint32 /* server_socket_id */)
IPC_MESSAGE_CONTROL1(PpapiHostMsg_PPBTCPServerSocket_Destroy,
- uint32 /* real_socket_id */)
+ uint32 /* socket_id */)
// PPB_Font.
IPC_SYNC_MESSAGE_CONTROL0_1(PpapiHostMsg_PPBFont_GetFontFamilies,
diff --git a/ppapi/proxy/ppb_tcp_server_socket_private_proxy.cc b/ppapi/proxy/ppb_tcp_server_socket_private_proxy.cc
new file mode 100644
index 0000000..ed5d5ad
--- /dev/null
+++ b/ppapi/proxy/ppb_tcp_server_socket_private_proxy.cc
@@ -0,0 +1,202 @@
+// 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 "ppapi/proxy/ppb_tcp_server_socket_private_proxy.h"
+
+#include <cstddef>
+
+#include "base/logging.h"
+#include "ppapi/c/pp_errors.h"
+#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/plugin_globals.h"
+#include "ppapi/proxy/plugin_proxy_delegate.h"
+#include "ppapi/proxy/plugin_resource_tracker.h"
+#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/proxy/ppb_tcp_socket_private_proxy.h"
+#include "ppapi/shared_impl/private/ppb_tcp_server_socket_shared.h"
+#include "ppapi/shared_impl/resource.h"
+#include "ppapi/thunk/enter.h"
+#include "ppapi/thunk/thunk.h"
+
+namespace ppapi {
+namespace proxy {
+
+typedef thunk::EnterResource<thunk::PPB_TCPServerSocket_Private_API>
+ EnterTCPServerSocket;
+
+namespace {
+
+class TCPServerSocket : public PPB_TCPServerSocket_Shared {
+ public:
+ TCPServerSocket(const HostResource& resource, uint32 plugin_dispatcher_id);
+ virtual ~TCPServerSocket();
+
+ virtual void OnAcceptCompleted(
+ bool succeeded,
+ uint32 tcp_socket_id,
+ const PP_NetAddress_Private& local_addr,
+ const PP_NetAddress_Private& remote_addr) OVERRIDE;
+
+ virtual void SendListen(const PP_NetAddress_Private& addr,
+ int32_t backlog) OVERRIDE;
+ virtual void SendAccept() OVERRIDE;
+ virtual void SendStopListening() OVERRIDE;
+
+ private:
+ void SendToBrowser(IPC::Message* msg);
+
+ uint32 plugin_dispatcher_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(TCPServerSocket);
+};
+
+TCPServerSocket::TCPServerSocket(const HostResource& resource,
+ uint32 plugin_dispatcher_id)
+ : PPB_TCPServerSocket_Shared(resource),
+ plugin_dispatcher_id_(plugin_dispatcher_id) {
+}
+
+TCPServerSocket::~TCPServerSocket() {
+ StopListening();
+}
+
+void TCPServerSocket::OnAcceptCompleted(
+ bool succeeded,
+ uint32 accepted_socket_id,
+ const PP_NetAddress_Private& local_addr,
+ const PP_NetAddress_Private& remote_addr) {
+ if (!TrackedCallback::IsPending(accept_callback_) || !tcp_socket_buffer_) {
+ NOTREACHED();
+ return;
+ }
+
+ if (succeeded) {
+ *tcp_socket_buffer_ =
+ PPB_TCPSocket_Private_Proxy::CreateProxyResourceForConnectedSocket(
+ pp_instance(),
+ accepted_socket_id,
+ local_addr,
+ remote_addr);
+ }
+ tcp_socket_buffer_ = NULL;
+
+ TrackedCallback::ClearAndRun(&accept_callback_,
+ succeeded ? PP_OK : PP_ERROR_FAILED);
+}
+
+void TCPServerSocket::SendListen(const PP_NetAddress_Private& addr,
+ int32_t backlog) {
+ SendToBrowser(new PpapiHostMsg_PPBTCPServerSocket_Listen(
+ API_ID_PPB_TCPSERVERSOCKET_PRIVATE,
+ plugin_dispatcher_id_,
+ pp_resource(),
+ addr,
+ backlog));
+}
+
+void TCPServerSocket::SendAccept() {
+ SendToBrowser(new PpapiHostMsg_PPBTCPServerSocket_Accept(
+ API_ID_PPB_TCPSOCKET_PRIVATE, socket_id_));
+}
+
+void TCPServerSocket::SendStopListening() {
+ if (socket_id_ != 0) {
+ SendToBrowser(new PpapiHostMsg_PPBTCPServerSocket_Destroy(socket_id_));
+
+ PluginDispatcher* dispatcher =
+ PluginDispatcher::GetForInstance(host_resource().instance());
+ if (dispatcher) {
+ InterfaceProxy* proxy =
+ dispatcher->GetInterfaceProxy(API_ID_PPB_TCPSERVERSOCKET_PRIVATE);
+ PPB_TCPServerSocket_Private_Proxy* server_socket_proxy =
+ static_cast<PPB_TCPServerSocket_Private_Proxy*>(proxy);
+ server_socket_proxy->ObjectDestroyed(socket_id_);
+ }
+ }
+}
+
+void TCPServerSocket::SendToBrowser(IPC::Message* msg) {
+ PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser(msg);
+}
+
+} // namespace
+
+//------------------------------------------------------------------------------
+
+PPB_TCPServerSocket_Private_Proxy::PPB_TCPServerSocket_Private_Proxy(
+ Dispatcher* dispatcher)
+ : InterfaceProxy(dispatcher) {
+}
+
+PPB_TCPServerSocket_Private_Proxy::~PPB_TCPServerSocket_Private_Proxy() {
+}
+
+PP_Resource PPB_TCPServerSocket_Private_Proxy::CreateProxyResource(
+ PP_Instance instance) {
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
+ if (!dispatcher)
+ return 0;
+
+ TCPServerSocket* server_socket =
+ new TCPServerSocket(HostResource::MakeInstanceOnly(instance),
+ dispatcher->plugin_dispatcher_id());
+ return server_socket->GetReference();
+}
+
+void PPB_TCPServerSocket_Private_Proxy::ObjectDestroyed(uint32 socket_id) {
+ id_to_server_socket_.erase(socket_id);
+}
+
+bool PPB_TCPServerSocket_Private_Proxy::OnMessageReceived(
+ const IPC::Message& msg) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(PPB_TCPServerSocket_Private_Proxy, msg)
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPServerSocket_ListenACK, OnMsgListenACK)
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPServerSocket_AcceptACK, OnMsgAcceptACK)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+void PPB_TCPServerSocket_Private_Proxy::OnMsgListenACK(
+ uint32 plugin_dispatcher_id,
+ PP_Resource socket_resource,
+ uint32 socket_id,
+ int32_t status) {
+ EnterTCPServerSocket enter(socket_resource, true);
+ if (enter.succeeded()) {
+ PPB_TCPServerSocket_Shared* server_socket =
+ static_cast<PPB_TCPServerSocket_Shared*>(enter.object());
+ if (status == PP_OK)
+ id_to_server_socket_[socket_id] = server_socket;
+ server_socket->OnListenCompleted(socket_id, status);
+ } else if (socket_id != 0 && status == PP_OK) {
+ IPC::Message* msg =
+ new PpapiHostMsg_PPBTCPServerSocket_Destroy(socket_id);
+ PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser(msg);
+ }
+}
+
+void PPB_TCPServerSocket_Private_Proxy::OnMsgAcceptACK(
+ uint32 plugin_dispatcher_id,
+ uint32 server_socket_id,
+ uint32 accepted_socket_id,
+ const PP_NetAddress_Private& local_addr,
+ const PP_NetAddress_Private& remote_addr) {
+ IDToServerSocketMap::iterator it =
+ id_to_server_socket_.find(server_socket_id);
+ if (it != id_to_server_socket_.end()) {
+ bool succeeded = (accepted_socket_id != 0);
+ it->second->OnAcceptCompleted(succeeded,
+ accepted_socket_id,
+ local_addr,
+ remote_addr);
+ } else if (accepted_socket_id != 0) {
+ PluginGlobals::Get()->plugin_proxy_delegate()->SendToBrowser(
+ new PpapiHostMsg_PPBTCPSocket_Disconnect(accepted_socket_id));
+ }
+}
+
+} // namespace proxy
+} // namespace ppapi
diff --git a/ppapi/proxy/ppb_tcp_server_socket_private_proxy.h b/ppapi/proxy/ppb_tcp_server_socket_private_proxy.h
new file mode 100644
index 0000000..e2e644f
--- /dev/null
+++ b/ppapi/proxy/ppb_tcp_server_socket_private_proxy.h
@@ -0,0 +1,59 @@
+// 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.
+
+#ifndef PPAPI_PROXY_PPB_TCP_SERVER_SOCKET_PRIVATE_PROXY_H_
+#define PPAPI_PROXY_PPB_TCP_SERVER_SOCKET_PRIVATE_PROXY_H_
+
+#include <map>
+#include <string>
+
+#include "base/basictypes.h"
+#include "ppapi/c/pp_instance.h"
+#include "ppapi/c/pp_resource.h"
+#include "ppapi/c/private/ppb_net_address_private.h"
+#include "ppapi/proxy/interface_proxy.h"
+
+namespace ppapi {
+
+class PPB_TCPServerSocket_Shared;
+
+namespace proxy {
+
+class PPB_TCPServerSocket_Private_Proxy : public InterfaceProxy {
+ public:
+ explicit PPB_TCPServerSocket_Private_Proxy(Dispatcher* dispatcher);
+ virtual ~PPB_TCPServerSocket_Private_Proxy();
+
+ static PP_Resource CreateProxyResource(PP_Instance instance);
+
+ void ObjectDestroyed(uint32 socket_id);
+
+ // InterfaceProxy implementation.
+ virtual bool OnMessageReceived(const IPC::Message& msg);
+
+ static const ApiID kApiID = API_ID_PPB_TCPSERVERSOCKET_PRIVATE;
+
+ private:
+ typedef std::map<uint32, PPB_TCPServerSocket_Shared*>
+ IDToServerSocketMap;
+
+ void OnMsgListenACK(uint32 plugin_dispatcher_id,
+ PP_Resource socket_resource,
+ uint32 socket_id,
+ int32_t status);
+ void OnMsgAcceptACK(uint32 plugin_dispatcher_id,
+ uint32 server_socket_id,
+ uint32 accepted_socket_id,
+ const PP_NetAddress_Private& local_addr,
+ const PP_NetAddress_Private& remote_addr);
+
+ IDToServerSocketMap id_to_server_socket_;
+
+ DISALLOW_COPY_AND_ASSIGN(PPB_TCPServerSocket_Private_Proxy);
+};
+
+} // namespace proxy
+} // namespace ppapi
+
+#endif // PPAPI_PROXY_PPB_TCP_SERVER_SOCKET_PRIVATE_PROXY_H_
diff --git a/ppapi/proxy/ppb_tcp_socket_private_proxy.cc b/ppapi/proxy/ppb_tcp_socket_private_proxy.cc
index 7e92664..26cdfcf 100644
--- a/ppapi/proxy/ppb_tcp_socket_private_proxy.cc
+++ b/ppapi/proxy/ppb_tcp_socket_private_proxy.cc
@@ -26,7 +26,13 @@ IDToSocketMap* g_id_to_socket = NULL;
class TCPSocket : public TCPSocketPrivateImpl {
public:
+ // C-tor for new sockets.
TCPSocket(const HostResource& resource, uint32 socket_id);
+ // C-tor for already connected sockets.
+ TCPSocket(const HostResource& resource,
+ uint32 socket_id,
+ const PP_NetAddress_Private& local_addr,
+ const PP_NetAddress_Private& remote_addr);
virtual ~TCPSocket();
virtual void SendConnect(const std::string& host, uint16_t port) OVERRIDE;
@@ -52,6 +58,22 @@ TCPSocket::TCPSocket(const HostResource& resource, uint32 socket_id)
(*g_id_to_socket)[socket_id] = this;
}
+TCPSocket::TCPSocket(const HostResource& resource,
+ uint32 socket_id,
+ const PP_NetAddress_Private& local_addr,
+ const PP_NetAddress_Private& remote_addr)
+ : TCPSocketPrivateImpl(resource, socket_id) {
+ if (!g_id_to_socket)
+ g_id_to_socket = new IDToSocketMap();
+ DCHECK(g_id_to_socket->find(socket_id) == g_id_to_socket->end());
+
+ connection_state_ = CONNECTED;
+ local_addr_ = local_addr;
+ remote_addr_ = remote_addr;
+
+ (*g_id_to_socket)[socket_id] = this;
+}
+
TCPSocket::~TCPSocket() {
Disconnect();
}
@@ -121,6 +143,18 @@ PP_Resource PPB_TCPSocket_Private_Proxy::CreateProxyResource(
socket_id))->GetReference();
}
+// static
+PP_Resource PPB_TCPSocket_Private_Proxy::CreateProxyResourceForConnectedSocket(
+ PP_Instance instance,
+ uint32 socket_id,
+ const PP_NetAddress_Private& local_addr,
+ const PP_NetAddress_Private& remote_addr) {
+ return (new TCPSocket(HostResource::MakeInstanceOnly(instance),
+ socket_id,
+ local_addr,
+ remote_addr))->GetReference();
+}
+
bool PPB_TCPSocket_Private_Proxy::OnMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PPB_TCPSocket_Private_Proxy, msg)
diff --git a/ppapi/proxy/ppb_tcp_socket_private_proxy.h b/ppapi/proxy/ppb_tcp_socket_private_proxy.h
index 3e50b9f..a7b2e79 100644
--- a/ppapi/proxy/ppb_tcp_socket_private_proxy.h
+++ b/ppapi/proxy/ppb_tcp_socket_private_proxy.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// 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.
@@ -23,6 +23,11 @@ class PPB_TCPSocket_Private_Proxy : public InterfaceProxy {
virtual ~PPB_TCPSocket_Private_Proxy();
static PP_Resource CreateProxyResource(PP_Instance instance);
+ static PP_Resource CreateProxyResourceForConnectedSocket(
+ PP_Instance instance,
+ uint32 socket_id,
+ const PP_NetAddress_Private& local_addr,
+ const PP_NetAddress_Private& remote_addr);
// InterfaceProxy implementation.
virtual bool OnMessageReceived(const IPC::Message& msg);
diff --git a/ppapi/proxy/resource_creation_proxy.cc b/ppapi/proxy/resource_creation_proxy.cc
index 1f3b323..93112a8 100644
--- a/ppapi/proxy/resource_creation_proxy.cc
+++ b/ppapi/proxy/resource_creation_proxy.cc
@@ -25,6 +25,7 @@
#include "ppapi/proxy/ppb_graphics_3d_proxy.h"
#include "ppapi/proxy/ppb_host_resolver_private_proxy.h"
#include "ppapi/proxy/ppb_image_data_proxy.h"
+#include "ppapi/proxy/ppb_tcp_server_socket_private_proxy.h"
#include "ppapi/proxy/ppb_tcp_socket_private_proxy.h"
#include "ppapi/proxy/ppb_udp_socket_private_proxy.h"
#include "ppapi/proxy/ppb_url_loader_proxy.h"
@@ -286,8 +287,7 @@ PP_Resource ResourceCreationProxy::CreateScrollbar(PP_Instance instance,
#if !defined(OS_NACL)
PP_Resource ResourceCreationProxy::CreateTCPServerSocketPrivate(
PP_Instance instance) {
- // TODO (ygorshenin): implement this
- return 0;
+ return PPB_TCPServerSocket_Private_Proxy::CreateProxyResource(instance);
}
PP_Resource ResourceCreationProxy::CreateTCPSocketPrivate(
diff --git a/ppapi/shared_impl/api_id.h b/ppapi/shared_impl/api_id.h
index 325247f..baf92fa 100644
--- a/ppapi/shared_impl/api_id.h
+++ b/ppapi/shared_impl/api_id.h
@@ -41,6 +41,7 @@ enum ApiID {
API_ID_PPB_OPENGLES2,
API_ID_PPB_PDF,
API_ID_PPB_SURFACE_3D,
+ API_ID_PPB_TCPSERVERSOCKET_PRIVATE,
API_ID_PPB_TCPSOCKET_PRIVATE,
API_ID_PPB_TESTING,
API_ID_PPB_TEXT_INPUT,
diff --git a/ppapi/shared_impl/private/ppb_tcp_server_socket_shared.cc b/ppapi/shared_impl/private/ppb_tcp_server_socket_shared.cc
index 284db1e..c919bf2 100644
--- a/ppapi/shared_impl/private/ppb_tcp_server_socket_shared.cc
+++ b/ppapi/shared_impl/private/ppb_tcp_server_socket_shared.cc
@@ -13,8 +13,7 @@ namespace ppapi {
PPB_TCPServerSocket_Shared::PPB_TCPServerSocket_Shared(PP_Instance instance)
: Resource(OBJECT_IS_IMPL, instance),
- real_socket_id_(0),
- temp_socket_id_(GenerateTempSocketID()),
+ socket_id_(0),
state_(BEFORE_LISTENING),
tcp_socket_buffer_(NULL) {
}
@@ -22,8 +21,7 @@ PPB_TCPServerSocket_Shared::PPB_TCPServerSocket_Shared(PP_Instance instance)
PPB_TCPServerSocket_Shared::PPB_TCPServerSocket_Shared(
const HostResource& resource)
: Resource(OBJECT_IS_PROXY, resource),
- real_socket_id_(0),
- temp_socket_id_(GenerateTempSocketID()),
+ socket_id_(0),
state_(BEFORE_LISTENING),
tcp_socket_buffer_(NULL) {
}
@@ -50,7 +48,7 @@ int32_t PPB_TCPServerSocket_Shared::Listen(const PP_NetAddress_Private* addr,
listen_callback_ = new TrackedCallback(this, callback);
// Send the request, the browser will call us back via ListenACK
- SendListen(temp_socket_id_, *addr, backlog);
+ SendListen(*addr, backlog);
return PP_OK_COMPLETIONPENDING;
}
@@ -80,7 +78,7 @@ void PPB_TCPServerSocket_Shared::StopListening() {
state_ = CLOSED;
SendStopListening();
- real_socket_id_ = 0;
+ socket_id_ = 0;
if (listen_callback_.get())
listen_callback_->PostAbort();
@@ -89,7 +87,7 @@ void PPB_TCPServerSocket_Shared::StopListening() {
tcp_socket_buffer_ = NULL;
}
-void PPB_TCPServerSocket_Shared::OnListenCompleted(uint32 real_socket_id,
+void PPB_TCPServerSocket_Shared::OnListenCompleted(uint32 socket_id,
int32_t status) {
if (state_ != BEFORE_LISTENING ||
!TrackedCallback::IsPending(listen_callback_)) {
@@ -98,16 +96,11 @@ void PPB_TCPServerSocket_Shared::OnListenCompleted(uint32 real_socket_id,
}
if (status == PP_OK) {
- real_socket_id_ = real_socket_id;
+ socket_id_ = socket_id;
state_ = LISTENING;
}
TrackedCallback::ClearAndRun(&listen_callback_, status);
}
-uint32 PPB_TCPServerSocket_Shared::GenerateTempSocketID() {
- static uint32 socket_id = 0;
- return socket_id++;
-}
-
} // namespace ppapi
diff --git a/ppapi/shared_impl/private/ppb_tcp_server_socket_shared.h b/ppapi/shared_impl/private/ppb_tcp_server_socket_shared.h
index 15cbc03..6ce8044 100644
--- a/ppapi/shared_impl/private/ppb_tcp_server_socket_shared.h
+++ b/ppapi/shared_impl/private/ppb_tcp_server_socket_shared.h
@@ -40,16 +40,15 @@ class PPAPI_SHARED_EXPORT PPB_TCPServerSocket_Shared
PP_CompletionCallback callback) OVERRIDE;
virtual void StopListening() OVERRIDE;
- void OnListenCompleted(uint32 real_socket_id, int32_t status);
+ void OnListenCompleted(uint32 socket_id, int32_t status);
virtual void OnAcceptCompleted(bool succeeded,
- uint32 tcp_socket_id,
+ uint32 accepted_socket_id,
const PP_NetAddress_Private& local_addr,
const PP_NetAddress_Private& remote_addr) = 0;
// Send functions that need to be implemented differently for the
// proxied and non-proxied derived classes.
- virtual void SendListen(uint32 temp_socket_id,
- const PP_NetAddress_Private& addr,
+ virtual void SendListen(const PP_NetAddress_Private& addr,
int32_t backlog) = 0;
virtual void SendAccept() = 0;
virtual void SendStopListening() = 0;
@@ -65,10 +64,7 @@ class PPAPI_SHARED_EXPORT PPB_TCPServerSocket_Shared
CLOSED
};
- static uint32 GenerateTempSocketID();
-
- uint32 real_socket_id_;
- uint32 temp_socket_id_;
+ uint32 socket_id_;
State state_;
scoped_refptr<TrackedCallback> listen_callback_;
diff --git a/ppapi/thunk/interfaces_ppb_private.h b/ppapi/thunk/interfaces_ppb_private.h
index df93202..b19723a 100644
--- a/ppapi/thunk/interfaces_ppb_private.h
+++ b/ppapi/thunk/interfaces_ppb_private.h
@@ -9,6 +9,7 @@
PROXIED_API(PPB_Broker)
PROXIED_API(PPB_HostResolver_Private)
+PROXIED_API(PPB_TCPServerSocket_Private)
PROXIED_API(PPB_TCPSocket_Private)
PROXIED_API(PPB_UDPSocket_Private)
@@ -31,6 +32,9 @@ PROXIED_IFACE(NoAPIName, PPB_NETADDRESS_PRIVATE_INTERFACE_0_1,
PPB_NetAddress_Private_0_1)
PROXIED_IFACE(NoAPIName, PPB_NETADDRESS_PRIVATE_INTERFACE_1_0,
PPB_NetAddress_Private_1_0)
+PROXIED_IFACE(PPB_TCPServerSocket_Private,
+ PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE_0_1,
+ PPB_TCPServerSocket_Private_0_1)
PROXIED_IFACE(PPB_TCPSocket_Private, PPB_TCPSOCKET_PRIVATE_INTERFACE_0_3,
PPB_TCPSocket_Private_0_3)
PROXIED_IFACE(PPB_UDPSocket_Private, PPB_UDPSOCKET_PRIVATE_INTERFACE_0_2,
diff --git a/webkit/plugins/ppapi/mock_plugin_delegate.cc b/webkit/plugins/ppapi/mock_plugin_delegate.cc
index c30b845..5f98716 100644
--- a/webkit/plugins/ppapi/mock_plugin_delegate.cc
+++ b/webkit/plugins/ppapi/mock_plugin_delegate.cc
@@ -304,17 +304,17 @@ void MockPluginDelegate::UDPSocketClose(uint32 socket_id) {
}
void MockPluginDelegate::TCPServerSocketListen(
- PPB_TCPServerSocket_Private_Impl* socket,
- uint32 temp_socket_id,
+ PP_Resource socket_resource,
const PP_NetAddress_Private& addr,
int32_t backlog) {
}
-void MockPluginDelegate::TCPServerSocketAccept(uint32 real_socket_id) {
+void MockPluginDelegate::TCPServerSocketAccept(uint32 server_socket_id) {
}
-void MockPluginDelegate::TCPServerSocketStopListening(uint32 real_socket_id,
- uint32 temp_socket_id) {
+void MockPluginDelegate::TCPServerSocketStopListening(
+ PP_Resource socket_resource,
+ uint32 socket_id) {
}
void MockPluginDelegate::RegisterHostResolver(
diff --git a/webkit/plugins/ppapi/mock_plugin_delegate.h b/webkit/plugins/ppapi/mock_plugin_delegate.h
index 15c6311..8a376ea 100644
--- a/webkit/plugins/ppapi/mock_plugin_delegate.h
+++ b/webkit/plugins/ppapi/mock_plugin_delegate.h
@@ -136,13 +136,12 @@ class MockPluginDelegate : public PluginDelegate {
const std::string& buffer,
const PP_NetAddress_Private& addr);
virtual void UDPSocketClose(uint32 socket_id);
- virtual void TCPServerSocketListen(PPB_TCPServerSocket_Private_Impl* socket,
- uint32 temp_socket_id,
+ virtual void TCPServerSocketListen(PP_Resource socket_resource,
const PP_NetAddress_Private& addr,
int32_t backlog);
- virtual void TCPServerSocketAccept(uint32 real_socket_id);
- virtual void TCPServerSocketStopListening(uint32 real_socket_id,
- uint32 temp_socket_id);
+ virtual void TCPServerSocketAccept(uint32 server_socket_id);
+ virtual void TCPServerSocketStopListening(PP_Resource socket_resource,
+ uint32 socket_id);
virtual void RegisterHostResolver(
::ppapi::PPB_HostResolver_Shared* host_resolver,
uint32 host_resolver_id);
diff --git a/webkit/plugins/ppapi/plugin_delegate.h b/webkit/plugins/ppapi/plugin_delegate.h
index f357158..ab388cc 100644
--- a/webkit/plugins/ppapi/plugin_delegate.h
+++ b/webkit/plugins/ppapi/plugin_delegate.h
@@ -23,6 +23,7 @@
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/pp_instance.h"
+#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_stdint.h"
#include "ui/gfx/size.h"
#include "webkit/fileapi/file_system_types.h"
@@ -88,7 +89,6 @@ class PluginModule;
class PPB_Broker_Impl;
class PPB_Flash_Menu_Impl;
class PPB_Flash_NetConnector_Impl;
-class PPB_TCPServerSocket_Private_Impl;
class PPB_TCPSocket_Private_Impl;
class PPB_UDPSocket_Private_Impl;
@@ -481,13 +481,13 @@ class PluginDelegate {
virtual void UDPSocketClose(uint32 socket_id) = 0;
// For PPB_TCPServerSocket_Private.
- virtual void TCPServerSocketListen(PPB_TCPServerSocket_Private_Impl* socket,
- uint32 temp_socket_id,
+ virtual void TCPServerSocketListen(PP_Resource socket_resource,
const PP_NetAddress_Private& addr,
int32_t backlog) = 0;
- virtual void TCPServerSocketAccept(uint32 real_socket_id) = 0;
- virtual void TCPServerSocketStopListening(uint32 real_socket_id,
- uint32 temp_socket_id) = 0;
+ virtual void TCPServerSocketAccept(uint32 server_socket_id) = 0;
+ virtual void TCPServerSocketStopListening(
+ PP_Resource socket_resource,
+ uint32 socket_id) = 0;
// For PPB_HostResolver_Private.
virtual void RegisterHostResolver(
diff --git a/webkit/plugins/ppapi/plugin_module.cc b/webkit/plugins/ppapi/plugin_module.cc
index 77ba554..3d39f16 100644
--- a/webkit/plugins/ppapi/plugin_module.cc
+++ b/webkit/plugins/ppapi/plugin_module.cc
@@ -79,7 +79,6 @@
#include "ppapi/c/private/ppb_network_monitor_private.h"
#include "ppapi/c/private/ppb_pdf.h"
#include "ppapi/c/private/ppb_proxy_private.h"
-#include "ppapi/c/private/ppb_tcp_server_socket_private.h"
#include "ppapi/c/private/ppb_tcp_socket_private.h"
#include "ppapi/c/private/ppb_udp_socket_private.h"
#include "ppapi/c/private/ppb_uma_private.h"
@@ -359,8 +358,6 @@ const void* GetInterface(const char* name) {
return ::ppapi::PPB_OpenGLES2_Shared::GetChromiumMapSubInterface();
if (strcmp(name, PPB_PROXY_PRIVATE_INTERFACE) == 0)
return PPB_Proxy_Impl::GetInterface();
- if (strcmp(name, PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE) == 0)
- return ::ppapi::thunk::GetPPB_TCPServerSocket_Private_0_1_Thunk();
if (strcmp(name, PPB_UMA_PRIVATE_INTERFACE) == 0)
return PPB_UMA_Private_Impl::GetInterface();
if (strcmp(name, PPB_URLLOADERTRUSTED_INTERFACE_0_3) == 0)
diff --git a/webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.cc b/webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.cc
index 213b4bf..5f023ae 100644
--- a/webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.cc
+++ b/webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.cc
@@ -32,7 +32,7 @@ PP_Resource PPB_TCPServerSocket_Private_Impl::CreateResource(
void PPB_TCPServerSocket_Private_Impl::OnAcceptCompleted(
bool succeeded,
- uint32 tcp_socket_id,
+ uint32 accepted_socket_id,
const PP_NetAddress_Private& local_addr,
const PP_NetAddress_Private& remote_addr) {
if (!::ppapi::TrackedCallback::IsPending(accept_callback_) ||
@@ -44,7 +44,7 @@ void PPB_TCPServerSocket_Private_Impl::OnAcceptCompleted(
if (succeeded) {
*tcp_socket_buffer_ =
PPB_TCPSocket_Private_Impl::CreateConnectedSocket(pp_instance(),
- tcp_socket_id,
+ accepted_socket_id,
local_addr,
remote_addr);
}
@@ -55,14 +55,13 @@ void PPB_TCPServerSocket_Private_Impl::OnAcceptCompleted(
}
void PPB_TCPServerSocket_Private_Impl::SendListen(
- uint32 temp_socket_id,
const PP_NetAddress_Private& addr,
int32_t backlog) {
PluginDelegate* plugin_delegate = ResourceHelper::GetPluginDelegate(this);
if (!plugin_delegate)
return;
- plugin_delegate->TCPServerSocketListen(this, temp_socket_id, addr, backlog);
+ plugin_delegate->TCPServerSocketListen(pp_resource(), addr, backlog);
}
void PPB_TCPServerSocket_Private_Impl::SendAccept() {
@@ -70,7 +69,7 @@ void PPB_TCPServerSocket_Private_Impl::SendAccept() {
if (!plugin_delegate)
return;
- plugin_delegate->TCPServerSocketAccept(real_socket_id_);
+ plugin_delegate->TCPServerSocketAccept(socket_id_);
}
void PPB_TCPServerSocket_Private_Impl::SendStopListening() {
@@ -78,8 +77,7 @@ void PPB_TCPServerSocket_Private_Impl::SendStopListening() {
if (!plugin_delegate)
return;
- plugin_delegate->TCPServerSocketStopListening(real_socket_id_,
- temp_socket_id_);
+ plugin_delegate->TCPServerSocketStopListening(pp_resource(), socket_id_);
}
} // namespace ppapi
diff --git a/webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.h b/webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.h
index 6533e61..f621e1c 100644
--- a/webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.h
+++ b/webkit/plugins/ppapi/ppb_tcp_server_socket_private_impl.h
@@ -18,12 +18,11 @@ class PPB_TCPServerSocket_Private_Impl
virtual void OnAcceptCompleted(
bool succeeded,
- uint32 tcp_socket_id,
+ uint32 accepted_socket_id,
const PP_NetAddress_Private& local_addr,
const PP_NetAddress_Private& remote_addr) OVERRIDE;
- virtual void SendListen(uint32_t temp_socket_id,
- const PP_NetAddress_Private& addr,
+ virtual void SendListen(const PP_NetAddress_Private& addr,
int32_t backlog) OVERRIDE;
virtual void SendAccept() OVERRIDE;
virtual void SendStopListening() OVERRIDE;