/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

syntax = "proto2";

import "protos/perfetto/common/observable_events.proto";
import "protos/perfetto/common/tracing_service_state.proto";
import "protos/perfetto/common/tracing_service_capabilities.proto";
import "protos/perfetto/common/trace_stats.proto";
import "protos/perfetto/config/trace_config.proto";

package perfetto.protos;

// IPC interface definition for the consumer port of the tracing service.
service ConsumerPort {
  // Enables tracing for one or more data sources. At least one buffer must have
  // been previously created. The EnableTracingResponse is sent when tracing is
  // disabled (either explicitly or because of the |duration_ms| expired).
  // If |deferred_start| == true in the passed TraceConfig, all the tracing
  // harness is brought up (creating buffers and data sources) without actually
  // starting the data sources. Data sources will be started upon an explicit
  // StartTracing() call.
  // Note that |deferred_start| and StartTracing() have been introduced only
  // in Android Q and are not supported in Android P.
  rpc EnableTracing(EnableTracingRequest) returns (EnableTracingResponse) {}

  // Disables tracing for one or more data sources.
  rpc DisableTracing(DisableTracingRequest) returns (DisableTracingResponse) {}

  // Streams back the contents of one or more buffers. One call is enough to
  // drain all the buffers. The response consists in a sequence of
  // ReadBufferResponse messages (hence the "stream" in the return type), each
  // carrying one or more TracePacket(s). An EOF flag is attached to the last
  // ReadBufferResponse through the |has_more| == false field.
  rpc ReadBuffers(ReadBuffersRequest) returns (stream ReadBuffersResponse) {}

  // Destroys the buffers previously created. Note: all buffers are destroyed
  // implicitly if the Consumer disconnects.
  rpc FreeBuffers(FreeBuffersRequest) returns (FreeBuffersResponse) {}

  // Asks the service to request to all data sources involved in the tracing
  // session to commit their data into the trace buffer. The FlushResponse is
  // sent only:
  // - After the data has been committed (in which case FlushResponse succeeds)
  // or
  // - After FlushRequest.timeout_ms milliseconds (in which case the
  //   FlushResponse is rejected and fails).
  rpc Flush(FlushRequest) returns (FlushResponse) {}

  // ----------------------------------------------------
  // All methods below have been introduced in Android Q.
  // ----------------------------------------------------

  // Starts tracing. Only valid if EnableTracing() was called setting
  // deferred_start = true in the TraceConfig passed to EnableTracing().
  rpc StartTracing(StartTracingRequest) returns (StartTracingResponse) {}

  // Changes the configuration for a running tracing session; only possible
  // for a subset of configuration options.
  rpc ChangeTraceConfig(ChangeTraceConfigRequest)
      returns (ChangeTraceConfigResponse) {}

  // Allows the consumer to detach from the session. The session will keep
  // running even if the consumer disconnects and the consumer will not receive
  // any further IPC until reattached.
  rpc Detach(DetachRequest) returns (DetachResponse) {}

  // Allows the consumer to re-attach to a previously detached session. The
  // consumer will start receiving IPC notification for that session.
  // The session will be terminated if the consumer closes the IPC channel, as
  // in the standard non-detached case.
  rpc Attach(AttachRequest) returns (AttachResponse) {}

  // Allows the consumer to obtain statistics about the current tracing session,
  // such as buffer usage stats. Intended for debugging or UI use.
  rpc GetTraceStats(GetTraceStatsRequest) returns (GetTraceStatsResponse) {}

  // Allows the consumer to observe certain state changes, such as data source
  // instances starting to record.
  rpc ObserveEvents(ObserveEventsRequest)
      returns (stream ObserveEventsResponse) {}

  // ----------------------------------------------------
  // All methods below have been introduced in Android R.
  // ----------------------------------------------------

  // Allows to obtain the list of data sources connected and their descriptors.
  rpc QueryServiceState(QueryServiceStateRequest)
      returns (stream QueryServiceStateResponse) {}

  // Obtains a list of features supported by the service. This is to deal with
  // backward/forward compatibility and feature detection.
  rpc QueryCapabilities(QueryCapabilitiesRequest)
      returns (QueryCapabilitiesResponse) {}

  // ----------------------------------------------------
  // All methods below have been introduced in Android S.
  // ----------------------------------------------------

  // This method has been deprecated and removed in Android U in favour of
  // CloneSession.
  rpc SaveTraceForBugreport(SaveTraceForBugreportRequest)
      returns (SaveTraceForBugreportResponse) {}

  // ----------------------------------------------------
  // All methods below have been introduced in Android U.
  // ----------------------------------------------------

  // Clones an existing tracing session and binds the consumer to it (as if
  // the session was created via EnableTracing), copying over all the tracing
  // data (including metadata and stats).
  // The cloned session is stopped and read-only (as if DisableTracing was
  // invoked).
  // A consumer can clone a session only if the uid of the consumer matches the
  // uid of the source session or if the consumer uid is 0 (root).
  rpc CloneSession(CloneSessionRequest) returns (CloneSessionResponse) {}
}

// Arguments for rpc EnableTracing().
message EnableTracingRequest {
  optional protos.TraceConfig trace_config = 1;

  // Introduced in Android Q. This is used for re-attaching to the end-of-trace
  // EnableTracingResponse notification after a Detach+Attach request.
  // When this flag is set the |trace_config| is ignored and no method is called
  // on the tracing service.
  optional bool attach_notification_only = 2;
}

