+ /* send main part */
+ SEND_EXIT_IF_ERROR(send_message_data(dialog, smtp_sock, fp, size) == 0,
+ "sending data");
+
+ progress_dialog_set_label(dialog->dialog, _("Quitting..."));
+ GTK_EVENTS_FLUSH();
+
+ SEND_EXIT_IF_NOTOK(smtp_eom(smtp_sock), "terminating data");
+ SEND_EXIT_IF_NOTOK(smtp_quit(smtp_sock), "sending QUIT");
+
+ sock_close(smtp_sock);
+ send_progress_dialog_destroy(dialog);
+
+ return 0;
+}
+
+#undef EXIT_IF_CANCELLED
+#undef SEND_EXIT_IF_ERROR
+#undef SEND_EXIT_IF_NOTOK
+
+#define EXIT_IF_CANCELLED() \
+{ \
+ if (dialog->cancelled) return -1; \
+}
+
+#define SEND_EXIT_IF_ERROR(f) \
+{ \
+ EXIT_IF_CANCELLED(); \
+ if ((f) <= 0) return -1; \
+}
+
+#define SEND_DIALOG_UPDATE() \
+{ \
+ gettimeofday(&tv_cur, NULL); \
+ if (tv_cur.tv_sec - tv_prev.tv_sec > 0 || \
+ tv_cur.tv_usec - tv_prev.tv_usec > UI_REFRESH_INTERVAL) { \
+ g_snprintf(str, sizeof(str), \
+ _("Sending message (%d / %d bytes)"), \
+ bytes, size); \
+ progress_dialog_set_label(dialog->dialog, str); \
+ progress_dialog_set_percentage \
+ (dialog->dialog, (gfloat)bytes / (gfloat)size); \
+ GTK_EVENTS_FLUSH(); \
+ gettimeofday(&tv_prev, NULL); \
+ } \
+}
+
+static gint send_message_data(SendProgressDialog *dialog, SockInfo *sock,
+ FILE *fp, gint size)
+{
+ gchar buf[BUFFSIZE];
+ gchar str[BUFFSIZE];
+ gint bytes = 0;
+ struct timeval tv_prev, tv_cur;
+