Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31dcccc0 authored by Myles Watson's avatar Myles Watson
Browse files

packet: Add Fragmentation

Bug: 141921396
Test: builds
Change-Id: Iec8b53b83b9ba3efbee8b45738161d3db5cf0837
parent 0f9df626
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ filegroup {
        "byte_inserter.cc",
        "byte_observer.cc",
        "iterator.cc",
        "fragmenting_inserter.cc",
        "packet_view.cc",
        "raw_builder.cc",
        "view.cc",
@@ -15,6 +16,7 @@ filegroup {
    name: "BluetoothPacketTestSources",
    srcs: [
        "bit_inserter_unittest.cc",
        "fragmenting_inserter_unittest.cc",
        "packet_builder_unittest.cc",
        "packet_view_unittest.cc",
        "raw_builder_unittest.cc",
+3 −8
Original line number Diff line number Diff line
@@ -29,15 +29,14 @@ BitInserter::~BitInserter() {

void BitInserter::insert_bits(uint8_t byte, size_t num_bits) {
  size_t total_bits = num_bits + num_saved_bits_;
  uint16_t new_value = saved_bits_ | (static_cast<uint16_t>(byte) << num_saved_bits_);
  uint16_t new_value = static_cast<uint8_t>(saved_bits_) | (static_cast<uint16_t>(byte) << num_saved_bits_);
  if (total_bits >= 8) {
    uint8_t new_byte = static_cast<uint8_t>(new_value);
    ByteInserter::insert_byte(new_byte);
    ByteInserter::insert_byte(static_cast<uint8_t>(new_value));
    total_bits -= 8;
    new_value = new_value >> 8;
  }
  num_saved_bits_ = total_bits;
  uint8_t mask = 0xff >> (8 - num_saved_bits_);
  uint8_t mask = static_cast<uint8_t>(0xff) >> (8 - num_saved_bits_);
  saved_bits_ = static_cast<uint8_t>(new_value) & mask;
}

@@ -45,9 +44,5 @@ void BitInserter::insert_byte(uint8_t byte) {
  insert_bits(byte, 8);
}

bool BitInserter::IsByteAligned() {
  return num_saved_bits_ == 0;
}

}  // namespace packet
}  // namespace bluetooth
+4 −6
Original line number Diff line number Diff line
@@ -29,15 +29,13 @@ namespace packet {
class BitInserter : public ByteInserter {
 public:
  BitInserter(std::vector<uint8_t>& vector);
  virtual ~BitInserter();
  ~BitInserter() override;

  void insert_bits(uint8_t byte, size_t num_bits);
  virtual void insert_bits(uint8_t byte, size_t num_bits);

  void insert_byte(uint8_t byte);
  void insert_byte(uint8_t byte) override;

  bool IsByteAligned();

 private:
 protected:
  size_t num_saved_bits_{0};
  uint8_t saved_bits_{0};
};
+7 −3
Original line number Diff line number Diff line
@@ -24,10 +24,10 @@ namespace packet {
ByteInserter::ByteInserter(std::vector<uint8_t>& vector) : std::back_insert_iterator<std::vector<uint8_t>>(vector) {}

ByteInserter::~ByteInserter() {
  ASSERT(registered_observers_.size() == 0);
  ASSERT(registered_observers_.empty());
}

void ByteInserter::RegisterObserver(ByteObserver observer) {
void ByteInserter::RegisterObserver(const ByteObserver& observer) {
  registered_observers_.push_back(observer);
}

@@ -37,10 +37,14 @@ ByteObserver ByteInserter::UnregisterObserver() {
  return observer;
}

void ByteInserter::insert_byte(uint8_t byte) {
void ByteInserter::on_byte(uint8_t byte) {
  for (auto& observer : registered_observers_) {
    observer.OnByte(byte);
  }
}

void ByteInserter::insert_byte(uint8_t byte) {
  on_byte(byte);
  std::back_insert_iterator<std::vector<uint8_t>>::operator=(byte);
}

+5 −2
Original line number Diff line number Diff line
@@ -31,12 +31,15 @@ class ByteInserter : public std::back_insert_iterator<std::vector<uint8_t>> {
  ByteInserter(std::vector<uint8_t>& vector);
  virtual ~ByteInserter();

  void insert_byte(uint8_t byte);
  virtual void insert_byte(uint8_t byte);

  void RegisterObserver(ByteObserver observer);
  void RegisterObserver(const ByteObserver& observer);

  ByteObserver UnregisterObserver();

 protected:
  void on_byte(uint8_t);

 private:
  std::vector<ByteObserver> registered_observers_;
};
Loading