// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// API exposed by the diagnosticsd daemon. Normally the consumer of this API is
// the browser.

// NOTE: This mojom should be kept in sync with the copy in Chromium's repo in
// src/chrome/services/diagnosticsd/public/mojom/diagnosticsd.mojom.

module chromeos.diagnosticsd.mojom;

// Factory interface exposed by the diagnosticsd daemon, which allows both
// endpoints (the diagnosticsd and the browser) to exchange with their
// interfaces (DiagnosticsdService and DiagnosticsdClient correspondingly).
interface DiagnosticsdServiceFactory {
  // Returns an interface to DiagnosticsdService in response to the passed
  // interface to DiagnosticsdClient.
  GetService@0(DiagnosticsdService& service, DiagnosticsdClient client) => ();
};

// Interface exposed by the diagnosticsd daemon.
interface DiagnosticsdService {
  // Sends a message, originating from the diagnostics UI extension (hosted by
  // the browser), to the diagnostics_processor daemon. The message contents are
  // serialized JSON. Delivery of the message is not guaranteed (for example, if
  // the diagnostics_processor daemon isn't running at the moment).
  //
  // The response will contain the JSON message returned by the
  // diagnostics_processor daemon. The response handle will be unset if the
  // request wasn't delivered to the daemon or the daemon made no reply.
  SendUiMessageToDiagnosticsProcessor@0(handle<shared_buffer> json_message)
      => (handle<shared_buffer>? response_json_message);

  // TODO(lamzin): remove when mojo library will support retrieving size of
  // mojo handle and shared buffers will compatible across Chrome OS - chrome.
  // Similar to SendUiMessageToDiagnosticsProcessor, but with additional
  // size parameters and with using "handle" instead of "handle<shared_buffer>".
  SendUiMessageToDiagnosticsProcessorWithSize@1(
      handle<shared_buffer> json_message, int64 json_message_size) => (
      handle<shared_buffer>? response_json_message,
      int64 response_json_message_size);
};

// Interface exposed by the consumer of DiagnosticsdService. In production this
// is the browser.
interface DiagnosticsdClient {
  // Sends a message, originating from the diagnostics_processor daemon, to the
  // diagnositcs UI extension (hosted by the browser). The message contents are
  // serialized JSON. Delivery of the message is not guaranteed (for example, if
  // no user is currently logged in that has the diagnostics UI extension
  // installed).
  //
  // The response will contain the JSON message returned by the
  // diagnostics_processor daemon. The response handle will be unset if the
  // request wasn't delivered to the extension or the extension made no reply.
  SendDiagnosticsProcessorMessageToUi@0(handle<shared_buffer> json_message)
      => (handle<shared_buffer>? response_json_message);
};
