//  Copyright 2022 The ChromiumOS Authors
//  Use of this source code is governed by a BSD-style license that can be
//  found in the LICENSE file.

#ifndef HERMES_LIBMBIM_IMPL_H_
#define HERMES_LIBMBIM_IMPL_H_

#include "hermes/libmbim_interface.h"

namespace hermes {

class LibmbimImpl : public LibmbimInterface {
 public:
  void MbimDeviceNew(GFile* file,
                     GCancellable* cancellable,
                     GAsyncReadyCallback callback,
                     gpointer user_data) override;
  MbimDevice* MbimDeviceNewFinish(GAsyncResult* res, GError** error) override {
    return ::mbim_device_new_finish(res, error);
  };
  virtual ~LibmbimImpl() = default;
  void MbimDeviceOpenFull(MbimDevice* self,
                          MbimDeviceOpenFlags flags,
                          guint timeout,
                          GCancellable* cancellable,
                          GAsyncReadyCallback callback,
                          gpointer user_data) override;
  void MbimDeviceCommand(MbimDevice* self,
                         MbimMessage* message,
                         guint timeout,
                         GCancellable* cancellable,
                         GAsyncReadyCallback callback,
                         gpointer user_data) override;
  MbimMessage* MbimDeviceCommandFinish(MbimDevice* self,
                                       GAsyncResult* res,
                                       GError** error) override;
  gboolean MbimMessageResponseGetResult(const MbimMessage* self,
                                        MbimMessageType expected,
                                        GError** error) override;
  gboolean MbimMessageDeviceCapsResponseParse(
      const MbimMessage* message,
      MbimDeviceType* out_device_type,
      MbimCellularClass* out_cellular_class,
      MbimVoiceClass* out_voice_class,
      MbimSimClass* out_sim_class,
      MbimDataClass* out_data_class,
      MbimSmsCaps* out_sms_caps,
      MbimCtrlCaps* out_control_caps,
      guint32* out_max_sessions,
      gchar** out_custom_data_class,
      gchar** out_device_id,
      gchar** out_firmware_info,
      gchar** out_hardware_info,
      GError** error) override;

  gboolean MbimDeviceCheckMsMbimexVersion(
      MbimDevice* self,
      guint8 ms_mbimex_version_major,
      guint8 ms_mbimex_version_minor) override;
  bool GetReadyState(MbimDevice* device,
                     bool is_notification,
                     MbimMessage* notification,
                     MbimSubscriberReadyState* ready_state) override;
  gboolean MbimMessageMsBasicConnectExtensionsSysCapsResponseParse(
      const MbimMessage* message,
      guint32* out_number_of_executors,
      guint32* out_number_of_slots,
      guint32* out_concurrency,
      guint64* out_modem_id,
      GError** error) override;
  gboolean MbimMessageMsBasicConnectExtensionsDeviceSlotMappingsResponseParse(
      const MbimMessage* message,
      guint32* out_map_count,
      MbimSlotArray** out_slot_map,
      GError** error) override;
  gboolean MbimMessageMsBasicConnectExtensionsSlotInfoStatusResponseParse(
      const MbimMessage* message,
      guint32* out_slot_index,
      MbimUiccSlotState* out_state,
      GError** error) override;
  gboolean MbimMessageMsUiccLowLevelAccessOpenChannelResponseParse(
      const MbimMessage* message,
      guint32* out_status,
      guint32* out_channel,
      guint32* out_response_size,
      const guint8** out_response,
      GError** error) override;
  gboolean MbimMessageMsUiccLowLevelAccessApduResponseParse(
      const MbimMessage* message,
      guint32* out_status,
      guint32* out_response_size,
      const guint8** out_response,
      GError** error) override;
  gboolean MbimMessageMsUiccLowLevelAccessCloseChannelResponseParse(
      const MbimMessage* message, guint32* out_status, GError** error) override;
};
}  // namespace hermes

#endif  // HERMES_LIBMBIM_IMPL_H_
