| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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 "ppapi/proxy/tcp_socket_resource_base.h" | 5 #include "ppapi/proxy/tcp_socket_resource_base.h" |
| 6 | 6 |
| 7 #include <cstring> | 7 #include <cstring> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 if (!state_.IsValidTransition(TCPSocketState::BIND)) | 77 if (!state_.IsValidTransition(TCPSocketState::BIND)) |
| 78 return PP_ERROR_FAILED; | 78 return PP_ERROR_FAILED; |
| 79 | 79 |
| 80 bind_callback_ = callback; | 80 bind_callback_ = callback; |
| 81 state_.SetPendingTransition(TCPSocketState::BIND); | 81 state_.SetPendingTransition(TCPSocketState::BIND); |
| 82 | 82 |
| 83 Call<PpapiPluginMsg_TCPSocket_BindReply>( | 83 Call<PpapiPluginMsg_TCPSocket_BindReply>( |
| 84 BROWSER, | 84 BROWSER, |
| 85 PpapiHostMsg_TCPSocket_Bind(*addr), | 85 PpapiHostMsg_TCPSocket_Bind(*addr), |
| 86 base::Bind(&TCPSocketResourceBase::OnPluginMsgBindReply, | 86 base::Bind(&TCPSocketResourceBase::OnPluginMsgBindReply, |
| 87 base::Unretained(this))); | 87 base::Unretained(this)), |
| 88 callback); |
| 88 return PP_OK_COMPLETIONPENDING; | 89 return PP_OK_COMPLETIONPENDING; |
| 89 } | 90 } |
| 90 | 91 |
| 91 int32_t TCPSocketResourceBase::ConnectImpl( | 92 int32_t TCPSocketResourceBase::ConnectImpl( |
| 92 const char* host, | 93 const char* host, |
| 93 uint16_t port, | 94 uint16_t port, |
| 94 scoped_refptr<TrackedCallback> callback) { | 95 scoped_refptr<TrackedCallback> callback) { |
| 95 if (!host) | 96 if (!host) |
| 96 return PP_ERROR_BADARGUMENT; | 97 return PP_ERROR_BADARGUMENT; |
| 97 if (state_.IsPending(TCPSocketState::CONNECT)) | 98 if (state_.IsPending(TCPSocketState::CONNECT)) |
| 98 return PP_ERROR_INPROGRESS; | 99 return PP_ERROR_INPROGRESS; |
| 99 if (!state_.IsValidTransition(TCPSocketState::CONNECT)) | 100 if (!state_.IsValidTransition(TCPSocketState::CONNECT)) |
| 100 return PP_ERROR_FAILED; | 101 return PP_ERROR_FAILED; |
| 101 | 102 |
| 102 connect_callback_ = callback; | 103 connect_callback_ = callback; |
| 103 state_.SetPendingTransition(TCPSocketState::CONNECT); | 104 state_.SetPendingTransition(TCPSocketState::CONNECT); |
| 104 | 105 |
| 105 Call<PpapiPluginMsg_TCPSocket_ConnectReply>( | 106 Call<PpapiPluginMsg_TCPSocket_ConnectReply>( |
| 106 BROWSER, | 107 BROWSER, |
| 107 PpapiHostMsg_TCPSocket_Connect(host, port), | 108 PpapiHostMsg_TCPSocket_Connect(host, port), |
| 108 base::Bind(&TCPSocketResourceBase::OnPluginMsgConnectReply, | 109 base::Bind(&TCPSocketResourceBase::OnPluginMsgConnectReply, |
| 109 base::Unretained(this))); | 110 base::Unretained(this)), |
| 111 callback); |
| 110 return PP_OK_COMPLETIONPENDING; | 112 return PP_OK_COMPLETIONPENDING; |
| 111 } | 113 } |
| 112 | 114 |
| 113 int32_t TCPSocketResourceBase::ConnectWithNetAddressImpl( | 115 int32_t TCPSocketResourceBase::ConnectWithNetAddressImpl( |
| 114 const PP_NetAddress_Private* addr, | 116 const PP_NetAddress_Private* addr, |
| 115 scoped_refptr<TrackedCallback> callback) { | 117 scoped_refptr<TrackedCallback> callback) { |
| 116 if (!addr) | 118 if (!addr) |
| 117 return PP_ERROR_BADARGUMENT; | 119 return PP_ERROR_BADARGUMENT; |
| 118 if (state_.IsPending(TCPSocketState::CONNECT)) | 120 if (state_.IsPending(TCPSocketState::CONNECT)) |
| 119 return PP_ERROR_INPROGRESS; | 121 return PP_ERROR_INPROGRESS; |
| 120 if (!state_.IsValidTransition(TCPSocketState::CONNECT)) | 122 if (!state_.IsValidTransition(TCPSocketState::CONNECT)) |
| 121 return PP_ERROR_FAILED; | 123 return PP_ERROR_FAILED; |
| 122 | 124 |
| 123 connect_callback_ = callback; | 125 connect_callback_ = callback; |
| 124 state_.SetPendingTransition(TCPSocketState::CONNECT); | 126 state_.SetPendingTransition(TCPSocketState::CONNECT); |
| 125 | 127 |
| 126 Call<PpapiPluginMsg_TCPSocket_ConnectReply>( | 128 Call<PpapiPluginMsg_TCPSocket_ConnectReply>( |
| 127 BROWSER, | 129 BROWSER, |
| 128 PpapiHostMsg_TCPSocket_ConnectWithNetAddress(*addr), | 130 PpapiHostMsg_TCPSocket_ConnectWithNetAddress(*addr), |
| 129 base::Bind(&TCPSocketResourceBase::OnPluginMsgConnectReply, | 131 base::Bind(&TCPSocketResourceBase::OnPluginMsgConnectReply, |
| 130 base::Unretained(this))); | 132 base::Unretained(this)), |
| 133 callback); |
| 131 return PP_OK_COMPLETIONPENDING; | 134 return PP_OK_COMPLETIONPENDING; |
| 132 } | 135 } |
| 133 | 136 |
| 134 PP_Bool TCPSocketResourceBase::GetLocalAddressImpl( | 137 PP_Bool TCPSocketResourceBase::GetLocalAddressImpl( |
| 135 PP_NetAddress_Private* local_addr) { | 138 PP_NetAddress_Private* local_addr) { |
| 136 if (!state_.IsBound() || !local_addr) | 139 if (!state_.IsBound() || !local_addr) |
| 137 return PP_FALSE; | 140 return PP_FALSE; |
| 138 *local_addr = local_addr_; | 141 *local_addr = local_addr_; |
| 139 return PP_TRUE; | 142 return PP_TRUE; |
| 140 } | 143 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 165 ssl_handshake_callback_ = callback; | 168 ssl_handshake_callback_ = callback; |
| 166 state_.SetPendingTransition(TCPSocketState::SSL_CONNECT); | 169 state_.SetPendingTransition(TCPSocketState::SSL_CONNECT); |
| 167 | 170 |
| 168 Call<PpapiPluginMsg_TCPSocket_SSLHandshakeReply>( | 171 Call<PpapiPluginMsg_TCPSocket_SSLHandshakeReply>( |
| 169 BROWSER, | 172 BROWSER, |
| 170 PpapiHostMsg_TCPSocket_SSLHandshake(server_name, | 173 PpapiHostMsg_TCPSocket_SSLHandshake(server_name, |
| 171 server_port, | 174 server_port, |
| 172 trusted_certificates_, | 175 trusted_certificates_, |
| 173 untrusted_certificates_), | 176 untrusted_certificates_), |
| 174 base::Bind(&TCPSocketResourceBase::OnPluginMsgSSLHandshakeReply, | 177 base::Bind(&TCPSocketResourceBase::OnPluginMsgSSLHandshakeReply, |
| 175 base::Unretained(this))); | 178 base::Unretained(this)), |
| 179 callback); |
| 176 return PP_OK_COMPLETIONPENDING; | 180 return PP_OK_COMPLETIONPENDING; |
| 177 } | 181 } |
| 178 | 182 |
| 179 PP_Resource TCPSocketResourceBase::GetServerCertificateImpl() { | 183 PP_Resource TCPSocketResourceBase::GetServerCertificateImpl() { |
| 180 if (!server_certificate_.get()) | 184 if (!server_certificate_.get()) |
| 181 return 0; | 185 return 0; |
| 182 return server_certificate_->GetReference(); | 186 return server_certificate_->GetReference(); |
| 183 } | 187 } |
| 184 | 188 |
| 185 PP_Bool TCPSocketResourceBase::AddChainBuildingCertificateImpl( | 189 PP_Bool TCPSocketResourceBase::AddChainBuildingCertificateImpl( |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 state_.IsPending(TCPSocketState::SSL_CONNECT)) | 230 state_.IsPending(TCPSocketState::SSL_CONNECT)) |
| 227 return PP_ERROR_INPROGRESS; | 231 return PP_ERROR_INPROGRESS; |
| 228 read_buffer_ = buffer; | 232 read_buffer_ = buffer; |
| 229 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize); | 233 bytes_to_read_ = std::min(bytes_to_read, kMaxReadSize); |
| 230 read_callback_ = callback; | 234 read_callback_ = callback; |
| 231 | 235 |
| 232 Call<PpapiPluginMsg_TCPSocket_ReadReply>( | 236 Call<PpapiPluginMsg_TCPSocket_ReadReply>( |
| 233 BROWSER, | 237 BROWSER, |
| 234 PpapiHostMsg_TCPSocket_Read(bytes_to_read_), | 238 PpapiHostMsg_TCPSocket_Read(bytes_to_read_), |
| 235 base::Bind(&TCPSocketResourceBase::OnPluginMsgReadReply, | 239 base::Bind(&TCPSocketResourceBase::OnPluginMsgReadReply, |
| 236 base::Unretained(this))); | 240 base::Unretained(this)), |
| 241 callback); |
| 237 return PP_OK_COMPLETIONPENDING; | 242 return PP_OK_COMPLETIONPENDING; |
| 238 } | 243 } |
| 239 | 244 |
| 240 int32_t TCPSocketResourceBase::WriteImpl( | 245 int32_t TCPSocketResourceBase::WriteImpl( |
| 241 const char* buffer, | 246 const char* buffer, |
| 242 int32_t bytes_to_write, | 247 int32_t bytes_to_write, |
| 243 scoped_refptr<TrackedCallback> callback) { | 248 scoped_refptr<TrackedCallback> callback) { |
| 244 if (!buffer || bytes_to_write <= 0) | 249 if (!buffer || bytes_to_write <= 0) |
| 245 return PP_ERROR_BADARGUMENT; | 250 return PP_ERROR_BADARGUMENT; |
| 246 | 251 |
| 247 if (!state_.IsConnected()) | 252 if (!state_.IsConnected()) |
| 248 return PP_ERROR_FAILED; | 253 return PP_ERROR_FAILED; |
| 249 if (TrackedCallback::IsPending(write_callback_) || | 254 if (TrackedCallback::IsPending(write_callback_) || |
| 250 state_.IsPending(TCPSocketState::SSL_CONNECT)) | 255 state_.IsPending(TCPSocketState::SSL_CONNECT)) |
| 251 return PP_ERROR_INPROGRESS; | 256 return PP_ERROR_INPROGRESS; |
| 252 | 257 |
| 253 if (bytes_to_write > kMaxWriteSize) | 258 if (bytes_to_write > kMaxWriteSize) |
| 254 bytes_to_write = kMaxWriteSize; | 259 bytes_to_write = kMaxWriteSize; |
| 255 | 260 |
| 256 write_callback_ = callback; | 261 write_callback_ = callback; |
| 257 | 262 |
| 258 Call<PpapiPluginMsg_TCPSocket_WriteReply>( | 263 Call<PpapiPluginMsg_TCPSocket_WriteReply>( |
| 259 BROWSER, | 264 BROWSER, |
| 260 PpapiHostMsg_TCPSocket_Write(std::string(buffer, bytes_to_write)), | 265 PpapiHostMsg_TCPSocket_Write(std::string(buffer, bytes_to_write)), |
| 261 base::Bind(&TCPSocketResourceBase::OnPluginMsgWriteReply, | 266 base::Bind(&TCPSocketResourceBase::OnPluginMsgWriteReply, |
| 262 base::Unretained(this))); | 267 base::Unretained(this)), |
| 268 callback); |
| 263 return PP_OK_COMPLETIONPENDING; | 269 return PP_OK_COMPLETIONPENDING; |
| 264 } | 270 } |
| 265 | 271 |
| 266 int32_t TCPSocketResourceBase::ListenImpl( | 272 int32_t TCPSocketResourceBase::ListenImpl( |
| 267 int32_t backlog, | 273 int32_t backlog, |
| 268 scoped_refptr<TrackedCallback> callback) { | 274 scoped_refptr<TrackedCallback> callback) { |
| 269 if (backlog <= 0) | 275 if (backlog <= 0) |
| 270 return PP_ERROR_BADARGUMENT; | 276 return PP_ERROR_BADARGUMENT; |
| 271 if (state_.IsPending(TCPSocketState::LISTEN)) | 277 if (state_.IsPending(TCPSocketState::LISTEN)) |
| 272 return PP_ERROR_INPROGRESS; | 278 return PP_ERROR_INPROGRESS; |
| 273 if (!state_.IsValidTransition(TCPSocketState::LISTEN)) | 279 if (!state_.IsValidTransition(TCPSocketState::LISTEN)) |
| 274 return PP_ERROR_FAILED; | 280 return PP_ERROR_FAILED; |
| 275 | 281 |
| 276 listen_callback_ = callback; | 282 listen_callback_ = callback; |
| 277 state_.SetPendingTransition(TCPSocketState::LISTEN); | 283 state_.SetPendingTransition(TCPSocketState::LISTEN); |
| 278 | 284 |
| 279 Call<PpapiPluginMsg_TCPSocket_ListenReply>( | 285 Call<PpapiPluginMsg_TCPSocket_ListenReply>( |
| 280 BROWSER, | 286 BROWSER, |
| 281 PpapiHostMsg_TCPSocket_Listen(backlog), | 287 PpapiHostMsg_TCPSocket_Listen(backlog), |
| 282 base::Bind(&TCPSocketResourceBase::OnPluginMsgListenReply, | 288 base::Bind(&TCPSocketResourceBase::OnPluginMsgListenReply, |
| 283 base::Unretained(this))); | 289 base::Unretained(this)), |
| 290 callback); |
| 284 return PP_OK_COMPLETIONPENDING; | 291 return PP_OK_COMPLETIONPENDING; |
| 285 } | 292 } |
| 286 | 293 |
| 287 int32_t TCPSocketResourceBase::AcceptImpl( | 294 int32_t TCPSocketResourceBase::AcceptImpl( |
| 288 PP_Resource* accepted_tcp_socket, | 295 PP_Resource* accepted_tcp_socket, |
| 289 scoped_refptr<TrackedCallback> callback) { | 296 scoped_refptr<TrackedCallback> callback) { |
| 290 if (!accepted_tcp_socket) | 297 if (!accepted_tcp_socket) |
| 291 return PP_ERROR_BADARGUMENT; | 298 return PP_ERROR_BADARGUMENT; |
| 292 if (TrackedCallback::IsPending(accept_callback_)) | 299 if (TrackedCallback::IsPending(accept_callback_)) |
| 293 return PP_ERROR_INPROGRESS; | 300 return PP_ERROR_INPROGRESS; |
| 294 if (state_.state() != TCPSocketState::LISTENING) | 301 if (state_.state() != TCPSocketState::LISTENING) |
| 295 return PP_ERROR_FAILED; | 302 return PP_ERROR_FAILED; |
| 296 | 303 |
| 297 accept_callback_ = callback; | 304 accept_callback_ = callback; |
| 298 accepted_tcp_socket_ = accepted_tcp_socket; | 305 accepted_tcp_socket_ = accepted_tcp_socket; |
| 299 | 306 |
| 300 Call<PpapiPluginMsg_TCPSocket_AcceptReply>( | 307 Call<PpapiPluginMsg_TCPSocket_AcceptReply>( |
| 301 BROWSER, | 308 BROWSER, |
| 302 PpapiHostMsg_TCPSocket_Accept(), | 309 PpapiHostMsg_TCPSocket_Accept(), |
| 303 base::Bind(&TCPSocketResourceBase::OnPluginMsgAcceptReply, | 310 base::Bind(&TCPSocketResourceBase::OnPluginMsgAcceptReply, |
| 304 base::Unretained(this))); | 311 base::Unretained(this)), |
| 312 callback); |
| 305 return PP_OK_COMPLETIONPENDING; | 313 return PP_OK_COMPLETIONPENDING; |
| 306 } | 314 } |
| 307 | 315 |
| 308 void TCPSocketResourceBase::CloseImpl() { | 316 void TCPSocketResourceBase::CloseImpl() { |
| 309 if (state_.state() == TCPSocketState::CLOSED) | 317 if (state_.state() == TCPSocketState::CLOSED) |
| 310 return; | 318 return; |
| 311 | 319 |
| 312 state_.DoTransition(TCPSocketState::CLOSE, true); | 320 state_.DoTransition(TCPSocketState::CLOSE, true); |
| 313 | 321 |
| 314 Post(BROWSER, PpapiHostMsg_TCPSocket_Close()); | 322 Post(BROWSER, PpapiHostMsg_TCPSocket_Close()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 return PP_ERROR_BADARGUMENT; | 364 return PP_ERROR_BADARGUMENT; |
| 357 } | 365 } |
| 358 } | 366 } |
| 359 | 367 |
| 360 set_option_callbacks_.push(callback); | 368 set_option_callbacks_.push(callback); |
| 361 | 369 |
| 362 Call<PpapiPluginMsg_TCPSocket_SetOptionReply>( | 370 Call<PpapiPluginMsg_TCPSocket_SetOptionReply>( |
| 363 BROWSER, | 371 BROWSER, |
| 364 PpapiHostMsg_TCPSocket_SetOption(name, option_data), | 372 PpapiHostMsg_TCPSocket_SetOption(name, option_data), |
| 365 base::Bind(&TCPSocketResourceBase::OnPluginMsgSetOptionReply, | 373 base::Bind(&TCPSocketResourceBase::OnPluginMsgSetOptionReply, |
| 366 base::Unretained(this))); | 374 base::Unretained(this)), |
| 375 callback); |
| 367 return PP_OK_COMPLETIONPENDING; | 376 return PP_OK_COMPLETIONPENDING; |
| 368 } | 377 } |
| 369 | 378 |
| 370 void TCPSocketResourceBase::PostAbortIfNecessary( | 379 void TCPSocketResourceBase::PostAbortIfNecessary( |
| 371 scoped_refptr<TrackedCallback>* callback) { | 380 scoped_refptr<TrackedCallback>* callback) { |
| 372 if (TrackedCallback::IsPending(*callback)) | 381 if (TrackedCallback::IsPending(*callback)) |
| 373 (*callback)->PostAbort(); | 382 (*callback)->PostAbort(); |
| 374 } | 383 } |
| 375 | 384 |
| 376 void TCPSocketResourceBase::OnPluginMsgBindReply( | 385 void TCPSocketResourceBase::OnPluginMsgBindReply( |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 } | 521 } |
| 513 | 522 |
| 514 void TCPSocketResourceBase::RunCallback(scoped_refptr<TrackedCallback> callback, | 523 void TCPSocketResourceBase::RunCallback(scoped_refptr<TrackedCallback> callback, |
| 515 int32_t pp_result) { | 524 int32_t pp_result) { |
| 516 callback->Run(ConvertNetworkAPIErrorForCompatibility( | 525 callback->Run(ConvertNetworkAPIErrorForCompatibility( |
| 517 pp_result, version_ == TCP_SOCKET_VERSION_PRIVATE)); | 526 pp_result, version_ == TCP_SOCKET_VERSION_PRIVATE)); |
| 518 } | 527 } |
| 519 | 528 |
| 520 } // namespace ppapi | 529 } // namespace ppapi |
| 521 } // namespace proxy | 530 } // namespace proxy |
| OLD | NEW |