// Copyright 2018 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.

#ifndef SRC_DEVELOPER_DEBUG_IPC_MESSAGE_READER_H_
#define SRC_DEVELOPER_DEBUG_IPC_MESSAGE_READER_H_

#include <stdint.h>

#include <string>
#include <vector>

namespace debug_ipc {

struct MsgHeader;

class MessageReader {
 public:
  explicit MessageReader(std::vector<char> message);
  ~MessageReader();

  bool has_error() const { return has_error_; }

  // Returns the number of bytes available still to read.
  uint32_t remaining() const { return message_.size() - offset_; }
  size_t message_size() const { return message_.size(); }

  // These functions return true on success.
  bool ReadBytes(uint32_t len, void* output);
  bool ReadInt32(int32_t* output);
  bool ReadUint32(uint32_t* output);
  bool ReadInt64(int64_t* output);
  bool ReadUint64(uint64_t* output);
  bool ReadString(std::string* output);
  bool ReadBool(bool* output);

  bool ReadHeader(MsgHeader* output);

 private:
  // Sets the error flag and returns false. This is designed so that error
  // handling code
  // need only call "return SetError();".
  bool SetError();

  const std::vector<char> message_;

  uint32_t offset_ = 0;  // Current read offset.

  bool has_error_ = false;
};

}  // namespace debug_ipc

#endif  // SRC_DEVELOPER_DEBUG_IPC_MESSAGE_READER_H_
