From c499f9f1bb18108d6ff11b3c507083dfd6b21f7d Mon Sep 17 00:00:00 2001 From: Match Grun Date: Mon, 16 Feb 2004 03:48:55 +0000 Subject: [PATCH] send from address book. --- ChangeLog.claws | 19 ++++- configure.ac | 2 +- src/addr_compl.c | 7 +- src/addr_compl.h | 2 +- src/addressbook.c | 141 ++++++++++++++++++++++-------- src/addrindex.c | 29 +++++-- src/addrindex.h | 3 - src/addrselect.c | 213 +++++++++++++++++++++++++++++----------------- src/addrselect.h | 1 + src/compose.c | 36 +++++++- src/compose.h | 3 + src/ldapquery.c | 79 +++++++++-------- src/ldapquery.h | 2 +- src/ldapserver.c | 30 +++++-- 14 files changed, 385 insertions(+), 182 deletions(-) diff --git a/ChangeLog.claws b/ChangeLog.claws index 15cbbb8e0..c73846e7d 100644 --- a/ChangeLog.claws +++ b/ChangeLog.claws @@ -1,3 +1,20 @@ +2003-02-15 [match] 0.9.9claws13 + + * src/ldapquery.[ch] + * src/ldapserver.h + * src/addrindex.[ch] + tweak threading calls. + * src/addr_compl.[ch] + add alias into completion list. + * src/addressbook.c + fix ldap browse. + improve context menu behavior. + change menu sequence. + add send mail from addressbook. + * src/addrselect.[ch] + * src/compose.[ch] + add send mail from addressbook. + 2003-02-15 [christoph] 0.9.9claws12 * src/folderutils.c @@ -200,7 +217,7 @@ 2004-01-25 [paul] 0.9.8claws48 - src/prefs_ext_prog.c + * src/prefs_ext_prog.c apply Alfons' patch to check for NULL pointers fixes bug #424 diff --git a/configure.ac b/configure.ac index 60dee2f89..0c8f9aa6c 100644 --- a/configure.ac +++ b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=9 MICRO_VERSION=9 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=12 +EXTRA_VERSION=13 if test $EXTRA_VERSION -eq 0; then VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws else diff --git a/src/addr_compl.c b/src/addr_compl.c index 2260a7802..795a1cbbb 100644 --- a/src/addr_compl.c +++ b/src/addr_compl.c @@ -1,7 +1,7 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client * - * Copyright (C) 2000-2004 by Alfons Hoogervorst & The Sylpheed Claws Team. + * Copyright (c) 2000-2004 by Alfons Hoogervorst * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -196,7 +196,9 @@ static gint add_address(const gchar *name, const gchar *address, const gchar *al add_address1(name, ae); add_address1(address, ae); - add_address1(alias, ae); + if( alias != NULL ) { + add_address1(alias, ae); + } return 0; } @@ -1137,7 +1139,6 @@ static void address_completion_create_completion_window( GtkEntry *entry_ ) gtk_widget_size_request( clist, &r ); gtk_widget_set_usize( window, width, r.height ); gtk_widget_show_all( window ); - gtk_widget_size_request( clist, &r ); /* Setup handlers */ gtk_signal_connect(GTK_OBJECT(clist), "select_row", diff --git a/src/addr_compl.h b/src/addr_compl.h index 9952eca39..4dda7138f 100644 --- a/src/addr_compl.h +++ b/src/addr_compl.h @@ -1,7 +1,7 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client * - * Copyright (C) 2000-2004 by Alfons Hoogervorst & The Sylpheed Claws Team. + * Copyright (c) 2000-2004 by Alfons Hoogervorst * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/addressbook.c b/src/addressbook.c index 29c937b7d..e3314d4a2 100644 --- a/src/addressbook.c +++ b/src/addressbook.c @@ -176,6 +176,10 @@ static void addressbook_tree_selected (GtkCTree *ctree, GtkCTreeNode *node, gint column, gpointer data); +static void addressbook_select_row_tree (GtkCTree *ctree, + GtkCTreeNode *node, + gint column, + gpointer data); static void addressbook_list_selected (GtkCList *clist, gint row, gint column, @@ -354,9 +358,9 @@ static void addressbook_treenode_cut_cb ( void ); static void addressbook_treenode_copy_cb ( void ); static void addressbook_treenode_paste_cb ( void ); -#ifdef USE_LDAP +static void addressbook_mail_to_cb ( void ); + static void addressbook_browse_entry_cb ( void ); -#endif static GtkItemFactoryEntry addressbook_entries[] = { @@ -388,6 +392,8 @@ static GtkItemFactoryEntry addressbook_entries[] = {N_("/_Address/---"), NULL, NULL, 0, ""}, {N_("/_Address/_Edit"), "Return", addressbook_edit_address_cb, 0, NULL}, {N_("/_Address/_Delete"), NULL, addressbook_delete_address_cb, 0, NULL}, + {N_("/_Address/---"), NULL, NULL, 0, ""}, + {N_("/_Address/_Mail To"), NULL, addressbook_mail_to_cb, 0, NULL}, {N_("/_Tools/---"), NULL, NULL, 0, ""}, {N_("/_Tools/Import _LDIF file..."), NULL, addressbook_import_ldif_cb, 0, NULL}, {N_("/_Tools/Import M_utt file..."), NULL, addressbook_import_mutt_cb, 0, NULL}, @@ -401,13 +407,13 @@ static GtkItemFactoryEntry addressbook_entries[] = static GtkItemFactoryEntry addressbook_tree_popup_entries[] = { - {N_("/New _Address"), NULL, addressbook_new_address_cb, 0, NULL}, - {N_("/New _Group"), NULL, addressbook_new_group_cb, 0, NULL}, - {N_("/New _Folder"), NULL, addressbook_new_folder_cb, 0, NULL}, - {N_("/---"), NULL, NULL, 0, ""}, {N_("/_Edit"), NULL, addressbook_treenode_edit_cb, 0, NULL}, {N_("/_Delete"), NULL, addressbook_treenode_delete_cb, 0, NULL}, {N_("/---"), NULL, NULL, 0, ""}, + {N_("/New _Address"), NULL, addressbook_new_address_cb, 0, NULL}, + {N_("/New _Group"), NULL, addressbook_new_group_cb, 0, NULL}, + {N_("/New _Folder"), NULL, addressbook_new_folder_cb, 0, NULL}, + {N_("/---"), NULL, NULL, 0, ""}, {N_("/C_ut"), NULL, addressbook_treenode_cut_cb, 0, NULL}, {N_("/_Copy"), NULL, addressbook_treenode_copy_cb, 0, NULL}, {N_("/_Paste"), NULL, addressbook_treenode_paste_cb, 0, NULL} @@ -415,22 +421,22 @@ static GtkItemFactoryEntry addressbook_tree_popup_entries[] = static GtkItemFactoryEntry addressbook_list_popup_entries[] = { + {N_("/_Edit"), NULL, addressbook_edit_address_cb, 0, NULL}, + {N_("/_Delete"), NULL, addressbook_delete_address_cb, 0, NULL}, + {N_("/---"), NULL, NULL, 0, ""}, {N_("/New _Address"), NULL, addressbook_new_address_cb, 0, NULL}, {N_("/New _Group"), NULL, addressbook_new_group_cb, 0, NULL}, {N_("/New _Folder"), NULL, addressbook_new_folder_cb, 0, NULL}, {N_("/---"), NULL, NULL, 0, ""}, - {N_("/_Edit"), NULL, addressbook_edit_address_cb, 0, NULL}, - {N_("/_Delete"), NULL, addressbook_delete_address_cb, 0, NULL}, - {N_("/---"), NULL, NULL, 0, ""}, {N_("/C_ut"), NULL, addressbook_clip_cut_cb, 0, NULL}, {N_("/_Copy"), NULL, addressbook_clip_copy_cb, 0, NULL}, {N_("/_Paste"), NULL, addressbook_clip_paste_cb, 0, NULL}, {N_("/---"), NULL, NULL, 0, ""}, -#ifdef USE_LDAP {N_("/Pa_ste Address"), NULL, addressbook_clip_paste_address_cb, 0, NULL}, + {N_("/_Mail To"), NULL, addressbook_mail_to_cb, 0, NULL} +#ifdef USE_LDAP + , {N_("/_Browse Entry"), NULL, addressbook_browse_entry_cb, 0, NULL} -#else - {N_("/Pa_ste Address"), NULL, addressbook_clip_paste_address_cb, 0, NULL} #endif }; @@ -689,6 +695,9 @@ static void addressbook_create(void) gtk_signal_connect(GTK_OBJECT(ctree), "button_release_event", GTK_SIGNAL_FUNC(addressbook_tree_button_released), NULL); + /* TEMPORARY */ + gtk_signal_connect(GTK_OBJECT(ctree), "select_row", + GTK_SIGNAL_FUNC(addressbook_select_row_tree), NULL); clist_vbox = gtk_vbox_new(FALSE, 4); @@ -1222,6 +1231,7 @@ static void addressbook_menubar_set_sensitive( gboolean sensitive ) { menu_set_sensitive( addrbook.menu_factory, "/Address/New Address", sensitive ); menu_set_sensitive( addrbook.menu_factory, "/Address/New Group", sensitive ); menu_set_sensitive( addrbook.menu_factory, "/Address/New Folder", sensitive ); + menu_set_sensitive( addrbook.menu_factory, "/Address/Mail To", sensitive ); gtk_widget_set_sensitive( addrbook.reg_btn, sensitive ); gtk_widget_set_sensitive( addrbook.del_btn, sensitive ); } @@ -1321,6 +1331,14 @@ static void addressbook_tree_selected(GtkCTree *ctree, GtkCTreeNode *node, ItemFolder *rootFolder = NULL; AddressObjectType aot; + if( addrbook.treeSelected == node ) { + /* + * Prevent double selection - this happens with a mouse + * click but not with a key-press. + */ + /* return; */ + } + addrbook.treeSelected = node; addrbook.listSelected = NULL; addressbook_status_show( "" ); @@ -1453,8 +1471,11 @@ static void addressbook_list_menu_setup( void ) { canDelete = canEdit; - /* Disable edit if more than one row selected */ - if( GTK_CLIST(clist)->selection && GTK_CLIST(clist)->selection->next ) canEdit = FALSE; + /* Disable edit or browse if more than one row selected */ + if( GTK_CLIST(clist)->selection && GTK_CLIST(clist)->selection->next ) { + canEdit = FALSE; + canBrowse = FALSE; + } /* Now go finalize menu items */ menu_set_sensitive( addrbook.list_factory, "/Edit", canEdit ); @@ -1465,22 +1486,25 @@ static void addressbook_list_menu_setup( void ) { menu_set_sensitive( addrbook.list_factory, "/Paste", canPaste ); menu_set_sensitive( addrbook.list_factory, "/Paste Address", canPaste ); + menu_set_sensitive( addrbook.list_factory, "/Mail To", canCopy ); + menu_set_sensitive( addrbook.menu_factory, "/Edit/Cut", canCut ); menu_set_sensitive( addrbook.menu_factory, "/Edit/Copy", canCopy ); menu_set_sensitive( addrbook.menu_factory, "/Edit/Paste", canPaste ); menu_set_sensitive( addrbook.menu_factory, "/Edit/Paste Address", canPaste ); - menu_set_sensitive( addrbook.tree_factory, "/Cut", canCut ); - menu_set_sensitive( addrbook.tree_factory, "/Copy", canCopy ); - menu_set_sensitive( addrbook.tree_factory, "/Paste", canPaste ); + menu_set_sensitive( addrbook.tree_factory, "/Cut", canCut ); + menu_set_sensitive( addrbook.tree_factory, "/Copy", canCopy ); + menu_set_sensitive( addrbook.tree_factory, "/Paste", canPaste ); - menu_set_sensitive( addrbook.menu_factory, "/Address/Edit", canEdit ); - menu_set_sensitive( addrbook.menu_factory, "/Address/Delete", canDelete ); + menu_set_sensitive( addrbook.menu_factory, "/Address/Edit", canEdit ); + menu_set_sensitive( addrbook.menu_factory, "/Address/Delete", canDelete ); + menu_set_sensitive( addrbook.menu_factory, "/Address/Mail To", canCopy ); gtk_widget_set_sensitive( addrbook.del_btn, canDelete ); #ifdef USE_LDAP - menu_set_sensitive( addrbook.list_factory, "/Browse Entry", canBrowse ); + menu_set_sensitive( addrbook.list_factory, "/Browse Entry", canBrowse ); #endif } @@ -1497,6 +1521,13 @@ static void addressbook_list_selected(GtkCList *clist, gint row, gint column, } } +static void addressbook_select_row_tree (GtkCTree *ctree, + GtkCTreeNode *node, + gint column, + gpointer data) +{ +} + /** * Add list of items into tree node below specified tree node. * \param treeNode Tree node. @@ -1771,6 +1802,11 @@ static void addressbook_list_select_clear( void ) { addrselect_list_clear( _addressSelect_ ); } +/** + * Add specified address item to selected address list. + * \param aio Address item object. + * \param ds Datasource. + */ static void addressbook_list_select_add( AddrItemObject *aio, AddressDataSource *ds ) { gchar *cacheID; @@ -1780,10 +1816,28 @@ static void addressbook_list_select_add( AddrItemObject *aio, AddressDataSource g_free( cacheID ); } +/** + * Remove specified address item from selected address list. + * \param aio Address item object. + */ static void addressbook_list_select_remove( AddrItemObject *aio ) { addrselect_list_remove( _addressSelect_, aio ); } +/** + * Invoke EMail compose window with addresses in selected address list. + */ +static void addressbook_mail_to_cb( void ) { + GList *listAddress; + + if( ! addrselect_test_empty( _addressSelect_ ) ) { + listAddress = addrselect_build_list( _addressSelect_ ); + compose_new_with_list( NULL, listAddress ); + mgu_free_dlist( listAddress ); + listAddress = NULL; + } +} + static void addressbook_list_row_selected( GtkCTree *clist, GtkCTreeNode *node, gint column, @@ -1841,13 +1895,12 @@ static void addressbook_list_button_pressed(GtkWidget *widget, gpointer data) { if( ! event ) return; - addressbook_list_menu_setup(); - if( event->button == 3 ) { gtk_menu_popup( GTK_MENU(addrbook.list_popup), NULL, NULL, NULL, NULL, event->button, event->time ); } + } static void addressbook_list_button_released(GtkWidget *widget, @@ -1982,17 +2035,10 @@ static void addressbook_tree_button_released(GtkWidget *ctree, GdkEventButton *event, gpointer data) { - gtk_ctree_select(GTK_CTREE(addrbook.ctree), addrbook.opened); - gtkut_ctree_set_focus_row(GTK_CTREE(addrbook.ctree), addrbook.opened); } static void addressbook_popup_close(GtkMenuShell *menu_shell, gpointer data) { - if (!addrbook.opened) return; - - gtk_ctree_select(GTK_CTREE(addrbook.ctree), addrbook.opened); - gtkut_ctree_set_focus_row(GTK_CTREE(addrbook.ctree), - addrbook.opened); } static void addressbook_new_folder_cb(gpointer data, guint action, @@ -2318,7 +2364,14 @@ static void addressbook_treenode_delete_cb( AdapterFolder *adapter = ADAPTER_FOLDER(obj); ItemFolder *folder = adapter->itemFolder; + adapter->itemFolder = NULL; + /* + printf( "remove folder for ::%s::\n", obj->name ); + printf( " folder name ::%s::\n", ADDRITEM_NAME(folder) ); + printf( "-------------- remove results\n" ); + */ addrindex_remove_results( ds, folder ); + /* printf( "-------------- remove node\n" ); */ gtk_ctree_remove_node( ctree, node ); return; } @@ -3532,6 +3585,23 @@ static void addressbook_search_idle( gpointer data ) { */ } +/** + * Search completion callback function. This removes the query from the idle + * list. + * + * \param queryID Query ID of search request. + */ +void addressbook_clear_idler( gint queryID ) { + gpointer ptrQID; + + /* Remove idler function */ + /* printf( "addressbook_clear_idler::%d::\n", queryID ); */ + ptrQID = GINT_TO_POINTER( queryID ); + if( ptrQID ) { + gtk_idle_remove_by_data( ptrQID ); + } +} + /** * Search completion callback function. This removes the query from the idle * list. @@ -3682,6 +3752,7 @@ static void addressbook_lup_clicked( GtkButton *button, gpointer data ) { parentNode = node; } addressbook_perform_search( ds, searchTerm, parentNode ); + gtk_widget_grab_focus( addrbook.entry ); g_free( searchTerm ); } @@ -3689,7 +3760,6 @@ static void addressbook_lup_clicked( GtkButton *button, gpointer data ) { /** * Browse address entry for highlighted entry. */ -#ifdef USE_LDAP static void addressbook_browse_entry_cb(void) { GtkCTree *clist = GTK_CTREE(addrbook.clist); @@ -3701,19 +3771,19 @@ static void addressbook_browse_entry_cb(void) if(addrbook.listSelected == NULL) return; - + obj = gtk_ctree_node_get_row_data(clist, addrbook.listSelected); if (obj == NULL) return; - + ds = addressbook_find_datasource(GTK_CTREE_NODE(addrbook.treeSelected)); if(ds == NULL) return; - + iface = ds->interface; - if(iface->haveLibrary == NULL) + if(! iface->haveLibrary ) return; - + person = NULL; if (obj->type == ADDR_ITEM_EMAIL) { email = ( ItemEMail * ) obj; @@ -3736,7 +3806,6 @@ static void addressbook_browse_entry_cb(void) #endif } } -#endif /* ********************************************************************** diff --git a/src/addrindex.c b/src/addrindex.c index 6527fc2da..cba52c6c4 100644 --- a/src/addrindex.c +++ b/src/addrindex.c @@ -2737,8 +2737,11 @@ void addrindex_remove_results( AddressDataSource *ds, ItemFolder *folder ) { AddressCache *cache; gint queryID = 0; + /* printf( "addrindex_remove_results/start\n" ); */ + /* Test for folder */ if( folder->folderType != ADDRFOLDER_QUERY_RESULTS ) return; + /* printf( "folder name ::%s::\n", ADDRITEM_NAME(folder) ); */ adbase = ( AddrBookBase * ) ds->rawDataSource; if( adbase == NULL ) return; cache = adbase->addressCache; @@ -2748,13 +2751,26 @@ void addrindex_remove_results( AddressDataSource *ds, ItemFolder *folder ) { if( ds->type == ADDR_IF_LDAP ) { #ifdef USE_LDAP - LdapQuery *qry; + LdapQuery *qry; + gboolean delFlag; qry = ( LdapQuery * ) folder->folderData; queryID = ADDRQUERY_ID(qry); - ldapquery_remove_results( qry ); + /* printf( "calling ldapquery_remove_results...queryID=%d\n", queryID ); */ + delFlag = ldapquery_remove_results( qry ); + /* printf( "calling ldapquery_remove_results...done\n" ); */ + /* + if( delFlag ) { + printf( "delFlag IS-TRUE\n" ); + } + else { + printf( "delFlag IS-FALSE\n" ); + addressbook_clear_idler( queryID ); + } + */ #endif } + /* printf( "addrindex_remove_results/end\n" ); */ /* Delete query request */ if( queryID > 0 ) { @@ -2816,9 +2832,9 @@ gboolean addrindex_load_completion( nodeM = person->listEMail; /* Figure out name to use */ - sName = person->nickName; + sName = ADDRITEM_NAME(person); if( sName == NULL || *sName == '\0' ) { - sName = ADDRITEM_NAME(person); + sName = person->nickName; } /* Process each E-Mail address */ @@ -2829,10 +2845,11 @@ gboolean addrindex_load_completion( sAddress = email->address; if( sAddress || *sAddress != '\0' ) { sAlias = ADDRITEM_NAME(email); - if( sAlias && *sAlias != '\0' ) { + // if( sAlias && *sAlias != '\0' ) { + if( sFriendly == NULL || *sFriendly == '\0' ) { sFriendly = sAlias; } - ( callBackFunc ) ( sFriendly, sAddress, sName ); + ( callBackFunc ) ( sFriendly, sAddress, sAlias ); } nodeM = g_list_next( nodeM ); diff --git a/src/addrindex.h b/src/addrindex.h index 94789c595..ef928d040 100644 --- a/src/addrindex.h +++ b/src/addrindex.h @@ -176,9 +176,6 @@ void addrindex_remove_results ( AddressDataSource *ds, gboolean addrindex_load_completion( gint (*callBackFunc) ( const gchar *, const gchar *, const gchar * ) ); -gint addrindex_setup_explicit_search( - AddressDataSource *ds, const gchar *searchTerm, ItemFolder *folder, - void *callBackEnd, void *callBackEntry ); #endif /* __ADDRINDEX_H__ */ diff --git a/src/addrselect.c b/src/addrselect.c index 319acdccb..49ab23d2e 100644 --- a/src/addrselect.c +++ b/src/addrselect.c @@ -28,10 +28,11 @@ #include "addressitem.h" #include "mgutils.h" -/* -* Create a selection record from an address cache item. -* Enter: aio Item object. -*/ +/** + * Create a selection record from an address cache item. + * \param aio Item object. + * \return Address select item. + */ AddrSelectItem *addrselect_create_item( AddrItemObject *aio ) { AddrSelectItem *item = NULL; @@ -45,10 +46,11 @@ AddrSelectItem *addrselect_create_item( AddrItemObject *aio ) { return item; } -/* -* Create a selection record from an address object (in tree node). -* Enter: obj Address object. -*/ +/** + * Create a selection record from an address object (in tree node). + * \param obj Address object. + * \return Address select item. + */ AddrSelectItem *addrselect_create_node( AddressObject *obj ) { AddrSelectItem *item = NULL; @@ -62,10 +64,11 @@ AddrSelectItem *addrselect_create_node( AddressObject *obj ) { return item; } -/* -* Create a copy of a selection record. -* Enter: item Address entry to copy. -*/ +/** + * Create a copy of a selection record. + * Enter: item Address entry to copy. + * \return Address select item. + */ AddrSelectItem *addrselect_item_copy( AddrSelectItem *item ) { AddrSelectItem *copy = NULL; @@ -79,9 +82,10 @@ AddrSelectItem *addrselect_item_copy( AddrSelectItem *item ) { return copy; } -/* -* Free selection record. -*/ +/** + * Free selection record. + * \return Address select item. + */ void addrselect_item_free( AddrSelectItem *item ) { if( item ) { g_free( item->uid ); @@ -94,14 +98,21 @@ void addrselect_item_free( AddrSelectItem *item ) { g_free( item ); } -/* -* Properties. -*/ +/** + * Specify cache ID for specified item. + * \param item Address select item. + * \param value Cache ID. + */ void addrselect_set_cache_id( AddrSelectItem *item, const gchar *value ) { g_return_if_fail( item != NULL ); item->cacheID = mgu_replace_string( item->cacheID, value ); } +/** + * Print address selection item. + * \param item Address select item. + * \param stream Output stream. + */ void addrselect_item_print( AddrSelectItem *item, FILE *stream ) { fprintf( stream, "Select Record\n" ); fprintf( stream, "obj type: %d\n", item->objectType ); @@ -110,10 +121,10 @@ void addrselect_item_print( AddrSelectItem *item, FILE *stream ) { fprintf( stream, "---\n" ); } -/* -* Create a new selection. -* Return: Initialized object. -*/ +/** + * Create a new address selection object. + * \return Initialized object. + */ AddrSelectList *addrselect_list_create() { AddrSelectList *asl; @@ -122,10 +133,10 @@ AddrSelectList *addrselect_list_create() { return asl; } -/* -* Clear list of selection records. -* Enter: asl List to process. -*/ +/** + * Clear list of selection records. + * \param asl List to process. + */ void addrselect_list_clear( AddrSelectList *asl ) { GList *node; @@ -143,10 +154,10 @@ void addrselect_list_clear( AddrSelectList *asl ) { asl->listSelect = NULL; } -/* -* Free selection list. -* Enter: asl List to free. -*/ +/** + * Free selection list. + * \param asl List to free. + */ void addrselect_list_free( AddrSelectList *asl ) { g_return_if_fail( asl != NULL ); @@ -156,22 +167,23 @@ void addrselect_list_free( AddrSelectList *asl ) { g_free( asl ); } -/* -* Test whether selection is empty. -* Enter: asl List to test. -* Return: TRUE if list is empty. -*/ +/** + * Test whether selection is empty. + * \param asl List to test. + * \return TRUE if list is empty. + */ gboolean addrselect_test_empty( AddrSelectList *asl ) { g_return_val_if_fail( asl != NULL, TRUE ); return ( asl->listSelect == NULL ); } -/* -* Return list of AddrSelectItem objects. -* Enter: asl List to process. -* Return: List of selection items. The list should should be g_list_free() -* when done. Items contained in the list should not be freed!!! -*/ +/** + * Return list of AddrSelectItem objects. + * \param asl List to process. + * \return List of selection items. The list should should be freed with + * g_list_free() when done. Items contained in the + * list should not be freed!!! + */ GList *addrselect_get_list( AddrSelectList *asl ) { GList *node, *list; @@ -185,6 +197,11 @@ GList *addrselect_get_list( AddrSelectList *asl ) { return list; } +/** + * Format address item. + * \param aio Item. + * \return Formatted address. + */ static gchar *addrselect_format_address( AddrItemObject * aio ) { gchar *buf = NULL; gchar *name = NULL; @@ -232,11 +249,11 @@ static gchar *addrselect_format_address( AddrItemObject * aio ) { return buf; } -/* -* Print formatted addresses list to specified stream. -* Enter: asl List to process. -* stream Stream. -*/ +/** + * Print formatted addresses list to specified stream. + * \param asl List to process. + * \param stream Stream. + */ void addrselect_list_print( AddrSelectList *asl, FILE *stream ) { GList *node; @@ -282,11 +299,11 @@ void addrselect_list_print( AddrSelectList *asl, FILE *stream ) { fprintf( stream, "show selection...<<<\n" ); } -/* -* Print address items to specified stream. -* Enter: asl List to process. -* stream Stream. -*/ +/** + * Print address items to specified stream. + * \param asl List to process. + * \param stream Stream. + */ void addrselect_list_show( AddrSelectList *asl, FILE *stream ) { GList *node; @@ -303,12 +320,12 @@ void addrselect_list_show( AddrSelectList *asl, FILE *stream ) { fprintf( stream, "show selection...<<<\n" ); } -/* -* Test whether specified object is in list. -* Enter: list List to check. -* aio Object to test. -* Return item found, or NULL if not in list. -*/ +/** + * Test whether specified object is in list. + * \param list List to check. + * \param aio Object to test. + * \param item found, or NULL if not in list. + */ static AddrSelectItem *addrselect_list_find( GList *list, AddrItemObject *aio ) { GList *node; @@ -323,13 +340,12 @@ static AddrSelectItem *addrselect_list_find( GList *list, AddrItemObject *aio ) return NULL; } -/* -* Add a single object into the list. -* Enter: asl Address selection object. -* obj Address object. -* cacheID Cache ID. Should be g_free() after calling function. -* Return: Adjusted list. -*/ +/** + * Add a single object into the list. + * \param asl Address selection object. + * \param aio Address object. + * \param cacheID Cache ID. Should be freed after calling function. + */ void addrselect_list_add_obj( AddrSelectList *asl, AddrItemObject *aio, gchar *cacheID ) { AddrSelectItem *item; @@ -349,13 +365,12 @@ void addrselect_list_add_obj( AddrSelectList *asl, AddrItemObject *aio, gchar *c /* addrselect_list_show( asl, stdout ); */ } -/* -* Add a single item into the list. -* Enter: asl Address selection object. -* item Address select item. -* cacheID Cache ID. Should be g_free() after calling function. -* Return: Adjusted list. -*/ +/** + * Add a single item into the list. + * \param asl Address selection object. + * \param item Address select item. + * \param cacheID Cache ID. Should be g_free() after calling function. + */ void addrselect_list_add( AddrSelectList *asl, AddrSelectItem *item, gchar *cacheID ) { g_return_if_fail( asl != NULL ); if( item == NULL ) return; @@ -367,11 +382,11 @@ void addrselect_list_add( AddrSelectList *asl, AddrSelectItem *item, gchar *cach asl->listSelect = g_list_append( asl->listSelect, item ); } -/* -* Remove specified object from list. -* Enter: asl Address selection object. -* aio Object to remove. -*/ +/** + * Remove specified object from list. + * \param asl Address selection object. + * \param aio Object to remove. + */ void addrselect_list_remove( AddrSelectList *asl, AddrItemObject *aio ) { GList *node; AddrSelectItem *item; @@ -392,6 +407,52 @@ void addrselect_list_remove( AddrSelectList *asl, AddrItemObject *aio ) { /* addrselect_list_show( list, stdout ); */ } +/** + * Build list of formatted addresses. + * \param asl List to process. + * \return List of addresses, formatted as character strings. List should be + * freed when no longer required. + */ +GList *addrselect_build_list( AddrSelectList *asl ) { + GList *list; + GList *node; + + g_return_val_if_fail(asl != NULL, NULL); + list = NULL; + node = asl->listSelect; + while( node != NULL ) { + AddrSelectItem *item; + AddrItemObject *aio; + gchar *addr; + + item = node->data; + aio = ( AddrItemObject * ) item->addressItem; + if( aio ) { + if( aio->type == ADDR_ITEM_GROUP ) { + ItemGroup *group = ( ItemGroup * ) aio; + GList *node = group->listEMail; + while( node ) { + ItemEMail *email = node->data; + addr = addrselect_format_address( + ( AddrItemObject * ) email ); + if( addr ) { + list = g_list_append( list, addr ); + } + node = g_list_next( node ); + } + } + else { + addr = addrselect_format_address( aio ); + if( addr ) { + list = g_list_append( list, addr ); + } + } + } + node = g_list_next( node ); + } + return list; +} + /* * End of Source. */ diff --git a/src/addrselect.h b/src/addrselect.h index 78d7e2b4b..38abe89f8 100644 --- a/src/addrselect.h +++ b/src/addrselect.h @@ -70,6 +70,7 @@ void addrselect_list_show ( AddrSelectList *asl, FILE *stream ); void addrselect_list_print ( AddrSelectList *asl, FILE *stream ); +GList *addrselect_build_list ( AddrSelectList *asl ); #endif /* __ADDR_SELECT_H__ */ diff --git a/src/compose.c b/src/compose.c index ec3531f60..f5b1e1b1c 100644 --- a/src/compose.c +++ b/src/compose.c @@ -170,7 +170,8 @@ static GList *compose_list = NULL; Compose *compose_generic_new (PrefsAccount *account, const gchar *to, FolderItem *item, - GPtrArray *attach_files); + GPtrArray *attach_files, + GList *listAddress ); static Compose *compose_create (PrefsAccount *account, ComposeMode mode); @@ -299,6 +300,9 @@ static void compose_create_header_entry (Compose *compose); static void compose_add_header_entry (Compose *compose, gchar *header, gchar *text); static void compose_update_priority_menu_item(Compose * compose); +static void compose_add_field_list ( Compose *compose, + GList *listAddress ); + /* callback functions */ static gboolean compose_edit_size_alloc (GtkEditable *widget, @@ -689,16 +693,21 @@ static GtkTargetEntry compose_mime_types[] = Compose *compose_new(PrefsAccount *account, const gchar *mailto, GPtrArray *attach_files) { - return compose_generic_new(account, mailto, NULL, attach_files); + return compose_generic_new(account, mailto, NULL, attach_files, NULL); } Compose *compose_new_with_folderitem(PrefsAccount *account, FolderItem *item) { - return compose_generic_new(account, NULL, item, NULL); + return compose_generic_new(account, NULL, item, NULL, NULL); +} + +Compose *compose_new_with_list( PrefsAccount *account, GList *listAddress ) +{ + return compose_generic_new( account, NULL, NULL, NULL, listAddress ); } Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderItem *item, - GPtrArray *attach_files) + GPtrArray *attach_files, GList *listAddress ) { Compose *compose; GtkSText *text; @@ -754,6 +763,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI */ menu_set_sensitive(ifactory, "/Message/Request Return Receipt", FALSE); } + compose_add_field_list( compose, listAddress ); if (attach_files) { gint i; @@ -7288,3 +7298,21 @@ static void compose_check_forwards_go(Compose *compose) } #endif +/** + * Add entry field for each address in list. + * \param compose E-Mail composition object. + * \param listAddress List of (formatted) E-Mail addresses. + */ +static void compose_add_field_list( Compose *compose, GList *listAddress ) { + GList *node = listAddress; + while( node ) { + gchar *addr = node->data; + compose_entry_append( compose, addr, COMPOSE_TO ); + node = g_list_next( node ); + } +} + +/* + * End of Source. + */ + diff --git a/src/compose.h b/src/compose.h index f179ab34a..68e0f0b75 100644 --- a/src/compose.h +++ b/src/compose.h @@ -225,6 +225,9 @@ Compose *compose_new (PrefsAccount *account, Compose *compose_new_with_folderitem (PrefsAccount *account, FolderItem *item); +Compose *compose_new_with_list (PrefsAccount *account, + GList *listAddress); + void compose_reply_mode (ComposeMode mode, GSList *msginfo_list, gchar *body); diff --git a/src/ldapquery.c b/src/ldapquery.c index 59f2d7566..0180cce95 100644 --- a/src/ldapquery.c +++ b/src/ldapquery.c @@ -518,9 +518,10 @@ static GList *ldapqry_build_items_fl( ItemPerson *person; ItemEMail *email; ItemFolder *folder; - GList *listReturn; + GList *listReturn = NULL; - listReturn = NULL; + folder = ADDRQUERY_FOLDER(qry); + if( folder == NULL ) return listReturn; if( listAddr == NULL ) return listReturn; /* Find longest first name in list */ @@ -555,21 +556,6 @@ static GList *ldapqry_build_items_fl( } } - /* Create new folder for results */ - if( ADDRQUERY_FOLDER(qry) == NULL ) { - folder = addritem_create_item_folder(); - addritem_folder_set_name( folder, ADDRQUERY_NAME(qry) ); - addritem_folder_set_remarks( folder, "" ); - addrcache_id_folder( cache, folder ); - addrcache_add_folder( cache, folder ); - ADDRQUERY_FOLDER(qry) = folder; - - /* Specify folder type and back reference */ - folder->folderType = ADDRFOLDER_QUERY_RESULTS; - folder->folderData = ( gpointer ) qry; - folder->isHidden = TRUE; - } - /* Add person into folder */ person = addritem_create_item_person(); addritem_person_set_common_name( person, fullName ); @@ -792,6 +778,7 @@ static gint ldapqry_search_retrieve( LdapQuery *qry ) { LDAPMessage *result, *e; char **attribs; gchar *criteria; + gboolean searchFlag; gboolean entriesFound; gboolean first; struct timeval timeout; @@ -829,17 +816,26 @@ static gint ldapqry_search_retrieve( LdapQuery *qry ) { return ADDRQUERY_RETVAL(qry); } ADDRQUERY_RETVAL(qry) = LDAPRC_SEARCH; - if( rc != LDAP_SUCCESS ) { + + /* Test valid returns */ + searchFlag = FALSE; + if( rc == LDAP_ADMINLIMIT_EXCEEDED ) { + searchFlag = TRUE; + } + else if( rc == LDAP_SUCCESS ) { + searchFlag = TRUE; + } + else if( rc == LDAP_PARTIAL_RESULTS ) { + searchFlag = TRUE; + } + else { /* + printf( "LDAP Error: ldap_search_st: %d\n", rc ); printf( "LDAP Error: ldap_search_st: %s\n", ldap_err2string( rc ) ); */ return ADDRQUERY_RETVAL(qry); } ADDRQUERY_RETVAL(qry) = LDAPRC_STOP_FLAG; - if( ldapqry_get_stop_flag( qry ) ) { - return ADDRQUERY_RETVAL(qry); - } - ldapqry_touch( qry ); /* printf( "Total results are: %d\n", ldap_count_entries( ld, result ) ); @@ -847,7 +843,7 @@ static gint ldapqry_search_retrieve( LdapQuery *qry ) { /* Process results */ first = TRUE; - while( TRUE ) { + while( searchFlag ) { ldapqry_touch( qry ); if( qry->entriesRead >= ctl->maxEntries ) break; @@ -865,7 +861,6 @@ static gint ldapqry_search_retrieve( LdapQuery *qry ) { e = ldap_next_entry( ld, e ); } if( e == NULL ) break; - entriesFound = TRUE; /* Setup a critical section here */ @@ -881,18 +876,19 @@ static gint ldapqry_search_retrieve( LdapQuery *qry ) { else { g_list_free( listEMail ); } - pthread_mutex_unlock( qry->mutexEntry ); } /* Free up and disconnect */ ldap_msgfree( result ); - if( entriesFound ) { - ADDRQUERY_RETVAL(qry) = LDAPRC_SUCCESS; - } - else { - ADDRQUERY_RETVAL(qry) = LDAPRC_NOENTRIES; + if( searchFlag ) { + if( entriesFound ) { + ADDRQUERY_RETVAL(qry) = LDAPRC_SUCCESS; + } + else { + ADDRQUERY_RETVAL(qry) = LDAPRC_NOENTRIES; + } } return ADDRQUERY_RETVAL(qry); @@ -1028,9 +1024,6 @@ static void ldapqry_destroyer( void * ptr ) { qry->control = NULL; qry->thread = NULL; ldapqry_set_busy_flag( qry, FALSE ); - /* - printf( "...destroy exiting\n" ); - */ } /** @@ -1045,6 +1038,7 @@ void ldapqry_cancel( LdapQuery *qry ) { */ if( ldapqry_get_busy_flag( qry ) ) { if( qry->thread ) { + /* printf( "calling pthread_cancel\n" ); */ pthread_cancel( * qry->thread ); } } @@ -1260,17 +1254,13 @@ static gint ldapqry_locate_retrieve( LdapQuery *qry ) { */ return ADDRQUERY_RETVAL(qry); } - ADDRQUERY_RETVAL(qry) = LDAPRC_STOP_FLAG; - if( ldapqry_get_stop_flag( qry ) ) { - return ADDRQUERY_RETVAL(qry); - } - ldapqry_touch( qry ); /* printf( "Total results are: %d\n", ldap_count_entries( ld, result ) ); */ /* Process results */ + ADDRQUERY_RETVAL(qry) = LDAPRC_STOP_FLAG; first = TRUE; while( TRUE ) { ldapqry_touch( qry ); @@ -1352,8 +1342,11 @@ gint ldapqry_perform_locate( LdapQuery *qry ) { /** * Remove results (folder and data) for specified LDAP query. * \param qry Query object to process. + * \return TRUE if folder deleted successfully. */ -void ldapquery_remove_results( LdapQuery *qry ) { +gboolean ldapquery_remove_results( LdapQuery *qry ) { + gboolean retVal = FALSE; + /* Set query as aged - will be retired on a later call */ ldapqry_set_aged_flag( qry, TRUE ); /* @@ -1364,13 +1357,17 @@ void ldapquery_remove_results( LdapQuery *qry ) { /* Query is still busy - cancel query */ /* printf( "\tquery is still busy running...\n" ); */ ldapqry_set_stop_flag( qry, TRUE ); - ldapqry_cancel( qry ); + + /* ldapqry_cancel( qry ); */ } else { /* Delete folder */ /* printf( "\tquery can be deleted!\n" ); */ - ldapqry_delete_folder( qry ); + /* ldapqry_delete_folder( qry ); */ + retVal = TRUE; + /* printf( "\tquery deleted!\n" ); */ } + return retVal; } #endif /* USE_LDAP */ diff --git a/src/ldapquery.h b/src/ldapquery.h index 59b28cf25..eaa0e24f2 100644 --- a/src/ldapquery.h +++ b/src/ldapquery.h @@ -99,7 +99,7 @@ gint ldapqry_read_data_th ( LdapQuery *qry ); void ldapqry_cancel ( LdapQuery *qry ); void ldapqry_age ( LdapQuery *qry, gint maxAge ); void ldapqry_delete_folder ( LdapQuery *qry ); -void ldapquery_remove_results ( LdapQuery *qry ); +gboolean ldapquery_remove_results( LdapQuery *qry ); #endif /* USE_LDAP */ diff --git a/src/ldapserver.c b/src/ldapserver.c index 51615824f..beab458de 100644 --- a/src/ldapserver.c +++ b/src/ldapserver.c @@ -609,6 +609,7 @@ LdapQuery *ldapsvr_new_dynamic_search( LdapServer *server, QueryRequest *req ) LdapQuery *qry; gchar *name; gchar *searchTerm; + ItemFolder *folder; g_return_val_if_fail( server != NULL, NULL ); g_return_val_if_fail( req != NULL, NULL ); @@ -616,7 +617,14 @@ LdapQuery *ldapsvr_new_dynamic_search( LdapServer *server, QueryRequest *req ) /* Retire any aged queries */ /* // ldapsvr_retire_query( server ); */ + /* Name of folder and query */ searchTerm = req->searchTerm; + name = g_strdup_printf( "Search '%s'", searchTerm ); + + /* Create a folder for the search results */ + folder = addrcache_add_new_folder( server->addressCache, NULL ); + addritem_folder_set_name( folder, name ); + addritem_folder_set_remarks( folder, "" ); /* Construct a query */ qry = ldapqry_create(); @@ -626,8 +634,13 @@ LdapQuery *ldapsvr_new_dynamic_search( LdapServer *server, QueryRequest *req ) ldapqry_set_callback_entry( qry, req->callBackEntry ); ldapqry_set_callback_end( qry, req->callBackEnd ); + /* Specify folder type and back reference */ + ADDRQUERY_FOLDER(qry) = folder; + folder->folderType = ADDRFOLDER_QUERY_RESULTS; + folder->folderData = ( gpointer ) qry; + folder->isHidden = TRUE; + /* Name the query */ - name = g_strdup_printf( "Search for '%s'", searchTerm ); ldapqry_set_name( qry, name ); g_free( name ); @@ -646,7 +659,7 @@ LdapQuery *ldapsvr_new_dynamic_search( LdapServer *server, QueryRequest *req ) * * \param server LdapServer. * \param req Query request. - * \param folder Folder that will be used to contain search results; may be NULL. + * \param folder Folder that will be used to contain search results. * \return LdapQuery object, or NULL if none created. */ LdapQuery *ldapsvr_new_explicit_search( @@ -658,12 +671,13 @@ LdapQuery *ldapsvr_new_explicit_search( g_return_val_if_fail( server != NULL, NULL ); g_return_val_if_fail( req != NULL, NULL ); - searchTerm = req->searchTerm; + g_return_val_if_fail( folder != NULL, NULL ); /* Retire any aged queries */ /* // ldapsvr_retire_query( server ); */ /* Name the query */ + searchTerm = req->searchTerm; name = g_strdup_printf( "Explicit search for '%s'", searchTerm ); /* Construct a query */ @@ -675,12 +689,10 @@ LdapQuery *ldapsvr_new_explicit_search( ldapqry_set_callback_end( qry, req->callBackEnd ); ldapqry_set_callback_entry( qry, req->callBackEntry ); - if( folder ) { - /* Specify folder type and back reference */ - ADDRQUERY_FOLDER(qry) = folder; - folder->folderType = ADDRFOLDER_QUERY_RESULTS; - folder->folderData = ( gpointer ) qry; - } + /* Specify folder type and back reference */ + ADDRQUERY_FOLDER(qry) = folder; + folder->folderType = ADDRFOLDER_QUERY_RESULTS; + folder->folderData = ( gpointer ) qry; /* Setup server */ ldapsvr_add_query( server, qry ); -- 2.25.1