glib/gio/tests/test-codegen.xml
Will Thompson 4aba03562b gdbus-codegen: emit GUnixFDLists if an arg has type 'h'
Previously, if a method was not annotated with org.gtk.GDBus.C.UnixFD
then the generated code would never contain GUnixFDList parameters, even
if the method has 'h' (file descriptor) parameters. However, in this
case, the generated code is essentially useless: the method cannot be
called or handled except in degenerate cases where the file descriptors
are missing or ignored.

Check the argument types for 'h', and if present, generate code as if
org.gtk.GDBus.C.UnixFD annotation were specified.

This change will break any existing code which refers to the (useless)
wrappers for such methods. The workaround for such code is to add the
org.gtk.GDBus.C.UnixFD annotation, which will cause the same generated
code to be emitted before and after this change.

If this is found to cause widespread problems, we can explore a
different approach (perhaps emitting a warning from the code generator,
or annotating the symbols as deprecated).

https://gitlab.gnome.org/GNOME/glib/issues/1726
2019-09-02 20:47:20 +01:00

500 lines
17 KiB
XML

<node>
<!-- Fully Loaded Interface -->
<interface name="org.project.Bar">
<annotation name="org.gtk.GDBus.DocString" value="The org.project.Bar interface is very complicated."/>
<annotation name="org.gtk.GDBus.DocString.Short" value="Brief interface doc string"/>
<method name="HelloWorld">
<annotation name="org.gtk.GDBus.DocString" value="Method &lt;emphasis&gt;documentation&lt;/emphasis&gt; blablablabla."/>
<annotation name="ExistingAnnotation" value="blah"/>
<annotation name="org.gtk.GDBus.ExistingInternalAnnotation" value="booh"/>
<arg name="greeting" direction="in" type="s">
<annotation name="org.gtk.GDBus.DocString" value="in param doc"/>
</arg>
<arg name="response" direction="out" type="s">
<annotation name="org.gtk.GDBus.DocString" value="out param doc"/>
</arg>
</method>
<method name="TestPrimitiveTypes">
<arg direction="in" type="y" name="val_byte" />
<arg direction="in" type="b" name="val_boolean" />
<arg direction="in" type="n" name="val_int16" />
<arg direction="in" type="q" name="val_uint16" />
<arg direction="in" type="i" name="val_int32" />
<arg direction="in" type="u" name="val_uint32" />
<arg direction="in" type="x" name="val_int64" />
<arg direction="in" type="t" name="val_uint64" />
<arg direction="in" type="d" name="val_double" />
<arg direction="in" type="s" name="val_string" />
<arg direction="in" type="o" name="val_objpath" />
<arg direction="in" type="g" name="val_signature" />
<arg direction="in" type="ay" name="val_bytestring" />
<arg direction="out" type="y" name="ret_byte" />
<arg direction="out" type="b" name="ret_boolean" />
<arg direction="out" type="n" name="ret_int16" />
<arg direction="out" type="q" name="ret_uint16" />
<arg direction="out" type="i" name="ret_int32" />
<arg direction="out" type="u" name="ret_uint32" />
<arg direction="out" type="x" name="ret_int64" />
<arg direction="out" type="t" name="ret_uint64" />
<arg direction="out" type="d" name="ret_double" />
<arg direction="out" type="s" name="ret_string" />
<arg direction="out" type="o" name="ret_objpath" />
<arg direction="out" type="g" name="ret_signature" />
<arg direction="out" type="ay" name="ret_bytestring" />
</method>
<method name="TestNonPrimitiveTypes">
<arg direction="in" type="a{ss}" name="dict_s_to_s" />
<arg direction="in" type="a{s(ii)}" name="dict_s_to_pairs" />
<arg direction="in" type="(iss)" name="a_struct" />
<arg direction="in" type="as" name="array_of_strings" />
<arg direction="out" type="as" name="ret_array_of_strings" />
<arg direction="in" type="ao" name="array_of_objpaths" />
<arg direction="out" type="ao" name="ret_array_of_objpaths" />
<arg direction="in" type="ag" name="array_of_signatures" />
<arg direction="out" type="ag" name="ret_array_of_signatures" />
<arg direction="in" type="aay" name="array_of_bytestrings" />
<arg direction="out" type="aay" name="ret_array_of_bytestrings" />
<arg direction="out" type="ay" name="result" />
</method>
<method name="RequestSignalEmission">
<arg direction="in" type="i" name="which_one" />
</method>
<method name="RequestMultiPropertyMods"/>
<method name="UnimplementedMethod"/>
<method name="PropertyCancellation"/>
<signal name="TestSignal">
<annotation name="org.gtk.GDBus.DocString" value="Signal documentation."/>
<arg type="i" name="val_int32">
<annotation name="org.gtk.GDBus.DocString" value="Signal param docs"/>
</arg>
<arg type="as" name="array_of_strings" />
<arg type="aay" name="array_of_bytestrings" />
<arg type="a{s(ii)}" name="dict_s_to_pairs" />
</signal>
<signal name="AnotherSignal">
<arg type="s" name="word" />
</signal>
<property name="y" type="y" access="readwrite">
<annotation name="org.gtk.GDBus.DocString" value="&lt;para&gt;Property docs, yah...&lt;/para&gt;&lt;para&gt;Second paragraph.&lt;/para&gt;"/>
</property>
<property name="b" type="b" access="readwrite"/>
<property name="n" type="n" access="readwrite"/>
<property name="q" type="q" access="readwrite"/>
<property name="i" type="i" access="readwrite"/>
<property name="u" type="u" access="readwrite"/>
<property name="x" type="x" access="readwrite"/>
<property name="t" type="t" access="readwrite"/>
<property name="d" type="d" access="readwrite"/>
<property name="s" type="s" access="readwrite"/>
<property name="o" type="o" access="readwrite"/>
<property name="g" type="g" access="readwrite"/>
<property name="ay" type="ay" access="readwrite"/>
<property name="as" type="as" access="readwrite"/>
<property name="aay" type="aay" access="readwrite"/>
<property name="ao" type="ao" access="readwrite"/>
<property name="ag" type="ag" access="readwrite"/>
<property name="FinallyNormalName" type="s" access="readwrite"/>
<property name="ReadonlyProperty" type="s" access="read"/>
<property name="WriteonlyProperty" type="s" access="write"/>
<property name="quiet" type="s" access="readwrite">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
</property>
<property name="quiet_too" type="s" access="readwrite">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<!-- unset properties -->
<property name="unset_i" type="i" access="readwrite"/>
<property name="unset_d" type="d" access="readwrite"/>
<property name="unset_s" type="s" access="readwrite"/>
<property name="unset_o" type="o" access="readwrite"/>
<property name="unset_g" type="g" access="readwrite"/>
<property name="unset_ay" type="ay" access="readwrite"/>
<property name="unset_as" type="as" access="readwrite"/>
<property name="unset_ao" type="ao" access="readwrite"/>
<property name="unset_ag" type="ag" access="readwrite"/>
<property name="unset_struct" type="(idsogayasaoag)" access="readwrite"/>
</interface> <!-- End org.project.Bar -->
<!-- Namespaced -->
<interface name="org.project.Bar.Frobnicator">
<method name="RandomMethod"/>
</interface>
<!-- Empty -->
<interface name="org.project.Baz">
</interface>
<!-- Outside D-Bus prefix -->
<interface name="com.acme.Coyote">
<method name="Run"/>
<method name="Sleep"/>
<method name="Attack"/>
<signal name="Surprised"/>
<property name="Mood" type="s" access="read"/>
</interface>
<!-- force various names -->
<interface name="com.acme.Rocket">
<!-- Forcing the typename via an annotation -->
<annotation name="org.gtk.GDBus.C.Name" value="Rocket123"/>
<!-- ditto method -->
<method name="Ignite">
<annotation name="org.gtk.GDBus.C.Name" value="ignite_xyz"/>
</method>
<!-- ditto signal -->
<signal name="Exploded">
<annotation name="org.gtk.GDBus.C.Name" value="exploded-xyz"/>
</signal>
<!-- ditto property -->
<property name="Speed" type="d" access="read">
<annotation name="org.gtk.GDBus.C.Name" value="speed-xyz"/>
</property>
<property name="Direction" type="(ddd)" access="read"/>
<!-- Check there's no conflict with the GType iface_name_get_type() function -->
<property name="Type" type="s" access="read"/>
</interface>
<!-- Test interface for forcing use of GVariant -->
<interface name="org.project.Bat">
<!-- Forcing GVariant for types that would be mapped -->
<method name="ForceMethod">
<arg name="force_in_i" type="i" direction="in">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_in_s" type="s" direction="in">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_in_ay" type="ay" direction="in">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_in_struct" type="(i)" direction="in">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_out_i" type="i" direction="out">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_out_s" type="s" direction="out">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_out_ay" type="ay" direction="out">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_out_struct" type="(i)" direction="out">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
</method>
<signal name="ForceSignal">
<arg name="force_i" type="i">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_s" type="s">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_ay" type="ay">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
<arg name="force_struct" type="(i)">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg>
</signal>
<property name="force_i" type="i" access="readwrite">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
<property name="force_s" type="s" access="readwrite">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
<property name="force_ay" type="ay" access="readwrite">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
<property name="force_struct" type="(i)" access="readwrite">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</property>
</interface> <!-- End org.project.Bat -->
<!-- Test interface for g-authorized-method -->
<interface name="org.project.Authorize">
<method name="CheckNotAuthorized"/>
<method name="CheckAuthorized"/>
<method name="CheckNotAuthorizedFromObject"/>
</interface> <!-- End org.project.Authorize -->
<!-- Test interfaces for handling methods in a thread -->
<interface name="org.project.MethodThreads">
<method name="GetSelf">
<arg name="self_pointer" direction="out" type="s"/>
</method>
</interface> <!-- End org.project.MethodThreads -->
<!--
org.project.InlineDocs:
@short_description: The short description
Here is the <emphasis>longer</emphasis> description.
With lots of stuff.
-->
<interface name="org.project.InlineDocs">
<!--
FooMethod:
@greeting: The docs for greeting parameter.
@response: The docs for response parameter.
The docs for the actual method.
Multi-paragraph.
Test of inline links: The #org.project.Bar D-Bus interface,
org.project.Bar.HelloWorld() method, the
#org.project.Bar::TestSignal, the
#org.project.InlineDocs:Property3 property.
-->
<method name="FooMethod">
<arg name="greeting" direction="in" type="s"/>
<arg name="response" direction="out" type="s"/>
</method>
<!-- Method2: foo -->
<method name="Method2">
<arg name="greeting" direction="in" type="s"/>
<arg name="response" direction="out" type="s"/>
</method>
<!--
BarSignal:
@blah: The docs for blah parameter.
@boo: The docs for boo parameter.
The docs for the actual signal.
-->
<signal name="BarSignal">
<!-- Non-Doc comment -->
<arg name="blah" type="s"/>
<arg name="boo" type="s"/>
</signal>
<!-- BazProperty: The docs for the property. -->
<property name="BazProperty" type="s" access="read"/>
<!-- Property2: Another property
This should be a new paragraph.
-->
<property name="Property2" type="s" access="read"/>
<!-- Property3:
First line.
This should NOT be a new paragraph.
-->
<property name="Property3" type="s" access="read"/>
<!-- Property4:
First line. With trailing whitespace.
Second line (same paragraph).
-->
<property name="Property4" type="s" access="read"/>
<!-- Property5: Foo
First line (second paragraph). With trailing whitespace.
Second line (same paragraph).
<programlisting>
1 program listing
2 should include indented space
3
4
5
</programlisting>
-->
<property name="Property5" type="s" access="read"/>
<!--
FancyProperty:
Here's some fancy use of XML inside the comment.
<variablelist>
<varlistentry>
<term><option>namespace</option></term>
<listitem>
<para>The namespace to use for generated code. In CamelCase format.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>output-prefix</option></term>
<listitem>
<para>
A prefix to use for all generated files. Defaults to <filename>generated</filename>.
</para>
</listitem>
</varlistentry>
</variablelist>
-->
<property name="FancyProperty" type="s" access="read"/>
</interface>
<interface name="ChangingInterfaceV1">
<method name="FooMethod"/>
<method name="BarMethod"/>
<method name="BazMethod"/>
<signal name="FooSignal"/>
<signal name="BarSignal"/>
<signal name="BazSignal"/>
</interface>
<!-- ChangingInterfaceV2:
-->
<interface name="ChangingInterfaceV2">
<!--
NewSignalIn2:
@since: 2.0
-->
<signal name="NewSignalIn2"/>
<!--
NewMethodIn2:
@since: 2.0
-->
<method name="NewMethodIn2"/>
<!-- reverse order -->
<signal name="BazSignal"/>
<signal name="BarSignal"/>
<signal name="FooSignal"/>
<method name="BazMethod"/>
<method name="BarMethod"/>
<method name="FooMethod"/>
</interface>
<!-- ChangingInterfaceV10:
-->
<interface name="ChangingInterfaceV10">
<!--
AddedSignalIn10:
@since: 10.0
-->
<signal name="AddedSignalIn10"/>
<method name="AddedMethodIn10">
<annotation name="org.gtk.GDBus.Since" value="10.0"/>
</method>
<!--
NewSignalIn2:
@since: 2.0
-->
<signal name="NewSignalIn2"/>
<!--
NewMethodIn2:
@since: 2.0
-->
<method name="NewMethodIn2"/>
<!-- reverse order -->
<signal name="BazSignal"/>
<signal name="BarSignal"/>
<signal name="FooSignal"/>
<method name="BazMethod"/>
<method name="BarMethod"/>
<method name="FooMethod"/>
</interface>
<interface name="TestUglyCaseInterface">
<annotation name="org.gtk.GDBus.C.Name" value="TesT_ugly_CASE_Interface"/>
<method name="GetiSCSIServers">
<annotation name="org.gtk.GDBus.C.Name" value="Get_iSCSI_Servers"/>
</method>
<signal name="serversUPDATEDNOW">
<annotation name="org.gtk.GDBus.C.Name" value="Servers_UPDATED_NOW"/>
</signal>
<property name="UGLYNAME" type="i" access="readwrite">
<annotation name="org.gtk.GDBus.C.Name" value="UGLY_NAME"/>
</property>
</interface>
<!--
OldieInterface:
@short_description: A an example of an deprecated interface
This is an example of a deprecated interface.
-->
<interface name="OldieInterface">
<annotation name="org.freedesktop.DBus.Deprecated" value="true"/>
<method name="Foo">
<annotation name="org.freedesktop.DBus.Deprecated" value="true"/>
</method>
<signal name="Bar">
<annotation name="org.freedesktop.DBus.Deprecated" value="true"/>
</signal>
<property name="Bat" type="i" access="readwrite">
<annotation name="org.freedesktop.DBus.Deprecated" value="true"/>
</property>
</interface>
<!-- ensure we don't choke on unknown/unexpected XML tags or unknown/unexpected attribyutes (#650874) -->
<interface name="UnknownXmlTags" unexpected="boo">
<someUnknownTag>
<anotherTagWeIgnore>yadaydaydaydayda</anotherTagWeIgnore>
</someUnknownTag>
<method name="CanSetTimezone" also_unexpected="1">
<annotation name="org.freedesktop.DBus.GLib.Async" value="" also_unexpected="1">
<unknownTag/>
</annotation>
<arg name="value" direction="out" type="i" also_unexpected="1">
<unknownTag/>
</arg>
<unknownTag/>
</method>
<signal name="SomeSignal" also_unexpected="1">
<unknownTag/>
</signal>
<property name="SomeProperty" type="s" access="readwrite" also_unexpected="1">
<unknownTag/>
</property>
</interface>
<unknownTag/>
<interface name="FDPassing">
<method name="HelloFD">
<annotation name="org.gtk.GDBus.C.UnixFD" value="1"/>
<arg name="greeting" direction="in" type="s"/>
<arg name="response" direction="out" type="s"/>
</method>
<method name="NoAnnotation">
<arg name="greeting" direction="in" type="h"/>
<arg name="greeting_locale" direction="in" type="s"/>
<arg name="response" direction="out" type="h"/>
<arg name="response_locale" direction="out" type="s"/>
</method>
<method name="NoAnnotationNested">
<arg name="files" type="a{sh}" direction="in"/>
</method>
</interface>
<interface name="Naming">
<property name="Type" type="i" access="readwrite"/>
</interface>
</node>