diff options
Diffstat (limited to 'content')
-rw-r--r-- | content/browser/renderer_host/pepper_message_filter.cc | 538 | ||||
-rw-r--r-- | content/browser/renderer_host/pepper_message_filter.h | 5 | ||||
-rw-r--r-- | content/common/pepper_messages.cc | 35 | ||||
-rw-r--r-- | content/common/pepper_messages.h | 20 | ||||
-rw-r--r-- | content/ppapi_plugin/ppapi_thread.cc | 44 | ||||
-rw-r--r-- | content/ppapi_plugin/ppapi_thread.h | 10 |
6 files changed, 95 insertions, 557 deletions
diff --git a/content/browser/renderer_host/pepper_message_filter.cc b/content/browser/renderer_host/pepper_message_filter.cc index 55ec1f9..46d0095 100644 --- a/content/browser/renderer_host/pepper_message_filter.cc +++ b/content/browser/renderer_host/pepper_message_filter.cc @@ -4,17 +4,8 @@ #include "content/browser/renderer_host/pepper_message_filter.h" -#include <string.h> - -#include <limits> -#include <string> - #include "base/basictypes.h" #include "base/bind.h" -#include "base/compiler_specific.h" -#include "base/memory/linked_ptr.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" #include "base/process_util.h" #include "base/threading/worker_pool.h" #include "base/values.h" @@ -24,497 +15,40 @@ #include "content/browser/resource_context.h" #include "content/common/pepper_messages.h" #include "net/base/address_list.h" -#include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" #include "net/base/host_port_pair.h" #include "net/base/host_resolver.h" -#include "net/base/io_buffer.h" #include "net/base/single_request_host_resolver.h" -#include "net/base/sys_addrinfo.h" -#include "net/socket/tcp_client_socket.h" #include "net/url_request/url_request_context.h" #include "ppapi/c/private/ppb_flash_net_connector.h" #include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/proxy/ppb_flash_tcp_socket_proxy.h" #include "webkit/plugins/ppapi/ppb_flash_net_connector_impl.h" #if defined(ENABLE_FLAPPER_HACKS) +#include <netdb.h> +#include <string.h> +#include <sys/socket.h> #include <sys/types.h> #include <unistd.h> -#endif // ENABLE_FLAPPER_HACKS - -namespace { - -bool ValidateNetAddress(const PP_Flash_NetAddress& addr) { - if (addr.size < sizeof(reinterpret_cast<sockaddr*>(0)->sa_family)) - return false; - - // TODO(viettrungluu): more careful validation? - // Just do a size check for AF_INET. - if (reinterpret_cast<const sockaddr*>(addr.data)->sa_family == AF_INET && - addr.size >= sizeof(sockaddr_in)) - return true; - - // Ditto for AF_INET6. - if (reinterpret_cast<const sockaddr*>(addr.data)->sa_family == AF_INET6 && - addr.size >= sizeof(sockaddr_in6)) - return true; - - // Reject everything else. - return false; -} - -bool SockaddrToNetAddress(const sockaddr* sa, - socklen_t sa_length, - PP_Flash_NetAddress* net_addr) { - if (!sa || sa_length <= 0 || !net_addr) - return false; - - CHECK_LE(static_cast<uint32_t>(sa_length), sizeof(net_addr->data)); - net_addr->size = sa_length; - memcpy(net_addr->data, sa, net_addr->size); - return true; -} - -bool IPEndPointToNetAddress(const net::IPEndPoint& ip, - PP_Flash_NetAddress* net_addr) { - sockaddr_storage storage = { 0 }; - size_t length = sizeof(storage); - - return ip.ToSockAddr(reinterpret_cast<sockaddr*>(&storage), &length) && - SockaddrToNetAddress(reinterpret_cast<const sockaddr*>(&storage), - length, net_addr); -} - -// Converts the first address to a PP_Flash_NetAddress. -bool AddressListToNetAddress(const net::AddressList& address_list, - PP_Flash_NetAddress* net_addr) { - const addrinfo* head = address_list.head(); - return head && - SockaddrToNetAddress(head->ai_addr, head->ai_addrlen, net_addr); -} - -bool NetAddressToAddressList(const PP_Flash_NetAddress& net_addr, - net::AddressList* address_list) { - if (!address_list || !ValidateNetAddress(net_addr)) - return false; - - net::IPEndPoint ip_end_point; - if (!ip_end_point.FromSockAddr( - reinterpret_cast<const sockaddr*>(net_addr.data), net_addr.size)) { - return false; - } - *address_list = net::AddressList::CreateFromIPAddress(ip_end_point.address(), - ip_end_point.port()); - return true; -} - -} // namespace // Make sure the storage in |PP_Flash_NetAddress| is big enough. (Do it here // since the data is opaque elsewhere.) COMPILE_ASSERT(sizeof(reinterpret_cast<PP_Flash_NetAddress*>(0)->data) >= sizeof(sockaddr_storage), PP_Flash_NetAddress_data_too_small); +#endif // ENABLE_FLAPPER_HACKS const PP_Flash_NetAddress kInvalidNetAddress = { 0 }; -class PepperMessageFilter::FlashTCPSocket { - public: - FlashTCPSocket(PepperMessageFilter* pepper_message_filter, - int32 routing_id, - uint32 plugin_dispatcher_id, - uint32 socket_id); - ~FlashTCPSocket(); - - void Connect(const std::string& host, uint16_t port); - void ConnectWithNetAddress(const PP_Flash_NetAddress& net_addr); - void Read(int32 bytes_to_read); - void Write(const std::string& data); - - private: - void StartConnect(const net::AddressList& addresses); - - void SendConnectACKError(); - void SendReadACKError(); - void SendWriteACKError(); - - void OnResolveCompleted(int result); - void OnConnectCompleted(int result); - void OnReadCompleted(int result); - void OnWriteCompleted(int result); - - PepperMessageFilter* pepper_message_filter_; - int32 routing_id_; - uint32 plugin_dispatcher_id_; - uint32 socket_id_; - - bool connect_in_progress_; - bool connected_; - bool end_of_file_reached_; - - net::CompletionCallbackImpl<FlashTCPSocket> resolve_callback_; - net::CompletionCallbackImpl<FlashTCPSocket> connect_callback_; - net::CompletionCallbackImpl<FlashTCPSocket> read_callback_; - net::CompletionCallbackImpl<FlashTCPSocket> write_callback_; - - scoped_ptr<net::SingleRequestHostResolver> resolver_; - net::AddressList address_list_; - - scoped_ptr<net::StreamSocket> socket_; - - scoped_refptr<net::IOBuffer> read_buffer_; - scoped_refptr<net::IOBuffer> write_buffer_; - - DISALLOW_COPY_AND_ASSIGN(FlashTCPSocket); -}; - -PepperMessageFilter::FlashTCPSocket::FlashTCPSocket( - PepperMessageFilter* pepper_message_filter, - int32 routing_id, - uint32 plugin_dispatcher_id, - uint32 socket_id) - : pepper_message_filter_(pepper_message_filter), - routing_id_(routing_id), - plugin_dispatcher_id_(plugin_dispatcher_id), - socket_id_(socket_id), - connect_in_progress_(false), - connected_(false), - end_of_file_reached_(false), - ALLOW_THIS_IN_INITIALIZER_LIST( - resolve_callback_(this, &FlashTCPSocket::OnResolveCompleted)), - ALLOW_THIS_IN_INITIALIZER_LIST( - connect_callback_(this, &FlashTCPSocket::OnConnectCompleted)), - ALLOW_THIS_IN_INITIALIZER_LIST( - read_callback_(this, &FlashTCPSocket::OnReadCompleted)), - ALLOW_THIS_IN_INITIALIZER_LIST( - write_callback_(this, &FlashTCPSocket::OnWriteCompleted)) { - DCHECK(pepper_message_filter); -} - -PepperMessageFilter::FlashTCPSocket::~FlashTCPSocket() { - // Make sure no further callbacks from socket_. - if (socket_.get()) - socket_->Disconnect(); -} - -void PepperMessageFilter::FlashTCPSocket::Connect(const std::string& host, - uint16_t port) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - - if (connect_in_progress_ || connected_) { - SendConnectACKError(); - return; - } - - connect_in_progress_ = true; - net::HostResolver::RequestInfo request_info(net::HostPortPair(host, port)); - resolver_.reset(new net::SingleRequestHostResolver( - pepper_message_filter_->GetHostResolver())); - int result = resolver_->Resolve(request_info, &address_list_, - &resolve_callback_, net::BoundNetLog()); - if (result != net::ERR_IO_PENDING) - OnResolveCompleted(result); -} - -void PepperMessageFilter::FlashTCPSocket::ConnectWithNetAddress( - const PP_Flash_NetAddress& net_addr) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - - if (connect_in_progress_ || connected_ || - !NetAddressToAddressList(net_addr, &address_list_)) { - SendConnectACKError(); - return; - } - - connect_in_progress_ = true; - StartConnect(address_list_); -} - -void PepperMessageFilter::FlashTCPSocket::Read(int32 bytes_to_read) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - - if (!connected_ || end_of_file_reached_ || read_buffer_.get() || - bytes_to_read <= 0) { - SendReadACKError(); - return; - } - - if (bytes_to_read > pp::proxy::kFlashTCPSocketMaxReadSize) { - NOTREACHED(); - bytes_to_read = pp::proxy::kFlashTCPSocketMaxReadSize; - } - - read_buffer_ = new net::IOBuffer(bytes_to_read); - int result = socket_->Read(read_buffer_, bytes_to_read, &read_callback_); - if (result != net::ERR_IO_PENDING) - OnReadCompleted(result); -} - -void PepperMessageFilter::FlashTCPSocket::Write(const std::string& data) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - - if (!connected_ || write_buffer_.get() || data.empty()) { - SendWriteACKError(); - return; - } - - int data_size = data.size(); - if (data_size > pp::proxy::kFlashTCPSocketMaxWriteSize) { - NOTREACHED(); - data_size = pp::proxy::kFlashTCPSocketMaxWriteSize; - } - - write_buffer_ = new net::IOBuffer(data_size); - memcpy(write_buffer_->data(), data.c_str(), data_size); - int result = socket_->Write(write_buffer_, data.size(), &write_callback_); - if (result != net::ERR_IO_PENDING) - OnWriteCompleted(result); -} - -void PepperMessageFilter::FlashTCPSocket::StartConnect( - const net::AddressList& addresses) { - DCHECK(connect_in_progress_); - - socket_.reset( - new net::TCPClientSocket(addresses, NULL, net::NetLog::Source())); - int result = socket_->Connect(&connect_callback_); - if (result != net::ERR_IO_PENDING) - OnConnectCompleted(result); -} - -void PepperMessageFilter::FlashTCPSocket::SendConnectACKError() { - pepper_message_filter_->Send( - new PpapiMsg_PPBFlashTCPSocket_ConnectACK( - routing_id_, plugin_dispatcher_id_, socket_id_, false, - kInvalidNetAddress, kInvalidNetAddress)); -} - -void PepperMessageFilter::FlashTCPSocket::SendReadACKError() { - pepper_message_filter_->Send( - new PpapiMsg_PPBFlashTCPSocket_ReadACK( - routing_id_, plugin_dispatcher_id_, socket_id_, false, - std::string())); -} - -void PepperMessageFilter::FlashTCPSocket::SendWriteACKError() { - pepper_message_filter_->Send( - new PpapiMsg_PPBFlashTCPSocket_WriteACK( - routing_id_, plugin_dispatcher_id_, socket_id_, false, 0)); -} - -void PepperMessageFilter::FlashTCPSocket::OnResolveCompleted(int result) { - DCHECK(connect_in_progress_); - - if (result != net::OK) { - SendConnectACKError(); - connect_in_progress_ = false; - return; - } - - StartConnect(address_list_); -} - -void PepperMessageFilter::FlashTCPSocket::OnConnectCompleted(int result) { - DCHECK(connect_in_progress_ && socket_.get()); - - if (result != net::OK) { - SendConnectACKError(); - } else { - net::IPEndPoint ip_end_point; - net::AddressList address_list; - PP_Flash_NetAddress local_addr = kInvalidNetAddress; - PP_Flash_NetAddress remote_addr = kInvalidNetAddress; - - if (socket_->GetLocalAddress(&ip_end_point) != net::OK || - !IPEndPointToNetAddress(ip_end_point, &local_addr) || - socket_->GetPeerAddress(&address_list) != net::OK || - !AddressListToNetAddress(address_list, &remote_addr)) { - SendConnectACKError(); - } else { - pepper_message_filter_->Send( - new PpapiMsg_PPBFlashTCPSocket_ConnectACK( - routing_id_, plugin_dispatcher_id_, socket_id_, true, - local_addr, remote_addr)); - connected_ = true; - } - } - connect_in_progress_ = false; -} - -void PepperMessageFilter::FlashTCPSocket::OnReadCompleted(int result) { - DCHECK(read_buffer_.get()); - - if (result > 0) { - pepper_message_filter_->Send( - new PpapiMsg_PPBFlashTCPSocket_ReadACK( - routing_id_, plugin_dispatcher_id_, socket_id_, true, - std::string(read_buffer_->data(), result))); - } else if (result == 0) { - end_of_file_reached_ = true; - pepper_message_filter_->Send( - new PpapiMsg_PPBFlashTCPSocket_ReadACK( - routing_id_, plugin_dispatcher_id_, socket_id_, true, - std::string())); - } else { - SendReadACKError(); - } - read_buffer_ = NULL; -} - -void PepperMessageFilter::FlashTCPSocket::OnWriteCompleted(int result) { - DCHECK(write_buffer_.get()); - - if (result >= 0) { - pepper_message_filter_->Send( - new PpapiMsg_PPBFlashTCPSocket_WriteACK( - routing_id_, plugin_dispatcher_id_, socket_id_, true, result)); - } else { - SendWriteACKError(); - } - write_buffer_ = NULL; -} - -// FlashTCPSocketManager manages the mapping from socket IDs to FlashTCPSocket -// instances. -class PepperMessageFilter::FlashTCPSocketManager { - public: - explicit FlashTCPSocketManager(PepperMessageFilter* pepper_message_filter); - - void OnMsgCreate(int32 routing_id, - uint32 plugin_dispatcher_id, - uint32* socket_id); - void OnMsgConnect(uint32 socket_id, - const std::string& host, - uint16_t port); - void OnMsgConnectWithNetAddress(uint32 socket_id, - const PP_Flash_NetAddress& net_addr); - void OnMsgRead(uint32 socket_id, int32_t bytes_to_read); - void OnMsgWrite(uint32 socket_id, const std::string& data); - void OnMsgDisconnect(uint32 socket_id); - - private: - typedef std::map<uint32, linked_ptr<FlashTCPSocket> > SocketMap; - SocketMap sockets_; - - uint32 next_socket_id_; - - PepperMessageFilter* pepper_message_filter_; - DISALLOW_COPY_AND_ASSIGN(FlashTCPSocketManager); -}; - -PepperMessageFilter::FlashTCPSocketManager::FlashTCPSocketManager( - PepperMessageFilter* pepper_message_filter) - : next_socket_id_(1), - pepper_message_filter_(pepper_message_filter) { - DCHECK(pepper_message_filter); -} - -void PepperMessageFilter::FlashTCPSocketManager::OnMsgCreate( - int32 routing_id, - uint32 plugin_dispatcher_id, - uint32* socket_id) { - // Generate a socket ID. For each process which sends us socket requests, IDs - // of living sockets must be unique. - // - // However, it is safe to generate IDs based on the internal state of a single - // FlashTCPSocketManager object, because for each plugin or renderer process, - // there is at most one PepperMessageFilter (in other words, at most one - // FlashTCPSocketManager) talking to it. - - DCHECK(socket_id); - if (sockets_.size() >= std::numeric_limits<uint32>::max()) { - // All valid IDs are being used. - *socket_id = 0; - return; - } - do { - // Although it is unlikely, make sure that we won't cause any trouble when - // the counter overflows. - *socket_id = next_socket_id_++; - } while (*socket_id == 0 || - sockets_.find(*socket_id) != sockets_.end()); - sockets_[*socket_id] = linked_ptr<FlashTCPSocket>( - new FlashTCPSocket(pepper_message_filter_, routing_id, - plugin_dispatcher_id, *socket_id)); -} - -void PepperMessageFilter::FlashTCPSocketManager::OnMsgConnect( - uint32 socket_id, - const std::string& host, - uint16_t port) { - SocketMap::iterator iter = sockets_.find(socket_id); - if (iter == sockets_.end()) { - NOTREACHED(); - return; - } - - iter->second->Connect(host, port); -} - -void PepperMessageFilter::FlashTCPSocketManager::OnMsgConnectWithNetAddress( - uint32 socket_id, - const PP_Flash_NetAddress& net_addr) { - SocketMap::iterator iter = sockets_.find(socket_id); - if (iter == sockets_.end()) { - NOTREACHED(); - return; - } - - iter->second->ConnectWithNetAddress(net_addr); -} - -void PepperMessageFilter::FlashTCPSocketManager::OnMsgRead( - uint32 socket_id, - int32_t bytes_to_read) { - SocketMap::iterator iter = sockets_.find(socket_id); - if (iter == sockets_.end()) { - NOTREACHED(); - return; - } - - iter->second->Read(bytes_to_read); -} - -void PepperMessageFilter::FlashTCPSocketManager::OnMsgWrite( - uint32 socket_id, - const std::string& data) { - SocketMap::iterator iter = sockets_.find(socket_id); - if (iter == sockets_.end()) { - NOTREACHED(); - return; - } - - iter->second->Write(data); -} - -void PepperMessageFilter::FlashTCPSocketManager::OnMsgDisconnect( - uint32 socket_id) { - SocketMap::iterator iter = sockets_.find(socket_id); - if (iter == sockets_.end()) { - NOTREACHED(); - return; - } - - // Destroy the FlashTCPSocket instance will cancel any pending completion - // callback. From this point on, there won't be any messages associated with - // this socket sent to the plugin side. - sockets_.erase(iter); -} - PepperMessageFilter::PepperMessageFilter( const content::ResourceContext* resource_context) : resource_context_(resource_context), - host_resolver_(NULL), - ALLOW_THIS_IN_INITIALIZER_LIST( - socket_manager_(new FlashTCPSocketManager(this))) { + host_resolver_(NULL) { DCHECK(resource_context_); } PepperMessageFilter::PepperMessageFilter(net::HostResolver* host_resolver) : resource_context_(NULL), - host_resolver_(host_resolver), - ALLOW_THIS_IN_INITIALIZER_LIST( - socket_manager_(new FlashTCPSocketManager(this))) { + host_resolver_(host_resolver) { DCHECK(host_resolver); } @@ -532,25 +66,6 @@ bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg, OnGetLocalTimeZoneOffset) IPC_MESSAGE_HANDLER_DELAY_REPLY(PpapiHostMsg_PPBFont_GetFontFamilies, OnGetFontFamilies) - IPC_MESSAGE_FORWARD( - PpapiHostMsg_PPBFlashTCPSocket_Create, - socket_manager_.get(), FlashTCPSocketManager::OnMsgCreate) - IPC_MESSAGE_FORWARD( - PpapiHostMsg_PPBFlashTCPSocket_Connect, - socket_manager_.get(), FlashTCPSocketManager::OnMsgConnect) - IPC_MESSAGE_FORWARD( - PpapiHostMsg_PPBFlashTCPSocket_ConnectWithNetAddress, - socket_manager_.get(), - FlashTCPSocketManager::OnMsgConnectWithNetAddress) - IPC_MESSAGE_FORWARD( - PpapiHostMsg_PPBFlashTCPSocket_Read, - socket_manager_.get(), FlashTCPSocketManager::OnMsgRead) - IPC_MESSAGE_FORWARD( - PpapiHostMsg_PPBFlashTCPSocket_Write, - socket_manager_.get(), FlashTCPSocketManager::OnMsgWrite) - IPC_MESSAGE_FORWARD( - PpapiHostMsg_PPBFlashTCPSocket_Disconnect, - socket_manager_.get(), FlashTCPSocketManager::OnMsgDisconnect) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP_EX() return handled; @@ -560,6 +75,34 @@ bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg, namespace { +bool ValidateNetAddress(const PP_Flash_NetAddress& addr) { + if (addr.size < sizeof(sa_family_t)) + return false; + + // TODO(viettrungluu): more careful validation? + // Just do a size check for AF_INET. + if (reinterpret_cast<const sockaddr*>(addr.data)->sa_family == AF_INET && + addr.size >= sizeof(sockaddr_in)) + return true; + + // Ditto for AF_INET6. + if (reinterpret_cast<const sockaddr*>(addr.data)->sa_family == AF_INET6 && + addr.size >= sizeof(sockaddr_in6)) + return true; + + // Reject everything else. + return false; +} + +PP_Flash_NetAddress SockaddrToNetAddress(const struct sockaddr* sa, + socklen_t sa_length) { + PP_Flash_NetAddress addr; + CHECK_LE(sa_length, sizeof(addr.data)); + addr.size = sa_length; + memcpy(addr.data, sa, addr.size); + return addr; +} + int ConnectTcpSocket(const PP_Flash_NetAddress& addr, PP_Flash_NetAddress* local_addr_out, PP_Flash_NetAddress* remote_addr_out) { @@ -706,15 +249,14 @@ void PepperMessageFilter::ConnectTcpOnWorkerThread(int routing_id, IPC::InvalidPlatformFileForTransit(); PP_Flash_NetAddress local_addr = kInvalidNetAddress; PP_Flash_NetAddress remote_addr = kInvalidNetAddress; - PP_Flash_NetAddress addr = kInvalidNetAddress; for (const struct addrinfo* ai = addresses.head(); ai; ai = ai->ai_next) { - if (SockaddrToNetAddress(ai->ai_addr, ai->ai_addrlen, &addr)) { - int fd = ConnectTcpSocket(addr, &local_addr, &remote_addr); - if (fd != -1) { - socket_for_transit = base::FileDescriptor(fd, true); - break; - } + PP_Flash_NetAddress addr = SockaddrToNetAddress(ai->ai_addr, + ai->ai_addrlen); + int fd = ConnectTcpSocket(addr, &local_addr, &remote_addr); + if (fd != -1) { + socket_for_transit = base::FileDescriptor(fd, true); + break; } } diff --git a/content/browser/renderer_host/pepper_message_filter.h b/content/browser/renderer_host/pepper_message_filter.h index e9cd398..f047ec9 100644 --- a/content/browser/renderer_host/pepper_message_filter.h +++ b/content/browser/renderer_host/pepper_message_filter.h @@ -41,9 +41,6 @@ class PepperMessageFilter : public BrowserMessageFilter { bool* message_was_ok); private: - class FlashTCPSocket; - class FlashTCPSocketManager; - #if defined(ENABLE_FLAPPER_HACKS) // Message handlers. void OnConnectTcp(int routing_id, @@ -94,8 +91,6 @@ class PepperMessageFilter : public BrowserMessageFilter { // GetHostResolver instead of accessing directly. net::HostResolver* host_resolver_; - scoped_ptr<FlashTCPSocketManager> socket_manager_; - DISALLOW_COPY_AND_ASSIGN(PepperMessageFilter); }; diff --git a/content/common/pepper_messages.cc b/content/common/pepper_messages.cc index 4d7602b..b2a8f63 100644 --- a/content/common/pepper_messages.cc +++ b/content/common/pepper_messages.cc @@ -2,5 +2,40 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ppapi/c/private/ppb_flash_net_connector.h" + #define IPC_MESSAGE_IMPL #include "content/common/pepper_messages.h" + +namespace IPC { + +void ParamTraits<PP_Flash_NetAddress>::Write(Message* m, const param_type& p) { + WriteParam(m, p.size); + m->WriteBytes(p.data, static_cast<int>(p.size)); +} + +bool ParamTraits<PP_Flash_NetAddress>::Read(const Message* m, + void** iter, + param_type* p) { + uint16 size; + if (!ReadParam(m, iter, &size)) + return false; + if (size > sizeof(p->data)) + return false; + p->size = size; + + const char* data; + if (!m->ReadBytes(iter, &data, size)) + return false; + memcpy(p->data, data, size); + return true; +} + +void ParamTraits<PP_Flash_NetAddress>::Log(const param_type& p, + std::string* l) { + l->append("<PP_Flash_NetAddress ("); + LogParam(p.size, l); + l->append(" bytes)>"); +} + +} // namespace IPC diff --git a/content/common/pepper_messages.h b/content/common/pepper_messages.h index b89705e..5a84626 100644 --- a/content/common/pepper_messages.h +++ b/content/common/pepper_messages.h @@ -4,9 +4,27 @@ // Multiply-included message file, no traditional include guard #include "ipc/ipc_message_macros.h" +#include "ipc/ipc_param_traits.h" #include "ipc/ipc_platform_file.h" #include "ppapi/c/private/ppb_flash_net_connector.h" -#include "ppapi/proxy/ppapi_param_traits.h" + +// Singly-included section, not yet converted. +#ifndef CONTENT_COMMON_PEPPER_MESSAGES_H_ +#define CONTENT_COMMON_PEPPER_MESSAGES_H_ + +namespace IPC { + +template <> +struct ParamTraits<PP_Flash_NetAddress> { + typedef PP_Flash_NetAddress param_type; + static void Write(Message* m, const param_type& p); + static bool Read(const Message* m, void** iter, param_type* p); + static void Log(const param_type& p, std::string* l); +}; + +} // namespace IPC + +#endif // CONTENT_COMMON_PEPPER_MESSAGES_H_ #define IPC_MESSAGE_START PepperMsgStart diff --git a/content/ppapi_plugin/ppapi_thread.cc b/content/ppapi_plugin/ppapi_thread.cc index c3b42ed..9b3c846 100644 --- a/content/ppapi_plugin/ppapi_thread.cc +++ b/content/ppapi_plugin/ppapi_thread.cc @@ -41,8 +41,7 @@ PpapiThread::PpapiThread(bool is_broker) get_plugin_interface_(NULL), connect_instance_func_(NULL), local_pp_module_( - base::RandInt(0, std::numeric_limits<PP_Module>::max())), - next_plugin_dispatcher_id_(1) { + base::RandInt(0, std::numeric_limits<PP_Module>::max())) { } PpapiThread::~PpapiThread() { @@ -71,12 +70,6 @@ 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_PPBFlashTCPSocket_ConnectACK, - OnPluginDispatcherMessageReceived(msg)) - IPC_MESSAGE_HANDLER_GENERIC(PpapiMsg_PPBFlashTCPSocket_ReadACK, - OnPluginDispatcherMessageReceived(msg)) - IPC_MESSAGE_HANDLER_GENERIC(PpapiMsg_PPBFlashTCPSocket_WriteACK, - OnPluginDispatcherMessageReceived(msg)) IPC_END_MESSAGE_MAP() return true; } @@ -110,27 +103,6 @@ bool PpapiThread::SendToBrowser(IPC::Message* msg) { return Send(msg); } -uint32 PpapiThread::Register(pp::proxy::PluginDispatcher* plugin_dispatcher) { - if (!plugin_dispatcher || - plugin_dispatchers_.size() >= std::numeric_limits<uint32>::max()) { - return 0; - } - - uint32 id = 0; - do { - // Although it is unlikely, make sure that we won't cause any trouble when - // the counter overflows. - id = next_plugin_dispatcher_id_++; - } while (id == 0 || - plugin_dispatchers_.find(id) != plugin_dispatchers_.end()); - plugin_dispatchers_[id] = plugin_dispatcher; - return id; -} - -void PpapiThread::Unregister(uint32 plugin_dispatcher_id) { - plugin_dispatchers_.erase(plugin_dispatcher_id); -} - void PpapiThread::OnMsgLoadPlugin(const FilePath& path) { base::ScopedNativeLibrary library(base::LoadNativeLibrary(path, NULL)); @@ -220,20 +192,6 @@ void PpapiThread::OnMsgCreateChannel(base::ProcessHandle host_process_handle, Send(new PpapiHostMsg_ChannelCreated(channel_handle)); } -void PpapiThread::OnPluginDispatcherMessageReceived(const IPC::Message& msg) { - // The first parameter should be a plugin dispatcher ID. - void* iter = NULL; - uint32 id = 0; - if (!msg.ReadUInt32(&iter, &id)) { - NOTREACHED(); - return; - } - std::map<uint32, pp::proxy::PluginDispatcher*>::iterator dispatcher = - plugin_dispatchers_.find(id); - if (dispatcher != plugin_dispatchers_.end()) - dispatcher->second->OnMessageReceived(msg); -} - bool PpapiThread::SetupRendererChannel(base::ProcessHandle host_process_handle, int renderer_id, IPC::ChannelHandle* handle) { diff --git a/content/ppapi_plugin/ppapi_thread.h b/content/ppapi_plugin/ppapi_thread.h index 5b77f24..3d20387 100644 --- a/content/ppapi_plugin/ppapi_thread.h +++ b/content/ppapi_plugin/ppapi_thread.h @@ -6,8 +6,6 @@ #define CONTENT_PPAPI_PLUGIN_PPAPI_THREAD_H_ #pragma once -#include <map> - #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" @@ -44,15 +42,11 @@ class PpapiThread : public ChildThread, virtual void PostToWebKitThread(const tracked_objects::Location& from_here, const base::Closure& task) OVERRIDE; virtual bool SendToBrowser(IPC::Message* msg) OVERRIDE; - virtual uint32 Register( - pp::proxy::PluginDispatcher* plugin_dispatcher) OVERRIDE; - virtual void Unregister(uint32 plugin_dispatcher_id) OVERRIDE; // Message handlers. void OnMsgLoadPlugin(const FilePath& path); void OnMsgCreateChannel(base::ProcessHandle host_process_handle, int renderer_id); - void OnPluginDispatcherMessageReceived(const IPC::Message& msg); // Sets up the channel to the given renderer. On success, returns true and // fills the given ChannelHandle with the information from the new channel. @@ -87,10 +81,6 @@ class PpapiThread : public ChildThread, scoped_ptr<PpapiWebKitThread> webkit_thread_; - // The PluginDispatcher instances contained in the map are not owned by it. - std::map<uint32, pp::proxy::PluginDispatcher*> plugin_dispatchers_; - uint32 next_plugin_dispatcher_id_; - DISALLOW_IMPLICIT_CONSTRUCTORS(PpapiThread); }; |