2003-09-01 18:02:06 +00:00
|
|
|
/* -*- mode: C; c-file-style: "gnu" -*- */
|
|
|
|
|
/* dbus-gparser.c parse DBus description files
|
|
|
|
|
*
|
2005-01-29 19:52:19 +00:00
|
|
|
* Copyright (C) 2003, 2005 Red Hat, Inc.
|
2003-09-01 18:02:06 +00:00
|
|
|
*
|
2004-08-10 03:07:01 +00:00
|
|
|
* Licensed under the Academic Free License version 2.1
|
2003-09-01 18:02:06 +00:00
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
#include "dbus-gparser.h"
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
#include "dbus/dbus-glib-lowlevel.h"
|
2003-09-01 18:02:06 +00:00
|
|
|
#include "dbus-gidl.h"
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
#include "dbus/dbus-signature.h"
|
2003-09-03 02:08:25 +00:00
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
#include <libintl.h>
|
|
|
|
|
#define _(x) gettext ((x))
|
|
|
|
|
#define N_(x) x
|
|
|
|
|
|
2003-09-07 23:04:54 +00:00
|
|
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
|
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
#define ELEMENT_IS(name) (strcmp (element_name, (name)) == 0)
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
const char **retloc;
|
|
|
|
|
} LocateAttr;
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
locate_attributes (const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error,
|
|
|
|
|
const char *first_attribute_name,
|
|
|
|
|
const char **first_attribute_retloc,
|
|
|
|
|
...)
|
|
|
|
|
{
|
|
|
|
|
va_list args;
|
|
|
|
|
const char *name;
|
|
|
|
|
const char **retloc;
|
|
|
|
|
int n_attrs;
|
|
|
|
|
#define MAX_ATTRS 24
|
|
|
|
|
LocateAttr attrs[MAX_ATTRS];
|
|
|
|
|
gboolean retval;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (first_attribute_name != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (first_attribute_retloc != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
retval = TRUE;
|
|
|
|
|
|
|
|
|
|
n_attrs = 1;
|
|
|
|
|
attrs[0].name = first_attribute_name;
|
|
|
|
|
attrs[0].retloc = first_attribute_retloc;
|
|
|
|
|
*first_attribute_retloc = NULL;
|
|
|
|
|
|
|
|
|
|
va_start (args, first_attribute_retloc);
|
|
|
|
|
|
|
|
|
|
name = va_arg (args, const char*);
|
|
|
|
|
retloc = va_arg (args, const char**);
|
|
|
|
|
|
|
|
|
|
while (name != NULL)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (retloc != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
g_assert (n_attrs < MAX_ATTRS);
|
|
|
|
|
|
|
|
|
|
attrs[n_attrs].name = name;
|
|
|
|
|
attrs[n_attrs].retloc = retloc;
|
|
|
|
|
n_attrs += 1;
|
|
|
|
|
*retloc = NULL;
|
|
|
|
|
|
|
|
|
|
name = va_arg (args, const char*);
|
|
|
|
|
retloc = va_arg (args, const char**);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
va_end (args);
|
|
|
|
|
|
|
|
|
|
if (!retval)
|
|
|
|
|
return retval;
|
|
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
|
while (attribute_names[i])
|
|
|
|
|
{
|
|
|
|
|
int j;
|
|
|
|
|
gboolean found;
|
|
|
|
|
|
|
|
|
|
found = FALSE;
|
|
|
|
|
j = 0;
|
|
|
|
|
while (j < n_attrs)
|
|
|
|
|
{
|
|
|
|
|
if (strcmp (attrs[j].name, attribute_names[i]) == 0)
|
|
|
|
|
{
|
|
|
|
|
retloc = attrs[j].retloc;
|
|
|
|
|
|
|
|
|
|
if (*retloc != NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error,
|
|
|
|
|
G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("Attribute \"%s\" repeated twice on the same <%s> element"),
|
|
|
|
|
attrs[j].name, element_name);
|
|
|
|
|
retval = FALSE;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*retloc = attribute_values[i];
|
|
|
|
|
found = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
++j;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!found)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error,
|
|
|
|
|
G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("Attribute \"%s\" is invalid on <%s> element in this context"),
|
|
|
|
|
attribute_names[i], element_name);
|
|
|
|
|
retval = FALSE;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
++i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return retval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
check_no_attributes (const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
if (attribute_names[0] != NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error,
|
|
|
|
|
G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("Attribute \"%s\" is invalid on <%s> element in this context"),
|
|
|
|
|
attribute_names[0], element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2003-09-01 18:02:06 +00:00
|
|
|
|
|
|
|
|
struct Parser
|
|
|
|
|
{
|
|
|
|
|
int refcount;
|
|
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
NodeInfo *result; /* Filled in when we pop the last node */
|
|
|
|
|
GSList *node_stack;
|
|
|
|
|
InterfaceInfo *interface;
|
|
|
|
|
MethodInfo *method;
|
|
|
|
|
SignalInfo *signal;
|
2005-01-29 19:52:19 +00:00
|
|
|
PropertyInfo *property;
|
2003-09-03 02:08:25 +00:00
|
|
|
ArgInfo *arg;
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
gboolean in_annotation;
|
2003-09-01 18:02:06 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Parser*
|
|
|
|
|
parser_new (void)
|
|
|
|
|
{
|
|
|
|
|
Parser *parser;
|
|
|
|
|
|
|
|
|
|
parser = g_new0 (Parser, 1);
|
|
|
|
|
|
|
|
|
|
parser->refcount = 1;
|
|
|
|
|
|
|
|
|
|
return parser;
|
|
|
|
|
}
|
|
|
|
|
|
2003-11-27 01:25:50 +00:00
|
|
|
Parser *
|
2003-09-01 18:02:06 +00:00
|
|
|
parser_ref (Parser *parser)
|
|
|
|
|
{
|
|
|
|
|
parser->refcount += 1;
|
2003-11-27 01:25:50 +00:00
|
|
|
|
|
|
|
|
return parser;
|
2003-09-01 18:02:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
parser_unref (Parser *parser)
|
|
|
|
|
{
|
|
|
|
|
parser->refcount -= 1;
|
|
|
|
|
if (parser->refcount == 0)
|
|
|
|
|
{
|
2003-09-03 02:08:25 +00:00
|
|
|
if (parser->result)
|
|
|
|
|
node_info_unref (parser->result);
|
2003-09-01 18:02:06 +00:00
|
|
|
|
|
|
|
|
g_free (parser);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
parser_check_doctype (Parser *parser,
|
|
|
|
|
const char *doctype,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
2003-09-03 02:08:25 +00:00
|
|
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
2003-09-01 18:02:06 +00:00
|
|
|
|
2004-06-01 03:02:26 +00:00
|
|
|
if (strcmp (doctype, "node") != 0)
|
2003-09-01 18:02:06 +00:00
|
|
|
{
|
|
|
|
|
g_set_error (error,
|
2003-09-03 02:08:25 +00:00
|
|
|
G_MARKUP_ERROR,
|
2003-09-01 18:02:06 +00:00
|
|
|
G_MARKUP_ERROR_PARSE,
|
2004-06-01 03:02:26 +00:00
|
|
|
"D-BUS description file has the wrong document type %s, use node or interface",
|
2003-09-01 18:02:06 +00:00
|
|
|
doctype);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
static gboolean
|
|
|
|
|
parse_node (Parser *parser,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
NodeInfo *node;
|
|
|
|
|
|
|
|
|
|
if (parser->interface ||
|
|
|
|
|
parser->method ||
|
|
|
|
|
parser->signal ||
|
2005-01-29 19:52:19 +00:00
|
|
|
parser->property ||
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
parser->arg ||
|
|
|
|
|
parser->in_annotation)
|
2003-09-03 02:08:25 +00:00
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
2005-01-29 19:52:19 +00:00
|
|
|
_("Can't put <%s> element here"),
|
2003-09-03 02:08:25 +00:00
|
|
|
element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
name = NULL;
|
|
|
|
|
if (!locate_attributes (element_name, attribute_names,
|
|
|
|
|
attribute_values, error,
|
|
|
|
|
"name", &name,
|
|
|
|
|
NULL))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
/* Only the root node can have no name */
|
|
|
|
|
if (parser->node_stack != NULL && name == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"name", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2005-01-29 19:52:19 +00:00
|
|
|
/* Root element name must be absolute */
|
|
|
|
|
if (parser->node_stack == NULL && name && *name != '/')
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute on <%s> element must be an absolute object path, \"%s\" not OK"),
|
|
|
|
|
"name", element_name, name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Other element names must not be absolute */
|
|
|
|
|
if (parser->node_stack != NULL && name && *name == '/')
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute on <%s> element must not be an absolute object path, \"%s\" starts with /"),
|
|
|
|
|
"name", element_name, name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2003-09-17 03:52:07 +00:00
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
node = node_info_new (name);
|
2003-09-17 03:52:07 +00:00
|
|
|
|
|
|
|
|
if (parser->node_stack != NULL)
|
|
|
|
|
{
|
|
|
|
|
node_info_add_node (parser->node_stack->data,
|
|
|
|
|
node);
|
|
|
|
|
}
|
|
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
parser->node_stack = g_slist_prepend (parser->node_stack,
|
|
|
|
|
node);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
parse_interface (Parser *parser,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
InterfaceInfo *iface;
|
|
|
|
|
NodeInfo *top;
|
|
|
|
|
|
|
|
|
|
if (parser->interface ||
|
|
|
|
|
parser->method ||
|
|
|
|
|
parser->signal ||
|
2005-01-29 19:52:19 +00:00
|
|
|
parser->property ||
|
2003-09-03 02:08:25 +00:00
|
|
|
parser->arg ||
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
parser->in_annotation ||
|
2003-09-03 02:08:25 +00:00
|
|
|
(parser->node_stack == NULL))
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
2005-01-29 19:52:19 +00:00
|
|
|
_("Can't put <%s> element here"),
|
2003-09-03 02:08:25 +00:00
|
|
|
element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
name = NULL;
|
|
|
|
|
if (!locate_attributes (element_name, attribute_names,
|
|
|
|
|
attribute_values, error,
|
|
|
|
|
"name", &name,
|
|
|
|
|
NULL))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if (name == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"name", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
top = parser->node_stack->data;
|
|
|
|
|
|
|
|
|
|
iface = interface_info_new (name);
|
|
|
|
|
node_info_add_interface (top, iface);
|
|
|
|
|
interface_info_unref (iface);
|
|
|
|
|
|
|
|
|
|
parser->interface = iface;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
parse_method (Parser *parser,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
MethodInfo *method;
|
|
|
|
|
NodeInfo *top;
|
|
|
|
|
|
|
|
|
|
if (parser->interface == NULL ||
|
|
|
|
|
parser->node_stack == NULL ||
|
|
|
|
|
parser->method ||
|
|
|
|
|
parser->signal ||
|
2005-01-29 19:52:19 +00:00
|
|
|
parser->property ||
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
parser->in_annotation ||
|
2003-09-03 02:08:25 +00:00
|
|
|
parser->arg)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
2005-01-29 19:52:19 +00:00
|
|
|
_("Can't put <%s> element here"),
|
2003-09-03 02:08:25 +00:00
|
|
|
element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
name = NULL;
|
|
|
|
|
if (!locate_attributes (element_name, attribute_names,
|
|
|
|
|
attribute_values, error,
|
|
|
|
|
"name", &name,
|
|
|
|
|
NULL))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if (name == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"name", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
top = parser->node_stack->data;
|
|
|
|
|
|
|
|
|
|
method = method_info_new (name);
|
|
|
|
|
interface_info_add_method (parser->interface, method);
|
|
|
|
|
method_info_unref (method);
|
|
|
|
|
|
|
|
|
|
parser->method = method;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
parse_signal (Parser *parser,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
SignalInfo *signal;
|
|
|
|
|
NodeInfo *top;
|
|
|
|
|
|
|
|
|
|
if (parser->interface == NULL ||
|
|
|
|
|
parser->node_stack == NULL ||
|
|
|
|
|
parser->signal ||
|
2005-01-29 19:52:19 +00:00
|
|
|
parser->method ||
|
|
|
|
|
parser->property ||
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
parser->in_annotation ||
|
2003-09-03 02:08:25 +00:00
|
|
|
parser->arg)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
2005-01-29 19:52:19 +00:00
|
|
|
_("Can't put <%s> element here"),
|
2003-09-03 02:08:25 +00:00
|
|
|
element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
name = NULL;
|
|
|
|
|
if (!locate_attributes (element_name, attribute_names,
|
|
|
|
|
attribute_values, error,
|
|
|
|
|
"name", &name,
|
|
|
|
|
NULL))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if (name == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"name", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
top = parser->node_stack->data;
|
|
|
|
|
|
|
|
|
|
signal = signal_info_new (name);
|
|
|
|
|
interface_info_add_signal (parser->interface, signal);
|
|
|
|
|
signal_info_unref (signal);
|
|
|
|
|
|
|
|
|
|
parser->signal = signal;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
static gboolean
|
|
|
|
|
validate_signature (const char *str,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
GError **error)
|
2003-09-03 02:08:25 +00:00
|
|
|
{
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
DBusError derror;
|
2003-09-03 02:08:25 +00:00
|
|
|
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
dbus_error_init (&derror);
|
2005-01-29 19:52:19 +00:00
|
|
|
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
if (!dbus_signature_validate (str, &derror))
|
2005-01-29 19:52:19 +00:00
|
|
|
{
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
dbus_set_g_error (error, &derror);
|
|
|
|
|
return FALSE;
|
2005-01-29 19:52:19 +00:00
|
|
|
}
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
return TRUE;
|
2005-01-29 19:52:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
parse_property (Parser *parser,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error)
|
2003-09-03 02:08:25 +00:00
|
|
|
{
|
2005-01-29 19:52:19 +00:00
|
|
|
const char *name;
|
|
|
|
|
const char *access;
|
|
|
|
|
const char *type;
|
|
|
|
|
PropertyInfo *property;
|
|
|
|
|
NodeInfo *top;
|
|
|
|
|
PropertyAccessFlags access_flags;
|
|
|
|
|
|
|
|
|
|
if (parser->interface == NULL ||
|
|
|
|
|
parser->node_stack == NULL ||
|
|
|
|
|
parser->signal ||
|
|
|
|
|
parser->method ||
|
|
|
|
|
parser->property ||
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
parser->in_annotation ||
|
2005-01-29 19:52:19 +00:00
|
|
|
parser->arg)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("Can't put <%s> element here"),
|
|
|
|
|
element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
name = NULL;
|
|
|
|
|
if (!locate_attributes (element_name, attribute_names,
|
|
|
|
|
attribute_values, error,
|
|
|
|
|
"name", &name,
|
|
|
|
|
"access", &access,
|
|
|
|
|
"type", &type,
|
|
|
|
|
NULL))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if (name == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"name", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (access == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"access", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (type == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"type", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
if (!validate_signature (type, element_name, error))
|
2005-01-29 19:52:19 +00:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
access_flags = 0;
|
|
|
|
|
if (strcmp (access, "readwrite") == 0)
|
|
|
|
|
access_flags = PROPERTY_READ | PROPERTY_WRITE;
|
|
|
|
|
else if (strcmp (access, "read") == 0)
|
|
|
|
|
access_flags = PROPERTY_READ;
|
|
|
|
|
else if (strcmp (access, "write") == 0)
|
|
|
|
|
access_flags = PROPERTY_WRITE;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("access=\"%s\" must have value readwrite, read, or write on %s\n"),
|
|
|
|
|
access, element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
top = parser->node_stack->data;
|
|
|
|
|
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
property = property_info_new (name, type, access_flags);
|
2005-01-29 19:52:19 +00:00
|
|
|
interface_info_add_property (parser->interface, property);
|
|
|
|
|
property_info_unref (property);
|
|
|
|
|
|
|
|
|
|
parser->property = property;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
2003-09-03 02:08:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
parse_arg (Parser *parser,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
const char *type;
|
|
|
|
|
const char *direction;
|
|
|
|
|
ArgDirection dir;
|
|
|
|
|
ArgInfo *arg;
|
2005-02-12 20:27:45 +00:00
|
|
|
char *generated_name;
|
2003-09-03 02:08:25 +00:00
|
|
|
|
|
|
|
|
if (!(parser->method || parser->signal) ||
|
|
|
|
|
parser->node_stack == NULL ||
|
2005-01-29 19:52:19 +00:00
|
|
|
parser->property ||
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
parser->in_annotation ||
|
2003-09-03 02:08:25 +00:00
|
|
|
parser->arg)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
2005-01-29 19:52:19 +00:00
|
|
|
_("Can't put <%s> element here"),
|
2003-09-03 02:08:25 +00:00
|
|
|
element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
name = NULL;
|
|
|
|
|
if (!locate_attributes (element_name, attribute_names,
|
|
|
|
|
attribute_values, error,
|
|
|
|
|
"name", &name,
|
|
|
|
|
"type", &type,
|
|
|
|
|
"direction", &direction,
|
|
|
|
|
NULL))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
/* name can be null for args */
|
|
|
|
|
|
|
|
|
|
if (type == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"type", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (direction == NULL)
|
|
|
|
|
{
|
|
|
|
|
/* methods default to in, signal to out */
|
|
|
|
|
if (parser->method)
|
|
|
|
|
direction = "in";
|
|
|
|
|
else if (parser->signal)
|
|
|
|
|
direction = "out";
|
|
|
|
|
else
|
|
|
|
|
g_assert_not_reached ();
|
|
|
|
|
}
|
|
|
|
|
|
2005-01-29 19:52:19 +00:00
|
|
|
dir = ARG_INVALID;
|
|
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
if (strcmp (direction, "in") == 0)
|
|
|
|
|
dir = ARG_IN;
|
|
|
|
|
else if (strcmp (direction, "out") == 0)
|
|
|
|
|
dir = ARG_OUT;
|
2005-01-29 19:52:19 +00:00
|
|
|
|
|
|
|
|
if (dir == ARG_INVALID ||
|
|
|
|
|
(parser->signal && dir == ARG_IN))
|
2003-09-03 02:08:25 +00:00
|
|
|
{
|
2005-01-29 19:52:19 +00:00
|
|
|
if (parser->signal)
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("Signals must have direction=\"out\" (just omit the direction attribute)"));
|
|
|
|
|
else
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute on <%s> has value \"in\" or \"out\""),
|
|
|
|
|
"direction", element_name);
|
2003-09-03 02:08:25 +00:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
if (!validate_signature (type, element_name, error))
|
2005-01-29 19:52:19 +00:00
|
|
|
return FALSE;
|
2005-02-12 20:27:45 +00:00
|
|
|
|
|
|
|
|
generated_name = NULL;
|
|
|
|
|
if (name == NULL)
|
|
|
|
|
generated_name = g_strdup_printf ("arg%d",
|
|
|
|
|
parser->method ?
|
|
|
|
|
method_info_get_n_args (parser->method) :
|
|
|
|
|
signal_info_get_n_args (parser->signal));
|
|
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
|
2005-02-27 Colin Walters <walters@verbum.org>
* glib/dbus-gidl.c (property_info_get_type, arg_info_get_type):
Change return value to const char * instead of int so we can do
full signatures.
(struct PropertyInfo, struct ArgInfo): Store char *.
(property_info_new, arg_info_new): Update parameters, strdup.
(property_info_unref, arg_info_unref): Free.
* glib/dbus-gidl.h: Update prototypes.
* glib/dbus-gparser.c (basic_type_from_string): Delete.
(validate_signature): New function, just validates signature and
sets GError.
(parse_property, parse_arg): Invoke validate_signature. Store
signature instead of just type code.
* glib/dbus-gvalue.c (base_type_from_signature): New utility
function to return a primary type for a signature, dropping
information about types in container types.
(dbus_gvalue_genmarshal_name_from_type)
(dbus_gvalue_binding_type_from_type)
(dbus_gvalue_ctype_from_type): Update to take full signature
instead of type code.
(dbus_gtype_to_dbus_type): Moved here from glib/dbus-gobject.c.
* glib/dbus-gvalue.h: Update prototypes for above.
* glib/dbus-gobject.c (gtype_to_dbus_type): Moved to
glib/dbus-gvalue.c as dbus_gtype_to_dbus_type.
(introspect_properties, introspect_signals, write_interface):
Update to handle signatures, and remove usage of
_dbus_gutils_type_to_string.
(handle_introspect): Print out type codes instead of e.g. "string"
in hardcoded introspection XML; also use x_AS_STRING constants
instead of hardcoding in string.
* glib/dbus-glib-tool.c (pretty_print): Handle signature change
to string. Remove usage of _dbus_gutils_type_to_string.
* glib/dbus-gutils.c (_dbus_gutils_type_to_string): Delete.
* glib/dbus-gutils.h (_dbus_gutils_type_to_string): Update for
deletion.
* glib/dbus-binding-tool-glib.c (compute_marshaller)
(compute_marshaller_name, generate_glue): Handle signature change
to string.
(write_formal_parameters, write_args_for_direction): Ditto, and
remove FIXME.
* tools/dbus-tree-view.c (type_to_string): Delete.
(info_set_func_text): Update to print full signatures.
* test/glib/test-service-glib.xml: Change types to new
introspection format.
2005-02-27 17:38:12 +00:00
|
|
|
arg = arg_info_new (name ? name : generated_name, dir, type);
|
2003-09-03 02:08:25 +00:00
|
|
|
if (parser->method)
|
|
|
|
|
method_info_add_arg (parser->method, arg);
|
|
|
|
|
else if (parser->signal)
|
|
|
|
|
signal_info_add_arg (parser->signal, arg);
|
|
|
|
|
else
|
|
|
|
|
g_assert_not_reached ();
|
|
|
|
|
|
2005-02-12 20:27:45 +00:00
|
|
|
g_free (generated_name);
|
|
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
arg_info_unref (arg);
|
|
|
|
|
|
|
|
|
|
parser->arg = arg;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
static gboolean
|
|
|
|
|
parse_annotation (Parser *parser,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
const char *value;
|
|
|
|
|
|
2005-02-19 16:17:29 +00:00
|
|
|
if (!(parser->method || parser->interface) ||
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
parser->node_stack == NULL ||
|
|
|
|
|
parser->signal ||
|
|
|
|
|
parser->in_annotation)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("Can't put <%s> element here"),
|
|
|
|
|
element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
name = NULL;
|
|
|
|
|
if (!locate_attributes (element_name, attribute_names,
|
|
|
|
|
attribute_values, error,
|
|
|
|
|
"name", &name,
|
|
|
|
|
"value", &value,
|
|
|
|
|
NULL))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if (name == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"name", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
if (value == NULL)
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("\"%s\" attribute required on <%s> element "),
|
|
|
|
|
"value", element_name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (parser->method)
|
|
|
|
|
method_info_add_annotation (parser->method, name, value);
|
|
|
|
|
else if (parser->interface)
|
|
|
|
|
interface_info_add_annotation (parser->interface, name, value);
|
|
|
|
|
else
|
|
|
|
|
g_assert_not_reached ();
|
|
|
|
|
|
|
|
|
|
parser->in_annotation = TRUE;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2003-09-01 18:02:06 +00:00
|
|
|
gboolean
|
|
|
|
|
parser_start_element (Parser *parser,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
const char **attribute_names,
|
|
|
|
|
const char **attribute_values,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
2003-09-03 02:08:25 +00:00
|
|
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
2003-09-01 18:02:06 +00:00
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
if (ELEMENT_IS ("node"))
|
|
|
|
|
{
|
|
|
|
|
if (!parse_node (parser, element_name, attribute_names,
|
|
|
|
|
attribute_values, error))
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
else if (ELEMENT_IS ("interface"))
|
|
|
|
|
{
|
|
|
|
|
if (!parse_interface (parser, element_name, attribute_names,
|
|
|
|
|
attribute_values, error))
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
else if (ELEMENT_IS ("method"))
|
|
|
|
|
{
|
|
|
|
|
if (!parse_method (parser, element_name, attribute_names,
|
|
|
|
|
attribute_values, error))
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
else if (ELEMENT_IS ("signal"))
|
|
|
|
|
{
|
|
|
|
|
if (!parse_signal (parser, element_name, attribute_names,
|
|
|
|
|
attribute_values, error))
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2005-01-29 19:52:19 +00:00
|
|
|
else if (ELEMENT_IS ("property"))
|
|
|
|
|
{
|
|
|
|
|
if (!parse_property (parser, element_name, attribute_names,
|
|
|
|
|
attribute_values, error))
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2003-09-03 02:08:25 +00:00
|
|
|
else if (ELEMENT_IS ("arg"))
|
|
|
|
|
{
|
|
|
|
|
if (!parse_arg (parser, element_name, attribute_names,
|
|
|
|
|
attribute_values, error))
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
else if (ELEMENT_IS ("annotation"))
|
|
|
|
|
{
|
|
|
|
|
if (!parse_annotation (parser, element_name, attribute_names,
|
|
|
|
|
attribute_values, error))
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2003-09-03 02:08:25 +00:00
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
g_set_error (error, G_MARKUP_ERROR,
|
|
|
|
|
G_MARKUP_ERROR_PARSE,
|
|
|
|
|
_("Element <%s> not recognized"),
|
|
|
|
|
element_name);
|
|
|
|
|
}
|
|
|
|
|
|
2003-09-01 18:02:06 +00:00
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
parser_end_element (Parser *parser,
|
|
|
|
|
const char *element_name,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
2003-09-03 02:08:25 +00:00
|
|
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
if (ELEMENT_IS ("interface"))
|
|
|
|
|
{
|
|
|
|
|
parser->interface = NULL;
|
|
|
|
|
}
|
|
|
|
|
else if (ELEMENT_IS ("method"))
|
|
|
|
|
{
|
|
|
|
|
parser->method = NULL;
|
|
|
|
|
}
|
|
|
|
|
else if (ELEMENT_IS ("signal"))
|
|
|
|
|
{
|
|
|
|
|
parser->signal = NULL;
|
|
|
|
|
}
|
2005-01-29 19:52:19 +00:00
|
|
|
else if (ELEMENT_IS ("property"))
|
|
|
|
|
{
|
|
|
|
|
parser->property = NULL;
|
|
|
|
|
}
|
2003-09-03 02:08:25 +00:00
|
|
|
else if (ELEMENT_IS ("arg"))
|
|
|
|
|
{
|
|
|
|
|
parser->arg = NULL;
|
|
|
|
|
}
|
2005-02-17 Colin Walters <walters@verbum.org>
* glib/dbus-gparser.c (struct Parser): Add in_annotation boolean.
(parse_node, parse_interface, parse_method, parse_signal)
(parse_property, parse_annotation): Lose if we're currently in an
annotation.
(parse_annotation): New function.
(parser_start_element, parser_end_element): Handle annotation.
(parse_method, parse_interface): Remove support for c_name attribute,
switch to annotations.
* glib/dbus-gidl.h (interface_info_get_binding_names)
(method_info_get_binding_names)
(interface_info_get_binding_name, method_info_get_binding_name)
(interface_info_set_binding_name, method_info_set_binding_name):
Remove.
(interface_info_get_annotations, method_info_get_annotations)
(interface_info_get_annotation, method_info_get_annotation)
(interface_info_add_annotation, method_info_add_annotation):
Prototype.
* glib/dbus-gidl.c (struct InterfaceInfo): Substitute "annotations"
for "bindings".
(struct MethodInfo): Ditto.
Straightfoward conversion of binding methods into annotation methods
as prototyped.
* glib/dbus-glib-tool.c (pretty_print): Print annotations.
* glib/dbus-binding-tool-glib.h (DBUS_GLIB_ANNOTATION_C_SYMBOL): Define.
* glib/dbus-binding-tool-glib.c (gather_marshallers, generate_glue):
Use new annotation API.
* doc/introspect.dtd: Fix a number of DTD syntax errors. Add
annotation element.
* doc/dbus-specification.xml: Discuss introspection annotations,
include list of well-known annotations.
* test/glib/test-service-glib.xml: Make validate against new DTD.
2005-02-17 21:11:18 +00:00
|
|
|
else if (ELEMENT_IS ("annotation"))
|
|
|
|
|
{
|
|
|
|
|
parser->in_annotation = FALSE;
|
|
|
|
|
}
|
2003-09-03 02:08:25 +00:00
|
|
|
else if (ELEMENT_IS ("node"))
|
|
|
|
|
{
|
|
|
|
|
NodeInfo *top;
|
2003-09-01 18:02:06 +00:00
|
|
|
|
2003-09-03 02:08:25 +00:00
|
|
|
g_assert (parser->node_stack != NULL);
|
|
|
|
|
top = parser->node_stack->data;
|
|
|
|
|
|
|
|
|
|
parser->node_stack = g_slist_remove (parser->node_stack,
|
|
|
|
|
top);
|
|
|
|
|
|
|
|
|
|
if (parser->node_stack == NULL)
|
|
|
|
|
parser->result = top; /* We are done, store the result */
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
g_assert_not_reached (); /* should have had an error on start_element */
|
|
|
|
|
|
2003-09-01 18:02:06 +00:00
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
parser_content (Parser *parser,
|
|
|
|
|
const char *content,
|
|
|
|
|
int len,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
2003-09-03 02:08:25 +00:00
|
|
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
2003-09-01 18:02:06 +00:00
|
|
|
|
2005-01-29 19:52:19 +00:00
|
|
|
/* FIXME check that it's all whitespace */
|
|
|
|
|
|
2003-09-01 18:02:06 +00:00
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
|
parser_finished (Parser *parser,
|
|
|
|
|
GError **error)
|
|
|
|
|
{
|
2003-09-03 02:08:25 +00:00
|
|
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
2003-09-01 18:02:06 +00:00
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2003-09-03 02:08:25 +00:00
|
|
|
|
|
|
|
|
NodeInfo*
|
|
|
|
|
parser_get_nodes (Parser *parser)
|
|
|
|
|
{
|
|
|
|
|
return parser->result;
|
|
|
|
|
}
|
2003-09-07 23:04:54 +00:00
|
|
|
|
|
|
|
|
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
|