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

syntax = "proto3";

package fidlcat.proto;

import "src/lib/fidl_codec/proto/value.proto";

// A complete fidlcat session. Used to store a session into a file.
message Session {
  repeated Process process = 1;
  repeated Thread thread = 2;
  repeated HandleDescription handle_description = 3;
  repeated LinkedKoids linked_koids = 4;
  repeated Event event = 5;
}

// Defines a process monitored by a session.
message Process {
  uint64 koid = 1;
  string name = 2;
  repeated LinkedHandles linked_handles = 5;
}

message LinkedHandles {
  uint32 handle_0 = 1;
  uint32 handle_1 = 2;
}

// Defines a thread monitored by a session.
message Thread {
  uint64 koid = 1;
  uint64 process_koid = 2;
}

// Defines the semantic associated to a handle.
message HandleDescription {
  uint32 handle = 1;
  uint64 thread_koid = 2;
  sint64 creation_time = 3;
  bool startup = 4;
  string type = 5;
  sint64 fd = 6;
  string path = 7;
  uint64 koid = 8;
  uint32 object_type = 9;
  string attributes = 10;
}

message LinkedKoids {
  uint64 koid_0 = 1;
  uint64 koid_1 = 2;
}

// Defines an event.
message Event {
  int64 timestamp = 1;
  oneof Kind {
    ProcessLaunchedEvent process_launched = 2;
    ProcessMonitoredEvent process_monitored = 3;
    StopMonitoringEvent stop_monitoring = 4;
    InvokedEvent invoked = 5;
    OutputEvent output = 6;
    ExceptionEvent exception = 7;
  }
}

message ProcessLaunchedEvent {
  string command = 1;
  string error_message = 2;
}

message ProcessMonitoredEvent {
  uint64 process_koid = 1;
  string error_message = 2;
}

message StopMonitoringEvent {
  uint64 process_koid = 1;
}

message InvokedEvent {
  uint64 thread_koid = 1;
  repeated Location frame = 2;
  string syscall = 3;
  map<string, fidl_codec.proto.Value> inline_fields = 4;
  map<string, fidl_codec.proto.Value> outline_fields = 5;
  map<uint32, fidl_codec.proto.Value> inline_id_fields = 6;
  map<uint32, fidl_codec.proto.Value> outline_id_fields = 7;
}

message OutputEvent {
  uint64 thread_koid = 1;
  string syscall = 2;
  sint64 returned_value = 3;
  uint64 invoked_event_id = 4;
  map<string, fidl_codec.proto.Value> inline_fields = 5;
  map<string, fidl_codec.proto.Value> outline_fields = 6;
  map<uint32, fidl_codec.proto.Value> inline_id_fields = 7;
  map<uint32, fidl_codec.proto.Value> outline_id_fields = 8;
}

message ExceptionEvent {
  uint64 thread_koid = 1;
  repeated Location frame = 2;
}

// Defines a location in a source file (used to define a stack frame).
message Location {
  string path = 1;
  uint32 line = 2;
  uint32 column = 3;
  uint64 address = 4;
  string symbol = 5;
}
