# HG changeset patch # User Mykhailo Danylenko # Date 1458398389 -7200 # Node ID ea3137a59c2bddf68a06deba953dff529bc5f0a7 # Parent bdcdb9b34992a9e61bb4efd276c86a4e50dd5c4b LmMessageNode: Expose attributes member * New typedef: LmMessageNodeAttribute diff -r bdcdb9b34992 -r ea3137a59c2b loudmouth/lm-message-node.c --- a/loudmouth/lm-message-node.c Sat Mar 19 16:38:54 2016 +0200 +++ b/loudmouth/lm-message-node.c Sat Mar 19 16:39:49 2016 +0200 @@ -28,19 +28,14 @@ #include "lm-internals.h" #include "lm-message-node.h" -typedef struct { - gchar *key; - gchar *value; -} KeyValuePair; - static void message_node_free (LmMessageNode *node); static LmMessageNode * message_node_last_child (LmMessageNode *node); static void message_node_free (LmMessageNode *node) { - LmMessageNode *l; - GSList *list; + LmMessageNode *l; + LmMessageNodeAttribute *a; g_return_if_fail (node != NULL); @@ -54,15 +49,16 @@ g_free (node->name); g_free (node->value); - for (list = node->attributes; list; list = list->next) { - KeyValuePair *kvp = (KeyValuePair *) list->data; + for (a = node->attributes; a;) { + LmMessageNodeAttribute *next_a = a->next; - g_free (kvp->key); - g_free (kvp->value); - g_free (kvp); + g_free (a->name); + g_free (a->value); + g_free (a); + + a = next_a; } - g_slist_free (node->attributes); g_free (node); } @@ -219,7 +215,6 @@ value = (const gchar *) va_arg (args, gpointer); lm_message_node_set_attribute (node, name, value); - } va_end (args); @@ -238,32 +233,29 @@ const gchar *name, const gchar *value) { - gboolean found = FALSE; - GSList *l; + gboolean found = FALSE; + LmMessageNodeAttribute *a; g_return_if_fail (node != NULL); g_return_if_fail (name != NULL); g_return_if_fail (value != NULL); - for (l = node->attributes; l; l = l->next) { - KeyValuePair *kvp = (KeyValuePair *) l->data; - - if (strcmp (kvp->key, name) == 0) { - g_free (kvp->value); - kvp->value = g_strdup (value); + for (a = node->attributes; a; a = a->next) { + if (strcmp (a->name, name) == 0) { + g_free (a->value); + a->value = g_strdup (value); found = TRUE; break; } } if (!found) { - KeyValuePair *kvp; + a = g_new0 (LmMessageNodeAttribute, 1); + a->name = g_strdup (name); + a->value = g_strdup (value); - kvp = g_new0 (KeyValuePair, 1); - kvp->key = g_strdup (name); - kvp->value = g_strdup (value); - - node->attributes = g_slist_prepend (node->attributes, kvp); + a->next = node->attributes; + node->attributes = a; } } @@ -279,17 +271,16 @@ const gchar * lm_message_node_get_attribute (LmMessageNode *node, const gchar *name) { - GSList *l; - const gchar *ret_val = NULL; + LmMessageNodeAttribute *a; + const gchar *ret_val = NULL; g_return_val_if_fail (node != NULL, NULL); g_return_val_if_fail (name != NULL, NULL); - for (l = node->attributes; l; l = l->next) { - KeyValuePair *kvp = (KeyValuePair *) l->data; - - if (strcmp (kvp->key, name) == 0) { - ret_val = kvp->value; + for (a = node->attributes; a; a = a->next) { + if (strcmp (a->name, name) == 0) { + ret_val = a->value; + break; } } @@ -442,9 +433,9 @@ gchar * lm_message_node_to_string (LmMessageNode *node) { - GString *ret; - GSList *l; - LmMessageNode *child; + GString *ret; + LmMessageNodeAttribute *a; + LmMessageNode *child; g_return_val_if_fail (node != NULL, NULL); @@ -455,21 +446,18 @@ ret = g_string_new ("<"); g_string_append (ret, node->name); - for (l = node->attributes; l; l = l->next) { - KeyValuePair *kvp = (KeyValuePair *) l->data; - + for (a = node->attributes; a; a = a->next) { if (node->raw_mode == FALSE) { gchar *escaped; - escaped = g_markup_escape_text (kvp->value, -1); + escaped = g_markup_escape_text (a->value, -1); g_string_append_printf (ret, " %s=\"%s\"", - kvp->key, escaped); + a->name, escaped); g_free (escaped); } else { g_string_append_printf (ret, " %s=\"%s\"", - kvp->key, kvp->value); + a->name, a->value); } - } g_string_append_c (ret, '>'); diff -r bdcdb9b34992 -r ea3137a59c2b loudmouth/lm-message-node.h --- a/loudmouth/lm-message-node.h Sat Mar 19 16:38:54 2016 +0200 +++ b/loudmouth/lm-message-node.h Sat Mar 19 16:39:49 2016 +0200 @@ -28,6 +28,23 @@ G_BEGIN_DECLS /** + * LmMessageNodeAttribute: + * @name: attribute name + * @value: attribute value + * @next: next attribute + * + * Linked list of message node attributes. + */ +typedef struct _LmMessageNodeAttribute LmMessageNodeAttribute; + +struct _LmMessageNodeAttribute { + gchar *name; + gchar *value; + + LmMessageNodeAttribute *next; +}; + +/** * LmMessageNode: * @name: the name of the node * @value: value of the node, can be NULL @@ -36,6 +53,7 @@ * @prev: previous sibling * @parent: node parent * @children: pointing to first child + * @attributes: linked list of node attributes * * A struct representing a node in a message. */ @@ -51,8 +69,9 @@ LmMessageNode *parent; LmMessageNode *children; + LmMessageNodeAttribute *attributes; + /* < private > */ - GSList *attributes; gint ref_count; };