| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/proximity_auth/ble/bluetooth_low_energy_connection.h" | 5 #include "components/proximity_auth/ble/bluetooth_low_energy_connection.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 } | 163 } |
| 164 | 164 |
| 165 void BluetoothLowEnergyConnection::SendMessageImpl( | 165 void BluetoothLowEnergyConnection::SendMessageImpl( |
| 166 scoped_ptr<WireMessage> message) { | 166 scoped_ptr<WireMessage> message) { |
| 167 PA_LOG(INFO) << "Sending message " << message->Serialize(); | 167 PA_LOG(INFO) << "Sending message " << message->Serialize(); |
| 168 std::string serialized_msg = message->Serialize(); | 168 std::string serialized_msg = message->Serialize(); |
| 169 | 169 |
| 170 // [First write]: Build a header with the [send signal] + [size of the | 170 // [First write]: Build a header with the [send signal] + [size of the |
| 171 // message]. | 171 // message]. |
| 172 WriteRequest write_request = BuildWriteRequest( | 172 WriteRequest write_request = BuildWriteRequest( |
| 173 ToByteVector(static_cast<uint32>(ControlSignal::kSendSignal)), | 173 ToByteVector(static_cast<uint32_t>(ControlSignal::kSendSignal)), |
| 174 ToByteVector(static_cast<uint32>(serialized_msg.size())), false); | 174 ToByteVector(static_cast<uint32_t>(serialized_msg.size())), false); |
| 175 | 175 |
| 176 // [First write]: Fill the it with a prefix of |serialized_msg| up to | 176 // [First write]: Fill the it with a prefix of |serialized_msg| up to |
| 177 // |max_chunk_size_|. | 177 // |max_chunk_size_|. |
| 178 size_t first_chunk_size = std::min( | 178 size_t first_chunk_size = std::min( |
| 179 max_chunk_size_ - write_request.value.size(), serialized_msg.size()); | 179 max_chunk_size_ - write_request.value.size(), serialized_msg.size()); |
| 180 std::vector<uint8> bytes(serialized_msg.begin(), | 180 std::vector<uint8_t> bytes(serialized_msg.begin(), |
| 181 serialized_msg.begin() + first_chunk_size); | 181 serialized_msg.begin() + first_chunk_size); |
| 182 write_request.value.insert(write_request.value.end(), bytes.begin(), | 182 write_request.value.insert(write_request.value.end(), bytes.begin(), |
| 183 bytes.end()); | 183 bytes.end()); |
| 184 | 184 |
| 185 bool is_last_write_request = first_chunk_size == serialized_msg.size(); | 185 bool is_last_write_request = first_chunk_size == serialized_msg.size(); |
| 186 write_request.is_last_write_for_wire_message = is_last_write_request; | 186 write_request.is_last_write_for_wire_message = is_last_write_request; |
| 187 WriteRemoteCharacteristic(write_request); | 187 WriteRemoteCharacteristic(write_request); |
| 188 if (is_last_write_request) | 188 if (is_last_write_request) |
| 189 return; | 189 return; |
| 190 | 190 |
| 191 // [Other write requests]: Each chunk has to include a deprecated signal: | 191 // [Other write requests]: Each chunk has to include a deprecated signal: |
| 192 // |kFirstByteZero| as the first byte. | 192 // |kFirstByteZero| as the first byte. |
| 193 int chunk_size = max_chunk_size_ - 1; | 193 int chunk_size = max_chunk_size_ - 1; |
| 194 std::vector<uint8> kFirstByteZeroVector; | 194 std::vector<uint8_t> kFirstByteZeroVector; |
| 195 kFirstByteZeroVector.push_back(static_cast<uint8>(kFirstByteZero)); | 195 kFirstByteZeroVector.push_back(static_cast<uint8_t>(kFirstByteZero)); |
| 196 | 196 |
| 197 int message_size = static_cast<int>(serialized_msg.size()); | 197 int message_size = static_cast<int>(serialized_msg.size()); |
| 198 int start_index = first_chunk_size; | 198 int start_index = first_chunk_size; |
| 199 while (start_index < message_size) { | 199 while (start_index < message_size) { |
| 200 int end_index = (start_index + chunk_size) <= message_size | 200 int end_index = (start_index + chunk_size) <= message_size |
| 201 ? (start_index + chunk_size) | 201 ? (start_index + chunk_size) |
| 202 : message_size; | 202 : message_size; |
| 203 bool is_last_write_request = (end_index == message_size); | 203 bool is_last_write_request = (end_index == message_size); |
| 204 write_request = BuildWriteRequest( | 204 write_request = BuildWriteRequest( |
| 205 kFirstByteZeroVector, | 205 kFirstByteZeroVector, |
| 206 std::vector<uint8>(serialized_msg.begin() + start_index, | 206 std::vector<uint8_t>(serialized_msg.begin() + start_index, |
| 207 serialized_msg.begin() + end_index), | 207 serialized_msg.begin() + end_index), |
| 208 is_last_write_request); | 208 is_last_write_request); |
| 209 WriteRemoteCharacteristic(write_request); | 209 WriteRemoteCharacteristic(write_request); |
| 210 start_index = end_index; | 210 start_index = end_index; |
| 211 } | 211 } |
| 212 } | 212 } |
| 213 | 213 |
| 214 // Changes in the GATT connection with the remote device should be observed | 214 // Changes in the GATT connection with the remote device should be observed |
| 215 // here. If the GATT connection is dropped, we should call Disconnect() anyway, | 215 // here. If the GATT connection is dropped, we should call Disconnect() anyway, |
| 216 // so the object can notify its observers. | 216 // so the object can notify its observers. |
| 217 void BluetoothLowEnergyConnection::DeviceChanged(BluetoothAdapter* adapter, | 217 void BluetoothLowEnergyConnection::DeviceChanged(BluetoothAdapter* adapter, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 239 device->GetAddress() != GetDeviceAddress()) | 239 device->GetAddress() != GetDeviceAddress()) |
| 240 return; | 240 return; |
| 241 | 241 |
| 242 PA_LOG(INFO) << "Device removed " << GetDeviceAddress(); | 242 PA_LOG(INFO) << "Device removed " << GetDeviceAddress(); |
| 243 Disconnect(); | 243 Disconnect(); |
| 244 } | 244 } |
| 245 | 245 |
| 246 void BluetoothLowEnergyConnection::GattCharacteristicValueChanged( | 246 void BluetoothLowEnergyConnection::GattCharacteristicValueChanged( |
| 247 BluetoothAdapter* adapter, | 247 BluetoothAdapter* adapter, |
| 248 BluetoothGattCharacteristic* characteristic, | 248 BluetoothGattCharacteristic* characteristic, |
| 249 const std::vector<uint8>& value) { | 249 const std::vector<uint8_t>& value) { |
| 250 DCHECK_EQ(adapter, adapter_.get()); | 250 DCHECK_EQ(adapter, adapter_.get()); |
| 251 if (sub_status() != SubStatus::WAITING_RESPONSE_SIGNAL && | 251 if (sub_status() != SubStatus::WAITING_RESPONSE_SIGNAL && |
| 252 sub_status() != SubStatus::CONNECTED) | 252 sub_status() != SubStatus::CONNECTED) |
| 253 return; | 253 return; |
| 254 | 254 |
| 255 PA_LOG(INFO) << "Characteristic value changed: " | 255 PA_LOG(INFO) << "Characteristic value changed: " |
| 256 << characteristic->GetUUID().canonical_value(); | 256 << characteristic->GetUUID().canonical_value(); |
| 257 | 257 |
| 258 if (characteristic->GetIdentifier() == from_peripheral_char_.id) { | 258 if (characteristic->GetIdentifier() == from_peripheral_char_.id) { |
| 259 if (receiving_bytes_) { | 259 if (receiving_bytes_) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 279 CompleteConnection(); | 279 CompleteConnection(); |
| 280 break; | 280 break; |
| 281 case ControlSignal::kInviteToConnectSignal: | 281 case ControlSignal::kInviteToConnectSignal: |
| 282 break; | 282 break; |
| 283 case ControlSignal::kSendSignal: { | 283 case ControlSignal::kSendSignal: { |
| 284 if (value.size() < 8) { | 284 if (value.size() < 8) { |
| 285 PA_LOG(WARNING) | 285 PA_LOG(WARNING) |
| 286 << "Incoming data corrupted, expected message size not found."; | 286 << "Incoming data corrupted, expected message size not found."; |
| 287 return; | 287 return; |
| 288 } | 288 } |
| 289 std::vector<uint8> size(value.begin() + 4, value.begin() + 8); | 289 std::vector<uint8_t> size(value.begin() + 4, value.begin() + 8); |
| 290 expected_number_of_incoming_bytes_ = | 290 expected_number_of_incoming_bytes_ = |
| 291 static_cast<size_t>(ToUint32(size)); | 291 static_cast<size_t>(ToUint32(size)); |
| 292 receiving_bytes_ = true; | 292 receiving_bytes_ = true; |
| 293 incoming_bytes_buffer_.clear(); | 293 incoming_bytes_buffer_.clear(); |
| 294 | 294 |
| 295 const std::string bytes(value.begin() + 8, value.end()); | 295 const std::string bytes(value.begin() + 8, value.end()); |
| 296 incoming_bytes_buffer_.append(bytes); | 296 incoming_bytes_buffer_.append(bytes); |
| 297 if (incoming_bytes_buffer_.size() >= | 297 if (incoming_bytes_buffer_.size() >= |
| 298 expected_number_of_incoming_bytes_) { | 298 expected_number_of_incoming_bytes_) { |
| 299 OnBytesReceived(incoming_bytes_buffer_); | 299 OnBytesReceived(incoming_bytes_buffer_); |
| 300 receiving_bytes_ = false; | 300 receiving_bytes_ = false; |
| 301 } | 301 } |
| 302 break; | 302 break; |
| 303 } | 303 } |
| 304 case ControlSignal::kDisconnectSignal: | 304 case ControlSignal::kDisconnectSignal: |
| 305 PA_LOG(INFO) << "Disconnect signal received."; | 305 PA_LOG(INFO) << "Disconnect signal received."; |
| 306 Disconnect(); | 306 Disconnect(); |
| 307 break; | 307 break; |
| 308 } | 308 } |
| 309 } | 309 } |
| 310 } | 310 } |
| 311 | 311 |
| 312 BluetoothLowEnergyConnection::WriteRequest::WriteRequest( | 312 BluetoothLowEnergyConnection::WriteRequest::WriteRequest( |
| 313 const std::vector<uint8>& val, | 313 const std::vector<uint8_t>& val, |
| 314 bool flag) | 314 bool flag) |
| 315 : value(val), | 315 : value(val), |
| 316 is_last_write_for_wire_message(flag), | 316 is_last_write_for_wire_message(flag), |
| 317 number_of_failed_attempts(0) { | 317 number_of_failed_attempts(0) {} |
| 318 } | |
| 319 | 318 |
| 320 BluetoothLowEnergyConnection::WriteRequest::~WriteRequest() {} | 319 BluetoothLowEnergyConnection::WriteRequest::~WriteRequest() {} |
| 321 | 320 |
| 322 void BluetoothLowEnergyConnection::CompleteConnection() { | 321 void BluetoothLowEnergyConnection::CompleteConnection() { |
| 323 PA_LOG(INFO) << "Connection completed. Time elapsed: " | 322 PA_LOG(INFO) << "Connection completed. Time elapsed: " |
| 324 << base::TimeTicks::Now() - start_time_; | 323 << base::TimeTicks::Now() - start_time_; |
| 325 SetSubStatus(SubStatus::CONNECTED); | 324 SetSubStatus(SubStatus::CONNECTED); |
| 326 } | 325 } |
| 327 | 326 |
| 328 void BluetoothLowEnergyConnection::OnCreateGattConnectionError( | 327 void BluetoothLowEnergyConnection::OnCreateGattConnectionError( |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 } | 448 } |
| 450 } | 449 } |
| 451 | 450 |
| 452 void BluetoothLowEnergyConnection::SendInviteToConnectSignal() { | 451 void BluetoothLowEnergyConnection::SendInviteToConnectSignal() { |
| 453 if (sub_status() == SubStatus::NOTIFY_SESSION_READY) { | 452 if (sub_status() == SubStatus::NOTIFY_SESSION_READY) { |
| 454 PA_LOG(INFO) << "Sending invite to connect signal"; | 453 PA_LOG(INFO) << "Sending invite to connect signal"; |
| 455 SetSubStatus(SubStatus::WAITING_RESPONSE_SIGNAL); | 454 SetSubStatus(SubStatus::WAITING_RESPONSE_SIGNAL); |
| 456 | 455 |
| 457 WriteRequest write_request = BuildWriteRequest( | 456 WriteRequest write_request = BuildWriteRequest( |
| 458 ToByteVector( | 457 ToByteVector( |
| 459 static_cast<uint32>(ControlSignal::kInviteToConnectSignal)), | 458 static_cast<uint32_t>(ControlSignal::kInviteToConnectSignal)), |
| 460 std::vector<uint8>(), false); | 459 std::vector<uint8_t>(), false); |
| 461 | 460 |
| 462 WriteRemoteCharacteristic(write_request); | 461 WriteRemoteCharacteristic(write_request); |
| 463 } | 462 } |
| 464 } | 463 } |
| 465 | 464 |
| 466 void BluetoothLowEnergyConnection::WriteRemoteCharacteristic( | 465 void BluetoothLowEnergyConnection::WriteRemoteCharacteristic( |
| 467 WriteRequest request) { | 466 WriteRequest request) { |
| 468 write_requests_queue_.push(request); | 467 write_requests_queue_.push(request); |
| 469 ProcessNextWriteRequest(); | 468 ProcessNextWriteRequest(); |
| 470 } | 469 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 if (++write_requests_queue_.front().number_of_failed_attempts >= | 517 if (++write_requests_queue_.front().number_of_failed_attempts >= |
| 519 max_number_of_write_attempts_) { | 518 max_number_of_write_attempts_) { |
| 520 Disconnect(); | 519 Disconnect(); |
| 521 return; | 520 return; |
| 522 } | 521 } |
| 523 ProcessNextWriteRequest(); | 522 ProcessNextWriteRequest(); |
| 524 } | 523 } |
| 525 | 524 |
| 526 BluetoothLowEnergyConnection::WriteRequest | 525 BluetoothLowEnergyConnection::WriteRequest |
| 527 BluetoothLowEnergyConnection::BuildWriteRequest( | 526 BluetoothLowEnergyConnection::BuildWriteRequest( |
| 528 const std::vector<uint8>& signal, | 527 const std::vector<uint8_t>& signal, |
| 529 const std::vector<uint8>& bytes, | 528 const std::vector<uint8_t>& bytes, |
| 530 bool is_last_write_for_wire_message) { | 529 bool is_last_write_for_wire_message) { |
| 531 std::vector<uint8> value(signal.begin(), signal.end()); | 530 std::vector<uint8_t> value(signal.begin(), signal.end()); |
| 532 value.insert(value.end(), bytes.begin(), bytes.end()); | 531 value.insert(value.end(), bytes.begin(), bytes.end()); |
| 533 return WriteRequest(value, is_last_write_for_wire_message); | 532 return WriteRequest(value, is_last_write_for_wire_message); |
| 534 } | 533 } |
| 535 | 534 |
| 536 void BluetoothLowEnergyConnection::PrintTimeElapsed() { | 535 void BluetoothLowEnergyConnection::PrintTimeElapsed() { |
| 537 PA_LOG(INFO) << "Time elapsed: " << base::TimeTicks::Now() - start_time_; | 536 PA_LOG(INFO) << "Time elapsed: " << base::TimeTicks::Now() - start_time_; |
| 538 } | 537 } |
| 539 | 538 |
| 540 std::string BluetoothLowEnergyConnection::GetDeviceAddress() { | 539 std::string BluetoothLowEnergyConnection::GetDeviceAddress() { |
| 541 // When the remote device is connected we should rely on the address given by | 540 // When the remote device is connected we should rely on the address given by |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 BluetoothGattService* remote_service = GetRemoteService(); | 586 BluetoothGattService* remote_service = GetRemoteService(); |
| 588 if (!remote_service) { | 587 if (!remote_service) { |
| 589 PA_LOG(WARNING) << "Remote service not found."; | 588 PA_LOG(WARNING) << "Remote service not found."; |
| 590 return NULL; | 589 return NULL; |
| 591 } | 590 } |
| 592 return remote_service->GetCharacteristic(gatt_characteristic); | 591 return remote_service->GetCharacteristic(gatt_characteristic); |
| 593 } | 592 } |
| 594 | 593 |
| 595 // TODO(sacomoto): make this robust to byte ordering in both sides of the | 594 // TODO(sacomoto): make this robust to byte ordering in both sides of the |
| 596 // SmartLock BLE socket. | 595 // SmartLock BLE socket. |
| 597 uint32 BluetoothLowEnergyConnection::ToUint32(const std::vector<uint8>& bytes) { | 596 uint32_t BluetoothLowEnergyConnection::ToUint32( |
| 597 const std::vector<uint8_t>& bytes) { |
| 598 return bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24); | 598 return bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24); |
| 599 } | 599 } |
| 600 | 600 |
| 601 // TODO(sacomoto): make this robust to byte ordering in both sides of the | 601 // TODO(sacomoto): make this robust to byte ordering in both sides of the |
| 602 // SmartLock BLE socket. | 602 // SmartLock BLE socket. |
| 603 const std::vector<uint8> BluetoothLowEnergyConnection::ToByteVector( | 603 const std::vector<uint8_t> BluetoothLowEnergyConnection::ToByteVector( |
| 604 const uint32 value) { | 604 const uint32_t value) { |
| 605 std::vector<uint8> bytes(4, 0); | 605 std::vector<uint8_t> bytes(4, 0); |
| 606 bytes[0] = static_cast<uint8>(value); | 606 bytes[0] = static_cast<uint8_t>(value); |
| 607 bytes[1] = static_cast<uint8>(value >> 8); | 607 bytes[1] = static_cast<uint8_t>(value >> 8); |
| 608 bytes[2] = static_cast<uint8>(value >> 16); | 608 bytes[2] = static_cast<uint8_t>(value >> 16); |
| 609 bytes[3] = static_cast<uint8>(value >> 24); | 609 bytes[3] = static_cast<uint8_t>(value >> 24); |
| 610 return bytes; | 610 return bytes; |
| 611 } | 611 } |
| 612 | 612 |
| 613 } // namespace proximity_auth | 613 } // namespace proximity_auth |
| OLD | NEW |