12385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 22385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Use of this source code is governed by a BSD-style license that can be 32385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// found in the LICENSE file. 42385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 52385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#ifndef CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_TCP_SERVER_SOCKET_MESSAGE_FILTER_H_ 62385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#define CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_TCP_SERVER_SOCKET_MESSAGE_FILTER_H_ 72385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 82385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "base/basictypes.h" 92385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "base/compiler_specific.h" 102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "base/memory/ref_counted.h" 112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "base/memory/scoped_ptr.h" 122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/common/content_export.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/base/ip_endpoint.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/socket/tcp_socket.h" 152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ppapi/c/pp_instance.h" 162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ppapi/host/resource_message_filter.h" 172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochstruct PP_NetAddress_Private; 192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace ppapi { 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace host { 22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class PpapiHost; 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochnamespace content { 272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass BrowserPpapiHostImpl; 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class ContentBrowserPepperHostFactory; 302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// TODO(yzshen): Remove this class entirely and let 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// TCPServerSocketPrivateResource inherit TCPSocketResourceBase. 332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass CONTENT_EXPORT PepperTCPServerSocketMessageFilter 342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch : public ppapi::host::ResourceMessageFilter { 352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public: 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PepperTCPServerSocketMessageFilter(ContentBrowserPepperHostFactory* factory, 37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserPpapiHostImpl* host, 38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PP_Instance instance, 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool private_api); 402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch static size_t GetNumInstances(); 422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch protected: 442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual ~PepperTCPServerSocketMessageFilter(); 452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private: 472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch enum State { 482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch STATE_BEFORE_LISTENING, 492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch STATE_LISTEN_IN_PROGRESS, 502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch STATE_LISTENING, 512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch STATE_ACCEPT_IN_PROGRESS, 522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch STATE_CLOSED 532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch }; 542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // ppapi::host::ResourceMessageFilter overrides. 562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual scoped_refptr<base::TaskRunner> OverrideTaskRunnerForMessage( 572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const IPC::Message& message) OVERRIDE; 582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch virtual int32_t OnResourceMessageReceived( 592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const IPC::Message& msg, 602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ppapi::host::HostMessageContext* context) OVERRIDE; 612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int32_t OnMsgListen(const ppapi::host::HostMessageContext* context, 632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const PP_NetAddress_Private& addr, 642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int32_t backlog); 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int32_t OnMsgAccept(const ppapi::host::HostMessageContext* context); 662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int32_t OnMsgStopListening(const ppapi::host::HostMessageContext* context); 672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void DoListen(const ppapi::host::ReplyMessageContext& context, 692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const PP_NetAddress_Private& addr, 702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int32_t backlog); 712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void OnListenCompleted(const ppapi::host::ReplyMessageContext& context, 732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int net_result); 742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void OnAcceptCompleted(const ppapi::host::ReplyMessageContext& context, 752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int net_result); 762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void SendListenReply(const ppapi::host::ReplyMessageContext& context, 782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int32_t pp_result, 792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const PP_NetAddress_Private& local_addr); 802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void SendListenError(const ppapi::host::ReplyMessageContext& context, 812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int32_t pp_result); 822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void SendAcceptReply(const ppapi::host::ReplyMessageContext& context, 832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int32_t pp_result, 84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int pending_resource_id, 852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const PP_NetAddress_Private& local_addr, 862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const PP_NetAddress_Private& remote_addr); 872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void SendAcceptError(const ppapi::host::ReplyMessageContext& context, 882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int32_t pp_result); 892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Following fields are initialized and used only on the IO thread. 91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Non-owning ptr. 92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ppapi::host::PpapiHost* ppapi_host_; 93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Non-owning ptr. 94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ContentBrowserPepperHostFactory* factory_; 95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PP_Instance instance_; 96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch State state_; 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<net::TCPSocket> socket_; 9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<net::TCPSocket> accepted_socket_; 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) net::IPEndPoint accepted_address_; 1012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Following fields are initialized on the IO thread but used only 1032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // on the UI thread. 1042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const bool external_plugin_; 1052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const bool private_api_; 1062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int render_process_id_; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id_; 1082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DISALLOW_COPY_AND_ASSIGN(PepperTCPServerSocketMessageFilter); 1102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}; 1112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} // namespace content 1132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#endif // CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_TCP_SERVER_SOCKET_MESSAGE_FILTER_H_ 115