]> git.0d.be Git - empathy.git/blobdiff - src/empathy.c
Merge branch 'master' into mc5
[empathy.git] / src / empathy.c
index 5e3d983aada19330d36e5cb94a6c0082a13a0523..63747077371ec08eb60451a70c9b9739f07bd4de 100644 (file)
@@ -47,7 +47,9 @@
 #include <libempathy/empathy-utils.h>
 #include <libempathy/empathy-call-factory.h>
 #include <libempathy/empathy-chatroom-manager.h>
+#include <libempathy/empathy-account-settings.h>
 #include <libempathy/empathy-account-manager.h>
+#include <libempathy/empathy-connection-managers.h>
 #include <libempathy/empathy-debugger.h>
 #include <libempathy/empathy-dispatcher.h>
 #include <libempathy/empathy-dispatch-operation.h>
@@ -111,7 +113,7 @@ dispatch_cb (EmpathyDispatcher *dispatcher,
 
                        manager = empathy_account_manager_dup_singleton ();
                        connection = empathy_tp_chat_get_connection (tp_chat);
-                       account = empathy_account_manager_get_account (manager,
+                       account = empathy_account_manager_get_account_for_connection (manager,
                                                                       connection);
                        chat = empathy_chat_window_find_chat (account, id);
                        g_object_unref (manager);
@@ -159,6 +161,7 @@ use_nm_notify_cb (EmpathyConf *conf,
        }
 }
 
+/* Salut account creation */
 static gboolean
 should_create_salut_account (void)
 {
@@ -171,6 +174,12 @@ should_create_salut_account (void)
                               EMPATHY_PREFS_SALUT_ACCOUNT_CREATED,
                               &salut_created);
 
+       if (salut_created)
+               {
+                       DEBUG ("Gconf says we already created a salut account once");
+                       return FALSE;
+               }
+
        manager = empathy_account_manager_dup_singleton ();
        accounts = empathy_account_manager_dup_accounts (manager);
 
@@ -185,14 +194,46 @@ should_create_salut_account (void)
 
        g_object_unref (manager);
 
+       if (salut_created)
+               {
+                       DEBUG ("Existing salut account already exists, flagging so in gconf");
+                       empathy_conf_set_bool (empathy_conf_get (),
+                               EMPATHY_PREFS_SALUT_ACCOUNT_CREATED,
+                               TRUE);
+               }
+
        return !salut_created;
 }
 
 static void
-create_salut_account_if_needed (void)
+salut_account_created (GObject *source,
+       GAsyncResult *result, gpointer user_data)
 {
-       EmpathyAccount  *account;
-       EmpathyAccountManager *account_manager;
+       EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (source);
+       EmpathyAccount *account;
+       GError *error = NULL;
+
+       if (!empathy_account_settings_apply_finish (settings, result, &error))
+               {
+                       DEBUG ("Failed to create salut account: %s", error->message);
+                       g_error_free (error);
+                       return;
+               }
+
+       account = empathy_account_settings_get_account (settings);
+
+       empathy_account_set_enabled (account, TRUE);
+       empathy_conf_set_bool (empathy_conf_get (),
+                              EMPATHY_PREFS_SALUT_ACCOUNT_CREATED,
+                              TRUE);
+}
+
+static void
+create_salut_account_if_needed (EmpathyConnectionManagers *managers)
+{
+       EmpathyAccountSettings  *settings;
+       TpConnectionManager *manager;
+       const TpConnectionManagerProtocol *protocol;
        EBook      *book;
        EContact   *contact;
        gchar      *nickname = NULL;
@@ -203,9 +244,23 @@ create_salut_account_if_needed (void)
        GError     *error = NULL;
 
 
-       if (!should_create_salut_account())
+       if (!should_create_salut_account ())
                return;
-       
+
+       manager = empathy_connection_managers_get_cm (managers, "salut");
+       if (manager == NULL)
+               {
+                       DEBUG ("Salut not installed, not making a salut account");
+                       return;
+               }
+
+       protocol = tp_connection_manager_get_protocol (manager, "local-xmpp");
+       if (protocol == NULL)
+               {
+                       DEBUG ("Salut doesn't support local-xmpp!!");
+                       return;
+               }
+
        DEBUG ("Trying to add a salut account...");
 
        /* Get self EContact from EDS */
@@ -216,11 +271,8 @@ create_salut_account_if_needed (void)
                return;
        }
 
