#ifndef DEVICE_FIDO_HID_FIDO_HID_PACKET_H_
#define DEVICE_FIDO_HID_FIDO_HID_PACKET_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/component_export.h"
#include "base/containers/span.h"
#include "device/fido/fido_constants.h"
namespace device {
class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidPacket {
public:
FidoHidPacket(std::vector<uint8_t> data, uint32_t channel_id);
FidoHidPacket(const FidoHidPacket&) = delete;
FidoHidPacket& operator=(const FidoHidPacket&) = delete;
virtual ~FidoHidPacket();
virtual std::vector<uint8_t> GetSerializedData() const = 0;
const std::vector<uint8_t>& GetPacketPayload() const { return data_; }
uint32_t channel_id() const { return channel_id_; }
protected:
FidoHidPacket();
std::vector<uint8_t> data_;
uint32_t channel_id_ = kHidBroadcastChannel;
private:
friend class HidMessage;
};
class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidInitPacket final
: public FidoHidPacket {
public:
static std::unique_ptr<FidoHidInitPacket> CreateFromSerializedData(
base::span<const uint8_t> serialized,
size_t* remaining_size);
FidoHidInitPacket(uint32_t channel_id,
FidoHidDeviceCommand cmd,
std::vector<uint8_t> data,
uint16_t payload_length);
FidoHidInitPacket(const FidoHidInitPacket&) = delete;
FidoHidInitPacket& operator=(const FidoHidInitPacket&) = delete;
~FidoHidInitPacket() final;
std::vector<uint8_t> GetSerializedData() const final;
FidoHidDeviceCommand command() const { return command_; }
uint16_t payload_length() const { return payload_length_; }
private:
FidoHidDeviceCommand command_;
uint16_t payload_length_;
};
class COMPONENT_EXPORT(DEVICE_FIDO) FidoHidContinuationPacket final
: public FidoHidPacket {
public:
static std::unique_ptr<FidoHidContinuationPacket> CreateFromSerializedData(
base::span<const uint8_t> serialized,
size_t* remaining_size);
FidoHidContinuationPacket(uint32_t channel_id,
uint8_t sequence,
std::vector<uint8_t> data);
FidoHidContinuationPacket(const FidoHidContinuationPacket&) = delete;
FidoHidContinuationPacket& operator=(const FidoHidContinuationPacket&) =
delete;
~FidoHidContinuationPacket() final;
std::vector<uint8_t> GetSerializedData() const final;
uint8_t sequence() const { return sequence_; }
private:
uint8_t sequence_;
};
}
#endif