]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-account-chooser.c
Merge branch 'crash-659118'
[empathy.git] / libempathy-gtk / empathy-account-chooser.c
index f1c0ec6b4e87ace664373999628b4f975d95e1ef..ad4f778465bdfd2e9a18cb227985941bed119ac4 100644 (file)
@@ -123,6 +123,7 @@ enum {
        COL_ACCOUNT_COUNT
 };
 
+static void     account_chooser_constructed            (GObject                  *object);
 static void     account_chooser_finalize               (GObject                  *object);
 static void     account_chooser_get_property           (GObject                  *object,
                                                        guint                     param_id,
@@ -180,6 +181,7 @@ empathy_account_chooser_class_init (EmpathyAccountChooserClass *klass)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
+       object_class->constructed = account_chooser_constructed;
        object_class->finalize = account_chooser_finalize;
        object_class->get_property = account_chooser_get_property;
        object_class->set_property = account_chooser_set_property;
@@ -230,8 +232,14 @@ empathy_account_chooser_init (EmpathyAccountChooser *chooser)
        g_signal_connect (priv->manager, "account-removed",
                          G_CALLBACK (account_chooser_account_removed_cb),
                          chooser);
+}
 
-       account_chooser_setup (EMPATHY_ACCOUNT_CHOOSER (chooser));
+static void
+account_chooser_constructed (GObject *object)
+{
+       EmpathyAccountChooser *self = (EmpathyAccountChooser *) object;
+
+       account_chooser_setup (self);
 }
 
 static void
