[balsa/64-save-empty-attachment] body: implement libbalsa_message_body_is_empty()




commit e0e90fd281e3ccdc8d01ca1ded1532e1cf40e31d
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Mon Jan 17 17:20:48 2022 -0500

    body: implement libbalsa_message_body_is_empty()
    
    balsa-mime-widget-callbacks: Warn about empty part
    
    Do not try to save an empty attachment.

 libbalsa/body.c                   | 31 +++++++++++++++++++++++++++++++
 libbalsa/body.h                   |  2 ++
 src/balsa-mime-widget-callbacks.c | 21 +++++++++++++++++++++
 3 files changed, 54 insertions(+)
---
diff --git a/libbalsa/body.c b/libbalsa/body.c
index d2c732305..e4b23c26e 100644
--- a/libbalsa/body.c
+++ b/libbalsa/body.c
@@ -779,6 +779,37 @@ libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
     return len >= 0;
 }
 
+/*
+ * libbalsa_message_body_is_empty
+ *
+ * The returned value is meaningless if an error occurred, in which case
+ * the GError is set.
+ */
+gboolean
+libbalsa_message_body_is_empty(LibBalsaMessageBody * body, GError **err)
+{
+    GMimeStream *body_stream;
+    gboolean is_empty = TRUE;
+
+    g_return_val_if_fail(body != NULL, is_empty);
+
+    body_stream = libbalsa_message_body_get_stream(body, err);
+    if (body_stream != NULL) {
+        gint64 len;
+
+        len = g_mime_stream_length(body_stream);
+        if (len < 0) {
+            char buf[1];
+
+            len = g_mime_stream_read(body_stream, buf, 1);
+        }
+        is_empty = (len == 0);
+        g_object_unref(body_stream);
+    }
+
+    return is_empty;
+}
+
 gchar *
 libbalsa_message_body_get_mime_type(LibBalsaMessageBody * body)
 {
diff --git a/libbalsa/body.h b/libbalsa/body.h
index 08098aa28..dac3c206a 100644
--- a/libbalsa/body.h
+++ b/libbalsa/body.h
@@ -107,6 +107,8 @@ gboolean libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
                                            GMimeStream * dest,
                                            gboolean filter_crlf,
                                            GError **err);
+gboolean libbalsa_message_body_is_empty(LibBalsaMessageBody * body,
+                                        GError **err);
 gboolean libbalsa_message_body_save(LibBalsaMessageBody * body,
                                     const gchar * filename, mode_t mode,
                                     gboolean filter_crlf, GError **err);
diff --git a/src/balsa-mime-widget-callbacks.c b/src/balsa-mime-widget-callbacks.c
index 895e5a844..5ef2d1903 100644
--- a/src/balsa-mime-widget-callbacks.c
+++ b/src/balsa-mime-widget-callbacks.c
@@ -67,6 +67,7 @@ balsa_mime_widget_ctx_menu_save(GtkWidget * parent_widget,
                                LibBalsaMessageBody * mime_body)
 {
     gchar *cont_type, *title;
+    gboolean is_empty;
     GtkWidget *save_dialog;
     gchar *file_uri;
     LibbalsaVfs *save_file;
@@ -76,6 +77,26 @@ balsa_mime_widget_ctx_menu_save(GtkWidget * parent_widget,
     g_return_if_fail(mime_body != NULL);
 
     cont_type = libbalsa_message_body_get_mime_type(mime_body);
+
+    is_empty = libbalsa_message_body_is_empty(mime_body, &err);
+
+    if (err != NULL) {
+        balsa_information(LIBBALSA_INFORMATION_ERROR,
+                          _("Could not access %s MIME Part: %s"), cont_type, err->message);
+        g_error_free(err);
+        g_free(cont_type);
+
+        return;
+    }
+
+    if (is_empty) {
+        balsa_information(LIBBALSA_INFORMATION_WARNING,
+                          _("Empty %s MIME Part was not saved"), cont_type);
+        g_free(cont_type);
+
+        return;
+    }
+
     title = g_strdup_printf(_("Save %s MIME Part"), cont_type);
 
     save_dialog =


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]