OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_socket.h" | 5 #include "content/browser/renderer_host/pepper_tcp_socket.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 PepperTCPSocket::PepperTCPSocket( | 33 PepperTCPSocket::PepperTCPSocket( |
34 PepperMessageFilter* manager, | 34 PepperMessageFilter* manager, |
35 int32 routing_id, | 35 int32 routing_id, |
36 uint32 plugin_dispatcher_id, | 36 uint32 plugin_dispatcher_id, |
37 uint32 socket_id) | 37 uint32 socket_id) |
38 : manager_(manager), | 38 : manager_(manager), |
39 routing_id_(routing_id), | 39 routing_id_(routing_id), |
40 plugin_dispatcher_id_(plugin_dispatcher_id), | 40 plugin_dispatcher_id_(plugin_dispatcher_id), |
41 socket_id_(socket_id), | 41 socket_id_(socket_id), |
42 connection_state_(BEFORE_CONNECT), | 42 connection_state_(BEFORE_CONNECT), |
43 end_of_file_reached_(false), | 43 end_of_file_reached_(false) { |
44 ALLOW_THIS_IN_INITIALIZER_LIST(connect_callback_( | |
45 this, &PepperTCPSocket::OnConnectCompleted)), | |
46 ALLOW_THIS_IN_INITIALIZER_LIST(ssl_handshake_callback_( | |
47 this, &PepperTCPSocket::OnSSLHandshakeCompleted)), | |
48 ALLOW_THIS_IN_INITIALIZER_LIST( | |
49 read_callback_(this, &PepperTCPSocket::OnReadCompleted)), | |
50 ALLOW_THIS_IN_INITIALIZER_LIST( | |
51 write_callback_(this, &PepperTCPSocket::OnWriteCompleted)) { | |
52 DCHECK(manager); | 44 DCHECK(manager); |
53 } | 45 } |
54 | 46 |
55 PepperTCPSocket::~PepperTCPSocket() { | 47 PepperTCPSocket::~PepperTCPSocket() { |
56 // Make sure no further callbacks from socket_. | 48 // Make sure no further callbacks from socket_. |
57 if (socket_.get()) | 49 if (socket_.get()) |
58 socket_->Disconnect(); | 50 socket_->Disconnect(); |
59 } | 51 } |
60 | 52 |
61 void PepperTCPSocket::Connect(const std::string& host, uint16_t port) { | 53 void PepperTCPSocket::Connect(const std::string& host, uint16_t port) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 net::SSLClientSocketContext ssl_context; | 108 net::SSLClientSocketContext ssl_context; |
117 ssl_context.cert_verifier = manager_->GetCertVerifier(); | 109 ssl_context.cert_verifier = manager_->GetCertVerifier(); |
118 socket_.reset(factory->CreateSSLClientSocket( | 110 socket_.reset(factory->CreateSSLClientSocket( |
119 handle, host_port_pair, manager_->ssl_config(), NULL, ssl_context)); | 111 handle, host_port_pair, manager_->ssl_config(), NULL, ssl_context)); |
120 if (!socket_.get()) { | 112 if (!socket_.get()) { |
121 LOG(WARNING) << "Failed to create an SSL client socket."; | 113 LOG(WARNING) << "Failed to create an SSL client socket."; |
122 OnSSLHandshakeCompleted(net::ERR_UNEXPECTED); | 114 OnSSLHandshakeCompleted(net::ERR_UNEXPECTED); |
123 return; | 115 return; |
124 } | 116 } |
125 | 117 |
126 int result = socket_->Connect(&ssl_handshake_callback_); | 118 int result = socket_->Connect( |
| 119 base::Bind(&PepperTCPSocket::OnSSLHandshakeCompleted, |
| 120 base::Unretained(this))); |
127 if (result != net::ERR_IO_PENDING) | 121 if (result != net::ERR_IO_PENDING) |
128 OnSSLHandshakeCompleted(result); | 122 OnSSLHandshakeCompleted(result); |
129 } | 123 } |
130 | 124 |
131 void PepperTCPSocket::Read(int32 bytes_to_read) { | 125 void PepperTCPSocket::Read(int32 bytes_to_read) { |
132 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 126 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
133 | 127 |
134 if (!IsConnected() || end_of_file_reached_ || read_buffer_.get() || | 128 if (!IsConnected() || end_of_file_reached_ || read_buffer_.get() || |
135 bytes_to_read <= 0) { | 129 bytes_to_read <= 0) { |
136 SendReadACKError(); | 130 SendReadACKError(); |
137 return; | 131 return; |
138 } | 132 } |
139 | 133 |
140 if (bytes_to_read > ppapi::TCPSocketPrivateImpl::kMaxReadSize) { | 134 if (bytes_to_read > ppapi::TCPSocketPrivateImpl::kMaxReadSize) { |
141 NOTREACHED(); | 135 NOTREACHED(); |
142 bytes_to_read = ppapi::TCPSocketPrivateImpl::kMaxReadSize; | 136 bytes_to_read = ppapi::TCPSocketPrivateImpl::kMaxReadSize; |
143 } | 137 } |
144 | 138 |
145 read_buffer_ = new net::IOBuffer(bytes_to_read); | 139 read_buffer_ = new net::IOBuffer(bytes_to_read); |
146 int result = socket_->Read(read_buffer_, bytes_to_read, &read_callback_); | 140 int result = socket_->Read(read_buffer_, bytes_to_read, |
| 141 base::Bind(&PepperTCPSocket::OnReadCompleted, |
| 142 base::Unretained(this))); |
147 if (result != net::ERR_IO_PENDING) | 143 if (result != net::ERR_IO_PENDING) |
148 OnReadCompleted(result); | 144 OnReadCompleted(result); |
149 } | 145 } |
150 | 146 |
151 void PepperTCPSocket::Write(const std::string& data) { | 147 void PepperTCPSocket::Write(const std::string& data) { |
152 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 148 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
153 | 149 |
154 if (!IsConnected() || write_buffer_.get() || data.empty()) { | 150 if (!IsConnected() || write_buffer_.get() || data.empty()) { |
155 SendWriteACKError(); | 151 SendWriteACKError(); |
156 return; | 152 return; |
157 } | 153 } |
158 | 154 |
159 int data_size = data.size(); | 155 int data_size = data.size(); |
160 if (data_size > ppapi::TCPSocketPrivateImpl::kMaxWriteSize) { | 156 if (data_size > ppapi::TCPSocketPrivateImpl::kMaxWriteSize) { |
161 NOTREACHED(); | 157 NOTREACHED(); |
162 data_size = ppapi::TCPSocketPrivateImpl::kMaxWriteSize; | 158 data_size = ppapi::TCPSocketPrivateImpl::kMaxWriteSize; |
163 } | 159 } |
164 | 160 |
165 write_buffer_ = new net::IOBuffer(data_size); | 161 write_buffer_ = new net::IOBuffer(data_size); |
166 memcpy(write_buffer_->data(), data.c_str(), data_size); | 162 memcpy(write_buffer_->data(), data.c_str(), data_size); |
167 int result = socket_->Write(write_buffer_, data.size(), &write_callback_); | 163 int result = socket_->Write(write_buffer_, data.size(), |
| 164 base::Bind(&PepperTCPSocket::OnWriteCompleted, |
| 165 base::Unretained(this))); |
168 if (result != net::ERR_IO_PENDING) | 166 if (result != net::ERR_IO_PENDING) |
169 OnWriteCompleted(result); | 167 OnWriteCompleted(result); |
170 } | 168 } |
171 | 169 |
172 void PepperTCPSocket::StartConnect(const net::AddressList& addresses) { | 170 void PepperTCPSocket::StartConnect(const net::AddressList& addresses) { |
173 DCHECK(connection_state_ == CONNECT_IN_PROGRESS); | 171 DCHECK(connection_state_ == CONNECT_IN_PROGRESS); |
174 | 172 |
175 socket_.reset( | 173 socket_.reset( |
176 new net::TCPClientSocket(addresses, NULL, net::NetLog::Source())); | 174 new net::TCPClientSocket(addresses, NULL, net::NetLog::Source())); |
177 int result = socket_->Connect(&connect_callback_); | 175 int result = socket_->Connect( |
| 176 base::Bind(&PepperTCPSocket::OnConnectCompleted, |
| 177 base::Unretained(this))); |
178 if (result != net::ERR_IO_PENDING) | 178 if (result != net::ERR_IO_PENDING) |
179 OnConnectCompleted(result); | 179 OnConnectCompleted(result); |
180 } | 180 } |
181 | 181 |
182 void PepperTCPSocket::SendConnectACKError() { | 182 void PepperTCPSocket::SendConnectACKError() { |
183 manager_->Send(new PpapiMsg_PPBTCPSocket_ConnectACK( | 183 manager_->Send(new PpapiMsg_PPBTCPSocket_ConnectACK( |
184 routing_id_, plugin_dispatcher_id_, socket_id_, false, | 184 routing_id_, plugin_dispatcher_id_, socket_id_, false, |
185 NetAddressPrivateImpl::kInvalidNetAddress, | 185 NetAddressPrivateImpl::kInvalidNetAddress, |
186 NetAddressPrivateImpl::kInvalidNetAddress)); | 186 NetAddressPrivateImpl::kInvalidNetAddress)); |
187 } | 187 } |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 routing_id_, plugin_dispatcher_id_, socket_id_, true, result)); | 277 routing_id_, plugin_dispatcher_id_, socket_id_, true, result)); |
278 } else { | 278 } else { |
279 SendWriteACKError(); | 279 SendWriteACKError(); |
280 } | 280 } |
281 write_buffer_ = NULL; | 281 write_buffer_ = NULL; |
282 } | 282 } |
283 | 283 |
284 bool PepperTCPSocket::IsConnected() const { | 284 bool PepperTCPSocket::IsConnected() const { |
285 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; | 285 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; |
286 } | 286 } |
OLD | NEW |