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 |