Commit Diff


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 <http://www.gnu.org/licenses/>.
- */
-
-/*
-* Dialog for gathering EMail addresses from mail folder.
-*/
-
-#include "defs.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-
-#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 <http://www.gnu.org/licenses/>.
- *
- */
-
-/*
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-/*
- * Functions for an E-Mail address harvester.
- */
-
-#include <sys/stat.h>
-#include <glib.h>
-#include <string.h>
-
-#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" <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 <http://www.gnu.org/licenses/>.
- *
- */
-
-/*
- * Definitions for an E-Mail address harvester.
- */
-
-#ifndef __ADDRHARVEST_H__
-#define __ADDRHARVEST_H__
-
-#include <stdio.h>
-#include <glib.h>
-#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"), "<shift><control>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;