static void idle_finalize (GObject *object) { EmpathyIdlePriv *priv; priv = GET_PRIV (object); g_free (priv->status); g_free (priv->requested_status_message); if (priv->gs_proxy) { g_object_unref (priv->gs_proxy); } g_signal_handler_disconnect (priv->connectivity, priv->state_change_signal_id); priv->state_change_signal_id = 0; if (priv->manager != NULL) { g_signal_handler_disconnect (priv->manager, priv->idle_presence_changed_id); g_object_unref (priv->manager); } g_object_unref (priv->connectivity); g_hash_table_destroy (priv->connect_times); priv->connect_times = NULL; idle_ext_away_stop (EMPATHY_IDLE (object)); }
static void idle_finalize (GObject *object) { EmpathyIdlePriv *priv; priv = GET_PRIV (object); g_free (priv->status); if (priv->gs_proxy) { g_object_unref (priv->gs_proxy); } g_signal_handler_disconnect (priv->connectivity, priv->state_change_signal_id); priv->state_change_signal_id = 0; g_object_unref (priv->connectivity); idle_ext_away_stop (EMPATHY_IDLE (object)); }
static void idle_session_status_changed_cb (DBusGProxy *gs_proxy, SessionStatus status, EmpathyIdle *idle) { EmpathyIdlePriv *priv; gboolean is_idle; priv = GET_PRIV (idle); is_idle = (status == SESSION_STATUS_IDLE); DEBUG ("Session idle state changed, %s -> %s", priv->is_idle ? "yes" : "no", is_idle ? "yes" : "no"); if (!priv->auto_away || (priv->saved_state == TP_CONNECTION_PRESENCE_TYPE_UNSET && (priv->state <= TP_CONNECTION_PRESENCE_TYPE_OFFLINE || priv->state == TP_CONNECTION_PRESENCE_TYPE_HIDDEN))) { /* We don't want to go auto away OR we explicitely asked to be * offline, nothing to do here */ priv->is_idle = is_idle; return; } if (is_idle && !priv->is_idle) { TpConnectionPresenceType new_state; /* We are now idle */ idle_ext_away_start (idle); if (priv->saved_state != TP_CONNECTION_PRESENCE_TYPE_UNSET) { /* We are disconnected, when coming back from away * we want to restore the presence before the * disconnection. */ priv->away_saved_state = priv->saved_state; } else { priv->away_saved_state = priv->state; } new_state = TP_CONNECTION_PRESENCE_TYPE_AWAY; if (priv->state == TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY) { new_state = TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY; } DEBUG ("Going to autoaway. Saved state=%d, new state=%d", priv->away_saved_state, new_state); empathy_idle_set_state (idle, new_state); } else if (!is_idle && priv->is_idle) { const gchar *new_status; /* We are no more idle, restore state */ idle_ext_away_stop (idle); if (priv->away_saved_state == TP_CONNECTION_PRESENCE_TYPE_AWAY || priv->away_saved_state == TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY) { priv->away_saved_state = TP_CONNECTION_PRESENCE_TYPE_AVAILABLE; new_status = NULL; } else { new_status = priv->status; } /* Only try and set the presence if the away saved state is not * unset. This is an odd case because it means that the session * didn't notify us of the state change to idle, and as a * result, we couldn't save the current state at that time. */ if (priv->away_saved_state != TP_CONNECTION_PRESENCE_TYPE_UNSET) { DEBUG ("Restoring state to %d, reset status to %s", priv->away_saved_state, new_status); empathy_idle_set_presence (idle, priv->away_saved_state, new_status); } else { DEBUG ("Away saved state is unset. This means that we " "weren't told when the session went idle. " "As a result, I'm not trying to set presence"); } priv->away_saved_state = TP_CONNECTION_PRESENCE_TYPE_UNSET; } priv->is_idle = is_idle; }