183
183
<div class="example">
184
184
<a name="account-manager"></a><p class="title"><b>Example 2. TpAccountManager example</b></p>
185
<div class="example-contents">
186
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
189
<td class="listing_lines" align="right"><pre>1
290
<td class="listing_code"><pre class="programlisting"><span class="comment">/*</span>
291
<span class="comment"> * contact-list</span>
292
<span class="comment"> *</span>
293
<span class="comment"> * Copyright © 2011 Collabora Ltd. </span><span class="url"><a href="<http://www.collabora.co.uk/>"><http://www.collabora.co.uk/></a></span>
294
<span class="comment"> *</span>
295
<span class="comment"> * Copying and distribution of this file, with or without modification,</span>
296
<span class="comment"> * are permitted in any medium without royalty provided the copyright</span>
297
<span class="comment"> * notice and this notice are preserved.</span>
298
<span class="comment"> */</span>
300
<span class="preproc">#include</span><span class="normal"> </span><span class="string"><telepathy-glib/telepathy-glib.h></span>
301
<span class="preproc">#include</span><span class="normal"> </span><span class="string"><telepathy-glib/debug.h></span>
303
<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
304
<span class="function">account_manager_prepared_cb</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GObject</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">object</span><span class="symbol">,</span>
305
<span class="normal"> </span><span class="usertype">GAsyncResult</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">res</span><span class="symbol">,</span>
306
<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> user_data</span><span class="symbol">)</span>
307
<span class="cbracket">{</span>
308
<span class="normal"> </span><span class="usertype">TpAccountManager</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">manager </span><span class="symbol">=</span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="telepathy-glib-account-manager.html#TpAccountManager">TpAccountManager</a> </span><span class="symbol">*)</span><span class="normal"> object</span><span class="symbol">;</span>
309
<span class="normal"> </span><span class="usertype">GMainLoop</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">loop </span><span class="symbol">=</span><span class="normal"> user_data</span><span class="symbol">;</span><span class="normal"> </span>
310
<span class="normal"> </span><span class="usertype">GList</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">accounts</span><span class="symbol">;</span>
311
<span class="normal"> </span><span class="usertype">GError</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">error </span><span class="symbol">=</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
313
<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(!</span><span class="function"><a href="telepathy-glib-proxy.html#tp-proxy-prepare-finish">tp_proxy_prepare_finish</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">object</span><span class="symbol">,</span><span class="normal"> res</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">error</span><span class="symbol">))</span>
314
<span class="normal"> </span><span class="cbracket">{</span>
315
<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"Error preparing AM: %s</span><span class="specialchar">\n</span><span class="string">"</span><span class="symbol">,</span><span class="normal"> error</span><span class="symbol">-></span><span class="normal">message</span><span class="symbol">);</span>
316
<span class="normal"> </span><span class="keyword">goto</span><span class="normal"> OUT</span><span class="symbol">;</span>
317
<span class="normal"> </span><span class="cbracket">}</span>
319
<span class="normal"> </span><span class="keyword">for</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">accounts </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="telepathy-glib-account-manager.html#tp-account-manager-get-valid-accounts">tp_account_manager_get_valid_accounts</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">manager</span><span class="symbol">);</span>
320
<span class="normal"> accounts </span><span class="symbol">!=</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span><span class="normal"> accounts </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#g-list-delete-link">g_list_delete_link</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">accounts</span><span class="symbol">,</span><span class="normal"> accounts</span><span class="symbol">))</span>
321
<span class="normal"> </span><span class="cbracket">{</span>
322
<span class="normal"> </span><span class="usertype">TpAccount</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">account </span><span class="symbol">=</span><span class="normal"> accounts</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">;</span>
323
<span class="normal"> </span><span class="usertype">TpConnection</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">connection </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="telepathy-glib-account.html#tp-account-get-connection">tp_account_get_connection</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">account</span><span class="symbol">);</span>
324
<span class="normal"> </span><span class="usertype">GPtrArray</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">contacts</span><span class="symbol">;</span>
325
<span class="normal"> </span><span class="usertype">guint</span><span class="normal"> i</span><span class="symbol">;</span>
327
<span class="normal"> </span><span class="comment">/* Verify account is online and received its contact list. If state is not</span>
328
<span class="comment"> * SUCCESS this means we didn't received the roster from server yet and</span>
329
<span class="comment"> * we would have to wait for the "notify:contact-list-state" signal. */</span>
330
<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">connection </span><span class="symbol">==</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a> </span><span class="symbol">||</span>
331
<span class="normal"> </span><span class="function"><a href="telepathy-glib-connection.html#tp-connection-get-contact-list-state">tp_connection_get_contact_list_state</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">connection</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">!=</span>
332
<span class="normal"> <a href="telepathy-glib-enums.html#TP-CONTACT-LIST-STATE-SUCCESS:CAPS">TP_CONTACT_LIST_STATE_SUCCESS</a></span><span class="symbol">)</span>
333
<span class="normal"> </span><span class="keyword">continue</span><span class="symbol">;</span>
335
<span class="normal"> contacts </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="telepathy-glib-connection.html#tp-connection-dup-contact-list">tp_connection_dup_contact_list</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">connection</span><span class="symbol">);</span>
336
<span class="normal"> </span><span class="keyword">for</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">i </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span><span class="normal"> i </span><span class="symbol"><</span><span class="normal"> contacts</span><span class="symbol">-></span><span class="normal">len</span><span class="symbol">;</span><span class="normal"> i</span><span class="symbol">++)</span>
337
<span class="normal"> </span><span class="cbracket">{</span>
338
<span class="normal"> </span><span class="usertype">TpContact</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">contact </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Pointer-Arrays.html#g-ptr-array-index">g_ptr_array_index</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">contacts</span><span class="symbol">,</span><span class="normal"> i</span><span class="symbol">);</span>
339
<span class="normal"> </span><span class="keyword">const</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar">gchar</a> </span><span class="symbol">*</span><span class="normal"> </span><span class="keyword">const</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">groups</span><span class="symbol">;</span>
341
<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"contact %s (%s) in groups:</span><span class="specialchar">\n</span><span class="string">"</span><span class="symbol">,</span>
342
<span class="normal"> </span><span class="function"><a href="telepathy-glib-contact.html#tp-contact-get-identifier">tp_contact_get_identifier</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">contact</span><span class="symbol">),</span>
343
<span class="normal"> </span><span class="function"><a href="telepathy-glib-contact.html#tp-contact-get-alias">tp_contact_get_alias</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">contact</span><span class="symbol">));</span>
345
<span class="normal"> </span><span class="keyword">for</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">groups </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="telepathy-glib-contact.html#tp-contact-get-contact-groups">tp_contact_get_contact_groups</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">contact</span><span class="symbol">);</span>
346
<span class="normal"> </span><span class="symbol">*</span><span class="normal">groups </span><span class="symbol">!=</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span><span class="normal"> groups</span><span class="symbol">++)</span>
347
<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">" %s</span><span class="specialchar">\n</span><span class="string">"</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">groups</span><span class="symbol">);</span>
348
<span class="normal"> </span><span class="cbracket">}</span>
349
<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Pointer-Arrays.html#g-ptr-array-unref">g_ptr_array_unref</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">contacts</span><span class="symbol">);</span>
350
<span class="normal"> </span><span class="cbracket">}</span>
352
<span class="label">OUT:</span>
353
<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-quit">g_main_loop_quit</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">loop</span><span class="symbol">);</span>
354
<span class="cbracket">}</span>
356
<span class="type">int</span>
357
<span class="function">main</span><span class="normal"> </span><span class="symbol">(</span><span class="type">int</span><span class="normal"> argc</span><span class="symbol">,</span>
358
<span class="normal"> </span><span class="type">char</span><span class="normal"> </span><span class="symbol">**</span><span class="normal">argv</span><span class="symbol">)</span>
359
<span class="cbracket">{</span>
360
<span class="normal"> </span><span class="usertype">TpAccountManager</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">manager</span><span class="symbol">;</span>
361
<span class="normal"> </span><span class="usertype">TpSimpleClientFactory</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">factory</span><span class="symbol">;</span>
362
<span class="normal"> </span><span class="usertype">GMainLoop</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">loop</span><span class="symbol">;</span>
364
<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#g-type-init">g_type_init</a></span><span class="normal"> </span><span class="symbol">();</span>
365
<span class="normal"> </span><span class="function"><a href="telepathy-glib-debug.html#tp-debug-set-flags">tp_debug_set_flags</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Miscellaneous-Utility-Functions.html#g-getenv">g_getenv</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"EXAMPLE_DEBUG"</span><span class="symbol">));</span>
367
<span class="normal"> loop </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-new">g_main_loop_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">,</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS">FALSE</a></span><span class="symbol">);</span>
369
<span class="normal"> manager </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="telepathy-glib-account-manager.html#tp-account-manager-dup">tp_account_manager_dup</a></span><span class="normal"> </span><span class="symbol">();</span>
370
<span class="normal"> factory </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="telepathy-glib-proxy.html#tp-proxy-get-factory">tp_proxy_get_factory</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">manager</span><span class="symbol">);</span>
371
<span class="normal"> </span><span class="function"><a href="telepathy-glib-simple-client-factory.html#tp-simple-client-factory-add-account-features-varargs">tp_simple_client_factory_add_account_features_varargs</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">factory</span><span class="symbol">,</span>
372
<span class="normal"> <a href="telepathy-glib-account.html#TP-ACCOUNT-FEATURE-CONNECTION:CAPS">TP_ACCOUNT_FEATURE_CONNECTION</a></span><span class="symbol">,</span>
373
<span class="normal"> </span><span class="number">0</span><span class="symbol">);</span>
374
<span class="normal"> </span><span class="function"><a href="telepathy-glib-simple-client-factory.html#tp-simple-client-factory-add-connection-features-varargs">tp_simple_client_factory_add_connection_features_varargs</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">factory</span><span class="symbol">,</span>
375
<span class="normal"> <a href="telepathy-glib-connection.html#TP-CONNECTION-FEATURE-CONTACT-LIST:CAPS">TP_CONNECTION_FEATURE_CONTACT_LIST</a></span><span class="symbol">,</span>
376
<span class="normal"> </span><span class="number">0</span><span class="symbol">);</span>
377
<span class="normal"> </span><span class="function"><a href="telepathy-glib-simple-client-factory.html#tp-simple-client-factory-add-contact-features-varargs">tp_simple_client_factory_add_contact_features_varargs</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">factory</span><span class="symbol">,</span>
378
<span class="normal"> <a href="telepathy-glib-contact.html#TP-CONTACT-FEATURE-ALIAS:CAPS">TP_CONTACT_FEATURE_ALIAS</a></span><span class="symbol">,</span>
379
<span class="normal"> <a href="telepathy-glib-contact.html#TP-CONTACT-FEATURE-CONTACT-GROUPS:CAPS">TP_CONTACT_FEATURE_CONTACT_GROUPS</a></span><span class="symbol">,</span>
380
<span class="normal"> <a href="telepathy-glib-contact.html#TP-CONTACT-FEATURE-INVALID:CAPS">TP_CONTACT_FEATURE_INVALID</a></span><span class="symbol">);</span>
382
<span class="normal"> </span><span class="function"><a href="telepathy-glib-proxy.html#tp-proxy-prepare-async">tp_proxy_prepare_async</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">manager</span><span class="symbol">,</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">,</span><span class="normal"> account_manager_prepared_cb</span><span class="symbol">,</span><span class="normal"> loop</span><span class="symbol">);</span>
384
<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-run">g_main_loop_run</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">loop</span><span class="symbol">);</span>
386
<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-unref">g_object_unref</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">manager</span><span class="symbol">);</span>
387
<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-unref">g_main_loop_unref</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">loop</span><span class="symbol">);</span>
389
<span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
390
<span class="cbracket">}</span></pre></td>
185
<div class="example-contents"><pre class="programlisting">/*
188
* Copyright © 2011 Collabora Ltd. <http://www.collabora.co.uk/>
190
* Copying and distribution of this file, with or without modification,
191
* are permitted in any medium without royalty provided the copyright
192
* notice and this notice are preserved.
195
#include <telepathy-glib/telepathy-glib.h>
196
#include <telepathy-glib/debug.h>
199
account_manager_prepared_cb (GObject *object,
203
TpAccountManager *manager = (TpAccountManager *) object;
204
GMainLoop *loop = user_data;
206
GError *error = NULL;
208
if (!tp_proxy_prepare_finish (object, res, &error))
210
g_print ("Error preparing AM: %s\n", error->message);
214
for (accounts = tp_account_manager_get_valid_accounts (manager);
215
accounts != NULL; accounts = g_list_delete_link (accounts, accounts))
217
TpAccount *account = accounts->data;
218
TpConnection *connection = tp_account_get_connection (account);
222
/* Verify account is online and received its contact list. If state is not
223
* SUCCESS this means we didn't received the roster from server yet and
224
* we would have to wait for the "notify:contact-list-state" signal. */
225
if (connection == NULL ||
226
tp_connection_get_contact_list_state (connection) !=
227
TP_CONTACT_LIST_STATE_SUCCESS)
230
contacts = tp_connection_dup_contact_list (connection);
231
for (i = 0; i < contacts->len; i++)
233
TpContact *contact = g_ptr_array_index (contacts, i);
234
const gchar * const *groups;
236
g_print ("contact %s (%s) in groups:\n",
237
tp_contact_get_identifier (contact),
238
tp_contact_get_alias (contact));
240
for (groups = tp_contact_get_contact_groups (contact);
241
*groups != NULL; groups++)
242
g_print (" %s\n", *groups);
244
g_ptr_array_unref (contacts);
248
g_main_loop_quit (loop);
255
TpAccountManager *manager;
256
TpSimpleClientFactory *factory;
260
tp_debug_set_flags (g_getenv ("EXAMPLE_DEBUG"));
262
loop = g_main_loop_new (NULL, FALSE);
264
manager = tp_account_manager_dup ();
265
factory = tp_proxy_get_factory (manager);
266
tp_simple_client_factory_add_account_features_varargs (factory,
267
TP_ACCOUNT_FEATURE_CONNECTION,
269
tp_simple_client_factory_add_connection_features_varargs (factory,
270
TP_CONNECTION_FEATURE_CONTACT_LIST,
272
tp_simple_client_factory_add_contact_features_varargs (factory,
273
TP_CONTACT_FEATURE_ALIAS,
274
TP_CONTACT_FEATURE_CONTACT_GROUPS,
275
TP_CONTACT_FEATURE_INVALID);
277
tp_proxy_prepare_async (manager, NULL, account_manager_prepared_cb, loop);
279
g_main_loop_run (loop);
281
g_object_unref (manager);
282
g_main_loop_unref (loop);
397
288
<p><br class="example-break">