/*
 * Copyright (C) 2020 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";

package perfetto.protos;

message TracingServiceCapabilities {
  // Whether the service supports QueryCapabilities() at all or not.
  // This is only used at the C++ level to distinguish the case of talking to
  // an older version of the service that doesn't support QueryCapabilities().
  // In that case the IPC layer will just reject the unknown call, and the
  // consumer_ipc_client_impl.cc will return an empty message where this field
  // is false. In all other cases, this is always set to true.
  optional bool has_query_capabilities = 1;

  // The set of known events that can be passed to ConsumerPort.ObserveEvents().
  repeated ObservableEvents.Type observable_events = 2;

  // Whether the service supports TraceConfig.output_path (for asking traced to
  // create the output file instead of passing a file descriptor).
  optional bool has_trace_config_output_path = 3;
}
