1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_TCP_SOCKET_MESSAGE_FILTER_H_
6 #define CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_TCP_SOCKET_MESSAGE_FILTER_H_
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "content/browser/renderer_host/pepper/ssl_context_helper.h"
16 #include "content/common/content_export.h"
17 #include "net/base/address_list.h"
18 #include "net/base/ip_endpoint.h"
19 #include "net/socket/tcp_socket.h"
20 #include "ppapi/c/pp_instance.h"
21 #include "ppapi/c/ppb_tcp_socket.h"
22 #include "ppapi/c/private/ppb_net_address_private.h"
23 #include "ppapi/host/resource_message_filter.h"
24 #include "ppapi/shared_impl/ppb_tcp_socket_shared.h"
28 class DrainableIOBuffer;
30 class SingleRequestHostResolver;
31 class SSLClientSocket;
35 class SocketOptionData;
39 struct ReplyMessageContext;
45 class BrowserPpapiHostImpl;
46 class ContentBrowserPepperHostFactory;
47 class ResourceContext;
49 class CONTENT_EXPORT PepperTCPSocketMessageFilter
50 : public ppapi::host::ResourceMessageFilter {
52 PepperTCPSocketMessageFilter(ContentBrowserPepperHostFactory* factory,
53 BrowserPpapiHostImpl* host,
55 ppapi::TCPSocketVersion version);
57 // Used for creating already connected sockets.
58 PepperTCPSocketMessageFilter(BrowserPpapiHostImpl* host,
60 ppapi::TCPSocketVersion version,
61 scoped_ptr<net::TCPSocket> socket);
63 static size_t GetNumInstances();
66 virtual ~PepperTCPSocketMessageFilter();
68 // ppapi::host::ResourceMessageFilter overrides.
69 virtual scoped_refptr<base::TaskRunner> OverrideTaskRunnerForMessage(
70 const IPC::Message& message) OVERRIDE;
71 virtual int32_t OnResourceMessageReceived(
72 const IPC::Message& msg,
73 ppapi::host::HostMessageContext* context) OVERRIDE;
75 int32_t OnMsgBind(const ppapi::host::HostMessageContext* context,
76 const PP_NetAddress_Private& net_addr);
77 int32_t OnMsgConnect(const ppapi::host::HostMessageContext* context,
78 const std::string& host,
80 int32_t OnMsgConnectWithNetAddress(
81 const ppapi::host::HostMessageContext* context,
82 const PP_NetAddress_Private& net_addr);
83 int32_t OnMsgSSLHandshake(
84 const ppapi::host::HostMessageContext* context,
85 const std::string& server_name,
87 const std::vector<std::vector<char> >& trusted_certs,
88 const std::vector<std::vector<char> >& untrusted_certs);
89 int32_t OnMsgRead(const ppapi::host::HostMessageContext* context,
90 int32_t bytes_to_read);
91 int32_t OnMsgWrite(const ppapi::host::HostMessageContext* context,
92 const std::string& data);
93 int32_t OnMsgListen(const ppapi::host::HostMessageContext* context,
95 int32_t OnMsgAccept(const ppapi::host::HostMessageContext* context);
96 int32_t OnMsgClose(const ppapi::host::HostMessageContext* context);
97 int32_t OnMsgSetOption(const ppapi::host::HostMessageContext* context,
98 PP_TCPSocket_Option name,
99 const ppapi::SocketOptionData& value);
101 void DoBind(const ppapi::host::ReplyMessageContext& context,
102 const PP_NetAddress_Private& net_addr);
103 void DoConnect(const ppapi::host::ReplyMessageContext& context,
104 const std::string& host,
106 ResourceContext* resource_context);
107 void DoConnectWithNetAddress(const ppapi::host::ReplyMessageContext& context,
108 const PP_NetAddress_Private& net_addr);
109 void DoWrite(const ppapi::host::ReplyMessageContext& context);
110 void DoListen(const ppapi::host::ReplyMessageContext& context,
113 void OnResolveCompleted(const ppapi::host::ReplyMessageContext& context,
115 void StartConnect(const ppapi::host::ReplyMessageContext& context);
117 void OnConnectCompleted(const ppapi::host::ReplyMessageContext& context,
119 void OnSSLHandshakeCompleted(const ppapi::host::ReplyMessageContext& context,
121 void OnReadCompleted(const ppapi::host::ReplyMessageContext& context,
123 void OnWriteCompleted(const ppapi::host::ReplyMessageContext& context,
125 void OnAcceptCompleted(const ppapi::host::ReplyMessageContext& context,
128 void SendBindReply(const ppapi::host::ReplyMessageContext& context,
130 const PP_NetAddress_Private& local_addr);
131 void SendBindError(const ppapi::host::ReplyMessageContext& context,
133 void SendConnectReply(const ppapi::host::ReplyMessageContext& context,
135 const PP_NetAddress_Private& local_addr,
136 const PP_NetAddress_Private& remote_addr);
137 void SendConnectError(const ppapi::host::ReplyMessageContext& context,
139 void SendSSLHandshakeReply(const ppapi::host::ReplyMessageContext& context,
141 void SendReadReply(const ppapi::host::ReplyMessageContext& context,
143 const std::string& data);
144 void SendReadError(const ppapi::host::ReplyMessageContext& context,
146 void SendWriteReply(const ppapi::host::ReplyMessageContext& context,
148 void SendListenReply(const ppapi::host::ReplyMessageContext& context,
150 void SendAcceptReply(const ppapi::host::ReplyMessageContext& context,
153 const PP_NetAddress_Private& local_addr,
154 const PP_NetAddress_Private& remote_addr);
155 void SendAcceptError(const ppapi::host::ReplyMessageContext& context,
158 bool IsPrivateAPI() const {
159 return version_ == ppapi::TCP_SOCKET_VERSION_PRIVATE;
162 // The following fields are used on both the UI and IO thread.
163 const ppapi::TCPSocketVersion version_;
165 // The following fields are used only on the UI thread.
166 const bool external_plugin_;
168 int render_process_id_;
169 int render_frame_id_;
171 // The following fields are used only on the IO thread.
173 ppapi::host::PpapiHost* ppapi_host_;
175 ContentBrowserPepperHostFactory* factory_;
176 PP_Instance instance_;
178 ppapi::TCPSocketState state_;
179 bool end_of_file_reached_;
181 // This is the address requested to bind. Please note that this is not the
182 // bound address. For example, |bind_input_addr_| may have port set to 0.
183 // It is used to check permission for listening.
184 PP_NetAddress_Private bind_input_addr_;
186 scoped_ptr<net::SingleRequestHostResolver> resolver_;
188 // |address_list_| may store multiple addresses when
189 // PPB_TCPSocket_Private.Connect() is used, which involves name resolution.
190 // In that case, we will try each address in the list until a connection is
191 // successfully established.
192 net::AddressList address_list_;
193 // Where we are in the above list.
194 size_t address_index_;
196 // Non-null unless an SSL connection is requested.
197 scoped_ptr<net::TCPSocket> socket_;
198 // Non-null if an SSL connection is requested.
199 scoped_ptr<net::SSLClientSocket> ssl_socket_;
201 scoped_refptr<net::IOBuffer> read_buffer_;
203 // TCPSocket::Write() may not always write the full buffer, but we would
204 // rather have our DoWrite() do so whenever possible. To do this, we may have
205 // to call the former multiple times for each of the latter. This entails
206 // using a DrainableIOBuffer, which requires an underlying base IOBuffer.
207 scoped_refptr<net::IOBuffer> write_buffer_base_;
208 scoped_refptr<net::DrainableIOBuffer> write_buffer_;
209 scoped_refptr<SSLContextHelper> ssl_context_helper_;
211 bool pending_accept_;
212 scoped_ptr<net::TCPSocket> accepted_socket_;
213 net::IPEndPoint accepted_address_;
215 DISALLOW_COPY_AND_ASSIGN(PepperTCPSocketMessageFilter);
218 } // namespace content
220 #endif // CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_TCP_SOCKET_MESSAGE_FILTER_H_