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 old_write_callback_(NULL), | 191 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(!old_write_callback_ && write_callback_.is_null()); | 330 DCHECK(!write_callback_); |
331 DCHECK(!write_buffer_.get()); | |
332 int result = socket_->Send(buf->data(), buf_len); | |
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()); | 331 DCHECK(!write_buffer_.get()); |
350 int result = socket_->Send(buf->data(), buf_len); | 332 int result = socket_->Send(buf->data(), buf_len); |
351 if (result < 0) { | 333 if (result < 0) { |
352 result = net::MapSystemError(socket_->GetError()); | 334 result = net::MapSystemError(socket_->GetError()); |
353 if (result == net::ERR_IO_PENDING) { | 335 if (result == net::ERR_IO_PENDING) { |
354 write_callback_ = callback; | 336 write_callback_ = callback; |
355 write_buffer_ = buf; | 337 write_buffer_ = buf; |
356 write_buffer_len_ = buf_len; | 338 write_buffer_len_ = buf_len; |
357 } | 339 } |
358 } | 340 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 } | 379 } |
398 was_used_to_convey_data_ = true; | 380 was_used_to_convey_data_ = true; |
399 if (old_callback) | 381 if (old_callback) |
400 old_callback->RunWithParams(Tuple1<int>(result)); | 382 old_callback->RunWithParams(Tuple1<int>(result)); |
401 else | 383 else |
402 callback.Run(result); | 384 callback.Run(result); |
403 } | 385 } |
404 } | 386 } |
405 | 387 |
406 void TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { | 388 void TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { |
407 if (old_write_callback_ || !write_callback_.is_null()) { | 389 if (write_callback_) { |
408 DCHECK(write_buffer_.get()); | 390 DCHECK(write_buffer_.get()); |
409 net::OldCompletionCallback* old_callback = old_write_callback_; | 391 net::OldCompletionCallback* callback = write_callback_; |
410 net::CompletionCallback callback = write_callback_; | |
411 scoped_refptr<net::IOBuffer> buffer = write_buffer_; | 392 scoped_refptr<net::IOBuffer> buffer = write_buffer_; |
412 int buffer_len = write_buffer_len_; | 393 int buffer_len = write_buffer_len_; |
413 | 394 |
414 old_write_callback_ = NULL; | 395 write_callback_ = NULL; |
415 write_callback_.Reset(); | |
416 write_buffer_ = NULL; | 396 write_buffer_ = NULL; |
417 write_buffer_len_ = 0; | 397 write_buffer_len_ = 0; |
418 | 398 |
419 int result = socket_->Send(buffer->data(), buffer_len); | 399 int result = socket_->Send(buffer->data(), buffer_len); |
420 if (result < 0) { | 400 if (result < 0) { |
421 result = net::MapSystemError(socket_->GetError()); | 401 result = net::MapSystemError(socket_->GetError()); |
422 if (result == net::ERR_IO_PENDING) { | 402 if (result == net::ERR_IO_PENDING) { |
423 old_write_callback_ = old_callback; | |
424 write_callback_ = callback; | 403 write_callback_ = callback; |
425 write_buffer_ = buffer; | 404 write_buffer_ = buffer; |
426 write_buffer_len_ = buffer_len; | 405 write_buffer_len_ = buffer_len; |
427 return; | 406 return; |
428 } | 407 } |
429 } | 408 } |
430 was_used_to_convey_data_ = true; | 409 was_used_to_convey_data_ = true; |
431 if (old_callback) | 410 callback->RunWithParams(Tuple1<int>(result)); |
432 old_callback->RunWithParams(Tuple1<int>(result)); | |
433 else | |
434 callback.Run(result); | |
435 } | 411 } |
436 } | 412 } |
437 | 413 |
438 } // namespace remoting | 414 } // namespace remoting |
OLD | NEW |