loudmouth/lm-message-node.c
author hallski <hallski>
Tue, 22 Aug 2006 17:57:59 +0000
changeset 166 2e6fae54b2fb
parent 99 81e9d035de02
child 168 ac1affcd5d22
permissions -rw-r--r--
2006-08-22 Mikael Hallendal <micke@imendio.com> * loudmouth/lm-message-node.c: (lm_message_node_to_string): - Add a check that node isn't NULL.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     2
/*
99
81e9d035de02 2004-10-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 84
diff changeset
     3
 * Copyright (C) 2003 Imendio AB
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     4
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public License as
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     7
 * published by the Free Software Foundation; either version 2 of the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     8
 * License, or (at your option) any later version.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     9
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    13
 * Lesser General Public License for more details.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    14
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    16
 * License along with this program; if not, write to the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    19
 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    20
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    21
#include <config.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    22
#include <string.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    23
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    24
#include "lm-internals.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    25
#include "lm-message-node.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    26
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    27
typedef struct {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    28
        gchar *key;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    29
        gchar *value;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    30
} KeyValuePair;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    31
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    32
static void            message_node_free            (LmMessageNode    *node);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    33
static LmMessageNode * message_node_last_child      (LmMessageNode    *node);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    34
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    35
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    36
message_node_free (LmMessageNode *node)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    37
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    38
        LmMessageNode *l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    39
        GSList        *list;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    40
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    41
        g_return_if_fail (node != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    42
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    43
	for (l = node->children; l;) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    44
		LmMessageNode *next = l->next;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    45
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    46
		lm_message_node_unref (l);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    47
		l = next;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    48
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    49
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    50
        g_free (node->name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    51
        g_free (node->value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    52
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    53
        for (list = node->attributes; list; list = list->next) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    54
                KeyValuePair *kvp = (KeyValuePair *) list->data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    55
                
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    56
                g_free (kvp->key);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    57
                g_free (kvp->value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    58
                g_free (kvp);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    59
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    60
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    61
        g_slist_free (node->attributes);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    62
        g_free (node);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    63
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    64
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    65
static LmMessageNode *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    66
message_node_last_child (LmMessageNode *node)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    67
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    68
        LmMessageNode *l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    69
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    70
        g_return_val_if_fail (node != NULL, NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    71
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    72
        if (!node->children) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    73
                return NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    74
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    75
                
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    76
        l = node->children;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    77
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    78
        while (l->next) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    79
                l = l->next;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    80
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    81
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    82
        return l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    83
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    84
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    85
LmMessageNode *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    86
_lm_message_node_new (const gchar *name)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    87
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    88
        LmMessageNode *node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    89
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    90
        node = g_new0 (LmMessageNode, 1);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    91
        
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 6
diff changeset
    92
        node->name       = g_strdup (name);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    93
        node->value      = NULL;
6
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
    94
	node->raw_mode   = FALSE;
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    95
        node->attributes = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    96
        node->next       = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    97
        node->prev       = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    98
        node->parent     = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    99
        node->children   = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   100
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   101
	node->ref_count  = 1;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   102
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   103
        return node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   104
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   105
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   106
_lm_message_node_add_child_node (LmMessageNode *node, LmMessageNode *child)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   107
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   108
        LmMessageNode *prev;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   109
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   110
        g_return_if_fail (node != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   111
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   112
        prev = message_node_last_child (node);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   113
	lm_message_node_ref (child);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   114
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   115
        if (prev) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   116
                prev->next    = child;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   117
                child->prev   = prev;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   118
        } else {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   119
                node->children = child;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   120
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   121
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   122
        child->parent = node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   123
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   124
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   125
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   126
 * lm_message_node_get_value:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   127
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   128
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   129
 * Retrieves the value of @node.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   130
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   131
 * Return value: 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   132
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   133
const gchar *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   134
lm_message_node_get_value (LmMessageNode *node)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   135
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   136
	g_return_val_if_fail (node != NULL, NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   137
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   138
	return node->value;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   139
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   140
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   141
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   142
 * lm_message_node_set_value:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   143
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   144
 * @value: the new value.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   145
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   146
 * Sets the value of @node. If a previous value is set it will be freed.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   147
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   148
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   149
lm_message_node_set_value (LmMessageNode *node, const gchar *value)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   150
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   151
        g_return_if_fail (node != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   152
       
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   153
        g_free (node->value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   154
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   155
        if (!value) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   156
                node->value = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   157
                return;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   158
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   159
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   160
        node->value = g_strdup (value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   161
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   162
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   163
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   164
 * lm_message_node_add_child:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   165
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   166
 * @name: the name of the new child
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   167
 * @value: value of the new child
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   168
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   169
 * Add a child node with @name and value set to @value. 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   170
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   171
 * Return value: the newly created child
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   172
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   173
LmMessageNode *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   174
lm_message_node_add_child (LmMessageNode *node, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   175
			   const gchar   *name, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   176
			   const gchar   *value)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   177
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   178
	LmMessageNode *child;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   179
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   180
	child = _lm_message_node_new (name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   181
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   182
	lm_message_node_set_value (child, value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   183
	_lm_message_node_add_child_node (node, child);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   184
	lm_message_node_unref (child);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   185
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   186
	return child;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   187
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   188
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   189
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   190
 * lm_message_node_set_attributes:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   191
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   192
 * @name: the first attribute, should be followed by a string with the value
56
3bf928955fc5 2003-11-20 Ross Burton <ross@burtonini.com>
hallski <hallski>
parents: 7
diff changeset
   193
 * @Varargs: The rest of the name/value pairs
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   194
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   195
 * Sets a list of attributes. The arguments should be names and corresponding 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   196
 * value and needs to be ended with %NULL.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   197
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   198
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   199
lm_message_node_set_attributes  (LmMessageNode *node,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   200
				 const gchar   *name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   201
				 ...)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   202
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   203
	va_list args;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   204
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   205
        g_return_if_fail (node != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   206
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   207
	for (va_start (args, name); 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   208
	     name; 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   209
	     name = (const gchar *) va_arg (args, gpointer)) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   210
		const gchar *value;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   211
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   212
		value = (const gchar *) va_arg (args, gpointer);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   213
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   214
		lm_message_node_set_attribute (node, name, value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   215
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   216
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   217
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   218
	va_end (args);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   219
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   220
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   221
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   222
 * lm_message_node_set_attribute:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   223
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   224
 * @name: name of attribute
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   225
 * @value: value of attribute.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   226
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   227
 * Sets the attribute @name to @value.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   228
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   229
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   230
lm_message_node_set_attribute (LmMessageNode *node,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   231
			       const gchar   *name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   232
			       const gchar   *value)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   233
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   234
	gboolean  found = FALSE; 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   235
	GSList   *l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   236
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   237
	for (l = node->attributes; l; l = l->next) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   238
		KeyValuePair *kvp = (KeyValuePair *) l->data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   239
                
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 6
diff changeset
   240
		if (strcmp (kvp->key, name) == 0) {
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   241
			g_free (kvp->value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   242
			kvp->value = g_strdup (value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   243
			found = TRUE;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   244
			break;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   245
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   246
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   247
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   248
	if (!found) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   249
		KeyValuePair *kvp;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   250
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   251
		kvp = g_new0 (KeyValuePair, 1);                
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 6
diff changeset
   252
		kvp->key = g_strdup (name);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   253
		kvp->value = g_strdup (value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   254
		
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 6
diff changeset
   255
		node->attributes = g_slist_prepend (node->attributes, kvp);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   256
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   257
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   258
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   259
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   260
 * lm_message_node_get_attribute:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   261
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   262
 * @name: the attribute name
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   263
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   264
 * Fetches the attribute @name from @node.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   265
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   266
 * Return value: the attribute value or %NULL if not set
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   267
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   268
const gchar *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   269
lm_message_node_get_attribute (LmMessageNode *node, const gchar *name)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   270
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   271
        GSList      *l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   272
        const gchar *ret_val = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   273
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   274
        g_return_val_if_fail (node != NULL, NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   275
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   276
        for (l = node->attributes; l; l = l->next) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   277
                KeyValuePair *kvp = (KeyValuePair *) l->data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   278
                
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 6
diff changeset
   279
                if (strcmp (kvp->key, name) == 0) {
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   280
                        ret_val = kvp->value;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   281
                }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   282
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   283
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   284
        return ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   285
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   286
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   287
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   288
 * lm_message_node_get_child:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   289
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   290
 * @child_name: the childs name
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   291
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   292
 * Fetches the child @child_name from @node. If child is not found as an 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   293
 * immediate child of @node %NULL is returned.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   294
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   295
 * Return value: the child node or %NULL if not found
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   296
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   297
LmMessageNode *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   298
lm_message_node_get_child (LmMessageNode *node, const gchar *child_name)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   299
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   300
	LmMessageNode *l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   301
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   302
	for (l = node->children; l; l = l->next) {
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 6
diff changeset
   303
		if (strcmp (l->name, child_name) == 0) {
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   304
			return l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   305
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   306
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   307
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   308
	return NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   309
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   310
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   311
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   312
 * lm_message_node_find_child:
56
3bf928955fc5 2003-11-20 Ross Burton <ross@burtonini.com>
hallski <hallski>
parents: 7
diff changeset
   313
 * @node: A #LmMessageNode
3bf928955fc5 2003-11-20 Ross Burton <ross@burtonini.com>
hallski <hallski>
parents: 7
diff changeset
   314
 * @child_name: The name of the child to find
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   315
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   316
 * Locates a child among all children of @node. The entire tree will be search 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   317
 * until a child with name @child_name is located. 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   318
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   319
 * Return value: the located child or %NULL if not found
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   320
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   321
LmMessageNode * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   322
lm_message_node_find_child (LmMessageNode *node,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   323
			    const gchar   *child_name)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   324
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   325
        LmMessageNode *l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   326
        LmMessageNode *ret_val = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   327
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   328
        for (l = node->children; l; l = l->next) {
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 6
diff changeset
   329
                if (strcmp (l->name, child_name) == 0) {
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   330
                        return l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   331
                }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   332
                if (l->children) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   333
                        ret_val = lm_message_node_find_child (l, child_name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   334
                        if (ret_val) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   335
                                return ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   336
                        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   337
                }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   338
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   339
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   340
        return NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   341
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   342
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   343
/**
6
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   344
 * lm_message_node_get_raw_mode:
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   345
 * @node: an #LmMessageNode
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   346
 * 
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   347
 * Checks if the nodes value should be sent as raw mode. 
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   348
 *
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   349
 * Return value: %TRUE if nodes value should be sent as is and %FALSE if the value will be escaped before sending.
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   350
 **/
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   351
gboolean
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   352
lm_message_node_get_raw_mode (LmMessageNode *node)
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   353
{
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   354
	g_return_val_if_fail (node != NULL, FALSE);
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   355
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   356
	return node->raw_mode;
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   357
}
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   358
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   359
/** 
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   360
 * lm_message_node_set_raw_mode:
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   361
 * @node: an #LmMessageNode
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   362
 * @raw_mode: boolean specifying if node value should be escaped or not.
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   363
 *
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   364
 * Set @raw_mode to %TRUE if you don't want to escape the value. You need to make sure the value is valid XML yourself.
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   365
 **/
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   366
void
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   367
lm_message_node_set_raw_mode (LmMessageNode *node, gboolean raw_mode)
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   368
{
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   369
	g_return_if_fail (node != NULL);
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   370
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   371
	node->raw_mode = raw_mode;	
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   372
}
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   373
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   374
/**
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   375
 * lm_message_node_ref:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   376
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   377
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   378
 * Adds a reference to @node.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   379
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   380
 * Return value: the node
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   381
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   382
LmMessageNode *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   383
lm_message_node_ref (LmMessageNode *node)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   384
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   385
	g_return_val_if_fail (node != NULL, NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   386
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   387
	node->ref_count++;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   388
       
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   389
	return node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   390
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   391
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   392
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   393
 * lm_message_node_unref:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   394
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   395
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   396
 * Removes a reference from @node. When no more references are present the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   397
 * node is freed. When freed lm_message_node_unref() will be called on all
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   398
 * children. If caller needs to keep references to the children a call to 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   399
 * lm_message_node_ref() needs to be done before the call to 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   400
 *lm_message_unref().
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   401
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   402
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   403
lm_message_node_unref (LmMessageNode *node)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   404
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   405
	g_return_if_fail (node != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   406
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   407
	node->ref_count--;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   408
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   409
	if (node->ref_count == 0) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   410
		message_node_free (node);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   411
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   412
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   413
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   414
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   415
 * lm_message_node_to_string:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   416
 * @node: an #LmMessageNode
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   417
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   418
 * Returns an XML string representing the node. This is what is sent over the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   419
 * wire. This is used internally Loudmouth and is external for debugging 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   420
 * purposes.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   421
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   422
 * Return value: an XML string representation of @node
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   423
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   424
gchar *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   425
lm_message_node_to_string (LmMessageNode *node)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   426
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   427
	gchar         *ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   428
	gchar         *str;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   429
	GSList        *l;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   430
	LmMessageNode *child;
166
2e6fae54b2fb 2006-08-22 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   431
2e6fae54b2fb 2006-08-22 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   432
	g_return_val_if_fail (node != NULL, NULL);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   433
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   434
	if (node->name == NULL) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   435
		return g_strdup ("");
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   436
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   437
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   438
	str = g_strdup_printf ("<%s", node->name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   439
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   440
	for (l = node->attributes; l; l = l->next) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   441
		KeyValuePair *kvp = (KeyValuePair *) l->data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   442
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   443
		ret_val = g_strdup_printf ("%s %s=\"%s\"", 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   444
					   str, kvp->key, kvp->value);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   445
		g_free (str);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   446
		str = ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   447
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   448
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   449
	ret_val = g_strconcat (str, ">", NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   450
	g_free (str);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   451
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   452
	if (node->value) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   453
		gchar *tmp;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   454
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   455
		str = ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   456
6
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   457
		if (node->raw_mode == FALSE) {
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   458
			tmp = g_markup_escape_text (node->value, -1);
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   459
			ret_val = g_strconcat (str, tmp, NULL);
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   460
			g_free (tmp);
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   461
		} else {
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   462
			ret_val = g_strconcat (str, node->value, NULL);
78fdf5d9eb1b 2003-06-11 Mikael Hallendal <micke@codefactory.se>
hallski <hallski>
parents: 4
diff changeset
   463
		}
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   464
		g_free (str);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   465
	} 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   466
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   467
	for (child = node->children; child; child = child->next) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   468
		gchar *child_str = lm_message_node_to_string (child);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   469
		str = ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   470
		ret_val = g_strconcat (str, "  ", child_str, NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   471
		g_free (str);
79
63971f168ce6 2004-01-29 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 57
diff changeset
   472
		g_free (child_str);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   473
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   474
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   475
	str = ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   476
	ret_val = g_strdup_printf ("%s</%s>\n", str, node->name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   477
	g_free (str);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   478
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   479
	return ret_val;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   480
}