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