static void empathy_account_constructed (GObject *object) { EmpathyAccount *account = EMPATHY_ACCOUNT (object); EmpathyAccountPriv *priv = GET_PRIV (account); priv->account = tp_account_new (priv->dbus, priv->unique_name, NULL); g_signal_connect (priv->account, "invalidated", G_CALLBACK (account_invalidated_cb), object); empathy_account_parse_unique_name (priv->unique_name, &(priv->proto_name), &(priv->cm_name)); priv->icon_name = empathy_protocol_icon_name (priv->proto_name); tp_cli_account_connect_to_account_property_changed (priv->account, empathy_account_properties_changed, NULL, NULL, object, NULL); tp_cli_account_connect_to_removed (priv->account, empathy_account_removed_cb, NULL, NULL, object, NULL); empathy_account_refresh_properties (account); }
static void protocol_choosers_add_cm (EmpathyProtocolChooser *chooser, TpConnectionManager *cm) { EmpathyProtocolChooserPriv *priv = GET_PRIV (chooser); const TpConnectionManagerProtocol * const *iter; for (iter = cm->protocols; iter != NULL && *iter != NULL; iter++) { const TpConnectionManagerProtocol *proto = *iter; gchar *icon_name; const gchar *display_name; const gchar *saved_cm_name; saved_cm_name = g_hash_table_lookup (priv->protocols, proto->name); if (!tp_strdiff (cm->name, "haze") && saved_cm_name != NULL && tp_strdiff (saved_cm_name, "haze")) /* the CM we're adding is a haze implementation of something we already * have; drop it. */ continue; if (!tp_strdiff (cm->name, "haze") && !tp_strdiff (proto->name, "facebook")) /* Facebook now supports XMPP so drop the purple facebook plugin; user * should use Gabble */ continue; if (!tp_strdiff (cm->name, "haze") && !tp_strdiff (proto->name, "sip")) /* Haze's SIP implementation is pretty useless (bgo #629736) */ continue; if (tp_strdiff (cm->name, "haze") && !tp_strdiff (saved_cm_name, "haze")) { GtkTreeIter titer; gboolean valid; TpConnectionManager *haze_cm; /* let's this CM replace the haze implementation */ valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->store), &titer); while (valid) { gchar *haze_proto_name = NULL; gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &titer, COL_PROTOCOL_NAME, &haze_proto_name, COL_CM, &haze_cm, -1); if (haze_cm == NULL) continue; if (!tp_strdiff (haze_cm->name, "haze") && !tp_strdiff (haze_proto_name, proto->name)) { gtk_list_store_remove (priv->store, &titer); g_object_unref (haze_cm); g_free (haze_proto_name); break; } g_object_unref (haze_cm); g_free (haze_proto_name); valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store), &titer); } } g_hash_table_insert (priv->protocols, g_strdup (proto->name), g_strdup (cm->name)); icon_name = empathy_protocol_icon_name (proto->name); display_name = empathy_protocol_name_to_display_name (proto->name); gtk_list_store_insert_with_values (priv->store, NULL, 0, COL_ICON, icon_name, COL_LABEL, display_name, COL_CM, cm, COL_PROTOCOL_NAME, proto->name, -1); if (!tp_strdiff (proto->name, "jabber") && !tp_strdiff (cm->name, "gabble")) { display_name = empathy_service_name_to_display_name ("google-talk"); gtk_list_store_insert_with_values (priv->store, NULL, 0, COL_ICON, "im-google-talk", COL_LABEL, display_name, COL_CM, cm, COL_PROTOCOL_NAME, proto->name, COL_SERVICE, "google-talk", -1); display_name = empathy_service_name_to_display_name ("facebook"); gtk_list_store_insert_with_values (priv->store, NULL, 0, COL_ICON, "im-facebook", COL_LABEL, display_name, COL_CM, cm, COL_PROTOCOL_NAME, proto->name, COL_SERVICE, "facebook", -1); } g_free (icon_name); } }
static void empathy_account_update (EmpathyAccount *account, GHashTable *properties) { EmpathyAccountPriv *priv = GET_PRIV (account); GValueArray *arr; TpConnectionStatus old_s = priv->connection_status; gboolean presence_changed = FALSE; if (g_hash_table_lookup (properties, "ConnectionStatus") != NULL) priv->connection_status = tp_asv_get_int32 (properties, "ConnectionStatus", NULL); if (g_hash_table_lookup (properties, "ConnectionStatusReason") != NULL) priv->reason = tp_asv_get_int32 (properties, "ConnectionStatusReason", NULL); if (g_hash_table_lookup (properties, "CurrentPresence") != NULL) { presence_changed = TRUE; arr = tp_asv_get_boxed (properties, "CurrentPresence", TP_STRUCT_TYPE_SIMPLE_PRESENCE); priv->presence = g_value_get_uint (g_value_array_get_nth (arr, 0)); g_free (priv->status); priv->status = g_value_dup_string (g_value_array_get_nth (arr, 1)); g_free (priv->message); priv->message = g_value_dup_string (g_value_array_get_nth (arr, 2)); } if (g_hash_table_lookup (properties, "DisplayName") != NULL) { g_free (priv->display_name); priv->display_name = g_strdup (tp_asv_get_string (properties, "DisplayName")); g_object_notify (G_OBJECT (account), "display-name"); } if (g_hash_table_lookup (properties, "Icon") != NULL) { const gchar *icon_name; icon_name = tp_asv_get_string (properties, "Icon"); g_free (priv->icon_name); if (EMP_STR_EMPTY (icon_name)) priv->icon_name = empathy_protocol_icon_name (priv->proto_name); else priv->icon_name = g_strdup (icon_name); } if (g_hash_table_lookup (properties, "Enabled") != NULL) { gboolean enabled = tp_asv_get_boolean (properties, "Enabled", NULL); if (priv->enabled != enabled) { priv->enabled = enabled; g_object_notify (G_OBJECT (account), "enabled"); } } if (g_hash_table_lookup (properties, "Valid") != NULL) priv->valid = tp_asv_get_boolean (properties, "Valid", NULL); if (g_hash_table_lookup (properties, "Parameters") != NULL) { GHashTable *parameters; parameters = tp_asv_get_boxed (properties, "Parameters", TP_HASH_TYPE_STRING_VARIANT_MAP); if (priv->parameters != NULL) g_hash_table_unref (priv->parameters); priv->parameters = g_boxed_copy (TP_HASH_TYPE_STRING_VARIANT_MAP, parameters); } if (!priv->ready) { priv->ready = TRUE; g_object_notify (G_OBJECT (account), "ready"); } if (priv->connection_status != old_s) { if (priv->connection_status == TP_CONNECTION_STATUS_CONNECTED) { GTimeVal val; g_get_current_time (&val); priv->connect_time = val.tv_sec; } g_signal_emit (account, signals[STATUS_CHANGED], 0, old_s, priv->connection_status, priv->reason); g_object_notify (G_OBJECT (account), "connection-status"); g_object_notify (G_OBJECT (account), "connection-status-reason"); } if (presence_changed) { g_signal_emit (account, signals[PRESENCE_CHANGED], 0, priv->presence, priv->status, priv->message); g_object_notify (G_OBJECT (account), "presence"); g_object_notify (G_OBJECT (account), "status"); g_object_notify (G_OBJECT (account), "status-message"); } if (g_hash_table_lookup (properties, "Connection") != NULL) { const gchar *conn_path = tp_asv_get_object_path (properties, "Connection"); _empathy_account_set_connection (account, conn_path); } }