// 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 <lib/zircon-internal/ktrace.h>

#include "garnet/bin/ktrace_provider/reader.h"

namespace ktrace_provider {

Reader::Reader(const char* buffer, size_t buffer_size)
  : current_(buffer),
    marker_(buffer),
    end_(buffer + buffer_size) {
}

const ktrace_header_t* Reader::ReadNextRecord() {
  if (AvailableBytes() < sizeof(ktrace_header_t)) {
    ReadMoreData();
  }

  if (AvailableBytes() < sizeof(ktrace_header_t)) {
    FXL_VLOG(10) << "No more records";
    return nullptr;
  }

  auto record = reinterpret_cast<const ktrace_header_t*>(current_);

  if (AvailableBytes() < KTRACE_LEN(record->tag)) {
    ReadMoreData();
  }

  if (AvailableBytes() < KTRACE_LEN(record->tag)) {
    FXL_VLOG(10) << "No more records, incomplete last record";
    return nullptr;
  }

  record = reinterpret_cast<const ktrace_header_t*>(current_);
  current_ += KTRACE_LEN(record->tag);

  number_bytes_read_ += KTRACE_LEN(record->tag);
  number_records_read_ += 1;

  FXL_VLOG(10) << "Importing ktrace event 0x" << std::hex
               << KTRACE_EVENT(record->tag) << ", size " << std::dec
               << KTRACE_LEN(record->tag);

  return record;
}

}  // namespace ktrace_provider
