15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_WIN_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_WIN_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <WinSock2.h> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "device/bluetooth/bluetooth_adapter.h" 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "device/bluetooth/bluetooth_service_record_win.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "device/bluetooth/bluetooth_socket.h" 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "device/bluetooth/bluetooth_socket_net.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "device/bluetooth/bluetooth_uuid.h" 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "net/base/ip_endpoint.h" 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/socket/tcp_socket.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace device { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class BluetoothAdapter; 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class BluetoothDeviceWin; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// The BluetoothSocketWin class implements BluetoothSocket for the Microsoft 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Windows platform. 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class BluetoothSocketWin : public BluetoothSocketNet { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static scoped_refptr<BluetoothSocketWin> CreateBluetoothSocket( 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<base::SequencedTaskRunner> ui_task_runner, 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<BluetoothSocketThread> socket_thread); 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Connect to the peer device and calls |success_callback| when the 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // connection has been established successfully. If an error occurs, calls 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // |error_callback| with a system error message. 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void Connect(const BluetoothDeviceWin* device, 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BluetoothUUID& uuid, 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::Closure& success_callback, 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ErrorCompletionCallback& error_callback); 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Listens using this socket using an RFCOMM service published as UUID |uuid| 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // with Channel |options.channel|, or an automatically allocated Channel if 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |options.channel| is null. |success_callback| will be called if the service 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // is successfully registered, |error_callback| on failure with a message 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // explaining the cause. 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void Listen(scoped_refptr<BluetoothAdapter> adapter, 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BluetoothUUID& uuid, 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const BluetoothAdapter::ServiceOptions& options, 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Closure& success_callback, 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ErrorCompletionCallback& error_callback); 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // BluetoothSocketNet: 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void ResetData(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // BluetoothSocket: 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void Accept(const AcceptCompletionCallback& success_callback, 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ErrorCompletionCallback& error_callback) OVERRIDE; 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BluetoothSocketWin(); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu struct ServiceRegData; 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch BluetoothSocketWin(scoped_refptr<base::SequencedTaskRunner> ui_task_runner, 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<BluetoothSocketThread> socket_thread); 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void DoConnect(const base::Closure& success_callback, 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ErrorCompletionCallback& error_callback); 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void DoListen(const BluetoothUUID& uuid, 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int rfcomm_channel, 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::Closure& success_callback, 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ErrorCompletionCallback& error_callback); 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void DoAccept(const AcceptCompletionCallback& success_callback, 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ErrorCompletionCallback& error_callback); 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnAcceptOnSocketThread(const AcceptCompletionCallback& success_callback, 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ErrorCompletionCallback& error_callback, 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int accept_result); 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnAcceptOnUI(scoped_ptr<net::TCPSocket> accept_socket, 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const net::IPEndPoint& peer_address, 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const AcceptCompletionCallback& success_callback, 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ErrorCompletionCallback& error_callback); 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string device_address_; 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool supports_rfcomm_; 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint8 rfcomm_channel_; 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch BTH_ADDR bth_addr_; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Data members below are only used when listening. 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<device::BluetoothAdapter> adapter_; 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<ServiceRegData> service_reg_data_; 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<net::TCPSocket> accept_socket_; 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::IPEndPoint accept_address_; 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BluetoothSocketWin); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace device 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_WIN_H_ 102