@@ -276,10 +284,6 @@ account_chooser_set_property (GObject      *object,
                              const GValue *value,
                              GParamSpec   *pspec)
 {
-       EmpathyAccountChooserPriv *priv;
-
-       priv = GET_PRIV (object);
-
        switch (param_id) {
        case PROP_HAS_ALL_OPTION:
                empathy_account_chooser_set_has_all_option (EMPATHY_ACCOUNT_CHOOSER (object),
@@ -308,6 +312,30 @@ empathy_account_chooser_new (void)
        return chooser;
 }
 
+gboolean
+empathy_account_chooser_has_all_selected (EmpathyAccountChooser *chooser)
+{
+       EmpathyAccountChooserPriv *priv;
+       GtkTreeModel              *model;
+       GtkTreeIter                iter;
+       RowType                    type;
+
+       g_return_val_if_fail (EMPATHY_IS_ACCOUNT_CHOOSER (chooser), FALSE);
+
+       priv = GET_PRIV (chooser);
+
+       g_return_val_if_fail (priv->has_all_option == TRUE, FALSE);
+
+       model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser));
+       if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (chooser), &iter)) {
+               return FALSE;
+       }
+
+       gtk_tree_model_get (model, &iter, COL_ACCOUNT_ROW_TYPE, &type, -1);
+
+       return type == ROW_ALL;
+}
+
 /**
  * empathy_account_chooser_dup_account:
  * @chooser: an #EmpathyAccountChooser
@@ -321,15 +349,12 @@ empathy_account_chooser_new (void)
 TpAccount *
 empathy_account_chooser_dup_account (EmpathyAccountChooser *chooser)
 {
-       EmpathyAccountChooserPriv *priv;
        TpAccount                 *account;
        GtkTreeModel             *model;
        GtkTreeIter               iter;
 
        g_return_val_if_fail (EMPATHY_IS_ACCOUNT_CHOOSER (chooser), NULL);
 
-       priv = GET_PRIV (chooser);
-
        model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser));
        if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (chooser), &iter)) {
                return NULL;
@@ -354,14 +379,11 @@ empathy_account_chooser_dup_account (EmpathyAccountChooser *chooser)
 TpConnection *
 empathy_account_chooser_get_connection (EmpathyAccountChooser *chooser)
 {
-       EmpathyAccountChooserPriv *priv;
        TpAccount                 *account;
        TpConnection              *connection;
 
        g_return_val_if_fail (EMPATHY_IS_ACCOUNT_CHOOSER (chooser), NULL);
 
-       priv = GET_PRIV (chooser);
-
        account = empathy_account_chooser_dup_account (chooser);
 
        /* if the returned account is NULL, then the account manager probably
@@ -406,6 +428,7 @@ empathy_account_chooser_set_account (EmpathyAccountChooser *chooser,
 
        data.chooser = chooser;
        data.account = account;
+       data.set = FALSE;
 
        gtk_tree_model_foreach (model,
                                (GtkTreeModelForeachFunc) account_chooser_set_account_foreach,
@@ -416,6 +439,30 @@ empathy_account_chooser_set_account (EmpathyAccountChooser *chooser,
        return data.set;
 }
 
+void
+empathy_account_chooser_set_all (EmpathyAccountChooser *chooser)
+{
+       EmpathyAccountChooserPriv *priv;
+       GtkComboBox    *combobox;
+       GtkTreeModel   *model;
+       GtkTreeIter     iter;
+
+       g_return_if_fail (EMPATHY_IS_ACCOUNT_CHOOSER (chooser));
+
+       priv = GET_PRIV (chooser);
+
+       g_return_if_fail (priv->has_all_option);
+
+       combobox = GTK_COMBO_BOX (chooser);
+       model = gtk_combo_box_get_model (combobox);
+
+       if (gtk_tree_model_get_iter_first (model, &iter)) {
+               /* 'All accounts' is the first row */
+               gtk_combo_box_set_active_iter (combobox, &iter);
+               priv->account_manually_set = TRUE;
+       }
+}
+
 /**
  * empathy_account_chooser_get_has_all_option:
  * @chooser: an #EmpathyAccountChooser
@@ -490,7 +537,7 @@ empathy_account_chooser_set_has_all_option (EmpathyAccountChooser *chooser,
 
                gtk_list_store_prepend (store, &iter);
                gtk_list_store_set (store, &iter,
-                                   COL_ACCOUNT_TEXT, _("All"),
+                                   COL_ACCOUNT_TEXT, _("All accounts"),
                                    COL_ACCOUNT_ENABLED, TRUE,
                                    COL_ACCOUNT_POINTER, NULL,
                                    COL_ACCOUNT_ROW_TYPE, ROW_ALL,
@@ -523,7 +570,7 @@ account_manager_prepared_cb (GObject *source_object,
        EmpathyAccountChooserPriv *priv = GET_PRIV (chooser);
        GError *error = NULL;
 
-       if (!tp_account_manager_prepare_finish (manager, result, &error)) {
+       if (!tp_proxy_prepare_finish (manager, result, &error)) {
                DEBUG ("Failed to prepare account manager: %s", error->message);
                g_error_free (error);
                return;
@@ -611,7 +658,7 @@ account_chooser_setup (EmpathyAccountChooser *chooser)
        gtk_cell_layout_clear (GTK_CELL_LAYOUT (combobox));
 
        store = gtk_list_store_new (COL_ACCOUNT_COUNT,
-                                   G_TYPE_STRING,    /* Image */
+                                   GDK_TYPE_PIXBUF,    /* Image */
                                    G_TYPE_STRING,    /* Name */
                                    G_TYPE_BOOLEAN,   /* Enabled */
                                    G_TYPE_UINT,      /* Row type */
@@ -627,10 +674,9 @@ account_chooser_setup (EmpathyAccountChooser *chooser)
        renderer = gtk_cell_renderer_pixbuf_new ();
        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, FALSE);
        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
-                                       "icon-name", COL_ACCOUNT_IMAGE,
+                                       "pixbuf", COL_ACCOUNT_IMAGE,
                                        "sensitive", COL_ACCOUNT_ENABLED,
                                        NULL);
-       g_object_set (renderer, "stock-size", GTK_ICON_SIZE_BUTTON, NULL);
 
        renderer = gtk_cell_renderer_text_new ();
        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
@@ -640,7 +686,7 @@ account_chooser_setup (EmpathyAccountChooser *chooser)
                                        NULL);
 
        /* Populate accounts */
