OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "device/bluetooth/bluetooth_socket_win.h" | 5 #include "device/bluetooth/bluetooth_socket_win.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 result->device_address_ = service_record_win->address(); | 64 result->device_address_ = service_record_win->address(); |
65 if (service_record.SupportsRfcomm()) { | 65 if (service_record.SupportsRfcomm()) { |
66 result->supports_rfcomm_ = true; | 66 result->supports_rfcomm_ = true; |
67 result->rfcomm_channel_ = service_record_win->rfcomm_channel(); | 67 result->rfcomm_channel_ = service_record_win->rfcomm_channel(); |
68 result->bth_addr_ = service_record_win->bth_addr(); | 68 result->bth_addr_ = service_record_win->bth_addr(); |
69 } | 69 } |
70 | 70 |
71 return result; | 71 return result; |
72 } | 72 } |
73 | 73 |
| 74 // static |
| 75 scoped_refptr<BluetoothSocketWin> BluetoothSocketWin::CreateBluetoothSocket( |
| 76 scoped_ptr<net::TCPSocket> existing, |
| 77 scoped_refptr<base::SequencedTaskRunner> ui_task_runner, |
| 78 scoped_refptr<BluetoothSocketThreadWin> socket_thread, |
| 79 net::NetLog* net_log, |
| 80 const net::NetLog::Source& source) { |
| 81 DCHECK(ui_task_runner->RunsTasksOnCurrentThread()); |
| 82 |
| 83 scoped_refptr<BluetoothSocketWin> result( |
| 84 new BluetoothSocketWin(ui_task_runner, socket_thread, net_log, source)); |
| 85 result->tcp_socket_ = existing.Pass(); |
| 86 |
| 87 return result; |
| 88 } |
| 89 |
74 BluetoothSocketWin::BluetoothSocketWin( | 90 BluetoothSocketWin::BluetoothSocketWin( |
75 scoped_refptr<base::SequencedTaskRunner> ui_task_runner, | 91 scoped_refptr<base::SequencedTaskRunner> ui_task_runner, |
76 scoped_refptr<BluetoothSocketThreadWin> socket_thread, | 92 scoped_refptr<BluetoothSocketThreadWin> socket_thread, |
77 net::NetLog* net_log, | 93 net::NetLog* net_log, |
78 const net::NetLog::Source& source) | 94 const net::NetLog::Source& source) |
79 : ui_task_runner_(ui_task_runner), | 95 : ui_task_runner_(ui_task_runner), |
80 socket_thread_(socket_thread), | 96 socket_thread_(socket_thread), |
81 net_log_(net_log), | 97 net_log_(net_log), |
82 source_(source), | 98 source_(source), |
83 supports_rfcomm_(false), | 99 supports_rfcomm_(false), |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 &BluetoothSocketWin::DoSend, | 168 &BluetoothSocketWin::DoSend, |
153 this, | 169 this, |
154 buffer, | 170 buffer, |
155 buffer_size, | 171 buffer_size, |
156 base::Bind( | 172 base::Bind( |
157 &BluetoothSocketWin::PostSendCompletion, this, success_callback), | 173 &BluetoothSocketWin::PostSendCompletion, this, success_callback), |
158 base::Bind( | 174 base::Bind( |
159 &BluetoothSocketWin::PostErrorCompletion, this, error_callback))); | 175 &BluetoothSocketWin::PostErrorCompletion, this, error_callback))); |
160 } | 176 } |
161 | 177 |
| 178 void BluetoothSocketWin::Accept( |
| 179 const BluetoothSocketWin::OnAcceptCallback& on_accept_callback) { |
| 180 DCHECK(on_accept_callback_.is_null()); |
| 181 on_accept_callback_ = on_accept_callback; |
| 182 socket_thread_->task_runner()->PostTask( |
| 183 FROM_HERE, |
| 184 base::Bind(&BluetoothSocketWin::DoAccept, this)); |
| 185 } |
| 186 |
162 void BluetoothSocketWin::DoClose() { | 187 void BluetoothSocketWin::DoClose() { |
163 DCHECK(socket_thread_->task_runner()->RunsTasksOnCurrentThread()); | 188 DCHECK(socket_thread_->task_runner()->RunsTasksOnCurrentThread()); |
164 base::ThreadRestrictions::AssertIOAllowed(); | 189 base::ThreadRestrictions::AssertIOAllowed(); |
165 | 190 |
166 if (tcp_socket_) { | 191 if (tcp_socket_) { |
167 tcp_socket_->Close(); | 192 tcp_socket_->Close(); |
168 tcp_socket_.reset(NULL); | 193 tcp_socket_.reset(NULL); |
169 } | 194 } |
170 | 195 |
171 // Note: Closing |tcp_socket_| above released all potential pending | 196 // Note: Closing |tcp_socket_| above released all potential pending |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 ui_task_runner_->PostTask(FROM_HERE, | 417 ui_task_runner_->PostTask(FROM_HERE, |
393 base::Bind(callback, reason, error_message)); | 418 base::Bind(callback, reason, error_message)); |
394 } | 419 } |
395 | 420 |
396 void BluetoothSocketWin::PostSendCompletion( | 421 void BluetoothSocketWin::PostSendCompletion( |
397 const SendCompletionCallback& callback, | 422 const SendCompletionCallback& callback, |
398 int bytes_written) { | 423 int bytes_written) { |
399 ui_task_runner_->PostTask(FROM_HERE, base::Bind(callback, bytes_written)); | 424 ui_task_runner_->PostTask(FROM_HERE, base::Bind(callback, bytes_written)); |
400 } | 425 } |
401 | 426 |
| 427 void BluetoothSocketWin::DoAccept() { |
| 428 DCHECK(socket_thread_->task_runner()->RunsTasksOnCurrentThread()); |
| 429 int result = tcp_socket_->Accept( |
| 430 &accept_socket_, |
| 431 &accept_address_, |
| 432 base::Bind(&BluetoothSocketWin::OnAcceptOnSocketThread, this)); |
| 433 if (result != net::OK && result != net::ERR_IO_PENDING) |
| 434 LOG(WARNING) << "Failed to accept, net err=" << result; |
| 435 } |
| 436 |
| 437 void BluetoothSocketWin::OnAcceptOnSocketThread(int accept_result) { |
| 438 DCHECK(socket_thread_->task_runner()->RunsTasksOnCurrentThread()); |
| 439 if (accept_result != net::OK) { |
| 440 LOG(WARNING) << "OnAccept error, net err=" << accept_result; |
| 441 return; |
| 442 } |
| 443 |
| 444 ui_task_runner_->PostTask( |
| 445 FROM_HERE, |
| 446 base::Bind(&BluetoothSocketWin::OnAcceptOnUI, |
| 447 this, |
| 448 base::Passed(&accept_socket_), |
| 449 accept_address_)); |
| 450 DoAccept(); |
| 451 } |
| 452 |
| 453 void BluetoothSocketWin::OnAcceptOnUI( |
| 454 scoped_ptr<net::TCPSocket> accept_socket, |
| 455 const net::IPEndPoint& peer_address) { |
| 456 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); |
| 457 |
| 458 on_accept_callback_.Run( |
| 459 CreateBluetoothSocket( |
| 460 accept_socket.Pass(), |
| 461 ui_task_runner_, |
| 462 socket_thread_, |
| 463 net_log_, |
| 464 source_), |
| 465 peer_address); |
| 466 } |
| 467 |
402 } // namespace device | 468 } // namespace device |
OLD | NEW |