summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVivek Dasmohapatra <vivek@collabora.co.uk>2011-07-22 13:25:16 +0100
committerVivek Dasmohapatra <vivek@collabora.co.uk>2011-07-22 13:25:16 +0100
commit597ed3fd7605bce7b06f6d127c1a90b7fc14f8de (patch)
tree6b5b13d87b0fd9569fbcc19ab869032836be4ce9
parentcb92278fc5f001e5330e6d0e6deb410379ff809c (diff)
parent149523e89c42cea1cb61c1baa682c623a44e4893 (diff)
Merge branch 'unconditional-accounts-skip-too-many-transport-checks' into telepathy-mission-control-5.8+telepathy-mission-control-5.8.0
-rw-r--r--src/mcd-master.c71
1 files changed, 47 insertions, 24 deletions
diff --git a/src/mcd-master.c b/src/mcd-master.c
index 3b846223..e230bceb 100644
--- a/src/mcd-master.c
+++ b/src/mcd-master.c
@@ -705,42 +705,65 @@ _mcd_master_account_replace_transport (McdMaster *master,
{
McdMasterPrivate *priv = MCD_MASTER_PRIV (master);
GHashTable *conditions;
- gboolean ret = FALSE;
+ gboolean connected = FALSE;
+ gboolean unconditional = FALSE;
+ const gchar *name;
+ const guint n_plugins = priv->transport_plugins->len;
+ guint n_conds;
+ guint i;
g_return_val_if_fail (MCD_IS_ACCOUNT (account), FALSE);
+ /* no transport plugins, decision is always "go for it" */
+ if (n_plugins == 0)
+ return TRUE;
+
+ name = mcd_account_get_unique_name (account);
+
+ if (_mcd_account_needs_dispatch (account))
+ {
+ DEBUG ("Always-dispatchable account %s needs no transport", name);
+ return TRUE;
+ }
+
conditions = mcd_account_get_conditions (account);
- if (g_hash_table_size (conditions) == 0)
- ret = TRUE;
- else
+ n_conds = g_hash_table_size (conditions);
+ unconditional = (n_conds == 0);
+
+ DEBUG ("Checking %s [%u conditions, %u plugins]", name, n_conds, n_plugins);
+
+ for (i = 0; !connected && i < priv->transport_plugins->len; i++)
{
- guint i;
- for (i = 0; i < priv->transport_plugins->len; i++)
+ McdTransportPlugin *plugin;
+ const GList *transports;
+
+ plugin = g_ptr_array_index (priv->transport_plugins, i);
+ transports = mcd_transport_plugin_get_transports (plugin);
+
+ while (transports != NULL)
{
- McdTransportPlugin *plugin;
- const GList *transports;
+ McdTransport *transport = transports->data;
+ McdTransportStatus status =
+ mcd_transport_get_status (plugin, transport);
+
+ transports = g_list_next (transports);
+
+ if (status != MCD_TRANSPORT_STATUS_CONNECTED)
+ continue;
- plugin = g_ptr_array_index (priv->transport_plugins, i);
- transports = mcd_transport_plugin_get_transports (plugin);
- while (transports)
+ if (unconditional ||
+ mcd_transport_plugin_check_conditions (plugin, transport,
+ conditions))
{
- McdTransport *transport = transports->data;
- if (mcd_transport_get_status (plugin, transport) ==
- MCD_TRANSPORT_STATUS_CONNECTED &&
- mcd_transport_plugin_check_conditions (plugin, transport,
- conditions))
- {
- mcd_account_connection_bind_transport (account, transport);
- ret = TRUE;
- goto finish;
- }
- transports = transports->next;
+ mcd_account_connection_bind_transport (account, transport);
+ connected = TRUE;
+ break;
}
}
}
-finish:
+
g_hash_table_unref (conditions);
- return ret;
+ return connected;
}
gboolean