aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy/empathy-idle.c68
-rw-r--r--libempathy/empathy-idle.h2
2 files changed, 70 insertions, 0 deletions
diff --git a/libempathy/empathy-idle.c b/libempathy/empathy-idle.c
index 481ae5ea6..7f68b7947 100644
--- a/libempathy/empathy-idle.c
+++ b/libempathy/empathy-idle.c
@@ -59,6 +59,7 @@ typedef struct {
guint ext_away_timeout;
TpAccountManager *manager;
+ GHashTable *connect_times;
TpConnectionPresenceType requested_presence_type;
gchar *requested_status_message;
@@ -307,6 +308,9 @@ idle_finalize (GObject *object)
g_object_unref (priv->connectivity);
+ g_hash_table_destroy (priv->connect_times);
+ priv->connect_times = NULL;
+
idle_ext_away_stop (EMPATHY_IDLE (object));
}
@@ -438,6 +442,30 @@ empathy_idle_class_init (EmpathyIdleClass *klass)
}
static void
+account_status_changed_cb (TpAccount *account,
+ guint old_status,
+ guint new_status,
+ guint reason,
+ gchar *dbus_error_name,
+ GHashTable *details,
+ gpointer user_data)
+{
+ EmpathyIdle *idle = EMPATHY_IDLE (user_data);
+ EmpathyIdlePriv *priv = GET_PRIV (idle);
+ GTimeVal val;
+
+ if (new_status != TP_CONNECTION_STATUS_CONNECTED) {
+ return;
+ }
+
+ g_get_current_time (&val);
+
+ g_hash_table_insert (priv->connect_times,
+ g_strdup (tp_proxy_get_object_path (account)),
+ GINT_TO_POINTER (val.tv_sec));
+}
+
+static void
account_manager_ready_cb (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
@@ -447,6 +475,7 @@ account_manager_ready_cb (GObject *source_object,
EmpathyIdlePriv *priv = GET_PRIV (idle);
TpConnectionPresenceType state;
gchar *status, *status_message;
+ GList *accounts, *l;
if (!tp_account_manager_prepare_finish (account_manager, result, NULL)) {
return;
@@ -458,6 +487,14 @@ account_manager_ready_cb (GObject *source_object,
idle_presence_changed_cb (account_manager, state, status,
status_message, idle);
+ accounts = tp_account_manager_get_valid_accounts (priv->manager);
+ for (l = accounts; l != NULL; l = l->next) {
+ empathy_signal_connect_weak (l->data, "status-changed",
+ G_CALLBACK (account_status_changed_cb),
+ G_OBJECT (idle));
+ }
+ g_list_free (accounts);
+
g_free (status);
g_free (status_message);
}
@@ -496,6 +533,9 @@ empathy_idle_init (EmpathyIdle *idle)
priv->connectivity = empathy_connectivity_dup_singleton ();
priv->state_change_signal_id = g_signal_connect (priv->connectivity,
"state-change", G_CALLBACK (idle_state_change_cb), idle);
+
+ priv->connect_times = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free, NULL);
}
EmpathyIdle *
@@ -674,3 +714,31 @@ empathy_idle_get_requested_presence (EmpathyIdle *idle,
return priv->requested_presence_type;
}
+
+gboolean
+empathy_idle_account_is_just_connected (EmpathyIdle *idle,
+ TpAccount *account)
+{
+ EmpathyIdlePriv *priv = GET_PRIV (idle);
+ GTimeVal val;
+ gpointer ptr;
+ glong t;
+
+ if (tp_account_get_connection_status (account, NULL)
+ != TP_CONNECTION_STATUS_CONNECTED) {
+ return FALSE;
+ }
+
+ ptr = g_hash_table_lookup (priv->connect_times,
+ tp_proxy_get_object_path (account));
+
+ if (ptr == NULL) {
+ return FALSE;
+ }
+
+ t = GPOINTER_TO_INT (ptr);
+
+ g_get_current_time (&val);
+
+ return (val.tv_sec - t) < 10;
+}
diff --git a/libempathy/empathy-idle.h b/libempathy/empathy-idle.h
index 8d565d036..1a8c313bc 100644
--- a/libempathy/empathy-idle.h
+++ b/libempathy/empathy-idle.h
@@ -69,6 +69,8 @@ TpConnectionPresenceType empathy_idle_get_requested_presence (EmpathyIdle *idle,
gchar **status,
gchar **status_message);
+gboolean empathy_idle_account_is_just_connected (EmpathyIdle *idle,
+ TpAccount *account);
G_END_DECLS