-       tp_account_manager_prepare_async (priv->manager, NULL,
+       tp_proxy_prepare_async (priv->manager, NULL,
                                          account_manager_prepared_cb, chooser);
 
        g_object_unref (store);
@@ -700,8 +746,15 @@ account_chooser_find_account_foreach (GtkTreeModel *model,
 {
        FindAccountData *data = user_data;
        TpAccount  *account;
+       RowType type;
 
-       gtk_tree_model_get (model, iter, COL_ACCOUNT_POINTER, &account, -1);
+       gtk_tree_model_get (model, iter,
+               COL_ACCOUNT_POINTER, &account,
+               COL_ACCOUNT_ROW_TYPE, &type,
+                -1);
+
+       if (type != ROW_ACCOUNT)
+               return FALSE;
 
        if (account == data->account) {
                data->found = TRUE;
@@ -765,6 +818,7 @@ account_chooser_filter_ready_cb (gboolean is_enabled,
        GtkListStore              *store;
        GtkComboBox               *combobox;
        const gchar               *icon_name;
+       GdkPixbuf                 *pixbuf;
 
        chooser = fr_data->chooser;
        priv = GET_PRIV (chooser);
@@ -774,13 +828,18 @@ account_chooser_filter_ready_cb (gboolean is_enabled,
        store = GTK_LIST_STORE (gtk_combo_box_get_model (combobox));
 
        icon_name = tp_account_get_icon_name (account);
+       pixbuf = empathy_pixbuf_from_icon_name (icon_name,
+               GTK_ICON_SIZE_BUTTON);
 
        gtk_list_store_set (store, iter,
-                           COL_ACCOUNT_IMAGE, icon_name,
+                           COL_ACCOUNT_IMAGE, pixbuf,
                            COL_ACCOUNT_TEXT, tp_account_get_display_name (account),
                            COL_ACCOUNT_ENABLED, is_enabled,
                            -1);
 
+       if (pixbuf != NULL)
+               g_object_unref (pixbuf);
+
        /* set first connected account as active account */
        if (priv->account_manually_set == FALSE &&
            priv->set_active_item == FALSE && is_enabled) {
@@ -788,7 +847,6 @@ account_chooser_filter_ready_cb (gboolean is_enabled,
                gtk_combo_box_set_active_iter (combobox, iter);
        }
 
-       g_object_unref (account);
        filter_result_callback_data_free (fr_data);
 }
 
@@ -822,6 +880,8 @@ account_chooser_update_iter (EmpathyAccountChooser *chooser,
                              (gpointer) data, priv->filter_data);
        else
                account_chooser_filter_ready_cb (TRUE, (gpointer) data);
+
+       g_object_unref (account);
 }
 
 static void
@@ -957,6 +1017,44 @@ empathy_account_chooser_filter_is_connected (
        callback (is_connected, callback_data);
 }
 
+/**
+ * empathy_account_chooser_filter_supports_multichat:
+ * @account: a #TpAccount
+ * @callback: an #EmpathyAccountChooserFilterResultCallback accepting the result
+ * @callback_data: data passed to the @callback
+ * @user_data: user data or %NULL
+ *
+ * An #EmpathyAccountChooserFilterFunc that returns accounts that both
+ * support multiuser text chat and are connected.
+ *
+ * Returns (via the callback) TRUE if @account both supports muc and is connected
+ */
+void
+empathy_account_chooser_filter_supports_chatrooms (
+       TpAccount                                 *account,
+       EmpathyAccountChooserFilterResultCallback  callback,
+       gpointer                                   callback_data,
+       gpointer                                   user_data)
+{
+       TpConnection       *connection;
+       gboolean           supported = FALSE;
+       TpCapabilities     *caps;
+
+       /* check if CM supports multiuser text chat */
+       connection = tp_account_get_connection (account);
+       if (connection == NULL)
+               goto out;
+
+       caps = tp_connection_get_capabilities (connection);
+       if (caps == NULL)
+               goto out;
+
+       supported = tp_capabilities_supports_text_chatrooms (caps);
+
+out:
+       callback (supported, callback_data);
+}
+
 gboolean
 empathy_account_chooser_is_ready (EmpathyAccountChooser *self)
 {
@@ -978,3 +1076,11 @@ empathy_account_chooser_get_account (EmpathyAccountChooser *chooser)
 
        return account;
 }
+
+TpAccountManager *
+empathy_account_chooser_get_account_manager (EmpathyAccountChooser *self)
+{
+       EmpathyAccountChooserPriv *priv = GET_PRIV (self);
+
+       return priv->manager;
+}