Sophie

Sophie

distrib > Mandriva > 2007.0 > x86_64 > media > main-release > by-pkgid > 926d2d1e3111287cee1b0a4fad4fb4f6 > files > 70

lib64dbus-1_3-devel-0.92-6mdv2007.0.x86_64.rpm

<!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> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </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 &lt;string.h&gt;</font>
00026 
00027 <font class="preprocessor">#include &lt;libintl.h&gt;</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 &lt; 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 &lt; 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 &lt;%s&gt; 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 &lt;%s&gt; 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 &lt;%s&gt; 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-&gt;refcount = 1;
00183 
00184   <font class="keywordflow">return</font> parser;
00185 }
00186 
00187 Parser *
00188 parser_ref (Parser *parser)
00189 {
00190   parser-&gt;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-&gt;refcount -= 1;
00199   <font class="keywordflow">if</font> (parser-&gt;refcount == 0)
00200     {
00201       <font class="keywordflow">if</font> (parser-&gt;result)
00202         node_info_unref (parser-&gt;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-&gt;interface ||
00239       parser-&gt;method ||
00240       parser-&gt;signal ||
00241       parser-&gt;arg)
00242     {
00243       g_set_error (error, G_MARKUP_ERROR,
00244                    G_MARKUP_ERROR_PARSE,
00245                    _(<font class="stringliteral">"Can't put a &lt;%s&gt; 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>, &amp;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-&gt;node_stack != NULL &amp;&amp; name == NULL)
00259     {
00260       g_set_error (error, G_MARKUP_ERROR,
00261                    G_MARKUP_ERROR_PARSE,
00262                    _(<font class="stringliteral">"\"%s\" attribute required on &lt;%s&gt; 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-&gt;node_stack != NULL)
00271     {
00272       node_info_add_node (parser-&gt;node_stack-&gt;data,
00273                           node);
00274     }
00275   
00276   parser-&gt;node_stack = g_slist_prepend (parser-&gt;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-&gt;interface ||
00294       parser-&gt;method ||
00295       parser-&gt;signal ||
00296       parser-&gt;arg ||
00297       (parser-&gt;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 &lt;%s&gt; 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>, &amp;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 &lt;%s&gt; element "</font>),
00318                    <font class="stringliteral">"name"</font>, element_name);
00319       <font class="keywordflow">return</font> FALSE;
00320     }
00321 
00322   top = parser-&gt;node_stack-&gt;data;
00323   
00324   iface = interface_info_new (name);
00325   node_info_add_interface (top, iface);
00326   interface_info_unref (iface);
00327 
00328   parser-&gt;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-&gt;interface == NULL ||
00345       parser-&gt;node_stack == NULL ||
00346       parser-&gt;method ||
00347       parser-&gt;signal ||
00348       parser-&gt;arg)
00349     {
00350       g_set_error (error, G_MARKUP_ERROR,
00351                    G_MARKUP_ERROR_PARSE,
00352                    _(<font class="stringliteral">"Can't put a &lt;%s&gt; 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>, &amp;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 &lt;%s&gt; element "</font>),
00369                    <font class="stringliteral">"name"</font>, element_name);
00370       <font class="keywordflow">return</font> FALSE;
00371     }
00372 
00373   top = parser-&gt;node_stack-&gt;data;
00374   
00375   method = method_info_new (name);
00376   interface_info_add_method (parser-&gt;interface, method);
00377   method_info_unref (method);
00378 
00379   parser-&gt;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-&gt;interface == NULL ||
00396       parser-&gt;node_stack == NULL ||
00397       parser-&gt;signal ||
00398       parser-&gt;signal ||
00399       parser-&gt;arg)
00400     {
00401       g_set_error (error, G_MARKUP_ERROR,
00402                    G_MARKUP_ERROR_PARSE,
00403                    _(<font class="stringliteral">"Can't put a &lt;%s&gt; 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>, &amp;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 &lt;%s&gt; element "</font>),
00420                    <font class="stringliteral">"name"</font>, element_name);
00421       <font class="keywordflow">return</font> FALSE;
00422     }
00423 
00424   top = parser-&gt;node_stack-&gt;data;
00425   
00426   signal = signal_info_new (name);
00427   interface_info_add_signal (parser-&gt;interface, signal);
00428   signal_info_unref (signal);
00429 
00430   parser-&gt;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-&gt;method || parser-&gt;signal) ||
00483       parser-&gt;node_stack == NULL ||
00484       parser-&gt;arg)
00485     {
00486       g_set_error (error, G_MARKUP_ERROR,
00487                    G_MARKUP_ERROR_PARSE,
00488                    _(<font class="stringliteral">"Can't put a &lt;%s&gt; 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>, &amp;name,
00497                           <font class="stringliteral">"type"</font>, &amp;type,
00498                           <font class="stringliteral">"direction"</font>, &amp;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 &lt;%s&gt; 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-&gt;method)
00517         direction = <font class="stringliteral">"in"</font>;
00518       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (parser-&gt;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 &lt;%s&gt; 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-&gt;method)
00541     method_info_add_arg (parser-&gt;method, arg);
00542   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (parser-&gt;signal)
00543     signal_info_add_arg (parser-&gt;signal, arg);
00544   <font class="keywordflow">else</font>
00545     g_assert_not_reached ();
00546 
00547   arg_info_unref (arg);
00548 
00549   parser-&gt;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 &lt;%s&gt; 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-&gt;interface = NULL;
00614     }
00615   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"method"</font>))
00616     {
00617       parser-&gt;method = NULL;
00618     }
00619   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"signal"</font>))
00620     {
00621       parser-&gt;signal = NULL;
00622     }
00623   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (ELEMENT_IS (<font class="stringliteral">"arg"</font>))
00624     {
00625       parser-&gt;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-&gt;node_stack != NULL);
00632       top = parser-&gt;node_stack-&gt;data;
00633 
00634       parser-&gt;node_stack = g_slist_remove (parser-&gt;node_stack,
00635                                            top);
00636 
00637       <font class="keywordflow">if</font> (parser-&gt;node_stack == NULL)
00638         parser-&gt;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-&gt;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>