diff options
author | Colin Walters <walters@verbum.org> | 2005-02-17 21:11:18 +0000 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2005-02-17 21:11:18 +0000 |
commit | dc12fac5f8a36d0276719bc5a98aa63bffe86399 (patch) | |
tree | 4f8e865c9933a261be0aaa3f72fa66a44786813d /glib/dbus-gparser.c | |
parent | 03f6615eaccc2c1f84d4252e5a627a2ac86d41d9 (diff) |
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.
Diffstat (limited to 'glib/dbus-gparser.c')
-rw-r--r-- | glib/dbus-gparser.c | 88 |
1 files changed, 79 insertions, 9 deletions
diff --git a/glib/dbus-gparser.c b/glib/dbus-gparser.c index 05136aa8..3adfe32e 100644 --- a/glib/dbus-gparser.c +++ b/glib/dbus-gparser.c @@ -171,6 +171,7 @@ struct Parser SignalInfo *signal; PropertyInfo *property; ArgInfo *arg; + gboolean in_annotation; }; Parser* @@ -240,7 +241,8 @@ parse_node (Parser *parser, parser->method || parser->signal || parser->property || - parser->arg) + parser->arg || + parser->in_annotation) { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, @@ -308,7 +310,6 @@ parse_interface (Parser *parser, GError **error) { const char *name; - const char *c_name; InterfaceInfo *iface; NodeInfo *top; @@ -317,6 +318,7 @@ parse_interface (Parser *parser, parser->signal || parser->property || parser->arg || + parser->in_annotation || (parser->node_stack == NULL)) { g_set_error (error, G_MARKUP_ERROR, @@ -330,7 +332,6 @@ parse_interface (Parser *parser, if (!locate_attributes (element_name, attribute_names, attribute_values, error, "name", &name, - "c_name", &c_name, NULL)) return FALSE; @@ -346,8 +347,6 @@ parse_interface (Parser *parser, top = parser->node_stack->data; iface = interface_info_new (name); - if (c_name) - interface_info_set_binding_name (iface, "C", c_name); node_info_add_interface (top, iface); interface_info_unref (iface); @@ -364,7 +363,6 @@ parse_method (Parser *parser, GError **error) { const char *name; - const char *c_name; MethodInfo *method; NodeInfo *top; @@ -373,6 +371,7 @@ parse_method (Parser *parser, parser->method || parser->signal || parser->property || + parser->in_annotation || parser->arg) { g_set_error (error, G_MARKUP_ERROR, @@ -386,7 +385,6 @@ parse_method (Parser *parser, if (!locate_attributes (element_name, attribute_names, attribute_values, error, "name", &name, - "c_name", &c_name, NULL)) return FALSE; @@ -402,8 +400,6 @@ parse_method (Parser *parser, top = parser->node_stack->data; method = method_info_new (name); - if (c_name) - method_info_set_binding_name (method, "C", c_name); interface_info_add_method (parser->interface, method); method_info_unref (method); @@ -428,6 +424,7 @@ parse_signal (Parser *parser, parser->signal || parser->method || parser->property || + parser->in_annotation || parser->arg) { g_set_error (error, G_MARKUP_ERROR, @@ -539,6 +536,7 @@ parse_property (Parser *parser, parser->signal || parser->method || parser->property || + parser->in_annotation || parser->arg) { g_set_error (error, G_MARKUP_ERROR, @@ -633,6 +631,7 @@ parse_arg (Parser *parser, if (!(parser->method || parser->signal) || parser->node_stack == NULL || parser->property || + parser->in_annotation || parser->arg) { g_set_error (error, G_MARKUP_ERROR, @@ -724,6 +723,67 @@ parse_arg (Parser *parser, return TRUE; } +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; + + if (!(parser->method || parser->interface || parser->arg) || + 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; + + /* name can be null for args */ + + 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; +} + gboolean parser_start_element (Parser *parser, const char *element_name, @@ -769,6 +829,12 @@ parser_start_element (Parser *parser, attribute_values, error)) return FALSE; } + else if (ELEMENT_IS ("annotation")) + { + if (!parse_annotation (parser, element_name, attribute_names, + attribute_values, error)) + return FALSE; + } else { g_set_error (error, G_MARKUP_ERROR, @@ -807,6 +873,10 @@ parser_end_element (Parser *parser, { parser->arg = NULL; } + else if (ELEMENT_IS ("annotation")) + { + parser->in_annotation = FALSE; + } else if (ELEMENT_IS ("node")) { NodeInfo *top; |