loudmouth/lm-parser.c
author hallski <hallski>
Mon, 19 May 2003 19:01:30 +0000
changeset 3 5c632650c603
parent 1 50e230cf7818
child 4 52f92481d8de
permissions -rw-r--r--
2003-05-19 Mikael Hallendal <micke@imendo.com> * Updated contact information
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
/*
3
5c632650c603 2003-05-19 Mikael Hallendal <micke@imendo.com>
hallski <hallski>
parents: 1
diff changeset
     3
 * Copyright (C) 2003 Mikael Hallendal <micke@imendo.com>
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     4
 * Copyright (C) 2003 CodeFactory AB. 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     5
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     7
 * modify it under the terms of the GNU Lesser General Public License as
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     8
 * published by the Free Software Foundation; either version 2 of the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     9
 * License, or (at your option) any later version.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    10
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    14
 * Lesser General Public License for more details.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    15
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    16
 * You should have received a copy of the GNU Lesser General Public
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    17
 * License along with this program; if not, write to the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    18
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    19
 * Boston, MA 02111-1307, USA.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    20
 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    21
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    22
#include <config.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    23
#include <string.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    24
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    25
#include "lm-debug.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    26
#include "lm-internals.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    27
#include "lm-message-node.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    28
#include "lm-parser.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    29
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    30
#define SHORT_END_TAG "/>"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    31
#define XML_MAX_DEPTH 5
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    32
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    33
#define LM_PARSER(o) ((LmParser *) o)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    34
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    35
struct LmParser {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    36
	LmParserMessageFunction  function;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    37
	gpointer                 user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    38
	GDestroyNotify           notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    39
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    40
	LmMessageNode           *cur_root;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    41
	LmMessageNode           *cur_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    42
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    43
	GMarkupParser           *m_parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    44
	GMarkupParseContext     *context;
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
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    48
/* Used while parsing */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    49
static void    parser_start_node_cb (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    50
				     const gchar          *node_name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    51
				     const gchar         **attribute_names,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    52
				     const gchar         **attribute_values,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    53
				     gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    54
				     GError              **error);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    55
static void    parser_end_node_cb   (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    56
				     const gchar          *node_name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    57
				     gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    58
				     GError              **error);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    59
static void    parser_text_cb       (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    60
				     const gchar          *text,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    61
				     gsize                 text_len,  
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    62
				     gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    63
				     GError              **error);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    64
