loudmouth/lm-parser.c
author hallski <hallski>
Tue, 06 Jun 2006 12:39:19 +0000
changeset 152 c736903f577b
parent 102 f47119027379
permissions -rw-r--r--
2006-06-06 Mikael Hallendal <micke@imendio.com> * loudmouth/lm-connection.c: (connection_free): - Call lm_parser_free to actually free it. * loudmouth/lm-parser.c: (lm_parser_free): - Free up memory used by the parser. - Fixes LM-39
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-debug.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    25
#include "lm-internals.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    26
#include "lm-message-node.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    27
#include "lm-parser.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    28
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    29
#define SHORT_END_TAG "/>"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    30
#define XML_MAX_DEPTH 5
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    31
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    32
#define LM_PARSER(o) ((LmParser *) o)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    33
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    34
struct LmParser {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    35
	LmParserMessageFunction  function;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    36
	gpointer                 user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    37
	GDestroyNotify           notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    38
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    39
	LmMessageNode           *cur_root;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    40
	LmMessageNode           *cur_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    41
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    42
	GMarkupParser           *m_parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    43
	GMarkupParseContext     *context;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    44
};
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    45
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    46
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    47
/* Used while parsing */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    48
static void    parser_start_node_cb (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    49
				     const gchar          *node_name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    50
				     const gchar         **attribute_names,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    51
				     const gchar         **attribute_values,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    52
				     gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    53
				     GError              **error);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    54
static void    parser_end_node_cb   (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    55
				     const gchar          *node_name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    56
				     gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    57
				     GError              **error);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    58
static void    parser_text_cb       (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    59
				     const gchar          *text,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    60
				     gsize                 text_len,  
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    61
				     gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    62
				     GError              **error);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    63
