commit - 566853c97ca5a419493157f2ea64592fc72b994b
commit + 018b158d7dfd1729cf5cadb4f88ce1d8532d008c
blob - 37433177e3c791c36fa7bb9c4865a25fa369d2c5
blob + d1ea8281d1fc03b0c5f151e568c6df0fb4cf7d55
--- src/addressbook.c
+++ src/addressbook.c
#include "addrquery.h"
#include "addrselect.h"
#include "addrclip.h"
-#include "addrgather.h"
#include "adbookbase.h"
typedef enum
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
-/*
- * 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
-/*
- * 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
-/*
- * 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
-/*
- * 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
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 );
{"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) },
/* 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)
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);
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
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;