OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/copresence_endpoints/public/copresence_endpoint.h" | |
6 | |
7 #include <stdint.h> | |
8 | |
9 #include "base/bind.h" | |
10 #include "base/bind_helpers.h" | |
11 #include "base/format_macros.h" | |
12 #include "base/memory/scoped_ptr.h" | |
13 #include "base/strings/string_number_conversions.h" | |
14 #include "components/copresence_endpoints/transports/bluetooth/copresence_socket
_bluetooth.h" | |
15 #include "device/bluetooth/bluetooth_adapter.h" | |
16 #include "device/bluetooth/bluetooth_adapter_factory.h" | |
17 #include "device/bluetooth/bluetooth_device.h" | |
18 #include "device/bluetooth/bluetooth_socket.h" | |
19 #include "device/bluetooth/bluetooth_uuid.h" | |
20 | |
21 namespace { | |
22 | |
23 const char kAdapterError[] = "NOADAPTER"; | |
24 const char kSocketServiceUuid[] = "2491fb14-0077-4d4d-bd41-b18e9a570f56"; | |
25 | |
26 // This class will confirm pairing for a device that is expecting a pairing | |
27 // confirmation. | |
28 class DefaultApprovalDelegate | |
29 : public device::BluetoothDevice::PairingDelegate { | |
30 public: | |
31 DefaultApprovalDelegate() {} | |
32 ~DefaultApprovalDelegate() override {} | |
33 | |
34 // device::BluetoothDevice::PairingDelegate overrides: | |
35 void RequestPinCode(device::BluetoothDevice* device) override {} | |
36 void RequestPasskey(device::BluetoothDevice* device) override {} | |
37 void DisplayPinCode(device::BluetoothDevice* device, | |
38 const std::string& pincode) override {} | |
39 void DisplayPasskey(device::BluetoothDevice* device, | |
40 uint32 passkey) override {} | |
41 void KeysEntered(device::BluetoothDevice* device, uint32 entered) override {} | |
42 void ConfirmPasskey(device::BluetoothDevice* device, | |
43 uint32 passkey) override {} | |
44 void AuthorizePairing(device::BluetoothDevice* device) override { | |
45 if (device->ExpectingConfirmation()) | |
46 device->ConfirmPairing(); | |
47 } | |
48 }; | |
49 | |
50 } // namespace | |
51 | |
52 namespace copresence_endpoints { | |
53 | |
54 CopresenceEndpoint::CopresenceEndpoint( | |
55 int endpoint_id, | |
56 const CreateEndpointCallback& create_callback, | |
57 const base::Closure& accept_callback, | |
58 const CopresenceSocket::ReceiveCallback& receive_callback) | |
59 : endpoint_id_(endpoint_id), | |
60 create_callback_(create_callback), | |
61 accept_callback_(accept_callback), | |
62 receive_callback_(receive_callback), | |
63 delegate_(nullptr), | |
64 weak_ptr_factory_(this) { | |
65 CHECK(!create_callback.is_null()); | |
66 CHECK(!accept_callback.is_null()); | |
67 CHECK(!receive_callback.is_null()); | |
68 | |
69 if (!device::BluetoothAdapterFactory::IsBluetoothAdapterAvailable()) { | |
70 create_callback_.Run(std::string()); | |
71 return; | |
72 } | |
73 | |
74 device::BluetoothAdapterFactory::GetAdapter(base::Bind( | |
75 &CopresenceEndpoint::OnGetAdapter, weak_ptr_factory_.GetWeakPtr())); | |
76 } | |
77 | |
78 CopresenceEndpoint::~CopresenceEndpoint() { | |
79 server_socket_->Disconnect(base::Bind(&base::DoNothing)); | |
80 server_socket_->Close(); | |
81 if (delegate_) | |
82 adapter_->RemovePairingDelegate(delegate_.get()); | |
83 } | |
84 | |
85 std::string CopresenceEndpoint::GetLocator() { | |
86 if (!adapter_.get()) | |
87 return kAdapterError; | |
88 return base::IntToString(endpoint_id_) + "." + adapter_->GetAddress() + "." + | |
89 kSocketServiceUuid; | |
90 } | |
91 | |
92 bool CopresenceEndpoint::Send(const scoped_refptr<net::IOBuffer>& buffer, | |
93 int buffer_size) { | |
94 if (!client_socket_) | |
95 return false; | |
96 | |
97 return client_socket_->Send(buffer, buffer_size); | |
98 } | |
99 | |
100 // Private methods. | |
101 | |
102 void CopresenceEndpoint::OnGetAdapter( | |
103 scoped_refptr<device::BluetoothAdapter> adapter) { | |
104 if (!adapter.get() || !adapter->IsPresent() || !adapter->IsPowered()) { | |
105 LOG(WARNING) << "Unable to use BT adapter"; | |
106 create_callback_.Run(std::string()); | |
107 return; | |
108 } | |
109 | |
110 adapter_ = adapter; | |
111 delegate_ = make_scoped_ptr(new DefaultApprovalDelegate()); | |
112 VLOG(2) << "Got Adapter, creating service with UUID: " << kSocketServiceUuid; | |
113 adapter_->AddPairingDelegate( | |
114 delegate_.get(), | |
115 device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH); | |
116 adapter_->CreateRfcommService( | |
117 device::BluetoothUUID(kSocketServiceUuid), | |
118 device::BluetoothAdapter::ServiceOptions(), | |
119 base::Bind(&CopresenceEndpoint::OnCreateService, | |
120 weak_ptr_factory_.GetWeakPtr()), | |
121 base::Bind(&CopresenceEndpoint::OnCreateServiceError, | |
122 weak_ptr_factory_.GetWeakPtr())); | |
123 } | |
124 | |
125 void CopresenceEndpoint::OnCreateService( | |
126 scoped_refptr<device::BluetoothSocket> socket) { | |
127 if (!socket.get()) { | |
128 LOG(WARNING) << "Couldn't create service!"; | |
129 create_callback_.Run(std::string()); | |
130 return; | |
131 } | |
132 | |
133 VLOG(3) << "Starting Accept Socket."; | |
134 server_socket_ = socket; | |
135 create_callback_.Run(GetLocator()); | |
136 server_socket_->Accept( | |
137 base::Bind(&CopresenceEndpoint::OnAccept, weak_ptr_factory_.GetWeakPtr()), | |
138 base::Bind(&CopresenceEndpoint::OnAcceptError, | |
139 weak_ptr_factory_.GetWeakPtr())); | |
140 } | |
141 | |
142 void CopresenceEndpoint::OnCreateServiceError(const std::string& message) { | |
143 LOG(WARNING) << "Couldn't create Bluetooth service: " << message; | |
144 create_callback_.Run(std::string()); | |
145 } | |
146 | |
147 void CopresenceEndpoint::OnAccept( | |
148 const device::BluetoothDevice* device, | |
149 scoped_refptr<device::BluetoothSocket> socket) { | |
150 if (!socket.get()) | |
151 return; | |
152 VLOG(3) << "Accepted Socket."; | |
153 client_socket_.reset(new CopresenceSocketBluetooth(socket)); | |
154 accept_callback_.Run(); | |
155 client_socket_->Receive(receive_callback_); | |
156 } | |
157 | |
158 void CopresenceEndpoint::OnAcceptError(const std::string& message) { | |
159 LOG(WARNING) << "Couldn't accept Bluetooth connection: " << message; | |
160 } | |
161 | |
162 } // namespace copresence_endpoints | |
OLD | NEW |