aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addressbook/ChangeLog5
-rw-r--r--addressbook/gui/component/addressbook-migrate.c135
2 files changed, 139 insertions, 1 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 0a298c7bb0..ca0b356cc6 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,8 @@
+2004-04-27 Jeffrey Stedfast <fejj@ximian.com>
+
+ * gui/component/addressbook-migrate.c (addressbook_migrate):
+ Migrate pilot data.
+
2004-04-27 Rodney Dawes <dobey@ximian.com>
* gui/contact-editor/e-contact-editor-fullname.c:
diff --git a/addressbook/gui/component/addressbook-migrate.c b/addressbook/gui/component/addressbook-migrate.c
index 53b3c55e66..9b84e8ba8d 100644
--- a/addressbook/gui/component/addressbook-migrate.c
+++ b/addressbook/gui/component/addressbook-migrate.c
@@ -21,9 +21,18 @@
#include <glib.h>
#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <errno.h>
+
#include "addressbook-migrate.h"
#include "e-destination.h"
#include <libebook/e-book-async.h>
+#include <libedataserver/e-dbhash.h>
+#include <libedataserver/e-xml-hash-utils.h>
#include <libgnome/gnome-i18n.h>
#include <gal/util/e-util.h>
#include <gal/util/e-xml-utils.h>
@@ -932,6 +941,116 @@ migrate_company_phone_for_local_folders (MigrationContext *context, ESourceGroup
}
}
+static void
+migrate_pilot_db_key (const char *key, const char *data, gpointer user_data)
+{
+ EXmlHash *xmlhash = user_data;
+
+ e_xmlhash_add (xmlhash, key, data);
+}
+
+static void
+migrate_pilot_data (const char *old_path, const char *new_path)
+{
+ struct dirent *dent;
+ const char *ext;
+ char *filename;
+ DIR *dir;
+
+ if (!(dir = opendir (old_path)))
+ return;
+
+ while ((dent = readdir (dir))) {
+ if (!strncmp (dent->d_name, "pilot-map-", 10) &&
+ ((ext = strrchr (dent->d_name, '.')) && !strcmp (ext, ".xml"))) {
+ /* pilot map file - src and dest file formats are identical */
+ unsigned char inbuf[4096];
+ size_t nread, nwritten;
+ int fd0, fd1;
+ ssize_t n;
+
+ filename = g_build_filename (old_path, dent->d_name, NULL);
+ if ((fd0 = open (filename, O_RDONLY)) == -1) {
+ g_free (filename);
+ continue;
+ }
+
+ g_free (filename);
+ filename = g_build_filename (new_path, dent->d_name, NULL);
+ if ((fd1 = open (filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) {
+ g_free (filename);
+ close (fd0);
+ continue;
+ }
+
+ do {
+ do {
+ n = read (fd0, inbuf, sizeof (inbuf));
+ } while (n == -1 && errno == EINTR);
+
+ if (n < 1)
+ break;
+
+ nread = n;
+ nwritten = 0;
+ do {
+ do {
+ n = write (fd1, inbuf + nwritten, nread - nwritten);
+ } while (n == -1 && errno == EINTR);
+
+ if (n > 0)
+ nwritten += n;
+ } while (nwritten < nread && n != -1);
+
+ if (n == -1)
+ break;
+ } while (1);
+
+ if (n != -1)
+ n = fsync (fd1);
+
+ if (n == -1) {
+ g_warning ("Failed to migrate %s: %s", dent->d_name, strerror (errno));
+ unlink (filename);
+ }
+
+ close (fd0);
+ close (fd1);
+ g_free (filename);
+ } else if (!strncmp (dent->d_name, "pilot-sync-evolution-addressbook-", 33) &&
+ ((ext = strrchr (dent->d_name, '.')) && !strcmp (ext, ".db"))) {
+ /* src and dest formats differ, src format is db3 while dest format is xml */
+ EXmlHash *xmlhash;
+ EDbHash *dbhash;
+ struct stat st;
+
+ filename = g_build_filename (old_path, dent->d_name, NULL);
+ if (stat (filename, &st) == -1) {
+ g_free (filename);
+ continue;
+ }
+
+ dbhash = e_dbhash_new (filename);
+ g_free (filename);
+
+ filename = g_build_filename (new_path, dent->d_name, NULL);
+ if (stat (filename, &st) != -1)
+ unlink (filename);
+ xmlhash = e_xmlhash_new (filename);
+ g_free (filename);
+
+ e_dbhash_foreach_key (dbhash, migrate_pilot_db_key, xmlhash);
+
+ e_dbhash_destroy (dbhash);
+
+ e_xmlhash_write (xmlhash);
+ e_xmlhash_destroy (xmlhash);
+ }
+ }
+
+ closedir (dir);
+}
+
static MigrationContext*
migration_context_new (AddressbookComponent *component)
{
@@ -1013,12 +1132,26 @@ addressbook_migrate (AddressbookComponent *component, int major, int minor, int
if (minor < 5 || (minor == 5 && revision <= 8)) {
dialog_set_label (context,
- _("The way evolutions stores some phone numbers has changed.\n\n"
+ _("The way Evolution stores some phone numbers has changed.\n\n"
"Please be patient while Evolution migrates your "
"folders..."));
migrate_company_phone_for_local_folders (context, on_this_computer);
}
+
+ if (minor < 5 || (minor == 5 && revision <= 10)) {
+ char *old_path, *new_path;
+
+ dialog_set_label (context, _("Evolution's Palm Sync changelog and map files have changed.\n\n"
+ "Please be patient while Evolution migrates your Pilot Sync data..."));
+
+ old_path = g_build_filename (g_get_home_dir (), "evolution", "local", "Contacts", NULL);
+ new_path = g_build_filename (addressbook_component_peek_base_directory (component),
+ "addressbook", "local", "system", NULL);
+ migrate_pilot_data (old_path, new_path);
+ g_free (new_path);
+ g_free (old_path);
+ }
}
if (need_dialog)