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

// Next MinVersion: 3

// This file defines the mojo interface between Android, Chrome and the
// Chrome OS daemon for the MIDI implementation used in ARC.

module arc.mojom;

// This struct is used to send information to the client regarding a device
// which has been (dis)connected, and which the client can use to request
// subdevice ports from the daemon.
struct MidisDeviceInfo {
  uint32 card;
  uint32 device_num;
  uint32 num_subdevices;
  uint32 flags;
  string name;
  string manufacturer;
};

// This struct is used by the client to both request a subdevice port FD, as
// well as to close all its connections to a particular device. In the latter
// case, the |subdevice_num| field is left unused.
struct MidisRequest {
  uint32 card;
  uint32 device_num;
  uint32 subdevice_num;
};

// This interface is used by the server to send device and other information
// to the client. It should be implemented by the client, and a handle to it
// should be passed to the server.
// Next Method ID: 2
interface MidisClient {
  OnDeviceAdded@0(MidisDeviceInfo device);
  OnDeviceRemoved@1(MidisDeviceInfo device);
};

// This interface is used by the client to send messages / requests to the
// daemon. This should be implemented by midis.
// Next Method ID: 4
interface MidisServer {
  // Used to list out the MIDI devices that are currently connected to the
  // midis daemon.
  ListDevices@0() => (array<MidisDeviceInfo> devices);

  // This function returns a handle(a Unix FD wrapped in a Mojo Handle)
  // for a subdevice specified by |request|.
  // In the event of an error, returns an empty handle.
  // DEPRECATED: Please use RequestPort@4 instead.
  RequestPortDeprecated@1(MidisRequest request) => (handle port_handle);
  [MinVersion=2]
  RequestPort@3(MidisRequest request) => (handle? port_handle);

  // This function closes all open FDs the client may have on the specified
  // device, and removes the client from the device's data structure.
  CloseDevice@2(MidisRequest request);
};

// This interface is needed to get the midis server interface handle.
// It is also used to send a handle to the midis client interface (this is
// used to send messages to the client, and the interface is implemented
// by the client).
// Next Method ID: 1
interface MidisHost {
  Connect@0(MidisServer& server, MidisClient client);
};

// MidisInstance is implemented in the ARC MIDI JNI code that
// runs in Android and handles the Android side of the ArcBridge connection.
// Next Method ID: 2
interface MidisInstance {
  // DEPRECATED: Please use Init@1 instead.
  InitDeprecated@0(MidisHost host_ptr);

  // Establishes full-duplex communication with the host.
  [MinVersion=1] Init@1(MidisHost host_ptr) => ();
};
