From b1598057537605c0ef68b4fc0ed2edaebbf25a6a Mon Sep 17 00:00:00 2001 From: hiro Date: Thu, 19 Aug 2010 05:38:50 +0000 Subject: win32: implemented automatic import of Windows Address Book (WAB) file. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2679 ee746299-78ed-0310-b773-934348b2243d --- src/addressbook.c | 18 ++++++++++++ src/addressbook.h | 3 ++ src/setup.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) (limited to 'src') diff --git a/src/addressbook.c b/src/addressbook.c index 718108e4..f1606594 100644 --- a/src/addressbook.c +++ b/src/addressbook.c @@ -4537,6 +4537,24 @@ static void addressbook_import_ldif_cb(void) addressbook_modified(); } +gboolean addressbook_import_ldif_file(const gchar *file, const gchar *book_name) +{ + AddressBookFile *abf; + + g_return_val_if_fail(file != NULL, FALSE); + g_return_val_if_fail(book_name != NULL, FALSE); + + abf = addressbook_imp_ldif_file(_addressIndex_, file, book_name); + if (!abf) + return FALSE; + + addrindex_index_add_datasource(_addressIndex_, ADDR_IF_BOOK, abf); + addrindex_save_data(_addressIndex_); + addressbook_modified(); + + return TRUE; +} + /* * Import CSV file. */ diff --git a/src/addressbook.h b/src/addressbook.h index 41d0cb37..b1c61026 100644 --- a/src/addressbook.h +++ b/src/addressbook.h @@ -51,4 +51,7 @@ gboolean addressbook_load_completion ( gint (*callBackFunc) ( const gchar *, con gboolean addressbook_has_address (const gchar *address); +gboolean addressbook_import_ldif_file (const gchar *file, + const gchar *book_name); + #endif /* __ADDRESSBOOK_H__ */ diff --git a/src/setup.c b/src/setup.c index e9b19eba..43c0000d 100644 --- a/src/setup.c +++ b/src/setup.c @@ -42,6 +42,7 @@ #include "prefs_common.h" #include "stock_pixmap.h" #include "account.h" +#include "addressbook.h" #if USE_SSL # include "ssl.h" #endif @@ -1192,3 +1193,89 @@ finish: return 0; #endif /* G_OS_WIN32 */ } + +#ifdef G_OS_WIN32 +static gchar *get_wab_file(void) +{ + HKEY reg_key; + DWORD type, nbytes; + wchar_t *tmp; + gchar *result = NULL; + + if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\WAB\\WAB4\\Wab File Name", 0, KEY_QUERY_VALUE, ®_key) != ERROR_SUCCESS) + return NULL; + if (RegQueryValueExW(reg_key, L"", 0, &type, NULL, &nbytes) == ERROR_SUCCESS && type == REG_SZ) { + tmp = g_new(wchar_t, (nbytes + 1) / 2 + 1); + RegQueryValueExW(reg_key, L"", 0, &type, (LPBYTE)tmp, &nbytes); + tmp[nbytes / 2] = '\0'; + result = g_utf16_to_utf8(tmp, -1, NULL, NULL, NULL); + g_free(tmp); + } + RegCloseKey(reg_key); + + return result; +} +#endif /* G_OS_WIN32 */ + +gint setup_import_addressbook(void) +{ +#ifdef G_OS_WIN32 + AlertValue val; + gchar *appdata; + gchar *wabfile, *ldiffile; + gchar cmdline[MAX_PATH + 1]; + gchar *cpcmdline; + gint ret = 0; + + debug_print("setup_import_addressbook\n"); + + wabfile = get_wab_file(); + if (!wabfile || !is_file_exist(wabfile)) { + g_free(wabfile); + return 0; + } + + val = alertpanel(_("Importing address book"), _("The Windows address book was found. Do you want to import the address book?"), GTK_STOCK_YES, GTK_STOCK_NO, NULL); + if (val != G_ALERTDEFAULT) { + g_free(wabfile); + return 0; + } + + ldiffile = g_strconcat(get_tmp_dir(), G_DIR_SEPARATOR_S, "impwab.ldif", + NULL); + g_snprintf(cmdline, sizeof(cmdline), "wabread \"%s\" > \"%s\"", + wabfile, ldiffile); + debug_print("setup_import_addressbook: cmdline: %s\n", cmdline); + cpcmdline = g_win32_locale_filename_from_utf8(cmdline); + if (!cpcmdline) { + g_warning("g_win32_locale_filename_from_utf8() failed"); + g_free(ldiffile); + g_free(wabfile); + return -1; + } + ret = system(cpcmdline); + g_free(cpcmdline); + g_free(wabfile); + if (ret != 0 || !is_file_exist(ldiffile)) { + g_warning("system() failed"); + ret = -1; + goto finish; + } + + if (!addressbook_import_ldif_file(ldiffile, _("Imported"))) { + g_warning("setup_import_addressbook: import failed"); + ret = -1; + goto finish; + } + +finish: + g_unlink(ldiffile); + g_free(ldiffile); + if (ret < 0) + alertpanel_error(_("Failed to import the address book.")); + + return ret; +#else /* G_OS_WIN32 */ + return 0; +#endif /* G_OS_WIN32 */ +} -- cgit v1.2.3