aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2010-08-17 07:09:27 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2010-08-17 07:09:27 +0000
commitf7027562c816a9e975991020588547dae50efc15 (patch)
tree3ee185d6bb37ebdd85f7f1003a8225304710730e /src
parentf5a0e4f278175802371808947f67d6d8991bc381 (diff)
modified ldif parser. Fixed OE import on startup.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2672 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/importldif.c56
-rw-r--r--src/importldif.h3
-rw-r--r--src/ldif.c15
-rw-r--r--src/ldif.h1
-rw-r--r--src/main.c2
-rw-r--r--src/setup.c24
-rw-r--r--src/setup.h2
7 files changed, 91 insertions, 12 deletions
diff --git a/src/importldif.c b/src/importldif.c
index 7d0deb49..db595738 100644
--- a/src/importldif.c
+++ b/src/importldif.c
@@ -819,6 +819,62 @@ AddressBookFile *addressbook_imp_ldif( AddressIndex *addrIndex ) {
return _importedBook_;
}
+AddressBookFile *addressbook_imp_ldif_file( AddressIndex *addrIndex,
+ const gchar *file,
+ const gchar *book_name ) {
+ gchar *fsfile;
+ GList *node, *list;
+ gboolean ret;
+
+ g_return_val_if_fail(addrIndex != NULL, NULL);
+ g_return_val_if_fail(file != NULL, NULL);
+ g_return_val_if_fail(book_name != NULL, NULL);
+
+ debug_print("addressbook_imp_ldif_file: file: %s name: %s\n",
+ file, book_name);
+
+ _importedBook_ = NULL;
+ _imp_addressIndex_ = addrIndex;
+ _ldifFile_ = ldif_create();
+
+ fsfile = conv_filename_from_utf8( file );
+ ldif_set_file(_ldifFile_, fsfile);
+ g_free( fsfile );
+
+ if( ldif_read_tags( _ldifFile_ ) != MGU_SUCCESS )
+ goto finish;
+ list = ldif_get_fieldlist( _ldifFile_ );
+ node = list;
+ while( node ) {
+ Ldif_FieldRec *rec = node->data;
+ if( ! rec->reserved ) {
+ if( g_ascii_strcasecmp( rec->tagName, "dn" ) != 0 ) {
+ rec->selected = TRUE;
+ }
+ }
+ node = g_list_next( node );
+ }
+ g_list_free( list );
+
+ g_free( impldif_dlg.nameBook );
+ impldif_dlg.nameBook = g_strdup(book_name);
+
+ ret = imp_ldif_field_move();
+
+ g_free( impldif_dlg.nameBook );
+ impldif_dlg.nameBook = NULL;
+
+finish:
+ ldif_free( _ldifFile_ );
+ _ldifFile_ = NULL;
+ _imp_addressIndex_ = NULL;
+
+ if (ret)
+ debug_print("addressbook_imp_ldif_file: import succeeded\n");
+
+ return _importedBook_;
+}
+
/*
* End of Source.
*/
diff --git a/src/importldif.h b/src/importldif.h
index 5e648b34..2cc10e3b 100644
--- a/src/importldif.h
+++ b/src/importldif.h
@@ -26,6 +26,9 @@
/* Function prototypes */
AddressBookFile *addressbook_imp_ldif( AddressIndex *addrIndex );
+AddressBookFile *addressbook_imp_ldif_file( AddressIndex *addrIndex,
+ const gchar *file,
+ const gchar *book_name );
#endif /* __IMPORT_LDIF_H__ */
diff --git a/src/ldif.c b/src/ldif.c
index 805b1a54..a158faa2 100644
--- a/src/ldif.c
+++ b/src/ldif.c
@@ -486,7 +486,7 @@ static void ldif_add_user_attr( Ldif_ParsedRec *rec, gchar *tagName, gchar *tagV
if( ! fld->selected ) return;
name = fld->tagName;
- if( fld->userName ) {
+ if( fld->userName && *(fld->userName) ) {
name = fld->userName;
}
attr = g_new0( Ldif_UserAttr, 1 );
@@ -521,15 +521,22 @@ static void ldif_add_value( Ldif_ParsedRec *rec, gchar *tagName, gchar *tagValue
rec->listLName = g_slist_append( rec->listLName, val );
}
else if( g_ascii_strcasecmp( nm, LDIF_TAG_NICKNAME ) == 0 ||
+ g_ascii_strcasecmp( nm, LDIF_TAG_NICKNAME2 ) == 0 ||
g_ascii_strcasecmp( nm, LDIF_TAG_XNICKNAME ) == 0 ) {
rec->listNName = g_slist_append( rec->listNName, val );
}
else if( g_ascii_strcasecmp( nm, LDIF_TAG_EMAIL ) == 0 ) {
- rec->listAddress = g_slist_append( rec->listAddress, val );
+ if( g_slist_find_custom( rec->listAddress, val, (GCompareFunc)strcmp2 )) {
+ /* skip duplicated address */
+ g_free( val );
+ } else {
+ rec->listAddress = g_slist_append( rec->listAddress, val );
+ }
}
else {
/* Add field as user attribute */
ldif_add_user_attr( rec, tagName, tagValue, hashField );
+ g_free( val );
}
g_free( nm );
}
@@ -796,7 +803,9 @@ static void ldif_hash_add_list( GHashTable *table, GSList *list ) {
else if( g_ascii_strcasecmp( tag, LDIF_TAG_LASTNAME ) == 0 ) {
rec->reserved = TRUE;
}
- else if( g_ascii_strcasecmp( tag, LDIF_TAG_NICKNAME ) == 0 ) {
+ else if( g_ascii_strcasecmp( tag, LDIF_TAG_NICKNAME ) == 0 ||
+ g_ascii_strcasecmp( tag, LDIF_TAG_XNICKNAME) == 0 ||
+ g_ascii_strcasecmp( tag, LDIF_TAG_NICKNAME2) == 0 ) {
rec->reserved = TRUE;
}
else if( g_ascii_strcasecmp( tag, LDIF_TAG_EMAIL ) == 0 ) {
diff --git a/src/ldif.h b/src/ldif.h
index 90e3e563..05cd7229 100644
--- a/src/ldif.h
+++ b/src/ldif.h
@@ -40,6 +40,7 @@
#define LDIF_TAG_LASTNAME "sn"
#define LDIF_TAG_NICKNAME "mozillanickname"
#define LDIF_TAG_XNICKNAME "xmozillanickname"
+#define LDIF_TAG_NICKNAME2 "nickname"
#define LDIF_TAG_EMAIL "mail"
#define LDIF_SEP_TAG ':'
diff --git a/src/main.c b/src/main.c
index 8d2a7619..ca4d7caf 100644
--- a/src/main.c
+++ b/src/main.c
@@ -369,7 +369,7 @@ int main(int argc, char *argv[])
g_signal_emit_by_name(syl_app, "init-done");
if (first_run) {
- setup_import();
+ setup_import_data();
}
remote_command_exec();
diff --git a/src/setup.c b/src/setup.c
index f761c77e..e9b19eba 100644
--- a/src/setup.c
+++ b/src/setup.c
@@ -1114,7 +1114,7 @@ static GSList *get_dbx_source(void)
}
#endif /* G_OS_WIN32 */
-gint setup_import(void)
+gint setup_import_data(void)
{
#ifdef G_OS_WIN32
AlertValue val;
@@ -1123,9 +1123,9 @@ gint setup_import(void)
gchar *src;
Folder *folder;
FolderItem *parent, *dest;
- gint ok;
+ gint ok = 0;
- debug_print("setup_import\n");
+ debug_print("setup_import_data\n");
src_list = get_dbx_source();
if (!src_list)
@@ -1139,19 +1139,22 @@ gint setup_import(void)
folder = folder_get_default_folder();
if (!folder) {
g_warning("Cannot get default folder");
+ ok = -1;
goto finish;
}
parent = FOLDER_ITEM(folder->node->data);
if (!parent) {
g_warning("Cannot get root folder");
+ ok = -1;
goto finish;
}
- dest = folder_find_child_item_by_name(parent, "Imported");
+ dest = folder_find_child_item_by_name(parent, _("Imported"));
if (!dest) {
- dest = folder->klass->create_folder(folder, parent, "Imported");
+ dest = folder->klass->create_folder(folder, parent, _("Imported"));
}
if (!dest) {
g_warning("Cannot create a folder");
+ ok = -1;
goto finish;
}
parent = dest;
@@ -1160,7 +1163,9 @@ gint setup_import(void)
for (cur = src_list; cur != NULL; cur = cur->next) {
ident = (struct Identity *)cur->data;
- dest = folder->klass->create_folder(folder, parent, ident->name);
+ dest = folder_find_child_item_by_name(parent, ident->name);
+ if (!dest)
+ dest = folder->klass->create_folder(folder, parent, ident->name);
if (!dest)
continue;
folderview_append_item(folderview_get(), NULL, dest, TRUE);
@@ -1178,7 +1183,12 @@ finish:
g_free(ident);
}
g_slist_free(src_list);
-#endif /* G_OS_WIN32 */
+ if (ok == -1)
+ alertpanel_error(_("Failed to import the mail data."));
+
+ return ok;
+#else /* G_OS_WIN32 */
return 0;
+#endif /* G_OS_WIN32 */
}
diff --git a/src/setup.h b/src/setup.h
index 322f2e8c..0653e1cb 100644
--- a/src/setup.h
+++ b/src/setup.h
@@ -26,6 +26,6 @@
void setup_mailbox(void);
PrefsAccount *setup_account(void);
-gint setup_import(void);
+gint setup_import_data(void);
#endif /* __SETUP_H__ */