}
+static void
+account_manager_ensure_all_accounts (EmpathyAccountManager *manager,
+ GPtrArray *accounts)
+{
+ int i, missing_accounts;
+ GHashTableIter iter;
+ EmpathyAccountManagerPriv *priv = GET_PRIV (manager);
+ gpointer value;
+ EmpathyAccount *account;
+ gboolean found = FALSE;
+ const gchar *name;
+
+ /* ensure all accounts coming from MC5 first */
+ for (i = 0; i < accounts->len; i++)
+ {
+ name = g_ptr_array_index (accounts, i);
+
+ account = empathy_account_manager_ensure_account (manager, name);
+ empathy_account_refresh_properties (account);
+ }
+
+ missing_accounts = empathy_account_manager_get_count (manager) -
+ accounts->len;
+
+ if (missing_accounts > 0)
+ {
+ /* look for accounts we have and the Tp AccountManager doesn't,
+ * and remove them from our cache.
+ */
+
+ DEBUG ("%d missing accounts", missing_accounts);
+
+ g_hash_table_iter_init (&iter, priv->accounts);
+
+ while (g_hash_table_iter_next (&iter, NULL, &value) &&
+ missing_accounts > 0)
+ {
+ account = value;
+
+ /* look for this account in the AccountManager provided array */
+ for (i = 0; i < accounts->len; i++)
+ {
+ name = g_ptr_array_index (accounts, i);
+
+ if (!tp_strdiff
+ (name, empathy_account_get_unique_name (account)))
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ DEBUG ("Account %s was not found, remove it from the cache",
+ empathy_account_get_unique_name (account));
+
+ g_object_ref (account);
+ g_hash_table_iter_remove (&iter);
+ g_signal_emit (manager, signals[ACCOUNT_DELETED], 0, account);
+ g_object_unref (account);
+
+ missing_accounts--;
+ }
+
+ found = FALSE;
+ }
+ }
+}
+
static void
account_manager_got_all_cb (TpProxy *proxy,
GHashTable *properties,
{
EmpathyAccountManager *manager = EMPATHY_ACCOUNT_MANAGER (weak_object);
GPtrArray *accounts;
- int i;
if (error != NULL)
{
EMPATHY_ARRAY_TYPE_OBJECT);
if (accounts != NULL)
- {
- for (i = 0; i < accounts->len; i++)
- {
- gchar *name = g_ptr_array_index (accounts, i);
-
- empathy_account_manager_ensure_account (manager, name);
- }
- }
+ account_manager_ensure_all_accounts (manager, accounts);
empathy_account_manager_check_ready (manager);
}
empathy_account_manager_ensure_account (manager, path);
}
+static void
+account_manager_start_mc5 (TpDBusDaemon *bus)
+{
+ TpProxy *mc5_proxy;
+
+ /* trigger MC5 starting */
+ mc5_proxy = g_object_new (TP_TYPE_PROXY,
+ "dbus-daemon", bus,
+ "dbus-connection", tp_proxy_get_dbus_connection (TP_PROXY (bus)),
+ "bus-name", MC5_BUS_NAME,
+ "object-path", "/",
+ NULL);
+
+ tp_cli_dbus_peer_call_ping (mc5_proxy, -1, NULL, NULL, NULL, NULL);
+
+ g_object_unref (mc5_proxy);
+}
+
static void
account_manager_name_owner_cb (TpDBusDaemon *proxy,
const gchar *name,
EmpathyAccountManager *manager = EMPATHY_ACCOUNT_MANAGER (user_data);
EmpathyAccountManagerPriv *priv = GET_PRIV (manager);
- tp_dbus_daemon_cancel_name_owner_watch (proxy, name,
- account_manager_name_owner_cb, user_data);
+ DEBUG ("Name owner changed for %s, new name: %s", name, new_owner);
- priv->tp_manager = tp_account_manager_new (priv->dbus);
+ if (EMP_STR_EMPTY (new_owner))
+ {
+ /* MC5 quit or crashed for some reason, let's start it again */
+ account_manager_start_mc5 (priv->dbus);
- tp_cli_account_manager_connect_to_account_validity_changed (
- priv->tp_manager,
- account_validity_changed_cb,
- NULL,
- NULL,
- G_OBJECT (manager),
- NULL);
+ g_object_unref (priv->tp_manager);
+ priv->tp_manager = NULL;
+ return;
+ }
- tp_cli_dbus_properties_call_get_all (priv->tp_manager, -1,
- TP_IFACE_ACCOUNT_MANAGER,
- account_manager_got_all_cb,
- NULL,
- NULL,
- G_OBJECT (manager));
+ if (priv->tp_manager == NULL)
+ {
+ priv->tp_manager = tp_account_manager_new (priv->dbus);
+
+ tp_cli_account_manager_connect_to_account_validity_changed (
+ priv->tp_manager,
+ account_validity_changed_cb,
+ NULL,
+ NULL,
+ G_OBJECT (manager),
+ NULL);
+
+ tp_cli_dbus_properties_call_get_all (priv->tp_manager, -1,
+ TP_IFACE_ACCOUNT_MANAGER,
+ account_manager_got_all_cb,
+ NULL,
+ NULL,
+ G_OBJECT (manager));
+ }
}
static void
empathy_account_manager_init (EmpathyAccountManager *manager)
{
EmpathyAccountManagerPriv *priv;
- TpProxy *mc5_proxy;
priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
EMPATHY_TYPE_ACCOUNT_MANAGER, EmpathyAccountManagerPriv);
manager,
NULL);
- /* trigger MC5 starting */
- mc5_proxy = g_object_new (TP_TYPE_PROXY,
- "dbus-daemon", priv->dbus,
- "dbus-connection", tp_proxy_get_dbus_connection (TP_PROXY (priv->dbus)),
- "bus-name", MC5_BUS_NAME,
- "object-path", "/",
- NULL);
-
- tp_cli_dbus_peer_call_ping (mc5_proxy, -1, NULL, NULL, NULL, NULL);
-
- g_object_unref (mc5_proxy);
+ account_manager_start_mc5 (priv->dbus);
}
static void
if (!manager_singleton)
{
- retval = G_OBJECT_CLASS (empathy_account_manager_parent_class)->constructor (type,
- n_construct_params,
- construct_params);
+ retval = G_OBJECT_CLASS
+ (empathy_account_manager_parent_class)->constructor (type,
+ n_construct_params, construct_params);
manager_singleton = EMPATHY_ACCOUNT_MANAGER (retval);
g_object_add_weak_pointer (retval, (gpointer) &manager_singleton);
}
}
int
-empathy_account_manager_get_connecting_accounts (EmpathyAccountManager *manager)
+empathy_account_manager_get_connecting_accounts (
+ EmpathyAccountManager *manager)
{
EmpathyAccountManagerPriv *priv;
{
EmpathyAccount *account = EMPATHY_ACCOUNT (weak_object);
- DEBUG ("Got initial set of properties for %s",
+ DEBUG ("Got whole set of properties for %s",
empathy_account_get_unique_name (account));
if (error != NULL)
empathy_account_removed_cb,
NULL, NULL, object, NULL);
- tp_cli_dbus_properties_call_get_all (priv->account, -1,
- TP_IFACE_ACCOUNT,
- empathy_account_got_all_cb,
- NULL,
- NULL,
- G_OBJECT (account));
+ empathy_account_refresh_properties (account);
}
static void empathy_account_dispose (GObject *object);
return;
}
- acc_manager = empathy_account_manager_dup_singleton ();
- presence = empathy_account_manager_get_requested_global_presence
- (acc_manager, &status, &status_message);
+ if (enabled)
+ {
+ acc_manager = empathy_account_manager_dup_singleton ();
+ presence = empathy_account_manager_get_requested_global_presence
+ (acc_manager, &status, &status_message);
- if (presence != TP_CONNECTION_PRESENCE_TYPE_UNSET)
- empathy_account_request_presence (account, presence, status,
- status_message);
+ if (presence != TP_CONNECTION_PRESENCE_TYPE_UNSET)
+ empathy_account_request_presence (account, presence, status,
+ status_message);
- g_object_unref (acc_manager);
- g_free (status);
- g_free (status_message);
+ g_object_unref (acc_manager);
+ g_free (status);
+ g_free (status_message);
+ }
g_value_init (&value, G_TYPE_BOOLEAN);
g_value_set_boolean (&value, enabled);
return TRUE;
}
+void
+empathy_account_refresh_properties (EmpathyAccount *account)
+{
+ EmpathyAccountPriv *priv;
+
+ g_return_if_fail (EMPATHY_IS_ACCOUNT (account));
+
+ priv = GET_PRIV (account);
+
+ tp_cli_dbus_properties_call_get_all (priv->account, -1,
+ TP_IFACE_ACCOUNT,
+ empathy_account_got_all_cb,
+ NULL,
+ NULL,
+ G_OBJECT (account));
+}