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