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 <objbase.h> | 7 #include <objbase.h> |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
13 #include "base/sequenced_task_runner.h" | 13 #include "base/sequenced_task_runner.h" |
| 14 #include "base/strings/stringprintf.h" |
14 #include "base/strings/sys_string_conversions.h" | 15 #include "base/strings/sys_string_conversions.h" |
15 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
16 #include "base/threading/thread_restrictions.h" | 17 #include "base/threading/thread_restrictions.h" |
| 18 #include "device/bluetooth/bluetooth_device_win.h" |
17 #include "device/bluetooth/bluetooth_init_win.h" | 19 #include "device/bluetooth/bluetooth_init_win.h" |
18 #include "device/bluetooth/bluetooth_service_record_win.h" | 20 #include "device/bluetooth/bluetooth_service_record_win.h" |
19 #include "device/bluetooth/bluetooth_socket_thread.h" | 21 #include "device/bluetooth/bluetooth_socket_thread.h" |
20 #include "net/base/io_buffer.h" | 22 #include "net/base/io_buffer.h" |
21 #include "net/base/ip_endpoint.h" | 23 #include "net/base/ip_endpoint.h" |
22 #include "net/base/net_errors.h" | 24 #include "net/base/net_errors.h" |
23 #include "net/base/winsock_init.h" | 25 #include "net/base/winsock_init.h" |
24 | 26 |
25 namespace { | 27 namespace { |
26 | 28 |
27 const char kL2CAPNotSupported[] = "Bluetooth L2CAP protocal is not supported"; | 29 const char kL2CAPNotSupported[] = "Bluetooth L2CAP protocal is not supported"; |
28 const char kSocketAlreadyConnected[] = "Socket is already connected."; | 30 const char kSocketAlreadyConnected[] = "Socket is already connected."; |
29 const char kInvalidRfcommPort[] = "Invalid RFCCOMM port."; | 31 const char kInvalidRfcommPort[] = "Invalid RFCCOMM port."; |
30 const char kFailedToCreateSocket[] = "Failed to create socket."; | 32 const char kFailedToCreateSocket[] = "Failed to create socket."; |
31 const char kFailedToBindSocket[] = "Failed to bind socket."; | 33 const char kFailedToBindSocket[] = "Failed to bind socket."; |
32 const char kFailedToListenOnSocket[] = "Failed to listen on socket."; | 34 const char kFailedToListenOnSocket[] = "Failed to listen on socket."; |
33 const char kFailedToGetSockNameForSocket[] = "Failed to getsockname."; | 35 const char kFailedToGetSockNameForSocket[] = "Failed to getsockname."; |
34 const char kBadUuid[] = "Bad uuid."; | 36 const char kFailedToAccept[] = "Failed to accept."; |
| 37 const char kInvalidUUID[] = "Invalid UUID"; |
35 const char kWsaSetServiceError[] = "WSASetService error."; | 38 const char kWsaSetServiceError[] = "WSASetService error."; |
36 | 39 |
| 40 std::string IPEndPointToBluetoothAddress(const net::IPEndPoint& end_point) { |
| 41 if (end_point.address().size() != net::kBluetoothAddressSize) |
| 42 return std::string(); |
| 43 // The address is copied from BTH_ADDR field of SOCKADDR_BTH, which is a |
| 44 // 64-bit ULONGLONG that stores Bluetooth address in little-endian. Print in |
| 45 // reverse order to preserve the correct ordering. |
| 46 return base::StringPrintf("%02X:%02X:%02X:%02X:%02X:%02X", |
| 47 end_point.address()[5], |
| 48 end_point.address()[4], |
| 49 end_point.address()[3], |
| 50 end_point.address()[2], |
| 51 end_point.address()[1], |
| 52 end_point.address()[0]); |
| 53 } |
| 54 |
37 } // namespace | 55 } // namespace |
38 | 56 |
39 namespace device { | 57 namespace device { |
40 | 58 |
41 struct BluetoothSocketWin::ServiceRegData { | 59 struct BluetoothSocketWin::ServiceRegData { |
42 ServiceRegData() { | 60 ServiceRegData() { |
43 ZeroMemory(&address, sizeof(address)); | 61 ZeroMemory(&address, sizeof(address)); |
44 ZeroMemory(&address_info, sizeof(address_info)); | 62 ZeroMemory(&address_info, sizeof(address_info)); |
45 ZeroMemory(&uuid, sizeof(uuid)); | 63 ZeroMemory(&uuid, sizeof(uuid)); |
46 ZeroMemory(&service, sizeof(service)); | 64 ZeroMemory(&service, sizeof(service)); |
(...skipping 26 matching lines...) Expand all Loading... |
73 const net::NetLog::Source& source) | 91 const net::NetLog::Source& source) |
74 : BluetoothSocketNet(ui_task_runner, socket_thread, net_log, source), | 92 : BluetoothSocketNet(ui_task_runner, socket_thread, net_log, source), |
75 supports_rfcomm_(false), | 93 supports_rfcomm_(false), |
76 rfcomm_channel_(-1), | 94 rfcomm_channel_(-1), |
77 bth_addr_(BTH_ADDR_NULL) { | 95 bth_addr_(BTH_ADDR_NULL) { |
78 } | 96 } |
79 | 97 |
80 BluetoothSocketWin::~BluetoothSocketWin() { | 98 BluetoothSocketWin::~BluetoothSocketWin() { |
81 } | 99 } |
82 | 100 |
83 void BluetoothSocketWin::StartService( | 101 void BluetoothSocketWin::Connect( |
| 102 const BluetoothDeviceWin* device, |
84 const BluetoothUUID& uuid, | 103 const BluetoothUUID& uuid, |
85 const std::string& name, | |
86 int rfcomm_channel, | |
87 const base::Closure& success_callback, | |
88 const ErrorCompletionCallback& error_callback, | |
89 const OnNewConnectionCallback& new_connection_callback) { | |
90 DCHECK(ui_task_runner()->RunsTasksOnCurrentThread()); | |
91 | |
92 socket_thread()->task_runner()->PostTask( | |
93 FROM_HERE, | |
94 base::Bind(&BluetoothSocketWin::DoStartService, | |
95 this, | |
96 uuid, | |
97 name, | |
98 rfcomm_channel, | |
99 success_callback, | |
100 error_callback, | |
101 new_connection_callback)); | |
102 } | |
103 | |
104 void BluetoothSocketWin::Connect( | |
105 const BluetoothServiceRecord& service_record, | |
106 const base::Closure& success_callback, | 104 const base::Closure& success_callback, |
107 const ErrorCompletionCallback& error_callback) { | 105 const ErrorCompletionCallback& error_callback) { |
108 DCHECK(ui_task_runner()->RunsTasksOnCurrentThread()); | 106 DCHECK(ui_task_runner()->RunsTasksOnCurrentThread()); |
| 107 DCHECK(device); |
| 108 |
| 109 if (!uuid.IsValid()) { |
| 110 error_callback.Run(kInvalidUUID); |
| 111 return; |
| 112 } |
109 | 113 |
110 const BluetoothServiceRecordWin* service_record_win = | 114 const BluetoothServiceRecordWin* service_record_win = |
111 static_cast<const BluetoothServiceRecordWin*>(&service_record); | 115 device->GetServiceRecord(uuid); |
| 116 if (!service_record_win) { |
| 117 error_callback.Run(kInvalidUUID); |
| 118 return; |
| 119 } |
| 120 |
112 device_address_ = service_record_win->address(); | 121 device_address_ = service_record_win->address(); |
113 if (service_record.SupportsRfcomm()) { | 122 if (service_record_win->SupportsRfcomm()) { |
114 supports_rfcomm_ = true; | 123 supports_rfcomm_ = true; |
115 rfcomm_channel_ = service_record_win->rfcomm_channel(); | 124 rfcomm_channel_ = service_record_win->rfcomm_channel(); |
116 bth_addr_ = service_record_win->bth_addr(); | 125 bth_addr_ = service_record_win->bth_addr(); |
117 } | 126 } |
118 | 127 |
119 socket_thread()->task_runner()->PostTask( | 128 socket_thread()->task_runner()->PostTask( |
120 FROM_HERE, | 129 FROM_HERE, |
121 base::Bind( | 130 base::Bind( |
122 &BluetoothSocketWin::DoConnect, | 131 &BluetoothSocketWin::DoConnect, |
123 this, | 132 this, |
124 base::Bind(&BluetoothSocketWin::PostSuccess, this, success_callback), | 133 base::Bind(&BluetoothSocketWin::PostSuccess, this, success_callback), |
125 base::Bind( | 134 base::Bind( |
126 &BluetoothSocketWin::PostErrorCompletion, this, error_callback))); | 135 &BluetoothSocketWin::PostErrorCompletion, this, error_callback))); |
127 } | 136 } |
128 | 137 |
| 138 void BluetoothSocketWin::Listen(scoped_refptr<BluetoothAdapter> adapter, |
| 139 const BluetoothUUID& uuid, |
| 140 int rfcomm_channel, |
| 141 const base::Closure& success_callback, |
| 142 const ErrorCompletionCallback& error_callback) { |
| 143 DCHECK(ui_task_runner()->RunsTasksOnCurrentThread()); |
| 144 |
| 145 adapter_ = adapter; |
| 146 |
| 147 socket_thread()->task_runner()->PostTask( |
| 148 FROM_HERE, |
| 149 base::Bind(&BluetoothSocketWin::DoListen, |
| 150 this, |
| 151 uuid, |
| 152 rfcomm_channel, |
| 153 success_callback, |
| 154 error_callback)); |
| 155 } |
129 | 156 |
130 void BluetoothSocketWin::ResetData() { | 157 void BluetoothSocketWin::ResetData() { |
131 if (service_reg_data_) { | 158 if (service_reg_data_) { |
132 if (WSASetService(&service_reg_data_->service,RNRSERVICE_DELETE, 0) == | 159 if (WSASetService(&service_reg_data_->service,RNRSERVICE_DELETE, 0) == |
133 SOCKET_ERROR) { | 160 SOCKET_ERROR) { |
134 LOG(WARNING) << "Failed to unregister service."; | 161 LOG(WARNING) << "Failed to unregister service."; |
135 } | 162 } |
136 service_reg_data_.reset(); | 163 service_reg_data_.reset(); |
137 } | 164 } |
138 } | 165 } |
139 | 166 |
140 void BluetoothSocketWin::Accept( | 167 void BluetoothSocketWin::Accept( |
141 const AcceptCompletionCallback& success_callback, | 168 const AcceptCompletionCallback& success_callback, |
142 const ErrorCompletionCallback& error_callback) { | 169 const ErrorCompletionCallback& error_callback) { |
143 NOTIMPLEMENTED(); | 170 DCHECK(ui_task_runner()->RunsTasksOnCurrentThread()); |
| 171 |
| 172 socket_thread()->task_runner()->PostTask( |
| 173 FROM_HERE, |
| 174 base::Bind(&BluetoothSocketWin::DoAccept, |
| 175 this, |
| 176 success_callback, |
| 177 error_callback)); |
144 } | 178 } |
145 | 179 |
146 void BluetoothSocketWin::DoConnect( | 180 void BluetoothSocketWin::DoConnect( |
147 const base::Closure& success_callback, | 181 const base::Closure& success_callback, |
148 const ErrorCompletionCallback& error_callback) { | 182 const ErrorCompletionCallback& error_callback) { |
149 DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread()); | 183 DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread()); |
150 base::ThreadRestrictions::AssertIOAllowed(); | 184 base::ThreadRestrictions::AssertIOAllowed(); |
151 | 185 |
152 if (tcp_socket()) { | 186 if (tcp_socket()) { |
153 error_callback.Run(kSocketAlreadyConnected); | 187 error_callback.Run(kSocketAlreadyConnected); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 if (net_result != net::OK) { | 223 if (net_result != net::OK) { |
190 error_callback.Run("Error connecting to socket: " + | 224 error_callback.Run("Error connecting to socket: " + |
191 std::string(net::ErrorToString(net_result))); | 225 std::string(net::ErrorToString(net_result))); |
192 closesocket(socket_fd); | 226 closesocket(socket_fd); |
193 return; | 227 return; |
194 } | 228 } |
195 | 229 |
196 success_callback.Run(); | 230 success_callback.Run(); |
197 } | 231 } |
198 | 232 |
199 void BluetoothSocketWin::DoStartService( | 233 void BluetoothSocketWin::DoListen( |
200 const BluetoothUUID& uuid, | 234 const BluetoothUUID& uuid, |
201 const std::string& name, | |
202 int rfcomm_channel, | 235 int rfcomm_channel, |
203 const base::Closure& success_callback, | 236 const base::Closure& success_callback, |
204 const ErrorCompletionCallback& error_callback, | 237 const ErrorCompletionCallback& error_callback) { |
205 const OnNewConnectionCallback& new_connection_callback) { | |
206 DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread()); | 238 DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread()); |
207 DCHECK(!tcp_socket() && | 239 DCHECK(!tcp_socket() && !service_reg_data_); |
208 !service_reg_data_ && | |
209 on_new_connection_callback_.is_null()); | |
210 | 240 |
211 // The valid range is 0-30. 0 means BT_PORT_ANY and 1-30 are the | 241 // The valid range is 0-30. 0 means BT_PORT_ANY and 1-30 are the |
212 // valid RFCOMM port numbers of SOCKADDR_BTH. | 242 // valid RFCOMM port numbers of SOCKADDR_BTH. |
213 if (rfcomm_channel < 0 || rfcomm_channel > 30) { | 243 if (rfcomm_channel < 0 || rfcomm_channel > 30) { |
214 LOG(WARNING) << "Failed to start service: " | 244 LOG(WARNING) << "Failed to start service: " |
215 << "Invalid RFCCOMM port " << rfcomm_channel | 245 << "Invalid RFCCOMM port " << rfcomm_channel |
216 << ", uuid=" << uuid.value(); | 246 << ", uuid=" << uuid.value(); |
217 PostErrorCompletion(error_callback, kInvalidRfcommPort); | 247 PostErrorCompletion(error_callback, kInvalidRfcommPort); |
218 return; | 248 return; |
219 } | 249 } |
(...skipping 28 matching lines...) Expand all Loading... |
248 | 278 |
249 const int kListenBacklog = 5; | 279 const int kListenBacklog = 5; |
250 if (scoped_socket->Listen(kListenBacklog) < 0) { | 280 if (scoped_socket->Listen(kListenBacklog) < 0) { |
251 LOG(WARNING) << "Failed to start service: Listen" | 281 LOG(WARNING) << "Failed to start service: Listen" |
252 << "winsock err=" << WSAGetLastError(); | 282 << "winsock err=" << WSAGetLastError(); |
253 PostErrorCompletion(error_callback, kFailedToListenOnSocket); | 283 PostErrorCompletion(error_callback, kFailedToListenOnSocket); |
254 return; | 284 return; |
255 } | 285 } |
256 | 286 |
257 scoped_ptr<ServiceRegData> reg_data(new ServiceRegData); | 287 scoped_ptr<ServiceRegData> reg_data(new ServiceRegData); |
258 reg_data->name = base::UTF8ToUTF16(name); | 288 reg_data->name = base::UTF8ToUTF16(uuid.canonical_value()); |
259 | 289 |
260 if (getsockname(socket_fd, sock_addr, &sock_addr_len)) { | 290 if (getsockname(socket_fd, sock_addr, &sock_addr_len)) { |
261 LOG(WARNING) << "Failed to start service: getsockname, " | 291 LOG(WARNING) << "Failed to start service: getsockname, " |
262 << "winsock err=" << WSAGetLastError(); | 292 << "winsock err=" << WSAGetLastError(); |
263 PostErrorCompletion(error_callback, kFailedToGetSockNameForSocket); | 293 PostErrorCompletion(error_callback, kFailedToGetSockNameForSocket); |
264 return; | 294 return; |
265 } | 295 } |
266 reg_data->address = sa; | 296 reg_data->address = sa; |
267 | 297 |
268 reg_data->address_info.LocalAddr.iSockaddrLength = sizeof(sa); | 298 reg_data->address_info.LocalAddr.iSockaddrLength = sizeof(sa); |
269 reg_data->address_info.LocalAddr.lpSockaddr = | 299 reg_data->address_info.LocalAddr.lpSockaddr = |
270 reinterpret_cast<struct sockaddr*>(®_data->address); | 300 reinterpret_cast<struct sockaddr*>(®_data->address); |
271 reg_data->address_info.iSocketType = SOCK_STREAM; | 301 reg_data->address_info.iSocketType = SOCK_STREAM; |
272 reg_data->address_info.iProtocol = BTHPROTO_RFCOMM; | 302 reg_data->address_info.iProtocol = BTHPROTO_RFCOMM; |
273 | 303 |
274 base::string16 cannonical_uuid = L"{" + base::ASCIIToUTF16( | 304 base::string16 cannonical_uuid = L"{" + base::ASCIIToUTF16( |
275 uuid.canonical_value()) + L"}"; | 305 uuid.canonical_value()) + L"}"; |
276 if (!SUCCEEDED(CLSIDFromString(cannonical_uuid.c_str(), ®_data->uuid))) { | 306 if (!SUCCEEDED(CLSIDFromString(cannonical_uuid.c_str(), ®_data->uuid))) { |
277 LOG(WARNING) << "Failed to start service: " | 307 LOG(WARNING) << "Failed to start service: " |
278 << ", bad uuid=" << cannonical_uuid; | 308 << ", invalid uuid=" << cannonical_uuid; |
279 PostErrorCompletion(error_callback, kBadUuid); | 309 PostErrorCompletion(error_callback, kInvalidUUID); |
280 return; | 310 return; |
281 } | 311 } |
282 | 312 |
283 reg_data->service.dwSize = sizeof(WSAQUERYSET); | 313 reg_data->service.dwSize = sizeof(WSAQUERYSET); |
284 reg_data->service.lpszServiceInstanceName = | 314 reg_data->service.lpszServiceInstanceName = |
285 const_cast<LPWSTR>(reg_data->name.c_str()); | 315 const_cast<LPWSTR>(reg_data->name.c_str()); |
286 reg_data->service.lpServiceClassId = ®_data->uuid; | 316 reg_data->service.lpServiceClassId = ®_data->uuid; |
287 reg_data->service.dwNameSpace = NS_BTH; | 317 reg_data->service.dwNameSpace = NS_BTH; |
288 reg_data->service.dwNumberOfCsAddrs = 1; | 318 reg_data->service.dwNumberOfCsAddrs = 1; |
289 reg_data->service.lpcsaBuffer = ®_data->address_info; | 319 reg_data->service.lpcsaBuffer = ®_data->address_info; |
290 | 320 |
291 if (WSASetService(®_data->service, | 321 if (WSASetService(®_data->service, |
292 RNRSERVICE_REGISTER, 0) == SOCKET_ERROR) { | 322 RNRSERVICE_REGISTER, 0) == SOCKET_ERROR) { |
293 LOG(WARNING) << "Failed to register profile: WSASetService" | 323 LOG(WARNING) << "Failed to register profile: WSASetService" |
294 << "winsock err=" << WSAGetLastError(); | 324 << "winsock err=" << WSAGetLastError(); |
295 PostErrorCompletion(error_callback, kWsaSetServiceError); | 325 PostErrorCompletion(error_callback, kWsaSetServiceError); |
296 return; | 326 return; |
297 } | 327 } |
298 | 328 |
299 SetTCPSocket(scoped_socket.Pass()); | 329 SetTCPSocket(scoped_socket.Pass()); |
300 service_reg_data_ = reg_data.Pass(); | 330 service_reg_data_ = reg_data.Pass(); |
301 on_new_connection_callback_ = new_connection_callback; | |
302 DoAccept(); | |
303 | 331 |
304 PostSuccess(success_callback); | 332 PostSuccess(success_callback); |
305 } | 333 } |
306 | 334 |
307 void BluetoothSocketWin::DoAccept() { | 335 void BluetoothSocketWin::DoAccept( |
| 336 const AcceptCompletionCallback& success_callback, |
| 337 const ErrorCompletionCallback& error_callback) { |
308 DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread()); | 338 DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread()); |
309 int result = tcp_socket()->Accept( | 339 int result = tcp_socket()->Accept( |
310 &accept_socket_, | 340 &accept_socket_, |
311 &accept_address_, | 341 &accept_address_, |
312 base::Bind(&BluetoothSocketWin::OnAcceptOnSocketThread, this)); | 342 base::Bind(&BluetoothSocketWin::OnAcceptOnSocketThread, |
313 if (result != net::OK && result != net::ERR_IO_PENDING) | 343 this, |
| 344 success_callback, |
| 345 error_callback)); |
| 346 if (result != net::OK && result != net::ERR_IO_PENDING) { |
314 LOG(WARNING) << "Failed to accept, net err=" << result; | 347 LOG(WARNING) << "Failed to accept, net err=" << result; |
| 348 PostErrorCompletion(error_callback, kFailedToAccept); |
| 349 } |
315 } | 350 } |
316 | 351 |
317 void BluetoothSocketWin::OnAcceptOnSocketThread(int accept_result) { | 352 void BluetoothSocketWin::OnAcceptOnSocketThread( |
| 353 const AcceptCompletionCallback& success_callback, |
| 354 const ErrorCompletionCallback& error_callback, |
| 355 int accept_result) { |
318 DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread()); | 356 DCHECK(socket_thread()->task_runner()->RunsTasksOnCurrentThread()); |
319 if (accept_result != net::OK) { | 357 if (accept_result != net::OK) { |
320 LOG(WARNING) << "OnAccept error, net err=" << accept_result; | 358 LOG(WARNING) << "OnAccept error, net err=" << accept_result; |
| 359 PostErrorCompletion(error_callback, kFailedToAccept); |
321 return; | 360 return; |
322 } | 361 } |
323 | 362 |
324 ui_task_runner()->PostTask( | 363 ui_task_runner()->PostTask( |
325 FROM_HERE, | 364 FROM_HERE, |
326 base::Bind(&BluetoothSocketWin::OnAcceptOnUI, | 365 base::Bind(&BluetoothSocketWin::OnAcceptOnUI, |
327 this, | 366 this, |
328 base::Passed(&accept_socket_), | 367 base::Passed(&accept_socket_), |
329 accept_address_)); | 368 accept_address_, |
330 DoAccept(); | 369 success_callback, |
| 370 error_callback)); |
331 } | 371 } |
332 | 372 |
333 void BluetoothSocketWin::OnAcceptOnUI( | 373 void BluetoothSocketWin::OnAcceptOnUI( |
334 scoped_ptr<net::TCPSocket> accept_socket, | 374 scoped_ptr<net::TCPSocket> accept_socket, |
335 const net::IPEndPoint& peer_address) { | 375 const net::IPEndPoint& peer_address, |
| 376 const AcceptCompletionCallback& success_callback, |
| 377 const ErrorCompletionCallback& error_callback) { |
336 DCHECK(ui_task_runner()->RunsTasksOnCurrentThread()); | 378 DCHECK(ui_task_runner()->RunsTasksOnCurrentThread()); |
337 | 379 |
338 scoped_refptr<BluetoothSocketWin> peer = CreateBluetoothSocket( | 380 const std::string peer_device_address = |
| 381 IPEndPointToBluetoothAddress(peer_address); |
| 382 const BluetoothDevice* peer_device = adapter_->GetDevice(peer_device_address); |
| 383 if (!peer_device) { |
| 384 LOG(WARNING) << "OnAccept failed with unknown device, addr=" |
| 385 << peer_device_address; |
| 386 error_callback.Run(kFailedToAccept); |
| 387 return; |
| 388 } |
| 389 |
| 390 scoped_refptr<BluetoothSocketWin> peer_socket = CreateBluetoothSocket( |
339 ui_task_runner(), | 391 ui_task_runner(), |
340 socket_thread(), | 392 socket_thread(), |
341 net_log(), | 393 net_log(), |
342 source()); | 394 source()); |
343 peer->SetTCPSocket(accept_socket.Pass()); | 395 peer_socket->SetTCPSocket(accept_socket.Pass()); |
344 | 396 success_callback.Run(peer_device, peer_socket); |
345 on_new_connection_callback_.Run(peer, peer_address); | |
346 } | 397 } |
347 | 398 |
348 } // namespace device | 399 } // namespace device |
OLD | NEW |