summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2005-02-17 21:11:18 +0000
committerColin Walters <walters@verbum.org>2005-02-17 21:11:18 +0000
commitdc12fac5f8a36d0276719bc5a98aa63bffe86399 (patch)
tree4f8e865c9933a261be0aaa3f72fa66a44786813d
parent03f6615eaccc2c1f84d4252e5a627a2ac86d41d9 (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.
-rw-r--r--ChangeLog42
-rw-r--r--doc/dbus-specification.xml41
-rw-r--r--doc/introspect.dtd23
-rw-r--r--glib/dbus-binding-tool-glib.c10
-rw-r--r--glib/dbus-binding-tool-glib.h2
-rw-r--r--glib/dbus-gidl.c60
-rw-r--r--glib/dbus-gidl.h24
-rw-r--r--glib/dbus-glib-tool.c30
-rw-r--r--glib/dbus-gparser.c88
-rw-r--r--test/glib/test-service-glib.xml18
10 files changed, 239 insertions, 99 deletions
diff --git a/ChangeLog b/ChangeLog
index 30decfa1..d418aee2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,47 @@
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 Colin Walters <walters@verbum.org>
+
This patch is based on initial work from
Paul Kuliniewicz <kuliniew@purdue.edu>.
diff --git a/doc/dbus-specification.xml b/doc/dbus-specification.xml
index 3d6a207f..ad21af62 100644
--- a/doc/dbus-specification.xml
+++ b/doc/dbus-specification.xml
@@ -2296,6 +2296,7 @@
&lt;method name="Frobate"&gt;
&lt;arg name="foo" type="int32" direction="in"/&gt;
&lt;arg name="bar" type="string" direction="out"/&gt;
+ &lt;annotation name="org.freedesktop.DBus.Deprecated" value="true"/&gt;
&lt;/method&gt;
&lt;signal name="Changed"&gt;
&lt;arg name="new_value" type="boolean"/&gt;
@@ -2367,23 +2368,41 @@
</listitem>
<listitem>
<para>
- The method, interface, property, and signal elements may have
- an attribute deprecated="yes|no". If the attribute is not
- present, the default value for an interface is "no", and
- the default value for methods, properties, and signals is
- the deprecation status of the interface.
- </para>
- </listitem>
- <listitem>
- <para>
The "name" attribute on arguments is optional.
</para>
</listitem>
</itemizedlist>
</para>
-
+ <para>
+ Method, interface, property, and signal elements may have
+ "annotations", which are generic key/value pairs of metadata.
+ They are similar conceptually to Java's annotations and C# attributes.
+ Well-known annotations:
+ </para>
+ <informaltable>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Name</entry>
+ <entry>Values (separated by ,)</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>org.freedesktop.DBus.Deprecated</entry>
+ <entry>true,false</entry>
+ <entry>Whether or not the entity is deprecated; defaults to false</entry>
+ </row>
+ <row>
+ <entry>org.freedesktop.DBus.GLib.CSymbol</entry>
+ <entry>(string)</entry>
+ <entry>The C symbol; may be used for methods and interfaces</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
</sect1>
-
<sect1 id="message-bus">
<title>Message Bus Specification</title>
<sect2 id="message-bus-overview">
diff --git a/doc/introspect.dtd b/doc/introspect.dtd
index 5e1c96df..fd6aa472 100644
--- a/doc/introspect.dtd
+++ b/doc/introspect.dtd
@@ -4,32 +4,33 @@
<!-- see D-BUS specification for documentation -->
-<!ELEMENT node (interface,node)>
+<!ELEMENT node (interface*,node*)>
<!ATTLIST node name CDATA #REQUIRED>
-<!ELEMENT interface (method,signal,property)>
+<!ELEMENT interface (annotation*,method*,signal*,property*)>
<!ATTLIST interface name CDATA #REQUIRED>
-<!ATTLIST interface deprecated CDATA "no">
+<!ELEMENT method (annotation*,arg*)>
<!ATTLIST method name CDATA #REQUIRED>
-<!ATTLIST method deprecated #IMPLIED>
<!ELEMENT arg EMPTY>
-<!ATTLIST arg name CDATA #REQUIRED>
+<!ATTLIST arg name CDATA #IMPLIED>
<!ATTLIST arg type CDATA #REQUIRED>
<!-- Method arguments SHOULD include "direction",
while signal and error arguments SHOULD not (since there's no point).
The DTD format can't express that subtlety. -->
-<!ATTLIST arg direction "in|out" #IMPLIED>
+<!ATTLIST arg direction (in|out) "in">
-<!ELEMENT signal (arg)>
+<!ELEMENT signal (arg,annotation)>
<!ATTLIST signal name CDATA #REQUIRED>
-<!ATTLIST signal deprecated #IMPLIED>
-<!ELEMENT property> <!-- AKA "attribute" -->
+<!ELEMENT property (annotation)> <!-- AKA "attribute" -->
<!ATTLIST property name CDATA #REQUIRED>
<!ATTLIST property type CDATA #REQUIRED>
-<!ATTLIST property access "read|write|readwrite" #REQUIRED>
-<!ATTLIST property deprecated #IMPLIED>
+<!ATTLIST property access (read|write|readwrite) #REQUIRED>
+
+<!ELEMENT annotation EMPTY> <!-- Generic metadata -->
+<!ATTLIST annotation name CDATA #REQUIRED>
+<!ATTLIST annotation value CDATA #REQUIRED>
diff --git a/glib/dbus-binding-tool-glib.c b/glib/dbus-binding-tool-glib.c
index 98c13341..4ead51a3 100644
--- a/glib/dbus-binding-tool-glib.c
+++ b/glib/dbus-binding-tool-glib.c
@@ -201,7 +201,7 @@ gather_marshallers (BaseInfo *base, DBusBindingToolCData *data, GError **error)
const char *interface_c_name;
interface = (InterfaceInfo *) base;
- interface_c_name = interface_info_get_binding_name (interface, "C");
+ interface_c_name = interface_info_get_annotation (interface, DBUS_GLIB_ANNOTATION_C_SYMBOL);
if (interface_c_name == NULL)
{
return TRUE;
@@ -217,7 +217,7 @@ gather_marshallers (BaseInfo *base, DBusBindingToolCData *data, GError **error)
char *marshaller_name;
method = (MethodInfo *) tmp->data;
- if (method_info_get_binding_name (method, "C") == NULL)
+ if (method_info_get_annotation (method, DBUS_GLIB_ANNOTATION_C_SYMBOL) == NULL)
{
continue;
}
@@ -306,7 +306,7 @@ generate_glue (BaseInfo *base, DBusBindingToolCData *data, GError **error)
channel = data->channel;
interface = (InterfaceInfo *) base;
- interface_c_name = interface_info_get_binding_name (interface, "C");
+ interface_c_name = interface_info_get_annotation (interface, DBUS_GLIB_ANNOTATION_C_SYMBOL);
if (interface_c_name == NULL)
{
return TRUE;
@@ -319,7 +319,7 @@ generate_glue (BaseInfo *base, DBusBindingToolCData *data, GError **error)
/* Table of marshalled methods. */
- if (!write_printf_to_iochannel ("static const DBusGMethodInfo dbus_glib_%s_methods[] = {\n", channel, error, interface_info_get_binding_name (interface, "C")))
+ if (!write_printf_to_iochannel ("static const DBusGMethodInfo dbus_glib_%s_methods[] = {\n", channel, error, interface_info_get_annotation (interface, DBUS_GLIB_ANNOTATION_C_SYMBOL)))
goto io_lose;
for (tmp = methods; tmp != NULL; tmp = g_slist_next (tmp))
{
@@ -329,7 +329,7 @@ generate_glue (BaseInfo *base, DBusBindingToolCData *data, GError **error)
GSList *args;
method = (MethodInfo *) tmp->data;
- method_c_name = method_info_get_binding_name (method, "C");
+ method_c_name = method_info_get_annotation (method, DBUS_GLIB_ANNOTATION_C_SYMBOL);
if (method_c_name == NULL)
{
continue;
diff --git a/glib/dbus-binding-tool-glib.h b/glib/dbus-binding-tool-glib.h
index d4589bc9..6667438a 100644
--- a/glib/dbus-binding-tool-glib.h
+++ b/glib/dbus-binding-tool-glib.h
@@ -25,6 +25,8 @@
G_BEGIN_DECLS
+#define DBUS_GLIB_ANNOTATION_C_SYMBOL "org.freedesktop.DBus.GLib.CSymbol"
+
gboolean dbus_binding_tool_output_glib_client (BaseInfo *info, GIOChannel *channel, GError **error);
gboolean dbus_binding_tool_output_glib_server (BaseInfo *info, GIOChannel *channel, GError **error);
diff --git a/glib/dbus-gidl.c b/glib/dbus-gidl.c
index 554e18c3..fb9573e5 100644
--- a/glib/dbus-gidl.c
+++ b/glib/dbus-gidl.c
@@ -43,7 +43,7 @@ struct NodeInfo
struct InterfaceInfo
{
BaseInfo base;
- GHashTable *bindings;
+ GHashTable *annotations;
/* Since we have BaseInfo now these could be one list */
GSList *methods;
GSList *signals;
@@ -53,7 +53,7 @@ struct InterfaceInfo
struct MethodInfo
{
BaseInfo base;
- GHashTable *bindings;
+ GHashTable *annotations;
GSList *args;
};
@@ -345,9 +345,9 @@ interface_info_new (const char *name)
info->base.refcount = 1;
info->base.name = g_strdup (name);
info->base.type = INFO_TYPE_INTERFACE;
- info->bindings = g_hash_table_new_full (g_str_hash, g_str_equal,
- (GDestroyNotify) g_free,
- (GDestroyNotify) g_free);
+ info->annotations = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) g_free);
return info;
}
@@ -366,7 +366,7 @@ interface_info_unref (InterfaceInfo *info)
info->base.refcount -= 1;
if (info->base.refcount == 0)
{
- g_hash_table_destroy (info->bindings);
+ g_hash_table_destroy (info->annotations);
free_method_list (&info->methods);
free_signal_list (&info->signals);
free_property_list (&info->properties);
@@ -381,16 +381,16 @@ interface_info_get_name (InterfaceInfo *info)
}
GSList *
-interface_info_get_binding_names (InterfaceInfo *info)
+interface_info_get_annotations (InterfaceInfo *info)
{
- return get_hash_keys (info->bindings);
+ return get_hash_keys (info->annotations);
}
const char*
-interface_info_get_binding_name (InterfaceInfo *info,
- const char *binding_type)
+interface_info_get_annotation (InterfaceInfo *info,
+ const char *name)
{
- return g_hash_table_lookup (info->bindings, binding_type);
+ return g_hash_table_lookup (info->annotations, name);
}
GSList*
@@ -412,13 +412,13 @@ interface_info_get_properties (InterfaceInfo *info)
}
void
-interface_info_set_binding_name (InterfaceInfo *info,
- const char *binding_type,
- const char *bound_name)
+interface_info_add_annotation (InterfaceInfo *info,
+ const char *name,
+ const char *value)
{
- g_hash_table_insert (info->bindings,
- g_strdup (binding_type),
- g_strdup (bound_name));
+ g_hash_table_insert (info->annotations,
+ g_strdup (name),
+ g_strdup (value));
}
void
@@ -470,7 +470,7 @@ method_info_new (const char *name)
info->base.refcount = 1;
info->base.name = g_strdup (name);
info->base.type = INFO_TYPE_METHOD;
- info->bindings = g_hash_table_new_full (g_str_hash, g_str_equal,
+ info->annotations = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify) g_free,
(GDestroyNotify) g_free);
@@ -491,7 +491,7 @@ method_info_unref (MethodInfo *info)
info->base.refcount -= 1;
if (info->base.refcount == 0)
{
- g_hash_table_destroy (info->bindings);
+ g_hash_table_destroy (info->annotations);
free_arg_list (&info->args);
base_info_free (info);
}
@@ -504,16 +504,16 @@ method_info_get_name (MethodInfo *info)
}
GSList *
-method_info_get_binding_names (MethodInfo *info)
+method_info_get_annotations (MethodInfo *info)
{
- return get_hash_keys (info->bindings);
+ return get_hash_keys (info->annotations);
}
const char*
-method_info_get_binding_name (MethodInfo *info,
- const char *binding_type)
+method_info_get_annotation (MethodInfo *info,
+ const char *name)
{
- return g_hash_table_lookup (info->bindings, binding_type);
+ return g_hash_table_lookup (info->annotations, name);
}
GSList*
@@ -544,13 +544,13 @@ args_sort_by_direction (const void *a,
}
void
-method_info_set_binding_name (MethodInfo *info,
- const char *binding_type,
- const char *bound_name)
+method_info_add_annotation (MethodInfo *info,
+ const char *name,
+ const char *value)
{
- g_hash_table_insert (info->bindings,
- g_strdup (binding_type),
- g_strdup (bound_name));
+ g_hash_table_insert (info->annotations,
+ g_strdup (name),
+ g_strdup (value));
}
void
diff --git a/glib/dbus-gidl.h b/glib/dbus-gidl.h
index 917432ee..539c731f 100644
--- a/glib/dbus-gidl.h
+++ b/glib/dbus-gidl.h
@@ -90,15 +90,15 @@ InterfaceInfo* interface_info_new (const char *name);
InterfaceInfo* interface_info_ref (InterfaceInfo *info);
void interface_info_unref (InterfaceInfo *info);
const char* interface_info_get_name (InterfaceInfo *info);
-GSList* interface_info_get_binding_names(InterfaceInfo *info);
-const char* interface_info_get_binding_name(InterfaceInfo*info,
- const char *binding_type);
+GSList* interface_info_get_annotations(InterfaceInfo *info);
+const char* interface_info_get_annotation (InterfaceInfo*info,
+ const char *annotation);
GSList* interface_info_get_methods (InterfaceInfo *info);
GSList* interface_info_get_signals (InterfaceInfo *info);
GSList* interface_info_get_properties (InterfaceInfo *info);
-void interface_info_set_binding_name(InterfaceInfo *info,
- const char *name,
- const char *value);
+void interface_info_add_annotation (InterfaceInfo *info,
+ const char *name,
+ const char *value);
void interface_info_add_method (InterfaceInfo *info,
MethodInfo *method);
void interface_info_add_signal (InterfaceInfo *info,
@@ -109,12 +109,12 @@ MethodInfo* method_info_new (const char *name);
MethodInfo* method_info_ref (MethodInfo *info);
void method_info_unref (MethodInfo *info);
const char* method_info_get_name (MethodInfo *info);
-GSList* method_info_get_binding_names (MethodInfo *info);
-const char* method_info_get_binding_name (MethodInfo *info,
- const char *binding_type);
-void method_info_set_binding_name (MethodInfo *info,
- const char *binding_type,
- const char *bound_name);
+GSList* method_info_get_annotations (MethodInfo *info);
+const char* method_info_get_annotation (MethodInfo *info,
+ const char *annotation);
+void method_info_add_annotation (MethodInfo *info,
+ const char *name,
+ const char *value);
GSList* method_info_get_args (MethodInfo *info);
void method_info_add_arg (MethodInfo *info,
ArgInfo *arg);
diff --git a/glib/dbus-glib-tool.c b/glib/dbus-glib-tool.c
index 022055e6..1359ba53 100644
--- a/glib/dbus-glib-tool.c
+++ b/glib/dbus-glib-tool.c
@@ -107,22 +107,22 @@ pretty_print (BaseInfo *base,
case INFO_TYPE_INTERFACE:
{
InterfaceInfo *i = (InterfaceInfo*) base;
- GSList *binding_types, *elt;
+ GSList *annotations, *elt;
g_assert (name != NULL);
printf (_("interface \"%s\" {\n"), name);
- binding_types = interface_info_get_binding_names (i);
- for (elt = binding_types; elt; elt = elt->next)
+ annotations = interface_info_get_annotations (i);
+ for (elt = annotations; elt; elt = elt->next)
{
- const char *binding_type = elt->data;
- const char *binding_name = interface_info_get_binding_name (i, binding_type);
+ const char *name = elt->data;
+ const char *value = interface_info_get_annotation (i, name);
printf (_(" (binding \"%s\": \"%s\") "),
- binding_type, binding_name);
+ name, value);
}
- g_slist_free (binding_types);
+ g_slist_free (annotations);
pretty_print_list (interface_info_get_methods (i), depth + 1);
pretty_print_list (interface_info_get_signals (i), depth + 1);
@@ -135,21 +135,21 @@ pretty_print (BaseInfo *base,
case INFO_TYPE_METHOD:
{
MethodInfo *m = (MethodInfo*) base;
- GSList *binding_types, *elt;
+ GSList *annotations, *elt;
g_assert (name != NULL);
- binding_types = method_info_get_binding_names (m);
+ annotations = method_info_get_annotations (m);
printf (_("method \"%s\""), name);
- for (elt = binding_types; elt; elt = elt->next)
+ for (elt = annotations; elt; elt = elt->next)
{
- const char *binding_type = elt->data;
- const char *binding_name = method_info_get_binding_name (m, binding_type);
+ const char *name = elt->data;
+ const char *value = method_info_get_annotation (m, name);
- printf (_(" (binding \"%s\": \"%s\") "),
- binding_type, binding_name);
+ printf (_(" (annotation \"%s\": \"%s\") "),
+ name, value);
}
- g_slist_free (binding_types);
+ g_slist_free (annotations);
pretty_print_list (method_info_get_args (m), depth + 1);
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;
diff --git a/test/glib/test-service-glib.xml b/test/glib/test-service-glib.xml
index 223bf67f..298e2ddb 100644
--- a/test/glib/test-service-glib.xml
+++ b/test/glib/test-service-glib.xml
@@ -2,25 +2,31 @@
<node name="/org/freedesktop/DBus/Tests/MyTestObject">
- <interface name="org.freedesktop.DBus.Tests.MyObject" c_name="my_object">
+ <interface name="org.freedesktop.DBus.Tests.MyObject">
+ <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="my_object"/>
- <method name="DoNothing" c_name="my_object_do_nothing">
+ <method name="DoNothing">
+ <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="my_object_do_nothing"/>
</method>
- <method name="Increment" c_name="my_object_increment">
+ <method name="Increment">
+ <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="my_object_increment"/>
<arg type="uint32" name="x" />
<arg type="uint32" direction="out" />
</method>
- <method name="ThrowError" c_name="my_object_throw_error">
+ <method name="ThrowError">
+ <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="my_object_throw_error"/>
</method>
- <method name="Uppercase" c_name="my_object_uppercase">
+ <method name="Uppercase">
+ <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="my_object_uppercase"/>
<arg type="string" direction="in" />
<arg type="string" direction="out" />
</method>
- <method name="ManyArgs" c_name="my_object_many_args">
+ <method name="ManyArgs">
+ <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="my_object_many_args"/>
<arg type="uint32" name="x" direction="in" />
<arg type="string" name="str" direction="in" />
<arg type="double" name="trouble" direction="in" />