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

library fuchsia.telephony.qmi;

enum ResultCode {
  Success = 0x0;
  Error = 0x1;
};

enum ErrorCode : uint16 {
  NONE          = 0x0000;
  MALFORMED_MSG = 0x0001;
  NO_MEMORY     = 0x0002;
  INTERNAL      = 0x0003;
  // TODO add all error codes
};

struct QmiResult {
  ResultCode code;
  ErrorCode error;
};

interface QmiClient {
  /// Fulfill a request for the Device Management |service| interface
  //1002: RequestDataManagementService(request<DeviceManagement> service) -> (QmiResult res);
  1002: RequestDataManagementService(request<DeviceManagement> service) -> (bool res);

};

/// Interface to request QMI Standard services from. Manages modem client ID
/// allocation automatically after a transport mechanism has been connected.
interface QmiModem {
  /// Connect to the underlying transport |channel|. Start watching for QMI
  /// messages to demultiplex/translate to their respective FIDL interface for
  /// each connected client. Called per-modem, not per client connection.
  100: ConnectTransport(handle<channel> channel) -> (bool success);

  // No methods to the global CTL service is exposed, in the future we may want to expose a subset

  /// Connect to the modem, allocating the client ID and exposing a set of QMI services over
  /// the new |QmiClient| interface
  200: ConnectClient(request<QmiClient> channel) -> (bool success);
};


//
//  /// Fulfill a request for the Wireless Data |service| interface
//  // 1001: RequestWirelessDataService(request<WirelessData> service);
//
//
//  /// Fulfill a request for the Loctaion |service| interface
//  // 1003: RequestLocationService(request<Location> location);
//
//  // A bunch more services. Messaging, User Identity, Phonebook, etc...
//};
