#ifndef ASH_QUICK_PAIR_MESSAGE_STREAM_MESSAGE_STREAM_H_
#define ASH_QUICK_PAIR_MESSAGE_STREAM_MESSAGE_STREAM_H_
#include <optional>
#include <string>
#include "base/containers/circular_deque.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "chromeos/ash/services/quick_pair/quick_pair_process_manager.h"
#include "device/bluetooth/bluetooth_socket.h"
namespace net {
class IOBuffer;
}
namespace ash {
namespace quick_pair {
class MessageStream {
public:
class Observer : public base::CheckedObserver {
public:
virtual void OnModelIdMessage(const std::string& device_address,
const std::string& model_id) {}
virtual void OnBleAddressUpdateMessage(const std::string& device_address,
const std::string& ble_address) {}
virtual void OnBatteryUpdateMessage(
const std::string& device_address,
const mojom::BatteryUpdatePtr& battery_update) {}
virtual void OnRemainingBatteryTimeMessage(
const std::string& device_address,
uint16_t remaining_battery_time) {}
virtual void OnEnableSilenceModeMessage(const std::string& device_address,
bool enable_silence_mode) {}
virtual void OnCompanionAppLogBufferFullMessage(
const std::string& device_address) {}
virtual void OnActiveComponentsMessage(const std::string& device_address,
uint8_t active_components_byte) {}
virtual void OnRingDeviceMessage(const std::string& device_address,
const mojom::RingDevicePtr& ring_device) {}
virtual void OnAcknowledgementMessage(
const std::string& device_address,
const mojom::AcknowledgementMessagePtr& acknowledgement) {}
virtual void OnAndroidSdkVersionMessage(const std::string& device_address,
uint8_t sdk_version) {}
virtual void OnDisconnected(const std::string& device_address) = 0;
virtual void OnMessageStreamDestroyed(
const std::string& device_address) = 0;
};
MessageStream(const std::string& device_address,
scoped_refptr<device::BluetoothSocket> socket);
MessageStream(const MessageStream&) = delete;
MessageStream& operator=(const MessageStream&) = delete;
~MessageStream();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
void Disconnect(base::OnceClosure on_disconnect_callback);
const base::circular_deque<mojom::MessageStreamMessagePtr>& messages() {
return messages_;
}
private:
void Receive();
void OnSocketDisconnected();
void OnSocketDisconnectedWithCallback(
base::OnceClosure on_disconnect_callback);
void ReceiveDataSuccess(int buffer_size,
scoped_refptr<net::IOBuffer> io_buffer);
void ReceiveDataError(device::BluetoothSocket::ErrorReason error,
const std::string& error_message);
void ParseMessageStreamSuccess(
std::vector<mojom::MessageStreamMessagePtr> messages);
void OnUtilityProcessStopped(
QuickPairProcessManager::ShutdownReason shutdown_reason);
void NotifyObservers(const mojom::MessageStreamMessagePtr& message);
std::string MessageStreamMessageTypeToString(
const mojom::MessageStreamMessagePtr& message);
int receive_retry_counter_ = 0;
std::string device_address_;
base::circular_deque<mojom::MessageStreamMessagePtr> messages_;
scoped_refptr<device::BluetoothSocket> socket_;
base::ObserverList<Observer> observers_;
base::WeakPtrFactory<MessageStream> weak_ptr_factory_{this};
};
}
}
#endif