// Copyright 2021 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 TOOLS_FIDLCAT_LIB_SYSCALL_DECODER_INTERFACE_H_
#define TOOLS_FIDLCAT_LIB_SYSCALL_DECODER_INTERFACE_H_

#include <cinttypes>
#include <cstddef>

#include "src/developer/debug/shared/arch.h"
#include "src/developer/debug/zxdb/client/thread.h"
#include "src/lib/fidl_codec/wire_types.h"
#include "tools/fidlcat/lib/event.h"

namespace fidlcat {

// Stage for argument retrieving.
enum class Stage {
  // Retrieve arguments at the syscall entry.
  kEntry,
  // Retrieve arguments at the syscall exit.
  kExit
};

class SyscallDecoderInterface {
 public:
  SyscallDecoderInterface() = delete;
  virtual ~SyscallDecoderInterface() = default;

  SyscallDecoderDispatcher* dispatcher() const { return dispatcher_; }
  debug::Arch arch() const { return arch_; }
  fidlcat::Thread* fidlcat_thread() const { return fidlcat_thread_; }
  const fidl_codec::semantic::MethodSemantic* semantic() const { return semantic_; }
  void set_semantic(const fidl_codec::semantic::MethodSemantic* semantic) { semantic_ = semantic; }
  const fidl_codec::PayloadableValue* decoded_request() const { return decoded_request_; }
  void set_decoded_request(const fidl_codec::PayloadableValue* decoded_request) {
    decoded_request_ = decoded_request;
  }
  const fidl_codec::PayloadableValue* decoded_response() const { return decoded_response_; }
  void set_decoded_response(const fidl_codec::PayloadableValue* decoded_response) {
    decoded_response_ = decoded_response;
  }

  // Loads the value for a buffer, a struct or an output argument.
  virtual void LoadArgument(Stage stage, int argument_index, size_t size) = 0;
  // True if the argument is loaded correctly.
  virtual bool ArgumentLoaded(Stage stage, int argument_index, size_t size) const = 0;
  // Returns the value of an argument for basic types.
  virtual uint64_t ArgumentValue(int argument_index) const = 0;
  // Returns a pointer on the argument content for buffers, structs or
  // output arguments.
  virtual uint8_t* ArgumentContent(Stage stage, int argument_index) = 0;
  // Loads a buffer.
  virtual void LoadBuffer(Stage stage, uint64_t address, size_t size) = 0;
  // True if the buffer is loaded correctly.
  virtual bool BufferLoaded(Stage stage, uint64_t address, size_t size) = 0;
  // Returns a pointer on the loaded buffer.
  virtual uint8_t* BufferContent(Stage stage, uint64_t address) = 0;

 protected:
  SyscallDecoderInterface(SyscallDecoderDispatcher* dispatcher, zxdb::Thread* thread);

  SyscallDecoderDispatcher* const dispatcher_;
  const debug::Arch arch_;
  fidlcat::Thread* fidlcat_thread_;
  const fidl_codec::semantic::MethodSemantic* semantic_ = nullptr;
  const fidl_codec::PayloadableValue* decoded_request_ = nullptr;
  const fidl_codec::PayloadableValue* decoded_response_ = nullptr;
};

}  // namespace fidlcat

#endif  // TOOLS_FIDLCAT_LIB_SYSCALL_DECODER_INTERFACE_H_
