| 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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 int result = BeginSSL(); | 180 int result = BeginSSL(); |
| 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 : read_callback_(NULL), | 190 : old_read_callback_(NULL), |
| 191 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() { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 } | 283 } |
| 284 | 284 |
| 285 base::TimeDelta TransportSocket::GetConnectTimeMicros() const { | 285 base::TimeDelta TransportSocket::GetConnectTimeMicros() const { |
| 286 NOTREACHED(); | 286 NOTREACHED(); |
| 287 return base::TimeDelta::FromMicroseconds(-1); | 287 return base::TimeDelta::FromMicroseconds(-1); |
| 288 } | 288 } |
| 289 | 289 |
| 290 int TransportSocket::Read(net::IOBuffer* buf, int buf_len, | 290 int TransportSocket::Read(net::IOBuffer* buf, int buf_len, |
| 291 net::OldCompletionCallback* callback) { | 291 net::OldCompletionCallback* callback) { |
| 292 DCHECK(buf); | 292 DCHECK(buf); |
| 293 DCHECK(!read_callback_); | 293 DCHECK(!old_read_callback_ && read_callback_.is_null()); |
| 294 DCHECK(!read_buffer_.get()); | 294 DCHECK(!read_buffer_.get()); |
| 295 int result = socket_->Recv(buf->data(), buf_len); | 295 int result = socket_->Recv(buf->data(), buf_len); |
| 296 if (result < 0) { | 296 if (result < 0) { |
| 297 result = net::MapSystemError(socket_->GetError()); |
| 298 if (result == net::ERR_IO_PENDING) { |
| 299 old_read_callback_ = callback; |
| 300 read_buffer_ = buf; |
| 301 read_buffer_len_ = buf_len; |
| 302 } |
| 303 } |
| 304 if (result != net::ERR_IO_PENDING) |
| 305 was_used_to_convey_data_ = true; |
| 306 return result; |
| 307 } |
| 308 int TransportSocket::Read(net::IOBuffer* buf, int buf_len, |
| 309 const net::CompletionCallback& callback) { |
| 310 DCHECK(buf); |
| 311 DCHECK(!old_read_callback_ && read_callback_.is_null()); |
| 312 DCHECK(!read_buffer_.get()); |
| 313 int result = socket_->Recv(buf->data(), buf_len); |
| 314 if (result < 0) { |
| 297 result = net::MapSystemError(socket_->GetError()); | 315 result = net::MapSystemError(socket_->GetError()); |
| 298 if (result == net::ERR_IO_PENDING) { | 316 if (result == net::ERR_IO_PENDING) { |
| 299 read_callback_ = callback; | 317 read_callback_ = callback; |
| 300 read_buffer_ = buf; | 318 read_buffer_ = buf; |
| 301 read_buffer_len_ = buf_len; | 319 read_buffer_len_ = buf_len; |
| 302 } | 320 } |
| 303 } | 321 } |
| 304 if (result != net::ERR_IO_PENDING) | 322 if (result != net::ERR_IO_PENDING) |
| 305 was_used_to_convey_data_ = true; | 323 was_used_to_convey_data_ = true; |
| 306 return result; | 324 return result; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 329 // Not implemented. | 347 // Not implemented. |
| 330 return false; | 348 return false; |
| 331 } | 349 } |
| 332 | 350 |
| 333 bool TransportSocket::SetSendBufferSize(int32 size) { | 351 bool TransportSocket::SetSendBufferSize(int32 size) { |
| 334 // Not implemented. | 352 // Not implemented. |
| 335 return false; | 353 return false; |
| 336 } | 354 } |
| 337 | 355 |
| 338 void TransportSocket::OnReadEvent(talk_base::AsyncSocket* socket) { | 356 void TransportSocket::OnReadEvent(talk_base::AsyncSocket* socket) { |
| 339 if (read_callback_) { | 357 if (old_read_callback_ || !read_callback_.is_null()) { |
| 340 DCHECK(read_buffer_.get()); | 358 DCHECK(read_buffer_.get()); |
| 341 net::OldCompletionCallback* callback = read_callback_; | 359 net::OldCompletionCallback* old_callback = old_read_callback_; |
| 360 net::CompletionCallback callback = read_callback_; |
| 342 scoped_refptr<net::IOBuffer> buffer = read_buffer_; | 361 scoped_refptr<net::IOBuffer> buffer = read_buffer_; |
| 343 int buffer_len = read_buffer_len_; | 362 int buffer_len = read_buffer_len_; |
| 344 | 363 |
| 345 read_callback_ = NULL; | 364 old_read_callback_ = NULL; |
| 365 read_callback_.Reset(); |
| 346 read_buffer_ = NULL; | 366 read_buffer_ = NULL; |
| 347 read_buffer_len_ = 0; | 367 read_buffer_len_ = 0; |
| 348 | 368 |
| 349 int result = socket_->Recv(buffer->data(), buffer_len); | 369 int result = socket_->Recv(buffer->data(), buffer_len); |
| 350 if (result < 0) { | 370 if (result < 0) { |
| 351 result = net::MapSystemError(socket_->GetError()); | 371 result = net::MapSystemError(socket_->GetError()); |
| 352 if (result == net::ERR_IO_PENDING) { | 372 if (result == net::ERR_IO_PENDING) { |
| 373 old_read_callback_ = old_callback; |
| 353 read_callback_ = callback; | 374 read_callback_ = callback; |
| 354 read_buffer_ = buffer; | 375 read_buffer_ = buffer; |
| 355 read_buffer_len_ = buffer_len; | 376 read_buffer_len_ = buffer_len; |
| 356 return; | 377 return; |
| 357 } | 378 } |
| 358 } | 379 } |
| 359 was_used_to_convey_data_ = true; | 380 was_used_to_convey_data_ = true; |
| 360 callback->RunWithParams(Tuple1<int>(result)); | 381 if (old_callback) |
| 382 old_callback->RunWithParams(Tuple1<int>(result)); |
| 383 else |
| 384 callback.Run(result); |
| 361 } | 385 } |
| 362 } | 386 } |
| 363 | 387 |
| 364 void TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { | 388 void TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { |
| 365 if (write_callback_) { | 389 if (write_callback_) { |
| 366 DCHECK(write_buffer_.get()); | 390 DCHECK(write_buffer_.get()); |
| 367 net::OldCompletionCallback* callback = write_callback_; | 391 net::OldCompletionCallback* callback = write_callback_; |
| 368 scoped_refptr<net::IOBuffer> buffer = write_buffer_; | 392 scoped_refptr<net::IOBuffer> buffer = write_buffer_; |
| 369 int buffer_len = write_buffer_len_; | 393 int buffer_len = write_buffer_len_; |
| 370 | 394 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 381 write_buffer_len_ = buffer_len; | 405 write_buffer_len_ = buffer_len; |
| 382 return; | 406 return; |
| 383 } | 407 } |
| 384 } | 408 } |
| 385 was_used_to_convey_data_ = true; | 409 was_used_to_convey_data_ = true; |
| 386 callback->RunWithParams(Tuple1<int>(result)); | 410 callback->RunWithParams(Tuple1<int>(result)); |
| 387 } | 411 } |
| 388 } | 412 } |
| 389 | 413 |
| 390 } // namespace remoting | 414 } // namespace remoting |
| OLD | NEW |