aboutsummaryrefslogtreecommitdiffstats
path: root/src/libqmi-glib/qmi-message.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libqmi-glib/qmi-message.h')
-rw-r--r--src/libqmi-glib/qmi-message.h1108
1 files changed, 948 insertions, 160 deletions
diff --git a/src/libqmi-glib/qmi-message.h b/src/libqmi-glib/qmi-message.h
index 7ca240e..c15f071 100644
--- a/src/libqmi-glib/qmi-message.h
+++ b/src/libqmi-glib/qmi-message.h
@@ -43,12 +43,33 @@
G_BEGIN_DECLS
-#define QMI_MESSAGE_QMUX_MARKER (guint8)0x01
+/**
+ * SECTION:qmi-message
+ * @title: QmiMessage
+ * @short_description: Generic QMI message handling routines
+ *
+ * #QmiMessage is a generic type representing a QMI message of any kind
+ * (request, response, indication) or service (including #QMI_SERVICE_CTL).
+ *
+ * This set of generic routines help in handling these message types, and
+ * allow creating any kind of message with any kind of TLV.
+ */
+
+/**
+ * QMI_MESSAGE_QMUX_MARKER:
+ *
+ * First byte of every QMI message.
+ *
+ * Since: 1.0
+ */
+#define QMI_MESSAGE_QMUX_MARKER (guint8) 0x01
/**
* QmiMessage:
*
* An opaque type representing a QMI message.
+ *
+ * Since: 1.0
*/
typedef GByteArray QmiMessage;
@@ -56,46 +77,244 @@ typedef GByteArray QmiMessage;
* QMI_MESSAGE_VENDOR_GENERIC:
*
* Generic vendor id (0x0000).
+ *
+ * Since: 1.18
*/
#define QMI_MESSAGE_VENDOR_GENERIC 0x0000
/*****************************************************************************/
/* QMI Message life cycle */
-QmiMessage *qmi_message_new (QmiService service,
- guint8 client_id,
- guint16 transaction_id,
- guint16 message_id);
-QmiMessage *qmi_message_new_from_raw (GByteArray *raw,
- GError **error);
-QmiMessage *qmi_message_response_new (QmiMessage *request,
- QmiProtocolError error);
-QmiMessage *qmi_message_ref (QmiMessage *self);
-void qmi_message_unref (QmiMessage *self);
+/**
+ * qmi_message_new:
+ * @service: a #QmiService
+ * @client_id: client ID of the originating control point.
+ * @transaction_id: transaction ID.
+ * @message_id: message ID.
+ *
+ * Create a new #QmiMessage with the specified parameters.
+ *
+ * Note that @transaction_id must be less than #G_MAXUINT8 if @service is
+ * #QMI_SERVICE_CTL.
+ *
+ * Returns: (transfer full): a newly created #QmiMessage. The returned value should be freed with qmi_message_unref().
+ *
+ * Since: 1.0
+ */
+QmiMessage *qmi_message_new (QmiService service,
+ guint8 client_id,
+ guint16 transaction_id,
+ guint16 message_id);
+
+/**
+ * qmi_message_new_from_raw:
+ * @raw: (inout): raw data buffer.
+ * @error: return location for error or %NULL.
+ *
+ * Create a new #QmiMessage from the given raw data buffer.
+ *
+ * Whenever a complete QMI message is read, its raw data gets removed from the @raw buffer.
+ *
+ * Returns: (transfer full): a newly created #QmiMessage, which should be freed with qmi_message_unref(). If @raw doesn't contain a complete QMI message #NULL is returned. If there is a complete QMI message but it appears not to be valid, #NULL is returned and @error is set.
+ *
+ * Since: 1.0
+ */
+QmiMessage *qmi_message_new_from_raw (GByteArray *raw,
+ GError **error);
+
+/**
+ * qmi_message_response_new:
+ * @request: a request #QmiMessage.
+ * @error: a #QmiProtocolError to set in the result TLV.
+ *
+ * Create a new response #QmiMessage for the specified @request.
+ *
+ * Returns: (transfer full): a newly created #QmiMessage. The returned value should be freed with qmi_message_unref().
+ *
+ * Since: 1.8
+ */
+QmiMessage *qmi_message_response_new (QmiMessage *request,
+ QmiProtocolError error);
+
+/**
+ * qmi_message_ref:
+ * @self: a #QmiMessage.
+ *
+ * Atomically increments the reference count of @self by one.
+ *
+ * Returns: (transfer full) the new reference to @self.
+ *
+ * Since: 1.0
+ */
+QmiMessage *qmi_message_ref (QmiMessage *self);
+
+/**
+ * qmi_message_unref:
+ * @self: a #QmiMessage.
+ *
+ * Atomically decrements the reference count of @self by one.
+ * If the reference count drops to 0, @self is completely disposed.
+ *
+ * Since: 1.0
+ */
+void qmi_message_unref (QmiMessage *self);
/*****************************************************************************/
/* QMI Message content getters */
-gboolean qmi_message_is_request (QmiMessage *self);
-gboolean qmi_message_is_response (QmiMessage *self);
-gboolean qmi_message_is_indication (QmiMessage *self);
-QmiService qmi_message_get_service (QmiMessage *self);
-guint8 qmi_message_get_client_id (QmiMessage *self);
-guint16 qmi_message_get_transaction_id (QmiMessage *self);
-guint16 qmi_message_get_message_id (QmiMessage *self);
-gsize qmi_message_get_length (QmiMessage *self);
-const guint8 *qmi_message_get_raw (QmiMessage *self,
- gsize *length,
- GError **error);
+/**
+ * qmi_message_is_request:
+ * @self: a #QmiMessage.
+ *
+ * Checks whether the given #QmiMessage is a request.
+ *
+ * Returns: %TRUE if @self is a request message, %FALSE otherwise.
+ *
+ * Since: 1.8
+ */
+gboolean qmi_message_is_request (QmiMessage *self);
+
+/**
+ * qmi_message_is_response:
+ * @self: a #QmiMessage.
+ *
+ * Checks whether the given #QmiMessage is a response.
+ *
+ * Returns: %TRUE if @self is a response message, %FALSE otherwise.
+ *
+ * Since: 1.0
+ */
+gboolean qmi_message_is_response (QmiMessage *self);
+
+/**
+ * qmi_message_is_indication:
+ * @self: a #QmiMessage.
+ *
+ * Checks whether the given #QmiMessage is an indication.
+ *
+ * Returns: %TRUE if @self is an indication message, %FALSE otherwise.
+ *
+ * Since: 1.0
+ */
+gboolean qmi_message_is_indication (QmiMessage *self);
+
+/**
+ * qmi_message_get_service:
+ * @self: a #QmiMessage.
+ *
+ * Gets the service corresponding to the given #QmiMessage.
+ *
+ * Returns: a #QmiService.
+ *
+ * Since: 1.0
+ */
+QmiService qmi_message_get_service (QmiMessage *self);
+
+/**
+ * qmi_message_get_client_id:
+ * @self: a #QmiMessage.
+ *
+ * Gets the client ID of the message.
+ *
+ * Returns: the client ID.
+ *
+ * Since: 1.0
+ */
+guint8 qmi_message_get_client_id (QmiMessage *self);
+
+/**
+ * qmi_message_get_transaction_id:
+ * @self: a #QmiMessage.
+ *
+ * Gets the transaction ID of the message.
+ *
+ * Returns: the transaction ID.
+ *
+ * Since: 1.0
+ */
+guint16 qmi_message_get_transaction_id (QmiMessage *self);
+
+/**
+ * qmi_message_get_message_id:
+ * @self: a #QmiMessage.
+ *
+ * Gets the ID of the message.
+ *
+ * Returns: the ID.
+ *
+ * Since: 1.0
+ */
+guint16 qmi_message_get_message_id (QmiMessage *self);
+
+/**
+ * qmi_message_get_length:
+ * @self: a #QmiMessage.
+ *
+ * Gets the length of the raw data corresponding to the given #QmiMessage.
+ *
+ * Returns: the length of the raw data.
+ *
+ * Since: 1.0
+ */
+gsize qmi_message_get_length (QmiMessage *self);
+
+/**
+ * qmi_message_get_raw:
+ * @self: a #QmiMessage.
+ * @length: (out): return location for the size of the output buffer.
+ * @error: return location for error or %NULL.
+ *
+ * Gets the raw data buffer of the #QmiMessage.
+ *
+ * Returns: (transfer none): The raw data buffer, or #NULL if @error is set.
+ *
+ * Since: 1.0
+ */
+const guint8 *qmi_message_get_raw (QmiMessage *self,
+ gsize *length,
+ GError **error);
/*****************************************************************************/
/* Version support from the database */
-G_DEPRECATED
+/**
+ * qmi_message_get_version_introduced:
+ * @self: a #QmiMessage.
+ * @major: (out) return location for the major version.
+ * @minor: (out) return location for the minor version.
+ *
+ * Gets, if known, the service version in which the given message was first
+ * introduced.
+ *
+ * Returns: %TRUE if @major and @minor are set, %FALSE otherwise.
+ *
+ * Since: 1.0
+ * Deprecated: 1.18: Use qmi_message_get_version_introduced_full() instead.
+ */
+G_DEPRECATED_FOR (qmi_message_get_version_introduced_full)
gboolean qmi_message_get_version_introduced (QmiMessage *self,
guint *major,
guint *minor);
+/**
+ * qmi_message_get_version_introduced_full:
+ * @self: a #QmiMessage.
+ * @context: a #QmiMessageContext.
+ * @major: (out) return location for the major version.
+ * @minor: (out) return location for the minor version.
+ *
+ * Gets, if known, the service version in which the given message was first
+ * introduced.
+ *
+ * The lookup of the version may be specific to the @context provided, e.g. for
+ * vendor-specific messages.
+ *
+ * If no @context given, the behavior is the same as qmi_message_get_version_introduced().
+ *
+ * Returns: %TRUE if @major and @minor are set, %FALSE otherwise.
+ *
+ * Since: 1.18
+ */
gboolean qmi_message_get_version_introduced_full (QmiMessage *self,
QmiMessageContext *context,
guint *major,
@@ -104,127 +323,585 @@ gboolean qmi_message_get_version_introduced_full (QmiMessage *self,
/*****************************************************************************/
/* TLV builder & writer */
-gsize qmi_message_tlv_write_init (QmiMessage *self,
- guint8 type,
- GError **error);
-void qmi_message_tlv_write_reset (QmiMessage *self,
- gsize tlv_offset);
-gboolean qmi_message_tlv_write_complete (QmiMessage *self,
- gsize tlv_offset,
- GError **error);
-gboolean qmi_message_tlv_write_guint8 (QmiMessage *self,
- guint8 in,
- GError **error);
-gboolean qmi_message_tlv_write_gint8 (QmiMessage *self,
- gint8 in,
- GError **error);
-gboolean qmi_message_tlv_write_guint16 (QmiMessage *self,
- QmiEndian endian,
- guint16 in,
- GError **error);
-gboolean qmi_message_tlv_write_gint16 (QmiMessage *self,
- QmiEndian endian,
- gint16 in,
- GError **error);
-gboolean qmi_message_tlv_write_guint32 (QmiMessage *self,
- QmiEndian endian,
- guint32 in,
- GError **error);
-gboolean qmi_message_tlv_write_gint32 (QmiMessage *self,
- QmiEndian endian,
- gint32 in,
- GError **error);
-gboolean qmi_message_tlv_write_guint64 (QmiMessage *self,
- QmiEndian endian,
- guint64 in,
- GError **error);
-gboolean qmi_message_tlv_write_gint64 (QmiMessage *self,
- QmiEndian endian,
- gint64 in,
- GError **error);
-gboolean qmi_message_tlv_write_sized_guint (QmiMessage *self,
- guint n_bytes,
- QmiEndian endian,
- guint64 in,
- GError **error);
-gboolean qmi_message_tlv_write_string (QmiMessage *self,
- guint8 n_size_prefix_bytes,
- const gchar *in,
- gssize in_length,
- GError **error);
+/**
+ * qmi_message_tlv_write_init:
+ * @self: a #QmiMessage.
+ * @type: specific ID of the TLV to add.
+ * @error: return location for error or %NULL.
+ *
+ * Starts building a new TLV in the #QmiMessage.
+ *
+ * In order to finish adding the TLV, qmi_message_tlv_write_complete() needs to be
+ * called.
+ *
+ * If any error happens adding fields on the TLV, the previous state can be
+ * recovered using qmi_message_tlv_write_reset().
+ *
+ * Returns: the offset where the TLV was started to be added, or 0 if an error happens.
+ *
+ * Since: 1.12
+ */
+gsize qmi_message_tlv_write_init (QmiMessage *self,
+ guint8 type,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_reset:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_write_init().
+ *
+ * Removes the TLV being currently added.
+ *
+ * Since: 1.12
+ */
+void qmi_message_tlv_write_reset (QmiMessage *self,
+ gsize tlv_offset);
+
+/**
+ * qmi_message_tlv_write_complete:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_write_init().
+ * @error: return location for error or %NULL.
+ *
+ * Completes building a TLV in the #QmiMessage.
+ *
+ * In case of error the TLV will be reseted; i.e. there is no need to explicitly
+ * call qmi_message_tlv_write_reset().
+ *
+ * Returns: %TRUE if the TLV is successfully completed, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_complete (QmiMessage *self,
+ gsize tlv_offset,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_guint8:
+ * @self: a #QmiMessage.
+ * @in: a #guint8.
+ * @error: return location for error or %NULL.
+ *
+ * Appends an unsigned byte to the TLV being built.
+ *
+ * Returns: %TRUE if the variable is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_guint8 (QmiMessage *self,
+ guint8 in,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_gint8:
+ * @self: a #QmiMessage.
+ * @in: a #gint8.
+ * @error: return location for error or %NULL.
+ *
+ * Appends a signed byte variable to the TLV being built.
+ *
+ * Returns: %TRUE if the variable is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_gint8 (QmiMessage *self,
+ gint8 in,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_guint16:
+ * @self: a #QmiMessage.
+ * @endian: target endianness, swapped from host byte order if necessary.
+ * @in: a #guint16 in host byte order.
+ * @error: return location for error or %NULL.
+ *
+ * Appends an unsigned 16-bit integer to the TLV being built. The number to be
+ * written is expected to be given in host endianness, and this method takes
+ * care of converting the value written to the byte order specified by @endian.
+ *
+ * Returns: %TRUE if the variable is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_guint16 (QmiMessage *self,
+ QmiEndian endian,
+ guint16 in,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_gint16:
+ * @self: a #QmiMessage.
+ * @endian: target endianness, swapped from host byte order if necessary.
+ * @in: a #gint16 in host byte order.
+ * @error: return location for error or %NULL.
+ *
+ * Appends a signed 16-bit integer to the TLV being built. The number to be
+ * written is expected to be given in host endianness, and this method takes
+ * care of converting the value written to the byte order specified by @endian.
+ *
+ * Returns: %TRUE if the variable is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_gint16 (QmiMessage *self,
+ QmiEndian endian,
+ gint16 in,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_guint32:
+ * @self: a #QmiMessage.
+ * @endian: target endianness, swapped from host byte order if necessary.
+ * @in: a #guint32 in host byte order.
+ * @error: return location for error or %NULL.
+ *
+ * Appends an unsigned 32-bit integer to the TLV being built. The number to be
+ * written is expected to be given in host endianness, and this method takes
+ * care of converting the value written to the byte order specified by @endian.
+ *
+ * Returns: %TRUE if the variable is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_guint32 (QmiMessage *self,
+ QmiEndian endian,
+ guint32 in,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_gint32:
+ * @self: a #QmiMessage.
+ * @endian: target endianness, swapped from host byte order if necessary.
+ * @in: a #gint32 in host byte order.
+ * @error: return location for error or %NULL.
+ *
+ * Appends a signed 32-bit integer to the TLV being built. The number to be
+ * written is expected to be given in host endianness, and this method takes
+ * care of converting the value written to the byte order specified by @endian.
+ *
+ * Returns: %TRUE if the variable is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_gint32 (QmiMessage *self,
+ QmiEndian endian,
+ gint32 in,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_guint64:
+ * @self: a #QmiMessage.
+ * @endian: target endianness, swapped from host byte order if necessary.
+ * @in: a #guint64 in host byte order.
+ * @error: return location for error or %NULL.
+ *
+ * Appends an unsigned 64-bit integer to the TLV being built. The number to be
+ * written is expected to be given in host endianness, and this method takes
+ * care of converting the value written to the byte order specified by @endian.
+ *
+ * Returns: %TRUE if the variable is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_guint64 (QmiMessage *self,
+ QmiEndian endian,
+ guint64 in,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_gint64:
+ * @self: a #QmiMessage.
+ * @endian: target endianness, swapped from host byte order if necessary.
+ * @in: a #gint64 in host byte order.
+ * @error: return location for error or %NULL.
+ *
+ * Appends a signed 32-bit integer to the TLV being built. The number to be
+ * written is expected to be given in host endianness, and this method takes
+ * care of converting the value written to the byte order specified by @endian.
+ *
+ * Returns: %TRUE if the variable is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_gint64 (QmiMessage *self,
+ QmiEndian endian,
+ gint64 in,
+ GError **error);
+
+/**
+ * qmi_message_tlv_write_sized_guint:
+ * @self: a #QmiMessage.
+ * @n_bytes: number of bytes to write.
+ * @endian: target endianness, swapped from host byte order if necessary.
+ * @in: a #guint64 in host byte order.
+ * @error: return location for error or %NULL.
+ *
+ * Appends a @n_bytes-sized unsigned integer to the TLV being built. The number
+ * to be written is expected to be given in host endianness, and this method
+ * takes care of converting the value written to the byte order specified by
+ * @endian.
+ *
+ * The value of @n_bytes can be any between 1 and 8.
+ *
+ * Returns: %TRUE if the variable is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_sized_guint (QmiMessage *self,
+ guint n_bytes,
+ QmiEndian endian,
+ guint64 in,
+ GError **error);
+
+
+/**
+ * qmi_message_tlv_write_string:
+ * @self: a #QmiMessage.
+ * @n_size_prefix_bytes: number of bytes to use in the size prefix.
+ * @in: string to write.
+ * @in_length: length of @in, or -1 if @in is NUL-terminated.
+ * @error: return location for error or %NULL.
+ *
+ * Appends a string to the TLV being built.
+ *
+ * Fixed-sized strings should give @n_size_prefix_bytes equal to 0.
+ *
+ * Returns: %TRUE if the string is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_write_string (QmiMessage *self,
+ guint8 n_size_prefix_bytes,
+ const gchar *in,
+ gssize in_length,
+ GError **error);
/*****************************************************************************/
/* TLV reader */
-gsize qmi_message_tlv_read_init (QmiMessage *self,
- guint8 type,
- guint16 *out_tlv_length,
- GError **error);
-gboolean qmi_message_tlv_read_guint8 (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- guint8 *out,
- GError **error);
-gboolean qmi_message_tlv_read_gint8 (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- gint8 *out,
- GError **error);
-gboolean qmi_message_tlv_read_guint16 (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- QmiEndian endian,
- guint16 *out,
- GError **error);
-gboolean qmi_message_tlv_read_gint16 (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- QmiEndian endian,
- gint16 *out,
- GError **error);
-gboolean qmi_message_tlv_read_guint32 (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- QmiEndian endian,
- guint32 *out,
- GError **error);
-gboolean qmi_message_tlv_read_gint32 (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- QmiEndian endian,
- gint32 *out,
- GError **error);
-gboolean qmi_message_tlv_read_guint64 (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- QmiEndian endian,
- guint64 *out,
- GError **error);
-gboolean qmi_message_tlv_read_gint64 (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- QmiEndian endian,
- gint64 *out,
- GError **error);
-gboolean qmi_message_tlv_read_sized_guint (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- guint n_bytes,
- QmiEndian endian,
- guint64 *out,
- GError **error);
-gboolean qmi_message_tlv_read_gfloat (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- gfloat *out,
- GError **error);
-gboolean qmi_message_tlv_read_string (QmiMessage *self,
- gsize tlv_offset,
- gsize *offset,
- guint8 n_size_prefix_bytes,
- guint16 max_size,
- gchar **out,
- GError **error);
+/**
+ * qmi_message_tlv_read_init:
+ * @self: a #QmiMessage.
+ * @type: specific ID of the TLV to read.
+ * @out_tlv_length: optional return location for the TLV size.
+ * @error: return location for error or %NULL.
+ *
+ * Starts reading a given TLV from the #QmiMessage.
+ *
+ * Returns: the offset where the TLV starts, or 0 if an error happens.
+ *
+ * Since: 1.12
+ */
+gsize qmi_message_tlv_read_init (QmiMessage *self,
+ guint8 type,
+ guint16 *out_tlv_length,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_guint8:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of the offset within the TLV value.
+ * @out: return location for the read #guint8.
+ * @error: return location for error or %NULL.
+ *
+ * Reads an unsigned byte from the TLV.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_guint8 (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ guint8 *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_gint8:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @out: return location for the read #gint8.
+ * @error: return location for error or %NULL.
+ *
+ * Reads a signed byte from the TLV.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_gint8 (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ gint8 *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_guint16:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @endian: source endianness, which will be swapped to host byte order if necessary.
+ * @out: return location for the read #guint16.
+ * @error: return location for error or %NULL.
+ *
+ * Reads an unsigned 16-bit integer from the TLV, in host byte order.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_guint16 (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ QmiEndian endian,
+ guint16 *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_gint16:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @endian: source endianness, which will be swapped to host byte order if necessary.
+ * @out: return location for the read #gint16.
+ * @error: return location for error or %NULL.
+ *
+ * Reads a signed 16-bit integer from the TLV, in host byte order.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_gint16 (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ QmiEndian endian,
+ gint16 *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_guint32:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @endian: source endianness, which will be swapped to host byte order if necessary.
+ * @out: return location for the read #guint32.
+ * @error: return location for error or %NULL.
+ *
+ * Reads an unsigned 32-bit integer from the TLV, in host byte order.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_guint32 (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ QmiEndian endian,
+ guint32 *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_gint32:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @endian: source endianness, which will be swapped to host byte order if necessary.
+ * @out: return location for the read #gint32.
+ * @error: return location for error or %NULL.
+ *
+ * Reads a signed 32-bit integer from the TLV, in host byte order.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_gint32 (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ QmiEndian endian,
+ gint32 *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_guint64:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @endian: source endianness, which will be swapped to host byte order if necessary.
+ * @out: return location for the read #guint64.
+ * @error: return location for error or %NULL.
+ *
+ * Reads an unsigned 64-bit integer from the TLV, in host byte order.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_guint64 (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ QmiEndian endian,
+ guint64 *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_gint64:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @endian: source endianness, which will be swapped to host byte order if necessary.
+ * @out: return location for the read #gint64.
+ * @error: return location for error or %NULL.
+ *
+ * Reads a signed 64-bit integer from the TLV, in host byte order.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_gint64 (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ QmiEndian endian,
+ gint64 *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_sized_guint:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @n_bytes: number of bytes to read.
+ * @endian: source endianness, which will be swapped to host byte order if necessary.
+ * @out: return location for the read #guint64.
+ * @error: return location for error or %NULL.
+ *
+ * Reads a @b_bytes-sized integer from the TLV, in host byte order.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_sized_guint (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ guint n_bytes,
+ QmiEndian endian,
+ guint64 *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_gfloat:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @out: return location for the read #gfloat.
+ * @error: return location for error or %NULL.
+ *
+ * Reads a 32-bit floating-point number from the TLV.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_gfloat (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ gfloat *out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_string:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @n_size_prefix_bytes: number of bytes used in the size prefix.
+ * @max_size: maximum number of bytes to read, or 0 to read all available bytes.
+ * @out: return location for the read string. The returned value should be freed with g_free().
+ * @error: return location for error or %NULL.
+ *
+ * Reads a string from the TLV.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
+gboolean qmi_message_tlv_read_string (QmiMessage *self,
+ gsize tlv_offset,
+ gsize *offset,
+ guint8 n_size_prefix_bytes,
+ guint16 max_size,
+ gchar **out,
+ GError **error);
+
+/**
+ * qmi_message_tlv_read_fixed_size_string:
+ * @self: a #QmiMessage.
+ * @tlv_offset: offset that was returned by qmi_message_tlv_read_init().
+ * @offset: address of a the offset within the TLV value.
+ * @string_length: amount of bytes to read.
+ * @out: buffer preallocated by the client, with at least @string_length bytes.
+ * @error: return location for error or %NULL.
+ *
+ * Reads a string from the TLV.
+ *
+ * The string written in @out will need to be NUL-terminated by the caller.
+ *
+ * @offset needs to point to a valid @gsize specifying the index to start
+ * reading from within the TLV value (0 for the first item). If the variable
+ * is successfully read, @offset will be updated to point past the read item.
+ *
+ * Returns: %TRUE if the variable is successfully read, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.12
+ */
gboolean qmi_message_tlv_read_fixed_size_string (QmiMessage *self,
gsize tlv_offset,
gsize *offset,
@@ -242,44 +919,155 @@ guint16 __qmi_message_tlv_read_remaining_size (QmiMessage *self,
/*****************************************************************************/
/* Raw TLV handling */
-typedef void (* QmiMessageForeachRawTlvFn) (guint8 type,
+/**
+ * QmiMessageForeachRawTlvFn:
+ * @type: specific ID of the TLV.
+ * @value: value of the TLV.
+ * @length: length of the TLV, in bytes.
+ * @user_data: user data.
+ *
+ * Callback type to use when iterating raw TLVs with
+ * qmi_message_foreach_raw_tlv().
+ *
+ * Since: 1.0
+ */
+typedef void (* QmiMessageForeachRawTlvFn) (guint8 type,
const guint8 *value,
- gsize length,
- gpointer user_data);
-void qmi_message_foreach_raw_tlv (QmiMessage *self,
- QmiMessageForeachRawTlvFn func,
- gpointer user_data);
-const guint8 *qmi_message_get_raw_tlv (QmiMessage *self,
- guint8 type,
- guint16 *length);
-gboolean qmi_message_add_raw_tlv (QmiMessage *self,
- guint8 type,
- const guint8 *raw,
- gsize length,
- GError **error);
+ gsize length,
+ gpointer user_data);
+
+/**
+ * qmi_message_foreach_raw_tlv:
+ * @self: a #QmiMessage.
+ * @func: the function to call for each TLV.
+ * @user_data: user data to pass to the function.
+ *
+ * Calls the given function for each TLV found within the #QmiMessage.
+ *
+ * Since: 1.0
+ */
+void qmi_message_foreach_raw_tlv (QmiMessage *self,
+ QmiMessageForeachRawTlvFn func,
+ gpointer user_data);
+
+/**
+ * qmi_message_get_raw_tlv:
+ * @self: a #QmiMessage.
+ * @type: specific ID of the TLV to get.
+ * @length: (out): return location for the length of the TLV.
+ *
+ * Get the raw data buffer of a specific TLV within the #QmiMessage.
+ *
+ * Returns: (transfer none): The raw data buffer of the TLV, or #NULL if not found.
+ *
+ * Since: 1.0
+ */
+const guint8 *qmi_message_get_raw_tlv (QmiMessage *self,
+ guint8 type,
+ guint16 *length);
+
+/**
+ * qmi_message_add_raw_tlv:
+ * @self: a #QmiMessage.
+ * @type: specific ID of the TLV to add.
+ * @raw: raw data buffer with the value of the TLV.
+ * @length: length of the raw data buffer.
+ * @error: return location for error or %NULL.
+ *
+ * Creates a new @type TLV with the value given in @raw, and adds it to the #QmiMessage.
+ *
+ * Returns: %TRUE if the TLV is successfully added, otherwise %FALSE is returned and @error is set.
+ *
+ * Since: 1.0
+ */
+gboolean qmi_message_add_raw_tlv (QmiMessage *self,
+ guint8 type,
+ const guint8 *raw,
+ gsize length,
+ GError **error);
/*****************************************************************************/
/* Other helpers */
+/**
+ * qmi_message_set_transaction_id:
+ * @self: a #QmiMessage.
+ * @transaction_id: transaction id.
+ *
+ * Overwrites the transaction ID of the message.
+ *
+ * Since: 1.8
+ */
void qmi_message_set_transaction_id (QmiMessage *self,
guint16 transaction_id);
/*****************************************************************************/
/* Printable helpers */
-G_DEPRECATED
-gchar *qmi_message_get_printable (QmiMessage *self,
+/**
+ * qmi_message_get_printable:
+ * @self: a #QmiMessage.
+ * @line_prefix: prefix string to use in each new generated line.
+ *
+ * Gets a printable string with the contents of the whole QMI message.
+ *
+ * If known, the printable string will contain translated TLV values as well as the raw
+ * data buffer contents.
+ *
+ * Returns: (transfer full): a newly allocated string, which should be freed with g_free().
+ *
+ * Since: 1.0
+ * Deprecated: 1.18: Use qmi_message_get_printable_full() instead.
+ */
+G_DEPRECATED_FOR (qmi_message_get_printable_full)
+gchar *qmi_message_get_printable (QmiMessage *self,
const gchar *line_prefix);
+/**
+ * qmi_message_get_printable_full:
+ * @self: a #QmiMessage.
+ * @context: a #QmiMessageContext.
+ * @line_prefix: prefix string to use in each new generated line.
+ *
+ * Gets a printable string with the contents of the whole QMI message.
+ *
+ * If known, the printable string will contain translated TLV values as well as
+ * the raw data buffer contents.
+ *
+ * The translation of the contents may be specific to the @context provided,
+ * e.g. for vendor-specific messages.
+ *
+ * If no @context given, the behavior is the same as qmi_message_get_printable().
+ *
+ * Returns: (transfer full): a newly allocated string, which should be freed with g_free().
+ *
+ * Since: 1.18
+ */
gchar *qmi_message_get_printable_full (QmiMessage *self,
QmiMessageContext *context,
const gchar *line_prefix);
-gchar *qmi_message_get_tlv_printable (QmiMessage *self,
- const gchar *line_prefix,
- guint8 type,
+/**
+ * qmi_message_get_tlv_printable:
+ * @self: a #QmiMessage.
+ * @line_prefix: prefix string to use in each new generated line.
+ * @type: type of the TLV.
+ * @raw: raw data buffer with the value of the TLV.
+ * @raw_length: length of the raw data buffer.
+ *
+ * Gets a printable string with the contents of the TLV.
+ *
+ * This method is the most generic one and doesn't try to translate the TLV contents.
+ *
+ * Returns: (transfer full): a newly allocated string, which should be freed with g_free().
+ *
+ * Since: 1.0
+ */
+gchar *qmi_message_get_tlv_printable (QmiMessage *self,
+ const gchar *line_prefix,
+ guint8 type,
const guint8 *raw,
- gsize raw_length);
+ gsize raw_length);
G_END_DECLS