summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFreedom Liu <tianyu28658@gmail.com>2022-02-14 16:35:39 +0800
committerAleksander Morgado <aleksander@aleksander.es>2022-02-28 21:01:02 +0000
commitb7b0c4ca1acdc985b26894c028b43550f25f29d6 (patch)
tree19c3fbc226e322e3f27d361dfe6563538ab22774
parent18555ad244a5a9093e7552ce1485eb02cf84bb17 (diff)
downloadlibqmi-b7b0c4ca1acdc985b26894c028b43550f25f29d6.tar.gz
libqmi-glib,qmicli: new foxconn modem service
-rw-r--r--data/qmi-service-fox.json34
-rw-r--r--docs/reference/libqmi-glib/libqmi-glib-common.sections14
-rw-r--r--docs/reference/libqmi-glib/libqmi-glib-docs.xml11
-rw-r--r--src/libqmi-glib/generated/meson.build3
-rw-r--r--src/libqmi-glib/libqmi-glib.h3
-rw-r--r--src/libqmi-glib/meson.build1
-rw-r--r--src/libqmi-glib/qmi-device.c6
-rw-r--r--src/libqmi-glib/qmi-enums-fox.h56
-rw-r--r--src/libqmi-glib/qmi-enums.h2
-rw-r--r--src/libqmi-glib/qmi-message.c7
-rw-r--r--src/qmicli/meson.build1
-rw-r--r--src/qmicli/qmicli-fox.c241
-rw-r--r--src/qmicli/qmicli-helpers.h3
-rw-r--r--src/qmicli/qmicli.c17
-rw-r--r--src/qmicli/qmicli.h8
15 files changed, 405 insertions, 2 deletions
diff --git a/data/qmi-service-fox.json b/data/qmi-service-fox.json
new file mode 100644
index 00000000..82c219ab
--- /dev/null
+++ b/data/qmi-service-fox.json
@@ -0,0 +1,34 @@
+[
+ // *********************************************************************************
+ { "name" : "FOX",
+ "type" : "Service" },
+
+ // *********************************************************************************
+ { "name" : "QMI Client FOX",
+ "type" : "Client",
+ "since" : "1.32" },
+
+ // *********************************************************************************
+ { "name" : "QMI Message FOX",
+ "type" : "Message-ID-Enum" },
+
+ // *********************************************************************************
+ { "name" : "Get Firmware Version",
+ "type" : "Message",
+ "service" : "FOX",
+ "id" : "0x555E",
+ "since" : "1.32",
+ "input" : [ { "name" : "Version Type",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.32",
+ "format" : "guint8",
+ "public-format" : "QmiFoxFirmwareVersionType" } ],
+ "output" : [ { "common-ref" : "Operation Result" },
+ { "name" : "Version",
+ "id" : "0x01",
+ "type" : "TLV",
+ "since" : "1.32",
+ "format" : "string",
+ "prerequisites": [ { "common-ref" : "Success" } ] } ] }
+]
diff --git a/docs/reference/libqmi-glib/libqmi-glib-common.sections b/docs/reference/libqmi-glib/libqmi-glib-common.sections
index c2f7f19f..cd0be449 100644
--- a/docs/reference/libqmi-glib/libqmi-glib-common.sections
+++ b/docs/reference/libqmi-glib/libqmi-glib-common.sections
@@ -29,6 +29,7 @@ HAVE_QMI_SERVICE_WDA
HAVE_QMI_SERVICE_WDS
HAVE_QMI_SERVICE_WMS
HAVE_QMI_SERVICE_DPM
+HAVE_QMI_SERVICE_FOX
</SECTION>
<SECTION>
@@ -1567,6 +1568,19 @@ qmi_sar_rf_state_get_type
</SECTION>
<SECTION>
+<FILE>qmi-enums-fox</FILE>
+<TITLE>FOX enumerations and flags</TITLE>
+QmiFoxFirmwareVersionType
+<SUBSECTION Methods>
+qmi_fox_firmware_version_type_get_string
+<SUBSECTION Private>
+qmi_fox_firmware_version_type_build_string_from_mask
+<SUBSECTION Standard>
+QMI_TYPE_FOX_FIRMWARE_VERSION_TYPE
+qmi_fox_firmware_version_type_get_type
+</SECTION>
+
+<SECTION>
<FILE>qmi-errors</FILE>
<TITLE>Errors</TITLE>
QmiCoreError
diff --git a/docs/reference/libqmi-glib/libqmi-glib-docs.xml b/docs/reference/libqmi-glib/libqmi-glib-docs.xml
index 114a6494..c8c8d5ea 100644
--- a/docs/reference/libqmi-glib/libqmi-glib-docs.xml
+++ b/docs/reference/libqmi-glib/libqmi-glib-docs.xml
@@ -24,6 +24,7 @@
<year>2019</year>
<year>2020</year>
<year>2021</year>
+ <year>2022</year>
<holder>The libqmi-glib authors</holder>
</copyright>
@@ -547,6 +548,16 @@
</chapter>
<chapter>
+ <title>Foxconn Modem Service (FOX)</title>
+ <xi:include href="xml/qmi-client-fox.xml"/>
+ <xi:include href="xml/qmi-enums-fox.xml"/>
+ <section>
+ <title>FOX Requests</title>
+ <xi:include href="xml/qmi-message-fox-get-firmware-version.xml"/>
+ </section>
+ </chapter>
+
+ <chapter>
<title>Compatibility with older versions</title>
<xi:include href="xml/qmi-compat.xml"/>
</chapter>
diff --git a/src/libqmi-glib/generated/meson.build b/src/libqmi-glib/generated/meson.build
index e5650494..a41acc0e 100644
--- a/src/libqmi-glib/generated/meson.build
+++ b/src/libqmi-glib/generated/meson.build
@@ -67,7 +67,7 @@ gen_headers += custom_target(
command: [
python,
qmi_mkenums,
- '--fhead', '#ifndef __LIBQMI_GLIB_ENUM_TYPES_H__\n#define __LIBQMI_GLIB_ENUM_TYPES_H__\n#include "qmi-enums.h"\n#include "qmi-enums-wds.h"\n#include "qmi-enums-dms.h"\n#include "qmi-enums-nas.h"\n#include "qmi-enums-wms.h"\n#include "qmi-enums-pds.h"\n#include "qmi-enums-pdc.h"\n#include "qmi-enums-pbm.h"\n#include "qmi-enums-uim.h"\n#include "qmi-enums-sar.h"\n#include "qmi-enums-oma.h"\n#include "qmi-enums-wda.h"\n#include "qmi-enums-voice.h"\n#include "qmi-enums-loc.h"\n#include "qmi-enums-qos.h"\n#include "qmi-enums-gas.h"\n#include "qmi-enums-dsd.h"\n#include "qmi-device.h"\n',
+ '--fhead', '#ifndef __LIBQMI_GLIB_ENUM_TYPES_H__\n#define __LIBQMI_GLIB_ENUM_TYPES_H__\n#include "qmi-enums.h"\n#include "qmi-enums-wds.h"\n#include "qmi-enums-dms.h"\n#include "qmi-enums-nas.h"\n#include "qmi-enums-wms.h"\n#include "qmi-enums-pds.h"\n#include "qmi-enums-pdc.h"\n#include "qmi-enums-pbm.h"\n#include "qmi-enums-uim.h"\n#include "qmi-enums-sar.h"\n#include "qmi-enums-oma.h"\n#include "qmi-enums-wda.h"\n#include "qmi-enums-voice.h"\n#include "qmi-enums-loc.h"\n#include "qmi-enums-qos.h"\n#include "qmi-enums-gas.h"\n#include "qmi-enums-dsd.h"\n#include "qmi-enums-fox.h"\n#include "qmi-device.h"\n',
'--template', files(templates_dir / enum_types + '.h.template'),
'--ftail', '#endif /* __LIBQMI_GLIB_ENUM_TYPES_H__ */\n',
'@INPUT@'],
@@ -169,6 +169,7 @@ services = [
'dms',
'dpm',
'dsd',
+ 'fox',
'gas',
'gms',
'loc',
diff --git a/src/libqmi-glib/libqmi-glib.h b/src/libqmi-glib/libqmi-glib.h
index 07bf06bb..867429f7 100644
--- a/src/libqmi-glib/libqmi-glib.h
+++ b/src/libqmi-glib/libqmi-glib.h
@@ -96,6 +96,9 @@
#include "qmi-dpm.h"
+#include "qmi-enums-fox.h"
+#include "qmi-fox.h"
+
/* generated */
#include "qmi-error-types.h"
#include "qmi-enum-types.h"
diff --git a/src/libqmi-glib/meson.build b/src/libqmi-glib/meson.build
index 0a8c0ccd..0102e2e6 100644
--- a/src/libqmi-glib/meson.build
+++ b/src/libqmi-glib/meson.build
@@ -10,6 +10,7 @@ qmi_enums_headers = files(
'qmi-enums.h',
'qmi-enums-dms.h',
'qmi-enums-dsd.h',
+ 'qmi-enums-fox.h',
'qmi-enums-gas.h',
'qmi-enums-loc.h',
'qmi-enums-nas.h',
diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-device.c
index ae9f6912..3c149154 100644
--- a/src/libqmi-glib/qmi-device.c
+++ b/src/libqmi-glib/qmi-device.c
@@ -55,6 +55,7 @@
#include "qmi-gms.h"
#include "qmi-dsd.h"
#include "qmi-dpm.h"
+#include "qmi-fox.h"
#include "qmi-utils.h"
#include "qmi-helpers.h"
#include "qmi-error-types.h"
@@ -1277,6 +1278,11 @@ qmi_device_allocate_client (QmiDevice *self,
ctx->client_type = QMI_TYPE_CLIENT_DPM;
#endif
break;
+ case QMI_SERVICE_FOX:
+#if defined HAVE_QMI_SERVICE_FOX
+ ctx->client_type = QMI_TYPE_CLIENT_FOX;
+#endif
+ break;
case QMI_SERVICE_UNKNOWN:
g_assert_not_reached ();
diff --git a/src/libqmi-glib/qmi-enums-fox.h b/src/libqmi-glib/qmi-enums-fox.h
new file mode 100644
index 00000000..8126b4eb
--- /dev/null
+++ b/src/libqmi-glib/qmi-enums-fox.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * libqmi-glib -- GLib/GIO based library to control QMI devices
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2022 Freedom Liu <lk@linuxdev.top>
+ */
+
+#ifndef _LIBQMI_GLIB_QMI_ENUMS_FOX_H_
+#define _LIBQMI_GLIB_QMI_ENUMS_FOX_H_
+
+#if !defined (__LIBQMI_GLIB_H_INSIDE__) && !defined (LIBQMI_GLIB_COMPILATION)
+#error "Only <libqmi-glib.h> can be included directly."
+#endif
+
+/**
+ * SECTION: qmi-enums-fox
+ * @title: FOX enumerations and flags
+ * @short_description: Enumerations and flags in the FOX service.
+ *
+ * This section defines enumerations and flags used in the FOX service
+ * interface.
+ */
+
+/**
+ * QmiFoxFirmwareVersionType:
+ * @QMI_FOX_FIRMWARE_VERSION_TYPE_FIRMWARE_MCFG: E.g. T99W265.F0.0.0.0.1.GC.004.
+ * @QMI_FOX_FIRMWARE_VERSION_TYPE_FIRMWARE_MCFG_APPS: E.g. T99W265.F0.0.0.0.1.GC.004.001.
+ * @QMI_FOX_FIRMWARE_VERSION_TYPE_APPS: E.g. 001.
+ *
+ * Foxconn specific firmware version types.
+ *
+ * Since: 1.32
+ */
+typedef enum { /*< since=1.32 >*/
+ QMI_FOX_FIRMWARE_VERSION_TYPE_FIRMWARE_MCFG = 0x00,
+ QMI_FOX_FIRMWARE_VERSION_TYPE_FIRMWARE_MCFG_APPS = 0x01,
+ QMI_FOX_FIRMWARE_VERSION_TYPE_APPS = 0x02,
+} QmiFoxFirmwareVersionType;
+
+#endif /* _LIBQMI_GLIB_QMI_ENUMS_FOX_H_ */
+
diff --git a/src/libqmi-glib/qmi-enums.h b/src/libqmi-glib/qmi-enums.h
index 7708913a..b50841c2 100644
--- a/src/libqmi-glib/qmi-enums.h
+++ b/src/libqmi-glib/qmi-enums.h
@@ -85,6 +85,7 @@
* @QMI_SERVICE_CAT: Card Application Toolkit service (v1).
* @QMI_SERVICE_RMS: Remote Management Service.
* @QMI_SERVICE_OMA: Open Mobile Alliance device management service.
+ * @QMI_SERVICE_FOX: Foxconn General Modem Service. Since: 1.32.
* @QMI_SERVICE_FOTA: Firmware Over The Air service. Since: 1.24.
* @QMI_SERVICE_GMS: Telit General Modem Service. Since: 1.24.
* @QMI_SERVICE_GAS: Telit General Application Service. Since: 1.24.
@@ -143,6 +144,7 @@ typedef enum { /*< since=1.0 >*/
QMI_SERVICE_CAT = 0xE0,
QMI_SERVICE_RMS = 0xE1,
QMI_SERVICE_OMA = 0xE2,
+ QMI_SERVICE_FOX = 0xE3,
QMI_SERVICE_FOTA = 0xE6,
QMI_SERVICE_GMS = 0xE7,
QMI_SERVICE_GAS = 0xE8,
diff --git a/src/libqmi-glib/qmi-message.c b/src/libqmi-glib/qmi-message.c
index 92895ea4..d92a14bc 100644
--- a/src/libqmi-glib/qmi-message.c
+++ b/src/libqmi-glib/qmi-message.c
@@ -59,6 +59,7 @@
#include "qmi-dsd.h"
#include "qmi-sar.h"
#include "qmi-dpm.h"
+#include "qmi-fox.h"
#define PACKED __attribute__((packed))
@@ -1721,6 +1722,11 @@ qmi_message_get_printable_full (QmiMessage *self,
contents = __qmi_message_dpm_get_printable (self, context, line_prefix);
#endif
break;
+ case QMI_SERVICE_FOX:
+#if defined HAVE_QMI_SERVICE_FOX
+ contents = __qmi_message_fox_get_printable (self, context, line_prefix);
+#endif
+ break;
case QMI_SERVICE_UNKNOWN:
g_assert_not_reached ();
@@ -1836,6 +1842,7 @@ __qmi_message_is_abortable (QmiMessage *self,
case QMI_SERVICE_PDC:
case QMI_SERVICE_DSD:
case QMI_SERVICE_QOS:
+ case QMI_SERVICE_FOX:
default:
return FALSE;
}
diff --git a/src/qmicli/meson.build b/src/qmicli/meson.build
index c7945242..7a68533c 100644
--- a/src/qmicli/meson.build
+++ b/src/qmicli/meson.build
@@ -18,6 +18,7 @@ sources = files(
'qmicli-dms.c',
'qmicli-dpm.c',
'qmicli-dsd.c',
+ 'qmicli-fox.c',
'qmicli-gas.c',
'qmicli-gms.c',
'qmicli-link-management.c',
diff --git a/src/qmicli/qmicli-fox.c b/src/qmicli/qmicli-fox.c
new file mode 100644
index 00000000..43d628e8
--- /dev/null
+++ b/src/qmicli/qmicli-fox.c
@@ -0,0 +1,241 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * qmicli -- Command line interface to control QMI devices
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (C) 2022 Freedom Liu <lk@linuxdev.top>
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <string.h>
+#include <assert.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <libqmi-glib.h>
+
+#include "qmicli.h"
+#include "qmicli-helpers.h"
+
+#if defined HAVE_QMI_SERVICE_FOX
+
+#undef VALIDATE_UNKNOWN
+#define VALIDATE_UNKNOWN(str) (str ? str : "unknown")
+
+/* Context */
+typedef struct {
+ QmiDevice *device;
+ QmiClientFox *client;
+ GCancellable *cancellable;
+} Context;
+static Context *ctx;
+
+/* Options */
+static gchar *get_firmware_version_str;
+static gboolean noop_flag;
+
+static GOptionEntry entries[] = {
+#if defined HAVE_QMI_MESSAGE_FOX_GET_FIRMWARE_VERSION
+ { "fox-get-firmware-version", 0, 0, G_OPTION_ARG_STRING, &get_firmware_version_str,
+ "Get firmware version",
+ "[firmware-mcfg-apps|firmware-mcfg|apps]"
+ },
+#endif
+ { "fox-noop", 0, 0, G_OPTION_ARG_NONE, &noop_flag,
+ "Just allocate or release a FOX client. Use with `--client-no-release-cid' and/or `--client-cid'",
+ NULL
+ },
+ { NULL }
+};
+
+GOptionGroup *
+qmicli_fox_get_option_group (void)
+{
+ GOptionGroup *group;
+
+ group = g_option_group_new ("fox",
+ "FOX options:",
+ "Show Foxconn Modem Service options",
+ NULL,
+ NULL);
+ g_option_group_add_entries (group, entries);
+
+ return group;
+}
+
+gboolean
+qmicli_fox_options_enabled (void)
+{
+ static guint n_actions = 0;
+ static gboolean checked = FALSE;
+
+ if (checked)
+ return !!n_actions;
+
+ n_actions = (!!get_firmware_version_str +
+ noop_flag);
+
+ if (n_actions > 1) {
+ g_printerr ("error: too many FOX actions requested\n");
+ exit (EXIT_FAILURE);
+ }
+
+ checked = TRUE;
+ return !!n_actions;
+}
+
+static void
+context_free (Context *context)
+{
+ if (!context)
+ return;
+
+ if (context->cancellable)
+ g_object_unref (context->cancellable);
+ if (context->device)
+ g_object_unref (context->device);
+ if (context->client)
+ g_object_unref (context->client);
+ g_slice_free (Context, context);
+}
+
+static void
+operation_shutdown (gboolean operation_status)
+{
+ /* Cleanup context and finish async operation */
+ context_free (ctx);
+ qmicli_async_operation_done (operation_status, FALSE);
+}
+
+#if defined HAVE_QMI_MESSAGE_FOX_GET_FIRMWARE_VERSION
+
+static QmiMessageFoxGetFirmwareVersionInput *
+get_firmware_version_input_create (const gchar *str)
+{
+ QmiMessageFoxGetFirmwareVersionInput *input = NULL;
+ QmiFoxFirmwareVersionType type;
+ GError *error = NULL;
+
+ if (!qmicli_read_fox_firmware_version_type_from_string (str, &type)) {
+ g_printerr ("error: couldn't parse input firmware version type : '%s'\n", str);
+ return NULL;
+ }
+
+ input = qmi_message_fox_get_firmware_version_input_new ();
+ if (!qmi_message_fox_get_firmware_version_input_set_version_type (input, type, &error)) {
+ g_printerr ("error: couldn't create input data bundle: '%s'\n",
+ error->message);
+ g_error_free (error);
+ qmi_message_fox_get_firmware_version_input_unref (input);
+ return NULL;
+ }
+
+ return input;
+}
+
+static void
+get_firmware_version_ready (QmiClientFox *client,
+ GAsyncResult *res)
+{
+ const gchar *str = NULL;
+ QmiMessageFoxGetFirmwareVersionOutput *output;
+ GError *error = NULL;
+
+ output = qmi_client_fox_get_firmware_version_finish (client, res, &error);
+ if (!output) {
+ g_printerr ("error: operation failed: %s\n", error->message);
+ g_error_free (error);
+ operation_shutdown (FALSE);
+ return;
+ }
+
+ if (!qmi_message_fox_get_firmware_version_output_get_result (output, &error)) {
+ g_printerr ("error: couldn't get firmware version: %s\n", error->message);
+ g_error_free (error);
+ qmi_message_fox_get_firmware_version_output_unref (output);
+ operation_shutdown (FALSE);
+ return;
+ }
+
+ qmi_message_fox_get_firmware_version_output_get_version (output, &str, NULL);
+
+ g_print ("[%s] Firmware version retrieved:\n"
+ "\tVersion: '%s'\n",
+ qmi_device_get_path_display (ctx->device),
+ VALIDATE_UNKNOWN (str));
+
+ qmi_message_fox_get_firmware_version_output_unref (output);
+ operation_shutdown (TRUE);
+}
+
+#endif /* HAVE_QMI_MESSAGE_FOX_GET_FIRMWARE_VERSION */
+
+static gboolean
+noop_cb (gpointer unused)
+{
+ operation_shutdown (TRUE);
+ return FALSE;
+}
+
+void
+qmicli_fox_run (QmiDevice *device,
+ QmiClientFox *client,
+ GCancellable *cancellable)
+{
+ /* Initialize context */
+ ctx = g_slice_new (Context);
+ ctx->device = g_object_ref (device);
+ ctx->client = g_object_ref (client);
+ ctx->cancellable = g_object_ref (cancellable);
+
+#if defined HAVE_QMI_MESSAGE_FOX_GET_FIRMWARE_VERSION
+ if (get_firmware_version_str) {
+ QmiMessageFoxGetFirmwareVersionInput *input;
+
+ g_debug ("Asynchronously getting firmware version...");
+
+ input = get_firmware_version_input_create (get_firmware_version_str);
+ if (!input) {
+ operation_shutdown (FALSE);
+ return;
+ }
+
+ qmi_client_fox_get_firmware_version (ctx->client,
+ input,
+ 10,
+ ctx->cancellable,
+ (GAsyncReadyCallback)get_firmware_version_ready,
+ NULL);
+ qmi_message_fox_get_firmware_version_input_unref (input);
+ return;
+ }
+#endif
+
+ /* Just client allocate/release? */
+ if (noop_flag) {
+ g_idle_add (noop_cb, NULL);
+ return;
+ }
+
+ g_warn_if_reached ();
+}
+
+#endif /* HAVE_QMI_SERVICE_FOX */
+
diff --git a/src/qmicli/qmicli-helpers.h b/src/qmicli/qmicli-helpers.h
index 6d1edcb1..8c31031a 100644
--- a/src/qmicli/qmicli-helpers.h
+++ b/src/qmicli/qmicli-helpers.h
@@ -55,7 +55,8 @@
QMICLI_ENUM_LIST_ITEM (QmiWmsMessageType, wms_message_type, "message type" ) \
QMICLI_ENUM_LIST_ITEM (QmiWmsMessageClass, wms_message_class, "message class" ) \
QMICLI_ENUM_LIST_ITEM (QmiWmsStorageType, wms_storage_type, "storage type" ) \
- QMICLI_ENUM_LIST_ITEM (QmiWmsReceiptAction, wms_receipt_action, "receipt action" )
+ QMICLI_ENUM_LIST_ITEM (QmiWmsReceiptAction, wms_receipt_action, "receipt action" ) \
+ QMICLI_ENUM_LIST_ITEM (QmiFoxFirmwareVersionType, fox_firmware_version_type, "fox firmware version type")
#define QMICLI_ENUM_LIST_ITEM(TYPE,TYPE_UNDERSCORE,DESCR) \
gboolean qmicli_read_## TYPE_UNDERSCORE ##_from_string (const gchar *str, TYPE *out);
diff --git a/src/qmicli/qmicli.c b/src/qmicli/qmicli.c
index 44d18f98..76d0565e 100644
--- a/src/qmicli/qmicli.c
+++ b/src/qmicli/qmicli.c
@@ -463,6 +463,13 @@ allocate_client_ready (QmiDevice *dev,
#else
break;
#endif
+ case QMI_SERVICE_FOX:
+#if defined HAVE_QMI_SERVICE_FOX
+ qmicli_fox_run (dev, QMI_CLIENT_FOX (client), cancellable);
+ return;
+#else
+ break;
+#endif
case QMI_SERVICE_UNKNOWN:
case QMI_SERVICE_CTL:
case QMI_SERVICE_AUTH:
@@ -913,6 +920,13 @@ parse_actions (void)
}
#endif
+#if defined HAVE_QMI_SERVICE_FOX
+ if (qmicli_fox_options_enabled ()) {
+ service = QMI_SERVICE_FOX;
+ actions_enabled++;
+ }
+#endif
+
/* Cannot mix actions from different services */
if (actions_enabled > 1) {
g_printerr ("error: cannot execute multiple actions of different services\n");
@@ -986,6 +1000,9 @@ int main (int argc, char **argv)
#if defined HAVE_QMI_SERVICE_DPM
g_option_context_add_group (context, qmicli_dpm_get_option_group ());
#endif
+#if defined HAVE_QMI_SERVICE_FOX
+ g_option_context_add_group (context, qmicli_fox_get_option_group ());
+#endif
g_option_context_add_group (context, qmicli_link_management_get_option_group ());
g_option_context_add_group (context, qmicli_qmiwwan_get_option_group ());
g_option_context_add_main_entries (context, main_entries, NULL);
diff --git a/src/qmicli/qmicli.h b/src/qmicli/qmicli.h
index 7800c2cc..7bf1d419 100644
--- a/src/qmicli/qmicli.h
+++ b/src/qmicli/qmicli.h
@@ -169,4 +169,12 @@ void qmicli_dpm_run (QmiDevice *device,
GCancellable *cancellable);
#endif
+#if defined HAVE_QMI_SERVICE_FOX
+GOptionGroup *qmicli_fox_get_option_group (void);
+gboolean qmicli_fox_options_enabled (void);
+void qmicli_fox_run (QmiDevice *device,
+ QmiClientFox *client,
+ GCancellable *cancellable);
+#endif
+
#endif /* __QMICLI_H__ */