diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2011-01-10 18:02:02 +0800 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2011-01-10 18:02:02 +0800 |
commit | 363c9bdf35a11cde6ba7a0da3bc2cb7fcdb7a1b6 (patch) | |
tree | 0db8c671e8825d5343053b37c2a3b3e196c8b176 /libempathy-gtk | |
parent | d5f5cfab4704fad9fad29a1e69a230645f0a4aa5 (diff) | |
parent | 98b73f3620f3b2f94e7d2ce3cfd2cd07cc637d13 (diff) | |
download | gsoc2013-empathy-363c9bdf35a11cde6ba7a0da3bc2cb7fcdb7a1b6.tar gsoc2013-empathy-363c9bdf35a11cde6ba7a0da3bc2cb7fcdb7a1b6.tar.gz gsoc2013-empathy-363c9bdf35a11cde6ba7a0da3bc2cb7fcdb7a1b6.tar.bz2 gsoc2013-empathy-363c9bdf35a11cde6ba7a0da3bc2cb7fcdb7a1b6.tar.lz gsoc2013-empathy-363c9bdf35a11cde6ba7a0da3bc2cb7fcdb7a1b6.tar.xz gsoc2013-empathy-363c9bdf35a11cde6ba7a0da3bc2cb7fcdb7a1b6.tar.zst gsoc2013-empathy-363c9bdf35a11cde6ba7a0da3bc2cb7fcdb7a1b6.zip |
Merge remote branch 'glassrose/accounts-supporting-chatrooms-only-603027'
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-account-chooser.c | 71 | ||||
-rw-r--r-- | libempathy-gtk/empathy-account-chooser.h | 4 |
2 files changed, 75 insertions, 0 deletions
diff --git a/libempathy-gtk/empathy-account-chooser.c b/libempathy-gtk/empathy-account-chooser.c index f1c0ec6b4..809c2933a 100644 --- a/libempathy-gtk/empathy-account-chooser.c +++ b/libempathy-gtk/empathy-account-chooser.c @@ -957,6 +957,77 @@ empathy_account_chooser_filter_is_connected ( callback (is_connected, callback_data); } +typedef struct { + EmpathyAccountChooserFilterResultCallback callback; + gpointer user_data; +} FilterCallbackData; + +static void +conn_prepared_cb (GObject *conn, + GAsyncResult *result, + gpointer user_data) +{ + FilterCallbackData *data = user_data; + GError *myerr = NULL; + TpCapabilities *caps; + + if (!tp_proxy_prepare_finish (conn, result, &myerr)) { + data->callback (FALSE, data->user_data); + g_slice_free (FilterCallbackData, data); + return; + } + + caps = tp_connection_get_capabilities (TP_CONNECTION (conn)); + data->callback (tp_capabilities_supports_text_chatrooms (caps), + data->user_data); + + g_slice_free (FilterCallbackData, data); +} + +/** + * empathy_account_chooser_filter_supports_multichat: + * @account: a #TpAccount + * @callback: an #EmpathyAccountChooserFilterResultCallback accepting the result + * @callback_data: data passed to the @callback + * @user_data: user data or %NULL + * + * An #EmpathyAccountChooserFilterFunc that returns accounts that both + * support multiuser text chat and are connected. + * + * Returns (via the callback) TRUE if @account both supports muc and is connected + */ +void +empathy_account_chooser_filter_supports_chatrooms ( + TpAccount *account, + EmpathyAccountChooserFilterResultCallback callback, + gpointer callback_data, + gpointer user_data) +{ + TpConnection *connection; + FilterCallbackData *cb_data; + GQuark features[] = { TP_CONNECTION_FEATURE_CAPABILITIES, 0 }; + + if (tp_account_get_connection_status (account, NULL) != + TP_CONNECTION_STATUS_CONNECTED) { + callback (FALSE, callback_data); + return; + } + + /* check if CM supports multiuser text chat */ + connection = tp_account_get_connection (account); + if (connection == NULL) { + callback (FALSE, callback_data); + return; + } + + cb_data = g_slice_new0 (FilterCallbackData); + cb_data->callback = callback; + cb_data->user_data = callback_data; + + tp_proxy_prepare_async (connection, features, conn_prepared_cb, + cb_data); +} + gboolean empathy_account_chooser_is_ready (EmpathyAccountChooser *self) { diff --git a/libempathy-gtk/empathy-account-chooser.h b/libempathy-gtk/empathy-account-chooser.h index dfd372c3e..04e6230bd 100644 --- a/libempathy-gtk/empathy-account-chooser.h +++ b/libempathy-gtk/empathy-account-chooser.h @@ -91,6 +91,10 @@ void empathy_account_chooser_filter_is_connected (TpAccount EmpathyAccountChooserFilterResultCallback callback, gpointer callback_data, gpointer user_data); +void empathy_account_chooser_filter_supports_chatrooms (TpAccount *account, + EmpathyAccountChooserFilterResultCallback callback, + gpointer callback_data, + gpointer user_data); gboolean empathy_account_chooser_is_ready (EmpathyAccountChooser *chooser); G_END_DECLS |