2 * Copyright (C) 2008 Collabora Ltd.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public
15 * License along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17 * Boston, MA 02110-1301 USA
19 * Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
28 #include <glib/gi18n.h>
30 #include <telepathy-glib/util.h>
32 #include "empathy-import-dialog.h"
33 #include "empathy-import-pidgin.h"
35 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
36 #include <libempathy/empathy-debug.h>
37 #include <libempathy/empathy-utils.h>
38 #include <libempathy/empathy-account-manager.h>
40 #include <libempathy-gtk/empathy-ui-utils.h>
47 GtkWidget
*button_cancel
;
49 } EmpathyImportDialog
;
61 EmpathyImportAccountData
*
62 empathy_import_account_data_new (const gchar
*source
)
64 EmpathyImportAccountData
*data
;
66 g_return_val_if_fail (!EMP_STR_EMPTY (source
), NULL
);
68 data
= g_slice_new0 (EmpathyImportAccountData
);
69 data
->settings
= g_hash_table_new_full (g_str_hash
, g_str_equal
, NULL
,
70 (GDestroyNotify
) tp_g_value_slice_free
);
71 data
->source
= g_strdup (source
);
77 empathy_import_account_data_free (EmpathyImportAccountData
*data
)
81 if (data
->profile
!= NULL
)
82 g_object_unref (data
->profile
);
83 if (data
->settings
!= NULL
)
84 g_hash_table_destroy (data
->settings
);
85 if (data
->source
!= NULL
)
86 g_free (data
->source
);
88 g_slice_free (EmpathyImportAccountData
, data
);
92 import_dialog_add_account (EmpathyImportAccountData
*data
)
94 EmpathyAccountManager
*account_manager
;
95 EmpathyAccount
*account
;
101 account_manager
= empathy_account_manager_dup_singleton ();
102 account
= empathy_account_manager_create (account_manager
, data
->profile
);
103 g_object_unref (account_manager
);
106 DEBUG ("Failed to create account");
110 g_hash_table_iter_init (&iter
, data
->settings
);
111 while (g_hash_table_iter_next (&iter
, &key
, &value
))
113 const gchar
*param
= key
;
114 GValue
*gvalue
= value
;
116 switch (G_VALUE_TYPE (gvalue
))
119 DEBUG ("Set param '%s' to '%s' (string)",
120 param
, g_value_get_string (gvalue
));
121 empathy_account_set_param_string (account
,
122 param
, g_value_get_string (gvalue
));
126 DEBUG ("Set param '%s' to %s (boolean)",
127 param
, g_value_get_boolean (gvalue
) ? "TRUE" : "FALSE");
128 empathy_account_set_param_boolean (account
,
129 param
, g_value_get_boolean (gvalue
));
133 DEBUG ("Set param '%s' to '%i' (integer)",
134 param
, g_value_get_int (gvalue
));
135 empathy_account_set_param_int (account
,
136 param
, g_value_get_int (gvalue
));
141 /* Set the display name of the account */
142 username
= g_hash_table_lookup (data
->settings
, "account");
143 display_name
= g_strdup_printf ("%s (%s)",
144 mc_profile_get_display_name (data
->profile
),
145 g_value_get_string (username
));
146 empathy_account_set_display_name (account
, display_name
);
148 g_free (display_name
);
149 g_object_unref (account
);
153 import_dialog_account_id_in_list (GList
*accounts
,
154 const gchar
*account_id
)
158 for (l
= accounts
; l
; l
= l
->next
)
160 McAccount
*account
= l
->data
;
164 mc_account_get_param_string (account
, "account", &value
);
169 result
= tp_strdiff (value
, account_id
);
181 import_dialog_add_accounts_to_model (EmpathyImportDialog
*dialog
)
187 model
= gtk_tree_view_get_model (GTK_TREE_VIEW (dialog
->treeview
));
189 for (l
= dialog
->accounts
; l
; l
= l
->next
)
192 EmpathyImportAccountData
*data
= l
->data
;
196 value
= g_hash_table_lookup (data
->settings
, "account");
198 accounts
= mc_accounts_list_by_profile (data
->profile
);
200 /* Only set the "Import" cell to be active if there isn't already an
201 * account set up with the same account id. */
202 import
= !import_dialog_account_id_in_list (accounts
,
203 g_value_get_string (value
));
205 mc_accounts_list_free (accounts
);
207 gtk_list_store_append (GTK_LIST_STORE (model
), &iter
);
209 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
211 COL_PROTOCOL
, mc_profile_get_display_name (data
->profile
),
212 COL_NAME
, g_value_get_string (value
),
213 COL_SOURCE
, data
->source
,
214 COL_ACCOUNT_DATA
, data
,
220 import_dialog_cell_toggled_cb (GtkCellRendererToggle
*cell_renderer
,
221 const gchar
*path_str
,
222 EmpathyImportDialog
*dialog
)
228 path
= gtk_tree_path_new_from_string (path_str
);
229 model
= gtk_tree_view_get_model (GTK_TREE_VIEW (dialog
->treeview
));
231 gtk_tree_model_get_iter (model
, &iter
, path
);
233 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
234 COL_IMPORT
, !gtk_cell_renderer_toggle_get_active (cell_renderer
),
237 gtk_tree_path_free (path
);
241 import_dialog_set_up_account_list (EmpathyImportDialog
*dialog
)
245 GtkTreeViewColumn
*column
;
246 GtkCellRenderer
*cell
;
248 store
= gtk_list_store_new (COL_COUNT
, G_TYPE_BOOLEAN
, G_TYPE_STRING
,
249 G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_POINTER
);
251 gtk_tree_view_set_model (GTK_TREE_VIEW (dialog
->treeview
),
252 GTK_TREE_MODEL (store
));
254 g_object_unref (store
);
256 view
= GTK_TREE_VIEW (dialog
->treeview
);
257 gtk_tree_view_set_headers_visible (view
, TRUE
);
260 cell
= gtk_cell_renderer_toggle_new ();
261 gtk_tree_view_insert_column_with_attributes (view
, -1,
262 /* Translators: this is the header of a treeview column */
264 "active", COL_IMPORT
,
267 g_signal_connect (cell
, "toggled",
268 G_CALLBACK (import_dialog_cell_toggled_cb
), dialog
);
270 /* Protocol column */
271 column
= gtk_tree_view_column_new ();
272 gtk_tree_view_column_set_title (column
, _("Protocol"));
273 gtk_tree_view_column_set_expand (column
, TRUE
);
274 gtk_tree_view_append_column (view
, column
);
276 cell
= gtk_cell_renderer_text_new ();
280 gtk_tree_view_column_pack_start (column
, cell
, TRUE
);
281 gtk_tree_view_column_add_attribute (column
, cell
, "text", COL_PROTOCOL
);
284 column
= gtk_tree_view_column_new ();
285 gtk_tree_view_column_set_title (column
, _("Account"));
286 gtk_tree_view_column_set_expand (column
, TRUE
);
287 gtk_tree_view_append_column (view
, column
);
289 cell
= gtk_cell_renderer_text_new ();
293 gtk_tree_view_column_pack_start (column
, cell
, TRUE
);
294 gtk_tree_view_column_add_attribute (column
, cell
, "text", COL_NAME
);
297 column
= gtk_tree_view_column_new ();
298 gtk_tree_view_column_set_title (column
, _("Source"));
299 gtk_tree_view_column_set_expand (column
, TRUE
);
300 gtk_tree_view_append_column (view
, column
);
302 cell
= gtk_cell_renderer_text_new ();
306 gtk_tree_view_column_pack_start (column
, cell
, TRUE
);
307 gtk_tree_view_column_add_attribute (column
, cell
, "text", COL_SOURCE
);
309 import_dialog_add_accounts_to_model (dialog
);
313 import_dialog_tree_model_foreach (GtkTreeModel
*model
,
319 EmpathyImportAccountData
*data
;
321 gtk_tree_model_get (model
, iter
,
322 COL_IMPORT
, &to_import
,
323 COL_ACCOUNT_DATA
, &data
,
327 import_dialog_add_account (data
);
333 import_dialog_response_cb (GtkWidget
*widget
,
335 EmpathyImportDialog
*dialog
)
337 if (response
== GTK_RESPONSE_OK
)
341 model
= gtk_tree_view_get_model (GTK_TREE_VIEW (dialog
->treeview
));
342 gtk_tree_model_foreach (model
, import_dialog_tree_model_foreach
, dialog
);
345 gtk_widget_destroy (dialog
->window
);
349 import_dialog_destroy_cb (GtkWidget
*widget
,
350 EmpathyImportDialog
*dialog
)
352 g_list_foreach (dialog
->accounts
, (GFunc
) empathy_import_account_data_free
,
354 g_list_free (dialog
->accounts
);
355 g_slice_free (EmpathyImportDialog
, dialog
);
359 empathy_import_dialog_accounts_to_import (void)
361 return empathy_import_pidgin_accounts_to_import ();
365 empathy_import_dialog_show (GtkWindow
*parent
,
368 static EmpathyImportDialog
*dialog
= NULL
;
371 GList
*accounts
= NULL
;
373 /* This window is a singleton. If it already exist, present it */
376 gtk_window_present (GTK_WINDOW (dialog
->window
));
380 /* Load all accounts from all supported applications */
381 accounts
= g_list_concat (accounts
, empathy_import_pidgin_load ());
383 /* Check if we have accounts to import before creating the window */
390 message
= gtk_message_dialog_new (parent
,
391 GTK_DIALOG_MODAL
, GTK_MESSAGE_WARNING
, GTK_BUTTONS_CLOSE
,
392 _("No accounts to import could be found. Empathy currently only "
393 "supports importing accounts from Pidgin."));
395 gtk_dialog_run (GTK_DIALOG (message
));
396 gtk_widget_destroy (message
);
399 DEBUG ("No accounts to import; closing dialog silently.");
404 /* We have accounts, let's display the window with them */
405 dialog
= g_slice_new0 (EmpathyImportDialog
);
406 dialog
->accounts
= accounts
;
408 filename
= empathy_file_lookup ("empathy-import-dialog.ui", "src");
409 gui
= empathy_builder_get_file (filename
,
410 "import_dialog", &dialog
->window
,
411 "treeview", &dialog
->treeview
,
414 empathy_builder_connect (gui
, dialog
,
415 "import_dialog", "destroy", import_dialog_destroy_cb
,
416 "import_dialog", "response", import_dialog_response_cb
,
419 g_object_add_weak_pointer (G_OBJECT (dialog
->window
), (gpointer
) &dialog
);
422 g_object_unref (gui
);
425 gtk_window_set_transient_for (GTK_WINDOW (dialog
->window
), parent
);
427 import_dialog_set_up_account_list (dialog
);
429 gtk_widget_show (dialog
->window
);