commit 018b158d7dfd1729cf5cadb4f88ce1d8532d008c from: Oliver Lowe date: Thu Nov 20 04:01:01 2025 UTC Drop address collection features Could write some other external program to do the same job. That keeps maintenance burden of this app down commit - 566853c97ca5a419493157f2ea64592fc72b994b commit + 018b158d7dfd1729cf5cadb4f88ce1d8532d008c blob - 37433177e3c791c36fa7bb9c4865a25fa369d2c5 blob + d1ea8281d1fc03b0c5f151e568c6df0fb4cf7d55 --- src/addressbook.c +++ src/addressbook.c @@ -59,7 +59,6 @@ #include "addrquery.h" #include "addrselect.h" #include "addrclip.h" -#include "addrgather.h" #include "adbookbase.h" typedef enum @@ -4938,46 +4937,6 @@ gboolean addressbook_peek_folder_exists( gchar *folder return folder_path_match.matched; } -/** - * Harvest addresses. - * \param folderItem Folder to import. - * \param sourceInd Source indicator: FALSE - Folder, TRUE - Messages. - * \param msgList List of message numbers, or NULL to process folder. - */ -void addressbook_harvest( - FolderItem *folderItem, gboolean sourceInd, GList *msgList ) -{ - AddressDataSource *ds = NULL; - AdapterDSource *ads = NULL; - AddressBookFile *abf = NULL; - AdapterInterface *adapter; - GtkCMCTreeNode *newNode; - - abf = addrgather_dlg_execute( - folderItem, _addressIndex_, sourceInd, msgList ); - if( abf ) { - ds = addrindex_index_add_datasource( - _addressIndex_, ADDR_IF_BOOK, abf ); - - adapter = addrbookctl_find_interface( ADDR_IF_BOOK ); - if( adapter ) { - if( adapter->treeNode ) { - ads = addressbook_create_ds_adapter( - ds, ADDR_BOOK, addrbook_get_name( abf ) ); - newNode = addressbook_add_object( - adapter->treeNode, - ADDRESS_OBJECT(ads) ); - if (newNode == NULL) { - g_message("error adding addressbook object\n"); - } - } - } - - /* Notify address completion */ - invalidate_address_completion(); - } -} - static void addressbook_find_duplicates_cb(GtkAction *action, gpointer data) { addrduplicates_find(GTK_WINDOW(addrbook.window)); blob - d4bead76da0358a339ea609131ef1735885656d6 (mode 644) blob + /dev/null --- src/addrgather.c +++ /dev/null @@ -1,566 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2002-2022 the Claws Mail team and Match Grun - * - * 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 - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* -* Dialog for gathering EMail addresses from mail folder. -*/ - -#include "defs.h" - -#include -#include -#include -#include - -#include "main.h" -#include "inc.h" -#include "mbox.h" -#include "filesel.h" -#include "foldersel.h" -#include "gtkutils.h" -#include "alertpanel.h" -#include "manage_window.h" -#include "folder.h" -#include "utils.h" -#include "prefs_common.h" -#include "prefs_gtk.h" - -#include "addrharvest.h" -#include "addrindex.h" -#include "addrbook.h" -#define PAGE_FIELDS 0 -#define PAGE_FINISH 1 - -#define NUM_FIELDS 6 - -#define FIELDS_N_COLS 2 -#define FIELDS_COL_WIDTH_HEADER 100 -#define FIELDS_COL_WIDTH_COUNT 140 - -#define MIN_FOLDER_SIZE 20 -#define DFL_FOLDER_SIZE 50 - -typedef enum { - FIELD_COL_HEADER = 0, - FIELD_COL_COUNT = 1 -} AddrHarvest; - -/* -* The dialog. -*/ -static struct _AddrHarvest { - GtkWidget *window; - GtkWidget *notebook; - GtkWidget *labelFolder; - GtkWidget *entryBook; - GtkWidget *checkHeader[ NUM_FIELDS ]; - GtkWidget *spinbtnFolder; - GtkWidget *checkRecurse; - GtkWidget *btnOk; - GtkWidget *btnCancel; - GtkWidget *statusbar; - gint status_cid; - gboolean cancelled; - gboolean done; - gchar *folderPath; - GtkWidget *viewCount; -} addrgather_dlg; - -static AddressIndex *_harv_addressIndex_; -static AddressBookFile *_harv_addressBook_; -static gchar *_harv_headerNames_[] = { - HEADER_FROM, - HEADER_REPLY_TO, - HEADER_SENDER, - HEADER_TO, - HEADER_CC, - HEADER_ERRORS_TO -}; -static GList *_harv_messageList_; - -enum { - ADDRGATHER_COL_HEADER, - ADDRGATHER_COL_COUNT, - N_ADDRGATHER_COLS -}; - -static void addrgather_dlg_status_show( gchar *msg ) { - if( addrgather_dlg.statusbar != NULL ) { - gtk_statusbar_pop( GTK_STATUSBAR(addrgather_dlg.statusbar), - addrgather_dlg.status_cid ); - if( msg ) { - gtk_statusbar_push( - GTK_STATUSBAR(addrgather_dlg.statusbar), - addrgather_dlg.status_cid, msg ); - } - } -} - -static gint addrgather_dlg_delete_event( - GtkWidget *widget, GdkEventAny *event, gpointer data ) -{ - addrgather_dlg.cancelled = TRUE; - gtk_main_quit(); - return TRUE; -} - -static void addrgather_size_allocate( - GtkWidget *widget, GtkAllocation *allocation ) -{ - cm_return_if_fail( allocation != NULL ); - - gtk_window_get_size(GTK_WINDOW(widget), - &prefs_common.addrgather_width, &prefs_common.addrgather_height); -} - -#define FMT_BUFSIZE 32 - -static gboolean addrgather_dlg_harvest() { - GtkWidget *view; - GtkTreeModel *model; - GtkTreeIter iter; - AddressHarvester *harvester; - gchar *name; - AddressBookFile *abf; - gchar *newFile; - gchar str[ FMT_BUFSIZE ]; - gint cnt; - gint i; - gint sz; - - name = gtk_editable_get_chars( GTK_EDITABLE(addrgather_dlg.entryBook), 0, -1 ); - if( name == NULL || strlen( name ) < 1 ) { - addrgather_dlg_status_show( - _( "Please specify name for address book." ) ); - g_free( name ); - return FALSE; - } - - /* Create harvest helper */ - harvester = addrharvest_create(); - addrharvest_set_path( harvester, addrgather_dlg.folderPath ); - - for( i = 0; i < NUM_FIELDS; i++ ) { - addrharvest_set_header( harvester, _harv_headerNames_[i], - gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(addrgather_dlg.checkHeader[i]) ) ); - } - addrharvest_set_recurse( harvester, - gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON( addrgather_dlg.checkRecurse ) ) ); - - if( addrharvest_check_header( harvester ) == FALSE ) { - addrgather_dlg_status_show( - _( "Please select the mail headers to search." ) ); - addrharvest_free( harvester ); - g_free( name ); - return FALSE; - } - - /* Go fer it */ - addrgather_dlg_status_show( _( "Collecting addresses..." ) ); - GTK_EVENTS_FLUSH(); - sz = gtk_spin_button_get_value_as_int( - GTK_SPIN_BUTTON( addrgather_dlg.spinbtnFolder ) ); - addrharvest_set_folder_size( harvester, sz ); - - /* Create address book */ - abf = addrbook_create_book(); - addrbook_set_path( abf, _harv_addressIndex_->filePath ); - newFile = addrbook_guess_next_file( abf ); - addrbook_set_file( abf, newFile ); - addrbook_set_name( abf, name ); - g_free( newFile ); - g_free( name ); - - addrharvest_harvest( - harvester, abf->addressCache, _harv_messageList_ ); - addrbook_save_data( abf ); - _harv_addressBook_ = abf; - - /* Update summary count */ - view = addrgather_dlg.viewCount; - model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); - gtk_list_store_clear( GTK_LIST_STORE(model) ); - for( i = 0; i < NUM_FIELDS; i++ ) { - cnt = addrharvest_get_count( harvester, _harv_headerNames_[i] ); - if( cnt < 1 ) { - strcpy( str, "-" ); - } - else { - snprintf( str, FMT_BUFSIZE, "%d", cnt ); - } - gtk_list_store_append(GTK_LIST_STORE(model), &iter); - gtk_list_store_set(GTK_LIST_STORE(model), &iter, - ADDRGATHER_COL_HEADER, _harv_headerNames_[i], - ADDRGATHER_COL_COUNT, str, - -1); - } - - addrharvest_free( harvester ); - - addrgather_dlg_status_show("Addresses collected successfully."); - - /* Display summary page */ - gtk_notebook_set_current_page( - GTK_NOTEBOOK(addrgather_dlg.notebook), PAGE_FINISH ); - addrgather_dlg.done = TRUE; - gtk_widget_set_sensitive( addrgather_dlg.btnCancel, FALSE ); - gtk_widget_grab_default( addrgather_dlg.btnOk ); - - return TRUE; -} - -static void addrgather_dlg_ok( GtkWidget *widget, gpointer data ) { - if(addrgather_dlg.done) { - addrgather_dlg.done = FALSE; - gtk_main_quit(); - return; - } - if( addrgather_dlg_harvest() ) { - addrgather_dlg.cancelled = FALSE; - } -} - -static void addrgather_dlg_cancel( GtkWidget *widget, gpointer data ) { - gtk_main_quit(); -} - -/* - * Create notebook page for mail headers. - * Enter: pageNum Page number. - * pageLbl Page label. - */ -static void addrgather_page_fields(gint pageNum, gchar *pageLbl) -{ - GtkWidget *vbox; - GtkWidget *vboxf; - GtkWidget *table; - GtkWidget *label; - GtkWidget *labelFolder; - GtkWidget *entryBook; - GtkWidget *frameHeader; - GtkWidget *checkHeader[NUM_FIELDS]; - GtkWidget *hboxs; - GtkWidget *spinbtnFolder; - GtkAdjustment *adjFolder; - GtkWidget *checkRecurse; - gint i; - - /* Container */ - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); - gtk_container_add(GTK_CONTAINER(addrgather_dlg.notebook), vbox); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); - - /* Notebook page */ - label = gtk_label_new(pageLbl); - gtk_widget_show(label); - gtk_notebook_set_tab_label(GTK_NOTEBOOK(addrgather_dlg.notebook), - gtk_notebook_get_nth_page(GTK_NOTEBOOK(addrgather_dlg.notebook), - pageNum), label); - - /* Upper area - Field list */ - table = gtk_grid_new(); - gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); - gtk_grid_set_row_spacing(GTK_GRID(table), VSPACING_NARROW); - gtk_grid_set_column_spacing(GTK_GRID(table), HSPACING_NARROW); - - /* First row */ - label = gtk_label_new("Current folder:"); - gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - - labelFolder = gtk_label_new(""); - gtk_grid_attach(GTK_GRID(table), labelFolder, 1, 0, 1, 1); - gtk_label_set_xalign(GTK_LABEL(labelFolder), 0.0); - - /* Second row */ - label = gtk_label_new("Address book name:"); - gtk_grid_attach(GTK_GRID(table), label, 0, 1, 1, 1); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - - entryBook = gtk_entry_new(); - - gtk_grid_attach(GTK_GRID(table), entryBook, 1, 1, 2, 1); - gtk_widget_set_hexpand(entryBook, TRUE); - gtk_widget_set_halign(entryBook, GTK_ALIGN_FILL); - - - /* Third row */ - label = gtk_label_new("Address book folder size:"); - gtk_grid_attach(GTK_GRID(table), label, 0, 2, 1, 1); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - CLAWS_SET_TIP(label, - "Maximum amount of entries per folder within the newly created address book"); - - hboxs = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - adjFolder = GTK_ADJUSTMENT(gtk_adjustment_new(DFL_FOLDER_SIZE, MIN_FOLDER_SIZE, G_MAXINT, 1, 10, 0)); - spinbtnFolder = gtk_spin_button_new(GTK_ADJUSTMENT(adjFolder), 1, 0); - gtk_box_pack_start(GTK_BOX(hboxs), spinbtnFolder, FALSE, FALSE, 0); - gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spinbtnFolder), TRUE); - gtk_grid_attach(GTK_GRID(table), hboxs, 1, 2, 1, 1); - - CLAWS_SET_TIP(spinbtnFolder, - "Maximum amount of entries per folder within the newly created address book"); - /* Fourth row */ - frameHeader = gtk_frame_new("Process these mail header fields"); - gtk_widget_show(frameHeader); - gtk_grid_attach(GTK_GRID(table), frameHeader, 0, 3, 1, 1); - gtk_widget_set_hexpand(frameHeader, TRUE); - gtk_widget_set_halign(frameHeader, GTK_ALIGN_FILL); - gtk_frame_set_label_align(GTK_FRAME(frameHeader), 0.01, 0.5); - - /* Check boxes */ - vboxf = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_show(vboxf); - gtk_container_add(GTK_CONTAINER(frameHeader), vboxf); - gtk_container_set_border_width(GTK_CONTAINER(vboxf), 8); - - for (i = 0; i < NUM_FIELDS; i++) { - PACK_CHECK_BUTTON(vboxf, checkHeader[i], _harv_headerNames_[i]); - addrgather_dlg.checkHeader[i] = checkHeader[i]; - } - - /* Recurse folders */ - checkRecurse = gtk_check_button_new_with_label( _("Include subfolders" ) ); - gtk_grid_attach(GTK_GRID(table), checkRecurse, 0, 4, 1, 1); - - addrgather_dlg.labelFolder = labelFolder; - addrgather_dlg.entryBook = entryBook; - addrgather_dlg.spinbtnFolder = spinbtnFolder; - addrgather_dlg.checkRecurse = checkRecurse; -} - -/* - * Create notebook page for summary counts. - * Enter: pageNum Page number. - * pageLbl Page label. - */ -static void addrgather_page_finish( gint pageNum, gchar *pageLbl ) { - GtkWidget *label; - GtkWidget *vbox; - GtkWidget *scrollwin; - GtkWidget *viewCount; - GtkTreeViewColumn *col; - GtkCellRenderer *rdr; - GtkTreeSelection *sel; - GtkTreeModel *model; - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_container_add( GTK_CONTAINER( addrgather_dlg.notebook ), vbox ); - gtk_container_set_border_width( GTK_CONTAINER (vbox), 8 ); - - label = gtk_label_new( pageLbl ); - gtk_widget_show( label ); - gtk_notebook_set_tab_label( - GTK_NOTEBOOK( addrgather_dlg.notebook ), - gtk_notebook_get_nth_page( GTK_NOTEBOOK( addrgather_dlg.notebook ), pageNum ), - label ); - - /* Summary count */ - scrollwin = gtk_scrolled_window_new( NULL, NULL ); - gtk_container_add( GTK_CONTAINER(vbox), scrollwin ); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_widget_set_vexpand(GTK_WIDGET(scrollwin), TRUE); - - /* Treeview */ - model = GTK_TREE_MODEL(gtk_list_store_new(N_ADDRGATHER_COLS, - G_TYPE_STRING, G_TYPE_STRING, -1)); - - viewCount = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); - g_object_unref(model); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(viewCount), TRUE); - gtk_tree_view_set_reorderable(GTK_TREE_VIEW(viewCount), FALSE); - sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(viewCount)); - gtk_tree_selection_set_mode(sel, GTK_SELECTION_NONE); - - /* Columns for the treeview */ - rdr = gtk_cell_renderer_text_new(); - col = gtk_tree_view_column_new_with_attributes("Header Name", rdr, - "markup", ADDRGATHER_COL_HEADER, - NULL); - gtk_tree_view_column_set_min_width(col, FIELDS_COL_WIDTH_HEADER); - gtk_tree_view_append_column(GTK_TREE_VIEW(viewCount), col); - - col = gtk_tree_view_column_new_with_attributes("Address Count", rdr, - "text", ADDRGATHER_COL_COUNT, - NULL); - gtk_tree_view_column_set_min_width(col, FIELDS_COL_WIDTH_COUNT); - gtk_tree_view_append_column(GTK_TREE_VIEW(viewCount), col); - - gtk_container_add( GTK_CONTAINER(scrollwin), viewCount ); - - addrgather_dlg.viewCount = viewCount; -} - -/* - * Create notebook page for warning message. - * Enter: pageNum Page number. - * pageLbl Page label. - */ -static void addrgather_dlg_create(void) -{ - GtkWidget *window; - GtkWidget *notebook; - GtkWidget *btnOk; - GtkWidget *btnCancel; - GtkWidget *statusbar; - GtkWidget *vbox; - GtkWidget *hbbox; - GtkWidget *hsbox; - static GdkGeometry geometry; - - window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "addrgather"); - gtk_container_set_border_width(GTK_CONTAINER(window), 4); - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); - gtk_window_set_resizable(GTK_WINDOW(window), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); - - g_signal_connect(G_OBJECT(window), "delete_event", - G_CALLBACK(addrgather_dlg_delete_event), NULL); - g_signal_connect(G_OBJECT(window), "size_allocate", - G_CALLBACK(addrgather_size_allocate), NULL); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); - gtk_container_add(GTK_CONTAINER(window), vbox); - - /* Notebook */ - notebook = gtk_notebook_new(); - gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE); - gtk_widget_show(notebook); - gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(notebook), 6); - gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE); - - /* Status line */ - hsbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_pack_end(GTK_BOX(vbox), hsbox, FALSE, FALSE, 0); - statusbar = gtk_statusbar_new(); - gtk_box_pack_start(GTK_BOX(hsbox), statusbar, TRUE, TRUE, 0); - - /* Button panel */ - gtkut_stock_button_set_create(&hbbox, &btnCancel, NULL, "Cancel", - &btnOk, NULL, "OK", - NULL, NULL, NULL); - gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0); - - /* Signal handlers */ - g_signal_connect(G_OBJECT(btnOk), "clicked", - G_CALLBACK(addrgather_dlg_ok), NULL); - g_signal_connect(G_OBJECT(btnCancel), "clicked", - G_CALLBACK(addrgather_dlg_cancel), NULL); - - if (!geometry.min_width) { - geometry.min_width = 450; - geometry.min_height = -1; - } - - gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry, - GDK_HINT_MIN_SIZE); - gtk_window_set_default_size(GTK_WINDOW(window), prefs_common.addrgather_width, - prefs_common.addrgather_height); - - addrgather_dlg.window = window; - addrgather_dlg.notebook = notebook; - addrgather_dlg.btnOk = btnOk; - addrgather_dlg.btnCancel = btnCancel; - addrgather_dlg.statusbar = statusbar; - addrgather_dlg.status_cid = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), - "Collect Email Address Dialog"); - - /* Create notebook pages */ - addrgather_page_fields(PAGE_FIELDS, "Header Fields"); - addrgather_page_finish(PAGE_FINISH, "Finish"); - gtk_widget_show_all(addrgather_dlg.window); -} - -/* - * Harvest addresses main window. - * Enter: folderItem Source folder. - * addrIndex Address index. - * sourceInd Source indicator: FALSE - Folder, TRUE - Messages. - * msgList List of message numbers, or NULL to process folder. - * Return: Populated address book file, or NULL if none created. - */ -AddressBookFile *addrgather_dlg_execute(FolderItem *folderItem, AddressIndex *addrIndex, - gboolean sourceInd, GList *msgList) -{ - gint i; - - _harv_addressIndex_ = addrIndex; - _harv_addressBook_ = NULL; - _harv_messageList_ = msgList; - - /* Create dialog */ - if (!addrgather_dlg.window) - addrgather_dlg_create(); - - addrgather_dlg.done = FALSE; - - gtk_notebook_set_current_page(GTK_NOTEBOOK(addrgather_dlg.notebook), PAGE_FIELDS); - addrgather_dlg.folderPath = folder_item_get_path(folderItem); - - /* Setup some default values */ - - gtk_label_set_text(GTK_LABEL(addrgather_dlg.labelFolder), folderItem->path); - gtk_entry_set_text(GTK_ENTRY(addrgather_dlg.entryBook), folderItem->path); - - for (i = 0; i < NUM_FIELDS; i++) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(addrgather_dlg.checkHeader[i]), - FALSE); - if (g_utf8_collate(_harv_headerNames_[i], HEADER_FROM) == 0) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(addrgather_dlg.checkHeader[i]), - TRUE); - } - - gtk_widget_set_sensitive(addrgather_dlg.btnOk, TRUE); - gtk_widget_set_sensitive(addrgather_dlg.btnCancel, TRUE); - gtk_widget_grab_default(addrgather_dlg.btnOk); - - /* Apply window title */ - if (sourceInd) { - gtk_window_set_title(GTK_WINDOW(addrgather_dlg.window), - "Collect email addresses from selected messages"); - gtk_widget_set_sensitive(addrgather_dlg.checkRecurse, FALSE); - } else { - gtk_window_set_title(GTK_WINDOW(addrgather_dlg.window), - "Collect email addresses from folder"); - gtk_widget_set_sensitive(addrgather_dlg.checkRecurse, TRUE); - } - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(addrgather_dlg.checkRecurse), FALSE); - - addrgather_dlg_status_show(""); - gtk_widget_show(addrgather_dlg.window); - gtk_window_set_modal(GTK_WINDOW(addrgather_dlg.window), TRUE); - gtk_widget_grab_focus(addrgather_dlg.entryBook); - manage_window_set_transient(GTK_WINDOW(addrgather_dlg.window)); - gtk_main(); - - g_free(addrgather_dlg.folderPath); - addrgather_dlg.folderPath = NULL; - gtk_widget_hide(addrgather_dlg.window); - gtk_window_set_modal(GTK_WINDOW(addrgather_dlg.window), FALSE); - _harv_addressIndex_ = NULL; - - if (addrgather_dlg.cancelled == TRUE) - return NULL; - - return _harv_addressBook_; -} blob - 10148818634cf625d83cb5f82fdc64972041105a (mode 644) blob + /dev/null --- src/addrgather.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2002-2012 Match Grun and the Claws Mail team - * - * 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 - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* - * Gather addresses. - */ - -#ifndef __ADDR_GATHER_H__ -#define __ADDR_GATHER_H__ - -/* Function prototypes */ -#include "folder.h" - -#include "addrbook.h" - -AddressBookFile *addrgather_dlg_execute( FolderItem *folderItem, - AddressIndex *addrIndex, - gboolean sourceInd, - GList *msgList ); -#endif /* __ADDR_GATHER_H__ */ blob - 88d27961e579006be38800e90b10fd88175f171c (mode 644) blob + /dev/null --- src/addrharvest.c +++ /dev/null @@ -1,851 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2002-2024 Match Grun and the Claws Mail team - * - * 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 - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * Functions for an E-Mail address harvester. - */ - -#include -#include -#include - -#include "proctypes.h" -#include "utils.h" -#include "mgutils.h" -#include "addrharvest.h" -#include "codeconv.h" -#include "addritem.h" -#include "file-utils.h" - -/* Mail header names of interest */ -static gchar *_headerFrom_ = HEADER_FROM; -static gchar *_headerReplyTo_ = HEADER_REPLY_TO; -static gchar *_headerSender_ = HEADER_SENDER; -static gchar *_headerErrorsTo_ = HEADER_ERRORS_TO; -static gchar *_headerCC_ = HEADER_CC; -static gchar *_headerTo_ = HEADER_TO; - -#define ADDR_BUFFSIZE 1024 -#define MSG_BUFFSIZE 2048 -#define MSGNUM_BUFFSIZE 32 -#define DFL_FOLDER_SIZE 20 - -/* Noise strings included by some other E-Mail clients */ -#define REM_NAME_STRING "(Email)" -#define REM_NAME_STRING2 "(Email 2)" - -/* Directories to ignore */ -#define DIR_IGNORE ".\t.." - -/* - * Header entry. - */ -struct _HeaderEntry { - gchar *header; - gboolean selected; - ItemFolder *folder; - gint count; -}; - -/* - * Build header table entry. - * Enter: harvester Harvester object. - * name Header name. - */ -static void addrharvest_build_entry( - AddressHarvester* harvester, gchar *name ) -{ - HeaderEntry *entry; - - entry = g_new0( HeaderEntry, 1 ); - entry->header = name; - entry->selected = FALSE; - entry->folder = NULL; - entry->count = 0; - harvester->headerTable = g_list_append( harvester->headerTable, entry ); -} - -/* - * Free key in table. - */ -static gint addrharvest_free_table_vis( gpointer key, gpointer value, gpointer data ) { - g_free( key ); - key = NULL; - value = NULL; - return TRUE; -} - -/* - * Free lookup table. - */ -static void addrharvest_free_table( AddressHarvester* harvester ) { - GList *node; - HeaderEntry *entry; - - /* Free header list */ - node = harvester->headerTable; - while( node ) { - entry = ( HeaderEntry * ) node->data; - entry->header = NULL; - entry->selected = FALSE; - entry->folder = NULL; - entry->count = 0; - g_free( entry ); - node = g_list_next( node ); - } - g_list_free( harvester->headerTable ); - harvester->headerTable = NULL; - - /* Free duplicate table */ - g_hash_table_foreach_remove( harvester->dupTable, addrharvest_free_table_vis, NULL ); - g_hash_table_destroy( harvester->dupTable ); - harvester->dupTable = NULL; -} - -/* -* Create new object. -* Return: Harvester. -*/ -AddressHarvester *addrharvest_create( void ) { - AddressHarvester *harvester; - - harvester = g_new0( AddressHarvester, 1 ); - harvester->path = NULL; - harvester->dupTable = g_hash_table_new( g_str_hash, g_str_equal ); - harvester->folderSize = DFL_FOLDER_SIZE; - harvester->retVal = MGU_SUCCESS; - - /* Build header table */ - harvester->headerTable = NULL; - addrharvest_build_entry( harvester, _headerFrom_ ); - addrharvest_build_entry( harvester, _headerReplyTo_ ); - addrharvest_build_entry( harvester, _headerSender_ ); - addrharvest_build_entry( harvester, _headerErrorsTo_ ); - addrharvest_build_entry( harvester, _headerCC_ ); - addrharvest_build_entry( harvester, _headerTo_ ); - - return harvester; -} - -/* -* Properties... -*/ -/* - * Specify path to folder that will be harvested. - * Entry: harvester Harvester object. - * value Full directory path. - */ -void addrharvest_set_path( AddressHarvester* harvester, const gchar *value ) { - cm_return_if_fail( harvester != NULL ); - harvester->path = mgu_replace_string( harvester->path, value ); - g_strstrip( harvester->path ); -} - -/* - * Specify maximum folder size. - * Entry: harvester Harvester object. - * value Folder size. - */ -void addrharvest_set_folder_size( - AddressHarvester* harvester, const gint value ) -{ - cm_return_if_fail( harvester != NULL ); - if( value > 0 ) { - harvester->folderSize = value; - } -} - -/* - * Specify folder recursion. - * Entry: harvester Harvester object. - * value TRUE to process subfolders, FALSE to process folder only. - */ -void addrharvest_set_recurse( - AddressHarvester* harvester, const gboolean value ) -{ - cm_return_if_fail( harvester != NULL ); - harvester->folderRecurse = value; -} - -/* - * Search (case insensitive) for header entry with specified name. - * Enter: harvester Harvester. - * name Header name. - * Return: Header, or NULL if not found. - */ -static HeaderEntry *addrharvest_find( - AddressHarvester* harvester, const gchar *name ) { - HeaderEntry *retVal; - GList *node; - - retVal = NULL; - node = harvester->headerTable; - while( node ) { - HeaderEntry *entry; - - entry = node->data; - if (g_ascii_strncasecmp(entry->header, name, - strlen(entry->header)) == 0 ) { - retVal = entry; - break; - } - node = g_list_next( node ); - } - return retVal; -} - -/* - * Set selection for specified heaader. - * Enter: harvester Harvester. - * name Header name. - * value Value to set. - */ -void addrharvest_set_header( - AddressHarvester* harvester, const gchar *name, const gboolean value ) -{ - HeaderEntry *entry; - - cm_return_if_fail( harvester != NULL ); - entry = addrharvest_find( harvester, name ); - if( entry != NULL ) { - entry->selected = value; - } -} - -/* - * Get address count - * Enter: harvester Harvester. - * name Header name. - * Return: Address count, or -1 if header not found. - */ -gint addrharvest_get_count( AddressHarvester* harvester, const gchar *name ) { - HeaderEntry *entry; - gint count; - - count = -1; - cm_return_val_if_fail( harvester != NULL, count ); - entry = addrharvest_find( harvester, name ); - if( entry != NULL ) { - count = entry->count; - } - return count; -} - -/* -* Free up object by releasing internal memory. -* Enter: harvester Harvester. -*/ -void addrharvest_free( AddressHarvester *harvester ) { - cm_return_if_fail( harvester != NULL ); - - /* Free internal stuff */ - addrharvest_free_table( harvester ); - g_free( harvester->path ); - - /* Clear pointers */ - harvester->path = NULL; - harvester->retVal = MGU_SUCCESS; - harvester->headerTable = NULL; - - harvester->folderSize = 0; - - /* Now release object */ - g_free( harvester ); -} - -/* - * Insert address into cache. - * Enter: harvester Harvester object. - * entry Header object. - * cache Address cache to load. - * name Name. - * address eMail address. - */ -static void addrharvest_insert_cache( - AddressHarvester *harvester, HeaderEntry *entry, - AddressCache *cache, const gchar *name, - const gchar *address ) -{ - ItemPerson *person; - ItemFolder *folder; - gchar *folderName; - gboolean newFolder; - gint cnt; - gchar *key, *value; - - newFolder = FALSE; - folder = entry->folder; - if( folder == NULL ) { - newFolder = TRUE; /* No folder yet */ - } - if( entry->count % harvester->folderSize == 0 ) { - newFolder = TRUE; /* Folder is full */ - } - - /* Insert address */ - key = g_utf8_strdown( address, -1 ); - person = g_hash_table_lookup( harvester->dupTable, key ); - if( person ) { - /* Update existing person to use longest name */ - value = ADDRITEM_NAME(person); - if( strlen( name ) > strlen( value ) ) { - addritem_person_set_common_name( person, name ); - } - g_free( key ); - } - else { - /* Folder if required */ - if( newFolder ) { - cnt = 1 + ( entry->count / harvester->folderSize ); - folderName =g_strdup_printf( "%s (%d)", - entry->header, cnt ); - folder = addritem_create_item_folder(); - addritem_folder_set_name( folder, folderName ); - addritem_folder_set_remarks( folder, "" ); - addrcache_id_folder( cache, folder ); - addrcache_add_folder( cache, folder ); - entry->folder = folder; - g_free( folderName ); - } - - /* Insert entry */ - person = addrcache_add_contact( - cache, folder, name, address, "" ); - g_hash_table_insert( harvester->dupTable, key, person ); - entry->count++; - } - addritem_parse_first_last( person ); -} - -/* - * Remove specified string from name. - * Enter: name Name. - * str String to remove. - */ -static void addrharvest_del_email( gchar *name, gchar *str ) { - gchar *p; - gint lenn, lenr; - - lenr = strlen( str ); - while((p = strcasestr( name, str )) != NULL) { - lenn = strlen( p ); - memmove( p, p + lenr, lenn ); - } -} - -/* - * Find position of at (@) character in buffer. - * Enter: buffer Start of buffer. - * Return: Position of at character, or NULL if not found. - * Note: This function searches for the last occurrence of an 'at' character - * prior to a valid delimiter character for the end of address. This enables - * an address to be found where it is also used as the name of the - * recipient. For example: - * "axle.rose@netscape.com" - * The last occurrence of the at character is detected. - */ -static gchar *addrharvest_find_at( const gchar *buffer ) { - gchar *atCh; - gchar *p; - - atCh = strchr( buffer, '@' ); - if( atCh ) { - /* Search forward for another one */ - p = atCh + 1; - while( *p ) { - if( *p == '>' ) { - break; - } - if( *p == ',' ) { - break; - } - if( *p == '\n' ) { - break; - } - if( *p == '@' ) { - atCh = p; - break; - } - p++; - } - } - return atCh; -} - -/* - * Find start and end of address string. - * Enter: buf Start address of buffer to process (not modified). - * atp Pointer to email at (@) character. - * bp Pointer to start of email address (returned). - * ep Pointer to end of email address (returned). - */ -static void addrharvest_find_address( - const gchar *buf, const gchar *atp, const gchar **bp, - const gchar **ep ) -{ - const gchar *p; - - /* Find first non-separator char */ - *bp = NULL; - p = buf; - while( TRUE ) { - if( strchr( ",; \n\r", *p ) == NULL ) break; - p++; - } - *bp = p; - - /* Search forward for end of address */ - *ep = NULL; - p = atp + 1; - while( TRUE ) { - if( strchr( ",;", *p ) ) break; - p++; - } - *ep = p; -} - -/* - * Extract E-Mail address from buffer. If found, address is removed from - * buffer. - * Enter: buffer Address buffer. - * Return: E-Mail address, or NULL if none found. Must g_free() when done. - */ -static gchar *addrharvest_extract_address( gchar *buffer ) { - gchar *addr; - gchar *atCh, *p, *bp, *ep; - gint len; - - addr = NULL; - atCh = addrharvest_find_at( buffer ); - if( atCh ) { - /* Search back for start of address */ - bp = NULL; - p = atCh; - while( p >= buffer ) { - bp = p; - if( *p == '<' ) { - *p = ' '; - bp++; - break; - } - p--; - } - - /* Search fwd for end */ - ep = NULL; - ep = p = atCh; - while( *p ) { - if( *p == '>' ) { - *p = ' '; - break; - } - else if( *p == ' ' ) { - break; - } - ep = p; - p++; - } - - /* Extract email */ - if( bp != NULL ) { - len = ( ep - bp ); - if( len > 0 ) { - addr = g_strndup( bp, len + 1 ); - memmove( bp, ep, len ); - *bp = ' '; - } - } - } - return addr; -} - -/* - * Parse address from header buffer creating address in cache. - * Enter: harvester Harvester object. - * entry Header object. - * cache Address cache to load. - * hdrBuf Pointer to header buffer. - */ -static void addrharvest_parse_address( - AddressHarvester *harvester, HeaderEntry *entry, - AddressCache *cache, const gchar *hdrBuf ) -{ - gchar buffer[ ADDR_BUFFSIZE + 2 ]; - const gchar *bp; - const gchar *ep; - gchar *atCh, *email, *name; - gint bufLen; - - /* Search for an address */ - while((atCh = addrharvest_find_at( hdrBuf )) != NULL) { - /* Find addres string */ - addrharvest_find_address( hdrBuf, atCh, &bp, &ep ); - - /* Copy into buffer */ - bufLen = ( size_t ) ( ep - bp ); - if( bufLen > ADDR_BUFFSIZE -1 ) { - bufLen = ADDR_BUFFSIZE - 1; - } - strncpy( buffer, bp, bufLen ); - buffer[ bufLen ] = '\0'; - buffer[ bufLen + 1 ] = '\0'; - buffer[ bufLen + 2 ] = '\0'; - - /* Extract address from buffer */ - email = addrharvest_extract_address( buffer ); - if( email ) { - /* Unescape characters */ - mgu_str_unescape( buffer ); - - /* Remove noise characaters */ - addrharvest_del_email( buffer, REM_NAME_STRING ); - addrharvest_del_email( buffer, REM_NAME_STRING2 ); - - /* Remove leading trailing quotes and spaces */ - mgu_str_ltc2space( buffer, '\"', '\"' ); - mgu_str_ltc2space( buffer, '\'', '\'' ); - mgu_str_ltc2space( buffer, '\"', '\"' ); - mgu_str_ltc2space( buffer, '(', ')' ); - g_strstrip( buffer ); - - if( g_ascii_strcasecmp( buffer, email ) == 0 ) - name = g_strdup(""); - else - name = conv_unmime_header(buffer, NULL, TRUE); - - /* Insert into address book */ - addrharvest_insert_cache( - harvester, entry, cache, name, email ); - g_free( email ); - g_free( name ); - } - hdrBuf = ep; - } -} - -/* - * Test whether buffer contains a header that appears in header list. - * Enter: listHdr Header list. - * buf Header buffer. - * Return: TRUE if header in list. - */ -static gboolean addrharvest_check_hdr( GList *listHdr, gchar *buf ) { - gboolean retVal; - GList *node; - gchar *p, *hdr, *nhdr; - gint len; - - retVal = FALSE; - p = strchr( buf, ':' ); - if( p ) { - len = ( size_t ) ( p - buf ); - hdr = g_strndup( buf, len ); - node = listHdr; - while( node ) { - nhdr = node->data; - if (g_ascii_strncasecmp(nhdr, hdr, strlen(nhdr)) == 0 ) { - retVal = TRUE; - break; - } - node = g_list_next( node ); - } - g_free( hdr ); - } - return retVal; -} - -/* - * Read header into a linked list of lines. - * Enter: fp File to read. - * listHdr List of header lines of interest. - * done End of headers or end of file reached. - * Return: Linked list of lines. - */ -static GSList *addrharvest_get_header( FILE *fp, GList *listHdr, gboolean *done ) { - GSList *list; - gchar buf[ MSG_BUFFSIZE + 2 ]; - gint ch; - gboolean foundHdr; - - list = NULL; - - /* Read line */ - if( fgets( buf, MSG_BUFFSIZE, fp ) == NULL ) { - *done = TRUE; - return list; - } - - /* Test for end of headers */ - if( buf[0] == '\r' || buf[0] == '\n' ) { - *done = TRUE; - return list; - } - - /* Test whether required header */ - foundHdr = addrharvest_check_hdr( listHdr, buf ); - - /* Read all header lines. Only add reqd ones to list */ - while( TRUE ) { - gchar *p; - - if( foundHdr ) { - p = g_strdup( buf ); - list = g_slist_append( list, p ); - } - - /* Read first character */ - ch = fgetc( fp ); - if( ch == ' ' || ch == '\t' ) { - /* Continuation character - read into buffer */ - if( fgets( buf, MSG_BUFFSIZE, fp ) == NULL ) { - break; - } - } - else { - if( ch == EOF ) { - *done = TRUE; - } - else { - /* Push back character for next header */ - ungetc( ch, fp ); - } - break; - } - } - - return list; -} - -/* - * Read specified file into address book. - * Enter: harvester Harvester object. - * fileName File to read. - * cache Address cache to load. - * Return: Status. - */ -static gint addrharvest_readfile( - AddressHarvester *harvester, const gchar *fileName, - AddressCache *cache, GList *listHdr ) -{ - gint retVal; - FILE *msgFile; - gchar *buf, *addr, *p; - HeaderEntry *entry; - GSList *list; - gboolean done; - - msgFile = g_fopen( fileName, "rb" ); - if( ! msgFile ) { - /* Cannot open file */ - retVal = MGU_OPEN_FILE; - return retVal; - } - - done = FALSE; - while( TRUE ) { - list = addrharvest_get_header( msgFile, listHdr, &done ); - if( done ) break; - - if( list == NULL ) { - continue; - } - - buf = mgu_list_coalesce( list ); - g_slist_free_full( list, g_free ); - - if(( p = strchr( buf, ':' ) ) != NULL ) { - addr = p + 1; - *p = '\0'; - - entry = addrharvest_find( harvester, buf ); - if( entry && entry->selected ) { - /* Sanitize control characters */ - p = addr; - while( *p ) { - if( *p == '\r' || *p == '\n' || *p == '\t' ) - *p = ' '; - p++; - } - addrharvest_parse_address( - harvester, entry, cache, addr ); - } - } - g_free( buf ); - } - - fclose( msgFile ); - return MGU_SUCCESS; -} - -/* - * Read all files in specified directory into address book. Directories are - * traversed recursively if necessary. - * Enter: harvester Harvester object. - * cache Address cache to load. - * msgList List of message numbers, or NULL to process folder. - * dir Directory to process. - */ -static void addrharvest_harvest_dir( - AddressHarvester *harvester, AddressCache *cache, GList *listHdr, - gchar *dir ) -{ - GDir *dp; - const gchar *d; - gchar *fullname; - GError *error = NULL; - gint num; - - debug_print("Harvesting addresses from dir '%s'\n", dir); - - if( ( dp = g_dir_open( dir, 0, &error ) ) == NULL ) { - debug_print("opening '%s' failed: %d (%s)\n", dir, - error->code, error->message); - g_error_free(error); - return; - } - - /* Process directory */ - while( (d = g_dir_read_name( dp )) != NULL ) { - fullname = g_strconcat(dir, G_DIR_SEPARATOR_S, d, NULL); - if( g_file_test(fullname, G_FILE_TEST_IS_DIR) ) { - if( harvester->folderRecurse ) { - if( strstr( DIR_IGNORE, d ) != NULL ) { - g_free(fullname); - continue; - } - - addrharvest_harvest_dir( - harvester, cache, listHdr, (gchar *)fullname ); - } - } - if( g_file_test(fullname, G_FILE_TEST_IS_REGULAR) ) { - if( ( num = to_number( d ) ) >= 0 ) { - addrharvest_readfile( - harvester, fullname, cache, listHdr ); - } - } - g_free(fullname); - } - g_dir_close( dp ); -} - -/* - * Read list of files in specified directory into address book. - * Enter: harvester Harvester object. - * cache Address cache to load. - * msgList List of message numbers, or NULL to process folder. - */ -static void addrharvest_harvest_list( - AddressHarvester *harvester, AddressCache *cache, GList *listHdr, - GList *msgList ) -{ - gint num; - GList *node; - gchar *fullname; - - if (!g_file_test(harvester->path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { - debug_print("'%s' doesn't exist or is not a dir\n", harvester->path); - return; - } - - /* Process message list */ - node = msgList; - while( node ) { - num = GPOINTER_TO_UINT( node->data ); - fullname = g_strdup_printf("%s%c%d", - harvester->path, G_DIR_SEPARATOR, num); - addrharvest_readfile( harvester, fullname, cache, listHdr ); - g_free(fullname); - node = g_list_next( node ); - } -} - -/* - * Read all files in specified directory into address book. - * Enter: harvester Harvester object. - * cache Address cache to load. - * msgList List of message numbers, or NULL to process folder. - * Return: Status. - */ -gint addrharvest_harvest( - AddressHarvester *harvester, AddressCache *cache, GList *msgList ) -{ - gint retVal; - GList *node; - GList *listHdr; - - retVal = MGU_BAD_ARGS; - cm_return_val_if_fail( harvester != NULL, retVal ); - cm_return_val_if_fail( cache != NULL, retVal ); - cm_return_val_if_fail( harvester->path != NULL, retVal ); - - addrcache_clear( cache ); - cache->dataRead = FALSE; - /* Build list of headers of interest */ - listHdr = NULL; - node = harvester->headerTable; - while( node ) { - HeaderEntry *entry; - - entry = node->data; - if( entry->selected ) { - gchar *p; - - p = g_utf8_strdown( entry->header, -1 ); - listHdr = g_list_append( listHdr, p ); - } - node = g_list_next( node ); - } - - /* Process directory/files */ - if( msgList == NULL ) { - addrharvest_harvest_dir( harvester, cache, listHdr, harvester->path ); - } - else { - addrharvest_harvest_list( harvester, cache, listHdr, msgList ); - } - g_list_free_full( listHdr, g_free ); - - /* Mark cache */ - cache->modified = FALSE; - cache->dataRead = TRUE; - return retVal; -} - -/* - * Test whether any headers have been selected for processing. - * Enter: harvester Harvester object. - * Return: TRUE if a header was selected, FALSE if none were selected. - */ -gboolean addrharvest_check_header( AddressHarvester *harvester ) { - gboolean retVal; - GList *node; - - retVal = FALSE; - cm_return_val_if_fail( harvester != NULL, retVal ); - - node = harvester->headerTable; - while( node ) { - HeaderEntry *entry; - - entry = ( HeaderEntry * ) node->data; - if( entry->selected ) return TRUE; - node = g_list_next( node ); - } - return retVal; -} blob - 662d837f9f75d2eb45e4d3d6292a057435439205 (mode 644) blob + /dev/null --- src/addrharvest.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2002-2012 Match Grun and the Claws Mail team - * - * 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 - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* - * Definitions for an E-Mail address harvester. - */ - -#ifndef __ADDRHARVEST_H__ -#define __ADDRHARVEST_H__ - -#include -#include -#include "addrbook.h" - -/* Headers that will be recognized */ -#define HEADER_FROM "From" -#define HEADER_REPLY_TO "Reply-to" -#define HEADER_SENDER "Sender" -#define HEADER_ERRORS_TO "Errors-to" -#define HEADER_CC "Cc" -#define HEADER_TO "To" - -/* Harvester file object */ -typedef struct _AddressHarvester AddressHarvester; -struct _AddressHarvester { - GList *headerTable; - gchar *path; - GHashTable *dupTable; - gint folderSize; - gint retVal; - gboolean folderRecurse; -}; - -/* Function prototypes */ -AddressHarvester *addrharvest_create ( void ); -void addrharvest_free ( AddressHarvester *harvester ); -void addrharvest_set_path ( AddressHarvester *harvester, - const gchar *value ); -void addrharvest_set_folder_size ( AddressHarvester* harvester, - const gint value ); -void addrharvest_set_header ( AddressHarvester* harvester, - const gchar *name, - const gboolean value ); -void addrharvest_set_recurse ( AddressHarvester* harvester, - const gboolean value ); -gint addrharvest_get_count ( AddressHarvester* harvester, - const gchar *name ); -gint addrharvest_harvest ( AddressHarvester *harvester, - AddressCache *cache, - GList *msgList ); -gboolean addrharvest_check_header ( AddressHarvester *harvester ); - -#endif /* __ADDRHARVEST_H__ */ - blob - 2131f6d77fe733a7c11ecc4cc0c33fc2d008260b blob + 800d05a64726997c5ebf54ab1b18b8be54a36c0d --- src/mainwindow.c +++ src/mainwindow.c @@ -341,11 +341,6 @@ static void scan_tree_func (Folder *folder, static void toggle_work_offline_cb(GtkAction *action, gpointer data); -static void addr_harvest_cb ( GtkAction *action, - gpointer data ); - -static void addr_harvest_msg_cb ( GtkAction *action, - gpointer data ); static void sync_cb ( GtkAction *action, gpointer data ); @@ -610,16 +605,9 @@ static GtkActionEntry mainwin_entries[] = {"Message/CheckSignature", NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) }, -/* Tools menu */ - {"Tools/AddressBook", NULL, N_("_Address book"), "A", NULL, G_CALLBACK(addressbook_open_cb) }, {"Tools/AddSenderToAB", NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) }, - {"Tools/CollectAddresses", NULL, N_("C_ollect addresses"), NULL, NULL, NULL }, - {"Tools/CollectAddresses/FromFolder", NULL, N_("From current _folder..."), NULL, NULL, G_CALLBACK(addr_harvest_cb) }, - {"Tools/CollectAddresses/FromSelected", NULL, N_("From selected _messages..."), NULL, NULL, G_CALLBACK(addr_harvest_msg_cb) }, - {"Tools/---", NULL, "---", NULL, NULL, NULL }, - /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */ {"Tools/Actions", NULL, N_("Actio_ns"), NULL, NULL, NULL }, {"Tools/Actions/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) }, @@ -1224,9 +1212,6 @@ MainWindow *main_window_create() /* Tools menu */ MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddressBook", "Tools/AddressBook", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddSenderToAB", "Tools/AddSenderToAB", GTK_UI_MANAGER_MENUITEM) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CollectAddresses", "Tools/CollectAddresses", GTK_UI_MANAGER_MENU) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromFolder", "Tools/CollectAddresses/FromFolder", GTK_UI_MANAGER_MENUITEM) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromSelected", "Tools/CollectAddresses/FromSelected", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator1", "Tools/---", GTK_UI_MANAGER_SEPARATOR) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CheckNewMessages", "Tools/CheckNewMessages", GTK_UI_MANAGER_MENUITEM) @@ -2372,10 +2357,6 @@ void main_window_set_menu_sensitive(MainWindow *mainwi SET_SENSITIVE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST); SET_SENSITIVE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST); - SET_SENSITIVE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED); - SET_SENSITIVE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED); - SET_SENSITIVE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST); - SET_SENSITIVE("Menu/Tools/Execute", M_DELAY_EXEC); SET_SENSITIVE("Menu/Tools/Expunge", M_DELETED_EXISTS); SET_SENSITIVE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS); @@ -4000,25 +3981,6 @@ gboolean mainwindow_is_obscured(void) return is_obscured; } -/* - * Harvest addresses for selected folder. - */ -static void addr_harvest_cb( GtkAction *action, gpointer data) -{ - MainWindow *mainwin = (MainWindow *)data; - - addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL ); -} - -/* - * Harvest addresses for selected messages in summary view. - */ -static void addr_harvest_msg_cb( GtkAction *action, gpointer data) -{ - MainWindow *mainwin = (MainWindow *)data; - summary_harvest_address( mainwin->summaryview ); -} - /*! *\brief get a MainWindow * blob - 64d9d8a986849c2b837975f9bb88019dbb5a0afc blob + e5cee45cd72f92bcc60010a9142408060c4211bd --- src/summaryview.c +++ src/summaryview.c @@ -6511,29 +6511,6 @@ void summary_reflect_prefs_pixmap_theme(SummaryView *s summary_set_column_titles(summaryview); } -/* - * Harvest addresses for selected messages in summary view. - */ -void summary_harvest_address(SummaryView *summaryview) -{ - GtkCMCTree *ctree = GTK_CMCTREE( summaryview->ctree ); - GList *cur; - GList *msgList; - MsgInfo *msginfo; - - msgList = NULL; - for( cur = GTK_CMCLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next ) { - msginfo = gtk_cmctree_node_get_row_data( ctree, GTK_CMCTREE_NODE(cur->data) ); - if (!msginfo) - continue; - msgList = g_list_append( msgList, GUINT_TO_POINTER( msginfo->msgnum ) ); - } - - addressbook_harvest( summaryview->folder_item, TRUE, msgList ); - - g_list_free( msgList ); -} - static regex_t *summary_compile_simplify_regexp(gchar *simplify_subject_regexp) { int err;