Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: content/browser/renderer_host/pepper_tcp_server_socket.cc

Issue 9669038: Added out-of-process support for server sockets. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Sync. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/pepper_tcp_server_socket.h" 5 #include "content/browser/renderer_host/pepper_tcp_server_socket.h"
6 6
7 #include <cstddef> 7 #include <cstddef>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "content/browser/renderer_host/pepper_message_filter.h" 10 #include "content/browser/renderer_host/pepper_message_filter.h"
11 #include "content/public/browser/browser_thread.h" 11 #include "content/public/browser/browser_thread.h"
12 #include "net/base/ip_endpoint.h" 12 #include "net/base/ip_endpoint.h"
13 #include "net/base/net_errors.h" 13 #include "net/base/net_errors.h"
14 #include "net/socket/tcp_client_socket.h" 14 #include "net/socket/tcp_client_socket.h"
15 #include "net/socket/tcp_server_socket.h" 15 #include "net/socket/tcp_server_socket.h"
16 #include "ppapi/c/pp_errors.h" 16 #include "ppapi/c/pp_errors.h"
17 #include "ppapi/proxy/ppapi_messages.h" 17 #include "ppapi/proxy/ppapi_messages.h"
18 #include "ppapi/shared_impl/private/net_address_private_impl.h" 18 #include "ppapi/shared_impl/private/net_address_private_impl.h"
19 19
20 using content::BrowserThread; 20 using content::BrowserThread;
21 using ppapi::NetAddressPrivateImpl; 21 using ppapi::NetAddressPrivateImpl;
22 22
23 PepperTCPServerSocket::PepperTCPServerSocket( 23 PepperTCPServerSocket::PepperTCPServerSocket(
24 PepperMessageFilter* manager, 24 PepperMessageFilter* manager,
25 int32 routing_id, 25 int32 routing_id,
26 uint32 plugin_dispatcher_id, 26 uint32 plugin_dispatcher_id,
27 uint32 real_socket_id, 27 PP_Resource socket_resource,
28 uint32 temp_socket_id) 28 uint32 socket_id)
29 : manager_(manager), 29 : manager_(manager),
30 routing_id_(routing_id), 30 routing_id_(routing_id),
31 plugin_dispatcher_id_(plugin_dispatcher_id), 31 plugin_dispatcher_id_(plugin_dispatcher_id),
32 real_socket_id_(real_socket_id), 32 socket_resource_(socket_resource),
33 temp_socket_id_(temp_socket_id), 33 socket_id_(socket_id),
34 state_(BEFORE_LISTENING) { 34 state_(BEFORE_LISTENING) {
35 DCHECK(manager); 35 DCHECK(manager);
36 } 36 }
37 37
38 PepperTCPServerSocket::~PepperTCPServerSocket() { 38 PepperTCPServerSocket::~PepperTCPServerSocket() {
39 } 39 }
40 40
41 void PepperTCPServerSocket::Listen(const PP_NetAddress_Private& addr, 41 void PepperTCPServerSocket::Listen(const PP_NetAddress_Private& addr,
42 int32 backlog) { 42 int32 backlog) {
43 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 43 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
44 44
45 net::IPEndPoint ip_end_point; 45 net::IPEndPoint ip_end_point;
46 if (state_ != BEFORE_LISTENING || 46 if (state_ != BEFORE_LISTENING ||
47 !NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &ip_end_point)) { 47 !NetAddressPrivateImpl::NetAddressToIPEndPoint(addr, &ip_end_point)) {
48 CancelListenRequest(); 48 CancelListenRequest();
49 return; 49 return;
50 } 50 }
51 51
52 state_ = LISTEN_IN_PROGRESS; 52 state_ = LISTEN_IN_PROGRESS;
53 53
54 socket_.reset(new net::TCPServerSocket(NULL, net::NetLog::Source())); 54 socket_.reset(new net::TCPServerSocket(NULL, net::NetLog::Source()));
55 int result = socket_->Listen(ip_end_point, backlog); 55 int result = socket_->Listen(ip_end_point, backlog);
56 if (result != net::ERR_IO_PENDING) 56 if (result != net::ERR_IO_PENDING)
57 OnListenCompleted(result); 57 OnListenCompleted(result);
58 } 58 }
59 59
60 void PepperTCPServerSocket::Accept() { 60 void PepperTCPServerSocket::Accept(int32 tcp_client_socket_routing_id) {
61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
62 62
63 if (state_ != LISTENING) { 63 if (state_ != LISTENING) {
64 SendAcceptACKError(); 64 SendAcceptACKError();
65 return; 65 return;
66 } 66 }
67 67
68 state_ = ACCEPT_IN_PROGRESS; 68 state_ = ACCEPT_IN_PROGRESS;
69 69
70 int result = socket_->Accept( 70 int result = socket_->Accept(
71 &socket_buffer_, 71 &socket_buffer_,
72 base::Bind(&PepperTCPServerSocket::OnAcceptCompleted, 72 base::Bind(&PepperTCPServerSocket::OnAcceptCompleted,
73 base::Unretained(this))); 73 base::Unretained(this),
74 tcp_client_socket_routing_id));
74 if (result != net::ERR_IO_PENDING) 75 if (result != net::ERR_IO_PENDING)
75 OnAcceptCompleted(result); 76 OnAcceptCompleted(tcp_client_socket_routing_id, result);
76 } 77 }
77 78
78 void PepperTCPServerSocket::CancelListenRequest() { 79 void PepperTCPServerSocket::CancelListenRequest() {
79 manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK( 80 manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(
80 routing_id_, 81 routing_id_,
81 plugin_dispatcher_id_, 82 plugin_dispatcher_id_,
83 socket_resource_,
82 0, 84 0,
83 temp_socket_id_,
84 PP_ERROR_FAILED)); 85 PP_ERROR_FAILED));
85 BrowserThread::PostTask( 86 BrowserThread::PostTask(
86 BrowserThread::IO, 87 BrowserThread::IO,
87 FROM_HERE, 88 FROM_HERE,
88 base::Bind(&PepperMessageFilter::RemoveTCPServerSocket, manager_, 89 base::Bind(&PepperMessageFilter::RemoveTCPServerSocket, manager_,
89 real_socket_id_)); 90 socket_id_));
90 } 91 }
91 92
92 void PepperTCPServerSocket::SendAcceptACKError() { 93 void PepperTCPServerSocket::SendAcceptACKError() {
93 manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK( 94 manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK(
94 routing_id_, 95 routing_id_,
95 plugin_dispatcher_id_, 96 plugin_dispatcher_id_,
96 real_socket_id_, 97 socket_id_,
97 0, 98 0,
98 NetAddressPrivateImpl::kInvalidNetAddress, 99 NetAddressPrivateImpl::kInvalidNetAddress,
99 NetAddressPrivateImpl::kInvalidNetAddress)); 100 NetAddressPrivateImpl::kInvalidNetAddress));
100 } 101 }
101 102
102 void PepperTCPServerSocket::OnListenCompleted(int result) { 103 void PepperTCPServerSocket::OnListenCompleted(int result) {
103 DCHECK(state_ == LISTEN_IN_PROGRESS && socket_.get()); 104 DCHECK(state_ == LISTEN_IN_PROGRESS && socket_.get());
104 105
105 if (result != net::OK) { 106 if (result != net::OK) {
106 CancelListenRequest(); 107 CancelListenRequest();
107 } else { 108 } else {
108 manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK( 109 manager_->Send(new PpapiMsg_PPBTCPServerSocket_ListenACK(
109 routing_id_, 110 routing_id_,
110 plugin_dispatcher_id_, 111 plugin_dispatcher_id_,
111 real_socket_id_, 112 socket_resource_,
112 temp_socket_id_, 113 socket_id_,
113 PP_OK)); 114 PP_OK));
114 state_ = LISTENING; 115 state_ = LISTENING;
115 } 116 }
116 } 117 }
117 118
118 void PepperTCPServerSocket::OnAcceptCompleted(int result) { 119 void PepperTCPServerSocket::OnAcceptCompleted(
120 int32 tcp_client_socket_routing_id,
121 int result) {
119 DCHECK(state_ == ACCEPT_IN_PROGRESS && socket_buffer_.get()); 122 DCHECK(state_ == ACCEPT_IN_PROGRESS && socket_buffer_.get());
120 123
121 if (result != net::OK) { 124 if (result != net::OK) {
122 SendAcceptACKError(); 125 SendAcceptACKError();
123 } else { 126 } else {
124 scoped_ptr<net::StreamSocket> socket(socket_buffer_.release()); 127 scoped_ptr<net::StreamSocket> socket(socket_buffer_.release());
125 128
126 net::IPEndPoint ip_end_point; 129 net::IPEndPoint ip_end_point;
127 net::AddressList address_list; 130 net::AddressList address_list;
128 PP_NetAddress_Private local_addr = 131 PP_NetAddress_Private local_addr =
129 NetAddressPrivateImpl::kInvalidNetAddress; 132 NetAddressPrivateImpl::kInvalidNetAddress;
130 PP_NetAddress_Private remote_addr = 133 PP_NetAddress_Private remote_addr =
131 NetAddressPrivateImpl::kInvalidNetAddress; 134 NetAddressPrivateImpl::kInvalidNetAddress;
132 135
133 if (socket->GetLocalAddress(&ip_end_point) != net::OK || 136 if (socket->GetLocalAddress(&ip_end_point) != net::OK ||
134 !NetAddressPrivateImpl::IPEndPointToNetAddress(ip_end_point, 137 !NetAddressPrivateImpl::IPEndPointToNetAddress(ip_end_point,
135 &local_addr) || 138 &local_addr) ||
136 socket->GetPeerAddress(&address_list) != net::OK || 139 socket->GetPeerAddress(&address_list) != net::OK ||
137 !NetAddressPrivateImpl::AddressListToNetAddress(address_list, 140 !NetAddressPrivateImpl::AddressListToNetAddress(address_list,
138 &remote_addr)) { 141 &remote_addr)) {
139 SendAcceptACKError(); 142 SendAcceptACKError();
140 } else { 143 } else {
141 uint32 accepted_socket_id = 144 uint32 accepted_socket_id =
142 manager_->AddAcceptedTCPSocket(routing_id_, 145 manager_->AddAcceptedTCPSocket(tcp_client_socket_routing_id,
143 plugin_dispatcher_id_, 146 plugin_dispatcher_id_,
144 socket.release()); 147 socket.release());
145 if (accepted_socket_id != 0) { 148 if (accepted_socket_id != 0) {
146 manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK( 149 manager_->Send(new PpapiMsg_PPBTCPServerSocket_AcceptACK(
147 routing_id_, 150 routing_id_,
148 plugin_dispatcher_id_, 151 plugin_dispatcher_id_,
149 real_socket_id_, 152 socket_id_,
150 accepted_socket_id, 153 accepted_socket_id,
151 local_addr, 154 local_addr,
152 remote_addr)); 155 remote_addr));
153 } else { 156 } else {
154 SendAcceptACKError(); 157 SendAcceptACKError();
155 } 158 }
156 } 159 }
157 } 160 }
158 161
159 state_ = LISTENING; 162 state_ = LISTENING;
160 } 163 }
OLDNEW
« no previous file with comments | « content/browser/renderer_host/pepper_tcp_server_socket.h ('k') | content/ppapi_plugin/ppapi_thread.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698