diff options
author | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-13 06:48:36 +0000 |
---|---|---|
committer | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-13 06:48:36 +0000 |
commit | b1784f4dc9fbf104e4454796edf26d2f76e16a94 (patch) | |
tree | 476affcb92e4fa1e2f0772a935bc3f63f8164630 /ppapi/proxy | |
parent | b1c988bcd7869765e1bd56e592787af123340516 (diff) | |
download | chromium_src-b1784f4dc9fbf104e4454796edf26d2f76e16a94.zip chromium_src-b1784f4dc9fbf104e4454796edf26d2f76e16a94.tar.gz chromium_src-b1784f4dc9fbf104e4454796edf26d2f76e16a94.tar.bz2 |
Introduce PPB_TCPSocket_Dev.
This change exposes the PPB_TCPSocket_Dev interface and makes it to share the same backend as PPB_TCPSocket_Private.
It doesn't include:
- apps permission check;
- TCP socket options that PPB_TCPSocket_Private doesn't support.
These will be implemented in separate CLs.
BUG=247225
TEST=newly added test_tcp_socket.{h,cc}.
Review URL: https://chromiumcodereview.appspot.com/16667002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@206014 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/proxy')
-rw-r--r-- | ppapi/proxy/interface_list.cc | 2 | ||||
-rw-r--r-- | ppapi/proxy/ppb_tcp_socket_private_proxy.h | 2 | ||||
-rw-r--r-- | ppapi/proxy/ppb_tcp_socket_proxy.cc | 303 | ||||
-rw-r--r-- | ppapi/proxy/ppb_tcp_socket_proxy.h | 58 | ||||
-rw-r--r-- | ppapi/proxy/resource_creation_proxy.cc | 13 | ||||
-rw-r--r-- | ppapi/proxy/resource_creation_proxy.h | 4 |
6 files changed, 381 insertions, 1 deletions
diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc index 864de88..0a62aa1 100644 --- a/ppapi/proxy/interface_list.cc +++ b/ppapi/proxy/interface_list.cc @@ -22,6 +22,7 @@ #include "ppapi/c/dev/ppb_opengles2ext_dev.h" #include "ppapi/c/dev/ppb_printing_dev.h" #include "ppapi/c/dev/ppb_resource_array_dev.h" +#include "ppapi/c/dev/ppb_tcp_socket_dev.h" #include "ppapi/c/dev/ppb_testing_dev.h" #include "ppapi/c/dev/ppb_text_input_dev.h" #include "ppapi/c/dev/ppb_trace_event_dev.h" @@ -105,6 +106,7 @@ #include "ppapi/proxy/ppb_network_monitor_private_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_tcp_socket_proxy.h" #include "ppapi/proxy/ppb_testing_proxy.h" #include "ppapi/proxy/ppb_var_deprecated_proxy.h" #include "ppapi/proxy/ppb_video_decoder_proxy.h" diff --git a/ppapi/proxy/ppb_tcp_socket_private_proxy.h b/ppapi/proxy/ppb_tcp_socket_private_proxy.h index ffceca7..6f0f0f4 100644 --- a/ppapi/proxy/ppb_tcp_socket_private_proxy.h +++ b/ppapi/proxy/ppb_tcp_socket_private_proxy.h @@ -22,7 +22,7 @@ namespace proxy { class PPB_TCPSocket_Private_Proxy : public InterfaceProxy { public: - PPB_TCPSocket_Private_Proxy(Dispatcher* dispatcher); + explicit PPB_TCPSocket_Private_Proxy(Dispatcher* dispatcher); virtual ~PPB_TCPSocket_Private_Proxy(); static PP_Resource CreateProxyResource(PP_Instance instance); diff --git a/ppapi/proxy/ppb_tcp_socket_proxy.cc b/ppapi/proxy/ppb_tcp_socket_proxy.cc new file mode 100644 index 0000000..1b6bd8a --- /dev/null +++ b/ppapi/proxy/ppb_tcp_socket_proxy.cc @@ -0,0 +1,303 @@ +// Copyright 2013 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_socket_proxy.h" + +#include <map> + +#include "base/logging.h" +#include "ppapi/proxy/plugin_dispatcher.h" +#include "ppapi/proxy/plugin_globals.h" +#include "ppapi/proxy/ppapi_messages.h" +#include "ppapi/shared_impl/resource.h" +#include "ppapi/shared_impl/tcp_socket_shared.h" +#include "ppapi/thunk/enter.h" +#include "ppapi/thunk/ppb_net_address_api.h" +#include "ppapi/thunk/ppb_tcp_socket_api.h" +#include "ppapi/thunk/thunk.h" + +namespace ppapi { +namespace proxy { + +namespace { + +typedef thunk::EnterResourceNoLock<thunk::PPB_NetAddress_API> + EnterNetAddressNoLock; + +typedef std::map<uint32, TCPSocketShared*> IDToSocketMap; +IDToSocketMap* g_id_to_socket = NULL; + +class TCPSocket : public thunk::PPB_TCPSocket_API, + public Resource, + public TCPSocketShared { + public: + TCPSocket(const HostResource& resource, uint32 socket_id); + virtual ~TCPSocket(); + + // Resource overrides. + virtual thunk::PPB_TCPSocket_API* AsPPB_TCPSocket_API() OVERRIDE; + + // thunk::PPB_TCPSocket_API implementation. + virtual int32_t Connect(PP_Resource addr, + scoped_refptr<TrackedCallback> callback) OVERRIDE; + virtual PP_Resource GetLocalAddress() OVERRIDE; + virtual PP_Resource GetRemoteAddress() OVERRIDE; + virtual int32_t Read(char* buffer, + int32_t bytes_to_read, + scoped_refptr<TrackedCallback> callback) OVERRIDE; + virtual int32_t Write(const char* buffer, + int32_t bytes_to_write, + scoped_refptr<TrackedCallback> callback) OVERRIDE; + virtual void Close() OVERRIDE; + virtual int32_t SetOption(PP_TCPSocket_Option_Dev name, + const PP_Var& value, + scoped_refptr<TrackedCallback> callback) OVERRIDE; + + // TCPSocketShared implementation. + virtual void SendConnect(const std::string& host, uint16_t port) OVERRIDE; + virtual void SendConnectWithNetAddress( + const PP_NetAddress_Private& addr) OVERRIDE; + virtual void SendSSLHandshake( + const std::string& server_name, + uint16_t server_port, + const std::vector<std::vector<char> >& trusted_certs, + const std::vector<std::vector<char> >& untrusted_certs) OVERRIDE; + virtual void SendRead(int32_t bytes_to_read) OVERRIDE; + virtual void SendWrite(const std::string& buffer) OVERRIDE; + virtual void SendDisconnect() OVERRIDE; + virtual void SendSetBoolOption(PP_TCPSocketOption_Private name, + bool value) OVERRIDE; + virtual Resource* GetOwnerResource() OVERRIDE; + + private: + void SendToBrowser(IPC::Message* msg); + + DISALLOW_COPY_AND_ASSIGN(TCPSocket); +}; + +TCPSocket::TCPSocket(const HostResource& resource, uint32 socket_id) + : Resource(OBJECT_IS_PROXY, resource), + TCPSocketShared(OBJECT_IS_PROXY, 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()); + (*g_id_to_socket)[socket_id] = this; +} + +TCPSocket::~TCPSocket() { + DisconnectImpl(); +} + +thunk::PPB_TCPSocket_API* TCPSocket::AsPPB_TCPSocket_API() { + return this; +} + +int32_t TCPSocket::Connect(PP_Resource addr, + scoped_refptr<TrackedCallback> callback) { + EnterNetAddressNoLock enter(addr, true); + if (enter.failed()) + return PP_ERROR_BADARGUMENT; + + return ConnectWithNetAddressImpl(&enter.object()->GetNetAddressPrivate(), + callback); +} + +PP_Resource TCPSocket::GetLocalAddress() { + PP_NetAddress_Private addr_private; + if (!GetLocalAddressImpl(&addr_private)) + return 0; + + thunk::EnterResourceCreationNoLock enter(pp_instance()); + if (enter.failed()) + return 0; + return enter.functions()->CreateNetAddressFromNetAddressPrivate( + pp_instance(), addr_private); +} + +PP_Resource TCPSocket::GetRemoteAddress() { + PP_NetAddress_Private addr_private; + if (!GetRemoteAddressImpl(&addr_private)) + return 0; + + thunk::EnterResourceCreationNoLock enter(pp_instance()); + if (enter.failed()) + return 0; + return enter.functions()->CreateNetAddressFromNetAddressPrivate( + pp_instance(), addr_private); +} + +int32_t TCPSocket::Read(char* buffer, + int32_t bytes_to_read, + scoped_refptr<TrackedCallback> callback) { + return ReadImpl(buffer, bytes_to_read, callback); +} + +int32_t TCPSocket::Write(const char* buffer, + int32_t bytes_to_write, + scoped_refptr<TrackedCallback> callback) { + return WriteImpl(buffer, bytes_to_write, callback); +} + +void TCPSocket::Close() { + DisconnectImpl(); +} + +int32_t TCPSocket::SetOption(PP_TCPSocket_Option_Dev name, + const PP_Var& value, + scoped_refptr<TrackedCallback> callback) { + // TODO(yzshen): Add support for other options. + if (name == PP_TCPSOCKET_OPTION_NO_DELAY) + return SetOptionImpl(PP_TCPSOCKETOPTION_NO_DELAY, value, callback); + + return PP_ERROR_NOTSUPPORTED; +} + +void TCPSocket::SendConnect(const std::string& host, uint16_t port) { + NOTREACHED(); +} + +void TCPSocket::SendConnectWithNetAddress(const PP_NetAddress_Private& addr) { + SendToBrowser(new PpapiHostMsg_PPBTCPSocket_ConnectWithNetAddress( + API_ID_PPB_TCPSOCKET, socket_id_, addr)); +} + +void TCPSocket::SendSSLHandshake( + const std::string& server_name, + uint16_t server_port, + const std::vector<std::vector<char> >& trusted_certs, + const std::vector<std::vector<char> >& untrusted_certs) { + NOTREACHED(); +} + +void TCPSocket::SendRead(int32_t bytes_to_read) { + SendToBrowser(new PpapiHostMsg_PPBTCPSocket_Read(socket_id_, bytes_to_read)); +} + +void TCPSocket::SendWrite(const std::string& buffer) { + SendToBrowser(new PpapiHostMsg_PPBTCPSocket_Write(socket_id_, buffer)); +} + +void TCPSocket::SendDisconnect() { + // After removed from the mapping, this object won't receive any notifications + // from the proxy. + DCHECK(g_id_to_socket->find(socket_id_) != g_id_to_socket->end()); + g_id_to_socket->erase(socket_id_); + SendToBrowser(new PpapiHostMsg_PPBTCPSocket_Disconnect(socket_id_)); +} + +void TCPSocket::SendSetBoolOption(PP_TCPSocketOption_Private name, bool value) { + SendToBrowser( + new PpapiHostMsg_PPBTCPSocket_SetBoolOption(socket_id_, name, value)); +} + +Resource* TCPSocket::GetOwnerResource() { + return this; +} + +void TCPSocket::SendToBrowser(IPC::Message* msg) { + PluginGlobals::Get()->GetBrowserSender()->Send(msg); +} + +} // namespace + +//------------------------------------------------------------------------------ + +PPB_TCPSocket_Proxy::PPB_TCPSocket_Proxy(Dispatcher* dispatcher) + : InterfaceProxy(dispatcher) { +} + +PPB_TCPSocket_Proxy::~PPB_TCPSocket_Proxy() { +} + +// static +PP_Resource PPB_TCPSocket_Proxy::CreateProxyResource(PP_Instance instance) { + PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); + if (!dispatcher) + return 0; + + uint32 socket_id = 0; + PluginGlobals::Get()->GetBrowserSender()->Send( + new PpapiHostMsg_PPBTCPSocket_Create( + API_ID_PPB_TCPSOCKET, dispatcher->plugin_dispatcher_id(), + &socket_id)); + if (socket_id == 0) + return 0; + return (new TCPSocket(HostResource::MakeInstanceOnly(instance), + socket_id))->GetReference(); +} + +bool PPB_TCPSocket_Proxy::OnMessageReceived(const IPC::Message& msg) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(PPB_TCPSocket_Proxy, msg) + IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ConnectACK, + OnMsgConnectACK) + IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_ReadACK, OnMsgReadACK) + IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_WriteACK, OnMsgWriteACK) + IPC_MESSAGE_HANDLER(PpapiMsg_PPBTCPSocket_SetBoolOptionACK, + OnMsgSetBoolOptionACK) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +void PPB_TCPSocket_Proxy::OnMsgConnectACK( + uint32 /* plugin_dispatcher_id */, + uint32 socket_id, + bool succeeded, + const PP_NetAddress_Private& local_addr, + const PP_NetAddress_Private& remote_addr) { + if (!g_id_to_socket) { + NOTREACHED(); + return; + } + IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id); + if (iter == g_id_to_socket->end()) + return; + iter->second->OnConnectCompleted(succeeded, local_addr, remote_addr); +} + +void PPB_TCPSocket_Proxy::OnMsgReadACK(uint32 /* plugin_dispatcher_id */, + uint32 socket_id, + bool succeeded, + const std::string& data) { + if (!g_id_to_socket) { + NOTREACHED(); + return; + } + IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id); + if (iter == g_id_to_socket->end()) + return; + iter->second->OnReadCompleted(succeeded, data); +} + +void PPB_TCPSocket_Proxy::OnMsgWriteACK(uint32 /* plugin_dispatcher_id */, + uint32 socket_id, + bool succeeded, + int32_t bytes_written) { + if (!g_id_to_socket) { + NOTREACHED(); + return; + } + IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id); + if (iter == g_id_to_socket->end()) + return; + iter->second->OnWriteCompleted(succeeded, bytes_written); +} + +void PPB_TCPSocket_Proxy::OnMsgSetBoolOptionACK( + uint32 /* plugin_dispatcher_id */, + uint32 socket_id, + bool succeeded) { + if (!g_id_to_socket) { + NOTREACHED(); + return; + } + IDToSocketMap::iterator iter = g_id_to_socket->find(socket_id); + if (iter == g_id_to_socket->end()) + return; + iter->second->OnSetOptionCompleted(succeeded); +} + +} // namespace proxy +} // namespace ppapi diff --git a/ppapi/proxy/ppb_tcp_socket_proxy.h b/ppapi/proxy/ppb_tcp_socket_proxy.h new file mode 100644 index 0000000..35314a3 --- /dev/null +++ b/ppapi/proxy/ppb_tcp_socket_proxy.h @@ -0,0 +1,58 @@ +// Copyright 2013 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_SOCKET_PROXY_H_ +#define PPAPI_PROXY_PPB_TCP_SOCKET_PROXY_H_ + +#include <string> + +#include "base/basictypes.h" +#include "ppapi/c/pp_instance.h" +#include "ppapi/c/pp_resource.h" +#include "ppapi/proxy/interface_proxy.h" +#include "ppapi/proxy/ppapi_proxy_export.h" + +struct PP_NetAddress_Private; + +namespace ppapi { +namespace proxy { + +class PPB_TCPSocket_Proxy : public InterfaceProxy { + public: + explicit PPB_TCPSocket_Proxy(Dispatcher* dispatcher); + virtual ~PPB_TCPSocket_Proxy(); + + static PP_Resource CreateProxyResource(PP_Instance instance); + + // InterfaceProxy implementation. + virtual bool OnMessageReceived(const IPC::Message& msg); + + static const ApiID kApiID = API_ID_PPB_TCPSOCKET; + + private: + // Browser->plugin message handlers. + void OnMsgConnectACK(uint32 plugin_dispatcher_id, + uint32 socket_id, + bool succeeded, + const PP_NetAddress_Private& local_addr, + const PP_NetAddress_Private& remote_addr); + void OnMsgReadACK(uint32 plugin_dispatcher_id, + uint32 socket_id, + bool succeeded, + const std::string& data); + void OnMsgWriteACK(uint32 plugin_dispatcher_id, + uint32 socket_id, + bool succeeded, + int32_t bytes_written); + void OnMsgSetBoolOptionACK(uint32 plugin_dispatcher_id, + uint32 socket_id, + bool succeeded); + + DISALLOW_COPY_AND_ASSIGN(PPB_TCPSocket_Proxy); +}; + +} // namespace proxy +} // namespace ppapi + +#endif // PPAPI_PROXY_PPB_TCP_SOCKET_PROXY_H_ diff --git a/ppapi/proxy/resource_creation_proxy.cc b/ppapi/proxy/resource_creation_proxy.cc index 3448ce7..a9300cce 100644 --- a/ppapi/proxy/resource_creation_proxy.cc +++ b/ppapi/proxy/resource_creation_proxy.cc @@ -33,6 +33,7 @@ #include "ppapi/proxy/ppb_network_monitor_private_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_tcp_socket_proxy.h" #include "ppapi/proxy/ppb_video_decoder_proxy.h" #include "ppapi/proxy/ppb_x509_certificate_private_proxy.h" #include "ppapi/proxy/printing_resource.h" @@ -278,6 +279,13 @@ PP_Resource ResourceCreationProxy::CreateNetAddressFromIPv6Address( *ipv6_addr))->GetReference(); } +PP_Resource ResourceCreationProxy::CreateNetAddressFromNetAddressPrivate( + PP_Instance instance, + const PP_NetAddress_Private& private_addr) { + return (new NetAddressResource(GetConnection(), instance, + private_addr))->GetReference(); +} + PP_Resource ResourceCreationProxy::CreateNetworkMonitor( PP_Instance instance, PPB_NetworkMonitor_Callback callback, @@ -295,6 +303,11 @@ PP_Resource ResourceCreationProxy::CreateTCPServerSocketPrivate( return PPB_TCPServerSocket_Private_Proxy::CreateProxyResource(instance); } +PP_Resource ResourceCreationProxy::CreateTCPSocket( + PP_Instance instance) { + return PPB_TCPSocket_Proxy::CreateProxyResource(instance); +} + PP_Resource ResourceCreationProxy::CreateTCPSocketPrivate( PP_Instance instance) { return PPB_TCPSocket_Private_Proxy::CreateProxyResource(instance); diff --git a/ppapi/proxy/resource_creation_proxy.h b/ppapi/proxy/resource_creation_proxy.h index 3dd514d..d00a8bd 100644 --- a/ppapi/proxy/resource_creation_proxy.h +++ b/ppapi/proxy/resource_creation_proxy.h @@ -128,6 +128,9 @@ class ResourceCreationProxy : public InterfaceProxy, virtual PP_Resource CreateNetAddressFromIPv6Address( PP_Instance instance, const PP_NetAddress_IPv6_Dev* ipv6_addr) OVERRIDE; + virtual PP_Resource CreateNetAddressFromNetAddressPrivate( + PP_Instance instance, + const PP_NetAddress_Private& private_addr) OVERRIDE; virtual PP_Resource CreateNetworkMonitor( PP_Instance instance, PPB_NetworkMonitor_Callback callback, @@ -135,6 +138,7 @@ class ResourceCreationProxy : public InterfaceProxy, virtual PP_Resource CreatePrinting(PP_Instance) OVERRIDE; virtual PP_Resource CreateTCPServerSocketPrivate( PP_Instance instance) OVERRIDE; + virtual PP_Resource CreateTCPSocket(PP_Instance instance) OVERRIDE; virtual PP_Resource CreateTCPSocketPrivate(PP_Instance instance) OVERRIDE; virtual PP_Resource CreateUDPSocketPrivate(PP_Instance instance) OVERRIDE; virtual PP_Resource CreateWebSocket(PP_Instance instance) OVERRIDE; |