message EnableTracingResponse {
  oneof state { bool disabled = 1; }

  // If present and non-empty tracing was disabled because of an error.
  // Introduced in Android S.
  optional string error = 3;
}

// Arguments for rpc StartTracing().
message StartTracingRequest {}

message StartTracingResponse {}

// Arguments for rpc ChangeTraceConfig().
message ChangeTraceConfigRequest {
  optional protos.TraceConfig trace_config = 1;
}

message ChangeTraceConfigResponse {}

// Arguments for rpc DisableTracing().
message DisableTracingRequest {
  // TODO: not supported yet, selectively disable only some data sources.
  // repeated string data_source_name;
}

message DisableTracingResponse {}

// Arguments for rpc ReadBuffers().
message ReadBuffersRequest {
  // The |id|s of the buffer, as passed to CreateBuffers().
  // TODO: repeated uint32 buffer_ids = 1;
}

message ReadBuffersResponse {
  // TODO: uint32 buffer_id = 1;

  // Each streaming reply returns one or more slices for one or more trace
  // packets, or even just a portion of it (if it's too big to fit within one
  // IPC). The returned slices are ordered and contiguous: packets' slices are
  // not interleaved and slices are sent only once all slices for a packet are
  // available (i.e. the consumer will never see any gap).
  message Slice {
    optional bytes data = 1;

    // When true, this is the last slice for the packet. A ReadBufferResponse
    // might have no slices marked as |last_slice_for_packet|==true, in the case
    // of a very large packet that gets chunked into several IPCs (in which case
    // only the last IPC for the packet will have this flag set).
    optional bool last_slice_for_packet = 2;
  }
  repeated Slice slices = 2;
}

// Arguments for rpc FreeBuffers().
message FreeBuffersRequest {
  // The |id|s of the buffer, as passed to CreateBuffers().
  repeated uint32 buffer_ids = 1;
}

message FreeBuffersResponse {}

// Arguments for rpc Flush().
message FlushRequest {
  optional uint32 timeout_ms = 1;

  // More details such as flush reason and originator. Introduced in v38 / V.
  // See FlushFlags in include/perfetto/ext/tracing/core/flush_flags.h.
  optional uint64 flags = 2;
}

message FlushResponse {}

// Arguments for rpc Detach
message DetachRequest {
  optional string key = 1;
}

message DetachResponse {}

// Arguments for rpc Attach.
message AttachRequest {
  optional string key = 1;
}

message AttachResponse {
  optional protos.TraceConfig trace_config = 1;
}

// Arguments for rpc GetTraceStats.

message GetTraceStatsRequest {}

message GetTraceStatsResponse {
  optional TraceStats trace_stats = 1;
}

// Arguments for rpc ObserveEvents.

// To stop observing events of a certain type, send a request with the remaining
// types. To stop observing completely, send an empty request.
message ObserveEventsRequest {
  repeated ObservableEvents.Type events_to_observe = 1;
}

message ObserveEventsResponse {
  optional ObservableEvents events = 1;
}

// Arguments for rpc QueryServiceState.
message QueryServiceStateRequest {
  // If set, only the TracingServiceState.tracing_sessions is filled. Producers
  // and data sources are omitted.
  optional bool sessions_only = 1;
}

message QueryServiceStateResponse {
  // In order to avoid hitting IPC message size limitations, the service will
  // return >1 replies for each query, chunking the TracingServiceState. The
  // receiver is expected to merge replies together and parse that when the
  // last reply is received (i.e. when IPC's |has_more| == false).
  optional TracingServiceState service_state = 1;
}

// Arguments for rpc QueryCapabilities.
message QueryCapabilitiesRequest {}

message QueryCapabilitiesResponse {
  optional TracingServiceCapabilities capabilities = 1;
}

// Arguments for rpc SaveTraceForBugreport.
message SaveTraceForBugreportRequest {}

// This response is sent only after the trace was saved into file (if succeeded)
// or something failed.
message SaveTraceForBugreportResponse {
  // If true, an eligible the trace was saved into a known location (on Android
  // /data/misc/perfetto-traces, see GetBugreportTracePath()).
  // If false no trace with bugreport_score > 0 was found or an error occurred.
  // see |msg| in that case for details about the failure.
  optional bool success = 1;
  optional string msg = 2;
}

// Arguments for rpc CloneSession.
message CloneSessionRequest {
  oneof selector {
    // The session ID to clone. If session_id == kBugreportSessionId (0xff...ff)
    // the session with the highest bugreport score is cloned (if any exists).
    uint64 session_id = 1;

    // The unique_session_name of the tracing session to clone. Tracing sessions
    // that are clones of other tracing sessions are ignored.
    string unique_session_name = 4;
  }

  // If set, the trace filter will not have effect on the cloned session.
  // Used for bugreports.
  optional bool skip_trace_filter = 2;

  // If set, affects the generation of the FlushFlags::CloneTarget to be set
  // to kBugreport when requesting the flush to the producers.
  optional bool for_bugreport = 3;
}

message CloneSessionResponse {
  // If true, the clone was successful. If false it failed and |error| contains
  // the details about the failure.
  optional bool success = 1;
  optional string error = 2;

  // The UUID of the cloned session.
  optional int64 uuid_msb = 3;
  optional int64 uuid_lsb = 4;
}
