File: //usr/share/gtk-doc/html/gio/ch35s05.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Generating code and docs: GIO Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="index.html" title="GIO Reference Manual">
<link rel="up" href="ch35.html" title="Migrating to GDBus">
<link rel="prev" href="ch35s04.html" title="Creating proxies for well-known names">
<link rel="next" href="gdbus-org.gtk.GDBus.Example.ObjectManager.Animal.html" title="org.gtk.GDBus.Example.ObjectManager.Animal">
<meta name="generator" content="GTK-Doc V1.33.1 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
<td width="100%" align="left" class="shortcuts"></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch35.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="ch35s04.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="gdbus-org.gtk.GDBus.Example.ObjectManager.Animal.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="id-1.5.5.6"></a>Generating code and docs</h2></div></div></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="gdbus-example-gdbus-codegen"></a>Using gdbus-codegen</h3></div></div></div>
<p>
dbus-glib comes with <span class="command"><strong>dbus-binding-tool</strong></span>, which
can produce somewhat nice client- and server-side wrappers for a D-Bus interface.
With GDBus, <span class="command"><strong>gdbus-codegen</strong></span> is used and like
its counterpart, it also takes D-Bus Introspection XML as input:
</p>
<div class="example">
<a name="gdbus-example-codegen-input"></a><p class="title"><b>Example 2. Example D-Bus Introspection XML</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78</pre></td>
<td class="listing_code"><pre class="programlisting"><span class="o"><</span><span class="n">node</span><span class="o">></span>
<span class="o"><!--</span> <span class="n">org</span><span class="p">.</span><span class="n">gtk</span><span class="p">.</span><span class="n">GDBus</span><span class="p">.</span><span class="n">Example</span><span class="p">.</span><span class="n">ObjectManager</span><span class="p">.</span><span class="nl">Animal</span><span class="p">:</span>
<span class="err">@</span><span class="nl">short_description</span><span class="p">:</span> <span class="n">Example</span> <span class="n">docs</span> <span class="n">generated</span> <span class="n">by</span> <span class="n">gdbus</span><span class="o">-</span><span class="n">codegen</span>
<span class="err">@</span><span class="nl">since</span><span class="p">:</span> <span class="mf">2.30</span>
<span class="n">This</span> <span class="n">D</span><span class="o">-</span><span class="n">Bus</span> <span class="n">interface</span> <span class="n">is</span> <span class="n">used</span> <span class="n">to</span> <span class="n">describe</span> <span class="n">a</span> <span class="n">simple</span> <span class="n">animal</span><span class="p">.</span>
<span class="o">--></span>
<span class="o"><</span><span class="n">interface</span> <span class="n">name</span><span class="o">=</span><span class="s">"org.gtk.GDBus.Example.ObjectManager.Animal"</span><span class="o">></span>
<span class="o"><!--</span> <span class="nl">Mood</span><span class="p">:</span> <span class="n">The</span> <span class="n">mood</span> <span class="n">of</span> <span class="n">the</span> <span class="n">animal</span><span class="p">.</span>
<span class="err">@</span><span class="nl">since</span><span class="p">:</span> <span class="mf">2.30</span>
<span class="n">Known</span> <span class="n">values</span> <span class="k">for</span> <span class="n">this</span> <span class="n">property</span> <span class="n">include</span>
<span class="o"><</span><span class="n">literal</span><span class="o">></span><span class="n">Happy</span><span class="o"></</span><span class="n">literal</span><span class="o">></span> <span class="n">and</span> <span class="o"><</span><span class="n">literal</span><span class="o">></span><span class="n">Sad</span><span class="o"></</span><span class="n">literal</span><span class="o">></span><span class="p">.</span> <span class="n">Use</span> <span class="n">the</span>
<span class="n">org</span><span class="p">.</span><span class="n">gtk</span><span class="p">.</span><span class="n">GDBus</span><span class="p">.</span><span class="n">Example</span><span class="p">.</span><span class="n">ObjectManager</span><span class="p">.</span><span class="n">Animal</span><span class="p">.</span><span class="n">Poke</span><span class="p">()</span> <span class="n">method</span> <span class="n">to</span>
<span class="n">change</span> <span class="n">this</span> <span class="n">property</span><span class="p">.</span>
<span class="n">This</span> <span class="n">property</span> <span class="n">influences</span> <span class="n">how</span> <span class="n">often</span> <span class="n">the</span> <span class="n">animal</span> <span class="n">jumps</span> <span class="n">up</span> <span class="n">and</span>
<span class="n">down</span><span class="p">,</span> <span class="n">see</span> <span class="n">the</span>
<span class="cp">#org.gtk.GDBus.Example.ObjectManager.Animal::Jumped signal</span>
<span class="k">for</span> <span class="n">more</span> <span class="n">details</span><span class="p">.</span>
<span class="o">--></span>
<span class="o"><</span><span class="n">property</span> <span class="n">name</span><span class="o">=</span><span class="s">"Mood"</span> <span class="n">type</span><span class="o">=</span><span class="s">"s"</span> <span class="n">access</span><span class="o">=</span><span class="s">"read"</span><span class="o">/></span>
<span class="o"><!--</span>
<span class="nl">Poke</span><span class="p">:</span>
<span class="err">@</span><span class="nl">make_sad</span><span class="p">:</span> <span class="n">Whether</span> <span class="n">to</span> <span class="n">make</span> <span class="n">the</span> <span class="n">animal</span> <span class="n">sad</span><span class="p">.</span>
<span class="err">@</span><span class="nl">make_happy</span><span class="p">:</span> <span class="n">Whether</span> <span class="n">to</span> <span class="n">make</span> <span class="n">the</span> <span class="n">animal</span> <span class="n">happy</span><span class="p">.</span>
<span class="err">@</span><span class="nl">since</span><span class="p">:</span> <span class="mf">2.30</span>
<span class="n">Method</span> <span class="n">used</span> <span class="n">to</span> <span class="n">changing</span> <span class="n">the</span> <span class="n">mood</span> <span class="n">of</span> <span class="n">the</span> <span class="n">animal</span><span class="p">.</span> <span class="n">See</span> <span class="n">also</span> <span class="n">the</span>
<span class="cp">#org.gtk.GDBus.Example.ObjectManager.Animal:Mood property.</span>
<span class="o">--></span>
<span class="o"><</span><span class="n">method</span> <span class="n">name</span><span class="o">=</span><span class="s">"Poke"</span><span class="o">></span>
<span class="o"><</span><span class="n">arg</span> <span class="n">direction</span><span class="o">=</span><span class="s">"in"</span> <span class="n">type</span><span class="o">=</span><span class="s">"b"</span> <span class="n">name</span><span class="o">=</span><span class="s">"make_sad"</span><span class="o">/></span>
<span class="o"><</span><span class="n">arg</span> <span class="n">direction</span><span class="o">=</span><span class="s">"in"</span> <span class="n">type</span><span class="o">=</span><span class="s">"b"</span> <span class="n">name</span><span class="o">=</span><span class="s">"make_happy"</span><span class="o">/></span>
<span class="o"></</span><span class="n">method</span><span class="o">></span>
<span class="o"><!--</span>
<span class="nl">Jumped</span><span class="p">:</span>
<span class="err">@</span><span class="nl">height</span><span class="p">:</span> <span class="n">Height</span><span class="p">,</span> <span class="n">in</span> <span class="n">meters</span><span class="p">,</span> <span class="n">that</span> <span class="n">the</span> <span class="n">animal</span> <span class="n">jumped</span><span class="p">.</span>
<span class="err">@</span><span class="nl">since</span><span class="p">:</span> <span class="mf">2.30</span>
<span class="n">Emitted</span> <span class="n">when</span> <span class="n">the</span> <span class="n">animal</span> <span class="n">decides</span> <span class="n">to</span> <span class="n">jump</span><span class="p">.</span>
<span class="o">--></span>
<span class="o"><</span><span class="n">signal</span> <span class="n">name</span><span class="o">=</span><span class="s">"Jumped"</span><span class="o">></span>
<span class="o"><</span><span class="n">arg</span> <span class="n">type</span><span class="o">=</span><span class="s">"d"</span> <span class="n">name</span><span class="o">=</span><span class="s">"height"</span><span class="o">/></span>
<span class="o"></</span><span class="n">signal</span><span class="o">></span>
<span class="o"><!--</span>
<span class="nl">Foo</span><span class="p">:</span>
<span class="n">Property</span> <span class="n">with</span> <span class="n">no</span> <span class="o"><</span><span class="n">quote</span><span class="o">></span><span class="n">since</span><span class="o"></</span><span class="n">quote</span><span class="o">></span> <span class="n">annotation</span> <span class="p">(</span><span class="n">should</span> <span class="n">inherit</span> <span class="n">the</span> <span class="mf">2.30</span> <span class="n">from</span> <span class="n">its</span> <span class="n">containing</span> <span class="n">interface</span><span class="p">).</span>
<span class="o">--></span>
<span class="o"><</span><span class="n">property</span> <span class="n">name</span><span class="o">=</span><span class="s">"Foo"</span> <span class="n">type</span><span class="o">=</span><span class="s">"s"</span> <span class="n">access</span><span class="o">=</span><span class="s">"read"</span><span class="o">/></span>
<span class="o"><!--</span>
<span class="nl">Bar</span><span class="p">:</span>
<span class="err">@</span><span class="nl">since</span><span class="p">:</span> <span class="mf">2.36</span>
<span class="n">Property</span> <span class="n">with</span> <span class="n">a</span> <span class="n">later</span> <span class="o"><</span><span class="n">quote</span><span class="o">></span><span class="n">since</span><span class="o"></</span><span class="n">quote</span><span class="o">></span> <span class="n">annotation</span><span class="p">.</span>
<span class="o">--></span>
<span class="o"><</span><span class="n">property</span> <span class="n">name</span><span class="o">=</span><span class="s">"Bar"</span> <span class="n">type</span><span class="o">=</span><span class="s">"s"</span> <span class="n">access</span><span class="o">=</span><span class="s">"read"</span><span class="o">/></span>
<span class="o"></</span><span class="n">interface</span><span class="o">></span>
<span class="o"><!--</span> <span class="n">org</span><span class="p">.</span><span class="n">gtk</span><span class="p">.</span><span class="n">GDBus</span><span class="p">.</span><span class="n">Example</span><span class="p">.</span><span class="n">ObjectManager</span><span class="p">.</span><span class="nl">Cat</span><span class="p">:</span>
<span class="err">@</span><span class="nl">short_description</span><span class="p">:</span> <span class="n">More</span> <span class="n">example</span> <span class="n">docs</span> <span class="n">generated</span> <span class="n">by</span> <span class="n">gdbus</span><span class="o">-</span><span class="n">codegen</span>
<span class="n">This</span> <span class="n">D</span><span class="o">-</span><span class="n">Bus</span> <span class="n">interface</span> <span class="n">is</span> <span class="n">used</span> <span class="n">to</span> <span class="n">describe</span> <span class="n">a</span> <span class="n">cat</span><span class="p">.</span> <span class="n">Right</span> <span class="n">now</span> <span class="n">there</span>
<span class="n">are</span> <span class="n">no</span> <span class="n">properties</span><span class="p">,</span> <span class="n">methods</span> <span class="n">or</span> <span class="n">signals</span> <span class="n">associated</span> <span class="n">with</span> <span class="n">this</span>
<span class="n">interface</span> <span class="n">so</span> <span class="n">it</span> <span class="n">is</span> <span class="n">essentially</span> <span class="n">a</span> <span class="o"><</span><span class="n">ulink</span>
<span class="n">url</span><span class="o">=</span><span class="s">"http://en.wikipedia.org/wiki/Marker_interface_pattern"</span><span class="o">></span><span class="n">Marker</span>
<span class="n">Interface</span><span class="o"></</span><span class="n">ulink</span><span class="o">></span><span class="p">.</span>
<span class="n">Note</span> <span class="n">that</span> <span class="n">D</span><span class="o">-</span><span class="n">Bus</span> <span class="n">objects</span> <span class="n">implementing</span> <span class="n">this</span> <span class="n">interface</span> <span class="n">also</span>
<span class="n">implement</span> <span class="n">the</span> <span class="err">#</span><span class="n">org</span><span class="p">.</span><span class="n">gtk</span><span class="p">.</span><span class="n">GDBus</span><span class="p">.</span><span class="n">Example</span><span class="p">.</span><span class="n">ObjectManager</span><span class="p">.</span><span class="n">Animal</span>
<span class="n">interface</span><span class="p">.</span>
<span class="o">--></span>
<span class="o"><</span><span class="n">interface</span> <span class="n">name</span><span class="o">=</span><span class="s">"org.gtk.GDBus.Example.ObjectManager.Cat"</span><span class="o">></span>
<span class="o"></</span><span class="n">interface</span><span class="o">></span>
<span class="o"></</span><span class="n">node</span><span class="o">></span></pre></td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="example-break"><p>
If this XML is processed like this
</p>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1
2
3
4
5
6</pre></td>
<td class="listing_code"><pre class="programlisting"><span class="n">gdbus</span><span class="o">-</span><span class="n">codegen</span> <span class="o">--</span><span class="n">interface</span><span class="o">-</span><span class="n">prefix</span> <span class="n">org</span><span class="p">.</span><span class="n">gtk</span><span class="p">.</span><span class="n">GDBus</span><span class="p">.</span><span class="n">Example</span><span class="p">.</span><span class="n">ObjectManager</span><span class="p">.</span> \
<span class="o">--</span><span class="n">generate</span><span class="o">-</span><span class="n">c</span><span class="o">-</span><span class="n">code</span> <span class="n">generated</span><span class="o">-</span><span class="n">code</span> \
<span class="o">--</span><span class="n">c</span><span class="o">-</span><span class="n">namespace</span> <span class="n">Example</span> \
<span class="o">--</span><span class="n">c</span><span class="o">-</span><span class="n">generate</span><span class="o">-</span><span class="n">object</span><span class="o">-</span><span class="n">manager</span> \
<span class="o">--</span><span class="n">generate</span><span class="o">-</span><span class="n">docbook</span> <span class="n">generated</span><span class="o">-</span><span class="n">docs</span> \
<span class="n">gdbus</span><span class="o">-</span><span class="n">example</span><span class="o">-</span><span class="n">objectmanager</span><span class="p">.</span><span class="n">xml</span></pre></td>
</tr>
</tbody>
</table>
</div>
<p>
then two files <code class="filename">generated-code.h</code> and
<code class="filename">generated-code.c</code> are
generated. Additionally, two XML files
<code class="filename">generated-docs-org.gtk.GDBus.Example.ObjectManager.Animal</code> and
<code class="filename">generated-docs-org.gtk.GDBus.Example.ObjectManager.Cat</code>
with Docbook XML are generated. For an example of what the docs look
like see <a class="link" href="gdbus-org.gtk.GDBus.Example.ObjectManager.Animal.html#gdbus-interface-org-gtk-GDBus-Example-ObjectManager-Animal" title="Description">the Animal D-Bus interface documentation</a>.
and
<a class="link" href="gdbus-org.gtk.GDBus.Example.ObjectManager.Cat.html#gdbus-interface-org-gtk-GDBus-Example-ObjectManager-Cat" title="Description">the Cat D-Bus interface documentation</a>.
</p>
<p>
While the contents of <code class="filename">generated-code.h</code> and
<code class="filename">generated-code.c</code> are best described by the
<span class="command"><strong>gdbus-codegen</strong></span> manual
page, brief examples of how this generated code can be used can be found in
<a class="xref" href="ch35s05.html#gdbus-example-codegen-server" title="Example 3. Server-side application using generated code">Example 3, “Server-side application using generated code”</a>
and <a class="xref" href="ch35s05.html#gdbus-example-codegen-client" title="Example 4. Client-side application using generated code">Example 4, “Client-side application using generated code”</a>. Additionally, since
the generated code has 100% gtk-doc coverage, see
<a class="link" href="ExampleAnimal.html" title="ExampleAnimal"><span class="type">ExampleAnimal</span></a>, <a class="link" href="ExampleCat.html" title="ExampleCat"><span class="type">ExampleCat</span></a>, <a class="link" href="ExampleObject.html" title="ExampleObject"><span class="type">ExampleObject</span></a> and
<a class="link" href="ExampleObjectManagerClient.html" title="ExampleObjectManagerClient"><span class="type">ExampleObjectManagerClient</span></a> pages for documentation.
</p>
<div class="example">
<a name="gdbus-example-codegen-server"></a><p class="title"><b>Example 3. Server-side application using generated code</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159</pre></td>
<td class="listing_code"><pre class="programlisting"><span class="cp">#include</span> <span class="cpf">"gdbus-object-manager-example/objectmanager-gen.h"</span><span class="cp"></span>
<span class="cm">/* ---------------------------------------------------------------------------------------------------- */</span>
<span class="k">static</span> <span class="n">GDBusObjectManagerServer</span> <span class="o">*</span><span class="n">manager</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="k">static</span> <span class="n">gboolean</span>
<span class="nf">on_animal_poke</span> <span class="p">(</span><span class="n">ExampleAnimal</span> <span class="o">*</span><span class="n">animal</span><span class="p">,</span>
<span class="n">GDBusMethodInvocation</span> <span class="o">*</span><span class="n">invocation</span><span class="p">,</span>
<span class="n">gboolean</span> <span class="n">make_sad</span><span class="p">,</span>
<span class="n">gboolean</span> <span class="n">make_happy</span><span class="p">,</span>
<span class="n">gpointer</span> <span class="n">user_data</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">((</span><span class="n">make_sad</span> <span class="o">&&</span> <span class="n">make_happy</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="o">!</span><span class="n">make_sad</span> <span class="o">&&</span> <span class="o">!</span><span class="n">make_happy</span><span class="p">))</span>
<span class="p">{</span>
<span class="n">g_dbus_method_invocation_return_dbus_error</span> <span class="p">(</span><span class="n">invocation</span><span class="p">,</span>
<span class="s">"org.gtk.GDBus.Examples.ObjectManager.Error.Failed"</span><span class="p">,</span>
<span class="s">"Exactly one of make_sad or make_happy must be TRUE"</span><span class="p">);</span>
<span class="k">goto</span> <span class="n">out</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">make_sad</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">g_strcmp0</span> <span class="p">(</span><span class="n">example_animal_get_mood</span> <span class="p">(</span><span class="n">animal</span><span class="p">),</span> <span class="s">"Sad"</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">g_dbus_method_invocation_return_dbus_error</span> <span class="p">(</span><span class="n">invocation</span><span class="p">,</span>
<span class="s">"org.gtk.GDBus.Examples.ObjectManager.Error.SadAnimalIsSad"</span><span class="p">,</span>
<span class="s">"Sad animal is already sad"</span><span class="p">);</span>
<span class="k">goto</span> <span class="n">out</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">example_animal_set_mood</span> <span class="p">(</span><span class="n">animal</span><span class="p">,</span> <span class="s">"Sad"</span><span class="p">);</span>
<span class="n">example_animal_complete_poke</span> <span class="p">(</span><span class="n">animal</span><span class="p">,</span> <span class="n">invocation</span><span class="p">);</span>
<span class="k">goto</span> <span class="n">out</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">make_happy</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">g_strcmp0</span> <span class="p">(</span><span class="n">example_animal_get_mood</span> <span class="p">(</span><span class="n">animal</span><span class="p">),</span> <span class="s">"Happy"</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">g_dbus_method_invocation_return_dbus_error</span> <span class="p">(</span><span class="n">invocation</span><span class="p">,</span>
<span class="s">"org.gtk.GDBus.Examples.ObjectManager.Error.HappyAnimalIsHappy"</span><span class="p">,</span>
<span class="s">"Happy animal is already happy"</span><span class="p">);</span>
<span class="k">goto</span> <span class="n">out</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">example_animal_set_mood</span> <span class="p">(</span><span class="n">animal</span><span class="p">,</span> <span class="s">"Happy"</span><span class="p">);</span>
<span class="n">example_animal_complete_poke</span> <span class="p">(</span><span class="n">animal</span><span class="p">,</span> <span class="n">invocation</span><span class="p">);</span>
<span class="k">goto</span> <span class="n">out</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">g_assert_not_reached</span> <span class="p">();</span>
<span class="nl">out</span><span class="p">:</span>
<span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span> <span class="cm">/* to indicate that the method was handled */</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span>
<span class="nf">on_bus_acquired</span> <span class="p">(</span><span class="n">GDBusConnection</span> <span class="o">*</span><span class="n">connection</span><span class="p">,</span>
<span class="k">const</span> <span class="n">gchar</span> <span class="o">*</span><span class="n">name</span><span class="p">,</span>
<span class="n">gpointer</span> <span class="n">user_data</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">ExampleObjectSkeleton</span> <span class="o">*</span><span class="n">object</span><span class="p">;</span>
<span class="n">guint</span> <span class="n">n</span><span class="p">;</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">"Acquired a message bus connection</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="cm">/* Create a new org.freedesktop.DBus.ObjectManager rooted at /example/Animals */</span>
<span class="n">manager</span> <span class="o">=</span> <span class="n">g_dbus_object_manager_server_new</span> <span class="p">(</span><span class="s">"/example/Animals"</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">n</span> <span class="o"><</span> <span class="mi">10</span><span class="p">;</span> <span class="n">n</span><span class="o">++</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">gchar</span> <span class="o">*</span><span class="n">s</span><span class="p">;</span>
<span class="n">ExampleAnimal</span> <span class="o">*</span><span class="n">animal</span><span class="p">;</span>
<span class="cm">/* Create a new D-Bus object at the path /example/Animals/N where N is 000..009 */</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">g_strdup_printf</span> <span class="p">(</span><span class="s">"/example/Animals/%03d"</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
<span class="n">object</span> <span class="o">=</span> <span class="n">example_object_skeleton_new</span> <span class="p">(</span><span class="n">s</span><span class="p">);</span>
<span class="n">g_free</span> <span class="p">(</span><span class="n">s</span><span class="p">);</span>
<span class="cm">/* Make the newly created object export the interface</span>
<span class="cm"> * org.gtk.GDBus.Example.ObjectManager.Animal (note</span>
<span class="cm"> * that @object takes its own reference to @animal).</span>
<span class="cm"> */</span>
<span class="n">animal</span> <span class="o">=</span> <span class="n">example_animal_skeleton_new</span> <span class="p">();</span>
<span class="n">example_animal_set_mood</span> <span class="p">(</span><span class="n">animal</span><span class="p">,</span> <span class="s">"Happy"</span><span class="p">);</span>
<span class="n">example_object_skeleton_set_animal</span> <span class="p">(</span><span class="n">object</span><span class="p">,</span> <span class="n">animal</span><span class="p">);</span>
<span class="n">g_object_unref</span> <span class="p">(</span><span class="n">animal</span><span class="p">);</span>
<span class="cm">/* Cats are odd animals - so some of our objects implement the</span>
<span class="cm"> * org.gtk.GDBus.Example.ObjectManager.Cat interface in addition</span>
<span class="cm"> * to the .Animal interface</span>
<span class="cm"> */</span>
<span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">ExampleCat</span> <span class="o">*</span><span class="n">cat</span><span class="p">;</span>
<span class="n">cat</span> <span class="o">=</span> <span class="n">example_cat_skeleton_new</span> <span class="p">();</span>
<span class="n">example_object_skeleton_set_cat</span> <span class="p">(</span><span class="n">object</span><span class="p">,</span> <span class="n">cat</span><span class="p">);</span>
<span class="n">g_object_unref</span> <span class="p">(</span><span class="n">cat</span><span class="p">);</span>
<span class="p">}</span>
<span class="cm">/* Handle Poke() D-Bus method invocations on the .Animal interface */</span>
<span class="n">g_signal_connect</span> <span class="p">(</span><span class="n">animal</span><span class="p">,</span>
<span class="s">"handle-poke"</span><span class="p">,</span>
<span class="n">G_CALLBACK</span> <span class="p">(</span><span class="n">on_animal_poke</span><span class="p">),</span>
<span class="nb">NULL</span><span class="p">);</span> <span class="cm">/* user_data */</span>
<span class="cm">/* Export the object (@manager takes its own reference to @object) */</span>
<span class="n">g_dbus_object_manager_server_export</span> <span class="p">(</span><span class="n">manager</span><span class="p">,</span> <span class="n">G_DBUS_OBJECT_SKELETON</span> <span class="p">(</span><span class="n">object</span><span class="p">));</span>
<span class="n">g_object_unref</span> <span class="p">(</span><span class="n">object</span><span class="p">);</span>
<span class="p">}</span>
<span class="cm">/* Export all objects */</span>
<span class="n">g_dbus_object_manager_server_set_connection</span> <span class="p">(</span><span class="n">manager</span><span class="p">,</span> <span class="n">connection</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span>
<span class="nf">on_name_acquired</span> <span class="p">(</span><span class="n">GDBusConnection</span> <span class="o">*</span><span class="n">connection</span><span class="p">,</span>
<span class="k">const</span> <span class="n">gchar</span> <span class="o">*</span><span class="n">name</span><span class="p">,</span>
<span class="n">gpointer</span> <span class="n">user_data</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">"Acquired the name %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">name</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span>
<span class="nf">on_name_lost</span> <span class="p">(</span><span class="n">GDBusConnection</span> <span class="o">*</span><span class="n">connection</span><span class="p">,</span>
<span class="k">const</span> <span class="n">gchar</span> <span class="o">*</span><span class="n">name</span><span class="p">,</span>
<span class="n">gpointer</span> <span class="n">user_data</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">"Lost the name %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">name</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">gint</span>
<span class="nf">main</span> <span class="p">(</span><span class="n">gint</span> <span class="n">argc</span><span class="p">,</span> <span class="n">gchar</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
<span class="n">GMainLoop</span> <span class="o">*</span><span class="n">loop</span><span class="p">;</span>
<span class="n">guint</span> <span class="n">id</span><span class="p">;</span>
<span class="n">loop</span> <span class="o">=</span> <span class="n">g_main_loop_new</span> <span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">);</span>
<span class="n">id</span> <span class="o">=</span> <span class="n">g_bus_own_name</span> <span class="p">(</span><span class="n">G_BUS_TYPE_SESSION</span><span class="p">,</span>
<span class="s">"org.gtk.GDBus.Examples.ObjectManager"</span><span class="p">,</span>
<span class="n">G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT</span> <span class="o">|</span>
<span class="n">G_BUS_NAME_OWNER_FLAGS_REPLACE</span><span class="p">,</span>
<span class="n">on_bus_acquired</span><span class="p">,</span>
<span class="n">on_name_acquired</span><span class="p">,</span>
<span class="n">on_name_lost</span><span class="p">,</span>
<span class="n">loop</span><span class="p">,</span>
<span class="nb">NULL</span><span class="p">);</span>
<span class="n">g_main_loop_run</span> <span class="p">(</span><span class="n">loop</span><span class="p">);</span>
<span class="n">g_bus_unown_name</span> <span class="p">(</span><span class="n">id</span><span class="p">);</span>
<span class="n">g_main_loop_unref</span> <span class="p">(</span><span class="n">loop</span><span class="p">);</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></pre></td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="example-break"><div class="example">
<a name="gdbus-example-codegen-client"></a><p class="title"><b>Example 4. Client-side application using generated code</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167</pre></td>
<td class="listing_code"><pre class="programlisting"><span class="cp">#include</span> <span class="cpf">"gdbus-object-manager-example/objectmanager-gen.h"</span><span class="cp"></span>
<span class="cm">/* ---------------------------------------------------------------------------------------------------- */</span>
<span class="k">static</span> <span class="kt">void</span>
<span class="nf">print_objects</span> <span class="p">(</span><span class="n">GDBusObjectManager</span> <span class="o">*</span><span class="n">manager</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">GList</span> <span class="o">*</span><span class="n">objects</span><span class="p">;</span>
<span class="n">GList</span> <span class="o">*</span><span class="n">l</span><span class="p">;</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">"Object manager at %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">g_dbus_object_manager_get_object_path</span> <span class="p">(</span><span class="n">manager</span><span class="p">));</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">g_dbus_object_manager_get_objects</span> <span class="p">(</span><span class="n">manager</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="n">l</span> <span class="o">=</span> <span class="n">objects</span><span class="p">;</span> <span class="n">l</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="n">l</span> <span class="o">=</span> <span class="n">l</span><span class="o">-></span><span class="n">next</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">ExampleObject</span> <span class="o">*</span><span class="n">object</span> <span class="o">=</span> <span class="n">EXAMPLE_OBJECT</span> <span class="p">(</span><span class="n">l</span><span class="o">-></span><span class="n">data</span><span class="p">);</span>
<span class="n">GList</span> <span class="o">*</span><span class="n">interfaces</span><span class="p">;</span>
<span class="n">GList</span> <span class="o">*</span><span class="n">ll</span><span class="p">;</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">" - Object at %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">g_dbus_object_get_object_path</span> <span class="p">(</span><span class="n">G_DBUS_OBJECT</span> <span class="p">(</span><span class="n">object</span><span class="p">)));</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="n">g_dbus_object_get_interfaces</span> <span class="p">(</span><span class="n">G_DBUS_OBJECT</span> <span class="p">(</span><span class="n">object</span><span class="p">));</span>
<span class="k">for</span> <span class="p">(</span><span class="n">ll</span> <span class="o">=</span> <span class="n">interfaces</span><span class="p">;</span> <span class="n">ll</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="n">ll</span> <span class="o">=</span> <span class="n">ll</span><span class="o">-></span><span class="n">next</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">GDBusInterface</span> <span class="o">*</span><span class="n">interface</span> <span class="o">=</span> <span class="n">G_DBUS_INTERFACE</span> <span class="p">(</span><span class="n">ll</span><span class="o">-></span><span class="n">data</span><span class="p">);</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">" - Interface %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">g_dbus_interface_get_info</span> <span class="p">(</span><span class="n">interface</span><span class="p">)</span><span class="o">-></span><span class="n">name</span><span class="p">);</span>
<span class="cm">/* Note that @interface is really a GDBusProxy instance - and additionally also</span>
<span class="cm"> * an ExampleAnimal or ExampleCat instance - either of these can be used to</span>
<span class="cm"> * invoke methods on the remote object. For example, the generated function</span>
<span class="cm"> *</span>
<span class="cm"> * void example_animal_call_poke_sync (ExampleAnimal *proxy,</span>
<span class="cm"> * gboolean make_sad,</span>
<span class="cm"> * gboolean make_happy,</span>
<span class="cm"> * GCancellable *cancellable,</span>
<span class="cm"> * GError **error);</span>
<span class="cm"> *</span>
<span class="cm"> * can be used to call the Poke() D-Bus method on the .Animal interface.</span>
<span class="cm"> * Additionally, the generated function</span>
<span class="cm"> *</span>
<span class="cm"> * const gchar *example_animal_get_mood (ExampleAnimal *object);</span>
<span class="cm"> *</span>
<span class="cm"> * can be used to get the value of the :Mood property.</span>
<span class="cm"> */</span>
<span class="p">}</span>
<span class="n">g_list_free_full</span> <span class="p">(</span><span class="n">interfaces</span><span class="p">,</span> <span class="n">g_object_unref</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">g_list_free_full</span> <span class="p">(</span><span class="n">objects</span><span class="p">,</span> <span class="n">g_object_unref</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span>
<span class="nf">on_object_added</span> <span class="p">(</span><span class="n">GDBusObjectManager</span> <span class="o">*</span><span class="n">manager</span><span class="p">,</span>
<span class="n">GDBusObject</span> <span class="o">*</span><span class="n">object</span><span class="p">,</span>
<span class="n">gpointer</span> <span class="n">user_data</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">gchar</span> <span class="o">*</span><span class="n">owner</span><span class="p">;</span>
<span class="n">owner</span> <span class="o">=</span> <span class="n">g_dbus_object_manager_client_get_name_owner</span> <span class="p">(</span><span class="n">G_DBUS_OBJECT_MANAGER_CLIENT</span> <span class="p">(</span><span class="n">manager</span><span class="p">));</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">"Added object at %s (owner %s)</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">g_dbus_object_get_object_path</span> <span class="p">(</span><span class="n">object</span><span class="p">),</span> <span class="n">owner</span><span class="p">);</span>
<span class="n">g_free</span> <span class="p">(</span><span class="n">owner</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span>
<span class="nf">on_object_removed</span> <span class="p">(</span><span class="n">GDBusObjectManager</span> <span class="o">*</span><span class="n">manager</span><span class="p">,</span>
<span class="n">GDBusObject</span> <span class="o">*</span><span class="n">object</span><span class="p">,</span>
<span class="n">gpointer</span> <span class="n">user_data</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">gchar</span> <span class="o">*</span><span class="n">owner</span><span class="p">;</span>
<span class="n">owner</span> <span class="o">=</span> <span class="n">g_dbus_object_manager_client_get_name_owner</span> <span class="p">(</span><span class="n">G_DBUS_OBJECT_MANAGER_CLIENT</span> <span class="p">(</span><span class="n">manager</span><span class="p">));</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">"Removed object at %s (owner %s)</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">g_dbus_object_get_object_path</span> <span class="p">(</span><span class="n">object</span><span class="p">),</span> <span class="n">owner</span><span class="p">);</span>
<span class="n">g_free</span> <span class="p">(</span><span class="n">owner</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span>
<span class="nf">on_notify_name_owner</span> <span class="p">(</span><span class="n">GObject</span> <span class="o">*</span><span class="n">object</span><span class="p">,</span>
<span class="n">GParamSpec</span> <span class="o">*</span><span class="n">pspec</span><span class="p">,</span>
<span class="n">gpointer</span> <span class="n">user_data</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">GDBusObjectManagerClient</span> <span class="o">*</span><span class="n">manager</span> <span class="o">=</span> <span class="n">G_DBUS_OBJECT_MANAGER_CLIENT</span> <span class="p">(</span><span class="n">object</span><span class="p">);</span>
<span class="n">gchar</span> <span class="o">*</span><span class="n">name_owner</span><span class="p">;</span>
<span class="n">name_owner</span> <span class="o">=</span> <span class="n">g_dbus_object_manager_client_get_name_owner</span> <span class="p">(</span><span class="n">manager</span><span class="p">);</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">"name-owner: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">name_owner</span><span class="p">);</span>
<span class="n">g_free</span> <span class="p">(</span><span class="n">name_owner</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">static</span> <span class="kt">void</span>
<span class="nf">on_interface_proxy_properties_changed</span> <span class="p">(</span><span class="n">GDBusObjectManagerClient</span> <span class="o">*</span><span class="n">manager</span><span class="p">,</span>
<span class="n">GDBusObjectProxy</span> <span class="o">*</span><span class="n">object_proxy</span><span class="p">,</span>
<span class="n">GDBusProxy</span> <span class="o">*</span><span class="n">interface_proxy</span><span class="p">,</span>
<span class="n">GVariant</span> <span class="o">*</span><span class="n">changed_properties</span><span class="p">,</span>
<span class="k">const</span> <span class="n">gchar</span> <span class="o">*</span><span class="k">const</span> <span class="o">*</span><span class="n">invalidated_properties</span><span class="p">,</span>
<span class="n">gpointer</span> <span class="n">user_data</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">GVariantIter</span> <span class="n">iter</span><span class="p">;</span>
<span class="k">const</span> <span class="n">gchar</span> <span class="o">*</span><span class="n">key</span><span class="p">;</span>
<span class="n">GVariant</span> <span class="o">*</span><span class="n">value</span><span class="p">;</span>
<span class="n">gchar</span> <span class="o">*</span><span class="n">s</span><span class="p">;</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">"Properties Changed on %s:</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">g_dbus_object_get_object_path</span> <span class="p">(</span><span class="n">G_DBUS_OBJECT</span> <span class="p">(</span><span class="n">object_proxy</span><span class="p">)));</span>
<span class="n">g_variant_iter_init</span> <span class="p">(</span><span class="o">&</span><span class="n">iter</span><span class="p">,</span> <span class="n">changed_properties</span><span class="p">);</span>
<span class="k">while</span> <span class="p">(</span><span class="n">g_variant_iter_next</span> <span class="p">(</span><span class="o">&</span><span class="n">iter</span><span class="p">,</span> <span class="s">"{&sv}"</span><span class="p">,</span> <span class="o">&</span><span class="n">key</span><span class="p">,</span> <span class="o">&</span><span class="n">value</span><span class="p">))</span>
<span class="p">{</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">g_variant_print</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">TRUE</span><span class="p">);</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">" %s -> %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">s</span><span class="p">);</span>
<span class="n">g_variant_unref</span> <span class="p">(</span><span class="n">value</span><span class="p">);</span>
<span class="n">g_free</span> <span class="p">(</span><span class="n">s</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">gint</span>
<span class="nf">main</span> <span class="p">(</span><span class="n">gint</span> <span class="n">argc</span><span class="p">,</span> <span class="n">gchar</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
<span class="n">GDBusObjectManager</span> <span class="o">*</span><span class="n">manager</span><span class="p">;</span>
<span class="n">GMainLoop</span> <span class="o">*</span><span class="n">loop</span><span class="p">;</span>
<span class="n">GError</span> <span class="o">*</span><span class="n">error</span><span class="p">;</span>
<span class="n">gchar</span> <span class="o">*</span><span class="n">name_owner</span><span class="p">;</span>
<span class="n">manager</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="n">loop</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="n">loop</span> <span class="o">=</span> <span class="n">g_main_loop_new</span> <span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">);</span>
<span class="n">error</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="n">manager</span> <span class="o">=</span> <span class="n">example_object_manager_client_new_for_bus_sync</span> <span class="p">(</span><span class="n">G_BUS_TYPE_SESSION</span><span class="p">,</span>
<span class="n">G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE</span><span class="p">,</span>
<span class="s">"org.gtk.GDBus.Examples.ObjectManager"</span><span class="p">,</span>
<span class="s">"/example/Animals"</span><span class="p">,</span>
<span class="nb">NULL</span><span class="p">,</span> <span class="cm">/* GCancellable */</span>
<span class="o">&</span><span class="n">error</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">manager</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">g_printerr</span> <span class="p">(</span><span class="s">"Error getting object manager client: %s"</span><span class="p">,</span> <span class="n">error</span><span class="o">-></span><span class="n">message</span><span class="p">);</span>
<span class="n">g_error_free</span> <span class="p">(</span><span class="n">error</span><span class="p">);</span>
<span class="k">goto</span> <span class="n">out</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">name_owner</span> <span class="o">=</span> <span class="n">g_dbus_object_manager_client_get_name_owner</span> <span class="p">(</span><span class="n">G_DBUS_OBJECT_MANAGER_CLIENT</span> <span class="p">(</span><span class="n">manager</span><span class="p">));</span>
<span class="n">g_print</span> <span class="p">(</span><span class="s">"name-owner: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">name_owner</span><span class="p">);</span>
<span class="n">g_free</span> <span class="p">(</span><span class="n">name_owner</span><span class="p">);</span>
<span class="n">print_objects</span> <span class="p">(</span><span class="n">manager</span><span class="p">);</span>
<span class="n">g_signal_connect</span> <span class="p">(</span><span class="n">manager</span><span class="p">,</span>
<span class="s">"notify::name-owner"</span><span class="p">,</span>
<span class="n">G_CALLBACK</span> <span class="p">(</span><span class="n">on_notify_name_owner</span><span class="p">),</span>
<span class="nb">NULL</span><span class="p">);</span>
<span class="n">g_signal_connect</span> <span class="p">(</span><span class="n">manager</span><span class="p">,</span>
<span class="s">"object-added"</span><span class="p">,</span>
<span class="n">G_CALLBACK</span> <span class="p">(</span><span class="n">on_object_added</span><span class="p">),</span>
<span class="nb">NULL</span><span class="p">);</span>
<span class="n">g_signal_connect</span> <span class="p">(</span><span class="n">manager</span><span class="p">,</span>
<span class="s">"object-removed"</span><span class="p">,</span>
<span class="n">G_CALLBACK</span> <span class="p">(</span><span class="n">on_object_removed</span><span class="p">),</span>
<span class="nb">NULL</span><span class="p">);</span>
<span class="n">g_signal_connect</span> <span class="p">(</span><span class="n">manager</span><span class="p">,</span>
<span class="s">"interface-proxy-properties-changed"</span><span class="p">,</span>
<span class="n">G_CALLBACK</span> <span class="p">(</span><span class="n">on_interface_proxy_properties_changed</span><span class="p">),</span>
<span class="nb">NULL</span><span class="p">);</span>
<span class="n">g_main_loop_run</span> <span class="p">(</span><span class="n">loop</span><span class="p">);</span>
<span class="nl">out</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="n">manager</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
<span class="n">g_object_unref</span> <span class="p">(</span><span class="n">manager</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">loop</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
<span class="n">g_main_loop_unref</span> <span class="p">(</span><span class="n">loop</span><span class="p">);</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></pre></td>
</tr>
</tbody>
</table>
</div>
</div>
<br class="example-break">
</div>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.33.1</div>
</body>
</html>