diff options
-rw-r--r-- | .gitignore | 5 | ||||
-rw-r--r-- | src/Makefile.am | 26 | ||||
-rw-r--r-- | src/qmi-client-ctl.c | 497 | ||||
-rw-r--r-- | src/qmi-client-ctl.h | 99 | ||||
-rw-r--r-- | src/qmi-client.c | 2 | ||||
-rw-r--r-- | src/qmi-ctl.h | 62 | ||||
-rw-r--r-- | src/qmi-device.c | 111 | ||||
-rw-r--r-- | src/qmi-message-ctl.c | 334 | ||||
-rw-r--r-- | src/qmi-message-ctl.h | 67 | ||||
-rw-r--r-- | src/qmi-message.c | 2 |
10 files changed, 103 insertions, 1102 deletions
@@ -38,8 +38,9 @@ src/qmi-error-types.c src/qmi-error-types.h src/qmi-enum-types.h src/qmi-enum-types.c -src/qmi-tmp-ctl.h -src/qmi-tmp-ctl.c +src/qmi-ctl.h +src/qmi-ctl.c +src/*.stamp cli/.deps cli/.libs diff --git a/src/Makefile.am b/src/Makefile.am index b338a76..2fa6ba3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -37,21 +37,20 @@ qmi-enum-types.c: $(ENUMS) qmi-enum-types.h $(top_srcdir)/build-aux/templates/qm --template $(top_srcdir)/build-aux/templates/qmi-enum-types-template.c \ $(ENUMS) > $@ -# QMI message handling generation -qmi-tmp-ctl.c qmi-tmp-ctl.h: $(top_srcdir)/data/qmi-service-ctl.json $(top_srcdir)/build-aux/qmi-codegen/*.py $(top_srcdir)/build-aux/qmi-codegen/qmi-codegen +# CTL service +qmi-ctl.stamp: $(top_srcdir)/data/qmi-service-ctl.json $(top_srcdir)/build-aux/qmi-codegen/*.py $(top_srcdir)/build-aux/qmi-codegen/qmi-codegen $(AM_V_GEN) $(top_srcdir)/build-aux/qmi-codegen/qmi-codegen \ $(top_srcdir)/data/qmi-service-ctl.json \ - qmi-tmp-ctl + qmi-ctl && \ + touch $@ # Additional dependencies qmi-device.c: qmi-error-types.h qmi-enum-types.h qmi-client.c: qmi-error-types.h qmi-enum-types.h -qmi-client-ctl.c: qmi-error-types.h qmi-enum-types.h qmi-message.c: qmi-error-types.h qmi-enum-types.h -qmi-message-ctl.c: qmi-error-types.h qmi-message-dms.c: qmi-error-types.h -qmi-tmp-*.c: qmi-error-types.h -qmi-tmp-*.h: qmi-enum-types.h +qmi-ctl.h: qmi-ctl.stamp +qmi-ctl.c: qmi-error-types.h qmi-enum-types.h qmi-ctl.stamp libqmi_glib_la_SOURCES = \ libqmi-glib.h \ @@ -59,16 +58,16 @@ libqmi_glib_la_SOURCES = \ qmi-enums.h qmi-enum-types.h qmi-enum-types.c \ qmi-utils.h qmi-utils.c \ qmi-message.h qmi-message.c \ - qmi-tmp-ctl.c qmi-tmp-ctl.h \ - qmi-message-ctl.h qmi-message-ctl.c \ - qmi-message-dms.h qmi-message-dms.c \ - qmi-message-wds.h qmi-message-wds.c \ qmi-device.h qmi-device.c \ qmi-client.h qmi-client.c \ - qmi-ctl.h qmi-client-ctl.h qmi-client-ctl.c \ + qmi-message-dms.h qmi-message-dms.c \ + qmi-message-wds.h qmi-message-wds.c \ qmi-dms.h qmi-client-dms.h qmi-client-dms.c \ qmi-wds.h qmi-client-wds.h qmi-client-wds.c +nodist_libqmi_glib_la_SOURCES = \ + qmi-ctl.c qmi-ctl.h + libqmi_glib_la_LIBADD = \ $(LIBQMI_GLIB_LIBS) @@ -81,3 +80,6 @@ include_HEADERS = \ qmi-client.h \ qmi-dms.h qmi-client-dms.h \ qmi-wds.h qmi-client-wds.h + +CLEANFILES = \ + qmi-ctl.h qmi-ctl.c qmi-ctl.stamp diff --git a/src/qmi-client-ctl.c b/src/qmi-client-ctl.c deleted file mode 100644 index 33237ad..0000000 --- a/src/qmi-client-ctl.c +++ /dev/null @@ -1,497 +0,0 @@ -/* -*- 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) 2012 Aleksander Morgado <aleksander@lanedo.com> - */ - -#include <gio/gio.h> - -#include "qmi-error-types.h" -#include "qmi-enum-types.h" -#include "qmi-device.h" -#include "qmi-client-ctl.h" -#include "qmi-message-ctl.h" - -G_DEFINE_TYPE (QmiClientCtl, qmi_client_ctl, QMI_TYPE_CLIENT) - -/*****************************************************************************/ -/* Get version info */ - -/** - * qmi_client_ctl_get_version_info_finish: - * @res: a #GAsyncResult. - * @error: a #GError. - * - * Finishes an operation started with qmi_client_ctl_get_version_info(). - * - * Returns: A #GPtrArray of #QmiCtlVersionInfo, or #NULL if @error is set. - */ -GPtrArray * -qmi_client_ctl_get_version_info_finish (QmiClientCtl *self, - GAsyncResult *res, - GError **error) -{ - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) - return NULL; - - return g_ptr_array_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res))); -} - -static void -version_info_ready (QmiDevice *device, - GAsyncResult *res, - GSimpleAsyncResult *simple) -{ - GError *error = NULL; - QmiMessage *reply; - GPtrArray *result; - - reply = qmi_device_command_finish (device, res, &error); - if (!reply) { - g_prefix_error (&error, "Version info check failed: "); - g_simple_async_result_take_error (simple, error); - g_simple_async_result_complete (simple); - g_object_unref (simple); - return; - } - - /* Parse version reply */ - result = qmi_message_ctl_version_info_reply_parse (reply, &error); - if (!result) { - g_prefix_error (&error, "Version info reply parsing failed: "); - g_simple_async_result_take_error (simple, error); - } else - g_simple_async_result_set_op_res_gpointer (simple, - result, - (GDestroyNotify)g_ptr_array_unref); - - g_simple_async_result_complete (simple); - g_object_unref (simple); - qmi_message_unref (reply); -} - -/** - * qmi_client_ctl_get_version_info: - * @self: a #QmiClientCtl. - * @timeout: maximum time to wait to get the operation completed. - * @cancellable: optional #GCancellable object, #NULL to ignore. - * @callback: a #GAsyncReadyCallback to call when the operation is finished. - * @user_data: the data to pass to callback function. - * - * Get list of supported services. - * When the query is finished, @callback will be called. You can then call - * qmi_client_ctl_get_version_info_finish() to get the the result of the operation. - */ -void -qmi_client_ctl_get_version_info (QmiClientCtl *self, - guint timeout, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GSimpleAsyncResult *result; - QmiMessage *request; - - result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - qmi_client_ctl_get_version_info); - - request = qmi_message_ctl_version_info_new (qmi_client_get_next_transaction_id (QMI_CLIENT (self))); - qmi_device_command (QMI_DEVICE (qmi_client_peek_device (QMI_CLIENT (self))), - request, - timeout, - cancellable, - (GAsyncReadyCallback)version_info_ready, - result); - qmi_message_unref (request); -} - -/*****************************************************************************/ -/* Allocate CID */ - -typedef struct { - QmiClientCtl *self; - GSimpleAsyncResult *result; - QmiService service; -} AllocateCidContext; - -static void -allocate_cid_context_complete_and_free (AllocateCidContext *ctx) -{ - g_simple_async_result_complete (ctx->result); - g_object_unref (ctx->result); - g_object_unref (ctx->self); - g_slice_free (AllocateCidContext, ctx); -} - -/** - * qmi_client_ctl_allocate_cid_finish: - * @self: a #QmiClientCtl. - * @res: a #GAsyncResult. - * @error: a #GError. - * - * Finishes an operation started with qmi_client_ctl_allocate_cid(). - * - * Returns: the new CID, or 0 if @error is set. - */ -guint8 -qmi_client_ctl_allocate_cid_finish (QmiClientCtl *self, - GAsyncResult *res, - GError **error) -{ - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) - return 0; - - return (guint8) GPOINTER_TO_UINT (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res))); -} - -static void -allocate_cid_ready (QmiDevice *device, - GAsyncResult *res, - AllocateCidContext *ctx) -{ - GError *error = NULL; - QmiMessage *reply; - guint8 cid; - QmiService service; - - reply = qmi_device_command_finish (device, res, &error); - if (!reply) { - g_prefix_error (&error, "CID allocation failed: "); - g_simple_async_result_take_error (ctx->result, error); - allocate_cid_context_complete_and_free (ctx); - return; - } - - /* Parse reply */ - cid = 0; - service = QMI_SERVICE_UNKNOWN; - if (!qmi_message_ctl_allocate_cid_reply_parse (reply, &cid, &service, &error)) { - g_prefix_error (&error, "CID allocation reply parsing failed: "); - g_simple_async_result_take_error (ctx->result, error); - allocate_cid_context_complete_and_free (ctx); - qmi_message_unref (reply); - return; - } - - /* The service we got must match the one we requested */ - if (service != ctx->service) { - g_simple_async_result_set_error (ctx->result, - QMI_CORE_ERROR, - QMI_CORE_ERROR_FAILED, - "Service mismatch (%s vs %s)", - qmi_service_get_string (service), - qmi_service_get_string (ctx->service)); - allocate_cid_context_complete_and_free (ctx); - qmi_message_unref (reply); - return; - } - - g_debug ("Allocated client ID '%u' for service '%s'", - cid, - qmi_service_get_string (ctx->service)); - - /* Set the CID as result */ - g_simple_async_result_set_op_res_gpointer (ctx->result, - GUINT_TO_POINTER ((guint)cid), - NULL); - allocate_cid_context_complete_and_free (ctx); - qmi_message_unref (reply); -} - -/** - * qmi_client_ctl_allocate_cid: - * @self: a #QmiClientCtl. - * @service: a #QmiService. - * @timeout: maximum time to wait to get the operation completed. - * @cancellable: optional #GCancellable object, #NULL to ignore. - * @callback: a #GAsyncReadyCallback to call when the operation is finished. - * @user_data: the data to pass to callback function. - * - * Allocate a new client ID for the given @service.. - * When the query is finished, @callback will be called. You can then call - * qmi_client_ctl_allocate_cid_finish() to get the the result of the operation. - */ -void -qmi_client_ctl_allocate_cid (QmiClientCtl *self, - QmiService service, - guint timeout, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - AllocateCidContext *ctx; - QmiMessage *request; - - ctx = g_slice_new (AllocateCidContext); - ctx->self = g_object_ref (self); - ctx->service = service; - ctx->result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - qmi_client_ctl_allocate_cid); - - request = qmi_message_ctl_allocate_cid_new (qmi_client_get_next_transaction_id (QMI_CLIENT (self)), - service); - qmi_device_command (QMI_DEVICE (qmi_client_peek_device (QMI_CLIENT (self))), - request, - timeout, - cancellable, - (GAsyncReadyCallback)allocate_cid_ready, - ctx); - qmi_message_unref (request); -} - -/*****************************************************************************/ -/* Release CID */ - -typedef struct { - QmiClientCtl *self; - GSimpleAsyncResult *result; - QmiService service; - guint8 cid; -} ReleaseCidContext; - -static void -release_cid_context_complete_and_free (ReleaseCidContext *ctx) -{ - g_simple_async_result_complete (ctx->result); - g_object_unref (ctx->result); - g_object_unref (ctx->self); - g_slice_free (ReleaseCidContext, ctx); -} - -/** - * qmi_client_ctl_release_cid_finish: - * @self: a #QmiClientCtl. - * @res: a #GAsyncResult. - * @error: a #GError. - * - * Finishes an operation started with qmi_client_ctl_release_cid(). - * - * Returns: #TRUE if the operation succeeded, or #FALSE if @error is set. - */ -gboolean -qmi_client_ctl_release_cid_finish (QmiClientCtl *self, - GAsyncResult *res, - GError **error) -{ - return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); -} - -static void -release_cid_ready (QmiDevice *device, - GAsyncResult *res, - ReleaseCidContext *ctx) -{ - GError *error = NULL; - QmiMessage *reply; - guint8 cid; - QmiService service; - - reply = qmi_device_command_finish (device, res, &error); - if (!reply) { - g_prefix_error (&error, "CID release failed: "); - g_simple_async_result_take_error (ctx->result, error); - release_cid_context_complete_and_free (ctx); - return; - } - - /* Parse reply */ - cid = 0; - service = QMI_SERVICE_UNKNOWN; - if (!qmi_message_ctl_release_cid_reply_parse (reply, &cid, &service, &error)) { - g_prefix_error (&error, "CID release reply parsing failed: "); - g_simple_async_result_take_error (ctx->result, error); - release_cid_context_complete_and_free (ctx); - qmi_message_unref (reply); - return; - } - - /* The service we got must match the one we requested */ - if (service != ctx->service) { - g_simple_async_result_set_error (ctx->result, - QMI_CORE_ERROR, - QMI_CORE_ERROR_FAILED, - "Service mismatch (%s vs %s)", - qmi_service_get_string (service), - qmi_service_get_string (ctx->service)); - release_cid_context_complete_and_free (ctx); - qmi_message_unref (reply); - return; - } - - /* The cid we got must match the one we requested */ - if (cid != ctx->cid) { - g_simple_async_result_set_error (ctx->result, - QMI_CORE_ERROR, - QMI_CORE_ERROR_FAILED, - "CID mismatch (%s vs %s)", - qmi_service_get_string (service), - qmi_service_get_string (ctx->service)); - release_cid_context_complete_and_free (ctx); - qmi_message_unref (reply); - return; - } - - g_debug ("Released client ID '%u' for service '%s'", - cid, - qmi_service_get_string (service)); - - /* Set the CID as result */ - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); - release_cid_context_complete_and_free (ctx); - qmi_message_unref (reply); -} - -/** - * qmi_client_ctl_release_cid: - * @self: a #QmiClientCtl. - * @service: a #QmiService. - * @cid: the client ID to release. - * @timeout: maximum time to wait to get the operation completed. - * @cancellable: optional #GCancellable object, #NULL to ignore. - * @callback: a #GAsyncReadyCallback to call when the operation is finished. - * @user_data: the data to pass to callback function. - * - * Release a previously allocated client ID for the given @service. - * When the query is finished, @callback will be called. You can then call - * qmi_client_ctl_release_cid_finish() to get the the result of the operation. - */ -void -qmi_client_ctl_release_cid (QmiClientCtl *self, - QmiService service, - guint8 cid, - guint timeout, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - ReleaseCidContext *ctx; - QmiMessage *request; - - ctx = g_slice_new (ReleaseCidContext); - ctx->self = g_object_ref (self); - ctx->service = service; - ctx->cid = cid; - ctx->result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - qmi_client_ctl_release_cid); - - request = qmi_message_ctl_release_cid_new (qmi_client_get_next_transaction_id (QMI_CLIENT (self)), - service, - cid); - qmi_device_command (QMI_DEVICE (qmi_client_peek_device (QMI_CLIENT (self))), - request, - timeout, - cancellable, - (GAsyncReadyCallback)release_cid_ready, - ctx); - qmi_message_unref (request); -} - -/*****************************************************************************/ -/* Sync */ - -/** - * qmi_client_ctl_sync_finish: - * @self: a #QmiClientCtl. - * @res: a #GAsyncResult. - * @error: a #GError. - * - * Finishes an operation started with qmi_client_ctl_sync(). - * - * Returns: #TRUE if the operation succeeded, or #FALSE if @error is set. - */ -gboolean -qmi_client_ctl_sync_finish (QmiClientCtl *self, - GAsyncResult *res, - GError **error) -{ - return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); -} - -static void -sync_command_ready (QmiDevice *device, - GAsyncResult *res, - GSimpleAsyncResult *simple) -{ - GError *error = NULL; - QmiMessage *reply; - - reply = qmi_device_command_finish (device, res, &error); - if (!reply) - g_simple_async_result_take_error (simple, error); - else { - g_simple_async_result_set_op_res_gboolean (simple, TRUE); - qmi_message_unref (reply); - } - - g_simple_async_result_complete (simple); - g_object_unref (simple); -} - -/** - * qmi_client_ctl_sync: - * @self: a #QmiClientCtl. - * @timeout: maximum time to wait to get the operation completed. - * @cancellable: optional #GCancellable object, #NULL to ignore. - * @callback: a #GAsyncReadyCallback to call when the operation is finished. - * @user_data: the data to pass to callback function. - * - * Request to sync with the device. - * When the operation is finished, @callback will be called. You can then call - * qmi_client_ctl_sync_finish() to get the the result of the operation. - */ -void -qmi_client_ctl_sync (QmiClientCtl *self, - guint timeout, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GSimpleAsyncResult *result; - QmiMessage *request; - - result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - qmi_client_ctl_sync); - - request = qmi_message_ctl_sync_new (qmi_client_get_next_transaction_id (QMI_CLIENT (self))); - qmi_device_command (QMI_DEVICE (qmi_client_peek_device (QMI_CLIENT (self))), - request, - timeout, - cancellable, - (GAsyncReadyCallback)sync_command_ready, - result); - qmi_message_unref (request); -} - -static void -qmi_client_ctl_init (QmiClientCtl *self) -{ -} - -static void -qmi_client_ctl_class_init (QmiClientCtlClass *klass) -{ -} diff --git a/src/qmi-client-ctl.h b/src/qmi-client-ctl.h deleted file mode 100644 index d264ab2..0000000 --- a/src/qmi-client-ctl.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -*- 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) 2012 Aleksander Morgado <aleksander@lanedo.com> - */ - -#ifndef _LIBQMI_GLIB_QMI_CLIENT_CTL_H_ -#define _LIBQMI_GLIB_QMI_CLIENT_CTL_H_ - -#include <glib-object.h> - -#include "qmi-client.h" -#include "qmi-ctl.h" - -G_BEGIN_DECLS - -#define QMI_TYPE_CLIENT_CTL (qmi_client_ctl_get_type ()) -#define QMI_CLIENT_CTL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), QMI_TYPE_CLIENT_CTL, QmiClientCtl)) -#define QMI_CLIENT_CTL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), QMI_TYPE_CLIENT_CTL, QmiClientCtlClass)) -#define QMI_IS_CLIENT_CTL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), QMI_TYPE_CLIENT_CTL)) -#define QMI_IS_CLIENT_CTL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), QMI_TYPE_CLIENT_CTL)) -#define QMI_CLIENT_CTL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), QMI_TYPE_CLIENT_CTL, QmiClientCtlClass)) - -typedef struct _QmiClientCtl QmiClientCtl; -typedef struct _QmiClientCtlClass QmiClientCtlClass; - -struct _QmiClientCtl { - QmiClient parent; - gpointer priv_unused; -}; - -struct _QmiClientCtlClass { - QmiClientClass parent; -}; - -GType qmi_client_ctl_get_type (void); - -/* Version info */ -void qmi_client_ctl_get_version_info (QmiClientCtl *self, - guint timeout, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -GPtrArray *qmi_client_ctl_get_version_info_finish (QmiClientCtl *self, - GAsyncResult *res, - GError **error); - -/* Allocate CID */ -void qmi_client_ctl_allocate_cid (QmiClientCtl *self, - QmiService service, - guint timeout, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -guint8 qmi_client_ctl_allocate_cid_finish (QmiClientCtl *self, - GAsyncResult *res, - GError **error); - -/* Release CID */ -void qmi_client_ctl_release_cid (QmiClientCtl *self, - QmiService service, - guint8 cid, - guint timeout, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -gboolean qmi_client_ctl_release_cid_finish (QmiClientCtl *self, - GAsyncResult *res, - GError **error); - -/* Sync */ -void qmi_client_ctl_sync (QmiClientCtl *self, - guint timeout, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -gboolean qmi_client_ctl_sync_finish (QmiClientCtl *self, - GAsyncResult *res, - GError **error); - -G_END_DECLS - -#endif /* _LIBQMI_GLIB_QMI_CLIENT_CTL_H_ */ diff --git a/src/qmi-client.c b/src/qmi-client.c index 509fe3a..f3e6bab 100644 --- a/src/qmi-client.c +++ b/src/qmi-client.c @@ -26,7 +26,7 @@ #include "qmi-enum-types.h" #include "qmi-device.h" #include "qmi-client.h" -#include "qmi-client-ctl.h" +#include "qmi-ctl.h" G_DEFINE_ABSTRACT_TYPE (QmiClient, qmi_client, G_TYPE_OBJECT); diff --git a/src/qmi-ctl.h b/src/qmi-ctl.h deleted file mode 100644 index ad1edbc..0000000 --- a/src/qmi-ctl.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- 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) 2012 Aleksander Morgado <aleksander@gnu.org> - */ - -#ifndef _LIBQMI_GLIB_QMI_CTL_H_ -#define _LIBQMI_GLIB_QMI_CTL_H_ - -#include <glib.h> - -#include "qmi-enums.h" - -G_BEGIN_DECLS - -/*****************************************************************************/ -/* Supported/known messages */ -typedef enum { - QMI_CTL_MESSAGE_SET_INSTANCE_ID = 0x0020, /* unused currently */ - QMI_CTL_MESSAGE_GET_VERSION_INFO = 0x0021, - QMI_CTL_MESSAGE_ALLOCATE_CLIENT_ID = 0x0022, - QMI_CTL_MESSAGE_RELEASE_CLIENT_ID = 0x0023, - QMI_CTL_MESSAGE_REVOKE_CLIENT_ID = 0x0024, /* unused currently */ - QMI_CTL_MESSAGE_INVALID_CLIENT_ID = 0x0025, /* unused currently */ - QMI_CTL_MESSAGE_SET_DATA_FORMAT = 0x0026, /* unused currently */ - QMI_CTL_MESSAGE_SYNC = 0x0027, - QMI_CTL_MESSAGE_EVENT = 0x0028, /* unused currently */ - QMI_CTL_MESSAGE_SET_POWER_SAVE_CONFIG = 0x0029, /* unused currently */ - QMI_CTL_MESSAGE_SET_POWER_SAVE_MODE = 0x002A, /* unused currently */ - QMI_CTL_MESSAGE_GET_POWER_SAVE_MODE = 0x002B /* unused currently */ -} QmiCtlMessage; - -/*****************************************************************************/ -/* Version info */ -typedef struct _QmiCtlVersionInfo QmiCtlVersionInfo; -QmiService qmi_ctl_version_info_get_service (QmiCtlVersionInfo *info); -guint16 qmi_ctl_version_info_get_major_version (QmiCtlVersionInfo *info); -guint16 qmi_ctl_version_info_get_minor_version (QmiCtlVersionInfo *info); - -QmiCtlVersionInfo *qmi_ctl_version_info_ref (QmiCtlVersionInfo *info); -void qmi_ctl_version_info_unref (QmiCtlVersionInfo *info); - -G_END_DECLS - -#endif /* _LIBQMI_GLIB_QMI_CTL_H_ */ diff --git a/src/qmi-device.c b/src/qmi-device.c index 42617ca..631b1cb 100644 --- a/src/qmi-device.c +++ b/src/qmi-device.c @@ -29,7 +29,7 @@ #include "qmi-device.h" #include "qmi-message.h" -#include "qmi-client-ctl.h" +#include "qmi-ctl.h" #include "qmi-client-dms.h" #include "qmi-client-wds.h" #include "qmi-utils.h" @@ -60,7 +60,7 @@ struct _QmiDevicePrivate { QmiClientCtl *client_ctl; /* Supported services */ - GPtrArray *supported_services; + GArray *supported_services; /* I/O channel, set when the file is open */ GIOChannel *iochannel; @@ -424,8 +424,8 @@ qmi_device_allocate_client_finish (QmiDevice *self, static void build_client_object (AllocateClientContext *ctx) { - GError *error = NULL; QmiClient *client; + GError *error = NULL; /* We now have a proper CID for the client, we should be able to create it * right away */ @@ -463,17 +463,37 @@ allocate_cid_ready (QmiClientCtl *client_ctl, GAsyncResult *res, AllocateClientContext *ctx) { + QmiMessageCtlAllocateCidOutput *output; + QmiMessageCtlAllocateCidOutputAllocationInfo info; GError *error = NULL; - ctx->cid = qmi_client_ctl_allocate_cid_finish (client_ctl, res, &error); - if (ctx->cid == QMI_CID_NONE) { + output = qmi_client_ctl_allocate_cid_finish (client_ctl, res, &error); + if (!output) { g_prefix_error (&error, "CID allocation failed in the CTL client: "); g_simple_async_result_take_error (ctx->result, error); allocate_client_context_complete_and_free (ctx); return; } + g_assert (qmi_message_ctl_allocate_cid_output_get_allocation_info (output, &info, NULL)); + + if (info.service != ctx->service) { + g_simple_async_result_set_error ( + ctx->result, + QMI_CORE_ERROR, + QMI_CORE_ERROR_FAILED, + "CID allocation failed in the CTL client: " + "Service mismatch (requested '%s', got '%s')", + qmi_service_get_string (ctx->service), + qmi_service_get_string (info.service)); + allocate_client_context_complete_and_free (ctx); + qmi_message_ctl_allocate_cid_output_unref (output); + return; + } + + ctx->cid = info.cid; build_client_object (ctx); + qmi_message_ctl_allocate_cid_output_unref (output); } static gboolean @@ -490,11 +510,13 @@ check_service_supported (QmiDevice *self, } for (i = 0; i < self->priv->supported_services->len; i++) { - QmiCtlVersionInfo *info; + QmiMessageCtlGetVersionInfoOutputServiceListService *info; - info = g_ptr_array_index (self->priv->supported_services, i); + info = &g_array_index (self->priv->supported_services, + QmiMessageCtlGetVersionInfoOutputServiceListService, + i); - if (service == qmi_ctl_version_info_get_service (info)) + if (service == info->service) return TRUE; } @@ -584,13 +606,20 @@ qmi_device_allocate_client (QmiDevice *self, /* Allocate a new CID for the client to be created */ if (cid == QMI_CID_NONE) { + QmiMessageCtlAllocateCidInput *input; + + input = qmi_message_ctl_allocate_cid_input_new (); + qmi_message_ctl_allocate_cid_input_set_service (input, ctx->service, NULL); + g_debug ("Allocating new client ID..."); qmi_client_ctl_allocate_cid (self->priv->client_ctl, - ctx->service, + input, timeout, cancellable, (GAsyncReadyCallback)allocate_cid_ready, ctx); + + qmi_message_ctl_allocate_cid_input_unref (input); return; } @@ -685,8 +714,7 @@ qmi_device_release_client (QmiDevice *self, gpointer user_data) { ReleaseClientContext *ctx; - guint8 cid; - QmiService service; + QmiMessageCtlReleaseCidInputReleaseInfo info; g_return_if_fail (QMI_IS_DEVICE (self)); g_return_if_fail (QMI_IS_CLIENT (client)); @@ -704,11 +732,11 @@ qmi_device_release_client (QmiDevice *self, user_data, qmi_device_release_client); - cid = qmi_client_get_cid (client); - service = qmi_client_get_service (client); + info.cid = qmi_client_get_cid (client); + info.service = (guint8)qmi_client_get_service (client); /* Do not try to release an already released client */ - if (cid == QMI_CID_NONE) { + if (info.cid == QMI_CID_NONE) { g_simple_async_result_set_error (ctx->result, QMI_CORE_ERROR, QMI_CORE_ERROR_INVALID_ARGS, @@ -721,8 +749,8 @@ qmi_device_release_client (QmiDevice *self, unregister_client (self, client); g_debug ("Unregistered '%s' client with ID '%u'", - qmi_service_get_string (service), - cid); + qmi_service_get_string (info.service), + info.cid); /* Reset the contents of the client object, making it unusable */ g_object_set (client, @@ -732,14 +760,21 @@ qmi_device_release_client (QmiDevice *self, NULL); if (flags & QMI_DEVICE_RELEASE_CLIENT_FLAGS_RELEASE_CID) { + QmiMessageCtlReleaseCidInput *input; + + /* And now, really try to release the CID */ + input = qmi_message_ctl_release_cid_input_new (); + qmi_message_ctl_release_cid_input_set_release_info (input, info, NULL); + /* And now, really try to release the CID */ qmi_client_ctl_release_cid (self->priv->client_ctl, - service, - cid, + input, timeout, cancellable, (GAsyncReadyCallback)client_ctl_release_cid_ready, ctx); + + qmi_message_ctl_release_cid_input_unref (input); return; } @@ -749,7 +784,6 @@ qmi_device_release_client (QmiDevice *self, return; } - /*****************************************************************************/ /* Open device */ @@ -1063,8 +1097,10 @@ sync_ready (QmiClientCtl *client_ctl, DeviceOpenContext *ctx) { GError *error = NULL; + QmiMessageCtlSyncOutput *output; - if (!qmi_client_ctl_sync_finish (client_ctl, res, &error)) { + output = qmi_client_ctl_sync_finish (client_ctl, res, &error); + if(!output) { g_prefix_error (&error, "Sync failed: "); g_simple_async_result_take_error (ctx->result, error); device_open_context_complete_and_free (ctx); @@ -1076,6 +1112,8 @@ sync_ready (QmiClientCtl *client_ctl, /* Keep on with next flags */ process_open_flags (ctx); + + qmi_message_ctl_sync_output_unref (output); } static void @@ -1083,33 +1121,48 @@ version_info_ready (QmiClientCtl *client_ctl, GAsyncResult *res, DeviceOpenContext *ctx) { + QmiMessageCtlGetVersionInfoOutputResult result; + QmiMessageCtlGetVersionInfoOutput *output; GError *error = NULL; guint i; - ctx->self->priv->supported_services = qmi_client_ctl_get_version_info_finish (client_ctl, res, &error); - if (!ctx->self->priv->supported_services) { + output = qmi_client_ctl_get_version_info_finish (client_ctl, res, &error); + if (!output) { g_prefix_error (&error, "Version info check failed: "); g_simple_async_result_take_error (ctx->result, error); device_open_context_complete_and_free (ctx); return; } + g_assert (qmi_message_ctl_get_version_info_output_get_result ( + output, + &result, + NULL)); + + qmi_message_ctl_get_version_info_output_get_service_list (output, + &ctx->self->priv->supported_services, + NULL); + + g_debug ("[%s] QMI Device supports %u services:", ctx->self->priv->path_display, ctx->self->priv->supported_services->len); for (i = 0; i < ctx->self->priv->supported_services->len; i++) { - QmiCtlVersionInfo *service; + QmiMessageCtlGetVersionInfoOutputServiceListService *info; - service = g_ptr_array_index (ctx->self->priv->supported_services, i); + info = &g_array_index (ctx->self->priv->supported_services, + QmiMessageCtlGetVersionInfoOutputServiceListService, + i); g_debug ("[%s] %s (%u.%u)", ctx->self->priv->path_display, - qmi_service_get_string (qmi_ctl_version_info_get_service (service)), - qmi_ctl_version_info_get_major_version (service), - qmi_ctl_version_info_get_minor_version (service)); + qmi_service_get_string (info->service), + info->major_version, + info->minor_version); } /* Keep on with next flags */ process_open_flags (ctx); + qmi_message_ctl_get_version_info_output_unref (output); } static void @@ -1120,6 +1173,7 @@ process_open_flags (DeviceOpenContext *ctx) g_debug ("Checking version info..."); ctx->flags &= ~QMI_DEVICE_OPEN_FLAGS_VERSION_INFO; qmi_client_ctl_get_version_info (ctx->self->priv->client_ctl, + NULL, ctx->timeout, ctx->cancellable, (GAsyncReadyCallback)version_info_ready, @@ -1132,6 +1186,7 @@ process_open_flags (DeviceOpenContext *ctx) g_debug ("Running sync..."); ctx->flags &= ~QMI_DEVICE_OPEN_FLAGS_SYNC; qmi_client_ctl_sync (ctx->self->priv->client_ctl, + NULL, ctx->timeout, ctx->cancellable, (GAsyncReadyCallback)sync_ready, @@ -1645,7 +1700,7 @@ finalize (GObject *object) g_hash_table_unref (self->priv->registered_clients); if (self->priv->supported_services) - g_ptr_array_unref (self->priv->supported_services); + g_array_unref (self->priv->supported_services); g_free (self->priv->path); g_free (self->priv->path_display); diff --git a/src/qmi-message-ctl.c b/src/qmi-message-ctl.c deleted file mode 100644 index 51ed061..0000000 --- a/src/qmi-message-ctl.c +++ /dev/null @@ -1,334 +0,0 @@ -/* -*- 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) 2011 - 2012 Red Hat, Inc. - * Copyright (C) 2012 Aleksander Morgado <aleksander@lanedo.com> - */ - -#include <endian.h> - -#include "qmi-message-ctl.h" -#include "qmi-enums.h" -#include "qmi-error-types.h" - -/*****************************************************************************/ -/* Version info */ - -/** - * QmiCtlVersionInfo: - * - * An opaque type specifying a supported service. - */ -struct _QmiCtlVersionInfo { - volatile gint ref_count; - QmiService service; - guint16 major_version; - guint16 minor_version; -}; - -/** - * qmi_ctl_version_info_get_service: - * @info: a #QmiCtlVersionInfo. - * - * Get the QMI service being reported. - * - * Returns: A #QmiService. - */ -QmiService -qmi_ctl_version_info_get_service (QmiCtlVersionInfo *info) -{ - g_return_val_if_fail (info != NULL, QMI_SERVICE_UNKNOWN); - - return info->service; -} - -/** - * qmi_ctl_version_info_get_major_version: - * @info: a #QmiCtlVersionInfo. - * - * Get the major version of the QMI service being reported. - * - * Returns: the major version. - */ -guint16 -qmi_ctl_version_info_get_major_version (QmiCtlVersionInfo *info) -{ - g_return_val_if_fail (info != NULL, 0); - - return info->major_version; -} - -/** - * qmi_ctl_version_info_get_minor_version: - * @info: a #QmiCtlVersionInfo. - * - * Get the minor version of the QMI service being reported. - * - * Returns: the minor version. - */ -guint16 -qmi_ctl_version_info_get_minor_version (QmiCtlVersionInfo *info) -{ - g_return_val_if_fail (info != NULL, 0); - - return info->minor_version; -} - -/** - * qmi_ctl_version_info_ref: - * @info: a #QmiCtlVersionInfo. - * - * Atomically increments the reference count of @info by one. - * - * Returns: the new reference to @info. - */ -QmiCtlVersionInfo * -qmi_ctl_version_info_ref (QmiCtlVersionInfo *info) -{ - g_return_val_if_fail (info != NULL, NULL); - - g_atomic_int_inc (&info->ref_count); - return info; -} - -/** - * qmi_ctl_version_info_unref: - * @info: a #QmiCtlVersionInfo. - * - * Atomically decrements the reference count of array by one. - * If the reference count drops to 0, @info is completely disposed. - */ -void -qmi_ctl_version_info_unref (QmiCtlVersionInfo *info) -{ - g_return_if_fail (info != NULL); - - if (g_atomic_int_dec_and_test (&info->ref_count)) { - g_slice_free (QmiCtlVersionInfo, info); - } -} - -QmiMessage * -qmi_message_ctl_version_info_new (guint8 transaction_id) -{ - return qmi_message_new (QMI_SERVICE_CTL, - 0, - transaction_id, - QMI_CTL_MESSAGE_GET_VERSION_INFO); -} - -struct qmi_ctl_version_info_list_service { - guint8 service_type; - guint16 major_version; - guint16 minor_version; -} __attribute__((__packed__)); - -struct qmi_tlv_ctl_version_info_list { - guint8 count; - struct qmi_ctl_version_info_list_service services[0]; -}__attribute__((__packed__)); - -GPtrArray * -qmi_message_ctl_version_info_reply_parse (QmiMessage *self, - GError **error) -{ - struct qmi_tlv_ctl_version_info_list *service_list; - struct qmi_ctl_version_info_list_service *svc; - guint8 svcbuf[100]; - guint16 svcbuflen = 100; - GPtrArray *result; - guint i; - - g_assert (qmi_message_get_message_id (self) == QMI_CTL_MESSAGE_GET_VERSION_INFO); - - /* Abort if we got a QMI error reported */ - if (!qmi_message_get_response_result (self, error)) - return NULL; - - if (!qmi_message_tlv_get_varlen (self, - 0x01, - &svcbuflen, - svcbuf, - error)) { - g_prefix_error (error, "Couldn't get services TLV: "); - return NULL; - } - - service_list = (struct qmi_tlv_ctl_version_info_list *) svcbuf; - if (svcbuflen < (service_list->count * sizeof (struct qmi_ctl_version_info_list_service))) { - g_set_error (error, - QMI_CORE_ERROR, - QMI_CORE_ERROR_FAILED, - "Couldn't read the whole services list (%u < %" G_GSIZE_FORMAT ")", - svcbuflen, - (service_list->count * sizeof (struct qmi_ctl_version_info_list_service))); - return NULL; - } - - result = g_ptr_array_sized_new (service_list->count); - g_ptr_array_set_free_func (result, (GDestroyNotify)qmi_ctl_version_info_unref); - - for (i = 0, svc = &(service_list->services[0]); - i < service_list->count; - i++, svc++) { - QmiCtlVersionInfo *info; - - info = g_slice_new (QmiCtlVersionInfo); - info->ref_count = 1; - info->service = (QmiService)svc->service_type; - info->major_version = le16toh (svc->major_version); - info->minor_version = le16toh (svc->minor_version); - - g_ptr_array_add (result, info); - } - - return result; -} - -/*****************************************************************************/ -/* Allocate CID */ - -QmiMessage * -qmi_message_ctl_allocate_cid_new (guint8 transaction_id, - QmiService service) -{ - QmiMessage *message; - guint8 service_id; - GError *error = NULL; - - g_assert (service != QMI_SERVICE_UNKNOWN); - service_id = service; - - message = qmi_message_new (QMI_SERVICE_CTL, - 0, - transaction_id, - QMI_CTL_MESSAGE_ALLOCATE_CLIENT_ID); - - qmi_message_tlv_add (message, - (guint8)0x01, - sizeof (service_id), - &service_id, - &error); - g_assert_no_error (error); - - return message; -} - -struct qmi_ctl_cid { - guint8 service_type; - guint8 cid; -} __attribute__((__packed__)); - -gboolean -qmi_message_ctl_allocate_cid_reply_parse (QmiMessage *self, - guint8 *cid, - QmiService *service, - GError **error) -{ - struct qmi_ctl_cid id; - - g_assert (qmi_message_get_message_id (self) == QMI_CTL_MESSAGE_ALLOCATE_CLIENT_ID); - - /* Abort if we got a QMI error reported */ - if (!qmi_message_get_response_result (self, error)) - return FALSE; - - if (!qmi_message_tlv_get (self, 0x01, sizeof (id), &id, error)) { - g_prefix_error (error, "Couldn't get TLV: "); - return FALSE; - } - - if (cid) - *cid = id.cid; - if (service) - *service = (QmiService)id.service_type; - - return TRUE; -} - -/*****************************************************************************/ -/* Release CID */ - -QmiMessage * -qmi_message_ctl_release_cid_new (guint8 transaction_id, - QmiService service, - guint8 cid) -{ - QmiMessage *message; - GError *error = NULL; - struct qmi_ctl_cid id; - - g_assert (service != QMI_SERVICE_UNKNOWN); - id.service_type = (guint8)service; - id.cid = cid; - - message = qmi_message_new (QMI_SERVICE_CTL, - 0, - transaction_id, - QMI_CTL_MESSAGE_RELEASE_CLIENT_ID); - - qmi_message_tlv_add (message, - (guint8)0x01, - sizeof (id), - &id, - &error); - g_assert_no_error (error); - - return message; -} - -gboolean -qmi_message_ctl_release_cid_reply_parse (QmiMessage *self, - guint8 *cid, - QmiService *service, - GError **error) -{ - struct qmi_ctl_cid id; - - g_assert (qmi_message_get_message_id (self) == QMI_CTL_MESSAGE_RELEASE_CLIENT_ID); - - /* Abort if we got a QMI error reported */ - if (!qmi_message_get_response_result (self, error)) - return FALSE; - - if (!qmi_message_tlv_get (self, 0x01, sizeof (id), &id, error)) { - g_prefix_error (error, "Couldn't get TLV: "); - return FALSE; - } - - if (cid) - *cid = id.cid; - if (service) - *service = (QmiService)id.service_type; - - return TRUE; -} - -/*****************************************************************************/ -/* Sync */ - -QmiMessage * -qmi_message_ctl_sync_new (guint8 transaction_id) -{ - return qmi_message_new (QMI_SERVICE_CTL, - 0, - transaction_id, - QMI_CTL_MESSAGE_SYNC); -} diff --git a/src/qmi-message-ctl.h b/src/qmi-message-ctl.h deleted file mode 100644 index 3670db7..0000000 --- a/src/qmi-message-ctl.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- 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) 2012 Aleksander Morgado <aleksander@lanedo.com> - */ - -/* NOTE: this is a private non-installable header */ - -#ifndef _LIBQMI_GLIB_QMI_MESSAGE_CTL_H_ -#define _LIBQMI_GLIB_QMI_MESSAGE_CTL_H_ - -#include <glib.h> - -#include "qmi-ctl.h" -#include "qmi-message.h" - -G_BEGIN_DECLS - -/*****************************************************************************/ -/* Version info */ -QmiMessage *qmi_message_ctl_version_info_new (guint8 transaction_id); -GPtrArray *qmi_message_ctl_version_info_reply_parse (QmiMessage *self, - GError **error); - -/*****************************************************************************/ -/* Allocate CID */ -QmiMessage *qmi_message_ctl_allocate_cid_new (guint8 transaction_id, - QmiService service); -gboolean qmi_message_ctl_allocate_cid_reply_parse (QmiMessage *self, - guint8 *cid, - QmiService *service, - GError **error); - -/*****************************************************************************/ -/* Release CID */ -QmiMessage *qmi_message_ctl_release_cid_new (guint8 transaction_id, - QmiService service, - guint8 cid); -gboolean qmi_message_ctl_release_cid_reply_parse (QmiMessage *self, - guint8 *cid, - QmiService *service, - GError **error); - -/*****************************************************************************/ -/* Sync */ -QmiMessage *qmi_message_ctl_sync_new (guint8 transaction_id); - -G_END_DECLS - -#endif /* _LIBQMI_GLIB_QMI_MESSAGE_CTL_H_ */ diff --git a/src/qmi-message.c b/src/qmi-message.c index d100cbd..0e84866 100644 --- a/src/qmi-message.c +++ b/src/qmi-message.c @@ -647,6 +647,7 @@ qmi_message_new_from_raw (const guint8 *raw, return self; } +#if 0 gchar * qmi_message_get_printable (QmiMessage *self, const gchar *line_prefix) @@ -726,6 +727,7 @@ qmi_message_get_printable (QmiMessage *self, return g_string_free (printable, FALSE); } +#endif /*****************************************************************************/ /* QMI protocol errors handling */ |