-       account_manager = empathy_account_manager_dup_singleton ();
-       account = empathy_account_manager_create (account_manager,
-               "salut", "local-xmpp", _("People nearby"));
-       g_object_unref (account_manager);
-       empathy_account_set_enabled (account, TRUE);
+       settings = empathy_account_settings_new ("salut", "local-xmpp",
+               _("People nearby"));
 
        nickname = e_contact_get (contact, E_CONTACT_NICKNAME);
        first_name = e_contact_get (contact, E_CONTACT_GIVEN_NAME);
@@ -237,63 +289,118 @@ create_salut_account_if_needed (void)
                "last-name=%s\nemail=%s\njid=%s\n",
                nickname, first_name, last_name, email, jid);
 
-       empathy_account_set_param_string (account, "nickname", nickname ? nickname : "");
-       empathy_account_set_param_string (account, "first-name", first_name ? first_name : "");
-       empathy_account_set_param_string (account, "last-name", last_name ? last_name : "");
-       empathy_account_set_param_string (account, "email", email ? email : "");
-       empathy_account_set_param_string (account, "jid", jid ? jid : "");
+       empathy_account_settings_set_string (settings, "nickname", nickname ? nickname : "");
+       empathy_account_settings_set_string (settings, "first-name", first_name ? first_name : "");
+       empathy_account_settings_set_string (settings, "last-name", last_name ? last_name : "");
+       empathy_account_settings_set_string (settings, "email", email ? email : "");
+       empathy_account_settings_set_string (settings, "jid", jid ? jid : "");
+
+       empathy_account_settings_apply_async (settings,
+               salut_account_created, NULL);
 
        g_free (nickname);
        g_free (first_name);
        g_free (last_name);
        g_free (email);
        g_free (jid);
-       g_object_unref (account);
+       g_object_unref (settings);
        g_object_unref (contact);
        g_object_unref (book);
+}
 
-       empathy_conf_set_bool (empathy_conf_get (),
-                              EMPATHY_PREFS_SALUT_ACCOUNT_CREATED,
-                              TRUE);
-
+static void
+connection_managers_ready_cb (EmpathyConnectionManagers *managers,
+       GParamSpec *spec, gpointer user_data)
+{
+       if (empathy_connection_managers_is_ready (managers))
+               {
+                       create_salut_account_if_needed (managers);
+                       g_object_unref (managers);
+                       managers = NULL;
+               }
 }
 
 static void
-connection_manager_listed (TpConnectionManager * const * cms,
-       gsize n_cms,
-       const GError *error,
-       gpointer user_data,
-       GObject *weak_object)
+create_salut_account (void)
 {
-       int i;
-       if (error != NULL) {
-               DEBUG ("Couldn't get the connection manager list: %s", error->message);
+       EmpathyConnectionManagers *managers;
+
+       if (!should_create_salut_account ())
                return;
-       }
 
-       for (i = 0; i < n_cms; i++) {
-               if (!tp_strdiff (tp_connection_manager_get_name (cms[i]), "salut")) {
-                               /* salut installed, see if we need to create a new account */
-                               create_salut_account_if_needed ();
-                               return;
-                       }
-       }
+       managers = empathy_connection_managers_dup_singleton ();
+
+       if (empathy_connection_managers_is_ready (managers))
+               {
+                       create_salut_account_if_needed (managers);
+                       g_object_unref (managers);
+               }
+       else
+               {
+                       g_signal_connect (managers, "notify::ready",
+                               G_CALLBACK (connection_managers_ready_cb), NULL);
+               }
 }
 
 static void
