<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>dbus-gparser.c Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.2.15 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>dbus-gparser.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font> 00002 <font class="comment">/* dbus-gparser.c parse DBus description files</font> 00003 <font class="comment"> *</font> 00004 <font class="comment"> * Copyright (C) 2003 Red Hat, Inc.</font> 00005 <font class="comment"> *</font> 00006 <font class="comment"> * Licensed under the Academic Free License version 2.0</font> 00007 <font class="comment"> * </font> 00008 <font class="comment"> * This program is free software; you can redistribute it and/or modify</font> 00009 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> 00010 <font class="comment"> * the Free Software Foundation; either version 2 of the License, or</font> 00011 <font class="comment"> * (at your option) any later version.</font> 00012 <font class="comment"> *</font> 00013 <font class="comment"> * This program is distributed in the hope that it will be useful,</font> 00014 <font class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00015 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</font> 00016 <font class="comment"> * GNU General Public License for more details.</font> 00017 <font class="comment"> * </font> 00018 <font class="comment"> * You should have received a copy of the GNU General Public License</font> 00019 <font class="comment"> * along with this program; if not, write to the Free Software</font> 00020 <font class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</font> 00021 <font class="comment"> *</font> 00022 <font class="comment"> */</font> 00023 <font class="preprocessor">#include "dbus-gparser.h"</font> 00024 <font class="preprocessor">#include "dbus-gidl.h"</font> 00025 <font class="preprocessor">#include <string.h></font> 00026 00027 <font class="preprocessor">#include <libintl.h></font> 00028 <font class="preprocessor">#define _(x) gettext ((x))</font> 00029 <font class="preprocessor"></font><font class="preprocessor">#define N_(x) x</font> 00030 <font class="preprocessor"></font> 00031 <font class="preprocessor">#ifndef DOXYGEN_SHOULD_SKIP_THIS</font> 00032 <font class="preprocessor"></font> 00033 <font class="preprocessor">#define ELEMENT_IS(name) (strcmp (element_name, (name)) == 0)</font> 00034 <font class="preprocessor"></font> 00035 <font class="keyword">typedef</font> <font class="keyword">struct</font> 00036 <font class="keyword"></font>{ 00037 <font class="keyword">const</font> <font class="keywordtype">char</font> *name; 00038 <font class="keyword">const</font> <font class="keywordtype">char</font> **retloc; 00039 } LocateAttr; 00040 00041 <font class="keyword">static</font> gboolean 00042 locate_attributes (<font class="keyword">const</font> <font class="keywordtype">char</font> *element_name, 00043 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_names, 00044 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_values, 00045 GError **error, 00046 <font class="keyword">const</font> <font class="keywordtype">char</font> *first_attribute_name, 00047 <font class="keyword">const</font> <font class="keywordtype">char</font> **first_attribute_retloc, 00048 ...) 00049 { 00050 va_list args; 00051 <font class="keyword">const</font> <font class="keywordtype">char</font> *name; 00052 <font class="keyword">const</font> <font class="keywordtype">char</font> **retloc; 00053 <font class="keywordtype">int</font> n_attrs; 00054 <font class="preprocessor">#define MAX_ATTRS 24</font> 00055 <font class="preprocessor"></font> LocateAttr attrs[MAX_ATTRS]; 00056 gboolean retval; 00057 <font class="keywordtype">int</font> i; 00058 00059 g_return_val_if_fail (first_attribute_name != NULL, FALSE); 00060 g_return_val_if_fail (first_attribute_retloc != NULL, FALSE); 00061 00062 retval = TRUE; 00063 00064 n_attrs = 1; 00065 attrs[0].name = first_attribute_name; 00066 attrs[0].retloc = first_attribute_retloc; 00067 *first_attribute_retloc = NULL; 00068 00069 va_start (args, first_attribute_retloc); 00070 00071 name = va_arg (args, <font class="keyword">const</font> <font class="keywordtype">char</font>*); 00072 retloc = va_arg (args, <font class="keyword">const</font> <font class="keywordtype">char</font>**); 00073 00074 <font class="keywordflow">while</font> (name != NULL) 00075 { 00076 g_return_val_if_fail (retloc != NULL, FALSE); 00077 00078 g_assert (n_attrs < MAX_ATTRS); 00079 00080 attrs[n_attrs].name = name; 00081 attrs[n_attrs].retloc = retloc; 00082 n_attrs += 1; 00083 *retloc = NULL; 00084 00085 name = va_arg (args, <font class="keyword">const</font> <font class="keywordtype">char</font>*); 00086 retloc = va_arg (args, <font class="keyword">const</font> <font class="keywordtype">char</font>**); 00087 } 00088 00089 va_end (args); 00090 00091 <font class="keywordflow">if</font> (!retval) 00092 <font class="keywordflow">return</font> retval; 00093 00094 i = 0; 00095 <font class="keywordflow">while</font> (attribute_names[i]) 00096 { 00097 <font class="keywordtype">int</font> j; 00098 gboolean found; 00099 00100 found = FALSE; 00101 j = 0; 00102 <font class="keywordflow">while</font> (j < n_attrs) 00103 { 00104 <font class="keywordflow">if</font> (strcmp (attrs[j].name, attribute_names[i]) == 0) 00105 { 00106 retloc = attrs[j].retloc; 00107 00108 <font class="keywordflow">if</font> (*retloc != NULL) 00109 { 00110 g_set_error (error, 00111 G_MARKUP_ERROR, 00112 G_MARKUP_ERROR_PARSE, 00113 _(<font class="stringliteral">"Attribute \"%s\" repeated twice on the same <%s> element"</font>), 00114 attrs[j].name, element_name); 00115 retval = FALSE; 00116 <font class="keywordflow">goto</font> out; 00117 } 00118 00119 *retloc = attribute_values[i]; 00120 found = TRUE; 00121 } 00122 00123 ++j; 00124 } 00125 00126 <font class="keywordflow">if</font> (!found) 00127 { 00128 g_set_error (error, 00129 G_MARKUP_ERROR, 00130 G_MARKUP_ERROR_PARSE, 00131 _(<font class="stringliteral">"Attribute \"%s\" is invalid on <%s> element in this context"</font>), 00132 attribute_names[i], element_name); 00133 retval = FALSE; 00134 <font class="keywordflow">goto</font> out; 00135 } 00136 00137 ++i; 00138 } 00139 00140 out: 00141 <font class="keywordflow">return</font> retval; 00142 } 00143 00144 <font class="keyword">static</font> gboolean 00145 check_no_attributes (<font class="keyword">const</font> <font class="keywordtype">char</font> *element_name, 00146 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_names, 00147 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_values, 00148 GError **error) 00149 { 00150 <font class="keywordflow">if</font> (attribute_names[0] != NULL) 00151 { 00152 g_set_error (error, 00153 G_MARKUP_ERROR, 00154 G_MARKUP_ERROR_PARSE, 00155 _(<font class="stringliteral">"Attribute \"%s\" is invalid on <%s> element in this context"</font>), 00156 attribute_names[0], element_name); 00157 <font class="keywordflow">return</font> FALSE; 00158 } 00159 00160 <font class="keywordflow">return</font> TRUE; 00161 } 00162 00163 <font class="keyword">struct </font>Parser 00164 { 00165 <font class="keywordtype">int</font> refcount; 00166 00167 NodeInfo *result; <font class="comment">/* Filled in when we pop the last node */</font> 00168 GSList *node_stack; 00169 InterfaceInfo *interface; 00170 MethodInfo *method; 00171 SignalInfo *signal; 00172 ArgInfo *arg; 00173 }; 00174 00175 Parser* 00176 parser_new (<font class="keywordtype">void</font>) 00177 { 00178 Parser *parser; 00179 00180 parser = g_new0 (Parser, 1); 00181 00182 parser->refcount = 1; 00183 00184 <font class="keywordflow">return</font> parser; 00185 } 00186 00187 Parser * 00188 parser_ref (Parser *parser) 00189 { 00190 parser->refcount += 1; 00191 00192 <font class="keywordflow">return</font> parser; 00193 } 00194 00195 <font class="keywordtype">void</font> 00196 parser_unref (Parser *parser) 00197 { 00198 parser->refcount -= 1; 00199 <font class="keywordflow">if</font> (parser->refcount == 0) 00200 { 00201 <font class="keywordflow">if</font> (parser->result) 00202 node_info_unref (parser->result); 00203 00204 g_free (parser); 00205 } 00206 } 00207 00208 gboolean 00209 parser_check_doctype (Parser *parser, 00210 <font class="keyword">const</font> <font class="keywordtype">char</font> *doctype, 00211 GError **error) 00212 { 00213 g_return_val_if_fail (error == NULL || *error == NULL, FALSE); 00214 00215 <font class="keywordflow">if</font> (strcmp (doctype, <font class="stringliteral">"node"</font>) != 0) 00216 { 00217 g_set_error (error, 00218 G_MARKUP_ERROR, 00219 G_MARKUP_ERROR_PARSE, 00220 <font class="stringliteral">"D-BUS description file has the wrong document type %s, use node or interface"</font>, 00221 doctype); 00222 <font class="keywordflow">return</font> FALSE; 00223 } 00224 <font class="keywordflow">else</font> 00225 <font class="keywordflow">return</font> TRUE; 00226 } 00227 00228 <font class="keyword">static</font> gboolean 00229 parse_node (Parser *parser, 00230 <font class="keyword">const</font> <font class="keywordtype">char</font> *element_name, 00231 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_names, 00232 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_values, 00233 GError **error) 00234 { 00235 <font class="keyword">const</font> <font class="keywordtype">char</font> *name; 00236 NodeInfo *node; 00237 00238 <font class="keywordflow">if</font> (parser->interface || 00239 parser->method || 00240 parser->signal || 00241 parser->arg) 00242 { 00243 g_set_error (error, G_MARKUP_ERROR, 00244 G_MARKUP_ERROR_PARSE, 00245 _(<font class="stringliteral">"Can't put a <%s> element here"</font>), 00246 element_name); 00247 <font class="keywordflow">return</font> FALSE; 00248 } 00249 00250 name = NULL; 00251 <font class="keywordflow">if</font> (!locate_attributes (element_name, attribute_names, 00252 attribute_values, error, 00253 <font class="stringliteral">"name"</font>, &name, 00254 NULL)) 00255 <font class="keywordflow">return</font> FALSE; 00256 00257 <font class="comment">/* Only the root node can have no name */</font> 00258 <font class="keywordflow">if</font> (parser->node_stack != NULL && name == NULL) 00259 { 00260 g_set_error (error, G_MARKUP_ERROR, 00261 G_MARKUP_ERROR_PARSE, 00262 _(<font class="stringliteral">"\"%s\" attribute required on <%s> element "</font>), 00263 <font class="stringliteral">"name"</font>, element_name); 00264 <font class="keywordflow">return</font> FALSE; 00265 } 00266 00267 00268 node = node_info_new (name); 00269 00270 <font class="keywordflow">if</font> (parser->node_stack != NULL) 00271 { 00272 node_info_add_node (parser->node_stack->data, 00273 node); 00274 } 00275 00276 parser->node_stack = g_slist_prepend (parser->node_stack, 00277 node); 00278 00279 <font class="keywordflow">return</font> TRUE; 00280 } 00281 00282 <font class="keyword">static</font> gboolean 00283 parse_interface (Parser *parser, 00284 <font class="keyword">const</font> <font class="keywordtype">char</font> *element_name, 00285 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_names, 00286 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_values, 00287 GError **error) 00288 { 00289 <font class="keyword">const</font> <font class="keywordtype">char</font> *name; 00290 InterfaceInfo *iface; 00291 NodeInfo *top; 00292 00293 <font class="keywordflow">if</font> (parser->interface || 00294 parser->method || 00295 parser->signal || 00296 parser->arg || 00297 (parser->node_stack == NULL)) 00298 { 00299 g_set_error (error, G_MARKUP_ERROR, 00300 G_MARKUP_ERROR_PARSE, 00301 _(<font class="stringliteral">"Can't put a <%s> element here"</font>), 00302 element_name); 00303 <font class="keywordflow">return</font> FALSE; 00304 } 00305 00306 name = NULL; 00307 <font class="keywordflow">if</font> (!locate_attributes (element_name, attribute_names, 00308 attribute_values, error, 00309 <font class="stringliteral">"name"</font>, &name, 00310 NULL)) 00311 <font class="keywordflow">return</font> FALSE; 00312 00313 <font class="keywordflow">if</font> (name == NULL) 00314 { 00315 g_set_error (error, G_MARKUP_ERROR, 00316 G_MARKUP_ERROR_PARSE, 00317 _(<font class="stringliteral">"\"%s\" attribute required on <%s> element "</font>), 00318 <font class="stringliteral">"name"</font>, element_name); 00319 <font class="keywordflow">return</font> FALSE; 00320 } 00321 00322 top = parser->node_stack->data; 00323 00324 iface = interface_info_new (name); 00325 node_info_add_interface (top, iface); 00326 interface_info_unref (iface); 00327 00328 parser->interface = iface; 00329 00330 <font class="keywordflow">return</font> TRUE; 00331 } 00332 00333 <font class="keyword">static</font> gboolean 00334 parse_method (Parser *parser, 00335 <font class="keyword">const</font> <font class="keywordtype">char</font> *element_name, 00336 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_names, 00337 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_values, 00338 GError **error) 00339 { 00340 <font class="keyword">const</font> <font class="keywordtype">char</font> *name; 00341 MethodInfo *method; 00342 NodeInfo *top; 00343 00344 <font class="keywordflow">if</font> (parser->interface == NULL || 00345 parser->node_stack == NULL || 00346 parser->method || 00347 parser->signal || 00348 parser->arg) 00349 { 00350 g_set_error (error, G_MARKUP_ERROR, 00351 G_MARKUP_ERROR_PARSE, 00352 _(<font class="stringliteral">"Can't put a <%s> element here"</font>), 00353 element_name); 00354 <font class="keywordflow">return</font> FALSE; 00355 } 00356 00357 name = NULL; 00358 <font class="keywordflow">if</font> (!locate_attributes (element_name, attribute_names, 00359 attribute_values, error, 00360 <font class="stringliteral">"name"</font>, &name, 00361 NULL)) 00362 <font class="keywordflow">return</font> FALSE; 00363 00364 <font class="keywordflow">if</font> (name == NULL) 00365 { 00366 g_set_error (error, G_MARKUP_ERROR, 00367 G_MARKUP_ERROR_PARSE, 00368 _(<font class="stringliteral">"\"%s\" attribute required on <%s> element "</font>), 00369 <font class="stringliteral">"name"</font>, element_name); 00370 <font class="keywordflow">return</font> FALSE; 00371 } 00372 00373 top = parser->node_stack->data; 00374 00375 method = method_info_new (name); 00376 interface_info_add_method (parser->interface, method); 00377 method_info_unref (method); 00378 00379 parser->method = method; 00380 00381 <font class="keywordflow">return</font> TRUE; 00382 } 00383 00384 <font class="keyword">static</font> gboolean 00385 parse_signal (Parser *parser, 00386 <font class="keyword">const</font> <font class="keywordtype">char</font> *element_name, 00387 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_names, 00388 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_values, 00389 GError **error) 00390 { 00391 <font class="keyword">const</font> <font class="keywordtype">char</font> *name; 00392 SignalInfo *signal; 00393 NodeInfo *top; 00394 00395 <font class="keywordflow">if</font> (parser->interface == NULL || 00396 parser->node_stack == NULL || 00397 parser->signal || 00398 parser->signal || 00399 parser->arg) 00400 { 00401 g_set_error (error, G_MARKUP_ERROR, 00402 G_MARKUP_ERROR_PARSE, 00403 _(<font class="stringliteral">"Can't put a <%s> element here"</font>), 00404 element_name); 00405 <font class="keywordflow">return</font> FALSE; 00406 } 00407 00408 name = NULL; 00409 <font class="keywordflow">if</font> (!locate_attributes (element_name, attribute_names, 00410 attribute_values, error, 00411 <font class="stringliteral">"name"</font>, &name, 00412 NULL)) 00413 <font class="keywordflow">return</font> FALSE; 00414 00415 <font class="keywordflow">if</font> (name == NULL) 00416 { 00417 g_set_error (error, G_MARKUP_ERROR, 00418 G_MARKUP_ERROR_PARSE, 00419 _(<font class="stringliteral">"\"%s\" attribute required on <%s> element "</font>), 00420 <font class="stringliteral">"name"</font>, element_name); 00421 <font class="keywordflow">return</font> FALSE; 00422 } 00423 00424 top = parser->node_stack->data; 00425 00426 signal = signal_info_new (name); 00427 interface_info_add_signal (parser->interface, signal); 00428 signal_info_unref (signal); 00429 00430 parser->signal = signal; 00431 00432 <font class="keywordflow">return</font> TRUE; 00433 } 00434 00435 <font class="keyword">static</font> <font class="keywordtype">int</font> 00436 basic_type_from_string (<font class="keyword">const</font> <font class="keywordtype">char</font> *str) 00437 { 00438 <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"string"</font>) == 0) 00439 <font class="keywordflow">return</font> DBUS_TYPE_STRING; 00440 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"int32"</font>) == 0) 00441 <font class="keywordflow">return</font> DBUS_TYPE_INT32; 00442 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"uint32"</font>) == 0) 00443 <font class="keywordflow">return</font> DBUS_TYPE_UINT32; 00444 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"int64"</font>) == 0) 00445 <font class="keywordflow">return</font> DBUS_TYPE_INT64; 00446 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"uint64"</font>) == 0) 00447 <font class="keywordflow">return</font> DBUS_TYPE_UINT64; 00448 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"double"</font>) == 0) 00449 <font class="keywordflow">return</font> DBUS_TYPE_DOUBLE; 00450 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"byte"</font>) == 0) 00451 <font class="keywordflow">return</font> DBUS_TYPE_BYTE; 00452 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"boolean"</font>) == 0) 00453 <font class="keywordflow">return</font> DBUS_TYPE_BOOLEAN; 00454 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"byte"</font>) == 0) 00455 <font class="keywordflow">return</font> DBUS_TYPE_BYTE; 00456 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (str, <font class="stringliteral">"object"</font>) == 0) 00457 <font class="keywordflow">return</font> DBUS_TYPE_OBJECT_PATH; 00458 <font class="keywordflow">else</font> 00459 <font class="keywordflow">return</font> DBUS_TYPE_INVALID; 00460 } 00461 00462 <font class="keyword">static</font> <font class="keywordtype">int</font> 00463 type_from_string (<font class="keyword">const</font> <font class="keywordtype">char</font> *str) 00464 { 00465 <font class="keywordflow">return</font> basic_type_from_string (str); 00466 } 00467 00468 <font class="keyword">static</font> gboolean 00469 parse_arg (Parser *parser, 00470 <font class="keyword">const</font> <font class="keywordtype">char</font> *element_name, 00471 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_names, 00472 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_values, 00473 GError **error) 00474 { 00475 <font class="keyword">const</font> <font class="keywordtype">char</font> *name; 00476 <font class="keyword">const</font> <font class="keywordtype">char</font> *type; 00477 <font class="keyword">const</font> <font class="keywordtype">char</font> *direction; 00478 ArgDirection dir; 00479 <font class="keywordtype">int</font> t; 00480 ArgInfo *arg; 00481 00482 <font class="keywordflow">if</font> (!(parser->method || parser->signal) || 00483 parser->node_stack == NULL || 00484 parser->arg) 00485 { 00486 g_set_error (error, G_MARKUP_ERROR, 00487 G_MARKUP_ERROR_PARSE, 00488 _(<font class="stringliteral">"Can't put a <%s> element here"</font>), 00489 element_name); 00490 <font class="keywordflow">return</font> FALSE; 00491 } 00492 00493 name = NULL; 00494 <font class="keywordflow">if</font> (!locate_attributes (element_name, attribute_names, 00495 attribute_values, error, 00496 <font class="stringliteral">"name"</font>, &name, 00497 <font class="stringliteral">"type"</font>, &type, 00498 <font class="stringliteral">"direction"</font>, &direction, 00499 NULL)) 00500 <font class="keywordflow">return</font> FALSE; 00501 00502 <font class="comment">/* name can be null for args */</font> 00503 00504 <font class="keywordflow">if</font> (type == NULL) 00505 { 00506 g_set_error (error, G_MARKUP_ERROR, 00507 G_MARKUP_ERROR_PARSE, 00508 _(<font class="stringliteral">"\"%s\" attribute required on <%s> element "</font>), 00509 <font class="stringliteral">"type"</font>, element_name); 00510 <font class="keywordflow">return</font> FALSE; 00511 } 00512 00513 <font class="keywordflow">if</font> (direction == NULL) 00514 { 00515 <font class="comment">/* methods default to in, signal to out */</font> 00516 <font class="keywordflow">if</font> (parser->method) 00517 direction = <font class="stringliteral">"in"</font>; 00518 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (parser->signal) 00519 direction = <font class="stringliteral">"out"</font>; 00520 <font class="keywordflow">else</font> 00521 g_assert_not_reached (); 00522 } 00523 00524 <font class="keywordflow">if</font> (strcmp (direction, <font class="stringliteral">"in"</font>) == 0) 00525 dir = ARG_IN; 00526 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strcmp (direction, <font class="stringliteral">"out"</font>) == 0) 00527 dir = ARG_OUT; 00528 <font class="keywordflow">else</font> 00529 { 00530 g_set_error (error, G_MARKUP_ERROR, 00531 G_MARKUP_ERROR_PARSE, 00532 _(<font class="stringliteral">"\"%s\" attribute on <%s> has value \"in\" or \"out\""</font>), 00533 <font class="stringliteral">"direction"</font>, element_name); 00534 <font class="keywordflow">return</font> FALSE; 00535 } 00536 00537 t = type_from_string (type); 00538 00539 arg = arg_info_new (name, dir, t); 00540 <font class="keywordflow">if</font> (parser->method) 00541 method_info_add_arg (parser->method, arg); 00542 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (parser->signal) 00543 signal_info_add_arg (parser->signal, arg); 00544 <font class="keywordflow">else</font> 00545 g_assert_not_reached (); 00546 00547 arg_info_unref (arg); 00548 00549 parser->arg = arg; 00550 00551 <font class="keywordflow">return</font> TRUE; 00552 } 00553 00554 gboolean 00555 parser_start_element (Parser *parser, 00556 <font class="keyword">const</font> <font class="keywordtype">char</font> *element_name, 00557 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_names, 00558 <font class="keyword">const</font> <font class="keywordtype">char</font> **attribute_values, 00559 GError **error) 00560 { 00561 g_return_val_if_fail (error == NULL || *error == NULL, FALSE); 00562 00563 <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"node"</font>)) 00564 { 00565 <font class="keywordflow">if</font> (!parse_node (parser, element_name, attribute_names, 00566 attribute_values, error)) 00567 <font class="keywordflow">return</font> FALSE; 00568 } 00569 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"interface"</font>)) 00570 { 00571 <font class="keywordflow">if</font> (!parse_interface (parser, element_name, attribute_names, 00572 attribute_values, error)) 00573 <font class="keywordflow">return</font> FALSE; 00574 } 00575 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"method"</font>)) 00576 { 00577 <font class="keywordflow">if</font> (!parse_method (parser, element_name, attribute_names, 00578 attribute_values, error)) 00579 <font class="keywordflow">return</font> FALSE; 00580 } 00581 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"signal"</font>)) 00582 { 00583 <font class="keywordflow">if</font> (!parse_signal (parser, element_name, attribute_names, 00584 attribute_values, error)) 00585 <font class="keywordflow">return</font> FALSE; 00586 } 00587 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"arg"</font>)) 00588 { 00589 <font class="keywordflow">if</font> (!parse_arg (parser, element_name, attribute_names, 00590 attribute_values, error)) 00591 <font class="keywordflow">return</font> FALSE; 00592 } 00593 <font class="keywordflow">else</font> 00594 { 00595 g_set_error (error, G_MARKUP_ERROR, 00596 G_MARKUP_ERROR_PARSE, 00597 _(<font class="stringliteral">"Element <%s> not recognized"</font>), 00598 element_name); 00599 } 00600 00601 <font class="keywordflow">return</font> TRUE; 00602 } 00603 00604 gboolean 00605 parser_end_element (Parser *parser, 00606 <font class="keyword">const</font> <font class="keywordtype">char</font> *element_name, 00607 GError **error) 00608 { 00609 g_return_val_if_fail (error == NULL || *error == NULL, FALSE); 00610 00611 <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"interface"</font>)) 00612 { 00613 parser->interface = NULL; 00614 } 00615 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"method"</font>)) 00616 { 00617 parser->method = NULL; 00618 } 00619 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"signal"</font>)) 00620 { 00621 parser->signal = NULL; 00622 } 00623 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"arg"</font>)) 00624 { 00625 parser->arg = NULL; 00626 } 00627 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"node"</font>)) 00628 { 00629 NodeInfo *top; 00630 00631 g_assert (parser->node_stack != NULL); 00632 top = parser->node_stack->data; 00633 00634 parser->node_stack = g_slist_remove (parser->node_stack, 00635 top); 00636 00637 <font class="keywordflow">if</font> (parser->node_stack == NULL) 00638 parser->result = top; <font class="comment">/* We are done, store the result */</font> 00639 } 00640 <font class="keywordflow">else</font> 00641 g_assert_not_reached (); <font class="comment">/* should have had an error on start_element */</font> 00642 00643 <font class="keywordflow">return</font> TRUE; 00644 } 00645 00646 gboolean 00647 parser_content (Parser *parser, 00648 <font class="keyword">const</font> <font class="keywordtype">char</font> *content, 00649 <font class="keywordtype">int</font> len, 00650 GError **error) 00651 { 00652 g_return_val_if_fail (error == NULL || *error == NULL, FALSE); 00653 00654 <font class="keywordflow">return</font> TRUE; 00655 } 00656 00657 gboolean 00658 parser_finished (Parser *parser, 00659 GError **error) 00660 { 00661 g_return_val_if_fail (error == NULL || *error == NULL, FALSE); 00662 00663 <font class="keywordflow">return</font> TRUE; 00664 } 00665 00666 NodeInfo* 00667 parser_get_nodes (Parser *parser) 00668 { 00669 <font class="keywordflow">return</font> parser->result; 00670 } 00671 00672 <font class="preprocessor">#endif </font><font class="comment">/* DOXYGEN_SHOULD_SKIP_THIS */</font> </pre></div><hr><address align="right"><small>Generated on Wed Jun 9 05:01:25 2004 for D-BUS by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.15 </small></address> </body> </html>