| OLD | NEW |
| 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/pepper_tcp_socket.h" | 5 #include "content/browser/renderer_host/pepper/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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 DCHECK(manager); | 71 DCHECK(manager); |
| 72 } | 72 } |
| 73 | 73 |
| 74 PepperTCPSocket::~PepperTCPSocket() { | 74 PepperTCPSocket::~PepperTCPSocket() { |
| 75 // Make sure no further callbacks from socket_. | 75 // Make sure no further callbacks from socket_. |
| 76 if (socket_) | 76 if (socket_) |
| 77 socket_->Disconnect(); | 77 socket_->Disconnect(); |
| 78 } | 78 } |
| 79 | 79 |
| 80 void PepperTCPSocket::Connect(const std::string& host, uint16_t port) { | 80 void PepperTCPSocket::Connect(const std::string& host, uint16_t port) { |
| 81 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 81 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 82 | 82 |
| 83 if (connection_state_ != BEFORE_CONNECT) { | 83 if (connection_state_ != BEFORE_CONNECT) { |
| 84 SendConnectACKError(PP_ERROR_FAILED); | 84 SendConnectACKError(PP_ERROR_FAILED); |
| 85 return; | 85 return; |
| 86 } | 86 } |
| 87 | 87 |
| 88 connection_state_ = CONNECT_IN_PROGRESS; | 88 connection_state_ = CONNECT_IN_PROGRESS; |
| 89 net::HostResolver::RequestInfo request_info(net::HostPortPair(host, port)); | 89 net::HostResolver::RequestInfo request_info(net::HostPortPair(host, port)); |
| 90 resolver_.reset( | 90 resolver_.reset( |
| 91 new net::SingleRequestHostResolver(manager_->GetHostResolver())); | 91 new net::SingleRequestHostResolver(manager_->GetHostResolver())); |
| 92 int net_result = resolver_->Resolve( | 92 int net_result = resolver_->Resolve( |
| 93 request_info, | 93 request_info, |
| 94 net::DEFAULT_PRIORITY, | 94 net::DEFAULT_PRIORITY, |
| 95 &address_list_, | 95 &address_list_, |
| 96 base::Bind(&PepperTCPSocket::OnResolveCompleted, base::Unretained(this)), | 96 base::Bind(&PepperTCPSocket::OnResolveCompleted, base::Unretained(this)), |
| 97 net::BoundNetLog()); | 97 net::BoundNetLog()); |
| 98 if (net_result != net::ERR_IO_PENDING) | 98 if (net_result != net::ERR_IO_PENDING) |
| 99 OnResolveCompleted(net_result); | 99 OnResolveCompleted(net_result); |
| 100 } | 100 } |
| 101 | 101 |
| 102 void PepperTCPSocket::ConnectWithNetAddress( | 102 void PepperTCPSocket::ConnectWithNetAddress( |
| 103 const PP_NetAddress_Private& net_addr) { | 103 const PP_NetAddress_Private& net_addr) { |
| 104 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 104 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 105 | 105 |
| 106 if (connection_state_ != BEFORE_CONNECT) { | 106 if (connection_state_ != BEFORE_CONNECT) { |
| 107 SendConnectACKError(PP_ERROR_FAILED); | 107 SendConnectACKError(PP_ERROR_FAILED); |
| 108 return; | 108 return; |
| 109 } | 109 } |
| 110 | 110 |
| 111 net::IPAddressNumber address; | 111 net::IPAddressNumber address; |
| 112 int port; | 112 int port; |
| 113 if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(net_addr, &address, | 113 if (!NetAddressPrivateImpl::NetAddressToIPEndPoint(net_addr, &address, |
| 114 &port)) { | 114 &port)) { |
| 115 SendConnectACKError(PP_ERROR_ADDRESS_INVALID); | 115 SendConnectACKError(PP_ERROR_ADDRESS_INVALID); |
| 116 return; | 116 return; |
| 117 } | 117 } |
| 118 | 118 |
| 119 // Copy the single IPEndPoint to address_list_. | 119 // Copy the single IPEndPoint to address_list_. |
| 120 address_list_.clear(); | 120 address_list_.clear(); |
| 121 address_list_.push_back(net::IPEndPoint(address, port)); | 121 address_list_.push_back(net::IPEndPoint(address, port)); |
| 122 connection_state_ = CONNECT_IN_PROGRESS; | 122 connection_state_ = CONNECT_IN_PROGRESS; |
| 123 StartConnect(address_list_); | 123 StartConnect(address_list_); |
| 124 } | 124 } |
| 125 | 125 |
| 126 void PepperTCPSocket::SSLHandshake( | 126 void PepperTCPSocket::SSLHandshake( |
| 127 const std::string& server_name, | 127 const std::string& server_name, |
| 128 uint16_t server_port, | 128 uint16_t server_port, |
| 129 const std::vector<std::vector<char> >& trusted_certs, | 129 const std::vector<std::vector<char> >& trusted_certs, |
| 130 const std::vector<std::vector<char> >& untrusted_certs) { | 130 const std::vector<std::vector<char> >& untrusted_certs) { |
| 131 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 131 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 132 | 132 |
| 133 // Allow to do SSL handshake only if currently the socket has been connected | 133 // Allow to do SSL handshake only if currently the socket has been connected |
| 134 // and there isn't pending read or write. | 134 // and there isn't pending read or write. |
| 135 // IsConnected() includes the state that SSL handshake has been finished and | 135 // IsConnected() includes the state that SSL handshake has been finished and |
| 136 // therefore isn't suitable here. | 136 // therefore isn't suitable here. |
| 137 if (connection_state_ != CONNECTED || read_buffer_.get() || | 137 if (connection_state_ != CONNECTED || read_buffer_.get() || |
| 138 write_buffer_base_.get() || write_buffer_.get()) { | 138 write_buffer_base_.get() || write_buffer_.get()) { |
| 139 SendSSLHandshakeACK(false); | 139 SendSSLHandshakeACK(false); |
| 140 return; | 140 return; |
| 141 } | 141 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 160 } | 160 } |
| 161 | 161 |
| 162 int net_result = socket_->Connect( | 162 int net_result = socket_->Connect( |
| 163 base::Bind(&PepperTCPSocket::OnSSLHandshakeCompleted, | 163 base::Bind(&PepperTCPSocket::OnSSLHandshakeCompleted, |
| 164 base::Unretained(this))); | 164 base::Unretained(this))); |
| 165 if (net_result != net::ERR_IO_PENDING) | 165 if (net_result != net::ERR_IO_PENDING) |
| 166 OnSSLHandshakeCompleted(net_result); | 166 OnSSLHandshakeCompleted(net_result); |
| 167 } | 167 } |
| 168 | 168 |
| 169 void PepperTCPSocket::Read(int32 bytes_to_read) { | 169 void PepperTCPSocket::Read(int32 bytes_to_read) { |
| 170 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 170 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 171 | 171 |
| 172 if (!IsConnected() || end_of_file_reached_) { | 172 if (!IsConnected() || end_of_file_reached_) { |
| 173 SendReadACKError(PP_ERROR_FAILED); | 173 SendReadACKError(PP_ERROR_FAILED); |
| 174 return; | 174 return; |
| 175 } | 175 } |
| 176 | 176 |
| 177 if (read_buffer_.get()) { | 177 if (read_buffer_.get()) { |
| 178 SendReadACKError(PP_ERROR_INPROGRESS); | 178 SendReadACKError(PP_ERROR_INPROGRESS); |
| 179 return; | 179 return; |
| 180 } | 180 } |
| 181 | 181 |
| 182 if (bytes_to_read <= 0 || | 182 if (bytes_to_read <= 0 || |
| 183 bytes_to_read > ppapi::TCPSocketShared::kMaxReadSize) { | 183 bytes_to_read > ppapi::TCPSocketShared::kMaxReadSize) { |
| 184 SendReadACKError(PP_ERROR_BADARGUMENT); | 184 SendReadACKError(PP_ERROR_BADARGUMENT); |
| 185 return; | 185 return; |
| 186 } | 186 } |
| 187 | 187 |
| 188 read_buffer_ = new net::IOBuffer(bytes_to_read); | 188 read_buffer_ = new net::IOBuffer(bytes_to_read); |
| 189 int net_result = socket_->Read( | 189 int net_result = socket_->Read( |
| 190 read_buffer_.get(), | 190 read_buffer_.get(), |
| 191 bytes_to_read, | 191 bytes_to_read, |
| 192 base::Bind(&PepperTCPSocket::OnReadCompleted, base::Unretained(this))); | 192 base::Bind(&PepperTCPSocket::OnReadCompleted, base::Unretained(this))); |
| 193 if (net_result != net::ERR_IO_PENDING) | 193 if (net_result != net::ERR_IO_PENDING) |
| 194 OnReadCompleted(net_result); | 194 OnReadCompleted(net_result); |
| 195 } | 195 } |
| 196 | 196 |
| 197 void PepperTCPSocket::Write(const std::string& data) { | 197 void PepperTCPSocket::Write(const std::string& data) { |
| 198 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 198 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 199 | 199 |
| 200 if (!IsConnected()) { | 200 if (!IsConnected()) { |
| 201 SendWriteACKError(PP_ERROR_FAILED); | 201 SendWriteACKError(PP_ERROR_FAILED); |
| 202 return; | 202 return; |
| 203 } | 203 } |
| 204 | 204 |
| 205 if (write_buffer_base_.get() || write_buffer_.get()) { | 205 if (write_buffer_base_.get() || write_buffer_.get()) { |
| 206 SendWriteACKError(PP_ERROR_INPROGRESS); | 206 SendWriteACKError(PP_ERROR_INPROGRESS); |
| 207 return; | 207 return; |
| 208 } | 208 } |
| 209 | 209 |
| 210 size_t data_size = data.size(); | 210 size_t data_size = data.size(); |
| 211 if (data_size == 0 || | 211 if (data_size == 0 || |
| 212 data_size > static_cast<size_t>(ppapi::TCPSocketShared::kMaxWriteSize)) { | 212 data_size > static_cast<size_t>(ppapi::TCPSocketShared::kMaxWriteSize)) { |
| 213 SendWriteACKError(PP_ERROR_BADARGUMENT); | 213 SendWriteACKError(PP_ERROR_BADARGUMENT); |
| 214 return; | 214 return; |
| 215 } | 215 } |
| 216 | 216 |
| 217 write_buffer_base_ = new net::IOBuffer(data_size); | 217 write_buffer_base_ = new net::IOBuffer(data_size); |
| 218 memcpy(write_buffer_base_->data(), data.data(), data_size); | 218 memcpy(write_buffer_base_->data(), data.data(), data_size); |
| 219 write_buffer_ = | 219 write_buffer_ = |
| 220 new net::DrainableIOBuffer(write_buffer_base_.get(), data_size); | 220 new net::DrainableIOBuffer(write_buffer_base_.get(), data_size); |
| 221 DoWrite(); | 221 DoWrite(); |
| 222 } | 222 } |
| 223 | 223 |
| 224 void PepperTCPSocket::SetOption(PP_TCPSocket_Option name, | 224 void PepperTCPSocket::SetOption(PP_TCPSocket_Option name, |
| 225 const ppapi::SocketOptionData& value) { | 225 const ppapi::SocketOptionData& value) { |
| 226 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 226 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 227 | 227 |
| 228 if (!IsConnected() || IsSsl()) { | 228 if (!IsConnected() || IsSsl()) { |
| 229 SendSetOptionACK(PP_ERROR_FAILED); | 229 SendSetOptionACK(PP_ERROR_FAILED); |
| 230 return; | 230 return; |
| 231 } | 231 } |
| 232 | 232 |
| 233 net::TCPClientSocket* tcp_socket = | 233 net::TCPClientSocket* tcp_socket = |
| 234 static_cast<net::TCPClientSocket*>(socket_.get()); | 234 static_cast<net::TCPClientSocket*>(socket_.get()); |
| 235 DCHECK(tcp_socket); | 235 DCHECK(tcp_socket); |
| 236 | 236 |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 | 518 |
| 519 int net_result = socket_->Write( | 519 int net_result = socket_->Write( |
| 520 write_buffer_.get(), | 520 write_buffer_.get(), |
| 521 write_buffer_->BytesRemaining(), | 521 write_buffer_->BytesRemaining(), |
| 522 base::Bind(&PepperTCPSocket::OnWriteCompleted, base::Unretained(this))); | 522 base::Bind(&PepperTCPSocket::OnWriteCompleted, base::Unretained(this))); |
| 523 if (net_result != net::ERR_IO_PENDING) | 523 if (net_result != net::ERR_IO_PENDING) |
| 524 OnWriteCompleted(net_result); | 524 OnWriteCompleted(net_result); |
| 525 } | 525 } |
| 526 | 526 |
| 527 } // namespace content | 527 } // namespace content |
| OLD | NEW |