diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2010-08-17 07:09:27 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2010-08-17 07:09:27 +0000 |
commit | f7027562c816a9e975991020588547dae50efc15 (patch) | |
tree | 3ee185d6bb37ebdd85f7f1003a8225304710730e | |
parent | f5a0e4f278175802371808947f67d6d8991bc381 (diff) |
modified ldif parser. Fixed OE import on startup.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2672 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | src/importldif.c | 56 | ||||
-rw-r--r-- | src/importldif.h | 3 | ||||
-rw-r--r-- | src/ldif.c | 15 | ||||
-rw-r--r-- | src/ldif.h | 1 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/setup.c | 24 | ||||
-rw-r--r-- | src/setup.h | 2 |
8 files changed, 97 insertions, 14 deletions
@@ -1,6 +1,10 @@ -2010-08-12 +2010-08-17 - * version 3.1.0beta3 + * src/importldif.[ch]: addressbook_imp_ldif_file(): new function to + import LDIF file automatically. + * src/ldif.[ch]: supported "nickname" tag. Ignore null-string + fld->userName. Skip duplicated "mail" tags. Fixed a memory leak. + * src/setup.c: setup_import_data(): don't create duplicate folders. 2010-08-10 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__ */ @@ -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 ) { @@ -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 ':' @@ -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__ */ |