curlsmtpsink: add final boundary to all multipart emails
authorBranko Subasic <branko@axis.com>
Mon, 15 Dec 2014 15:27:16 +0000 (16:27 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Fri, 19 Dec 2014 13:16:43 +0000 (13:16 +0000)
Corrected the final boundary mechanism so that a final boundary is
added to each mail with multipart content that is sent,
not just to the last one.

https://bugzilla.gnome.org/show_bug.cgi?id=741553

ext/curl/gstcurlsmtpsink.c
ext/curl/gstcurlsmtpsink.h

index f8be5d06a2920e89fea3ada3d3c3c787a329b175..7de1ddfb1b4d72291a03a696d30e09f203aecf5f 100644 (file)
@@ -204,17 +204,17 @@ gst_curl_smtp_sink_event (GstBaseSink * bsink, GstEvent * event)
       sink->eos = TRUE;
       GST_OBJECT_UNLOCK (sink);
 
-      if (sink->base64_chunk != NULL)
+      if (sink->base64_chunk != NULL && !sink->final_boundary_added) {
         add_final_boundary_unlocked (sink);
 
-      gst_curl_base_sink_transfer_thread_notify_unlocked (bcsink);
+        gst_curl_base_sink_transfer_thread_notify_unlocked (bcsink);
 
-      GST_OBJECT_LOCK (sink);
-      if (sink->base64_chunk != NULL && bcsink->flow_ret == GST_FLOW_OK) {
-        gst_curl_smtp_sink_wait_for_transfer_end_unlocked (sink);
+        GST_OBJECT_LOCK (sink);
+        if (sink->base64_chunk != NULL && bcsink->flow_ret == GST_FLOW_OK) {
+          gst_curl_smtp_sink_wait_for_transfer_end_unlocked (sink);
+        }
+        GST_OBJECT_UNLOCK (sink);
       }
-      GST_OBJECT_UNLOCK (sink);
-
       gst_curl_base_sink_transfer_thread_close (bcsink);
 
       break;
@@ -433,7 +433,7 @@ gst_curl_smtp_sink_set_property (GObject * object, guint prop_id,
         break;
       case PROP_NBR_ATTACHMENTS:
         sink->nbr_attachments = g_value_get_int (value);
-        sink->nbr_attachments_left = sink->nbr_attachments;
+        sink->curr_attachment = 1;
         GST_DEBUG_OBJECT (sink, "nbr-attachments set to %d",
             sink->nbr_attachments);
         break;
@@ -773,18 +773,19 @@ gst_curl_smtp_sink_flush_data_unlocked (GstCurlBaseSink * bcsink,
   gchar *data_out;
 
   GST_DEBUG
-      ("live: %d, num attachments: %d, num attachments_left: %d, eos: %d, "
-      "close_transfer: %d, final boundary: %d, array_len: %d", bcsink->is_live,
-      sink->nbr_attachments, sink->nbr_attachments_left, sink->eos,
-      close_transfer, sink->final_boundary_added, array->len);
+      ("live: %d, num attachments: %d, curr_attachment: %d, "
+      "eos: %d, close_transfer: %d, final boundary: %d, array_len: %d",
+      bcsink->is_live, sink->nbr_attachments, sink->curr_attachment,
+      sink->eos, close_transfer, sink->final_boundary_added, array->len);
 
 
-  if ((bcsink->is_live && (sink->nbr_attachments_left == sink->nbr_attachments))
+  if ((bcsink->is_live && (sink->curr_attachment == sink->nbr_attachments))
       || (sink->nbr_attachments == 1) || sink->eos
       || sink->final_boundary_added) {
     bcsink->is_live = FALSE;
     sink->reset_transfer_options = TRUE;
     sink->final_boundary_added = FALSE;
+    sink->curr_attachment = 1;
 
     GST_DEBUG ("returning 0, no more data to send in this transfer");
 
@@ -806,12 +807,8 @@ gst_curl_smtp_sink_flush_data_unlocked (GstCurlBaseSink * bcsink,
   g_free (data_out);
 
   if (new_file) {
-    sink->nbr_attachments_left--;
-
+    sink->curr_attachment++;
     bcsink->is_live = TRUE;
-    if (sink->nbr_attachments_left <= 1) {
-      sink->nbr_attachments_left = sink->nbr_attachments;
-    }
 
     /* reset flag */
     bcsink->new_file = FALSE;
@@ -925,14 +922,20 @@ gst_curl_smtp_sink_transfer_data_buffer (GstCurlBaseSink * bcsink,
   }
 
   if (sink->base64_chunk != NULL) {
-    if (sink->nbr_attachments_left == sink->nbr_attachments
-        && bcsink->is_live && bcsink->transfer_buf->len == 0) {
-      add_final_boundary_unlocked (sink);
-    }
     bytes_to_send =
         transfer_chunk (curl_ptr, bcsink->transfer_buf, sink->base64_chunk,
         block_size, last_chunk);
 
+    /* if last chunk of current buffer and max attachments per mail is reached
+     * then add final boundary */
+    if (*last_chunk && sink->curr_attachment == sink->nbr_attachments &&
+        !sink->final_boundary_added) {
+      add_final_boundary_unlocked (sink);
+      /* now that we've added the final boundary to the array we have on more
+       * chunk to send */
+      *last_chunk = 0;
+    }
+
     GST_OBJECT_LOCK (sink);
     if (sink->eos) {
       gst_curl_smtp_sink_notify_transfer_end_unlocked (sink);
index 94c33498fd53de9e0b9084f8fb009a8aa5e8d6fd..71c40e585b99800ad7e9f647fc8477cb9827311e 100644 (file)
@@ -71,7 +71,7 @@ struct _GstCurlSmtpSink
   gboolean transfer_end;
   GCond cond_transfer_end;
 
-  gint nbr_attachments_left;
+  gint curr_attachment;
   gboolean reset_transfer_options;
   gboolean final_boundary_added;
   gboolean eos;