static void    parser_error_cb      (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    65
				     GError               *error,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    66
				     gpointer              user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    67
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    68
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    69
parser_start_node_cb (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    70
		      const gchar          *node_name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    71
		      const gchar         **attribute_names,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    72
		      const gchar         **attribute_values,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    73
		      gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    74
		      GError              **error)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    75
{	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    76
	LmParser     *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    77
	gint          i;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    78
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    79
	parser = LM_PARSER (user_data);;
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
/* 	parser->cur_depth++; */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    83
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    84
	if (!parser->cur_root) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    85
		/* New toplevel element */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    86
		parser->cur_root = _lm_message_node_new (node_name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    87
		parser->cur_node = parser->cur_root;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    88
	} else {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    89
		LmMessageNode *parent_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    90
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    91
		parent_node = parser->cur_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    92
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    93
		parser->cur_node = _lm_message_node_new (node_name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    94
		_lm_message_node_add_child_node (parent_node,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    95
						 parser->cur_node);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    96
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    97
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    98
	for (i = 0; attribute_names[i]; ++i) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    99
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_PARSER, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   100
		       "ATTRIBUTE: %s = %s\n", 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   101
		       attribute_names[i],
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   102
		       attribute_values[i]);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   103
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   104
		lm_message_node_set_attributes (parser->cur_node,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   105
						attribute_names[i],
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   106
						attribute_values[i], 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   107
						NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   108
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   109
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   110
	if (g_ascii_strcasecmp ("stream:stream", node_name) == 0) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   111
		parser_end_node_cb (context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   112
				    "stream:stream",
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   113
				    user_data, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   114
				    error);
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
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   118
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   119
parser_end_node_cb (GMarkupParseContext  *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   120
		    const gchar          *node_name,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   121
		    gpointer              user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   122
		    GError              **error)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   123
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   124
	LmParser     *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   125
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   126
	parser = LM_PARSER (user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   127
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   128
	g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_PARSER,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   129
	       "Trying to close node: %s\n", node_name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   130
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   131
	if (g_ascii_strcasecmp (parser->cur_node->name, node_name) != 0) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   132
		if (g_ascii_strcasecmp (node_name, "stream:stream")) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   133
			g_print ("Got an stream:stream end\n");
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   134
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   135
		g_warning ("Trying to close node that isn't open: %s",
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   136
			   node_name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   137
		return;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   138
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   139
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   140
	if (parser->cur_node == parser->cur_root) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   141
		LmMessage *m;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   142
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   143
		m = _lm_message_new_from_node (parser->cur_root);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   144
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   145
		if (!m) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   146
			g_warning ("Couldn't create message: %s\n",
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   147
				   parser->cur_root->name);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   148
			return;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   149
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   150
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   151
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_PARSER,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   152
		       "Have a new message\n");
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   153
		if (parser->function) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   154
			(* parser->function) (parser, m, parser->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   155
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   156
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   157
		lm_message_unref (m);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   158
 		lm_message_node_unref (parser->cur_root);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   159
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   160
		parser->cur_node = parser->cur_root = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   161
	} else {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   162
		LmMessageNode *tmp_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   163
		tmp_node = parser->cur_node;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   164
		parser->cur_node = parser->cur_node->parent;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   165
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   166
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   167
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   168
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   169
parser_text_cb (GMarkupParseContext   *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   170
		const gchar           *text,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   171
		gsize                  text_len,  
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   172
		gpointer               user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   173
		GError               **error)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   174
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   175
	LmParser *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   176
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   177
	g_return_if_fail (user_data != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   178
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   179
	parser = LM_PARSER (user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   180
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   181
	if (parser->cur_node && strcmp (text, "") != 0) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   182
		lm_message_node_set_value (parser->cur_node, text);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   183
	} 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   184
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   185
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   186
static void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   187
parser_error_cb (GMarkupParseContext *context,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   188
		 GError              *error,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   189
		 gpointer             user_data)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   190
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   191
	LmParser     *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   192
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   193
	g_return_if_fail (user_data != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   194
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   195
	parser = LM_PARSER (user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   196
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   197
	g_markup_parse_context_free (parser->context);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   198
	parser->context = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   199
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   200
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   201
LmParser *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   202
lm_parser_new (LmParserMessageFunction function, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   203
	       gpointer                user_data, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   204
	       GDestroyNotify          notify)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   205
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   206
	LmParser *parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   207
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   208
	parser = g_new0 (LmParser, 1);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   209
	if (!parser) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   210
		return NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   211
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   212
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   213
	parser->m_parser                = g_new0 (GMarkupParser, 1);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   214
	if (!parser->m_parser) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   215
		g_free (parser);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   216
		return NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   217
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   218
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   219
	parser->function  = function;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   220
	parser->user_data = user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   221
	parser->notify    = notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   222
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   223
	parser->m_parser->start_element = parser_start_node_cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   224
	parser->m_parser->end_element   = parser_end_node_cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   225
	parser->m_parser->text          = parser_text_cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   226
	parser->m_parser->error         = parser_error_cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   227
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   228
	parser->context = g_markup_parse_context_new (parser->m_parser, 0,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   229
						    parser, NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   230
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   231
	parser->cur_root = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   232
	parser->cur_node = NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   233
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   234
	return parser;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   235
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   236
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   237
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   238
lm_parser_parse (LmParser *parser, const gchar *string)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   239
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   240
	g_return_if_fail (parser != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   241
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   242
	if (!parser->context) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   243
		parser->context = g_markup_parse_context_new (parser->m_parser, 0,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   244
							      parser, NULL);
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
	if (!g_utf8_validate (string, -1, NULL)) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   248
		gchar *tmp;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   249
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   250
		/* We can't do much better than guess what charset the string is
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   251
		 * encoded in... Try ISO-8859-1.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   252
		 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   253
		tmp = g_convert (string, -1,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   254
				 "UTF-8", "ISO-8859-1",
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   255
				 NULL, NULL,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   256
				 NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   257
		
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   258
		if (tmp) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   259
			if (g_markup_parse_context_parse (parser->context, tmp, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   260
							  strlen (tmp), NULL)) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   261
			} else {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   262
				g_warning ("Parsing failed\n");
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   263
			}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   264
			
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   265
			g_free (tmp);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   266
		} else {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   267
			g_warning ("Trying to parse a string that is not UTF-8 and not ISO-8859-1.");
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   268
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   269
	} else {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   270
		if (g_markup_parse_context_parse (parser->context, string, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   271
						  strlen (string), NULL)) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   272
		} else {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   273
			g_warning ("Parsing failed\n");
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   274
		}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   275
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   276
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   277
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   278
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   279
lm_parser_free (LmParser *parser)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   280
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   281
	if (parser->notify) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   282
		(* parser->notify) (parser->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   283
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   284
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   285
	g_free (parser);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   286
	g_print ("Free parser\n");
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   287
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   288