glib/gio/tests/test-codegen.xml
David Zeuthen 6bccc46d15 gdbus-codegen: Don't send out PropertiesChanged if value ends up not changing
A fairly typical pattern is to have code that does

 foo_set_bar (object, "");
 if (some_condition)
   {
     foo_set_bar (object, "yes");
   }

where some_condition is often true every time @object is updated.

With this code, bar is essentially always "yes" but because of how
gdbus-codegen works, useless PropertiesChanged events got scheduled
and sent out. With this patch, we avoid that by always keeping the
original value around and comparing it only when we deem it's time to
send out the ::PropertiesChanged signal (typically in an idle but can
be forced by the user via flush()).

Also add a test case for this.

Signed-off-by: David Zeuthen <davidz@redhat.com>
2011-04-15 15:53:28 -04:00

442 lines
15 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="in" type="ao" name="array_of_objpaths" />
<arg direction="in" type="ag" name="array_of_signatures" />
<arg direction="in" type="aay" name="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"/>
<!-- 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>
<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>
<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>
</node>