// 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/encoding/packet_reader.h"

#include <endian.h>
#include <lib/syslog/cpp/macros.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
