<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Macaque &#187; Canonical</title>
	<atom:link href="http://www.themacaque.com/?tag=canonical&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.themacaque.com</link>
	<description>If properly trained monkeys can code</description>
	<lastBuildDate>Mon, 04 Feb 2013 11:00:55 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5</generator>
		<item>
		<title>How to send a {sv} over DBus with Qt</title>
		<link>http://www.themacaque.com/?p=1152&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-send-a-sv-over-dbus-with-qt</link>
		<comments>http://www.themacaque.com/?p=1152#comments</comments>
		<pubDate>Thu, 03 Jan 2013 09:35:15 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[qt]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1152</guid>
		<description><![CDATA[I have recently been doing some work with Qt and DBus and I got stuck a little on how to correctly send a {sv} over DBus. Either my google-fu is terrible or there are not many examples on how to do this, therefore here is a small static method that will return a {sv} that [...]]]></description>
				<content:encoded><![CDATA[<p>I have recently been doing some work with Qt and DBus and I got stuck a little on how to correctly send a {sv} over DBus. Either my google-fu is terrible or there are not many examples on how to do this, therefore here is a small static method that will return a {sv} that can be send via DBus without getting a wrong parameters error:</p>

<div class="wp_syntax"><div class="wp_syntax_download"><div class="wp_syntax_download_filename"><a name="file-dbus_helper.h" href="#file-dbus_helper.h" title="dbus_helper.h">dbus_helper.h</a></div><div class="wp_syntax_download_actions"><a href="http://www.themacaque.com/wp-content/plugins/wp-syntax-download-extension/wp-syntax-download-extension.php/1152/dbus_helper.h">raw</a> <a href="http://www.themacaque.com/wp-content/plugins/wp-syntax-download-extension/wp-syntax-download-extension.php/1152/download/dbus_helper.h">download</a></div></div><table><tr><td class="line_numbers"><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
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"> 
<span style="color: #339900;">#ifndef DBUS_HELPER_H</span>
<span style="color: #339900;">#define DBUS_HELPER_H</span>
 
<span style="color: #339900;">#include </span>
<span style="color: #339900;">#include </span>
<span style="color: #339900;">#include </span>
<span style="color: #339900;">#include </span>
 
<span style="color: #0000ff;">typedef</span> QHash DBusStringHash<span style="color: #008080;">;</span>
<span style="color: #0000ff;">class</span> DBusHelper <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> QObject
<span style="color: #008000;">{</span>
    Q_OBJECT
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> DBUS_STRING_MAP_ID<span style="color: #008080;">;</span>
 
    <span style="color: #0000ff;">explicit</span> DBusHelper<span style="color: #008000;">(</span>QObject <span style="color: #000040;">*</span>parent <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span>
 
    <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span> _init
    <span style="color: #008000;">{</span>
        <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
            _init<span style="color: #008000;">(</span><span style="color: #008000;">)</span>
            <span style="color: #008000;">{</span>
                <span style="color: #666666;">// diff actions to init</span>
                qRegisterMetaType<span style="color: #008000;">(</span><span style="color: #FF0000;">"DBusStringHash"</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span>
                qDBusRegisterMetaType<span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span>
                DBUS_STRING_MAP_ID <span style="color: #000080;">=</span> QMetaType<span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #008000;">(</span><span style="color: #FF0000;">"DBusStringHash"</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">}</span>
    <span style="color: #008000;">}</span> _initializer<span style="color: #008080;">;</span>
 
    <span style="color: #0000ff;">static</span> QVariant getVariant<span style="color: #008000;">(</span>DBusStringHash hash<span style="color: #008000;">)</span><span style="color: #008080;">;</span>
 
<span style="color: #008000;">}</span><span style="color: #008080;">;</span>
 
Q_DECLARE_METATYPE<span style="color: #008000;">(</span>DBusStringHash<span style="color: #008000;">)</span>
<span style="color: #339900;">#endif // DBUS_HELPER_H</span></pre></td></tr></table></div>


<div class="wp_syntax"><div class="wp_syntax_download"><div class="wp_syntax_download_filename"><a name="file-dbus_helper.cpp" href="#file-dbus_helper.cpp" title="dbus_helper.cpp">dbus_helper.cpp</a></div><div class="wp_syntax_download_actions"><a href="http://www.themacaque.com/wp-content/plugins/wp-syntax-download-extension/wp-syntax-download-extension.php/1152/dbus_helper.cpp">raw</a> <a href="http://www.themacaque.com/wp-content/plugins/wp-syntax-download-extension/wp-syntax-download-extension.php/1152/download/dbus_helper.cpp">download</a></div></div><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// required for the init</span>
<span style="color: #0000ff;">int</span> DBusHelper<span style="color: #008080;">::</span><span style="color: #007788;">DBUS_STRING_MAP_ID</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
DBusHelper<span style="color: #008080;">::</span>_init DBusHelper<span style="color: #008080;">::</span>_initializer<span style="color: #008080;">;</span>
 
DBusHelper<span style="color: #008080;">::</span><span style="color: #007788;">DBusHelper</span><span style="color: #008000;">(</span>QObject <span style="color: #000040;">*</span>parent<span style="color: #008000;">)</span> <span style="color: #008080;">:</span>
    QObject<span style="color: #008000;">(</span>parent<span style="color: #008000;">)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">}</span>
 
QVariant DBusHelper<span style="color: #008080;">::</span><span style="color: #007788;">getVariant</span><span style="color: #008000;">(</span>DBusStringHash hash<span style="color: #008000;">)</span>
<span style="color: #008000;">{</span>
    <span style="color: #0000ff;">return</span> QVariant<span style="color: #008000;">(</span>DBUS_STRING_MAP_ID, <span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span>hash<span style="color: #008000;">)</span><span style="color: #008080;">;</span>
<span style="color: #008000;">}</span></pre></td></tr></table></div>

<p>I added the init trick so that there is no need to manually register the types. I hope it helps!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1152</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>libaccounts-glib from golang</title>
		<link>http://www.themacaque.com/?p=1133&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=libaccounts-glib-from-golang</link>
		<comments>http://www.themacaque.com/?p=1133#comments</comments>
		<pubDate>Mon, 08 Oct 2012 17:26:11 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[go]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[libaccounts-glib]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1133</guid>
		<description><![CDATA[Following the small work I&#8217;m doing to get better at golang here is another piece of work I have done to add a golang binding to one of the C libraries I&#8217;m depending on. The following allows to use the libaccounts-glib library from go: 1 2 3 4 5 6 7 8 9 10 11 [...]]]></description>
				<content:encoded><![CDATA[<p>Following the small work I&#8217;m doing to get better at golang here is another piece of work I have done to add a golang binding to one of the C libraries I&#8217;m depending on. The following allows to use the libaccounts-glib library from go:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">package main
&nbsp;
/*
<span style="color: #808080; font-style: italic;">#cgo pkg-config: libaccounts-glib</span>
<span style="color: #808080; font-style: italic;">#include &lt;stdlib.h&gt;</span>
<span style="color: #808080; font-style: italic;">#include &lt;glib.h&gt;</span>
<span style="color: #808080; font-style: italic;">#include &lt;libaccounts-glib/accounts-glib.h&gt;</span>
&nbsp;
static inline char* to_charptr<span style="color: black;">&#40;</span>const gchar* s<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>char*<span style="color: black;">&#41;</span>s<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline char* to_charptr_from_ptr<span style="color: black;">&#40;</span>gpointer s<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>char*<span style="color: black;">&#41;</span>s<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline gchar* to_gcharptr<span style="color: black;">&#40;</span>const char* s<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>gchar*<span style="color: black;">&#41;</span>s<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline AgService* to_AgService<span style="color: black;">&#40;</span>void* o<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>AgService *<span style="color: black;">&#41;</span>o<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline AgAccountService* to_AgAccountService<span style="color: black;">&#40;</span>void* o<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>AgAccountService *<span style="color: black;">&#41;</span>o<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline AgApplication* to_AgApplication<span style="color: black;">&#40;</span>void* o<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>AgApplication *<span style="color: black;">&#41;</span>o<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline AgProvider* to_AgProvider<span style="color: black;">&#40;</span>void* o<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>AgProvider *<span style="color: black;">&#41;</span>o<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline AgServiceType* to_AgServiceType<span style="color: black;">&#40;</span>void* o<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>AgServiceType *<span style="color: black;">&#41;</span>o<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline void free_string<span style="color: black;">&#40;</span>char* s<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> free<span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline AgAccountId to_AgAccountId<span style="color: black;">&#40;</span>guint i<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>AgAccountId<span style="color: black;">&#41;</span> i<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline guint to_guint<span style="color: black;">&#40;</span>gpointer i<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>guint<span style="color: black;">&#41;</span>i<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static GError* to_error<span style="color: black;">&#40;</span>void* err<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>GError*<span style="color: black;">&#41;</span>err<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
extern void go_account_notify_cb<span style="color: black;">&#40;</span>void* func<span style="color: #66cc66;">,</span> AgAccount* acc<span style="color: #66cc66;">,</span> gchar* key<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
static void account_notify_cb<span style="color: black;">&#40;</span>AgAccount* acc<span style="color: #66cc66;">,</span> gchar* key<span style="color: #66cc66;">,</span> gpointer func<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    go_account_notify_cb<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>void*<span style="color: black;">&#41;</span>func<span style="color: #66cc66;">,</span> acc<span style="color: #66cc66;">,</span> key<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: black;">&#125;</span>
&nbsp;
static AgAccountWatch watch_dir<span style="color: black;">&#40;</span>AgAccount* acc<span style="color: #66cc66;">,</span> gchar* key<span style="color: #66cc66;">,</span> void* func<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> ag_account_watch_dir<span style="color: black;">&#40;</span>acc<span style="color: #66cc66;">,</span> key<span style="color: #66cc66;">,</span>
        <span style="color: black;">&#40;</span>AgAccountNotifyCb<span style="color: black;">&#41;</span>account_notify_cb<span style="color: #66cc66;">,</span> func<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: black;">&#125;</span>
&nbsp;
static AgAccountWatch watch_key<span style="color: black;">&#40;</span>AgAccount* acc<span style="color: #66cc66;">,</span> gchar* key<span style="color: #66cc66;">,</span> void* func<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> ag_account_watch_key<span style="color: black;">&#40;</span>acc<span style="color: #66cc66;">,</span> key<span style="color: #66cc66;">,</span>
        <span style="color: black;">&#40;</span>AgAccountNotifyCb<span style="color: black;">&#41;</span>account_notify_cb<span style="color: #66cc66;">,</span> func<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: black;">&#125;</span>
&nbsp;
*/
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #483d8b;">&quot;C&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: black;">&#40;</span>
    <span style="color: #483d8b;">&quot;os&quot;</span>
    <span style="color: #483d8b;">&quot;fmt&quot;</span>
    <span style="color: #483d8b;">&quot;unsafe&quot;</span>
    <span style="color: #483d8b;">&quot;github.com/mattn/go-gtk/gtk&quot;</span>
<span style="color: black;">&#41;</span>
&nbsp;
func GetStringFromGCharPtr<span style="color: black;">&#40;</span>data *C.<span style="color: black;">gchar</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> data <span style="color: #66cc66;">==</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func GetServicesFromList<span style="color: black;">&#40;</span>services *C.<span style="color: black;">GList</span><span style="color: #66cc66;">,</span> length C.<span style="color: black;">guint</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Service<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Service<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        service :<span style="color: #66cc66;">=</span> &amp;Service<span style="color: black;">&#123;</span>serv:C.<span style="color: black;">to_AgService</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> service
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> result
<span style="color: black;">&#125;</span>
&nbsp;
func GetAccountServicesFromList<span style="color: black;">&#40;</span>services *C.<span style="color: black;">GList</span><span style="color: #66cc66;">,</span>
    length C.<span style="color: black;">guint</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*AccountService<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*AccountService<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        service :<span style="color: #66cc66;">=</span> &amp;AccountService<span style="color: black;">&#123;</span>acc:C.<span style="color: black;">to_AgAccountService</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> service
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> result
<span style="color: black;">&#125;</span>
&nbsp;
func GetIdsFromList<span style="color: black;">&#40;</span>ids *C.<span style="color: black;">GList</span><span style="color: #66cc66;">,</span> length C.<span style="color: black;">guint</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>uint32<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>uint32<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>ids<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> uint32<span style="color: black;">&#40;</span>C.<span style="color: black;">to_guint</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">===============================</span> GError <span style="color: #66cc66;">=====================================</span>
&nbsp;
<span style="color: #008000;">type</span> Error <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    GError *C.<span style="color: black;">GError</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>v *Error<span style="color: black;">&#41;</span> Error<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> v.<span style="color: black;">Message</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>v *Error<span style="color: black;">&#41;</span> Message<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>v.<span style="color: black;">GError</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> nil || unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>v.<span style="color: black;">GError</span>.<span style="color: black;">message</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>v.<span style="color: black;">GError</span>.<span style="color: black;">message</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func ErrorFromNative<span style="color: black;">&#40;</span>err unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#41;</span> *Error <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Error<span style="color: black;">&#123;</span>C.<span style="color: black;">to_error</span><span style="color: black;">&#40;</span>err<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">==============================</span> Application <span style="color: #66cc66;">====================================</span>
&nbsp;
<span style="color: #008000;">type</span> Application <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    app *C.<span style="color: black;">AgApplication</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>app *Application<span style="color: black;">&#41;</span> GetDescription <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_application_get_description</span><span style="color: black;">&#40;</span>app.<span style="color: black;">app</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>app *Application<span style="color: black;">&#41;</span> GetName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_application_get_name</span><span style="color: black;">&#40;</span>app.<span style="color: black;">app</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>app *Application<span style="color: black;">&#41;</span> GetServiceUsage <span style="color: black;">&#40;</span>service *Service<span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>
        C.<span style="color: black;">ag_application_get_service_usage</span><span style="color: black;">&#40;</span>app.<span style="color: black;">app</span><span style="color: #66cc66;">,</span> service.<span style="color: black;">serv</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>app *Application<span style="color: black;">&#41;</span> Unref <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">ag_application_unref</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_AgApplication</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>app.<span style="color: black;">app</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">===============================</span> Provider <span style="color: #66cc66;">======================================</span>
&nbsp;
<span style="color: #008000;">type</span> Provider <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    prov *C.<span style="color: black;">AgProvider</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>prov *Provider<span style="color: black;">&#41;</span> GetDisplayName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_provider_get_display_name</span><span style="color: black;">&#40;</span>prov.<span style="color: black;">prov</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>prov *Provider<span style="color: black;">&#41;</span> GetDescription <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_provider_get_description</span><span style="color: black;">&#40;</span>prov.<span style="color: black;">prov</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>prov *Provider<span style="color: black;">&#41;</span> GetName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_provider_get_name</span><span style="color: black;">&#40;</span>prov.<span style="color: black;">prov</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>prov *Provider<span style="color: black;">&#41;</span> Unref <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">ag_provider_unref</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_AgProvider</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>prov.<span style="color: black;">prov</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">================================</span> Manager <span style="color: #66cc66;">======================================</span>
&nbsp;
<span style="color: #008000;">type</span> Manager <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    man *C.<span style="color: black;">AgManager</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> CreateAccount <span style="color: black;">&#40;</span>provider_name <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> *Account <span style="color: black;">&#123;</span>
    provider_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>provider_name<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>provider_str<span style="color: black;">&#41;</span>
&nbsp;
    acc :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_create_account</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>provider_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Account<span style="color: black;">&#123;</span>acc:acc<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> GetAccount <span style="color: black;">&#40;</span><span style="color: #008000;">id</span> uint32<span style="color: black;">&#41;</span> *Account <span style="color: black;">&#123;</span>
    acc :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_get_account</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_AgAccountId</span><span style="color: black;">&#40;</span>C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Account<span style="color: black;">&#123;</span>acc:acc<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> GetAccountServices <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*AccountService<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    services :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_get_account_services</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> GetAccountServicesFromList<span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> GetApplication <span style="color: black;">&#40;</span>app_name <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> *Application <span style="color: black;">&#123;</span>
    app_name_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>app_name<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>app_name_str<span style="color: black;">&#41;</span>
&nbsp;
    app:<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_get_application</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>app_name_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Application<span style="color: black;">&#123;</span>app:app<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> GetEnabledAccountServices<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*AccountService<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    services :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_get_enabled_account_services</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> GetAccountServicesFromList<span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> GetProvider<span style="color: black;">&#40;</span>provider_name <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> *Provider <span style="color: black;">&#123;</span>
    provider_name_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>provider_name<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>provider_name_str<span style="color: black;">&#41;</span>
&nbsp;
    provider :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_get_provider</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>provider_name_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Provider<span style="color: black;">&#123;</span>prov:provider<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> GetService <span style="color: black;">&#40;</span>service_name <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> *Service <span style="color: black;">&#123;</span>
    service_name_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>service_name<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>service_name_str<span style="color: black;">&#41;</span>
&nbsp;
    service :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_get_service</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>service_name_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Service<span style="color: black;">&#123;</span>serv:service<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> GetServiceType <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_manager_get_service_type</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> List<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>uint32<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    account_ids :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_list</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>account_ids<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>account_ids<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> GetIdsFromList<span style="color: black;">&#40;</span>account_ids<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> ListApplicationsByService <span style="color: black;">&#40;</span>
    service *Service<span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Application<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    apps :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_list_applications_by_service</span><span style="color: black;">&#40;</span>
        man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span> service.<span style="color: black;">serv</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>apps<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>apps<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Application<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>apps<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        app :<span style="color: #66cc66;">=</span> &amp;Application<span style="color: black;">&#123;</span>app:C.<span style="color: black;">to_AgApplication</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> app
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> ListByServiceType<span style="color: black;">&#40;</span>
    service_type <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>uint32<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    service_type_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>service_type<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span>
&nbsp;
    service_ids :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_list_by_service_type</span><span style="color: black;">&#40;</span>
        man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>service_ids<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>service_ids<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> GetIdsFromList<span style="color: black;">&#40;</span>service_ids<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> ListEnabled <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>uint32<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    account_ids :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_list_enabled</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>account_ids<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>account_ids<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> GetIdsFromList<span style="color: black;">&#40;</span>account_ids<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> ListEnabledByServiceType <span style="color: black;">&#40;</span>
    service_type <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>uint32<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    service_type_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>service_type<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span>
&nbsp;
    account_ids :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_list_enabled_by_service_type</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span>
        C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>account_ids<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> GetIdsFromList<span style="color: black;">&#40;</span>account_ids<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> ListProviders <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Provider<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    providers :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_list_providers</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>providers<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>providers<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Provider<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>providers<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        app :<span style="color: #66cc66;">=</span> &amp;Provider<span style="color: black;">&#123;</span>prov:C.<span style="color: black;">to_AgProvider</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> app
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> ListServiceTypes <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*ServiceType<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    services :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_list_service_types</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*ServiceType<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        app :<span style="color: #66cc66;">=</span> &amp;ServiceType<span style="color: black;">&#123;</span>serv_type:C.<span style="color: black;">to_AgServiceType</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> app
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> ListServices <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Service<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    services :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_list_services</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Service<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        app :<span style="color: #66cc66;">=</span> &amp;Service<span style="color: black;">&#123;</span>serv:C.<span style="color: black;">to_AgService</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> app
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> ListServicesByType <span style="color: black;">&#40;</span>
    service_type <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Service<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    service_type_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>service_type<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span>
&nbsp;
    services :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_list_services_by_type</span><span style="color: black;">&#40;</span>
        man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Service<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        app :<span style="color: #66cc66;">=</span> &amp;Service<span style="color: black;">&#123;</span>serv:C.<span style="color: black;">to_AgService</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> app
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> LoadAccount <span style="color: black;">&#40;</span>account_id uint32<span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span>*Account<span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    var gerror *C.<span style="color: black;">GError</span>
&nbsp;
    <span style="color: #008000;">id</span> :<span style="color: #66cc66;">=</span> C.<span style="color: black;">to_AgAccountId</span><span style="color: black;">&#40;</span>C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span>account_id<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    account :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_load_account</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">id</span><span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> nil<span style="color: #66cc66;">,</span> err
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Account<span style="color: black;">&#123;</span>acc:account<span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> LoadServiceType <span style="color: black;">&#40;</span>
    service_type <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> *ServiceType <span style="color: black;">&#123;</span>
&nbsp;
    service_type_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>service_type<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span>
&nbsp;
    stype :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_manager_load_service_type</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: #66cc66;">,</span>
        C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;ServiceType<span style="color: black;">&#123;</span>serv_type:stype<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> Unref <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">g_object_unref</span><span style="color: black;">&#40;</span>C.<span style="color: black;">gpointer</span><span style="color: black;">&#40;</span>man.<span style="color: black;">man</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func NewManager <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Manager <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Manager<span style="color: black;">&#123;</span>man:C.<span style="color: black;">ag_manager_new</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func NewManagerForServiceType <span style="color: black;">&#40;</span>service_type <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> *Manager <span style="color: black;">&#123;</span>
&nbsp;
    service_type_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>service_type<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Manager<span style="color: black;">&#123;</span>man:C.<span style="color: black;">ag_manager_new_for_service_type</span><span style="color: black;">&#40;</span>
        C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">=============================</span> Account Service <span style="color: #66cc66;">=================================</span>
&nbsp;
<span style="color: #008000;">type</span> AccountService <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    acc *C.<span style="color: black;">AgAccountService</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *AccountService<span style="color: black;">&#41;</span> GetAccount <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Account <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Account<span style="color: black;">&#123;</span>C.<span style="color: black;">ag_account_service_get_account</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *AccountService<span style="color: black;">&#41;</span> GetService <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Service <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Service<span style="color: black;">&#123;</span>C.<span style="color: black;">ag_account_service_get_service</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *AccountService<span style="color: black;">&#41;</span> GetEnabled <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> C.<span style="color: black;">ag_account_service_get_enabled</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">================================</span> Service <span style="color: #66cc66;">======================================</span>
&nbsp;
<span style="color: #008000;">type</span> Service <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    serv *C.<span style="color: black;">AgService</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *Service<span style="color: black;">&#41;</span> GetDisplayName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_service_get_display_name</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *Service<span style="color: black;">&#41;</span> GetName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_service_get_name</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *Service<span style="color: black;">&#41;</span> GetDescription <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_service_get_description</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *Service<span style="color: black;">&#41;</span> GetProvider <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_service_get_provider</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *Service<span style="color: black;">&#41;</span> GetServiceType <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_service_get_service_type</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *Service<span style="color: black;">&#41;</span> GetTags <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    tags :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_service_get_tags</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>tags<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>tags<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>tags<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> C.<span style="color: black;">to_charptr_from_ptr</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *Service<span style="color: black;">&#41;</span> HasTag <span style="color: black;">&#40;</span>tag <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    tag_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>tag<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>tag_str<span style="color: black;">&#41;</span>
&nbsp;
    has_tag :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_service_has_tag</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>tag_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> has_tag
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *Service<span style="color: black;">&#41;</span> Unref <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">ag_service_unref</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_AgService</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">==============================</span> ServiceType <span style="color: #66cc66;">====================================</span>
&nbsp;
<span style="color: #008000;">type</span> ServiceType <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    serv_type *C.<span style="color: black;">AgServiceType</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *ServiceType<span style="color: black;">&#41;</span> GetDisplayName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>
        C.<span style="color: black;">ag_service_type_get_display_name</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv_type</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *ServiceType<span style="color: black;">&#41;</span> GetDescription <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>
        C.<span style="color: black;">ag_service_type_get_description</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv_type</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *ServiceType<span style="color: black;">&#41;</span> GetName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_service_type_get_name</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv_type</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *ServiceType<span style="color: black;">&#41;</span> GetTags <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    tags :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_service_get_tags</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv_type</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>tags<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>tags<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>tags<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> C.<span style="color: black;">to_charptr_from_ptr</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *ServiceType<span style="color: black;">&#41;</span> HasTag <span style="color: black;">&#40;</span>tag <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    tag_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>tag<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>tag_str<span style="color: black;">&#41;</span>
&nbsp;
    has_tag :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_service_has_tag</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv_type</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>tag_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> has_tag
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>serv *ServiceType<span style="color: black;">&#41;</span> Unref <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">ag_service_type_unref</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_AgServiceType</span><span style="color: black;">&#40;</span>
        unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>serv.<span style="color: black;">serv_type</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">==============================</span> Account Watch <span style="color: #66cc66;">==================================</span>
&nbsp;
<span style="color: #008000;">type</span> AccountWatch <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    watch *C.<span style="color: black;">AgAccountWatch</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>watch *AccountWatch <span style="color: black;">&#41;</span> Unref <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">g_object_unref</span><span style="color: black;">&#40;</span>C.<span style="color: black;">gpointer</span><span style="color: black;">&#40;</span>watch.<span style="color: black;">watch</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">================================</span> Account <span style="color: #66cc66;">======================================</span>
&nbsp;
<span style="color: #008000;">type</span> AccountAsyncStoreCallback func<span style="color: black;">&#40;</span>acc *Account<span style="color: #66cc66;">,</span> success <span style="color: #008000;">bool</span><span style="color: #66cc66;">,</span> err error<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #008000;">type</span> AccountAsyncWatchDirCallback func<span style="color: black;">&#40;</span>acc *Account<span style="color: #66cc66;">,</span> key <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #008000;">type</span> Account <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    acc *C.<span style="color: black;">AgAccount</span>
<span style="color: black;">&#125;</span>
&nbsp;
//export go_account_notify_cb
func go_account_notify_cb<span style="color: black;">&#40;</span>pcallback unsafe.<span style="color: black;">Pointer</span><span style="color: #66cc66;">,</span> gaccount *C.<span style="color: black;">AgAccount</span><span style="color: #66cc66;">,</span>
    gkey *C.<span style="color: black;">gchar</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    account :<span style="color: #66cc66;">=</span> &amp;Account<span style="color: black;">&#123;</span>acc:gaccount<span style="color: black;">&#125;</span>
    key :<span style="color: #66cc66;">=</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>gkey<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    callback :<span style="color: #66cc66;">=</span> *<span style="color: black;">&#40;</span>*func<span style="color: black;">&#40;</span>*Account<span style="color: #66cc66;">,</span> <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>pcallback<span style="color: black;">&#41;</span>
    callback<span style="color: black;">&#40;</span>account<span style="color: #66cc66;">,</span> key<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> Delete <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">ag_account_delete</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetDisplayName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_account_get_display_name</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetEnabled <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> C.<span style="color: black;">ag_account_get_enabled</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetManager <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Manager <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Manager<span style="color: black;">&#123;</span>man:C.<span style="color: black;">ag_account_get_manager</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetProviderName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> GetStringFromGCharPtr<span style="color: black;">&#40;</span>C.<span style="color: black;">ag_account_get_provider_name</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetSelectedService <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Service <span style="color: black;">&#123;</span>
   <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Service<span style="color: black;">&#123;</span>serv:C.<span style="color: black;">ag_account_get_selected_service</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> ListEnabledServices <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Service<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    services :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_account_list_enabled_services</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> GetServicesFromList<span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> ListServices <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Service<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    services :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_account_list_services</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> GetServicesFromList<span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> ListServicesByType <span style="color: black;">&#40;</span>service_type <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Service<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    service_type_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>service_type<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span>
&nbsp;
    services :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_account_list_services_by_type</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span>
        C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>services<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> GetServicesFromList<span style="color: black;">&#40;</span>services<span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> RemoveWatch <span style="color: black;">&#40;</span>watch *AccountWatch<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">ag_account_remove_watch</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> *watch.<span style="color: black;">watch</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> SelectService <span style="color: black;">&#40;</span>service *Service<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">ag_account_select_service</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> service.<span style="color: black;">serv</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> SetDisplayName <span style="color: black;">&#40;</span>name <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    name_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>name<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>name_str<span style="color: black;">&#41;</span>
    C.<span style="color: black;">ag_account_set_display_name</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>name_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> SetEnabled <span style="color: black;">&#40;</span>enabled <span style="color: #008000;">bool</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> enabled <span style="color: black;">&#123;</span>
        C.<span style="color: black;">ag_account_set_enabled</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">TRUE</span><span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span> <span style="color: #ff7700;font-weight:bold;">else</span> <span style="color: black;">&#123;</span>
        C.<span style="color: black;">ag_account_set_enabled</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">FALSE</span><span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> Sign <span style="color: black;">&#40;</span>key <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">token</span> <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    key_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span>
&nbsp;
    token_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">token</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>token_str<span style="color: black;">&#41;</span>
&nbsp;
    C.<span style="color: black;">ag_account_sign</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>token_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> Store <span style="color: black;">&#40;</span>callback AccountAsyncStoreCallback<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    go func<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
        var gerror *C.<span style="color: black;">GError</span>
        C.<span style="color: black;">ag_account_store_blocking</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            callback<span style="color: black;">&#40;</span>acc<span style="color: #66cc66;">,</span> false<span style="color: #66cc66;">,</span> err<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: black;">&#125;</span>
        callback<span style="color: black;">&#40;</span>acc<span style="color: #66cc66;">,</span> true<span style="color: #66cc66;">,</span> nil<span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> StoreSync <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: #008000;">bool</span><span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    var gerror *C.<span style="color: black;">GError</span>
    C.<span style="color: black;">ag_account_store_blocking</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> false<span style="color: #66cc66;">,</span> err
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> true<span style="color: #66cc66;">,</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> SupportsService <span style="color: black;">&#40;</span>service_type <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    service_type_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>service_type<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span>
&nbsp;
    suported :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_account_supports_service</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span>
        C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>service_type_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> suported <span style="color: #66cc66;">==</span> C.<span style="color: black;">TRUE</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> Verify <span style="color: black;">&#40;</span>key <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: #008000;">bool</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    key_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span>
&nbsp;
    var <span style="color: #dc143c;">token</span> *C.<span style="color: black;">gchar</span>
    verified :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_account_verify</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> &amp;<span style="color: #dc143c;">token</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> verified <span style="color: #66cc66;">==</span> C.<span style="color: black;">TRUE</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">token</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> VerifyWithTokens <span style="color: black;">&#40;</span>key <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> tokens <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    key_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span>
&nbsp;
    tokens_str :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*C.<span style="color: black;">gchar</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>tokens<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>tokens<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        <span style="color: #dc143c;">token</span> :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>tokens<span style="color: black;">&#91;</span>n<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">token</span><span style="color: black;">&#41;</span>
&nbsp;
        tokens_str<span style="color: black;">&#91;</span>n<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">token</span><span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span>
&nbsp;
    verified :<span style="color: #66cc66;">=</span> C.<span style="color: black;">ag_account_verify_with_tokens</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
        &amp;tokens_str<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> verified <span style="color: #66cc66;">==</span> C.<span style="color: black;">TRUE</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> WatchDir <span style="color: black;">&#40;</span>key <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span>
    callback AccountAsyncWatchDirCallback<span style="color: black;">&#41;</span> *AccountWatch <span style="color: black;">&#123;</span>
&nbsp;
    key_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span>
&nbsp;
    watch :<span style="color: #66cc66;">=</span> C.<span style="color: black;">watch_dir</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>&amp;callback<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;AccountWatch<span style="color: black;">&#123;</span>watch:&amp;watch<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> WatchKey <span style="color: black;">&#40;</span>key <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span>
    callback AccountAsyncWatchDirCallback<span style="color: black;">&#41;</span> *AccountWatch <span style="color: black;">&#123;</span>
&nbsp;
    key_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span>
&nbsp;
    watch :<span style="color: #66cc66;">=</span> C.<span style="color: black;">watch_key</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>key_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>&amp;callback<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;AccountWatch<span style="color: black;">&#123;</span>watch:&amp;watch<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> Unref <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">g_object_unref</span><span style="color: black;">&#40;</span>C.<span style="color: black;">gpointer</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">acc</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    fmt.<span style="color: black;">Println</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;test&quot;</span><span style="color: black;">&#41;</span>
    gtk.<span style="color: black;">Init</span><span style="color: black;">&#40;</span>&amp;<span style="color: #dc143c;">os</span>.<span style="color: black;">Args</span><span style="color: black;">&#41;</span>
    go func <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
        manager :<span style="color: #66cc66;">=</span> NewManagerForServiceType<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;microblogging&quot;</span><span style="color: black;">&#41;</span>
        defer manager.<span style="color: black;">Unref</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        services<span style="color: #66cc66;">,</span> length :<span style="color: #66cc66;">=</span> manager.<span style="color: black;">GetAccountServices</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Got %d servicesn&quot;</span><span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> uint<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
            s :<span style="color: #66cc66;">=</span> services<span style="color: black;">&#91;</span>n<span style="color: black;">&#93;</span>.<span style="color: black;">GetService</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Display Name: %sn&quot;</span><span style="color: #66cc66;">,</span> s.<span style="color: black;">GetDisplayName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Name: %sn&quot;</span><span style="color: #66cc66;">,</span> s.<span style="color: black;">GetName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Description: %sn&quot;</span><span style="color: #66cc66;">,</span> s.<span style="color: black;">GetDescription</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Provider: %sn&quot;</span><span style="color: #66cc66;">,</span> s.<span style="color: black;">GetProvider</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: black;">&#125;</span>
        gtk.<span style="color: black;">MainQuit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    gtk.<span style="color: black;">Main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span></pre></td></tr></table></div>

<p>By the way I have fixed a small mem leak I had int he goa bindings by adding the Unref methods so that the glib structures can be freed once you are done with them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1133</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gnome-online-accounts from golang</title>
		<link>http://www.themacaque.com/?p=1126&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gnome-online-accounts-from-golang</link>
		<comments>http://www.themacaque.com/?p=1126#comments</comments>
		<pubDate>Thu, 04 Oct 2012 08:28:48 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[gnome-online-accounts]]></category>
		<category><![CDATA[go]]></category>
		<category><![CDATA[golang]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1126</guid>
		<description><![CDATA[I have been playing a little with golang lately and I have decided to do a small desktop application to try an practice more. Because I wanted to integrate with the gnome-online-accounts API I had to do a small go interface for the API. I leave it here in the wild to see if people [...]]]></description>
				<content:encoded><![CDATA[<p>I have been playing a little with golang lately and I have decided to do a small desktop application to try an practice more. Because I wanted to integrate with the gnome-online-accounts API I had to do a small go interface for the API. I leave it here in the wild to see if people can spot errors with it or find it useful:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">package main
&nbsp;
&nbsp;
/*
<span style="color: #808080; font-style: italic;">#define GOA_API_IS_SUBJECT_TO_CHANGE 1</span>
<span style="color: #808080; font-style: italic;">#cgo pkg-config: goa-1.0</span>
<span style="color: #808080; font-style: italic;">#include &lt;stdlib.h&gt;</span>
<span style="color: #808080; font-style: italic;">#include &lt;glib.h&gt;</span>
<span style="color: #808080; font-style: italic;">#include &lt;gio/gio.h&gt;</span>
<span style="color: #808080; font-style: italic;">#include &lt;goa/goa.h&gt;</span>
&nbsp;
static inline gchar* to_gcharptr<span style="color: black;">&#40;</span>const char* s<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>gchar*<span style="color: black;">&#41;</span>s<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline char* to_charptr<span style="color: black;">&#40;</span>const gchar* s<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>char*<span style="color: black;">&#41;</span>s<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline GObject* to_GObject<span style="color: black;">&#40;</span>void* o<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> G_OBJECT<span style="color: black;">&#40;</span>o<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline GoaObject* to_GoaObject<span style="color: black;">&#40;</span>void* o<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> GOA_OBJECT<span style="color: black;">&#40;</span>o<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static GError* to_error<span style="color: black;">&#40;</span>void* err<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>GError*<span style="color: black;">&#41;</span>err<span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
&nbsp;
static inline void free_string<span style="color: black;">&#40;</span>char* s<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span> free<span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> <span style="color: black;">&#125;</span>
*/
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #483d8b;">&quot;C&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: black;">&#40;</span>
    <span style="color: #483d8b;">&quot;os&quot;</span>
    <span style="color: #483d8b;">&quot;fmt&quot;</span>
    <span style="color: #483d8b;">&quot;errors&quot;</span>
    <span style="color: #483d8b;">&quot;unsafe&quot;</span>
    <span style="color: #483d8b;">&quot;github.com/mattn/go-gtk/glib&quot;</span>
    <span style="color: #483d8b;">&quot;github.com/mattn/go-gtk/gtk&quot;</span>
<span style="color: black;">&#41;</span>
&nbsp;
func InterfaceToVariant <span style="color: black;">&#40;</span>data interface<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span>*C.<span style="color: black;">GVariant</span><span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    switch data.<span style="color: black;">&#40;</span><span style="color: #008000;">type</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
        case <span style="color: #008000;">bool</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> data.<span style="color: black;">&#40;</span><span style="color: #008000;">bool</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_boolean</span><span style="color: black;">&#40;</span>C.<span style="color: black;">TRUE</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
            <span style="color: black;">&#125;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_boolean</span><span style="color: black;">&#40;</span>C.<span style="color: black;">FALSE</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        case byte:
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_byte</span><span style="color: black;">&#40;</span>C.<span style="color: black;">guchar</span><span style="color: black;">&#40;</span>data.<span style="color: black;">&#40;</span>byte<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        case int16:
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_int16</span><span style="color: black;">&#40;</span>C.<span style="color: black;">gint16</span><span style="color: black;">&#40;</span>data.<span style="color: black;">&#40;</span>int16<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        case uint16:
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_uint16</span><span style="color: black;">&#40;</span>C.<span style="color: black;">guint16</span><span style="color: black;">&#40;</span>data.<span style="color: black;">&#40;</span>uint16<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        case int32:
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_int32</span><span style="color: black;">&#40;</span>C.<span style="color: black;">gint32</span><span style="color: black;">&#40;</span>data.<span style="color: black;">&#40;</span>int32<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        case uint32:
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_uint32</span><span style="color: black;">&#40;</span>C.<span style="color: black;">guint32</span><span style="color: black;">&#40;</span>data.<span style="color: black;">&#40;</span>uint32<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        case int64:
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_int64</span><span style="color: black;">&#40;</span>C.<span style="color: black;">gint64</span><span style="color: black;">&#40;</span>data.<span style="color: black;">&#40;</span>int64<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        case uint64:
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_uint64</span><span style="color: black;">&#40;</span>C.<span style="color: black;">guint64</span><span style="color: black;">&#40;</span>data.<span style="color: black;">&#40;</span>uint64<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        case float32:
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_double</span><span style="color: black;">&#40;</span>C.<span style="color: black;">gdouble</span><span style="color: black;">&#40;</span>data.<span style="color: black;">&#40;</span>float32<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        case <span style="color: #dc143c;">string</span>:
            <span style="color: #008000;">str</span> :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>data.<span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">g_variant_new_string</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
        default:
            <span style="color: #ff7700;font-weight:bold;">return</span> nil<span style="color: #66cc66;">,</span> errors.<span style="color: black;">New</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Could not covert interface to gvariant&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil<span style="color: #66cc66;">,</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">===============================</span> GError <span style="color: #66cc66;">=====================================</span>
&nbsp;
<span style="color: #008000;">type</span> Error <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    GError *C.<span style="color: black;">GError</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>v *Error<span style="color: black;">&#41;</span> Error<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> v.<span style="color: black;">Message</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>v *Error<span style="color: black;">&#41;</span> Message<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>v.<span style="color: black;">GError</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> nil || unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>v.<span style="color: black;">GError</span>.<span style="color: black;">message</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>v.<span style="color: black;">GError</span>.<span style="color: black;">message</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func ErrorFromNative<span style="color: black;">&#40;</span>err unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#41;</span> *Error <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Error<span style="color: black;">&#123;</span>C.<span style="color: black;">to_error</span><span style="color: black;">&#40;</span>err<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">=============================</span> Cancelable <span style="color: #66cc66;">===================================</span>
&nbsp;
<span style="color: #008000;">type</span> Cancellable <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    cancellable *C.<span style="color: black;">GCancellable</span>
<span style="color: black;">&#125;</span>
&nbsp;
func NewCancellable <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span>*Cancellable<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Cancellable<span style="color: black;">&#123;</span>cancellable:C.<span style="color: black;">g_cancellable_new</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> IsCancelled<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    result :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_cancellable_is_cancelled</span><span style="color: black;">&#40;</span>can.<span style="color: black;">cancellable</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> result <span style="color: #66cc66;">!=</span> <span style="color: #ff4500;">0</span> <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> true
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> false
<span style="color: black;">&#125;</span>
&nbsp;
// TODO: somehow <span style="color: #ff7700;font-weight:bold;">pass</span> a gerror
//func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> SetErrorIfCancelled <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
//<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> GetFd <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> int32 <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> int32<span style="color: black;">&#40;</span>C.<span style="color: black;">g_cancellable_get_fd</span><span style="color: black;">&#40;</span>can.<span style="color: black;">cancellable</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> MakePollFd <span style="color: black;">&#40;</span>poll *C.<span style="color: black;">GPollFD</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> false
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> ReleaseFd <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">g_cancellable_release_fd</span><span style="color: black;">&#40;</span>can.<span style="color: black;">cancellable</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func GetCurrent <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Cancellable <span style="color: black;">&#123;</span>
    current :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_cancellable_get_current</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Cancellable<span style="color: black;">&#123;</span>cancellable:current<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> PopCurrent <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">g_cancellable_pop_current</span><span style="color: black;">&#40;</span>can.<span style="color: black;">cancellable</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> PushCurrent <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">g_cancellable_push_current</span><span style="color: black;">&#40;</span>can.<span style="color: black;">cancellable</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> Reset <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">g_cancellable_reset</span><span style="color: black;">&#40;</span>can.<span style="color: black;">cancellable</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> Cancel <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    C.<span style="color: black;">g_cancellable_cancel</span><span style="color: black;">&#40;</span>can.<span style="color: black;">cancellable</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// TODO
//func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> Connect <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
//<span style="color: black;">&#125;</span>
&nbsp;
//TODO
//func <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> Disonnect <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
//<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">=================================</span> Manager <span style="color: #66cc66;">===============================</span>
&nbsp;
<span style="color: #008000;">type</span> ManagerAsyncAddAccountCallback func<span style="color: black;">&#40;</span>man *Manager<span style="color: #66cc66;">,</span> object_path <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span>
    err error<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #008000;">type</span> Manager <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    manager *C.<span style="color: black;">GoaManager</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> CallAddAccount <span style="color: black;">&#40;</span>provider <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> identity <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span>
        presentation_identity <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> credentials interface<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span> details interface<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span>
        can *Cancellable<span style="color: #66cc66;">,</span> callback ManagerAsyncAddAccountCallback<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    go func<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
        var cancellable *C.<span style="color: black;">GCancellable</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
        <span style="color: black;">&#125;</span>
&nbsp;
        provider_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>provider<span style="color: black;">&#41;</span>
        defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>provider_str<span style="color: black;">&#41;</span>
&nbsp;
        identity_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>identity<span style="color: black;">&#41;</span>
        defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>identity_str<span style="color: black;">&#41;</span>
&nbsp;
        presentation_identity_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>presentation_identity<span style="color: black;">&#41;</span>
        defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>presentation_identity_str<span style="color: black;">&#41;</span>
&nbsp;
        cred<span style="color: #66cc66;">,</span> err :<span style="color: #66cc66;">=</span> InterfaceToVariant<span style="color: black;">&#40;</span>credentials<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> err <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            callback<span style="color: black;">&#40;</span>man<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> err<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: black;">&#125;</span>
&nbsp;
        det<span style="color: #66cc66;">,</span> err :<span style="color: #66cc66;">=</span> InterfaceToVariant<span style="color: black;">&#40;</span>details<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> err <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            callback<span style="color: black;">&#40;</span>man<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> err<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: black;">&#125;</span>
&nbsp;
        var gerror *C.<span style="color: black;">GError</span>
        var object_path *C.<span style="color: black;">gchar</span>
&nbsp;
        C.<span style="color: black;">goa_manager_call_add_account_sync</span><span style="color: black;">&#40;</span>man.<span style="color: black;">manager</span><span style="color: #66cc66;">,</span>
            C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>provider_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>identity_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
            C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>presentation_identity_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> cred<span style="color: #66cc66;">,</span> det<span style="color: #66cc66;">,</span>
            &amp;object_path<span style="color: #66cc66;">,</span> cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            callback<span style="color: black;">&#40;</span>man<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> err<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: black;">&#125;</span>
        callback<span style="color: black;">&#40;</span>man<span style="color: #66cc66;">,</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>object_path<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil<span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>man *Manager<span style="color: black;">&#41;</span> CallAddAccountSync <span style="color: black;">&#40;</span>provider <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> identity <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span>
        presentation_identity <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> credentials interface<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span> details interface<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span>
        can *Cancellable<span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    var cancellable *C.<span style="color: black;">GCancellable</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
    <span style="color: black;">&#125;</span>
&nbsp;
    provider_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>provider<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>provider_str<span style="color: black;">&#41;</span>
&nbsp;
    identity_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>identity<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>identity_str<span style="color: black;">&#41;</span>
&nbsp;
    presentation_identity_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>presentation_identity<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>presentation_identity_str<span style="color: black;">&#41;</span>
&nbsp;
    cred<span style="color: #66cc66;">,</span> err :<span style="color: #66cc66;">=</span> InterfaceToVariant<span style="color: black;">&#40;</span>credentials<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> err <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> err
    <span style="color: black;">&#125;</span>
&nbsp;
    det<span style="color: #66cc66;">,</span> err :<span style="color: #66cc66;">=</span> InterfaceToVariant<span style="color: black;">&#40;</span>details<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> err <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> err
    <span style="color: black;">&#125;</span>
&nbsp;
    var gerror *C.<span style="color: black;">GError</span>
    var object_path *C.<span style="color: black;">gchar</span>
&nbsp;
    C.<span style="color: black;">goa_manager_call_add_account_sync</span><span style="color: black;">&#40;</span>man.<span style="color: black;">manager</span><span style="color: #66cc66;">,</span>
        C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>provider_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>identity_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
        C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>presentation_identity_str<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> cred<span style="color: #66cc66;">,</span> det<span style="color: #66cc66;">,</span>
        &amp;object_path<span style="color: #66cc66;">,</span> cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> err
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>object_path<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">================================</span> Account <span style="color: #66cc66;">================================</span>
&nbsp;
<span style="color: #008000;">type</span> AccountAsyncEnsureCredentialsCallback func<span style="color: black;">&#40;</span>man *Account<span style="color: #66cc66;">,</span>
    expires_in int32<span style="color: #66cc66;">,</span> err error<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #008000;">type</span> AccountAsyncRemoveCallback func<span style="color: black;">&#40;</span>man *Account<span style="color: #66cc66;">,</span>
    err error<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #008000;">type</span> Account <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    account *C.<span style="color: black;">GoaAccount</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetProviderType <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    provider :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_dup_provider_type</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>provider<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>provider<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetProviderName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    provider :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_dup_provider_name</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>provider<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>provider<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetProviderIcon <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    provider :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_dup_provider_icon</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>provider<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>provider<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetId <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #008000;">id</span> :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_dup_id</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetAttentionNeeded <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    attention_needed :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_get_attention_needed</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> attention_needed
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetIdentity <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    identity :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_dup_identity</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>identity<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>identity<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetPresentationIdentity <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    identity :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_dup_presentation_identity</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>identity<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>identity<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetMailDisabled <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    disabled :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_get_mail_disabled</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> disabled
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetCalendarDisabled <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    disabled :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_get_calendar_disabled</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> disabled
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetContactsDisabled <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    disabled :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_get_contacts_disabled</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> disabled
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetChatDisabled  <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    disabled :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_get_chat_disabled</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> disabled
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> GetDocumentsDisabled <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    disabled :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_account_get_documents_disabled</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> disabled
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> CallEnsureCredentials <span style="color: black;">&#40;</span>can *Cancellable<span style="color: #66cc66;">,</span>
    callback AccountAsyncEnsureCredentialsCallback<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    go func<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
        var cancellable *C.<span style="color: black;">GCancellable</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
        <span style="color: black;">&#125;</span>
        var gerror *C.<span style="color: black;">GError</span>
        var gint C.<span style="color: black;">gint</span>
&nbsp;
        C.<span style="color: black;">goa_account_call_ensure_credentials_sync</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: #66cc66;">,</span> &amp;gint<span style="color: #66cc66;">,</span>
            cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            callback<span style="color: black;">&#40;</span>acc<span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> err<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: black;">&#125;</span>
        callback<span style="color: black;">&#40;</span>acc<span style="color: #66cc66;">,</span> int32<span style="color: black;">&#40;</span>gint<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil<span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> CallSyncEnsureCredentials <span style="color: black;">&#40;</span>
    can *Cancellable<span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span>int32<span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    var cancellable *C.<span style="color: black;">GCancellable</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
    <span style="color: black;">&#125;</span>
    var gerror *C.<span style="color: black;">GError</span>
    var gint C.<span style="color: black;">gint</span>
&nbsp;
    C.<span style="color: black;">goa_account_call_ensure_credentials_sync</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: #66cc66;">,</span> &amp;gint<span style="color: #66cc66;">,</span>
        cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> err
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> int32<span style="color: black;">&#40;</span>gint<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> Remove <span style="color: black;">&#40;</span>can *Cancellable<span style="color: #66cc66;">,</span>
    callback AccountAsyncRemoveCallback<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    go func<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
        var cancellable *C.<span style="color: black;">GCancellable</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
        <span style="color: black;">&#125;</span>
        var gerror *C.<span style="color: black;">GError</span>
        C.<span style="color: black;">goa_account_call_remove_sync</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: #66cc66;">,</span> cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            callback<span style="color: black;">&#40;</span>acc<span style="color: #66cc66;">,</span> err<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: black;">&#125;</span>
        callback<span style="color: black;">&#40;</span>acc<span style="color: #66cc66;">,</span> nil<span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>acc *Account<span style="color: black;">&#41;</span> SyncRemove <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> error <span style="color: black;">&#123;</span>
&nbsp;
    var cancellable *C.<span style="color: black;">GCancellable</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
    <span style="color: black;">&#125;</span>
    var gerror *C.<span style="color: black;">GError</span>
    C.<span style="color: black;">goa_account_call_remove_sync</span><span style="color: black;">&#40;</span>acc.<span style="color: black;">account</span><span style="color: #66cc66;">,</span> cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> err
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">===============================</span> OAuthBased <span style="color: #66cc66;">==============================</span>
&nbsp;
<span style="color: #008000;">type</span> OAuthBasedAsyncGetAccessTokenCallback func<span style="color: black;">&#40;</span>man *OAuthBased<span style="color: #66cc66;">,</span>
    access_token <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> access_token_secret <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> expiration uint32<span style="color: #66cc66;">,</span>
    err error<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #008000;">type</span> OAuthBased <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    auth_base *C.<span style="color: black;">GoaOAuthBased</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>oauth *OAuthBased<span style="color: black;">&#41;</span> GetAccessToken <span style="color: black;">&#40;</span>can *Cancellable<span style="color: #66cc66;">,</span>
    callback OAuthBasedAsyncGetAccessTokenCallback<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    go func<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
        var cancellable *C.<span style="color: black;">GCancellable</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
        <span style="color: black;">&#125;</span>
        var gaccess_token *C.<span style="color: black;">gchar</span>
        var gaccess_token_secret *C.<span style="color: black;">gchar</span>
        var gexpiration C.<span style="color: black;">gint</span>
        var gerror *C.<span style="color: black;">GError</span>
&nbsp;
        C.<span style="color: black;">goa_oauth_based_call_get_access_token_sync</span><span style="color: black;">&#40;</span>oauth.<span style="color: black;">auth_base</span><span style="color: #66cc66;">,</span> &amp;gaccess_token<span style="color: #66cc66;">,</span>
            &amp;gaccess_token_secret<span style="color: #66cc66;">,</span> &amp;gexpiration<span style="color: #66cc66;">,</span> cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            callback<span style="color: black;">&#40;</span>oauth<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> err<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: black;">&#125;</span>
        // get the go <span style="color: #dc143c;">types</span>
&nbsp;
        access_token :<span style="color: #66cc66;">=</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>gaccess_token<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        access_token_secret :<span style="color: #66cc66;">=</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>gaccess_token_secret<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        callback<span style="color: black;">&#40;</span>oauth<span style="color: #66cc66;">,</span> access_token<span style="color: #66cc66;">,</span> access_token_secret<span style="color: #66cc66;">,</span>
            uint32<span style="color: black;">&#40;</span>gexpiration<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil<span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>oauth *OAuthBased<span style="color: black;">&#41;</span> GetAccessTokenSync <span style="color: black;">&#40;</span>
    can *Cancellable<span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> uint32<span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
&nbsp;
    var cancellable *C.<span style="color: black;">GCancellable</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
    <span style="color: black;">&#125;</span>
    var gaccess_token *C.<span style="color: black;">gchar</span>
    var gaccess_token_secret *C.<span style="color: black;">gchar</span>
    var gexpiration C.<span style="color: black;">gint</span>
    var gerror *C.<span style="color: black;">GError</span>
&nbsp;
    C.<span style="color: black;">goa_oauth_based_call_get_access_token_sync</span><span style="color: black;">&#40;</span>oauth.<span style="color: black;">auth_base</span><span style="color: #66cc66;">,</span> &amp;gaccess_token<span style="color: #66cc66;">,</span>
        &amp;gaccess_token_secret<span style="color: #66cc66;">,</span> &amp;gexpiration<span style="color: #66cc66;">,</span> cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> err
    <span style="color: black;">&#125;</span>
    // get the go <span style="color: #dc143c;">types</span>
&nbsp;
    access_token :<span style="color: #66cc66;">=</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>gaccess_token<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    access_token_secret :<span style="color: #66cc66;">=</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>gaccess_token_secret<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> access_token<span style="color: #66cc66;">,</span> access_token_secret<span style="color: #66cc66;">,</span> uint32<span style="color: black;">&#40;</span>gexpiration<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>oauth *OAuthBased<span style="color: black;">&#41;</span> GetConsumerKey <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    consumer_key :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_oauth_based_dup_consumer_key</span><span style="color: black;">&#40;</span>oauth.<span style="color: black;">auth_base</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>consumer_key<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>consumer_key<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>oauth *OAuthBased<span style="color: black;">&#41;</span> GetConsumerSecret <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    consumer_secret :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_oauth_based_dup_consumer_secret</span><span style="color: black;">&#40;</span>oauth.<span style="color: black;">auth_base</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>consumer_secret<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>consumer_secret<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">===============================</span> Auth2Based <span style="color: #66cc66;">===============================</span>
&nbsp;
<span style="color: #008000;">type</span> OAuthBased2AsyncGetAccessTokenCallback func<span style="color: black;">&#40;</span>man *OAuth2Based<span style="color: #66cc66;">,</span>
    access_token <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> expiration uint32<span style="color: #66cc66;">,</span> err error<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #008000;">type</span> OAuth2Based <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    auth_base *C.<span style="color: black;">GoaOAuth2Based</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>oauth *OAuth2Based<span style="color: black;">&#41;</span> GetClientId <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    <span style="color: #008000;">id</span> :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_oauth2_based_dup_client_id</span><span style="color: black;">&#40;</span>oauth.<span style="color: black;">auth_base</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>oauth *OAuth2Based<span style="color: black;">&#41;</span> GetClientSecret <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    secret :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_oauth2_based_dup_client_secret</span><span style="color: black;">&#40;</span>oauth.<span style="color: black;">auth_base</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>secret<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>secret<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>oauth *OAuth2Based<span style="color: black;">&#41;</span> CallGetAccessToken <span style="color: black;">&#40;</span>can *Cancellable<span style="color: #66cc66;">,</span>
    callback OAuthBased2AsyncGetAccessTokenCallback<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    go func<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
        var cancellable *C.<span style="color: black;">GCancellable</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
        <span style="color: black;">&#125;</span>
        var gaccess_token *C.<span style="color: black;">gchar</span>
        var gexpiration C.<span style="color: black;">gint</span>
        var gerror *C.<span style="color: black;">GError</span>
        C.<span style="color: black;">goa_oauth2_based_call_get_access_token_sync</span><span style="color: black;">&#40;</span>oauth.<span style="color: black;">auth_base</span><span style="color: #66cc66;">,</span>
            &amp;gaccess_token<span style="color: #66cc66;">,</span> &amp;gexpiration<span style="color: #66cc66;">,</span> cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            callback<span style="color: black;">&#40;</span>oauth<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> err<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: black;">&#125;</span>
        access_token :<span style="color: #66cc66;">=</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>gaccess_token<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        callback<span style="color: black;">&#40;</span>oauth<span style="color: #66cc66;">,</span> access_token<span style="color: #66cc66;">,</span> uint32<span style="color: black;">&#40;</span>gexpiration<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil<span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>oauth *OAuth2Based<span style="color: black;">&#41;</span> CallGetAccessTokenSync <span style="color: black;">&#40;</span>
    can *Cancellable<span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> uint32<span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
&nbsp;
    var cancellable *C.<span style="color: black;">GCancellable</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
    <span style="color: black;">&#125;</span>
    var gaccess_token *C.<span style="color: black;">gchar</span>
    var gexpiration C.<span style="color: black;">gint</span>
    var gerror *C.<span style="color: black;">GError</span>
    C.<span style="color: black;">goa_oauth2_based_call_get_access_token_sync</span><span style="color: black;">&#40;</span>oauth.<span style="color: black;">auth_base</span><span style="color: #66cc66;">,</span>
        &amp;gaccess_token<span style="color: #66cc66;">,</span> &amp;gexpiration<span style="color: #66cc66;">,</span> cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> err
     <span style="color: black;">&#125;</span>
     access_token :<span style="color: #66cc66;">=</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>gaccess_token<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
     <span style="color: #ff7700;font-weight:bold;">return</span> access_token<span style="color: #66cc66;">,</span> uint32<span style="color: black;">&#40;</span>gexpiration<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">===================================</span> Mail <span style="color: #66cc66;">=================================</span>
&nbsp;
<span style="color: #008000;">type</span> Mail <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    mail *C.<span style="color: black;">GoaMail</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>mail *Mail<span style="color: black;">&#41;</span> GetEmailAdress <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    address :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_mail_dup_email_address</span><span style="color: black;">&#40;</span>mail.<span style="color: black;">mail</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>address<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>address<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>mail *Mail<span style="color: black;">&#41;</span> GetImapHost <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    host :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_mail_dup_imap_host</span><span style="color: black;">&#40;</span>mail.<span style="color: black;">mail</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>host<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>host<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>mail *Mail<span style="color: black;">&#41;</span> GetImapSupported <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> C.<span style="color: black;">goa_mail_get_imap_supported</span><span style="color: black;">&#40;</span>mail.<span style="color: black;">mail</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>mail *Mail<span style="color: black;">&#41;</span> GetImapUseTls <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> C.<span style="color: black;">goa_mail_get_imap_use_tls</span><span style="color: black;">&#40;</span>mail.<span style="color: black;">mail</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>mail *Mail<span style="color: black;">&#41;</span> GetImapUserName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    username :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_mail_dup_imap_user_name</span><span style="color: black;">&#40;</span>mail.<span style="color: black;">mail</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>username<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>username<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>mail *Mail<span style="color: black;">&#41;</span> GetSmtpHost <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    host :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_mail_dup_smtp_host</span><span style="color: black;">&#40;</span>mail.<span style="color: black;">mail</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>host<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>host<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>mail *Mail<span style="color: black;">&#41;</span> GetSmtpSupported <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> C.<span style="color: black;">goa_mail_get_smtp_supported</span><span style="color: black;">&#40;</span>mail.<span style="color: black;">mail</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>mail *Mail<span style="color: black;">&#41;</span> GetSmtpUseTls <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #008000;">bool</span> <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">TRUE</span> <span style="color: #66cc66;">==</span> C.<span style="color: black;">goa_mail_get_smtp_use_tls</span><span style="color: black;">&#40;</span>mail.<span style="color: black;">mail</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>mail *Mail<span style="color: black;">&#41;</span> GetSmtpUserName <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #dc143c;">string</span> <span style="color: black;">&#123;</span>
    username :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_mail_dup_smtp_user_name</span><span style="color: black;">&#40;</span>mail.<span style="color: black;">mail</span><span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>username<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> C.<span style="color: black;">GoString</span><span style="color: black;">&#40;</span>C.<span style="color: black;">to_charptr</span><span style="color: black;">&#40;</span>username<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">==================================</span> Calendar <span style="color: #66cc66;">==============================</span>
&nbsp;
<span style="color: #008000;">type</span> Calendar <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    <span style="color: #dc143c;">calendar</span> *C.<span style="color: black;">GoaCalendar</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">===================================</span> Contacts <span style="color: #66cc66;">=============================</span>
&nbsp;
<span style="color: #008000;">type</span> Contacts <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    contacts *C.<span style="color: black;">GoaContacts</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">=====================================</span> Chat <span style="color: #66cc66;">===============================</span>
&nbsp;
<span style="color: #008000;">type</span> Chat <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    chat *C.<span style="color: black;">GoaChat</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">=====================================</span> Documents <span style="color: #66cc66;">===========================</span>
&nbsp;
<span style="color: #008000;">type</span> Documents <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    docs *C.<span style="color: black;">GoaDocuments</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">======================================</span> Exchanges <span style="color: #66cc66;">==========================</span>
&nbsp;
<span style="color: #008000;">type</span> Exchange <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    exchange *C.<span style="color: black;">GoaExchange</span>
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">==================================</span> Object <span style="color: #66cc66;">===============================</span>
&nbsp;
<span style="color: #008000;">type</span> Object <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    <span style="color: #008000;">object</span> *C.<span style="color: black;">GoaObject</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetManager <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Manager <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_manager</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Manager<span style="color: black;">&#123;</span>manager:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetAccount <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Account <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_account</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Account<span style="color: black;">&#123;</span>account:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetOauthBased <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *OAuthBased <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_oauth_based</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;OAuthBased<span style="color: black;">&#123;</span>auth_base:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetOauth2Based <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *OAuth2Based <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_oauth2_based</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;OAuth2Based<span style="color: black;">&#123;</span>auth_base:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetMail <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Mail <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_mail</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Mail<span style="color: black;">&#123;</span>mail:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetCalendar <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Calendar <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_calendar</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Calendar<span style="color: black;">&#123;</span><span style="color: #dc143c;">calendar</span>:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetContacts <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Contacts <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_contacts</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Contacts<span style="color: black;">&#123;</span>contacts:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetChat <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Chat <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_chat</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Chat<span style="color: black;">&#123;</span>chat:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetDocuments <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Documents <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_documents</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Documents<span style="color: black;">&#123;</span>docs:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>obj *Object<span style="color: black;">&#41;</span> GetExchange <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Exchange <span style="color: black;">&#123;</span>
    c_data :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_object_get_exchange</span><span style="color: black;">&#40;</span>obj.<span style="color: #008000;">object</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> c_data <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Exchange<span style="color: black;">&#123;</span>exchange:c_data<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
// <span style="color: #66cc66;">==================================</span> Client <span style="color: #66cc66;">===============================</span>
&nbsp;
<span style="color: #008000;">type</span> ClientAsyncReadyCallback func<span style="color: black;">&#40;</span>client *Client<span style="color: #66cc66;">,</span> err error<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #008000;">type</span> Client <span style="color: #dc143c;">struct</span> <span style="color: black;">&#123;</span>
    client *C.<span style="color: black;">GoaClient</span>
<span style="color: black;">&#125;</span>
&nbsp;
func NewSyncClient <span style="color: black;">&#40;</span>can *Cancellable<span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span>*Client<span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    var gerror *C.<span style="color: black;">GError</span>
    var cancellable *C.<span style="color: black;">GCancellable</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
    <span style="color: black;">&#125;</span>
    goa_client :<span style="color: #66cc66;">=</span> &amp;Client<span style="color: black;">&#123;</span>client:C.<span style="color: black;">goa_client_new_sync</span><span style="color: black;">&#40;</span>cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
        err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> nil<span style="color: #66cc66;">,</span> err
    <span style="color: black;">&#125;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> goa_client<span style="color: #66cc66;">,</span> nil
<span style="color: black;">&#125;</span>
&nbsp;
func NewClient <span style="color: black;">&#40;</span>can *Cancellable<span style="color: #66cc66;">,</span> callback ClientAsyncReadyCallback<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    go func<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
        var gerror *C.<span style="color: black;">GError</span>
        var cancellable *C.<span style="color: black;">GCancellable</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> can <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            cancellable <span style="color: #66cc66;">=</span> can.<span style="color: black;">cancellable</span>
        <span style="color: black;">&#125;</span>
        goa_client :<span style="color: #66cc66;">=</span> &amp;Client<span style="color: black;">&#123;</span>
            client:C.<span style="color: black;">goa_client_new_sync</span><span style="color: black;">&#40;</span>cancellable<span style="color: #66cc66;">,</span> &amp;gerror<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> gerror <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            err :<span style="color: #66cc66;">=</span> ErrorFromNative<span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>gerror<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		    callback<span style="color: black;">&#40;</span>nil<span style="color: #66cc66;">,</span> err<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: black;">&#125;</span>
        callback<span style="color: black;">&#40;</span>goa_client<span style="color: #66cc66;">,</span> nil<span style="color: black;">&#41;</span>
    <span style="color: black;">&#125;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>client *Client<span style="color: black;">&#41;</span> GetManager <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> *Manager <span style="color: black;">&#123;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Manager<span style="color: black;">&#123;</span>manager:C.<span style="color: black;">goa_client_get_manager</span><span style="color: black;">&#40;</span>client.<span style="color: black;">client</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>client *Client<span style="color: black;">&#41;</span> GetAccounts <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Object<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    accounts_list :<span style="color: #66cc66;">=</span> C.<span style="color: black;">goa_client_get_accounts</span><span style="color: black;">&#40;</span>client.<span style="color: black;">client</span><span style="color: black;">&#41;</span>
    // free the glist
    defer C.<span style="color: black;">g_list_free</span><span style="color: black;">&#40;</span>accounts_list<span style="color: black;">&#41;</span>
&nbsp;
    length :<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>accounts_list<span style="color: black;">&#41;</span>
    result :<span style="color: #66cc66;">=</span> make<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>*Object<span style="color: #66cc66;">,</span> C.<span style="color: black;">g_list_length</span><span style="color: black;">&#40;</span>accounts_list<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    // construct each of the goa objects <span style="color: #ff7700;font-weight:bold;">and</span> add them to the <span style="color: #dc143c;">array</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> C.<span style="color: black;">guint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
        data:<span style="color: #66cc66;">=</span> C.<span style="color: black;">g_list_nth_data</span><span style="color: black;">&#40;</span>accounts_list<span style="color: #66cc66;">,</span> n<span style="color: black;">&#41;</span>
        pointer :<span style="color: #66cc66;">=</span> unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
        goa_object :<span style="color: #66cc66;">=</span> &amp;Object<span style="color: black;">&#123;</span><span style="color: #008000;">object</span>:C.<span style="color: black;">to_GoaObject</span><span style="color: black;">&#40;</span>pointer<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
        result<span style="color: black;">&#91;</span>uint<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> goa_object
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: #66cc66;">,</span> uint<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>client *Client<span style="color: black;">&#41;</span> LookupById <span style="color: black;">&#40;</span>account_id <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span> *Object <span style="color: black;">&#123;</span>
    account_id_str :<span style="color: #66cc66;">=</span> C.<span style="color: black;">CString</span><span style="color: black;">&#40;</span>account_id<span style="color: black;">&#41;</span>
    defer C.<span style="color: black;">free_string</span><span style="color: black;">&#40;</span>account_id_str<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> &amp;Object<span style="color: black;">&#123;</span><span style="color: #008000;">object</span>:C.<span style="color: black;">goa_client_lookup_by_id</span><span style="color: black;">&#40;</span>client.<span style="color: black;">client</span><span style="color: #66cc66;">,</span>
        C.<span style="color: black;">to_gcharptr</span><span style="color: black;">&#40;</span>account_id_str<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
func <span style="color: black;">&#40;</span>client *Client<span style="color: black;">&#41;</span> Connect<span style="color: black;">&#40;</span>s <span style="color: #dc143c;">string</span><span style="color: #66cc66;">,</span> f interface<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: #66cc66;">,</span> datas ...<span style="color: black;">interface</span><span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    glib.<span style="color: black;">ObjectFromNative</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>
        C.<span style="color: black;">to_GObject</span><span style="color: black;">&#40;</span>unsafe.<span style="color: black;">Pointer</span><span style="color: black;">&#40;</span>client.<span style="color: black;">client</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">Connect</span><span style="color: black;">&#40;</span>s<span style="color: #66cc66;">,</span> f<span style="color: #66cc66;">,</span> datas...<span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span>
&nbsp;
&nbsp;
func main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
    fmt.<span style="color: black;">Println</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;test&quot;</span><span style="color: black;">&#41;</span>
    gtk.<span style="color: black;">Init</span><span style="color: black;">&#40;</span>&amp;<span style="color: #dc143c;">os</span>.<span style="color: black;">Args</span><span style="color: black;">&#41;</span>
    go func <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
        client<span style="color: #66cc66;">,</span> err :<span style="color: #66cc66;">=</span> NewSyncClient<span style="color: black;">&#40;</span>nil<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> err <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
            fmt.<span style="color: black;">Println</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Got error getting client&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: black;">&#125;</span>
        accounts<span style="color: #66cc66;">,</span> length :<span style="color: #66cc66;">=</span> client.<span style="color: black;">GetAccounts</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Got %d accounts backn&quot;</span><span style="color: #66cc66;">,</span> length<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> n :<span style="color: #66cc66;">=</span> uint<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> n <span style="color: #66cc66;">&lt;</span> length<span style="color: #66cc66;">;</span> n++ <span style="color: black;">&#123;</span>
            account :<span style="color: #66cc66;">=</span> accounts<span style="color: black;">&#91;</span>n<span style="color: black;">&#93;</span>.<span style="color: black;">GetAccount</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Account %sn&quot;</span><span style="color: #66cc66;">,</span> account.<span style="color: black;">GetId</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Println</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;tAccount info:&quot;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ttProvider type:tt%sn&quot;</span><span style="color: #66cc66;">,</span> account.<span style="color: black;">GetProviderType</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ttProvider name:tt%sn&quot;</span><span style="color: #66cc66;">,</span> account.<span style="color: black;">GetProviderName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ttIdentity:tt%sn&quot;</span><span style="color: #66cc66;">,</span> account.<span style="color: black;">GetIdentity</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ttPresentation identity:t%sn&quot;</span><span style="color: #66cc66;">,</span>
                account.<span style="color: black;">GetPresentationIdentity</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            mail :<span style="color: #66cc66;">=</span> accounts<span style="color: black;">&#91;</span>n<span style="color: black;">&#93;</span>.<span style="color: black;">GetMail</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> mail <span style="color: #66cc66;">!=</span> nil <span style="color: black;">&#123;</span>
                fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;tEmail info:n&quot;</span><span style="color: black;">&#41;</span>
                fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ttEmail address:tt%sn&quot;</span><span style="color: #66cc66;">,</span> mail.<span style="color: black;">GetEmailAdress</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ttImap host:tt%sn&quot;</span><span style="color: #66cc66;">,</span> mail.<span style="color: black;">GetImapHost</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                fmt.<span style="color: black;">Printf</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ttSmtp host:tt%sn&quot;</span><span style="color: #66cc66;">,</span> mail.<span style="color: black;">GetSmtpHost</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: black;">&#125;</span>
        <span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    gtk.<span style="color: black;">Main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1126</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pycon Ar Video (Spanish)</title>
		<link>http://www.themacaque.com/?p=1123&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pycon-ar-video-spanish</link>
		<comments>http://www.themacaque.com/?p=1123#comments</comments>
		<pubDate>Wed, 11 Jul 2012 11:05:33 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[pycon ar]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1123</guid>
		<description><![CDATA[I really hate my voice when I hear myself in videos etc.. but well, it happens to most of us. Here is the small rant ralsina and I had about multi-platform programming with python:]]></description>
				<content:encoded><![CDATA[<p>I really hate my voice when I hear myself in videos etc.. but well, it happens to most of us. Here is the small rant ralsina and I had about multi-platform programming with python:</p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/75onYlRCow8" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1123</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting a single char string from a byte string</title>
		<link>http://www.themacaque.com/?p=1115&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=getting-a-single-char-string-from-a-byte-string</link>
		<comments>http://www.themacaque.com/?p=1115#comments</comments>
		<pubDate>Sat, 07 Jul 2012 16:34:36 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[python3]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1115</guid>
		<description><![CDATA[The following behaviour completely got me out of place: &#62;&#62;&#62; byte_string = b'Test' &#62;&#62;&#62; byte_string&#91;0&#93; == b'T' False &#62;&#62;&#62; byte_string&#91;0&#93; in b'T' True &#62;&#62;&#62; byte_string&#91;0&#93; 84 &#62;&#62;&#62; b'T' b'T' Turns out this is documented (blame me I did not read the docs!!!). The correct way to do it is: &#62;&#62;&#62; byte_string = b'Test' &#62;&#62;&#62; byte_string&#91;:1&#93; [...]]]></description>
				<content:encoded><![CDATA[<p>The following behaviour completely got me out of place:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> byte_string <span style="color: #66cc66;">=</span> b<span style="color: #483d8b;">'Test'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> byte_string<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> b<span style="color: #483d8b;">'T'</span>
<span style="color: #008000;">False</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> byte_string<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">in</span> b<span style="color: #483d8b;">'T'</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> byte_string<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>        
<span style="color: #ff4500;">84</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> b<span style="color: #483d8b;">'T'</span>
b<span style="color: #483d8b;">'T'</span></pre></td></tr></table></div>

<p>Turns out this is documented (blame me I did not read the docs!!!). The correct way to do it is:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> byte_string <span style="color: #66cc66;">=</span> b<span style="color: #483d8b;">'Test'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> byte_string<span style="color: black;">&#91;</span>:<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> b<span style="color: #483d8b;">'T'</span>
<span style="color: #008000;">True</span></pre></td></tr></table></div>

<p>I really hope we don&#8217;t have any code that does this operations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1115</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Issues with buildProtocol in the ServerFactory within the tests</title>
		<link>http://www.themacaque.com/?p=1106&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=issues-with-buildprotocol-in-the-serverfactory-within-the-tests</link>
		<comments>http://www.themacaque.com/?p=1106#comments</comments>
		<pubDate>Fri, 08 Jun 2012 16:10:19 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[DirtyReactor]]></category>
		<category><![CDATA[twisted]]></category>
		<category><![CDATA[ubuntuone]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1106</guid>
		<description><![CDATA[So yet again I have been confronted with broken tests in Ubuntu One. As I have already mentioned before I have spent a significant amount of time ensuring that the tests of Ubuntu One (which use twisted a lot) are deterministic and we do not leave a dirty reactor in the way. In order to [...]]]></description>
				<content:encoded><![CDATA[<p>So yet again I have been confronted with broken tests in Ubuntu One. As I have already mentioned before I have spent a significant amount of time ensuring that the tests of Ubuntu One (which use twisted a lot) are deterministic and we do not leave a dirty reactor in the way. In order to do that a few week a go I wrote the following code that will help the rest of the team write such tests:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">shutil</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">tempfile</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> defer<span style="color: #66cc66;">,</span> endpoints<span style="color: #66cc66;">,</span> protocol
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">spread</span> <span style="color: #ff7700;font-weight:bold;">import</span> pb
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> ubuntuone.<span style="color: black;">devtools</span>.<span style="color: black;">testcases</span> <span style="color: #ff7700;font-weight:bold;">import</span> BaseTestCase
&nbsp;
<span style="color: #808080; font-style: italic;"># no init method +  twisted common warnings</span>
<span style="color: #808080; font-style: italic;"># pylint: disable=W0232, C0103, E1101</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> server_protocol_factory<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Factory to create tidy protocols.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> cls <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
        cls <span style="color: #66cc66;">=</span> protocol.<span style="color: black;">Protocol</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> ServerTidyProtocol<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;A tidy protocol.&quot;&quot;&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> connectionLost<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: black;">&#41;</span>:
            <span style="color: #483d8b;">&quot;&quot;&quot;Lost the connection.&quot;&quot;&quot;</span>
            cls.<span style="color: black;">connectionLost</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># lets tell everyone</span>
            <span style="color: #808080; font-style: italic;"># pylint: disable=W0212</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">factory</span>._disconnecting
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">called</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># pylint: enable=W0212</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> ServerTidyProtocol
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> client_protocol_factory<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Factory to create tidy protocols.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> cls <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
        cls <span style="color: #66cc66;">=</span> protocol.<span style="color: black;">Protocol</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> ClientTidyProtocol<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;A tidy protocol.&quot;&quot;&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> connectionLost<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *a<span style="color: black;">&#41;</span>:
            <span style="color: #483d8b;">&quot;&quot;&quot;Connection list.&quot;&quot;&quot;</span>
            <span style="color: #808080; font-style: italic;"># pylint: disable=W0212</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">factory</span>._disconnecting
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">called</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># pylint: enable=W0212</span>
            cls.<span style="color: black;">connectionLost</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *a<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> ClientTidyProtocol
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TidySocketServer<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Ensure that twisted servers are correctly managed in tests.
&nbsp;
    Closing a twisted server is a complicated matter. In order to do so you
    have to ensure that three different deferreds are fired:
&nbsp;
        1. The server must stop listening.
        2. The client connection must disconnect.
        3. The server connection must disconnect.
&nbsp;
    This class allows to create a server and a client that will ensure that
    the reactor is left clean by following the pattern described at
    http://mumak.net/stuff/twisted-disconnect.html
    &quot;&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create a new instance.&quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">NotImplementedError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'To be implemented by child classes.'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_client_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the client endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">NotImplementedError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'To be implemented by child classes.'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> listen_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> server_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Start a server in a random port.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> server_class<span style="color: black;">&#40;</span>*args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">protocol</span> <span style="color: #66cc66;">=</span> server_protocol_factory<span style="color: black;">&#40;</span>
                                                 <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">protocol</span><span style="color: black;">&#41;</span>
        endpoint <span style="color: #66cc66;">=</span> endpoints.<span style="color: black;">serverFromString</span><span style="color: black;">&#40;</span>reactor<span style="color: #66cc66;">,</span>
                                              <span style="color: #008000;">self</span>.<span style="color: black;">get_server_endpoint</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> endpoint.<span style="color: black;">listen</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
        defer.<span style="color: black;">returnValue</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> connect_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> client_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Conect a client to a given server.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Server Factory was not provided.'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s has not started listening.'</span><span style="color: #66cc66;">,</span>
                             <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> client_class<span style="color: black;">&#40;</span>*args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">protocol</span> <span style="color: #66cc66;">=</span> client_protocol_factory<span style="color: black;">&#40;</span>
                                                 <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">protocol</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        endpoint <span style="color: #66cc66;">=</span> endpoints.<span style="color: black;">clientFromString</span><span style="color: black;">&#40;</span>reactor<span style="color: #66cc66;">,</span>
                                                    <span style="color: #008000;">self</span>.<span style="color: black;">get_client_endpoint</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> endpoint.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span><span style="color: black;">&#41;</span>
        defer.<span style="color: black;">returnValue</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> clean_up<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Action to be performed for clean up.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #808080; font-style: italic;"># nothing to clean</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">succeed</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">connector</span>:
            <span style="color: #808080; font-style: italic;"># clean client and server</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">connector</span>.<span style="color: black;">transport</span>.<span style="color: black;">loseConnection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            d <span style="color: #66cc66;">=</span> defer.<span style="color: black;">maybeDeferred</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">listener</span>.<span style="color: black;">stopListening</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">gatherResults</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>d<span style="color: #66cc66;">,</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span><span style="color: #66cc66;">,</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">testserver_on_connection_lost</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span>:
            <span style="color: #808080; font-style: italic;"># just clean the server since there is no client</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">maybeDeferred</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">listener</span>.<span style="color: black;">stopListening</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TidyTCPServer<span style="color: black;">&#40;</span>TidySocketServer<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;A tidy tcp domain sockets server.&quot;&quot;&quot;</span>
&nbsp;
    client_endpoint_pattern <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'tcp:host=127.0.0.1:port=%s'</span>
    server_endpoint_pattern <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'tcp:0:interface=127.0.0.1'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_endpoint_pattern</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_client_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the client endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Server Factory was not provided.'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s has not started listening.'</span><span style="color: #66cc66;">,</span>
                                                          <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">client_endpoint_pattern</span> % <span style="color: #008000;">self</span>.<span style="color: black;">listener</span>.<span style="color: black;">getHost</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">port</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TidyUnixServer<span style="color: black;">&#40;</span>TidySocketServer<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;A tidy unix domain sockets server.&quot;&quot;&quot;</span>
&nbsp;
    client_endpoint_pattern <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'unix:path=%s'</span>
    server_endpoint_pattern <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'unix:%s'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create a new instance.&quot;&quot;&quot;</span>
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>TidyUnixServer<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">temp_dir</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">tempfile</span>.<span style="color: black;">mkdtemp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">path</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">temp_dir</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'tidy_unix_server'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_endpoint_pattern</span> % <span style="color: #008000;">self</span>.<span style="color: black;">path</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_client_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the client endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">client_endpoint_pattern</span> % <span style="color: #008000;">self</span>.<span style="color: black;">path</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> clean_up<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Action to be performed for clean up.&quot;&quot;&quot;</span>
        result <span style="color: #66cc66;">=</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>TidyUnixServer<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># remove the dir once we are disconnected</span>
        result.<span style="color: black;">addCallback</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> _: <span style="color: #dc143c;">shutil</span>.<span style="color: black;">rmtree</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">temp_dir</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> result
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ServerTestCase<span style="color: black;">&#40;</span>BaseTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Base test case for tidy servers.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> setUp<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Set the diff tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>ServerTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">setUp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_server</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">NotImplementedError</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_disconnected</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_connected</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_disconnected</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">tear_down_server_client</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">NotImplementedError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'To be implemented by child classes.'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> listen_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> server_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Listen a server.
&nbsp;
        The method takes the server class and the arguments that should be
        passed to the server constructor.
        &quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>
                                                server_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_disconnected</span> <span style="color: #66cc66;">=</span> 
                <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">testserver_on_connection_lost</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">listener</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> connect_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> client_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Connect the client.
&nbsp;
        The method takes the client factory  class and the arguments that
        should be passed to the client constructor.
        &quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>
                                                client_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_disconnected</span> <span style="color: #66cc66;">=</span> 
                <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">connector</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> tear_down_server_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Clean the server and client.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TCPServerTestCase<span style="color: black;">&#40;</span>ServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test that uses a single twisted server.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> TidyTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> UnixServerTestCase<span style="color: black;">&#40;</span>ServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test that uses a single twisted server.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> TidyUnixServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> PbServerTestCase<span style="color: black;">&#40;</span>ServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test a pb server.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">NotImplementedError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'To be implemented by child classes.'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> listen_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Listen a pb server.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>PbServerTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBServerFactory</span><span style="color: #66cc66;">,</span>
                                                              *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> connect_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Connect a pb client.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>PbServerTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBClientFactory</span><span style="color: #66cc66;">,</span>
                                                              *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TCPPbServerTestCase<span style="color: black;">&#40;</span>PbServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test a pb server over TCP.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> TidyTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> UnixPbServerTestCase<span style="color: black;">&#40;</span>PbServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test a pb server over Unix domain sockets.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> TidyUnixServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>The idea of the code is that developers do not need to worry about how to stop listening ports in their tests and just write tests like the following:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> TCPMultipleServersTestCase<span style="color: black;">&#40;</span>TestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Ensure that several servers can be ran.&quot;&quot;&quot;</span>
&nbsp;
    timeout <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> setUp<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Set the diff tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>TCPMultipleServersTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">setUp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_server</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">second_tcp_server</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_server</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">adder</span> <span style="color: #66cc66;">=</span> Adder<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">calculator</span> <span style="color: #66cc66;">=</span> Calculator<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">adder</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">echoer</span> <span style="color: #66cc66;">=</span> Echoer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> TidyTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> test_single_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Test setting a single server.&quot;&quot;&quot;</span>
        first_number <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span>
        second_number <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBServerFactory</span><span style="color: #66cc66;">,</span>
                                                              <span style="color: #008000;">self</span>.<span style="color: black;">calculator</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#41;</span>
        calculator_c <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>
                                                           pb.<span style="color: black;">PBClientFactory</span><span style="color: black;">&#41;</span>
        calculator <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> calculator_c.<span style="color: black;">getRootObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        adder <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> calculator.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'get_adder'</span><span style="color: black;">&#41;</span>
        result <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> adder.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'add'</span><span style="color: #66cc66;">,</span> first_number<span style="color: #66cc66;">,</span> second_number<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span>first_number + second_number<span style="color: #66cc66;">,</span> result<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> test_multiple_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Test setting multiple server.&quot;&quot;&quot;</span>
        first_number <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span>
        second_number <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span>
        <span style="color: #808080; font-style: italic;"># first server</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBServerFactory</span><span style="color: #66cc66;">,</span>
                                                              <span style="color: #008000;">self</span>.<span style="color: black;">calculator</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># second server</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">second_tcp_server</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBServerFactory</span><span style="color: #66cc66;">,</span>
                                                   <span style="color: #008000;">self</span>.<span style="color: black;">echoer</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">second_tcp_server</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># connect the diff clients</span>
        calculator_c <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>
                                                           pb.<span style="color: black;">PBClientFactory</span><span style="color: black;">&#41;</span>
        echoer_c <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">second_tcp_server</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>
                                                           pb.<span style="color: black;">PBClientFactory</span><span style="color: black;">&#41;</span>
&nbsp;
        calculator <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> calculator_c.<span style="color: black;">getRootObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        adder <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> calculator.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'get_adder'</span><span style="color: black;">&#41;</span>
        result <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> adder.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'add'</span><span style="color: #66cc66;">,</span> first_number<span style="color: #66cc66;">,</span> second_number<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span>first_number + second_number<span style="color: #66cc66;">,</span> result<span style="color: black;">&#41;</span>
        echoer <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> echoer_c.<span style="color: black;">getRootObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        echo <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> echoer.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'say'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'hello'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">echoer</span>.<span style="color: black;">remote_say</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'hello'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> echo<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>As you can see those tests do not give a rats ass about ensuring that the clients lose connection or we stop listening ports&#8230; Or so I though because the following code made such approach break in Mac OS X (although I suspect it was broken on Linux and Windows but we never experienced it):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> NullProtocol<span style="color: black;">&#40;</span>protocol.<span style="color: black;">Protocol</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;A protocol that drops the connection.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> connectionMade<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Just drop the connection.&quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">transport</span>.<span style="color: black;">loseConnection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> PortDetectFactory<span style="color: black;">&#40;</span>protocol.<span style="color: black;">ClientFactory</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Will detect if something is listening in a given port.&quot;&quot;&quot;</span>
&nbsp;
    protocol <span style="color: #66cc66;">=</span> NullProtocol
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Initialize this instance.&quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">d</span> <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> is_listening<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;A deferred that will become True if something is listening.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">d</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> buildProtocol<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> addr<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Connected.&quot;&quot;&quot;</span>
        p <span style="color: #66cc66;">=</span> protocol.<span style="color: black;">ClientFactory</span>.<span style="color: black;">buildProtocol</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> addr<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">d</span>.<span style="color: black;">called</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">d</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> p
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> clientConnectionLost<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> connector<span style="color: #66cc66;">,</span> reason<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;The connection was lost.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">d</span>.<span style="color: black;">called</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">d</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> clientConnectionFailed<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> connector<span style="color: #66cc66;">,</span> reason<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;The connection failed.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">d</span>.<span style="color: black;">called</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">d</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>The code used to test the above was written as:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;">    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> test_is_already_running<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;The is_already_running method returns True if already started.&quot;&quot;&quot;</span>
        server <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_server</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span>server.<span style="color: black;">clean_up</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">class</span> TestConnect<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
            <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
            <span style="color: #ff7700;font-weight:bold;">def</span> connect<span style="color: black;">&#40;</span>my_self<span style="color: #66cc66;">,</span> factory<span style="color: black;">&#41;</span>:
                connected_factory <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> server.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>PortDetectFactory<span style="color: black;">&#41;</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">patch</span><span style="color: black;">&#40;</span>factory<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'is_listening'</span><span style="color: #66cc66;">,</span> <span style="color: #ff7700;font-weight:bold;">lambda</span>:
                        connected_factory.<span style="color: black;">is_listening</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                defer.<span style="color: black;">returnValue</span><span style="color: black;">&#40;</span>connected_factory<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">patch</span><span style="color: black;">&#40;</span>tcpactivation<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'clientFromString'</span><span style="color: #66cc66;">,</span> <span style="color: #ff7700;font-weight:bold;">lambda</span> *args: TestConnect<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">yield</span> server.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>protocol.<span style="color: black;">ServerFactory</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># pylint: disable=E1101</span>
        ad <span style="color: #66cc66;">=</span> ActivationDetector<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">config</span><span style="color: black;">&#41;</span>
        result <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> ad.<span style="color: black;">is_already_running</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertTrue</span><span style="color: black;">&#40;</span>result<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;It should be already running.&quot;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>While in all the other platforms the tests passed with no problems on Mac OS X the tests would block in the clean_up method from the server because the deferred that was called in the connectionLost from the ServerTidyProtocol was never fired&#8230; Interesting.. After digging in the code I realized that the main issue with the approach of the clean_up code was wrong. The problem relies on the way in which the NullProtocol works. As you can see in the code the protocol loses its connections as soon as it made. This results in to possible things:</p>
<ol>
<li>The server does know that we have a client connected and calls buildProtocol.</li>
<li>The connection is lost so fast that the buildProtocol on the ServerFactory does not get call.</li>
</ol>
<p>When running the tests on Windows and Linux we were always facing the first scenario, buildProtocol was called which meant that connectionLost in the server protocol would be called. On the other hand, on Mac OS X, 1 out of 10 runs of the tests would block in the clean up because we would be in the second scenario, that is, no protocol would be build in the ServerFactory which results in the connectionLost never being called because it was no needed. The work around this issue is quite simple once you understand what is going on. The ServerFactory has to be modified to set the deferred when buildProtocol is called and not before ensuring that when we cleanup we check if the deferred is None and if it is not we wait for it to be fired. The fixed version of the helper code is the following:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">shutil</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">tempfile</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> defer<span style="color: #66cc66;">,</span> endpoints<span style="color: #66cc66;">,</span> protocol
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">spread</span> <span style="color: #ff7700;font-weight:bold;">import</span> pb
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> ubuntuone.<span style="color: black;">devtools</span>.<span style="color: black;">testcases</span> <span style="color: #ff7700;font-weight:bold;">import</span> BaseTestCase
&nbsp;
<span style="color: #808080; font-style: italic;"># no init method + twisted common warnings</span>
<span style="color: #808080; font-style: italic;"># pylint: disable=W0232, C0103, E1101</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> server_protocol_factory<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Factory to create tidy protocols.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> cls <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
        cls <span style="color: #66cc66;">=</span> protocol.<span style="color: black;">Protocol</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> ServerTidyProtocol<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;A tidy protocol.&quot;&quot;&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> connectionLost<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: black;">&#41;</span>:
            <span style="color: #483d8b;">&quot;&quot;&quot;Lost the connection.&quot;&quot;&quot;</span>
            cls.<span style="color: black;">connectionLost</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># lets tell everyone</span>
            <span style="color: #808080; font-style: italic;"># pylint: disable=W0212</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">factory</span>._disconnecting
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">called</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># pylint: enable=W0212</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> ServerTidyProtocol
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> server_factory_factory<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Factory that creates special types of factories for tests.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> cls <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
        cls <span style="color: #66cc66;">=</span> protocol.<span style="color: black;">ServerFactory</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> TidyServerFactory<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;A tidy factory.&quot;&quot;&quot;</span>
&nbsp;
        testserver_on_connection_lost <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> buildProtocol<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> addr<span style="color: black;">&#41;</span>:
            prot <span style="color: #66cc66;">=</span> cls.<span style="color: black;">buildProtocol</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> addr<span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> prot
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> TidyServerFactory
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> client_protocol_factory<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Factory to create tidy protocols.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> cls <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
        cls <span style="color: #66cc66;">=</span> protocol.<span style="color: black;">Protocol</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> ClientTidyProtocol<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;A tidy protocol.&quot;&quot;&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> connectionLost<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *a<span style="color: black;">&#41;</span>:
            <span style="color: #483d8b;">&quot;&quot;&quot;Connection list.&quot;&quot;&quot;</span>
            cls.<span style="color: black;">connectionLost</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *a<span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># pylint: disable=W0212</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">factory</span>._disconnecting
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">called</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># pylint: enable=W0212</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> ClientTidyProtocol
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TidySocketServer<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Ensure that twisted servers are correctly managed in tests.
&nbsp;
    Closing a twisted server is a complicated matter. In order to do so you
    have to ensure that three different deferreds are fired:
&nbsp;
        1. The server must stop listening.
        2. The client connection must disconnect.
        3. The server connection must disconnect.
&nbsp;
    This class allows to create a server and a client that will ensure that
    the reactor is left clean by following the pattern described at
    http://mumak.net/stuff/twisted-disconnect.html
    &quot;&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create a new instance.&quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">NotImplementedError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'To be implemented by child classes.'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_client_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the client endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">NotImplementedError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'To be implemented by child classes.'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> listen_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> server_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Start a server in a random port.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
        tidy_class <span style="color: #66cc66;">=</span> server_factory_factory<span style="color: black;">&#40;</span>server_class<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> tidy_class<span style="color: black;">&#40;</span>*args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">protocol</span> <span style="color: #66cc66;">=</span> server_protocol_factory<span style="color: black;">&#40;</span>
                                                 <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">protocol</span><span style="color: black;">&#41;</span>
        endpoint <span style="color: #66cc66;">=</span> endpoints.<span style="color: black;">serverFromString</span><span style="color: black;">&#40;</span>reactor<span style="color: #66cc66;">,</span>
                                              <span style="color: #008000;">self</span>.<span style="color: black;">get_server_endpoint</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> endpoint.<span style="color: black;">listen</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
        defer.<span style="color: black;">returnValue</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> connect_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> client_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Conect a client to a given server.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Server Factory was not provided.'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s has not started listening.'</span><span style="color: #66cc66;">,</span>
                             <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> client_class<span style="color: black;">&#40;</span>*args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">protocol</span> <span style="color: #66cc66;">=</span> client_protocol_factory<span style="color: black;">&#40;</span>
                                                 <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">protocol</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        endpoint <span style="color: #66cc66;">=</span> endpoints.<span style="color: black;">clientFromString</span><span style="color: black;">&#40;</span>reactor<span style="color: #66cc66;">,</span>
                                                    <span style="color: #008000;">self</span>.<span style="color: black;">get_client_endpoint</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> endpoint.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span><span style="color: black;">&#41;</span>
        defer.<span style="color: black;">returnValue</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> clean_up<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Action to be performed for clean up.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #808080; font-style: italic;"># nothing to clean</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">succeed</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">connector</span>:
            <span style="color: #808080; font-style: italic;"># clean client and server</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            d <span style="color: #66cc66;">=</span> defer.<span style="color: black;">maybeDeferred</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">listener</span>.<span style="color: black;">stopListening</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">connector</span>.<span style="color: black;">transport</span>.<span style="color: black;">loseConnection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">testserver_on_connection_lost</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">gatherResults</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>d<span style="color: #66cc66;">,</span>
                    <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span><span style="color: #66cc66;">,</span>
                    <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">testserver_on_connection_lost</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">gatherResults</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>d<span style="color: #66cc66;">,</span>
                    <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span>:
            <span style="color: #808080; font-style: italic;"># just clean the server since there is no client</span>
            <span style="color: #808080; font-style: italic;"># pylint: disable=W0201</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">maybeDeferred</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">listener</span>.<span style="color: black;">stopListening</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># pylint: enable=W0201</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TidyTCPServer<span style="color: black;">&#40;</span>TidySocketServer<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;A tidy tcp domain sockets server.&quot;&quot;&quot;</span>
&nbsp;
    client_endpoint_pattern <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'tcp:host=127.0.0.1:port=%s'</span>
    server_endpoint_pattern <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'tcp:0:interface=127.0.0.1'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_endpoint_pattern</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_client_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the client endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Server Factory was not provided.'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s has not started listening.'</span><span style="color: #66cc66;">,</span>
                                                          <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">client_endpoint_pattern</span> % <span style="color: #008000;">self</span>.<span style="color: black;">listener</span>.<span style="color: black;">getHost</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">port</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TidyUnixServer<span style="color: black;">&#40;</span>TidySocketServer<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;A tidy unix domain sockets server.&quot;&quot;&quot;</span>
&nbsp;
    client_endpoint_pattern <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'unix:path=%s'</span>
    server_endpoint_pattern <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'unix:%s'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create a new instance.&quot;&quot;&quot;</span>
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>TidyUnixServer<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">temp_dir</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">tempfile</span>.<span style="color: black;">mkdtemp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">path</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">temp_dir</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'tidy_unix_server'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_endpoint_pattern</span> % <span style="color: #008000;">self</span>.<span style="color: black;">path</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_client_endpoint<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the client endpoint description.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">client_endpoint_pattern</span> % <span style="color: #008000;">self</span>.<span style="color: black;">path</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> clean_up<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Action to be performed for clean up.&quot;&quot;&quot;</span>
        result <span style="color: #66cc66;">=</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>TidyUnixServer<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># remove the dir once we are disconnected</span>
        result.<span style="color: black;">addCallback</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> _: <span style="color: #dc143c;">shutil</span>.<span style="color: black;">rmtree</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">temp_dir</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> result
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ServerTestCase<span style="color: black;">&#40;</span>BaseTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Base test case for tidy servers.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> setUp<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Set the diff tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>ServerTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">setUp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_server</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">NotImplementedError</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_disconnected</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_connected</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_disconnected</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">tear_down_server_client</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">NotImplementedError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'To be implemented by child classes.'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> listen_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> server_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Listen a server.
&nbsp;
        The method takes the server class and the arguments that should be
        passed to the server constructor.
        &quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>
                                                server_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_disconnected</span> <span style="color: #66cc66;">=</span> 
                <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">testserver_on_connection_lost</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">listener</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> connect_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> client_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Connect the client.
&nbsp;
        The method takes the client factory  class and the arguments that
        should be passed to the client constructor.
        &quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>
                                                client_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_disconnected</span> <span style="color: #66cc66;">=</span> 
                <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">connector</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> tear_down_server_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Clean the server and client.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_runner</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TCPServerTestCase<span style="color: black;">&#40;</span>ServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test that uses a single twisted server.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> TidyTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> UnixServerTestCase<span style="color: black;">&#40;</span>ServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test that uses a single twisted server.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> TidyUnixServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> PbServerTestCase<span style="color: black;">&#40;</span>ServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test a pb server.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">NotImplementedError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'To be implemented by child classes.'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> listen_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Listen a pb server.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>PbServerTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBServerFactory</span><span style="color: #66cc66;">,</span>
                                                              *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> connect_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Connect a pb client.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>PbServerTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBClientFactory</span><span style="color: #66cc66;">,</span>
                                                              *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TCPPbServerTestCase<span style="color: black;">&#40;</span>PbServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test a pb server over TCP.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> TidyTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> UnixPbServerTestCase<span style="color: black;">&#40;</span>PbServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test a pb server over Unix domain sockets.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the server to be used to run the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> TidyUnixServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>I wonder if at some point I should share this code for the people out there&#8230; any opinions?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1106</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The windows tests are dirty!!</title>
		<link>http://www.themacaque.com/?p=1085&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-windows-tests-are-dirty</link>
		<comments>http://www.themacaque.com/?p=1085#comments</comments>
		<pubDate>Fri, 13 Apr 2012 11:05:03 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[DirtyReactorError]]></category>
		<category><![CDATA[trial]]></category>
		<category><![CDATA[twisted]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1085</guid>
		<description><![CDATA[The last few days I have taken a considerable time to remove all the errors from the Ubuntu One tests on Windows. The tests were leaving tcp connections in the twisted reactor that on some Windows systems will result on a DirtyReactorError which is a PITA. Due to a refactor the pattern I described here [...]]]></description>
				<content:encoded><![CDATA[<p>The last few days I have taken a considerable time to remove all the errors from the Ubuntu One tests on Windows. The tests were leaving tcp connections in the twisted reactor that on some Windows systems will result on a DirtyReactorError which is a PITA. Due to a refactor the pattern I described <a href="http://www.themacaque.com/?p=985">here</a> was remove (ouch!) and I had to re-add it. In this case, instead of doing the pattern everywhere is needed I created some helper classes that will ensure that the clients and servers are correctly cleaned up after you use them.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> defer<span style="color: #66cc66;">,</span> protocol<span style="color: #66cc66;">,</span> reactor
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">spread</span> <span style="color: #ff7700;font-weight:bold;">import</span> pb
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> ubuntuone.<span style="color: black;">devtools</span>.<span style="color: black;">testcases</span> <span style="color: #ff7700;font-weight:bold;">import</span> BaseTestCase
&nbsp;
<span style="color: #808080; font-style: italic;"># no init method +  twisted common warnings</span>
<span style="color: #808080; font-style: italic;"># pylint: disable=W0232, C0103, E1101</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> server_protocol_factory<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Factory to create tidy protocols.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> cls <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
        cls <span style="color: #66cc66;">=</span> protocol.<span style="color: black;">Protocol</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> ServerSaveProtocol<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;A tidy protocol.&quot;&quot;&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> connectionLost<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: black;">&#41;</span>:
            <span style="color: #483d8b;">&quot;&quot;&quot;Lost the connection.&quot;&quot;&quot;</span>
            cls.<span style="color: black;">connectionLost</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># lets tell everyone</span>
            <span style="color: #808080; font-style: italic;"># pylint: disable=W0212</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">factory</span>._disconnecting
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">called</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># pylint: enable=W0212</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> ServerSaveProtocol
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> client_protocol_factory<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Factory to create tidy protocols.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> cls <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
        cls <span style="color: #66cc66;">=</span> protocol.<span style="color: black;">Protocol</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> ClientSaveProtocol<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;A tidy protocol.&quot;&quot;&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> connectionMade<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
            <span style="color: #483d8b;">&quot;&quot;&quot;Connection made.&quot;&quot;&quot;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_made</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_made</span>.<span style="color: black;">called</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_made</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            cls.<span style="color: black;">connectionMade</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> connectionLost<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *a<span style="color: black;">&#41;</span>:
            <span style="color: #483d8b;">&quot;&quot;&quot;Connection list.&quot;&quot;&quot;</span>
            <span style="color: #808080; font-style: italic;"># pylint: disable=W0212</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">factory</span>._disconnecting
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>
                    <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">called</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">testserver_on_connection_lost</span>.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># pylint: enable=W0212</span>
            cls.<span style="color: black;">connectionLost</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *a<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> ClientSaveProtocol
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TidyTCPServer<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Ensure that twisted services are correctly managed in tests.
&nbsp;
    Closing a twisted service is a complicated matter. In order to do so you
    have to ensure that three different deferreds are fired:
&nbsp;
        1. The server must stop listening.
        2. The client connection must disconnect.
        3. The server connection must disconnect.
&nbsp;
    This class allows to create a service and a client that will ensure that
    the reactor is left clean by following the pattern described at
    http://mumak.net/stuff/twisted-disconnect.html
    &quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create a new instance.&quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> listen_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> server_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Start a server in a random port.&quot;&quot;&quot;</span>
        <span style="color: #808080; font-style: italic;"># pylint: disable=W0621</span>
        <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
        <span style="color: #808080; font-style: italic;"># pylint: enable=W0621</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> server_class<span style="color: black;">&#40;</span>*args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">protocol</span> <span style="color: #66cc66;">=</span> server_protocol_factory<span style="color: black;">&#40;</span>
                                                 <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">protocol</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> reactor.<span style="color: black;">listenTCP</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> connect_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> client_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Conect a client to a given service.&quot;&quot;&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Server Factory was not provided.'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">ValueError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s has not started listening.'</span><span style="color: #66cc66;">,</span>
                                                          <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> client_class<span style="color: black;">&#40;</span>*args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">protocol</span> <span style="color: #66cc66;">=</span> client_protocol_factory<span style="color: black;">&#40;</span>
                                                 <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">protocol</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_made</span> <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> reactor.<span style="color: black;">connectTCP</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'localhost'</span><span style="color: #66cc66;">,</span>
                                        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span>.<span style="color: black;">getHost</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">port</span><span style="color: #66cc66;">,</span>
                                        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> clean_up<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Action to be performed for clean up.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #808080; font-style: italic;"># nothing to clean</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">succeed</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">connector</span>:
            <span style="color: #808080; font-style: italic;"># clean client and server</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            d <span style="color: #66cc66;">=</span> defer.<span style="color: black;">maybeDeferred</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">listener</span>.<span style="color: black;">stopListening</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">connector</span>.<span style="color: black;">disconnect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">gatherResults</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>d<span style="color: #66cc66;">,</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span><span style="color: #66cc66;">,</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">testserver_on_connection_lost</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">listener</span>:
            <span style="color: #808080; font-style: italic;"># just clean the server since there is no client</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">maybeDeferred</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">listener</span>.<span style="color: black;">stopListening</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TCPServerTestCase<span style="color: black;">&#40;</span>BaseTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test that uses a single twisted service.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> setUp<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Set the diff tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>TCPServerTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">setUp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">service_runner</span> <span style="color: #66cc66;">=</span> TidyTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_disconnected</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_connected</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_disconnected</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">tear_down_server_client</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> listen_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> server_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Listen a server.
&nbsp;
        The method takes the server class and the arguments that should be
        passed to the server constructor.
        &quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">service_runner</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>server_class<span style="color: #66cc66;">,</span>
                *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">server_disconnected</span> <span style="color: #66cc66;">=</span> 
                <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span>.<span style="color: black;">testserver_on_connection_lost</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">listener</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">service_runner</span>.<span style="color: black;">listener</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> connect_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> client_class<span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Connect the client.
&nbsp;
        The method takes the client factory  class and the arguments that
        should be passed to the client constructor.
        &quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">service_runner</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>client_class<span style="color: #66cc66;">,</span>
                                                              *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_connected</span> <span style="color: #66cc66;">=</span> 
                <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_made</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">client_disconnected</span> <span style="color: #66cc66;">=</span> 
                <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>.<span style="color: black;">testserver_on_connection_lost</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">connector</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">service_runner</span>.<span style="color: black;">connector</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> tear_down_server_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Clean the server and client.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">server_factory</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">client_factory</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">service_runner</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> PbServiceTestCase<span style="color: black;">&#40;</span>TCPServerTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test a pb service.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> listen_server<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Listen a pb server.&quot;&quot;&quot;</span>
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>PbServiceTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBServerFactory</span><span style="color: #66cc66;">,</span>
                                                              *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> connect_client<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Connect a pb client.&quot;&quot;&quot;</span>
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>PbServiceTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBClientFactory</span><span style="color: #66cc66;">,</span>
                                                              *args<span style="color: #66cc66;">,</span> **kwargs<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>The above classes can be used in the following way:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><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
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> defer<span style="color: #66cc66;">,</span> protocol
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">spread</span> <span style="color: #ff7700;font-weight:bold;">import</span> pb
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">trial</span>.<span style="color: #dc143c;">unittest</span> <span style="color: #ff7700;font-weight:bold;">import</span> TestCase
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> ubuntuone.<span style="color: black;">devtools</span>.<span style="color: black;">testcases</span>.<span style="color: black;">txtcpserver</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: black;">&#40;</span>
    client_protocol_factory<span style="color: #66cc66;">,</span>
    server_protocol_factory<span style="color: #66cc66;">,</span>
    PbServiceTestCase<span style="color: #66cc66;">,</span>
    TidyTCPServer<span style="color: #66cc66;">,</span>
    TCPServerTestCase<span style="color: #66cc66;">,</span>
<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># no init</span>
<span style="color: #808080; font-style: italic;"># pylint: disable=W0232</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Adder<span style="color: black;">&#40;</span>pb.<span style="color: black;">Referenceable</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;A remote adder.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> remote_add<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> first<span style="color: #66cc66;">,</span> second<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Remote adding numbers.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> first + second
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Calculator<span style="color: black;">&#40;</span>pb.<span style="color: black;">Root</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;A calculator ran somewhere on the net.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> adder<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create a new instance.&quot;&quot;&quot;</span>
         <span style="color: #808080; font-style: italic;"># pb.Root has no __init__</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">adder</span> <span style="color: #66cc66;">=</span> adder
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> remote_get_adder<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Get the remote added.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">adder</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> remote_check_adder<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> other_adder<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Check if the are the same.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">adder</span> <span style="color: #66cc66;">==</span> other_adder
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Echoer<span style="color: black;">&#40;</span>pb.<span style="color: black;">Root</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;An echoer that repeats what we say.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> remote_say<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> sentence<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Echo what we want to say.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'Echoer: %s'</span> % sentence
<span style="color: #808080; font-style: italic;"># pylint: enable=W0232</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MultipleSercicesTestCase<span style="color: black;">&#40;</span>TestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Ensure that several services can be ran.&quot;&quot;&quot;</span>
&nbsp;
    timeout <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> setUp<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Set the diff tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>MultipleSercicesTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">setUp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span> <span style="color: #66cc66;">=</span> TidyTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">second_tcp_server</span> <span style="color: #66cc66;">=</span> TidyTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">adder</span> <span style="color: #66cc66;">=</span> Adder<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">calculator</span> <span style="color: #66cc66;">=</span> Calculator<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">adder</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">echoer</span> <span style="color: #66cc66;">=</span> Echoer<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> test_single_service<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Test setting a single service.&quot;&quot;&quot;</span>
        first_number <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span>
        second_number <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBServerFactory</span><span style="color: #66cc66;">,</span>
                                                              <span style="color: #008000;">self</span>.<span style="color: black;">calculator</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#41;</span>
        calculator_c <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBClientFactory</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># ensure we do have connected</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> calculator_c.<span style="color: black;">testserver_on_connection_made</span>
        calculator <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> calculator_c.<span style="color: black;">getRootObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        adder <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> calculator.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'get_adder'</span><span style="color: black;">&#41;</span>
        result <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> adder.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'add'</span><span style="color: #66cc66;">,</span> first_number<span style="color: #66cc66;">,</span> second_number<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span>first_number + second_number<span style="color: #66cc66;">,</span> result<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> test_multiple_services<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Test setting multiple services.&quot;&quot;&quot;</span>
        first_number <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span>
        second_number <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span>
        <span style="color: #808080; font-style: italic;"># first service</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBServerFactory</span><span style="color: #66cc66;">,</span>
                                                              <span style="color: #008000;">self</span>.<span style="color: black;">calculator</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># second service</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">second_tcp_server</span>.<span style="color: black;">listen_server</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBServerFactory</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.<span style="color: black;">echoer</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">second_tcp_server</span>.<span style="color: black;">clean_up</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># connect the diff clients</span>
        calculator_c <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">first_tcp_server</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBClientFactory</span><span style="color: black;">&#41;</span>
        echoer_c <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">second_tcp_server</span>.<span style="color: black;">connect_client</span><span style="color: black;">&#40;</span>pb.<span style="color: black;">PBClientFactory</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># ensure we do have connected</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> calculator_c.<span style="color: black;">testserver_on_connection_made</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> echoer_c.<span style="color: black;">testserver_on_connection_made</span>
&nbsp;
        calculator <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> calculator_c.<span style="color: black;">getRootObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        adder <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> calculator.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'get_adder'</span><span style="color: black;">&#41;</span>
        result <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> adder.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'add'</span><span style="color: #66cc66;">,</span> first_number<span style="color: #66cc66;">,</span> second_number<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span>first_number + second_number<span style="color: #66cc66;">,</span> result<span style="color: black;">&#41;</span>
        echoer <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> echoer_c.<span style="color: black;">getRootObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        echo <span style="color: #66cc66;">=</span> <span style="color: #ff7700;font-weight:bold;">yield</span> echoer.<span style="color: black;">callRemote</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'say'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'hello'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">echoer</span>.<span style="color: black;">remote_say</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'hello'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> echo<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>On top of this helper classes I added a twisted site that would follow a similar pattern:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><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
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #483d8b;">&quot;&quot;&quot;A tx based web server.&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> defer<span style="color: #66cc66;">,</span> reactor<span style="color: #66cc66;">,</span> ssl
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">protocols</span>.<span style="color: black;">policies</span> <span style="color: #ff7700;font-weight:bold;">import</span> WrappingFactory
<span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">web</span> <span style="color: #ff7700;font-weight:bold;">import</span> server
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> ubuntuone.<span style="color: black;">devtools</span>.<span style="color: black;">testcases</span>.<span style="color: black;">txtcpserver</span> <span style="color: #ff7700;font-weight:bold;">import</span> server_protocol_factory
&nbsp;
<span style="color: #808080; font-style: italic;"># no init method +  twisted common warnings</span>
<span style="color: #808080; font-style: italic;"># pylint: disable=W0232, C0103, E1101</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> WebServer<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Webserver used to perform requests in tests.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> root_resource<span style="color: #66cc66;">,</span> ssl_settings<span style="color: #66cc66;">=</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create and start the instance.
&nbsp;
        The ssl_settings parameter contains a dictionary with the key and cert
        that will be used to perform ssl connections. The root_resource
        contains the resource with all its childre.
        &quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">root</span> <span style="color: #66cc66;">=</span> root_resource
        <span style="color: #008000;">self</span>.<span style="color: black;">ssl_settings</span> <span style="color: #66cc66;">=</span> ssl_settings
        <span style="color: #008000;">self</span>.<span style="color: black;">port</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #808080; font-style: italic;"># use an http.HTTPFactory that was modified to ensure that we have</span>
        <span style="color: #808080; font-style: italic;"># clean close connections</span>
        <span style="color: #008000;">self</span>.<span style="color: #dc143c;">site</span> <span style="color: #66cc66;">=</span> server.<span style="color: black;">Site</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">root</span><span style="color: #66cc66;">,</span> timeout<span style="color: #66cc66;">=</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span> <span style="color: #66cc66;">=</span> WrappingFactory<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #dc143c;">site</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span>.<span style="color: black;">protocol</span> <span style="color: #66cc66;">=</span> server_protocol_factory<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span>.<span style="color: black;">protocol</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _listen<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">site</span><span style="color: #66cc66;">,</span> ssl_settings<span style="color: #66cc66;">=</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Listen a port to allow the tests.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> ssl_settings <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> reactor.<span style="color: black;">listenTCP</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">site</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            ssl_context <span style="color: #66cc66;">=</span> ssl.<span style="color: black;">DefaultOpenSSLContextFactory</span><span style="color: black;">&#40;</span>
                                    ssl_settings<span style="color: black;">&#91;</span><span style="color: #483d8b;">'key'</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> ssl_settings<span style="color: black;">&#91;</span><span style="color: #483d8b;">'cert'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> reactor.<span style="color: black;">listenSSL</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">site</span><span style="color: #66cc66;">,</span> ssl_context<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_iri<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Build the iri for this mock server.&quot;&quot;&quot;</span>
        url <span style="color: #66cc66;">=</span> u<span style="color: #483d8b;">&quot;http://127.0.0.1:%d/&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> url % <span style="color: #008000;">self</span>.<span style="color: black;">get_port</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_uri<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Build the uri for this mock server.&quot;&quot;&quot;</span>
        url <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;http://127.0.0.1:%d/&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> url % <span style="color: #008000;">self</span>.<span style="color: black;">get_port</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_ssl_iri<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Build the ssl iri for this mock server.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">ssl_settings</span>:
            url <span style="color: #66cc66;">=</span> u<span style="color: #483d8b;">&quot;https://127.0.0.1:%d/&quot;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> url % <span style="color: #008000;">self</span>.<span style="color: black;">get_ssl_port</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_ssl_uri<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Build the ssl iri for this mock server.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">ssl_settings</span>:
            url <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;https://127.0.0.1:%d/&quot;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> url % <span style="color: #008000;">self</span>.<span style="color: black;">get_ssl_port</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_port<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the port where we are listening.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">port</span>.<span style="color: black;">getHost</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">port</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_ssl_port<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the ssl port where we are listening.&quot;&quot;&quot;</span>
        <span style="color: #808080; font-style: italic;"># pylint: disable=W0212</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">ssl_settings</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">port</span>.<span style="color: black;">getHost</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">port</span>
        <span style="color: #808080; font-style: italic;"># pylint: enable=W0212</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Start the service.&quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">port</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>._listen<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.<span style="color: black;">ssl_settings</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> stop<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Shut it down.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">port</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span>._disconnecting <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span>
            connected <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span>.<span style="color: black;">protocols</span>.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> connected:
                <span style="color: #ff7700;font-weight:bold;">for</span> con <span style="color: #ff7700;font-weight:bold;">in</span> connected:
                    con.<span style="color: black;">transport</span>.<span style="color: black;">loseConnection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span>.<span style="color: black;">testserver_on_connection_lost</span> <span style="color: #66cc66;">=</span> 
                                                            defer.<span style="color: black;">succeed</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
            d <span style="color: #66cc66;">=</span> defer.<span style="color: black;">maybeDeferred</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">port</span>.<span style="color: black;">stopListening</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">gatherResults</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>d<span style="color: #66cc66;">,</span>
                                  <span style="color: #008000;">self</span>.<span style="color: black;">wrapper</span>.<span style="color: black;">testserver_on_connection_lost</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> defer.<span style="color: black;">succeed</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>When using this webserver you have to be careful because we do not longer pay attention to the client protocols, if you do not use twisted to access it you have no problems (libsoup, qtnetwork etc..) but if, for example, you use the HTTPClientFactory you have to do something similar to this in your TestCase setUp:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><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
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> TxWebClientTestCase<span style="color: black;">&#40;</span>WebClientTestCase<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test case for txweb.&quot;&quot;&quot;</span>
&nbsp;
    webclient_factory <span style="color: #66cc66;">=</span> txweb.<span style="color: black;">WebClient</span>
&nbsp;
    <span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> setUp<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Set the diff tests.&quot;&quot;&quot;</span>
        <span style="color: #808080; font-style: italic;"># delay import, otherwise a default reactor gets installed</span>
        <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">web</span> <span style="color: #ff7700;font-weight:bold;">import</span> client
        <span style="color: #008000;">self</span>.<span style="color: black;">factory</span> <span style="color: #66cc66;">=</span> client.<span style="color: black;">HTTPClientFactory</span>
        <span style="color: #808080; font-style: italic;"># set the factory to be used</span>
        <span style="color: #808080; font-style: italic;"># Hook the server's buildProtocol to make the protocol instance</span>
        <span style="color: #808080; font-style: italic;"># accessible to tests and ensure that the reactor is clean!</span>
        build_protocol <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">buildProtocol</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">serverProtocol</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> remember_protocol_instance<span style="color: black;">&#40;</span>my_self<span style="color: #66cc66;">,</span> addr<span style="color: black;">&#41;</span>:
            <span style="color: #483d8b;">&quot;&quot;&quot;Remember the protocol used in the test.&quot;&quot;&quot;</span>
            protocol <span style="color: #66cc66;">=</span> build_protocol<span style="color: black;">&#40;</span>my_self<span style="color: #66cc66;">,</span> addr<span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">serverProtocol</span> <span style="color: #66cc66;">=</span> protocol
            on_connection_lost <span style="color: #66cc66;">=</span> defer.<span style="color: black;">Deferred</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            connection_lost <span style="color: #66cc66;">=</span> protocol.<span style="color: black;">connectionLost</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">def</span> defer_connection_lost<span style="color: black;">&#40;</span>protocol<span style="color: #66cc66;">,</span> *a<span style="color: black;">&#41;</span>:
                <span style="color: #483d8b;">&quot;&quot;&quot;Lost connection.&quot;&quot;&quot;</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> on_connection_lost.<span style="color: black;">called</span>:
                    on_connection_lost.<span style="color: black;">callback</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
                connection_lost<span style="color: black;">&#40;</span>protocol<span style="color: #66cc66;">,</span> *a<span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #008000;">self</span>.<span style="color: black;">patch</span><span style="color: black;">&#40;</span>protocol<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'connectionLost'</span><span style="color: #66cc66;">,</span> defer_connection_lost<span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">def</span> cleanup<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                <span style="color: #483d8b;">&quot;&quot;&quot;Clean the connection.&quot;&quot;&quot;</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">serverProtocol</span>.<span style="color: black;">transport</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
                    <span style="color: #008000;">self</span>.<span style="color: black;">serverProtocol</span>.<span style="color: black;">transport</span>.<span style="color: black;">loseConnection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> on_connection_lost
&nbsp;
            <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span>cleanup<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> protocol
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">buildProtocol</span> <span style="color: #66cc66;">=</span> remember_protocol_instance
        <span style="color: #008000;">self</span>.<span style="color: black;">addCleanup</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">set_build_protocol</span><span style="color: #66cc66;">,</span> build_protocol<span style="color: black;">&#41;</span>
        txweb.<span style="color: black;">WebClient</span>.<span style="color: black;">client_factory</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>TxWebClientTestCase<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">setUp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> set_build_protocol<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> method<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Set the method back.&quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">factory</span>.<span style="color: black;">buildProtocol</span> <span style="color: #66cc66;">=</span> method</pre></td></tr></table></div>

<p>I have spent some time on this so let me know if you know about any improvements that I can add my brain does not longer want to know about DirtyReactors&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1085</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manage passwords on Mac OS X</title>
		<link>http://www.themacaque.com/?p=1082&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=manage-passwords-on-mac-os-x</link>
		<comments>http://www.themacaque.com/?p=1082#comments</comments>
		<pubDate>Tue, 03 Apr 2012 08:54:06 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[darwin]]></category>
		<category><![CDATA[keyring]]></category>
		<category><![CDATA[Mac OS X]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1082</guid>
		<description><![CDATA[Due to a small project I&#8217;m developing at the moment I had to access the Mac OS X keyring over python. There is some code of seen around but was not very &#8216;clean&#8217;. The following is my attempt to access the Mac OS X Keyring via python using ctypes, I hope it helps someone out [...]]]></description>
				<content:encoded><![CDATA[<p>Due to a small project I&#8217;m developing at the moment I had to access the Mac OS X keyring over python. There is some code of seen around but was not very <em>&#8216;clean&#8217;</em>. The following is my attempt to access the Mac OS X Keyring via python using ctypes, I hope it helps someone out there:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> ctypes <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: black;">&#40;</span>
    byref<span style="color: #66cc66;">,</span>
    c_int32<span style="color: #66cc66;">,</span>
    c_uint32<span style="color: #66cc66;">,</span>
    c_void_p<span style="color: #66cc66;">,</span>
    create_string_buffer<span style="color: #66cc66;">,</span>
    memmove<span style="color: #66cc66;">,</span>
    cdll<span style="color: #66cc66;">,</span>
<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">from</span> ctypes.<span style="color: black;">util</span> <span style="color: #ff7700;font-weight:bold;">import</span> find_library
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> secrets.<span style="color: black;">utils</span> <span style="color: #ff7700;font-weight:bold;">import</span> are_not_none<span style="color: #66cc66;">,</span> valid_args
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># Types</span>
&nbsp;
OSStatus <span style="color: #66cc66;">=</span> c_int32
SecKeychainItemRef <span style="color: #66cc66;">=</span> c_void_p
SecKeychainRef <span style="color: #66cc66;">=</span> c_void_p
&nbsp;
<span style="color: #808080; font-style: italic;"># Constants</span>
&nbsp;
errSecSuccess <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span>
errSecItemNotFound <span style="color: #66cc66;">=</span> -<span style="color: #ff4500;">25300</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># Native libraries</span>
&nbsp;
_security <span style="color: #66cc66;">=</span> cdll.<span style="color: black;">LoadLibrary</span><span style="color: black;">&#40;</span>find_library<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Security'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
_core <span style="color: #66cc66;">=</span> cdll.<span style="color: black;">LoadLibrary</span><span style="color: black;">&#40;</span>find_library<span style="color: black;">&#40;</span><span style="color: #483d8b;">'CoreServices'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> keyring_is_open<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Assert that the keyring is not None.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> keyring_not_none<span style="color: black;">&#40;</span>name<span style="color: #66cc66;">,</span> value<span style="color: #66cc66;">,</span> method_name<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'Method'</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Ensure that the keyring is open.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>value<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">''</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Keyring most be open.'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> valid_args<span style="color: black;">&#40;</span>keyring_not_none<span style="color: #66cc66;">,</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Keyring'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Backend<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Keyring backend for Mac Os X.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create a new Mac OS X backend.&quot;&quot;&quot;</span>
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>Backend<span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">keychain</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _get_item<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> realm<span style="color: #66cc66;">,</span> username<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Return the item that matched the given info.&quot;&quot;&quot;</span>
        item <span style="color: #66cc66;">=</span> SecKeychainItemRef<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        status <span style="color: #66cc66;">=</span> _security.<span style="color: black;">SecKeychainFindGenericPassword</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">keychain</span><span style="color: #66cc66;">,</span>
                                         <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>realm<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> realm<span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>username<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
                                         username<span style="color: #66cc66;">,</span> <span style="color: #008000;">None</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">None</span><span style="color: #66cc66;">,</span> byref<span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> item<span style="color: #66cc66;">,</span> status
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Open the keyring.&quot;&quot;&quot;</span>
        <span style="color: #808080; font-style: italic;"># we should not be open</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">keychain</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">keychain</span> <span style="color: #66cc66;">=</span> SecKeychainRef<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># try to open the keyring</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> _security.<span style="color: black;">SecKeychainOpen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'login.keychain'</span><span style="color: #66cc66;">,</span> byref<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">keychain</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Can't access the keychain&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>keyring_is_open
    <span style="color: #ff7700;font-weight:bold;">def</span> close<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Close the keyring.&quot;&quot;&quot;</span>
        _core.<span style="color: black;">CFRelease</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">keychain</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">keychain</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #66cc66;">@</span>keyring_is_open
    <span style="color: #66cc66;">@</span>are_not_none<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'realm'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'username'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'password'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> set_password<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> realm<span style="color: #66cc66;">,</span> username<span style="color: #66cc66;">,</span> password<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Set the password for the given real and username.&quot;&quot;&quot;</span>
        item<span style="color: #66cc66;">,</span> status <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>._get_item<span style="color: black;">&#40;</span>realm<span style="color: #66cc66;">,</span> username<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> status <span style="color: #66cc66;">==</span> errSecItemNotFound:
            status <span style="color: #66cc66;">=</span> _security.<span style="color: black;">SecKeychainAddGenericPassword</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">keychain</span><span style="color: #66cc66;">,</span>
                                                <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>realm<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> realm<span style="color: #66cc66;">,</span>
                                                <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>username<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> username<span style="color: #66cc66;">,</span>
                                                <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>password<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> password<span style="color: #66cc66;">,</span> <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> status:
                <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>keyring_is_open
    <span style="color: #66cc66;">@</span>are_not_none<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'realm'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'username'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'password'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> update_password<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> realm<span style="color: #66cc66;">,</span> username<span style="color: #66cc66;">,</span> password<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Update the password for the given realm.&quot;&quot;&quot;</span>
        item<span style="color: #66cc66;">,</span> status <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>._get_item<span style="color: black;">&#40;</span>realm<span style="color: #66cc66;">,</span> username<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> status <span style="color: #ff7700;font-weight:bold;">and</span> status <span style="color: #66cc66;">==</span> errSecItemNotFound:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Can't store password in keychain&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            status <span style="color: #66cc66;">=</span> _security.<span style="color: black;">SecKeychainItemModifyAttributesAndData</span><span style="color: black;">&#40;</span>item<span style="color: #66cc66;">,</span> <span style="color: #008000;">None</span><span style="color: #66cc66;">,</span>
                                                <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>password<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> password<span style="color: black;">&#41;</span>
            _core.<span style="color: black;">CFRelease</span><span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> status:
                <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> status:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Can't store password in keychain&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #66cc66;">@</span>keyring_is_open
    <span style="color: #66cc66;">@</span>are_not_none<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'realm'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'username'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> get_password<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> realm<span style="color: #66cc66;">,</span> username<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Get the password for the given real and username.&quot;&quot;&quot;</span>
        length <span style="color: #66cc66;">=</span> c_uint32<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        data <span style="color: #66cc66;">=</span> c_void_p<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        status <span style="color: #66cc66;">=</span> _security.<span style="color: black;">SecKeychainFindGenericPassword</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">keychain</span><span style="color: #66cc66;">,</span>
                                          <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>realm<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> realm<span style="color: #66cc66;">,</span>
                                          <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>username<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> username<span style="color: #66cc66;">,</span>
                                          byref<span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> byref<span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> status <span style="color: #66cc66;">==</span> errSecSuccess:
            password <span style="color: #66cc66;">=</span> create_string_buffer<span style="color: black;">&#40;</span>length.<span style="color: black;">value</span><span style="color: black;">&#41;</span>
            memmove<span style="color: black;">&#40;</span>password<span style="color: #66cc66;">,</span> data.<span style="color: black;">value</span><span style="color: #66cc66;">,</span> length.<span style="color: black;">value</span><span style="color: black;">&#41;</span>
            password <span style="color: #66cc66;">=</span> password.<span style="color: black;">raw</span>
            _security.<span style="color: black;">SecKeychainItemFreeContent</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: #66cc66;">,</span> data<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> status <span style="color: #66cc66;">==</span> errSecItemNotFound:
            password <span style="color: #66cc66;">=</span> <span style="color: #008000;">None</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Can't fetch password from system&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> password
&nbsp;
    <span style="color: #66cc66;">@</span>keyring_is_open
    <span style="color: #66cc66;">@</span>are_not_none<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'realm'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span>
        <span style="color: black;">&#40;</span><span style="color: #483d8b;">'username'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> delete_password<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> realm<span style="color: #66cc66;">,</span> username<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Delete the password of the given real and username.&quot;&quot;&quot;</span>
        item<span style="color: #66cc66;">,</span> status <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>._get_item<span style="color: black;">&#40;</span>realm<span style="color: #66cc66;">,</span> username<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> status <span style="color: #66cc66;">==</span> errSecSuccess:
            _security.<span style="color: black;">SecKeychainItemDelete</span><span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span>
            _core.<span style="color: black;">CFRelease</span><span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>I have not added the code of the decorator because they are just noise, the only thing they do is to check that the keyring was indeed opened (self.keyring != None) and that the parameters with the given index are not None (I&#8217;m lazy and I prefer to use decorators for this mundane tasks that are done everywhere.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1082</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interesting issues with the PyQt twisted reactor</title>
		<link>http://www.themacaque.com/?p=1067&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=interesting-issues-with-the-pyqt-twisted-reactor</link>
		<comments>http://www.themacaque.com/?p=1067#comments</comments>
		<pubDate>Wed, 21 Mar 2012 11:21:50 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[PyQt]]></category>
		<category><![CDATA[twisted]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1067</guid>
		<description><![CDATA[On Windows Ubuntu One uses the twisted reactor to run the Qt UI. The main reason for this is that the IPC protocol that is used was written in twisted. This has been giving us a number of head aches like the one we experienced today. The following code simply shows a dialog that will [...]]]></description>
				<content:encoded><![CDATA[<p>On Windows Ubuntu One uses the twisted reactor to run the Qt UI. The main reason for this is that the IPC protocol that is used was written in twisted. This has been giving us a number of head aches like the one we experienced today.</p>
<p>The following code simply shows a dialog that will as the user for his proxy credentials and will store them in the key-ring of which ever platform is being used:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Main method used to show the creds dialog.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">sys</span>.<span style="color: #dc143c;">platform</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'win32'</span>:
        <span style="color: #ff7700;font-weight:bold;">import</span> qt4reactor
        qt4reactor.<span style="color: black;">install</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        logger.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Qt reactor installed.'</span><span style="color: black;">&#41;</span>
&nbsp;
    app <span style="color: #66cc66;">=</span> QApplication<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span>
    args <span style="color: #66cc66;">=</span> parse_args<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    win <span style="color: #66cc66;">=</span> ProxyCredsDialog<span style="color: black;">&#40;</span>domain<span style="color: #66cc66;">=</span>args.<span style="color: black;">domain</span><span style="color: #66cc66;">,</span>
                           retry<span style="color: #66cc66;">=</span>args.<span style="color: black;">retry</span><span style="color: black;">&#41;</span>
    return_code <span style="color: #66cc66;">=</span> win.<span style="color: black;">exec_</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">sys</span>.<span style="color: #dc143c;">platform</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'win32'</span>:
        <span style="color: #ff7700;font-weight:bold;">from</span> twisted.<span style="color: black;">internet</span> <span style="color: #ff7700;font-weight:bold;">import</span> reactor
        reactor.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span>return_code<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>From the dialog the most interesting part is the one in which the credentials are stored:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">@</span>defer.<span style="color: black;">inlineCallbacks</span>
<span style="color: #ff7700;font-weight:bold;">def</span> _on_save_clicked<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> *args<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Save the new credentials.&quot;&quot;&quot;</span>
    username <span style="color: #66cc66;">=</span> <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">ui</span>.<span style="color: black;">username_entry</span>.<span style="color: black;">text</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>
    password <span style="color: #66cc66;">=</span> <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">ui</span>.<span style="color: black;">password_entry</span>.<span style="color: black;">text</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>
    creds <span style="color: #66cc66;">=</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>username<span style="color: #66cc66;">=</span>username<span style="color: #66cc66;">,</span> password<span style="color: #66cc66;">=</span>password<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        logger.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Save credentials as for domain %s.'</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.<span style="color: black;">domain</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">keyring</span>.<span style="color: black;">set_credentials</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">domain</span><span style="color: #66cc66;">,</span> creds<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span><span style="color: #66cc66;">,</span> e:
        logger.<span style="color: black;">exception</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Could not set credentials:'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">done</span><span style="color: black;">&#40;</span>EXCEPTION_RAISED<span style="color: black;">&#41;</span>
    logger.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Stored creds'</span><span style="color: black;">&#41;</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">done</span><span style="color: black;">&#40;</span>USER_SUCCESS<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>And to give even more details, the following is what is used to spawn a thread to store the credentials on windows:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> set_credentials<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> app_name<span style="color: #66cc66;">,</span> cred<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Set the credentials of the Ubuntu SSO item.&quot;&quot;&quot;</span>
    <span style="color: #808080; font-style: italic;"># the windows keyring can only store a pair username-password</span>
    <span style="color: #808080; font-style: italic;"># so we store the data using ubuntu_sso as the user name. Then</span>
    <span style="color: #808080; font-style: italic;"># the cred will be stored as the string representation of the dict.</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> deferToThread<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">keyring</span>.<span style="color: black;">set_password</span><span style="color: #66cc66;">,</span> app_name<span style="color: #66cc66;">,</span> USERNAME<span style="color: #66cc66;">,</span>
                             dumps<span style="color: black;">&#40;</span>cred<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>A priori there is nothing wrong with the code, or is it? Doing an IRL test you will see that the credentials are never stored, what&#8217;s even more none of the deferreds are called. But why? In theory the qt reactor should be taking care of everything which includes the deferreds, the deferToThread and the execution of the ui.. well, it is not. When we look a little closer we can see that we use the exec_ method from the QDialog and this is the root of the bug. Lets put an example, the following is possible in Qt:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> PyQt4.<span style="color: black;">QtGui</span> <span style="color: #ff7700;font-weight:bold;">import</span> QApplication<span style="color: #66cc66;">,</span> QDialog
&nbsp;
app <span style="color: #66cc66;">=</span> QApplication<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span>
dialog <span style="color: #66cc66;">=</span> QDialog<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
dialog.<span style="color: black;">exec_</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>As you can see we are launching the dialog but we did not execute the application, but why is that? The main reason is found in the implementation of exec in the QDialog class (this time in C++, ouch!):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> QDialog<span style="color: #008080;">::</span><span style="color: #007788;">exec</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
     Q_D<span style="color: #008000;">&#40;</span>QDialog<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>d<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>eventLoop<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
         qWarning<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;QDialog::exec: Recursive call detected&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
&nbsp;
     <span style="color: #0000ff;">bool</span> deleteOnClose <span style="color: #000080;">=</span> testAttribute<span style="color: #008000;">&#40;</span>Qt<span style="color: #008080;">::</span><span style="color: #007788;">WA_DeleteOnClose</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     setAttribute<span style="color: #008000;">&#40;</span>Qt<span style="color: #008080;">::</span><span style="color: #007788;">WA_DeleteOnClose</span>, <span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
     <span style="color: #0000ff;">bool</span> wasShowModal <span style="color: #000080;">=</span> testAttribute<span style="color: #008000;">&#40;</span>Qt<span style="color: #008080;">::</span><span style="color: #007788;">WA_ShowModal</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     setAttribute<span style="color: #008000;">&#40;</span>Qt<span style="color: #008080;">::</span><span style="color: #007788;">WA_ShowModal</span>, <span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     setResult<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
     show<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
     QEventLoop eventLoop<span style="color: #008080;">;</span>
     d<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>eventLoop <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>eventLoop<span style="color: #008080;">;</span>
     <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> eventLoop.<span style="color: #007788;">exec</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     d<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>eventLoop <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
     setAttribute<span style="color: #008000;">&#40;</span>Qt<span style="color: #008080;">::</span><span style="color: #007788;">WA_ShowModal</span>, wasShowModal<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
     <span style="color: #0000ff;">int</span> res <span style="color: #000080;">=</span> result<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>deleteOnClose<span style="color: #008000;">&#41;</span>
         <span style="color: #0000dd;">delete</span> <span style="color: #0000dd;">this</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">return</span> res<span style="color: #008080;">;</span>
 <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>As you can see the implementation uses a QEventLoop, if you read the <a href="http://qt-project.org/doc/qt-4.8/QEventLoop.html">documentation</a> you will noticed that using exec of the event loops and the default flag all the events will me processed by this event loop, which is not the main event loop, but a child one (small brain fuck here). This means that, due to the implementation of the qtreactor, when using a dialog exec_ (or better say a QEventLoop.exec method) the reactor main loop is not processing the events which means that all your deferreds, deferToThread etc.. will not be processed <img src='http://www.themacaque.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Nevertheless there is a way to work around this bug in the qtreactor implementation (because is not the qt fault and it is well documented) which is doing the following workaround:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;">win <span style="color: #66cc66;">=</span> ProxyCredsDialog<span style="color: black;">&#40;</span>domain<span style="color: #66cc66;">=</span>args.<span style="color: black;">domain</span><span style="color: #66cc66;">,</span> retry<span style="color: #66cc66;">=</span>args.<span style="color: black;">retry</span><span style="color: black;">&#41;</span>
win.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
win.<span style="color: black;">finished</span>.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>exit_app<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>The above code ensures that the events will be handeled by the reactor main loop and not by a child QEventLoop.</p>
<p>In summary, qtreactor is buggy and will give you problems.. but if you really have to use it (like we do) do remember this detail, <b>DO NOT</b> use exec.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1067</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generating a self-signed SSL certificate</title>
		<link>http://www.themacaque.com/?p=1057&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=generating-a-self-signed-ssl-certificate</link>
		<comments>http://www.themacaque.com/?p=1057#comments</comments>
		<pubDate>Tue, 28 Feb 2012 15:47:53 +0000</pubDate>
		<dc:creator>mandel</dc:creator>
				<category><![CDATA[Canonical]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[certificate]]></category>
		<category><![CDATA[self-signed]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://www.themacaque.com/?p=1057</guid>
		<description><![CDATA[I have been writing some integration tests lately between Ubuntu One and proxies which use SSL certificates. The idea behind this tests was to be able to test that we deal correctly with those certificates that are not correct (notify the user, remember exceptions, etc..) For that I wrote this small function that I used [...]]]></description>
				<content:encoded><![CDATA[<p>I have been writing some integration tests lately between Ubuntu One and proxies which use SSL certificates. The idea behind this tests was to be able to test that we deal correctly with those certificates that are not correct (notify the user, remember exceptions, etc..) For that I wrote this small function that I used to generate the certificates.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><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
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">socket</span> <span style="color: #ff7700;font-weight:bold;">import</span> gethostname
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> OpenSSL <span style="color: #ff7700;font-weight:bold;">import</span> crypto
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> generate_self_signed_cert<span style="color: black;">&#40;</span>cert_dir<span style="color: #66cc66;">,</span> is_valid<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Generate a SSL certificate.
&nbsp;
    If the cert_path and the key_path are present they will be overwritten.
    &quot;&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>cert_dir<span style="color: black;">&#41;</span>:
        <span style="color: #dc143c;">os</span>.<span style="color: black;">makedirs</span><span style="color: black;">&#40;</span>cert_dir<span style="color: black;">&#41;</span>
    cert_path <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>cert_dir<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'squid.crt'</span><span style="color: black;">&#41;</span>
    key_path <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>cert_dir<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'squid.key'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>cert_path<span style="color: black;">&#41;</span>:
        <span style="color: #dc143c;">os</span>.<span style="color: black;">unlink</span><span style="color: black;">&#40;</span>cert_path<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>key_path<span style="color: black;">&#41;</span>:
        <span style="color: #dc143c;">os</span>.<span style="color: black;">unlink</span><span style="color: black;">&#40;</span>key_path<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># create a key pair</span>
    key <span style="color: #66cc66;">=</span> crypto.<span style="color: black;">PKey</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    key.<span style="color: black;">generate_key</span><span style="color: black;">&#40;</span>crypto.<span style="color: black;">TYPE_RSA</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1024</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># create a self-signed cert</span>
    cert <span style="color: #66cc66;">=</span> crypto.<span style="color: black;">X509</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    cert.<span style="color: black;">get_subject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">C</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'UK'</span>
    cert.<span style="color: black;">get_subject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">ST</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'London'</span>
    cert.<span style="color: black;">get_subject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">L</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'London'</span>
    cert.<span style="color: black;">get_subject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">O</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'Canonical'</span>
    cert.<span style="color: black;">get_subject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">OU</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'Ubuntu One'</span>
    cert.<span style="color: black;">get_subject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">CN</span> <span style="color: #66cc66;">=</span> gethostname<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">if</span> is_valid <span style="color: #ff7700;font-weight:bold;">else</span> gethostname<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>::-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
    cert.<span style="color: black;">set_serial_number</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span>
    cert.<span style="color: black;">gmtime_adj_notBefore</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
    cert.<span style="color: black;">gmtime_adj_notAfter</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span> * <span style="color: #ff4500;">365</span> * <span style="color: #ff4500;">24</span> * <span style="color: #ff4500;">60</span> * <span style="color: #ff4500;">60</span><span style="color: black;">&#41;</span> 
    cert.<span style="color: black;">set_issuer</span><span style="color: black;">&#40;</span>cert.<span style="color: black;">get_subject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    cert.<span style="color: black;">set_pubkey</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>
    cert.<span style="color: black;">sign</span><span style="color: black;">&#40;</span>key<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'sha1'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>cert_path<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'wt'</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> fd: 
        fd.<span style="color: black;">write</span><span style="color: black;">&#40;</span>crypto.<span style="color: black;">dump_certificate</span><span style="color: black;">&#40;</span>crypto.<span style="color: black;">FILETYPE_PEM</span><span style="color: #66cc66;">,</span> cert<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>key_path<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'wt'</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> fd: 
        fd.<span style="color: black;">write</span><span style="color: black;">&#40;</span>crypto.<span style="color: black;">dump_privatekey</span><span style="color: black;">&#40;</span>crypto.<span style="color: black;">FILETYPE_PEM</span><span style="color: #66cc66;">,</span> key<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> cert_path<span style="color: #66cc66;">,</span> key_path</pre></td></tr></table></div>

<p>I leave to the reader to modify the function to match their needs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.themacaque.com/?feed=rss2&#038;p=1057</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