-create_salut_account (void)
+migrate_config_to_xdg_dir (void)
 {
-       TpDBusDaemon *d;
+       gchar *xdg_dir, *old_dir, *xdg_filename, *old_filename;
+       int i;
+       GFile *xdg_file, *old_file;
+       static const gchar* filenames[] = {
+               "geometry.ini",
+               "irc-networks.xml",
+               "chatrooms.xml",
+               "contact-groups.xml",
+               "status-presets.xml",
+               "accels.txt",
+               NULL
+       };
+
+       xdg_dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
+       if (g_file_test (xdg_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
+               /* xdg config dir already exists */
+               g_free (xdg_dir);
+               return;
+       }
 
-       if (!should_create_salut_account())
+       old_dir = g_build_filename (g_get_home_dir (), ".gnome2", PACKAGE_NAME, NULL);
+       if (!g_file_test (old_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
+               /* old config dir didn't exist */
+               g_free (xdg_dir);
+               g_free (old_dir);
                return;
+       }
 
-       d = tp_dbus_daemon_dup (NULL);
+       if (g_mkdir_with_parents (xdg_dir, (S_IRUSR | S_IWUSR | S_IXUSR)) == -1) {
+               DEBUG ("Failed to create configuration directory; aborting migration");
+               g_free (xdg_dir);
+               g_free (old_dir);
+               return;
+       }
 
-       tp_list_connection_managers (d, connection_manager_listed, NULL,
-               NULL, NULL);
+       for (i = 0; filenames[i]; i++) {
+               old_filename = g_build_filename (old_dir, filenames[i], NULL);
+               if (!g_file_test (old_filename, G_FILE_TEST_EXISTS)) {
+                       g_free (old_filename);
+                       continue;
+               }
+               xdg_filename = g_build_filename (xdg_dir, filenames[i], NULL);
+               old_file = g_file_new_for_path (old_filename);
+               xdg_file = g_file_new_for_path (xdg_filename);
+               if (!g_file_move (old_file, xdg_file, G_FILE_COPY_NONE,
+                                 NULL, NULL, NULL, NULL)) {
+                       DEBUG ("Failed to migrate %s", filenames[i]);
+               }
+               g_free (old_filename);
+               g_free (xdg_filename);
+               g_object_unref (old_file);
+               g_object_unref (xdg_file);
+       }
 
-       g_object_unref (d);
+       g_free (xdg_dir);
+       g_free (old_dir);
 }
 
 /* The code that handles single-instance and startup notification is
@@ -332,7 +439,7 @@ on_bacon_message_received (const char *message,
                                gtk_widget_realize (GTK_WIDGET (window));
                        }
 
-                       startup_timestamp = gdk_x11_get_server_time (window->window);
+                       startup_timestamp = gdk_x11_get_server_time (gtk_widget_get_window (window));
                }
 
                gtk_window_present_with_time (GTK_WINDOW (window), startup_timestamp);
@@ -453,6 +560,22 @@ default_log_handler (const gchar *log_domain,
 }
 #endif /* ENABLE_DEBUG */
 
+static void
+account_manager_ready_cb (EmpathyAccountManager *manager,
+       GParamSpec *spec,
+       gpointer user_data)
+{
+       if (!empathy_account_manager_is_ready (manager))
+               return;
+
+       if (empathy_account_manager_get_count (manager) == 0)
+               {
+                       empathy_accounts_dialog_show (GTK_WINDOW (empathy_main_window_get ()),
+                               NULL);
+               }
+       create_salut_account ();
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -498,7 +621,7 @@ main (int argc, char *argv[])
        empathy_init ();
 
        if (!gtk_init_with_args (&argc, &argv,
-                                N_("- Empathy Instant Messenger"),
+                                N_("- Empathy IM Client"),
                                 options, GETTEXT_PACKAGE, &error)) {
                g_warning ("Error in empathy init: %s", error->message);
                return EXIT_FAILURE;
@@ -605,8 +728,10 @@ main (int argc, char *argv[])
 
        /* account management */
        account_manager = empathy_account_manager_dup_singleton ();
+       g_signal_connect (account_manager, "notify::ready",
+               G_CALLBACK (account_manager_ready_cb), NULL);
 
-       create_salut_account ();
+       migrate_config_to_xdg_dir ();
 
        /* Setting up UI */
        window = empathy_main_window_show ();
@@ -666,4 +791,3 @@ main (int argc, char *argv[])
 
        return EXIT_SUCCESS;
 }
-