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 3 // found in the LICENSE file. 4 5 #include "device/bluetooth/bluetooth_device_win.h" 6 7 #include <string> 8 9 #include "base/basictypes.h" 10 #include "base/containers/scoped_ptr_hash_map.h" 11 #include "base/logging.h" 12 #include "base/memory/scoped_vector.h" 13 #include "base/sequenced_task_runner.h" 14 #include "base/strings/stringprintf.h" 15 #include "device/bluetooth/bluetooth_service_record_win.h" 16 #include "device/bluetooth/bluetooth_socket_thread.h" 17 #include "device/bluetooth/bluetooth_socket_win.h" 18 #include "device/bluetooth/bluetooth_task_manager_win.h" 19 #include "device/bluetooth/bluetooth_uuid.h" 20 21 namespace { 22 23 const int kSdpBytesBufferSize = 1024; 24 25 } // namespace 26 27 namespace device { 28 29 BluetoothDeviceWin::BluetoothDeviceWin( 30 const BluetoothTaskManagerWin::DeviceState& device_state, 31 const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner, 32 const scoped_refptr<BluetoothSocketThread>& socket_thread, 33 net::NetLog* net_log, 34 const net::NetLog::Source& net_log_source) 35 : BluetoothDevice(), 36 ui_task_runner_(ui_task_runner), 37 socket_thread_(socket_thread), 38 net_log_(net_log), 39 net_log_source_(net_log_source) { 40 Update(device_state); 41 } 42 43 BluetoothDeviceWin::~BluetoothDeviceWin() { 44 } 45 46 void BluetoothDeviceWin::Update( 47 const BluetoothTaskManagerWin::DeviceState& device_state) { 48 address_ = device_state.address; 49 // Note: Callers are responsible for providing a canonicalized address. 50 DCHECK_EQ(address_, BluetoothDevice::CanonicalizeAddress(address_)); 51 name_ = device_state.name; 52 bluetooth_class_ = device_state.bluetooth_class; 53 visible_ = device_state.visible; 54 connected_ = device_state.connected; 55 paired_ = device_state.authenticated; 56 UpdateServices(device_state); 57 } 58 59 void BluetoothDeviceWin::UpdateServices( 60 const BluetoothTaskManagerWin::DeviceState& device_state) { 61 uuids_.clear(); 62 service_record_list_.clear(); 63 64 for (ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>::const_iterator 65 iter = device_state.service_record_states.begin(); 66 iter != device_state.service_record_states.end(); 67 ++iter) { 68 BluetoothServiceRecordWin* service_record = 69 new BluetoothServiceRecordWin(device_state.address, 70 (*iter)->name, 71 (*iter)->sdp_bytes, 72 (*iter)->gatt_uuid); 73 service_record_list_.push_back(service_record); 74 uuids_.push_back(service_record->uuid()); 75 } 76 } 77 78 bool BluetoothDeviceWin::IsEqual( 79 const BluetoothTaskManagerWin::DeviceState& device_state) { 80 if (address_ != device_state.address || name_ != device_state.name || 81 bluetooth_class_ != device_state.bluetooth_class || 82 visible_ != device_state.visible || 83 connected_ != device_state.connected || 84 paired_ != device_state.authenticated) { 85 return false; 86 } 87 88 // Checks service collection 89 typedef std::set<BluetoothUUID> UUIDSet; 90 typedef base::ScopedPtrHashMap<std::string, BluetoothServiceRecordWin> 91 ServiceRecordMap; 92 93 UUIDSet known_services; 94 for (UUIDList::const_iterator iter = uuids_.begin(); iter != uuids_.end(); 95 ++iter) { 96 known_services.insert((*iter)); 97 } 98 99 UUIDSet new_services; 100 ServiceRecordMap new_service_records; 101 for (ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>::const_iterator 102 iter = device_state.service_record_states.begin(); 103 iter != device_state.service_record_states.end(); 104 ++iter) { 105 BluetoothServiceRecordWin* service_record = new BluetoothServiceRecordWin( 106 address_, (*iter)->name, (*iter)->sdp_bytes, (*iter)->gatt_uuid); 107 new_services.insert(service_record->uuid()); 108 new_service_records.set( 109 service_record->uuid().canonical_value(), 110 scoped_ptr<BluetoothServiceRecordWin>(service_record)); 111 } 112 113 UUIDSet removed_services = 114 base::STLSetDifference<UUIDSet>(known_services, new_services); 115 if (!removed_services.empty()) { 116 return false; 117 } 118 UUIDSet added_devices = 119 base::STLSetDifference<UUIDSet>(new_services, known_services); 120 if (!added_devices.empty()) { 121 return false; 122 } 123 124 for (ServiceRecordList::const_iterator iter = service_record_list_.begin(); 125 iter != service_record_list_.end(); 126 ++iter) { 127 BluetoothServiceRecordWin* service_record = (*iter); 128 BluetoothServiceRecordWin* new_service_record = 129 new_service_records.get((*iter)->uuid().canonical_value()); 130 if (!service_record->IsEqual(*new_service_record)) 131 return false; 132 } 133 return true; 134 } 135 136 void BluetoothDeviceWin::SetVisible(bool visible) { 137 visible_ = visible; 138 } 139 140 uint32 BluetoothDeviceWin::GetBluetoothClass() const { 141 return bluetooth_class_; 142 } 143 144 std::string BluetoothDeviceWin::GetDeviceName() const { 145 return name_; 146 } 147 148 std::string BluetoothDeviceWin::GetAddress() const { 149 return address_; 150 } 151 152 BluetoothDevice::VendorIDSource 153 BluetoothDeviceWin::GetVendorIDSource() const { 154 return VENDOR_ID_UNKNOWN; 155 } 156 157 uint16 BluetoothDeviceWin::GetVendorID() const { 158 return 0; 159 } 160 161 uint16 BluetoothDeviceWin::GetProductID() const { 162 return 0; 163 } 164 165 uint16 BluetoothDeviceWin::GetDeviceID() const { 166 return 0; 167 } 168 169 int BluetoothDeviceWin::GetRSSI() const { 170 NOTIMPLEMENTED(); 171 return kUnknownPower; 172 } 173 174 int BluetoothDeviceWin::GetCurrentHostTransmitPower() const { 175 NOTIMPLEMENTED(); 176 return kUnknownPower; 177 } 178 179 int BluetoothDeviceWin::GetMaximumHostTransmitPower() const { 180 NOTIMPLEMENTED(); 181 return kUnknownPower; 182 } 183 184 bool BluetoothDeviceWin::IsPaired() const { 185 return paired_; 186 } 187 188 bool BluetoothDeviceWin::IsConnected() const { 189 return connected_; 190 } 191 192 bool BluetoothDeviceWin::IsConnectable() const { 193 return false; 194 } 195 196 bool BluetoothDeviceWin::IsConnecting() const { 197 return false; 198 } 199 200 BluetoothDevice::UUIDList BluetoothDeviceWin::GetUUIDs() const { 201 return uuids_; 202 } 203 204 bool BluetoothDeviceWin::ExpectingPinCode() const { 205 NOTIMPLEMENTED(); 206 return false; 207 } 208 209 bool BluetoothDeviceWin::ExpectingPasskey() const { 210 NOTIMPLEMENTED(); 211 return false; 212 } 213 214 bool BluetoothDeviceWin::ExpectingConfirmation() const { 215 NOTIMPLEMENTED(); 216 return false; 217 } 218 219 void BluetoothDeviceWin::Connect( 220 PairingDelegate* pairing_delegate, 221 const base::Closure& callback, 222 const ConnectErrorCallback& error_callback) { 223 NOTIMPLEMENTED(); 224 } 225 226 void BluetoothDeviceWin::SetPinCode(const std::string& pincode) { 227 NOTIMPLEMENTED(); 228 } 229 230 void BluetoothDeviceWin::SetPasskey(uint32 passkey) { 231 NOTIMPLEMENTED(); 232 } 233 234 void BluetoothDeviceWin::ConfirmPairing() { 235 NOTIMPLEMENTED(); 236 } 237 238 void BluetoothDeviceWin::RejectPairing() { 239 NOTIMPLEMENTED(); 240 } 241 242 void BluetoothDeviceWin::CancelPairing() { 243 NOTIMPLEMENTED(); 244 } 245 246 void BluetoothDeviceWin::Disconnect( 247 const base::Closure& callback, 248 const ErrorCallback& error_callback) { 249 NOTIMPLEMENTED(); 250 } 251 252 void BluetoothDeviceWin::Forget(const ErrorCallback& error_callback) { 253 NOTIMPLEMENTED(); 254 } 255 256 void BluetoothDeviceWin::ConnectToService( 257 const BluetoothUUID& uuid, 258 const ConnectToServiceCallback& callback, 259 const ConnectToServiceErrorCallback& error_callback) { 260 scoped_refptr<BluetoothSocketWin> socket( 261 BluetoothSocketWin::CreateBluetoothSocket( 262 ui_task_runner_, socket_thread_)); 263 socket->Connect(this, uuid, base::Bind(callback, socket), error_callback); 264 } 265 266 void BluetoothDeviceWin::CreateGattConnection( 267 const GattConnectionCallback& callback, 268 const ConnectErrorCallback& error_callback) { 269 // TODO(armansito): Implement. 270 error_callback.Run(ERROR_UNSUPPORTED_DEVICE); 271 } 272 273 void BluetoothDeviceWin::StartConnectionMonitor( 274 const base::Closure& callback, 275 const ErrorCallback& error_callback) { 276 NOTIMPLEMENTED(); 277 } 278 279 const BluetoothServiceRecordWin* BluetoothDeviceWin::GetServiceRecord( 280 const device::BluetoothUUID& uuid) const { 281 for (ServiceRecordList::const_iterator iter = service_record_list_.begin(); 282 iter != service_record_list_.end(); 283 ++iter) { 284 if ((*iter)->uuid() == uuid) 285 return *iter; 286 } 287 return NULL; 288 } 289 290 } // namespace device 291