diff options
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; |