/* * Copyright (C) 2010 Collabora Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #define DEBUG_FLAG EMPATHY_DEBUG_OTHER #include #include #include #include #include #include "empathy-migrate-butterfly-logs.h" static guint butterfly_log_migration_id = 0; static void migrate_log_files_in_dir (const gchar *dirname) { GDir *dir; const gchar *subdir; gchar *new_name; gchar *full_path; GError *error = NULL; dir = g_dir_open (dirname, 0, &error); if (dir == NULL) { DEBUG ("Failed to open dir: %s", error->message); g_error_free (error); return; } while ((subdir = g_dir_read_name (dir)) != NULL) { GFile *old_gfile, *new_gfile; if (!tp_strdiff (subdir, "chatrooms")) continue; if (g_str_has_suffix (subdir, "#1")) { new_name = g_strndup (subdir, (strlen (subdir) - 2)); } else if (g_str_has_suffix (subdir, "#32")) { gchar *tmp; tmp = g_strndup (subdir, (strlen (subdir) - 3)); new_name = g_strdup_printf ("%s#yahoo", tmp); g_free (tmp); } else { continue; } full_path = g_build_filename (dirname, subdir, NULL); old_gfile = g_file_new_for_path (full_path); g_free (full_path); full_path = g_build_filename (dirname, new_name, NULL); new_gfile = g_file_new_for_path (full_path); g_free (full_path); if (!g_file_move (old_gfile, new_gfile, G_FILE_COPY_NONE, NULL, NULL, NULL, &error)) { DEBUG ("Failed to move file: %s", error->message); g_clear_error (&error); } else { DEBUG ("Successfully migrated logs for %s", new_name); } g_free (new_name); g_object_unref (old_gfile); g_object_unref (new_gfile); } g_dir_close (dir); } /* This is copied from empathy-log-store-empathy.c (see #613437) */ static gchar * log_store_account_to_dirname (TpAccount *account) { const gchar *name; name = tp_proxy_get_object_path (account); if (g_str_has_prefix (name, TP_ACCOUNT_OBJECT_PATH_BASE)) name += strlen (TP_ACCOUNT_OBJECT_PATH_BASE); return g_strdelimit (g_strdup (name), "/", '_'); } static gchar * get_log_dir_for_account (TpAccount *account) { gchar *basedir; gchar *escaped; escaped = log_store_account_to_dirname (account); basedir = g_build_path (G_DIR_SEPARATOR_S, g_get_user_data_dir (), PACKAGE_NAME, "logs", escaped, NULL); g_free (escaped); return basedir; } static void migration_account_manager_prepared_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { TpAccountManager *am = TP_ACCOUNT_MANAGER (source_object); GError *error = NULL; GList *accounts, *l; GSettings *gsettings; if (!tp_account_manager_prepare_finish (am, result, &error)) { DEBUG ("Failed to prepare the account manager: %s", error->message); g_error_free (error); return; } accounts = tp_account_manager_get_valid_accounts (am); for (l = accounts; l != NULL; l = l->next) { TpAccount *account = TP_ACCOUNT (l->data); gchar *dir, *cm; tp_account_parse_object_path (tp_proxy_get_object_path (account), &cm, NULL, NULL, NULL); if (tp_strdiff (cm, "butterfly")) { g_free (cm); continue; } dir = get_log_dir_for_account (account); DEBUG ("Migrating all logs from dir: %s", dir); migrate_log_files_in_dir (dir); g_free (cm); g_free (dir); } DEBUG ("Finished all migrating"); gsettings = g_settings_new (EMPATHY_PREFS_SCHEMA); g_settings_set_boolean (gsettings, EMPATHY_PREFS_BUTTERFLY_LOGS_MIGRATED, TRUE); g_object_unref (gsettings); g_list_free (accounts); } static gboolean migrate_logs (gpointer data) { TpAccountManager *account_manager; account_manager = tp_account_manager_dup (); tp_account_manager_prepare_async (account_manager, NULL, migration_account_manager_prepared_cb, NULL); g_object_unref (account_manager); return FALSE; } gboolean empathy_migrate_butterfly_logs (EmpathyContact *contact) { GSettings *gsettings = g_settings_new (EMPATHY_PREFS_SCHEMA); gchar *cm; /* Already in progress. */ if (butterfly_log_migration_id != 0) return FALSE; /* Already done. */ if (g_settings_get_boolean (gsettings, EMPATHY_PREFS_BUTTERFLY_LOGS_MIGRATED)) return FALSE; tp_account_parse_object_path ( tp_proxy_get_object_path (empathy_contact_get_account (contact)), &cm, NULL, NULL, NULL); if (tp_strdiff (cm, "butterfly")) { g_free (cm); return TRUE; } g_free (cm); if (g_str_has_suffix (empathy_contact_get_id (contact), "#32") || g_str_has_suffix (empathy_contact_get_id (contact), "#1")) return TRUE; /* Okay, we know a new butterfly is being used, so we should migrate its logs */ butterfly_log_migration_id = g_idle_add_full (G_PRIORITY_LOW, migrate_logs, NULL, NULL); return FALSE; }