// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/connectivity/network/mdns/service/packet_reader.h"

#include <endian.h>

#include "src/lib/syslog/cpp/logger.h"

namespace mdns {

PacketReader::PacketReader(std::vector<uint8_t> packet)
    : packet_(std::move(packet)), packet_size_(packet_.size()) {}

PacketReader::~PacketReader() {}

bool PacketReader::GetBytes(size_t count, void* dest) {
  const uint8_t* bytes = Bytes(count);
  if (bytes == nullptr) {
    return false;
  }

  if (count == 0) {
    return true;
  }

  FX_DCHECK(dest != nullptr);
  std::memcpy(dest, bytes, count);
  return true;
}

const uint8_t* PacketReader::Bytes(size_t count) {
  if (!healthy_ || packet_size_ - bytes_consumed_ < count) {
    healthy_ = false;
    return nullptr;
  }

  const uint8_t* result = packet_.data() + bytes_consumed_;
  bytes_consumed_ += count;
  return result;
}

bool PacketReader::SetBytesConsumed(size_t bytes_consumed) {
  if (bytes_consumed > packet_size_) {
    healthy_ = false;
    return false;
  }

  bytes_consumed_ = bytes_consumed;
  return healthy_;
}

bool PacketReader::SetBytesRemaining(size_t bytes_remaining) {
  if (bytes_remaining + bytes_consumed_ > packet_.size()) {
    healthy_ = false;
    return false;
  }

  packet_size_ = bytes_remaining + bytes_consumed_;
  return healthy_;
}

PacketReader& PacketReader::operator>>(bool& value) {
  GetBytes(sizeof(value), &value);
  return *this;
}

PacketReader& PacketReader::operator>>(uint8_t& value) {
  GetBytes(sizeof(value), &value);
  return *this;
}

PacketReader& PacketReader::operator>>(uint16_t& value) {
  GetBytes(sizeof(value), &value);
  value = be16toh(value);
  return *this;
}

PacketReader& PacketReader::operator>>(uint32_t& value) {
  GetBytes(sizeof(value), &value);
  value = be32toh(value);
  return *this;
}

PacketReader& PacketReader::operator>>(uint64_t& value) {
  GetBytes(sizeof(value), &value);
  value = be64toh(value);
  return *this;
}

PacketReader& PacketReader::operator>>(int8_t& value) {
  GetBytes(sizeof(value), &value);
  return *this;
}

PacketReader& PacketReader::operator>>(int16_t& value) {
  GetBytes(sizeof(value), &value);
  value = be16toh(value);
  return *this;
}

PacketReader& PacketReader::operator>>(int32_t& value) {
  GetBytes(sizeof(value), &value);
  value = be32toh(value);
  return *this;
}

PacketReader& PacketReader::operator>>(int64_t& value) {
  GetBytes(sizeof(value), &value);
  value = be64toh(value);
  return *this;
}

}  // namespace mdns