static void    parser_error_cb      (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    64
				     GError               *error,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    65
				     gpointer              user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    66
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    67
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    68
parser_start_node_cb (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    69
		      const gchar          *node_name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    70
		      const gchar         **attribute_names,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    71
		      const gchar         **attribute_values,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    72
		      gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    73
		      GError              **error)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    74
{	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    75
	LmParser     *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    76
	gint          i;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    77
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    78
	parser = LM_PARSER (user_data);;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    79
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    80
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    81
/* 	parser->cur_depth++; */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    82
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    83
	if (!parser->cur_root) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    84
		/* New toplevel element */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    85
		parser->cur_root = _lm_message_node_new (node_name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    86
		parser->cur_node = parser->cur_root;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    87
	} else {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    88
		LmMessageNode *parent_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    89
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    90
		parent_node = parser->cur_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    91
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    92
		parser->cur_node = _lm_message_node_new (node_name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    93
		_lm_message_node_add_child_node (parent_node,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    94
						 parser->cur_node);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    95
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    96
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    97
	for (i = 0; attribute_names[i]; ++i) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    98
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_PARSER, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    99
		       "ATTRIBUTE: %s = %s\n", 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   100
		       attribute_names[i],
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   101
		       attribute_values[i]);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   102
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   103
		lm_message_node_set_attributes (parser->cur_node,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   104
						attribute_names[i],
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   105
						attribute_values[i], 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   106
						NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   107
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   108
	
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 4
diff changeset
   109
	if (strcmp ("stream:stream", node_name) == 0) {
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   110
		parser_end_node_cb (context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   111
				    "stream:stream",
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   112
				    user_data, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   113
				    error);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   114
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   115
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   116
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   117
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   118
parser_end_node_cb (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   119
		    const gchar          *node_name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   120
		    gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   121
		    GError              **error)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   122
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   123
	LmParser     *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   124
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   125
	parser = LM_PARSER (user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   126
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   127
	g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_PARSER,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   128
	       "Trying to close node: %s\n", node_name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   129
34
c09b43b3b697 2003-08-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   130
        if (!parser->cur_node) {
c09b43b3b697 2003-08-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   131
                /* FIXME: LM-1 should look at this */
c09b43b3b697 2003-08-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   132
                return;
c09b43b3b697 2003-08-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   133
        }
c09b43b3b697 2003-08-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   134
        
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 4
diff changeset
   135
	if (strcmp (parser->cur_node->name, node_name) != 0) {
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 4
diff changeset
   136
		if (strcmp (node_name, "stream:stream")) {
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   137
			g_print ("Got an stream:stream end\n");
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   138
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   139
		g_warning ("Trying to close node that isn't open: %s",
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   140
			   node_name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   141
		return;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   142
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   143
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   144
	if (parser->cur_node == parser->cur_root) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   145
		LmMessage *m;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   146
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   147
		m = _lm_message_new_from_node (parser->cur_root);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   148
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   149
		if (!m) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   150
			g_warning ("Couldn't create message: %s\n",
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   151
				   parser->cur_root->name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   152
			return;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   153
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   154
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   155
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_PARSER,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   156
		       "Have a new message\n");
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   157
		if (parser->function) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   158
			(* parser->function) (parser, m, parser->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   159
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   160
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   161
		lm_message_unref (m);
84
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
   162
		lm_message_node_unref (parser->cur_root);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   163
		
84
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
   164
			
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   165
		parser->cur_node = parser->cur_root = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   166
	} else {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   167
		LmMessageNode *tmp_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   168
		tmp_node = parser->cur_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   169
		parser->cur_node = parser->cur_node->parent;
84
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
   170
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
   171
		lm_message_node_unref (tmp_node);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   172
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   173
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   174
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   175
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   176
parser_text_cb (GMarkupParseContext   *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   177
		const gchar           *text,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   178
		gsize                  text_len,  
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   179
		gpointer               user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   180
		GError               **error)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   181
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   182
	LmParser *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   183
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   184
	g_return_if_fail (user_data != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   185
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   186
	parser = LM_PARSER (user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   187
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   188
	if (parser->cur_node && strcmp (text, "") != 0) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   189
		lm_message_node_set_value (parser->cur_node, text);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   190
	} 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   191
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   192
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   193
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   194
parser_error_cb (GMarkupParseContext *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   195
		 GError              *error,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   196
		 gpointer             user_data)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   197
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   198
	LmParser     *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   199
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   200
	g_return_if_fail (user_data != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   201
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   202
	parser = LM_PARSER (user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   203
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   204
	g_markup_parse_context_free (parser->context);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   205
	parser->context = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   206
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   207
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   208
LmParser *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   209
lm_parser_new (LmParserMessageFunction function, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   210
	       gpointer                user_data, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   211
	       GDestroyNotify          notify)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   212
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   213
	LmParser *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   214
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   215
	parser = g_new0 (LmParser, 1);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   216
	if (!parser) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   217
		return NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   218
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   219
	
84
7ae7b690aa89 2004-05-28 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
   220
	parser->m_parser = g_new0 (GMarkupParser, 1);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   221
	if (!parser->m_parser) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   222
		g_free (parser);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   223
		return NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   224
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   225
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   226
	parser->function  = function;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   227
	parser->user_data = user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   228
	parser->notify    = notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   229
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   230
	parser->m_parser->start_element = parser_start_node_cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   231
	parser->m_parser->end_element   = parser_end_node_cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   232
	parser->m_parser->text          = parser_text_cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   233
	parser->m_parser->error         = parser_error_cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   234
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   235
	parser->context = g_markup_parse_context_new (parser->m_parser, 0,
7
d8eae83450ac 2003-06-13 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 4
diff changeset
   236
						      parser, NULL);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   237
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   238
	parser->cur_root = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   239
	parser->cur_node = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   240
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   241
	return parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   242
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   243
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   244
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   245
lm_parser_parse (LmParser *parser, const gchar *string)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   246
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   247
	g_return_if_fail (parser != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   248
	
102
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   249
        if (!parser->context) {
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   250
                parser->context = g_markup_parse_context_new (parser->m_parser, 0,
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   251
                                                              parser, NULL);
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   252
        }
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   253
        
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   254
        if (g_markup_parse_context_parse (parser->context, string, 
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   255
                                          strlen (string), NULL)) {
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   256
        } else {
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   257
                g_warning ("Parsing failed\n");
f47119027379 2004-10-30 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   258
        }
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   259
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   260
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   261
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   262
lm_parser_free (LmParser *parser)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   263
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   264
	if (parser->notify) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   265
		(* parser->notify) (parser->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   266
	}
152
c736903f577b 2006-06-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 102
diff changeset
   267
c736903f577b 2006-06-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 102
diff changeset
   268
	if (parser->context) {
c736903f577b 2006-06-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 102
diff changeset
   269
		g_markup_parse_context_free (parser->context);
c736903f577b 2006-06-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 102
diff changeset
   270
	}
c736903f577b 2006-06-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 102
diff changeset
   271
	g_free (parser->m_parser);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   272
	g_free (parser);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   273
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   274