Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(295)

Unified Diff: components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h

Issue 2075313002: Substituting legacy protocol with uWeave protocol (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix unittest memory leak Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h
diff --git a/components/proximity_auth/ble/bluetooth_low_energy_connection.h b/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h
similarity index 62%
copy from components/proximity_auth/ble/bluetooth_low_energy_connection.h
copy to components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h
index dec8d419655c3ba270aa455089345cb644fa5be7..bda1ee7b2efc8d73aa1b90fd7f8a4f6e8e188ba7 100644
--- a/components/proximity_auth/ble/bluetooth_low_energy_connection.h
+++ b/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h
@@ -2,12 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef COMPONENTS_PROXIMITY_AUTH_BLE_BLUETOOTH_LOW_ENERGY_CONNECTION_H_
-#define COMPONENTS_PROXIMITY_AUTH_BLE_BLUETOOTH_LOW_ENERGY_CONNECTION_H_
+#ifndef COMPONENTS_PROXIMITY_AUTH_BLE_BLUETOOTH_LOW_ENERGY_WEAVE_CLIENT_CONNECTION_H_
+#define COMPONENTS_PROXIMITY_AUTH_BLE_BLUETOOTH_LOW_ENERGY_WEAVE_CLIENT_CONNECTION_H_
#include <stddef.h>
#include <stdint.h>
+#include <map>
#include <memory>
#include <queue>
#include <string>
@@ -17,6 +18,8 @@
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "components/proximity_auth/ble/bluetooth_low_energy_characteristics_finder.h"
+#include "components/proximity_auth/ble/bluetooth_low_energy_weave_packet_generator.h"
+#include "components/proximity_auth/ble/bluetooth_low_energy_weave_packet_receiver.h"
#include "components/proximity_auth/ble/fake_wire_message.h"
#include "components/proximity_auth/ble/remote_attribute.h"
#include "components/proximity_auth/connection.h"
@@ -31,70 +34,67 @@ class TaskRunner;
}
namespace proximity_auth {
-
class BluetoothThrottler;
-// Represents a connection with a remote device over Bluetooth low energy. The
-// connection is a persistent bidirectional channel for sending and receiving
-// wire messages. The remote device is the peripheral mode and the service
-// contains two characteristics: one to send data and another to receive it.
-//
-// The connection flow is described below.
-//
-// Discover Reader and Writer Characteristics
-// |
-// |
-// |
-// Start Notify Session
-// |
-// |
-// |
-// Write kInviteToConnectSignal to Writer Characteristic
-// |
-// |
-// |
-// Read kInvitationResponseSignal from Reader Characteristic
-// |
-// |
-// |
-// Proximity Auth Connection Established
-class BluetoothLowEnergyConnection : public Connection,
- public device::BluetoothAdapter::Observer {
+namespace weave {
+// Creates GATT connection on top of the BLE connection and act as a Client.
+// uWeave communication follows the flow:
+// Client | Server
+// ---------------------------------|--------------------------------
+// send connection request |
+// | receive connection request
+// | send connection response
+// receive connection response |
+// opt: send data | opt: send data
+// receive data | receive data
+// opt: close connection | opt: close connection
+class BluetoothLowEnergyWeaveClientConnection
+ : public Connection,
+ public device::BluetoothAdapter::Observer {
public:
- // Signals sent to the remote device to indicate connection related events.
- enum class ControlSignal : uint32_t {
- kInviteToConnectSignal = 0,
- kInvitationResponseSignal = 1,
- kSendSignal = 2,
- kDisconnectSignal = 3,
+ class Factory {
+ public:
+ static std::unique_ptr<BluetoothLowEnergyWeaveClientConnection>
+ NewInstance();
+
+ // Exposed for testing.
+ static void SetInstanceForTesting(Factory* factory);
+
+ protected:
+ // Exposed for testing.
+ virtual std::unique_ptr<BluetoothLowEnergyWeaveClientConnection>
+ BuildInstance();
+
+ private:
+ static Factory* factory_instance_;
};
- // The sub-state of a proximity_auth::BluetoothLowEnergyConnection class
+ // The sub-state of a proximity_auth::BluetoothLowEnergyWeaveClientConnection
// extends the IN_PROGRESS state of proximity_auth::Connection::Status.
- enum class SubStatus {
+ enum SubStatus {
DISCONNECTED,
WAITING_GATT_CONNECTION,
WAITING_CHARACTERISTICS,
CHARACTERISTICS_FOUND,
WAITING_NOTIFY_SESSION,
NOTIFY_SESSION_READY,
- WAITING_RESPONSE_SIGNAL,
+ WAITING_CONNECTION_RESPONSE,
CONNECTED,
};
// Constructs a Bluetooth low energy connection to the service with
// |remote_service_| on the |remote_device|. The |adapter| must be already
- // initaalized and ready. The GATT connection may alreaady be established and
+ // initialized and ready. The GATT connection may alreaady be established and
// pass through |gatt_connection|. A subsequent call to Connect() must be
// made.
- BluetoothLowEnergyConnection(
+ BluetoothLowEnergyWeaveClientConnection(
const RemoteDevice& remote_device,
scoped_refptr<device::BluetoothAdapter> adapter,
const device::BluetoothUUID remote_service_uuid,
BluetoothThrottler* bluetooth_throttler,
int max_number_of_write_attempts);
- ~BluetoothLowEnergyConnection() override;
+ ~BluetoothLowEnergyWeaveClientConnection() override;
// proximity_auth::Connection:
void Connect() override;
@@ -103,7 +103,9 @@ class BluetoothLowEnergyConnection : public Connection,
protected:
// Exposed for testing.
- void SetSubStatus(SubStatus status);
+ void DestroyConnection();
+
+ // Exposed for testing.
SubStatus sub_status() { return sub_status_; }
// Sets |task_runner_| for testing.
@@ -127,25 +129,35 @@ class BluetoothLowEnergyConnection : public Connection,
void GattCharacteristicValueChanged(
device::BluetoothAdapter* adapter,
device::BluetoothRemoteGattCharacteristic* characteristic,
- const std::vector<uint8_t>& value) override;
+ const Packet& value) override;
private:
+ enum WriteRequestType {
+ REGULAR,
+ MESSAGE_COMPLETE,
+ CONNECTION_REQUEST,
+ CONNECTION_CLOSE
+ };
+
// Represents a request to write |value| to a some characteristic.
// |is_last_write_for_wire_messsage| indicates whether this request
// corresponds to the last write request for some wire message.
- // A WireMessage corresponds to exactly two WriteRequest: the first containing
- // a kSendSignal + the size of the WireMessage, and the second containing a
- // SendStatusSignal + the serialized WireMessage.
struct WriteRequest {
- WriteRequest(const std::vector<uint8_t>& val, bool flag);
+ WriteRequest(const Packet& val,
+ WriteRequestType request_type,
+ std::shared_ptr<WireMessage> message);
+ WriteRequest(const Packet& val, WriteRequestType request_type);
WriteRequest(const WriteRequest& other);
~WriteRequest();
- std::vector<uint8_t> value;
- bool is_last_write_for_wire_message;
+ Packet value;
+ WriteRequestType request_type;
+ std::shared_ptr<WireMessage> message;
int number_of_failed_attempts;
};
+ void SetSubStatus(SubStatus status);
+
// Creates the GATT connection with |remote_device|.
void CreateGattConnection();
@@ -157,36 +169,35 @@ class BluetoothLowEnergyConnection : public Connection,
void OnCreateGattConnectionError(
device::BluetoothDevice::ConnectErrorCode error_code);
- // Callback called when |to_peripheral_char_| and |from_peripheral_char_| were
+ // Callback called when |tx_characteristic_| and |rx_characteristic_| were
// found.
void OnCharacteristicsFound(const RemoteAttribute& service,
- const RemoteAttribute& to_peripheral_char,
- const RemoteAttribute& from_peripheral_char);
+ const RemoteAttribute& tx_characteristic,
+ const RemoteAttribute& rx_characteristic);
// Callback called there was an error finding the characteristics.
- void OnCharacteristicsFinderError(
- const RemoteAttribute& to_peripheral_char,
- const RemoteAttribute& from_peripheral_char);
+ void OnCharacteristicsFinderError(const RemoteAttribute& tx_characteristic,
+ const RemoteAttribute& rx_characteristic);
- // Starts a notify session for |from_peripheral_char_| when ready
+ // Starts a notify session for |rx_characteristic_| when ready
// (SubStatus::CHARACTERISTICS_FOUND).
void StartNotifySession();
// Called when a notification session is successfully started for
- // |from_peripheral_char_| characteristic.
+ // |rx_characteristic_| characteristic.
void OnNotifySessionStarted(
std::unique_ptr<device::BluetoothGattNotifySession> notify_session);
// Called when there is an error starting a notification session for
- // |from_peripheral_char_| characteristic.
+ // |rx_characteristic_| characteristic.
void OnNotifySessionError(device::BluetoothGattService::GattErrorCode);
// Stops |notify_session_|.
void StopNotifySession();
- // Sends an invite to connect signal to the peripheral if when ready
+ // Sends a connection request to server if ready
// (SubStatus::NOTIFY_SESSION_READY).
- void SendInviteToConnectSignal();
+ void SendConnectionRequest();
// Completes and updates the status accordingly.
void CompleteConnection();
@@ -202,7 +213,7 @@ class BluetoothLowEnergyConnection : public Connection,
// (OnWriteRemoteCharacteristicError()), it remains on the queue and will be
// retried. |request| will remain on the queue until it succeeds or it
// triggers a Disconnect() call (after |max_number_of_tries_|).
- void WriteRemoteCharacteristic(WriteRequest request);
+ void WriteRemoteCharacteristic(const WriteRequest& request);
// Processes the next request in |write_requests_queue_|.
void ProcessNextWriteRequest();
@@ -210,19 +221,14 @@ class BluetoothLowEnergyConnection : public Connection,
// Called when the
// BluetoothRemoteGattCharacteristic::RemoteCharacteristicWrite() is
// successfully complete.
- void OnRemoteCharacteristicWritten(bool run_did_send_message_callback);
+ void OnRemoteCharacteristicWritten();
// Called when there is an error writing to the remote characteristic
- // |to_peripheral_char_|.
+ // |tx_characteristic_|.
void OnWriteRemoteCharacteristicError(
- bool run_did_send_message_callback,
device::BluetoothRemoteGattService::GattErrorCode error);
- // Builds the value to be written on |to_peripheral_char_|. The value
- // corresponds to |signal| concatenated with |payload|.
- WriteRequest BuildWriteRequest(const std::vector<uint8_t>& signal,
- const std::vector<uint8_t>& bytes,
- bool is_last_message_for_wire_message);
+ void OnPacketReceiverError();
// Prints the time elapsed since |Connect()| was called.
void PrintTimeElapsed();
@@ -239,11 +245,10 @@ class BluetoothLowEnergyConnection : public Connection,
device::BluetoothRemoteGattCharacteristic* GetGattCharacteristic(
const std::string& identifier);
- // Convert the first 4 bytes from a byte vector to a uint32_t.
- uint32_t ToUint32(const std::vector<uint8_t>& bytes);
-
- // Convert an uint32_t to a byte vector.
- const std::vector<uint8_t> ToByteVector(uint32_t value);
+ // Get the reason that the other side of the connection decided to close the
+ // connection.
+ // Will crash if the receiver is not in CONNECTION_CLOSED state.
+ std::string GetReasonForClose();
// The Bluetooth adapter over which the Bluetooth connection will be made.
scoped_refptr<device::BluetoothAdapter> adapter_;
@@ -251,11 +256,17 @@ class BluetoothLowEnergyConnection : public Connection,
// Remote service the |gatt_connection_| was established with.
RemoteAttribute remote_service_;
+ // uWeave packet generator.
+ std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> packet_generator_;
+
+ // uWeave packet receiver.
+ std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> packet_receiver_;
+
// Characteristic used to send data to the remote device.
- RemoteAttribute to_peripheral_char_;
+ RemoteAttribute tx_characteristic_;
// Characteristic used to receive data from the remote device.
- RemoteAttribute from_peripheral_char_;
+ RemoteAttribute rx_characteristic_;
// Throttles repeated connection attempts to the same device. This is a
// workaround for crbug.com/508919. Not owned, must outlive this instance.
@@ -270,19 +281,12 @@ class BluetoothLowEnergyConnection : public Connection,
std::unique_ptr<BluetoothLowEnergyCharacteristicsFinder>
characteristic_finder_;
- // The notify session for |from_peripheral_char|.
+ // The notify session for |rx_characteristic|.
std::unique_ptr<device::BluetoothGattNotifySession> notify_session_;
// Internal connection status
SubStatus sub_status_;
- // Indicates a receiving operation is in progress. This is set after a
- // ControlSignal::kSendSignal was received from the remote device.
- bool receiving_bytes_;
-
- // Total number of bytes expected for the current receive operation.
- std::size_t expected_number_of_incoming_bytes_;
-
// Bytes already received for the current receive operation.
std::string incoming_bytes_buffer_;
@@ -296,21 +300,17 @@ class BluetoothLowEnergyConnection : public Connection,
// Maximum number of tries to send any write request.
int max_number_of_write_attempts_;
- // Maximum number of bytes that fit in a single chunk to be written in
- // |to_peripheral_char_|. Ideally, this should be the maximum value the
- // peripheral supports and it should be agreed when the GATT connection is
- // created. Currently, there is no API to find this value. The implementation
- // uses a hard-coded constant.
- int max_chunk_size_;
-
// Stores when the instace was created.
base::TimeTicks start_time_;
- base::WeakPtrFactory<BluetoothLowEnergyConnection> weak_ptr_factory_;
+ base::WeakPtrFactory<BluetoothLowEnergyWeaveClientConnection>
+ weak_ptr_factory_;
- DISALLOW_COPY_AND_ASSIGN(BluetoothLowEnergyConnection);
+ DISALLOW_COPY_AND_ASSIGN(BluetoothLowEnergyWeaveClientConnection);
};
+} // namespace weave
+
} // namespace proximity_auth
-#endif // COMPONENTS_PROXIMITY_AUTH_BLE_BLUETOOTH_LOW_ENERGY_CONNECTION_H_
+#endif // COMPONENTS_PROXIMITY_AUTH_BLE_BLUETOOTH_LOW_ENERGY_WEAVE_CLIENT_CONNECTION_H_
« no previous file with comments | « components/proximity_auth/ble/BUILD.gn ('k') | components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698