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