summaryrefslogtreecommitdiff
path: root/src/xsane-email-project.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xsane-email-project.c')
-rw-r--r--src/xsane-email-project.c1912
1 files changed, 1912 insertions, 0 deletions
diff --git a/src/xsane-email-project.c b/src/xsane-email-project.c
new file mode 100644
index 0000000..67713ec
--- /dev/null
+++ b/src/xsane-email-project.c
@@ -0,0 +1,1912 @@
+/* xsane -- a graphical (X11, gtk) scanner-oriented SANE frontend
+
+ xsane-email-project.c
+
+ Oliver Rauch <Oliver.Rauch@rauch-domain.de>
+ Copyright (C) 1998-2005 Oliver Rauch
+ This file is part of the XSANE package.
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+#include "xsane.h"
+#include "xsane-back-gtk.h"
+#include "xsane-front-gtk.h"
+#include "xsane-preview.h"
+#include "xsane-save.h"
+#include "xsane-gamma.h"
+#include "xsane-setup.h"
+#include "xsane-scan.h"
+#include "xsane-rc-io.h"
+#include "xsane-device-preferences.h"
+#include "xsane-preferences.h"
+#include "xsane-icons.h"
+#include "xsane-batch-scan.h"
+
+#ifdef HAVE_LIBPNG
+#ifdef HAVE_LIBZ
+#include <png.h>
+#include <zlib.h>
+#endif
+#endif
+
+#include <sys/wait.h>
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+#ifdef XSANE_ACTIVATE_EMAIL
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static guint xsane_email_send_timer = 0;
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+/* forward declarations: */
+
+void xsane_email_project_save(void);
+void xsane_email_dialog(void);
+
+static gint xsane_email_dialog_delete();
+static void xsane_email_filetype_callback(GtkWidget *filetype_option_menu, char *filetype);
+static void xsane_email_receiver_changed_callback(GtkWidget *widget, gpointer data);
+static void xsane_email_subject_changed_callback(GtkWidget *widget, gpointer data);
+static void xsane_email_project_changed_callback(GtkWidget *widget, gpointer data);
+static void xsane_email_html_mode_callback(GtkWidget *widget);
+static void xsane_email_project_display_status(void);
+static void xsane_email_project_load(void);
+static void xsane_email_project_delete(void);
+static void xsane_email_project_update_project_status();
+static void xsane_email_project_create(void);
+static void xsane_email_entry_move_up_callback(GtkWidget *widget, gpointer list);
+static void xsane_email_entry_move_down_callback(GtkWidget *widget, gpointer list);
+static void xsane_email_entry_rename_callback(GtkWidget *widget, gpointer list);
+static void xsane_email_entry_delete_callback(GtkWidget *widget, gpointer list);
+static void xsane_email_show_callback(GtkWidget *widget, gpointer data);
+#if 0
+static void xsane_email_edit_callback(GtkWidget *widget, gpointer data);
+#endif
+static void xsane_email_send_process(void);
+static void xsane_email_send(void);
+
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static gint xsane_email_dialog_delete()
+{
+ return TRUE;
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_filetype_callback(GtkWidget *filetype_option_menu, char *filetype)
+{
+ DBG(DBG_proc, "xsane_email_filetype_callback(%s)\n", filetype);
+
+ if (preferences.email_filetype)
+ {
+ free(preferences.email_filetype);
+ }
+ preferences.email_filetype = strdup(filetype);
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+void xsane_email_dialog()
+{
+ GtkWidget *email_dialog, *email_scan_vbox, *email_project_vbox;
+ GtkWidget *email_project_exists_hbox, *button;
+ GtkWidget *hbox;
+ GtkWidget *scrolled_window, *list;
+ GtkWidget *pixmapwidget, *text;
+ GtkWidget *attachment_frame, *text_frame;
+ GtkWidget *label;
+ GtkWidget *filetype_menu, *filetype_item;
+ GtkWidget *filetype_option_menu;
+ GdkPixmap *pixmap;
+ GdkBitmap *mask;
+ char buf[64];
+ int filetype_nr;
+ int select_item;
+
+ DBG(DBG_proc, "xsane_email_dialog\n");
+
+ if (xsane.project_dialog)
+ {
+ return; /* window already is open */
+ }
+
+ /* GTK_WINDOW_TOPLEVEL looks better but does not place it nice*/
+ email_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ snprintf(buf, sizeof(buf), "%s %s", xsane.prog_name, WINDOW_EMAIL_PROJECT);
+ gtk_window_set_title(GTK_WINDOW(email_dialog), buf);
+ g_signal_connect(GTK_OBJECT(email_dialog), "delete_event", (GtkSignalFunc) xsane_email_dialog_delete, NULL);
+ xsane_set_window_icon(email_dialog, 0);
+ gtk_window_add_accel_group(GTK_WINDOW(email_dialog), xsane.accelerator_group);
+
+ /* set the main vbox */
+ email_scan_vbox = gtk_vbox_new(FALSE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(email_scan_vbox), 0);
+ gtk_container_add(GTK_CONTAINER(email_dialog), email_scan_vbox);
+ gtk_widget_show(email_scan_vbox);
+
+
+ /* email project */
+ hbox = gtk_hbox_new(FALSE, 2);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 2);
+ gtk_box_pack_start(GTK_BOX(email_scan_vbox), hbox, FALSE, FALSE, 1);
+
+ pixmap = gdk_pixmap_create_from_xpm_d(xsane.dialog->window, &mask, xsane.bg_trans, (gchar **) email_xpm);
+ pixmapwidget = gtk_image_new_from_pixmap(pixmap, mask);
+ gtk_box_pack_start(GTK_BOX(hbox), pixmapwidget, FALSE, FALSE, 2);
+ gdk_drawable_unref(pixmap);
+
+ text = gtk_entry_new();
+ xsane_back_gtk_set_tooltip(xsane.tooltips, text, DESC_EMAIL_PROJECT);
+ gtk_entry_set_max_length(GTK_ENTRY(text), 128);
+ gtk_entry_set_text(GTK_ENTRY(text), (char *) preferences.email_project);
+ gtk_box_pack_start(GTK_BOX(hbox), text, TRUE, TRUE, 4);
+ g_signal_connect(GTK_OBJECT(text), "changed", (GtkSignalFunc) xsane_email_project_changed_callback, NULL);
+
+ xsane.project_entry = text;
+ xsane.project_entry_box = hbox;
+
+ gtk_widget_show(pixmapwidget);
+ gtk_widget_show(text);
+ gtk_widget_show(hbox);
+
+ email_project_vbox = gtk_vbox_new(/* homogeneous */ FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(email_scan_vbox), email_project_vbox, TRUE, TRUE, 0);
+ gtk_widget_show(email_project_vbox);
+
+
+ /* email receiver */
+ hbox = gtk_hbox_new(FALSE, 2);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 2);
+ gtk_box_pack_start(GTK_BOX(email_project_vbox), hbox, FALSE, FALSE, 1);
+
+ gtk_widget_realize(email_dialog);
+
+ pixmap = gdk_pixmap_create_from_xpm_d(email_dialog->window, &mask, xsane.bg_trans, (gchar **) emailreceiver_xpm);
+ pixmapwidget = gtk_image_new_from_pixmap(pixmap, mask);
+ gtk_box_pack_start(GTK_BOX(hbox), pixmapwidget, FALSE, FALSE, 2);
+ gdk_drawable_unref(pixmap);
+
+ text = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(text), 128);
+ xsane_back_gtk_set_tooltip(xsane.tooltips, text, DESC_EMAIL_RECEIVER);
+ gtk_box_pack_start(GTK_BOX(hbox), text, TRUE, TRUE, 4);
+ g_signal_connect(GTK_OBJECT(text), "changed", (GtkSignalFunc) xsane_email_receiver_changed_callback, NULL);
+
+ xsane.email_receiver_entry = text;
+
+ gtk_widget_show(pixmapwidget);
+ gtk_widget_show(text);
+ gtk_widget_show(hbox);
+
+
+ /* subject */
+ hbox = gtk_hbox_new(FALSE, 2);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 2);
+ gtk_box_pack_start(GTK_BOX(email_project_vbox), hbox, FALSE, FALSE, 1);
+
+ gtk_widget_realize(email_dialog);
+
+ pixmap = gdk_pixmap_create_from_xpm_d(email_dialog->window, &mask, xsane.bg_trans, (gchar **) subject_xpm);
+ pixmapwidget = gtk_image_new_from_pixmap(pixmap, mask);
+ gtk_box_pack_start(GTK_BOX(hbox), pixmapwidget, FALSE, FALSE, 2);
+ gdk_drawable_unref(pixmap);
+
+ text = gtk_entry_new();
+ xsane_back_gtk_set_tooltip(xsane.tooltips, text, DESC_EMAIL_SUBJECT);
+ gtk_entry_set_max_length(GTK_ENTRY(text), 128);
+ gtk_box_pack_start(GTK_BOX(hbox), text, TRUE, TRUE, 4);
+ g_signal_connect(GTK_OBJECT(text), "changed", (GtkSignalFunc) xsane_email_subject_changed_callback, NULL);
+
+ xsane.email_subject_entry = text;
+
+ gtk_widget_show(pixmapwidget);
+ gtk_widget_show(text);
+ gtk_widget_show(hbox);
+
+
+ /* email text frame */
+ text_frame = gtk_frame_new(TEXT_EMAIL_TEXT);
+ gtk_box_pack_start(GTK_BOX(email_project_vbox), text_frame, TRUE, TRUE, 2);
+ gtk_widget_show(text_frame);
+
+ /* email text box */
+ hbox = gtk_hbox_new(FALSE, 2);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 4);
+ gtk_container_add(GTK_CONTAINER(text_frame), hbox);
+ gtk_widget_show(hbox);
+
+#ifdef HAVE_GTK_TEXT_VIEW_H
+ {
+ GtkWidget *scrolled_window, *text_view, *text_buffer;
+
+ /* create a scrolled window to get a vertical scrollbar */
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(hbox), scrolled_window);
+ gtk_widget_show(scrolled_window);
+
+ /* create the gtk_text_view widget */
+ text_view = gtk_text_view_new();
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(text_view), TRUE);
+ gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_view), GTK_WRAP_WORD);
+ gtk_container_add(GTK_CONTAINER(scrolled_window), text_view);
+ gtk_widget_show(text_view);
+
+ /* get the text_buffer widget and insert the text from file */
+ text_buffer = (GtkWidget *) gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
+
+ xsane.email_text_widget = text_buffer;
+ }
+#else
+ {
+ GtkWidget *vscrollbar;
+
+ /* Create the GtkText widget */
+ text = gtk_text_new(NULL, NULL);
+ gtk_text_set_editable(GTK_TEXT(text), TRUE); /* text is editable */
+ gtk_text_set_word_wrap(GTK_TEXT(text), TRUE); /* wrap complete words */
+ gtk_box_pack_start(GTK_BOX(hbox), text, TRUE, TRUE, 0);
+ gtk_widget_show(text);
+ xsane.email_text_widget = text;
+
+ /* Add a vertical scrollbar to the GtkText widget */
+ vscrollbar = gtk_vscrollbar_new(GTK_TEXT(text)->vadj);
+ gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0);
+ gtk_widget_show(vscrollbar);
+ }
+#endif
+
+
+ /* html email */
+ button = gtk_check_button_new_with_label(RADIO_BUTTON_HTML_EMAIL);
+ xsane_back_gtk_set_tooltip(xsane.tooltips, button, DESC_HTML_EMAIL);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), xsane.email_html_mode);
+ gtk_box_pack_start(GTK_BOX(email_project_vbox), button, FALSE, FALSE, 2);
+ gtk_widget_show(button);
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_html_mode_callback, NULL);
+ xsane.email_html_mode_widget = button;
+
+ /* FILETYPE MENU */
+ /* button box, active when project exists */
+ hbox = gtk_hbox_new(FALSE, 2);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 2);
+ gtk_box_pack_start(GTK_BOX(email_project_vbox), hbox, FALSE, FALSE, 1);
+ gtk_widget_show(hbox);
+
+ filetype_menu = gtk_menu_new();
+
+ filetype_nr = -1;
+ select_item = 0;
+
+#ifdef HAVE_LIBJPEG
+ filetype_item = gtk_menu_item_new_with_label(MENU_ITEM_FILETYPE_JPEG);
+ gtk_container_add(GTK_CONTAINER(filetype_menu), filetype_item);
+ g_signal_connect(GTK_OBJECT(filetype_item), "activate", (GtkSignalFunc) xsane_email_filetype_callback, (void *) XSANE_FILETYPE_JPEG);
+ gtk_widget_show(filetype_item);
+ filetype_nr++;
+ if ( (preferences.email_filetype) && (!strcasecmp(preferences.email_filetype, XSANE_FILETYPE_JPEG)) )
+ {
+ select_item = filetype_nr;
+ }
+#endif
+
+
+ filetype_item = gtk_menu_item_new_with_label(MENU_ITEM_FILETYPE_PDF);
+ gtk_container_add(GTK_CONTAINER(filetype_menu), filetype_item);
+ g_signal_connect(GTK_OBJECT(filetype_item), "activate", (GtkSignalFunc) xsane_email_filetype_callback, (void *) XSANE_FILETYPE_PDF);
+ gtk_widget_show(filetype_item);
+ filetype_nr++;
+ if ( (preferences.email_filetype) && (!strcasecmp(preferences.email_filetype, XSANE_FILETYPE_PDF)) )
+ {
+ select_item = filetype_nr;
+ }
+
+
+#ifdef HAVE_LIBPNG
+#ifdef HAVE_LIBZ
+ filetype_item = gtk_menu_item_new_with_label(MENU_ITEM_FILETYPE_PNG);
+ gtk_container_add(GTK_CONTAINER(filetype_menu), filetype_item);
+ g_signal_connect(GTK_OBJECT(filetype_item), "activate", (GtkSignalFunc) xsane_email_filetype_callback, (void *) XSANE_FILETYPE_PNG);
+ gtk_widget_show(filetype_item);
+ filetype_nr++;
+ if ( (preferences.email_filetype) && (!strcasecmp(preferences.email_filetype, XSANE_FILETYPE_PNG)) )
+ {
+ select_item = filetype_nr;
+ }
+#endif
+#endif
+
+ filetype_item = gtk_menu_item_new_with_label(MENU_ITEM_FILETYPE_PS);
+ gtk_container_add(GTK_CONTAINER(filetype_menu), filetype_item);
+ g_signal_connect(GTK_OBJECT(filetype_item), "activate", (GtkSignalFunc) xsane_email_filetype_callback, (void *) XSANE_FILETYPE_PS);
+ gtk_widget_show(filetype_item);
+ filetype_nr++;
+ if ( (preferences.email_filetype) && (!strcasecmp(preferences.email_filetype, XSANE_FILETYPE_PS)) )
+ {
+ select_item = filetype_nr;
+ }
+
+
+#ifdef HAVE_LIBTIFF
+ filetype_item = gtk_menu_item_new_with_label(MENU_ITEM_FILETYPE_TIFF);
+ gtk_container_add(GTK_CONTAINER(filetype_menu), filetype_item);
+ g_signal_connect(GTK_OBJECT(filetype_item), "activate", (GtkSignalFunc) xsane_email_filetype_callback, (void *) XSANE_FILETYPE_TIFF);
+ gtk_widget_show(filetype_item);
+ filetype_nr++;
+ if ( (preferences.email_filetype) && (!strcasecmp(preferences.email_filetype, XSANE_FILETYPE_TIFF)) )
+ {
+ select_item = filetype_nr;
+ }
+#endif
+
+ label = gtk_label_new(TEXT_EMAIL_FILETYPE);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
+ gtk_widget_show(label);
+
+ filetype_option_menu = gtk_option_menu_new();
+ xsane_back_gtk_set_tooltip(xsane.tooltips, filetype_option_menu, DESC_EMAIL_FILETYPE);
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(filetype_option_menu), filetype_menu);
+ if (select_item >= 0)
+ {
+ gtk_option_menu_set_history(GTK_OPTION_MENU(filetype_option_menu), select_item);
+ }
+ gtk_box_pack_end(GTK_BOX(hbox), filetype_option_menu, FALSE, FALSE, 2);
+ gtk_widget_show(filetype_menu);
+ gtk_widget_show(filetype_option_menu);
+
+
+ /* attachment frame */
+ attachment_frame = gtk_frame_new(TEXT_ATTACHMENTS);
+ gtk_box_pack_start(GTK_BOX(email_project_vbox), attachment_frame, FALSE, FALSE, 2);
+ gtk_widget_show(attachment_frame);
+
+ /* attachment list */
+ scrolled_window = gtk_scrolled_window_new(0, 0);
+ gtk_widget_set_size_request(scrolled_window, 200, 100);
+ gtk_container_add(GTK_CONTAINER(attachment_frame), scrolled_window);
+ gtk_widget_show(scrolled_window);
+
+ list = gtk_list_new();
+/* gtk_list_set_selection_mode(list, GTK_SELECTION_BROWSE); */
+
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), list);
+ gtk_widget_show(list);
+ xsane.project_list = list;
+
+
+ /* button box, active when project exists */
+ hbox = gtk_hbox_new(FALSE, 2);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 2);
+ gtk_box_pack_start(GTK_BOX(email_project_vbox), hbox, FALSE, FALSE, 1);
+
+ button = gtk_button_new_with_label(BUTTON_IMAGE_SHOW);
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_show_callback, list);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+#if 0
+ /* before we enable the edit function we have to make sure that the rename function
+ does also rename the image name of the opened viewer */
+ button = gtk_button_new_with_label(BUTTON_IMAGE_EDIT);
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_edit_callback, list);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+#endif
+
+ button = gtk_button_new_with_label(BUTTON_IMAGE_RENAME);
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_entry_rename_callback, list);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ button = gtk_button_new_with_label(BUTTON_IMAGE_DELETE);
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_entry_delete_callback, list);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ xsane_button_new_with_pixmap(email_dialog->window, hbox, move_up_xpm, 0, (GtkSignalFunc) xsane_email_entry_move_up_callback, list);
+ xsane_button_new_with_pixmap(email_dialog->window, hbox, move_down_xpm, 0, (GtkSignalFunc) xsane_email_entry_move_down_callback, list);
+
+ gtk_widget_show(hbox);
+
+ xsane.project_box = email_project_vbox;
+
+
+ /* set the main hbox */
+ hbox = gtk_hbox_new(FALSE, 0);
+ xsane_separator_new(email_project_vbox, 2);
+ gtk_box_pack_end(GTK_BOX(email_scan_vbox), hbox, FALSE, FALSE, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
+ gtk_widget_show(hbox);
+
+
+ email_project_exists_hbox = gtk_hbox_new(FALSE, 2);
+ gtk_box_pack_start(GTK_BOX(hbox), email_project_exists_hbox, TRUE, TRUE, 0);
+
+ button = gtk_button_new_with_label(BUTTON_SEND_PROJECT);
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_send, NULL);
+ gtk_box_pack_start(GTK_BOX(email_project_exists_hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ button = gtk_button_new_with_label(BUTTON_DELETE_PROJECT);
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_project_delete, NULL);
+ gtk_box_pack_start(GTK_BOX(email_project_exists_hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ gtk_widget_show(email_project_exists_hbox);
+ xsane.project_exists = email_project_exists_hbox;
+
+ button = gtk_button_new_with_label(BUTTON_CREATE_PROJECT);
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_project_create, NULL);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ xsane.project_not_exists = button;
+
+ /* progress bar */
+ xsane.project_progress_bar = (GtkProgressBar *) gtk_progress_bar_new();
+ gtk_box_pack_start(GTK_BOX(email_scan_vbox), (GtkWidget *) xsane.project_progress_bar, FALSE, FALSE, 0);
+ gtk_progress_set_show_text(GTK_PROGRESS(xsane.project_progress_bar), TRUE);
+ gtk_progress_set_format_string(GTK_PROGRESS(xsane.project_progress_bar), "");
+ gtk_widget_show(GTK_WIDGET(xsane.project_progress_bar));
+
+
+ xsane.project_dialog = email_dialog;
+
+ xsane_email_project_load();
+
+ gtk_window_move(GTK_WINDOW(xsane.project_dialog), xsane.project_dialog_posx, xsane.project_dialog_posy);
+ gtk_widget_show(email_dialog);
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_project_set_sensitive(int sensitive)
+{
+ gtk_widget_set_sensitive(xsane.project_box, sensitive);
+ gtk_widget_set_sensitive(xsane.project_exists, sensitive);
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_project_display_status()
+{
+ FILE *lockfile;
+ char buf[256];
+ char filename[PATH_MAX];
+ int val;
+ int i, c;
+
+ DBG(DBG_proc, "xsane_email_project_display_status\n");
+
+ snprintf(filename, sizeof(filename), "%s/lockfile", preferences.email_project);
+ lockfile = fopen(filename, "rb"); /* read binary (b for win32) */
+
+ if (lockfile)
+ {
+ i=0;
+ c=0;
+ while ((i<255) && (c != 10) && (c != EOF)) /* first line is email status */
+ {
+ c = fgetc(lockfile);
+ buf[i++] = c;
+ }
+ buf[i-1] = 0;
+
+ fscanf(lockfile, "%d\n", &val);
+
+ fclose(lockfile);
+
+ if ( (!strcmp(buf, TEXT_EMAIL_STATUS_SENDING)) ||
+ (!strcmp(buf, TEXT_EMAIL_STATUS_SENT)) ||
+ (!strcmp(buf, TEXT_PROJECT_STATUS_ERR_READ_PROJECT)) ||
+ (!strcmp(buf, TEXT_EMAIL_STATUS_POP3_CONNECTION_FAILED)) ||
+ (!strcmp(buf, TEXT_EMAIL_STATUS_POP3_LOGIN_FAILED)) ||
+ (!strcmp(buf, TEXT_EMAIL_STATUS_ASMTP_AUTH_FAILED)) ||
+ (!strcmp(buf, TEXT_EMAIL_STATUS_SMTP_CONNECTION_FAILED)) ||
+ (!strcmp(buf, TEXT_EMAIL_STATUS_SMTP_ERR_FROM)) ||
+ (!strcmp(buf, TEXT_EMAIL_STATUS_SMTP_ERR_RCPT)) ||
+ (!strcmp(buf, TEXT_EMAIL_STATUS_SMTP_ERR_DATA)) ||
+ (!strcmp(buf, TEXT_EMAIL_STATUS_SENT)) )
+ {
+ if (strcmp(xsane.email_status, buf))
+ {
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(buf);
+
+ if (xsane.project_progress_bar)
+ {
+ gtk_progress_set_format_string(GTK_PROGRESS(xsane.project_progress_bar), _(xsane.email_status));
+ }
+ }
+
+ xsane.email_progress_val = val / 100.0;
+ if (xsane.project_progress_bar)
+ {
+ gtk_progress_bar_update(GTK_PROGRESS_BAR(xsane.project_progress_bar), xsane.email_progress_val);
+ }
+
+ DBG(DBG_info, "reading from lockfile: email_status %s, email_progress_val %1.3f\n" , xsane.email_status, xsane.email_progress_val);
+
+ if (strcmp(xsane.email_status, TEXT_EMAIL_STATUS_SENDING)) /* not sending */
+ {
+ DBG(DBG_info, "removing %s\n", filename);
+ remove(filename); /* remove lockfile */
+
+ xsane.email_progress_val = 0.0;
+
+ xsane_email_project_update_project_status();
+
+ if (xsane.project_dialog)
+ {
+ xsane_email_project_load();
+
+ xsane_email_project_set_sensitive(TRUE);
+ gtk_widget_set_sensitive(GTK_WIDGET(xsane.start_button), TRUE);
+ }
+ }
+ }
+ }
+ else
+ {
+ DBG(DBG_info, "no lockfile present\n");
+ if (xsane.project_progress_bar)
+ {
+ gtk_progress_set_format_string(GTK_PROGRESS(xsane.project_progress_bar), _(xsane.email_status));
+ gtk_progress_bar_update(GTK_PROGRESS_BAR(xsane.project_progress_bar), xsane.email_progress_val);
+ }
+
+ while (gtk_events_pending())
+ {
+ gtk_main_iteration();
+ }
+ }
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static gint xsane_email_send_timer_callback(gpointer data)
+{
+ xsane_email_project_display_status();
+
+ if (strcmp(xsane.email_status, TEXT_EMAIL_STATUS_SENDING)) /* not sending */
+ {
+ if (xsane_email_send_timer)
+ {
+ DBG(DBG_info, "disabling email send timer\n");
+ xsane_email_send_timer = 0;
+ }
+ }
+
+ return xsane_email_send_timer;
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_project_load()
+{
+ FILE *projectfile;
+ char page[256];
+ char *type;
+ char *extension;
+ char buf[256];
+ char filename[PATH_MAX];
+ GtkWidget *list_item;
+ int i;
+ int c;
+
+ DBG(DBG_proc, "xsane_email_project_load\n");
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ xsane.email_status = NULL;
+ }
+
+ if (xsane.email_receiver)
+ {
+ free(xsane.email_receiver);
+ xsane.email_receiver = NULL;
+ }
+
+ if (xsane.email_filename)
+ {
+ free(xsane.email_filename);
+ xsane.email_filename = NULL;
+ }
+
+ if (xsane.email_subject)
+ {
+ free(xsane.email_subject);
+ xsane.email_subject = NULL;
+ }
+
+ g_signal_handlers_disconnect_by_func(GTK_OBJECT(xsane.email_receiver_entry), GTK_SIGNAL_FUNC(xsane_email_receiver_changed_callback), 0);
+ g_signal_handlers_disconnect_by_func(GTK_OBJECT(xsane.email_subject_entry), GTK_SIGNAL_FUNC(xsane_email_subject_changed_callback), 0);
+ g_signal_handlers_disconnect_by_func(GTK_OBJECT(xsane.email_html_mode_widget), GTK_SIGNAL_FUNC(xsane_email_html_mode_callback), 0);
+
+#ifdef HAVE_GTK_TEXT_VIEW_H
+ gtk_text_buffer_set_text(GTK_TEXT_BUFFER(xsane.email_text_widget), "", 0);
+#else
+ gtk_text_set_point(GTK_TEXT(xsane.email_text_widget), 0);
+ gtk_text_forward_delete(GTK_TEXT(xsane.email_text_widget), gtk_text_get_length(GTK_TEXT(xsane.email_text_widget)));
+#endif
+ gtk_list_remove_items(GTK_LIST(xsane.project_list), GTK_LIST(xsane.project_list)->children);
+
+ snprintf(filename, sizeof(filename), "%s/xsane-mail-list", preferences.email_project);
+ projectfile = fopen(filename, "rb"); /* read binary (b for win32) */
+
+ if ((!projectfile) || (feof(projectfile)))
+ {
+ snprintf(filename, sizeof(filename), "%s/image-1.pnm", preferences.email_project);
+ xsane.email_filename=strdup(filename);
+ xsane_update_counter_in_filename(&xsane.email_filename, FALSE, 0, preferences.filename_counter_len); /* correct counter len */
+
+ xsane.email_status=strdup(TEXT_PROJECT_STATUS_NOT_CREATED);
+ xsane.email_progress_val = 0.0;
+
+ xsane.email_receiver=strdup("");
+ gtk_entry_set_text(GTK_ENTRY(xsane.email_receiver_entry), (char *) xsane.email_receiver);
+
+ xsane.email_subject=strdup("");
+ gtk_entry_set_text(GTK_ENTRY(xsane.email_subject_entry), (char *) xsane.email_subject);
+
+ gtk_widget_hide(xsane.project_exists);
+ gtk_widget_show(xsane.project_not_exists);
+
+ gtk_widget_set_sensitive(xsane.project_box, FALSE);
+ gtk_widget_set_sensitive(xsane.project_exists, FALSE);
+ /* do not change sensitivity of email_project_entry_box here !!! */
+ gtk_widget_set_sensitive(GTK_WIDGET(xsane.start_button), FALSE);
+
+ xsane.email_project_save = 0;
+ }
+ else
+ {
+ i=0;
+ c=0;
+ while ((i<255) && (c != 10) && (c != EOF)) /* first line is email status */
+ {
+ c = fgetc(projectfile);
+ page[i++] = c;
+ }
+ page[i-1] = 0;
+ if (strchr(page, '@'))
+ {
+ *strchr(page, '@') = 0;
+ }
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(page);
+ xsane.email_progress_val = 0.0;
+
+
+ i=0;
+ c=0;
+ while ((i<255) && (c != 10) && (c != EOF)) /* second line is email address */
+ {
+ c = fgetc(projectfile);
+ page[i++] = c;
+ }
+ page[i-1] = 0;
+
+ xsane.email_receiver=strdup(page);
+ gtk_entry_set_text(GTK_ENTRY(xsane.email_receiver_entry), (char *) xsane.email_receiver);
+
+
+ i=0;
+ c=0;
+ while ((i<255) && (c != 10) && (c != EOF)) /* third line is next email filename */
+ {
+ c = fgetc(projectfile);
+ page[i++] = c;
+ }
+ page[i-1] = 0;
+
+ snprintf(filename, sizeof(filename), "%s/%s", preferences.email_project, page);
+ xsane.email_filename=strdup(filename);
+
+
+ i=0;
+ c=0;
+ while ((i<255) && (c != 10) && (c != EOF)) /* fourth line is subject */
+ {
+ c = fgetc(projectfile);
+ page[i++] = c;
+ }
+ page[i-1] = 0;
+
+ xsane.email_subject=strdup(page);
+ gtk_entry_set_text(GTK_ENTRY(xsane.email_subject_entry), (char *) xsane.email_subject);
+
+
+ i=0;
+ c=0;
+ while ((i<255) && (c != 10) && (c != EOF)) /* fifth line is html/ascii */
+ {
+ c = fgetc(projectfile);
+ page[i++] = c;
+ }
+ page[i-1] = 0;
+
+ if (!strcasecmp("html", page))
+ {
+ xsane.email_html_mode = 1;
+ }
+ else
+ {
+ xsane.email_html_mode = 0;
+ }
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xsane.email_html_mode_widget), xsane.email_html_mode);
+
+
+ while (!feof(projectfile))
+ {
+ i=0;
+ c=0;
+
+ while ((i<255) && (c != 10) && (c != EOF))
+ {
+ c = fgetc(projectfile);
+ page[i++] = c;
+ }
+ page[i-1]=0;
+
+ if (!strcmp("mailtext:", page))
+ {
+ break; /* emailtext follows */
+ }
+
+ extension = strrchr(page, '.');
+ if (extension)
+ {
+ type = strdup(extension);
+ *extension = 0;
+ }
+ else
+ {
+ type = strdup("");
+ }
+
+ if (c > 1)
+ {
+ list_item = gtk_list_item_new_with_label(page);
+ gtk_object_set_data(GTK_OBJECT(list_item), "list_item_data", strdup(page));
+ gtk_object_set_data(GTK_OBJECT(list_item), "list_item_type", strdup(type));
+ gtk_container_add(GTK_CONTAINER(xsane.project_list), list_item);
+ gtk_widget_show(list_item);
+ }
+ }
+
+ while (!feof(projectfile))
+ {
+ i = fread(buf, 1, sizeof(buf), projectfile);
+#ifdef HAVE_GTK_TEXT_VIEW_H
+ gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(xsane.email_text_widget), buf, i);
+#else
+ gtk_text_insert(GTK_TEXT(xsane.email_text_widget), NULL, NULL, NULL, buf, i);
+#endif
+ }
+
+ if (!strcmp(xsane.email_status, TEXT_EMAIL_STATUS_SENDING)) /* email project is locked (sending) */
+ {
+ xsane_email_project_set_sensitive(FALSE);
+ gtk_widget_set_sensitive(xsane.project_entry_box, TRUE);
+ gtk_widget_set_sensitive(GTK_WIDGET(xsane.start_button), FALSE);
+
+ if (xsane_email_send_timer == 0)
+ {
+ xsane_email_send_timer = gtk_timeout_add(100, (GtkFunction) xsane_email_send_timer_callback, NULL);
+ DBG(DBG_info, "enabling email send timer (%d)\n", xsane_email_send_timer);
+ }
+ }
+ else
+ {
+ xsane_email_project_set_sensitive(TRUE);
+ gtk_widget_set_sensitive(xsane.project_entry_box, TRUE);
+ gtk_widget_set_sensitive(GTK_WIDGET(xsane.start_button), TRUE);
+ }
+
+ gtk_widget_show(xsane.project_exists);
+ gtk_widget_hide(xsane.project_not_exists);
+
+ xsane.email_project_save = 1;
+ }
+
+ if (projectfile)
+ {
+ fclose(projectfile);
+ }
+
+ gtk_progress_set_format_string(GTK_PROGRESS(xsane.project_progress_bar), _(xsane.email_status));
+ gtk_progress_bar_update(GTK_PROGRESS_BAR(xsane.project_progress_bar), xsane.email_progress_val);
+
+ xsane_email_project_display_status();
+
+ g_signal_connect(GTK_OBJECT(xsane.email_html_mode_widget), "clicked", (GtkSignalFunc) xsane_email_html_mode_callback, NULL);
+ g_signal_connect(GTK_OBJECT(xsane.email_receiver_entry), "changed", (GtkSignalFunc) xsane_email_receiver_changed_callback, NULL);
+ g_signal_connect(GTK_OBJECT(xsane.email_subject_entry), "changed", (GtkSignalFunc) xsane_email_subject_changed_callback, NULL);
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_project_delete()
+{
+ char *page;
+ char *type;
+ char file[256];
+ GList *list = (GList *) GTK_LIST(xsane.project_list)->children;
+ GtkObject *list_item;
+
+ DBG(DBG_proc, "xsane_email_project_delete\n");
+
+ while (list)
+ {
+ list_item = GTK_OBJECT(list->data);
+ page = strdup((char *) gtk_object_get_data(list_item, "list_item_data"));
+ type = strdup((char *) gtk_object_get_data(list_item, "list_item_type"));
+ xsane_convert_text_to_filename(&page);
+ snprintf(file, sizeof(file), "%s/%s%s", preferences.email_project, page, type);
+ free(page);
+ free(type);
+ remove(file);
+ list = list->next;
+ }
+ snprintf(file, sizeof(file), "%s/xsane-mail-list", preferences.email_project);
+ remove(file);
+ snprintf(file, sizeof(file), "%s", preferences.email_project);
+ rmdir(file);
+
+ xsane_email_project_load();
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_project_update_project_status()
+{
+ FILE *projectfile;
+ char filename[PATH_MAX];
+ char buf[256];
+
+ snprintf(filename, sizeof(filename), "%s/xsane-mail-list", preferences.email_project);
+ projectfile = fopen(filename, "r+b"); /* r+ = read and write, position = start of file */
+
+ snprintf(buf, 32, "%s@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", xsane.email_status); /* fill 32 characters status line */
+ fprintf(projectfile, "%s\n", buf); /* first line is status of email */
+
+ fclose(projectfile);
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+void xsane_email_project_save()
+{
+ FILE *projectfile;
+ GList *list = (GList *) GTK_LIST(xsane.project_list)->children;
+ GtkObject *list_item;
+ char *page;
+ char *type;
+ gchar *email_text;
+ char filename[256];
+
+ DBG(DBG_proc, "xsane_email_project_save\n");
+
+ umask((mode_t) preferences.directory_umask); /* define new file permissions */
+ mkdir(preferences.email_project, 0777); /* make sure directory exists */
+
+ snprintf(filename, sizeof(filename), "%s/xsane-mail-list", preferences.email_project);
+
+ if (xsane_create_secure_file(filename)) /* remove possibly existing symbolic links for security */
+ {
+ char buf[256];
+
+ snprintf(buf, sizeof(buf), "%s %s %s\n", ERR_DURING_SAVE, ERR_CREATE_SECURE_FILE, filename);
+ xsane_back_gtk_error(buf, TRUE);
+ return; /* error */
+ }
+
+ projectfile = fopen(filename, "wb"); /* write binary (b for win32) */
+
+ if (xsane.email_status)
+ {
+ char buf[256];
+
+ snprintf(buf, 32, "%s@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", xsane.email_status); /* fill 32 characters status line */
+ fprintf(projectfile, "%s\n", buf); /* first line is status of email */
+ gtk_progress_set_format_string(GTK_PROGRESS(xsane.project_progress_bar), _(xsane.email_status));
+ gtk_progress_bar_update(GTK_PROGRESS_BAR(xsane.project_progress_bar), 0.0);
+ }
+ else
+ {
+ fprintf(projectfile, " \n"); /* no email status */
+ gtk_progress_set_format_string(GTK_PROGRESS(xsane.project_progress_bar), "");
+ gtk_progress_bar_update(GTK_PROGRESS_BAR(xsane.project_progress_bar), 0.0);
+ }
+
+ if (xsane.email_receiver)
+ {
+ fprintf(projectfile, "%s\n", xsane.email_receiver); /* second line is receiver phone number or address */
+ }
+ else
+ {
+ fprintf(projectfile, "\n");
+ }
+
+ if (xsane.email_filename)
+ {
+ fprintf(projectfile, "%s\n", strrchr(xsane.email_filename, '/')+1); /* third line is next email filename */
+ }
+ else
+ {
+ fprintf(projectfile, "\n");
+ }
+
+ if (xsane.email_subject)
+ {
+ fprintf(projectfile, "%s\n", xsane.email_subject); /* fourth line is subject */
+ }
+ else
+ {
+ fprintf(projectfile, "\n");
+ }
+
+ if (xsane.email_html_mode) /* fith line is mode html/ascii */
+ {
+ fprintf(projectfile, "html\n");
+ }
+ else
+ {
+ fprintf(projectfile, "ascii\n");
+ }
+
+
+ while (list)
+ {
+ list_item = GTK_OBJECT(list->data);
+ page = (char *) gtk_object_get_data(list_item, "list_item_data");
+ type = (char *) gtk_object_get_data(list_item, "list_item_type");
+ fprintf(projectfile, "%s%s\n", page, type);
+ list = list->next;
+ }
+
+ /* save email text */
+ fprintf(projectfile, "mailtext:\n");
+#ifdef HAVE_GTK_TEXT_VIEW_H
+ {
+ GtkTextIter start, end;
+
+ gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(xsane.email_text_widget), &start);
+ gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(xsane.email_text_widget), &end);
+ email_text = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(xsane.email_text_widget), &start, &end, FALSE);
+ }
+#else
+ email_text = gtk_editable_get_chars(GTK_EDITABLE(xsane.email_text_widget), 0, -1);
+#endif
+ fprintf(projectfile, "%s", email_text);
+
+ fclose(projectfile);
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_project_create()
+{
+ DBG(DBG_proc, "xsane_email_project_create\n");
+
+ if (strlen(preferences.email_project))
+ {
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_PROJECT_STATUS_CREATED);
+ xsane_email_project_save();
+ xsane_email_project_load();
+ }
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_receiver_changed_callback(GtkWidget *widget, gpointer data)
+{
+ DBG(DBG_proc, "xsane_email_receiver_changed_callback\n");
+
+ if (xsane.email_receiver)
+ {
+ free((void *) xsane.email_receiver);
+ }
+ xsane.email_receiver = strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_PROJECT_STATUS_CHANGED);
+ xsane.email_project_save = 1;
+ xsane_email_project_display_status();
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_subject_changed_callback(GtkWidget *widget, gpointer data)
+{
+ DBG(DBG_proc, "xsane_email_subject_changed_callback\n");
+
+ if (xsane.email_subject)
+ {
+ free((void *) xsane.email_subject);
+ }
+ xsane.email_subject = strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_PROJECT_STATUS_CHANGED);
+ xsane.email_project_save = 1;
+ xsane_email_project_display_status();
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_project_changed_callback(GtkWidget *widget, gpointer data)
+{
+ DBG(DBG_proc, "xsane_email_project_changed_callback\n");
+
+ if (xsane.email_project_save)
+ {
+ xsane.email_project_save = 0;
+ xsane_email_project_save();
+ }
+
+ if (preferences.email_project)
+ {
+ free((void *) preferences.email_project);
+ }
+ preferences.email_project = strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
+
+ xsane_email_project_load();
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_html_mode_callback(GtkWidget * widget)
+{
+ DBG(DBG_proc, "xsane_email_html_mode_callback\n");
+
+ xsane.email_html_mode = (GTK_TOGGLE_BUTTON(widget)->active != 0);
+
+ /* we can save it because this routine is only called when the project already exists */
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_PROJECT_STATUS_CHANGED);
+ xsane.email_project_save = 1;
+ xsane_email_project_display_status();
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_entry_move_up_callback(GtkWidget *widget, gpointer list)
+{
+ GList *select;
+ GList *item = GTK_LIST(list)->children;
+ GtkWidget *list_item_1;
+ GtkWidget *list_item_2;
+ int position;
+ int newpos;
+
+ DBG(DBG_proc, "xsane_email_entry_move_up\n");
+
+ select = GTK_LIST(list)->selection;
+ if (select)
+ {
+ list_item_1 = select->data;
+
+ position = gtk_list_child_position(GTK_LIST(list), list_item_1);
+ position--; /* move up */
+ newpos = position;
+
+ if (position >= 0)
+ {
+ while (position>0)
+ {
+ item = item->next;
+ position--;
+ }
+
+ list_item_2 = item->data;
+ if (list_item_2)
+ {
+ xsane_front_gtk_list_entries_swap(list_item_1, list_item_2);
+ gtk_list_select_item(GTK_LIST(list), newpos);
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_PROJECT_STATUS_CHANGED);
+ xsane_email_project_save();
+ }
+ }
+ }
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_entry_move_down_callback(GtkWidget *widget, gpointer list)
+{
+ GList *select;
+ GList *item = GTK_LIST(list)->children;
+ GtkWidget *list_item_1;
+ GtkWidget *list_item_2;
+ int position;
+ int newpos;
+
+ DBG(DBG_proc, "xsane_email_entry_move_down\n");
+
+ select = GTK_LIST(list)->selection;
+ if (select)
+ {
+ list_item_1 = select->data;
+
+ position = gtk_list_child_position(GTK_LIST(list), list_item_1);
+ position++; /* move down */
+ newpos = position;
+
+ while ((position>0) && (item))
+ {
+ item = item->next;
+ position--;
+ }
+
+ if (item)
+ {
+ list_item_2 = item->data;
+ if (list_item_2)
+ {
+ xsane_front_gtk_list_entries_swap(list_item_1, list_item_2);
+ gtk_list_select_item(GTK_LIST(list), newpos);
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_PROJECT_STATUS_CHANGED);
+ xsane_email_project_save();
+ }
+ }
+ }
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+int xsane_email_entry_rename;
+
+static void xsane_email_entry_rename_button_callback(GtkWidget *widget, gpointer data)
+{
+ DBG(DBG_proc, "xsane_email_entry_rename\n");
+
+ xsane_email_entry_rename = (int) data;
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_entry_rename_callback(GtkWidget *widget, gpointer list)
+{
+ GtkWidget *list_item;
+ GList *select;
+ char *oldpage;
+ char *newpage;
+ char *type;
+ char oldfile[256];
+ char newfile[256];
+
+ DBG(DBG_proc, "xsane_email_entry_rename_callback\n");
+
+ select = GTK_LIST(list)->selection;
+ if (select)
+ {
+ GtkWidget *rename_dialog;
+ GtkWidget *text;
+ GtkWidget *button;
+ GtkWidget *vbox, *hbox;
+ char filename[PATH_MAX];
+
+ list_item = select->data;
+ oldpage = strdup((char *) gtk_object_get_data(GTK_OBJECT(list_item), "list_item_data"));
+ type = strdup((char *) gtk_object_get_data(GTK_OBJECT(list_item), "list_item_type"));
+
+ xsane_set_sensitivity(FALSE);
+
+ rename_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ xsane_set_window_icon(rename_dialog, 0);
+
+ /* set the main vbox */
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 0);
+ gtk_container_add(GTK_CONTAINER(rename_dialog), vbox);
+ gtk_widget_show(vbox);
+
+ /* set the main hbox */
+ hbox = gtk_hbox_new(FALSE, 0);
+ xsane_separator_new(vbox, 2);
+ gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
+ gtk_widget_show(hbox);
+
+ gtk_window_set_position(GTK_WINDOW(rename_dialog), GTK_WIN_POS_CENTER);
+ gtk_window_set_resizable(GTK_WINDOW(rename_dialog), FALSE);
+ snprintf(filename, sizeof(filename), "%s %s", xsane.prog_name, WINDOW_EMAIL_RENAME);
+ gtk_window_set_title(GTK_WINDOW(rename_dialog), filename);
+ g_signal_connect(GTK_OBJECT(rename_dialog), "delete_event", (GtkSignalFunc) xsane_email_entry_rename_button_callback, (void *) -1);
+ gtk_widget_show(rename_dialog);
+
+ text = gtk_entry_new();
+ xsane_back_gtk_set_tooltip(xsane.tooltips, text, DESC_EMAIL_IMAGENAME);
+ gtk_entry_set_max_length(GTK_ENTRY(text), 64);
+ gtk_entry_set_text(GTK_ENTRY(text), oldpage);
+ gtk_widget_set_size_request(text, 300, -1);
+ gtk_box_pack_start(GTK_BOX(vbox), text, TRUE, TRUE, 4);
+ gtk_widget_show(text);
+
+
+#ifdef HAVE_GTK2
+ button = gtk_button_new_from_stock(GTK_STOCK_OK);
+#else
+ button = gtk_button_new_with_label(BUTTON_OK);
+#endif
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_entry_rename_button_callback, (void *) 1);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+#ifdef HAVE_GTK2
+ button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+#else
+ button = gtk_button_new_with_label(BUTTON_CANCEL);
+#endif
+ g_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) xsane_email_entry_rename_button_callback,(void *) -1);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+
+ xsane_email_entry_rename = 0;
+
+ while (xsane_email_entry_rename == 0)
+ {
+ while (gtk_events_pending())
+ {
+ gtk_main_iteration();
+ }
+ }
+
+ newpage = strdup(gtk_entry_get_text(GTK_ENTRY(text)));
+
+ if (xsane_email_entry_rename == 1)
+ {
+ gtk_label_set(GTK_LABEL(gtk_container_children(GTK_CONTAINER(list_item))->data), newpage);
+ gtk_object_set_data(GTK_OBJECT(list_item), "list_item_data", strdup(newpage));
+
+ xsane_convert_text_to_filename(&oldpage);
+ xsane_convert_text_to_filename(&newpage);
+ snprintf(oldfile, sizeof(oldfile), "%s/%s%s", preferences.email_project, oldpage, type);
+ snprintf(newfile, sizeof(newfile), "%s/%s%s", preferences.email_project, newpage, type);
+
+ rename(oldfile, newfile);
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_PROJECT_STATUS_CHANGED);
+ xsane_email_project_save();
+ }
+
+ free(oldpage);
+ free(newpage);
+
+ gtk_widget_destroy(rename_dialog);
+
+ xsane_set_sensitivity(TRUE);
+ }
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_entry_delete_callback(GtkWidget *widget, gpointer list)
+{
+ GtkObject *list_item;
+ GList *select;
+ char *page;
+ char *type;
+ char file[256];
+
+ DBG(DBG_proc, "xsane_email_entry_delete_callback\n");
+
+ select = GTK_LIST(list)->selection;
+ if (select)
+ {
+ list_item = GTK_OBJECT(select->data);
+ page = strdup((char *) gtk_object_get_data(list_item, "list_item_data"));
+ type = strdup((char *) gtk_object_get_data(list_item, "list_item_type"));
+ xsane_convert_text_to_filename(&page);
+ snprintf(file, sizeof(file), "%s/%s%s", preferences.email_project, page, type);
+ free(page);
+ free(type);
+ remove(file);
+ gtk_widget_destroy(GTK_WIDGET(list_item));
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_PROJECT_STATUS_CHANGED);
+ xsane_email_project_save();
+ }
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_show_callback(GtkWidget *widget, gpointer list)
+{
+ GtkObject *list_item;
+ GList *select;
+ char *page;
+ char *type;
+ char filename[256];
+
+ DBG(DBG_proc, "xsane_email_entry_show_callback\n");
+
+ select = GTK_LIST(list)->selection;
+ if (select)
+ {
+ list_item = GTK_OBJECT(select->data);
+ page = strdup((char *) gtk_object_get_data(list_item, "list_item_data"));
+ type = strdup((char *) gtk_object_get_data(list_item, "list_item_type"));
+ xsane_convert_text_to_filename(&page);
+ snprintf(filename, sizeof(filename), "%s/%s%s", preferences.email_project, page, type);
+ free(page);
+ free(type);
+
+ xsane_viewer_new(filename, NULL, FALSE, filename, VIEWER_NO_MODIFICATION, IMAGE_SAVED);
+ }
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+#if 0
+static void xsane_email_edit_callback(GtkWidget *widget, gpointer list)
+{
+ GtkObject *list_item;
+ GList *select;
+ char *page;
+ char *type;
+ char filename[256];
+ char outfilename[256];
+ Image_info image_info;
+ int cancel_save = 0;
+
+ DBG(DBG_proc, "xsane_email_entry_show_callback\n");
+
+ select = GTK_LIST(list)->selection;
+ if (select)
+ {
+ list_item = GTK_OBJECT(select->data);
+ page = strdup((char *) gtk_object_get_data(list_item, "list_item_data"));
+ type = strdup((char *) gtk_object_get_data(list_item, "list_item_type"));
+ xsane_convert_text_to_filename(&page);
+ snprintf(filename, sizeof(filename), "%s/%s%s", preferences.email_project, page, type);
+ free(page);
+ free(type);
+
+ xsane_back_gtk_make_path(sizeof(outfilename), outfilename, 0, 0, "xsane-viewer-", xsane.dev_name, ".pnm", XSANE_PATH_TMP);
+ xsane_copy_file_by_name(outfilename, filename, xsane.multipage_progress_bar, &cancel_save);
+
+ gtk_progress_set_format_string(GTK_PROGRESS(xsane.project_progress_bar), "");
+ gtk_progress_bar_update(GTK_PROGRESS_BAR(xsane.project_progress_bar), 0.0);
+
+ xsane_viewer_new(outfilename, NULL, FALSE, filename, VIEWER_NO_NAME_MODIFICATION, IMAGE_SAVED);
+ }
+}
+#endif
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_create_email(int fd)
+{
+ FILE *attachment_file;
+ FILE *projectfile;
+ char *boundary="-----partseparator";
+ char *image_filename;
+ char *email_text = NULL;
+ char *email_text_pos = NULL;
+ char **attachment_filename = NULL;
+ char *mime_type = NULL;
+ char buf[256];
+ char filename[256];
+ char content_id[256];
+ char image[256];
+ int i, j;
+ int c;
+ int attachments = 0;
+ int use_attachment = 0;
+ int email_text_size = 0;
+ int display_images_inline = FALSE;
+
+ DBG(DBG_proc, "xsane_create_email\n");
+
+ snprintf(filename, sizeof(filename), "%s/xsane-mail-list", preferences.email_project);
+ projectfile = fopen(filename, "rb"); /* read binary (b for win32) */
+
+ if ((!projectfile) || (feof(projectfile)))
+ {
+ DBG(DBG_error, "could not open email project file %s\n", filename);
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_PROJECT_STATUS_ERR_READ_PROJECT);
+ xsane.email_progress_val = 0.0;
+ xsane_front_gtk_email_project_update_lockfile_status();
+
+ return;
+ }
+
+ for (i=0; i<5; i++) /* skip 5 lines */
+ {
+ j=0;
+ c=0;
+ while ((j<255) && (c != 10) && (c != EOF)) /* first line is email status */
+ {
+ c = fgetc(projectfile);
+ j++;
+ }
+ }
+
+ if (!strcmp(preferences.email_filetype, XSANE_FILETYPE_PNG))
+ {
+ mime_type = "image/png";
+ display_images_inline = TRUE;
+ }
+ else if (!strcmp(preferences.email_filetype, XSANE_FILETYPE_JPEG))
+ {
+ mime_type = "image/jpeg";
+ display_images_inline = TRUE;
+ }
+ else if (!strcmp(preferences.email_filetype, XSANE_FILETYPE_TIFF))
+ {
+ mime_type = "image/tiff";
+ display_images_inline = TRUE;
+ }
+ else if (!strcmp(preferences.email_filetype, XSANE_FILETYPE_PDF))
+ {
+ mime_type = "doc/pdf";
+ display_images_inline = FALSE;
+ }
+ else if (!strcmp(preferences.email_filetype, XSANE_FILETYPE_PS))
+ {
+ mime_type = "doc/postscript";
+ display_images_inline = FALSE;
+ }
+ else
+ {
+ mime_type = "doc/unknown";
+ display_images_inline = FALSE;
+ }
+
+ DBG(DBG_info, "reading list of attachments:\n");
+ /* read list of attachments */
+ while (!feof(projectfile))
+ {
+ /* read next attachment line */
+ i=0;
+ c=0;
+ while ((i<255) && (c != 10) && (c != EOF))
+ {
+ c = fgetc(projectfile);
+ image[i++] = c;
+ }
+ image[i-1]=0;
+
+ if (strcmp("mailtext:", image) && (c > 1))
+ {
+ char imagename[256];
+ char *filename;
+ char *extension;
+
+ DBG(DBG_info, " - %s\n", image);
+
+ extension = strrchr(image, '.');
+ if (extension)
+ {
+ *extension = 0;
+ }
+
+ snprintf(imagename, sizeof(imagename), "%s%s", image, preferences.email_filetype);
+ filename=strdup(imagename);
+ xsane_convert_text_to_filename(&filename);
+ attachment_filename = realloc(attachment_filename, (attachments+1)*sizeof(void *));
+ attachment_filename[attachments++] = strdup(filename);
+ free(filename);
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ /* read email text */
+ while (!feof(projectfile))
+ {
+ email_text = realloc(email_text, email_text_size+1025); /* increase email_text by 1KB */
+ email_text_size += fread(email_text+email_text_size, 1, 1024, projectfile); /* read next KB */
+ }
+ DBG(DBG_info, "%d bytes emailtext read\n", email_text_size);
+
+ *(email_text + email_text_size) = 0; /* set end of text marker */
+ email_text_pos = email_text;
+
+ if (xsane.email_html_mode) /* create html email */
+ {
+ DBG(DBG_info, "sending email in html format\n");
+
+ write_email_header(fd, preferences.email_from, preferences.email_reply_to, xsane.email_receiver, xsane.email_subject, boundary, 1 /* related */);
+ write_email_mime_html(fd, boundary);
+
+ DBG(DBG_info, "sending email text\n");
+ while (*email_text_pos != 0)
+ {
+ if (!strncasecmp("<image>", email_text_pos, 7)) /* insert image */
+ {
+ email_text_pos += 6; /* <image> is 7 characters, 6 additional ones */
+
+ if (use_attachment < attachments)
+ {
+ image_filename = attachment_filename[use_attachment++];
+ DBG(DBG_info, "inserting image cid for %s\n", image_filename);
+ snprintf(content_id, sizeof(content_id), "%s", image_filename); /* content_id */
+
+ /* doc files like ps and pdf can not be displayed inline in html email */
+ if (display_images_inline)
+ {
+ snprintf(buf, sizeof(buf), "<p><img SRC=\"cid:%s\">\n", content_id);
+ }
+ write(fd, buf, strlen(buf));
+ }
+ else /* more images selected than available */
+ {
+ }
+ }
+ else if (*email_text_pos == 10) /* new line */
+ {
+ snprintf(buf, sizeof(buf), "<br>\n");
+ write(fd, buf, strlen(buf));
+ }
+ else
+ {
+ write(fd, email_text_pos, 1);
+ }
+ email_text_pos++;
+ }
+
+ while (use_attachment < attachments) /* append not already referenced images */
+ {
+ image_filename = attachment_filename[use_attachment++];
+ DBG(DBG_info, "appending image cid for %s\n", image_filename);
+ snprintf(content_id, sizeof(content_id), "%s", image_filename); /* content_id */
+
+ /* doc files like ps and pdf can not be displayed inline in html email */
+ if (display_images_inline)
+ {
+ snprintf(buf, sizeof(buf), "<p><img SRC=\"cid:%s\">\n", content_id);
+ }
+ write(fd, buf, strlen(buf));
+ }
+
+ snprintf(buf, sizeof(buf), "</html>\n");
+ write(fd, buf, strlen(buf));
+
+
+ for (i=0; i<attachments; i++)
+ {
+ image_filename = attachment_filename[i];
+ snprintf(content_id, sizeof(content_id), "%s", image_filename); /* content_id */
+ snprintf(filename, sizeof(filename), "%s/mail-%s", preferences.email_project, image_filename);
+ attachment_file = fopen(filename, "rb"); /* read, b=binary for win32 */
+
+ if (attachment_file)
+ {
+ DBG(DBG_info, "attaching file \"%s\" as \"%s\" with type %s\n", filename, image_filename, preferences.email_filetype);
+ write_email_attach_image(fd, boundary, content_id, mime_type, attachment_file, image_filename);
+
+ remove(filename);
+ }
+ else /* could not open attachment file */
+ {
+ DBG(DBG_error, "could not open attachment file \"%s\"\n", filename);
+ }
+
+ free(attachment_filename[i]);
+ }
+ free(attachment_filename);
+
+ write_email_footer(fd, boundary);
+ }
+ else /* ascii email */
+ {
+ DBG(DBG_info, "sending email in ascii format\n");
+
+ write_email_header(fd, preferences.email_from, preferences.email_reply_to, xsane.email_receiver, xsane.email_subject, boundary, 0 /* not related */);
+ write_email_mime_ascii(fd, boundary);
+
+ write(fd, email_text, strlen(email_text));
+ write(fd, "\n\n", 2);
+
+ for (i=0; i<attachments; i++)
+ {
+ image_filename = strdup(attachment_filename[i]);
+ snprintf(content_id, sizeof(content_id), "%s", image_filename); /* content_id */
+ snprintf(filename, sizeof(filename), "%s/mail-%s", preferences.email_project, image_filename);
+ attachment_file = fopen(filename, "rb"); /* read, b=binary for win32 */
+
+ if (attachment_file)
+ {
+ DBG(DBG_info, "attaching file \"%s\" as \"%s\" with type %s\n", filename, image_filename, preferences.email_filetype);
+ write_email_attach_image(fd, boundary, content_id, mime_type, attachment_file, image_filename);
+
+ remove(filename);
+ }
+ else /* could not open attachment file */
+ {
+ DBG(DBG_error, "could not oppen attachment png file \"%s\"\n", filename);
+ }
+
+ free(image_filename);
+ free(attachment_filename[i]);
+ }
+ free(attachment_filename);
+
+ write_email_footer(fd, boundary);
+ }
+
+ free(email_text);
+
+ if (projectfile)
+ {
+ fclose(projectfile);
+ }
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_send_process()
+{
+ int fd_socket;
+ int status;
+ char *password;
+ int i;
+
+ DBG(DBG_proc, "xsane_email_send_process\n");
+
+ password = strdup(preferences.email_auth_pass);
+
+ for (i=0; i<strlen(password); i++)
+ {
+ password[i] ^= 0x53;
+ }
+
+ /* pop3 authentication */
+ if (preferences.email_authentication == EMAIL_AUTH_POP3)
+ {
+ fd_socket = open_socket(preferences.email_pop3_server, preferences.email_pop3_port);
+
+ if (fd_socket < 0) /* could not open socket */
+ {
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_EMAIL_STATUS_POP3_CONNECTION_FAILED);
+ xsane.email_progress_val = 0.0;
+ xsane_front_gtk_email_project_update_lockfile_status();
+
+ free(password);
+
+ return;
+ }
+
+ status = pop3_login(fd_socket, preferences.email_auth_user, password);
+
+ close(fd_socket);
+
+ if (status == -1)
+ {
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_EMAIL_STATUS_POP3_LOGIN_FAILED);
+ xsane.email_progress_val = 0.0;
+ xsane_front_gtk_email_project_update_lockfile_status();
+
+ free(password);
+
+ return;
+ }
+
+ DBG(DBG_info, "POP3 authentication done\n");
+ }
+
+
+
+ /* smtp email */
+ fd_socket = open_socket(preferences.email_smtp_server, preferences.email_smtp_port);
+
+ if (fd_socket < 0) /* could not open socket */
+ {
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_EMAIL_STATUS_SMTP_CONNECTION_FAILED);
+ xsane.email_progress_val = 0.0;
+ xsane_front_gtk_email_project_update_lockfile_status();
+
+ free(password);
+
+ return;
+ }
+
+
+ status = write_smtp_header(fd_socket, preferences.email_from, xsane.email_receiver,
+ preferences.email_authentication, preferences.email_auth_user, password);
+ if (status == -1)
+ {
+ return;
+ }
+
+
+ xsane_create_email(fd_socket); /* create email and write to socket */
+
+ write_smtp_footer(fd_socket);
+
+ close(fd_socket);
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_EMAIL_STATUS_SENT);
+ xsane.email_progress_val = 1.0;
+ xsane_front_gtk_email_project_update_lockfile_status();
+
+ free(password);
+
+ _exit(0);
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
+static void xsane_email_send()
+{
+ pid_t pid;
+ char *image;
+ char *type;
+ GList *list = (GList *) GTK_LIST(xsane.project_list)->children;
+ GtkObject *list_item;
+ char source_filename[PATH_MAX];
+ char email_filename[PATH_MAX];
+ int output_format;
+ int cancel_save = 0;
+
+ DBG(DBG_proc, "xsane_email_send\n");
+
+ xsane_set_sensitivity(FALSE); /* do not allow changing xsane mode */
+
+ while (gtk_events_pending())
+ {
+ DBG(DBG_info, "calling gtk_main_iteration\n");
+ gtk_main_iteration();
+ }
+
+ if (xsane.email_project_save)
+ {
+ xsane.email_project_save = 0;
+ xsane_email_project_save();
+ }
+
+ xsane.email_progress_size = 0;
+ xsane.email_progress_bytes = 0;
+
+ while (list)
+ {
+ list_item = GTK_OBJECT(list->data);
+ image = strdup((char *) gtk_object_get_data(list_item, "list_item_data"));
+ type = strdup((char *) gtk_object_get_data(list_item, "list_item_type"));
+ xsane_convert_text_to_filename(&image);
+ snprintf(source_filename, sizeof(source_filename), "%s/%s%s", preferences.email_project, image, type);
+ snprintf(email_filename, sizeof(email_filename), "%s/mail-%s%s", preferences.email_project, image, preferences.email_filetype);
+ free(image);
+ free(type);
+ DBG(DBG_info, "converting %s to %s\n", source_filename, email_filename);
+ output_format = xsane_identify_output_format(email_filename, NULL, NULL);
+ xsane_save_image_as(email_filename, source_filename, output_format, xsane.project_progress_bar, &cancel_save);
+ list = list->next;
+ xsane.email_progress_size += xsane_get_filesize(email_filename);
+ }
+
+
+ if (xsane.email_status)
+ {
+ free(xsane.email_status);
+ }
+ xsane.email_status = strdup(TEXT_EMAIL_STATUS_SENDING);
+ xsane.email_progress_val = 0.0;
+ xsane_email_project_display_status(); /* display status before creating lockfile! */
+ xsane_front_gtk_email_project_update_lockfile_status(); /* create lockfile and update status */
+
+ pid = fork();
+
+ if (pid == 0) /* new process */
+ {
+ FILE *ipc_file = NULL;
+
+ if (xsane.ipc_pipefd[0])
+ {
+ close(xsane.ipc_pipefd[0]); /* close reading end of pipe */
+ ipc_file = fdopen(xsane.ipc_pipefd[1], "w");
+ }
+
+ DBG(DBG_info, "trying to change user id for new subprocess:\n");
+ DBG(DBG_info, "old effective uid = %d\n", (int) geteuid());
+ setuid(getuid());
+ DBG(DBG_info, "new effective uid = %d\n", (int) geteuid());
+
+ xsane_email_send_process();
+
+ _exit(0); /* do not use exit() here! otherwise gtk gets in trouble */
+ }
+ else /* parent process */
+ {
+ xsane_front_gtk_add_process_to_list(pid); /* add pid to child process list */
+ }
+
+ xsane_email_send_timer = gtk_timeout_add(100, (GtkFunction) xsane_email_send_timer_callback, NULL);
+ DBG(DBG_info, "enabling email send timer (%d)\n", xsane_email_send_timer);
+
+ xsane_set_sensitivity(TRUE); /* allow changing xsane mode */
+#if 0
+ gtk_widget_set_sensitive(xsane.project_entry_box, TRUE);
+ gtk_widget_set_sensitive(GTK_WIDGET(xsane.start_button), FALSE);
+ gtk_widget_set_sensitive(xsane.project_box, FALSE);
+#endif
+ xsane_email_project_set_sensitive(FALSE);
+}
+
+#endif