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 "remoting/jingle_glue/ssl_socket_adapter.h" | 5 #include "remoting/jingle_glue/ssl_socket_adapter.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "jingle/glue/utils.h" | 10 #include "jingle/glue/utils.h" |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 if (0 != result) { | 181 if (0 != result) { |
182 // TODO(zork): Handle this case gracefully. | 182 // TODO(zork): Handle this case gracefully. |
183 LOG(WARNING) << "BeginSSL() failed with " << result; | 183 LOG(WARNING) << "BeginSSL() failed with " << result; |
184 } | 184 } |
185 } | 185 } |
186 } | 186 } |
187 | 187 |
188 TransportSocket::TransportSocket(talk_base::AsyncSocket* socket, | 188 TransportSocket::TransportSocket(talk_base::AsyncSocket* socket, |
189 SSLSocketAdapter *ssl_adapter) | 189 SSLSocketAdapter *ssl_adapter) |
190 : old_read_callback_(NULL), | 190 : old_read_callback_(NULL), |
191 write_callback_(NULL), | 191 old_write_callback_(NULL), |
192 read_buffer_len_(0), | 192 read_buffer_len_(0), |
193 write_buffer_len_(0), | 193 write_buffer_len_(0), |
194 socket_(socket), | 194 socket_(socket), |
195 was_used_to_convey_data_(false) { | 195 was_used_to_convey_data_(false) { |
196 socket_->SignalReadEvent.connect(this, &TransportSocket::OnReadEvent); | 196 socket_->SignalReadEvent.connect(this, &TransportSocket::OnReadEvent); |
197 socket_->SignalWriteEvent.connect(this, &TransportSocket::OnWriteEvent); | 197 socket_->SignalWriteEvent.connect(this, &TransportSocket::OnWriteEvent); |
198 } | 198 } |
199 | 199 |
200 TransportSocket::~TransportSocket() { | 200 TransportSocket::~TransportSocket() { |
201 } | 201 } |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 } | 320 } |
321 } | 321 } |
322 if (result != net::ERR_IO_PENDING) | 322 if (result != net::ERR_IO_PENDING) |
323 was_used_to_convey_data_ = true; | 323 was_used_to_convey_data_ = true; |
324 return result; | 324 return result; |
325 } | 325 } |
326 | 326 |
327 int TransportSocket::Write(net::IOBuffer* buf, int buf_len, | 327 int TransportSocket::Write(net::IOBuffer* buf, int buf_len, |
328 net::OldCompletionCallback* callback) { | 328 net::OldCompletionCallback* callback) { |
329 DCHECK(buf); | 329 DCHECK(buf); |
330 DCHECK(!write_callback_); | 330 DCHECK(!old_write_callback_ && write_callback_.is_null()); |
331 DCHECK(!write_buffer_.get()); | 331 DCHECK(!write_buffer_.get()); |
332 int result = socket_->Send(buf->data(), buf_len); | 332 int result = socket_->Send(buf->data(), buf_len); |
333 if (result < 0) { | 333 if (result < 0) { |
| 334 result = net::MapSystemError(socket_->GetError()); |
| 335 if (result == net::ERR_IO_PENDING) { |
| 336 old_write_callback_ = callback; |
| 337 write_buffer_ = buf; |
| 338 write_buffer_len_ = buf_len; |
| 339 } |
| 340 } |
| 341 if (result != net::ERR_IO_PENDING) |
| 342 was_used_to_convey_data_ = true; |
| 343 return result; |
| 344 } |
| 345 int TransportSocket::Write(net::IOBuffer* buf, int buf_len, |
| 346 const net::CompletionCallback& callback) { |
| 347 DCHECK(buf); |
| 348 DCHECK(!old_write_callback_ && write_callback_.is_null()); |
| 349 DCHECK(!write_buffer_.get()); |
| 350 int result = socket_->Send(buf->data(), buf_len); |
| 351 if (result < 0) { |
334 result = net::MapSystemError(socket_->GetError()); | 352 result = net::MapSystemError(socket_->GetError()); |
335 if (result == net::ERR_IO_PENDING) { | 353 if (result == net::ERR_IO_PENDING) { |
336 write_callback_ = callback; | 354 write_callback_ = callback; |
337 write_buffer_ = buf; | 355 write_buffer_ = buf; |
338 write_buffer_len_ = buf_len; | 356 write_buffer_len_ = buf_len; |
339 } | 357 } |
340 } | 358 } |
341 if (result != net::ERR_IO_PENDING) | 359 if (result != net::ERR_IO_PENDING) |
342 was_used_to_convey_data_ = true; | 360 was_used_to_convey_data_ = true; |
343 return result; | 361 return result; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 } | 397 } |
380 was_used_to_convey_data_ = true; | 398 was_used_to_convey_data_ = true; |
381 if (old_callback) | 399 if (old_callback) |
382 old_callback->RunWithParams(Tuple1<int>(result)); | 400 old_callback->RunWithParams(Tuple1<int>(result)); |
383 else | 401 else |
384 callback.Run(result); | 402 callback.Run(result); |
385 } | 403 } |
386 } | 404 } |
387 | 405 |
388 void TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { | 406 void TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { |
389 if (write_callback_) { | 407 if (old_write_callback_ || !write_callback_.is_null()) { |
390 DCHECK(write_buffer_.get()); | 408 DCHECK(write_buffer_.get()); |
391 net::OldCompletionCallback* callback = write_callback_; | 409 net::OldCompletionCallback* old_callback = old_write_callback_; |
| 410 net::CompletionCallback callback = write_callback_; |
392 scoped_refptr<net::IOBuffer> buffer = write_buffer_; | 411 scoped_refptr<net::IOBuffer> buffer = write_buffer_; |
393 int buffer_len = write_buffer_len_; | 412 int buffer_len = write_buffer_len_; |
394 | 413 |
395 write_callback_ = NULL; | 414 old_write_callback_ = NULL; |
| 415 write_callback_.Reset(); |
396 write_buffer_ = NULL; | 416 write_buffer_ = NULL; |
397 write_buffer_len_ = 0; | 417 write_buffer_len_ = 0; |
398 | 418 |
399 int result = socket_->Send(buffer->data(), buffer_len); | 419 int result = socket_->Send(buffer->data(), buffer_len); |
400 if (result < 0) { | 420 if (result < 0) { |
401 result = net::MapSystemError(socket_->GetError()); | 421 result = net::MapSystemError(socket_->GetError()); |
402 if (result == net::ERR_IO_PENDING) { | 422 if (result == net::ERR_IO_PENDING) { |
| 423 old_write_callback_ = old_callback; |
403 write_callback_ = callback; | 424 write_callback_ = callback; |
404 write_buffer_ = buffer; | 425 write_buffer_ = buffer; |
405 write_buffer_len_ = buffer_len; | 426 write_buffer_len_ = buffer_len; |
406 return; | 427 return; |
407 } | 428 } |
408 } | 429 } |
409 was_used_to_convey_data_ = true; | 430 was_used_to_convey_data_ = true; |
410 callback->RunWithParams(Tuple1<int>(result)); | 431 if (old_callback) |
| 432 old_callback->RunWithParams(Tuple1<int>(result)); |
| 433 else |
| 434 callback.Run(result); |
411 } | 435 } |
412 } | 436 } |
413 | 437 |
414 } // namespace remoting | 438 } // namespace remoting |
OLD | NEW |