[evolution-data-server/wip/mcrha/soup3] Add e_soup_session_util_get_message_request_body()



commit a01b196ce8bf4f185298c128a2e4b5cc0fe514ba
Author: Milan Crha <mcrha redhat com>
Date:   Wed Dec 8 18:24:33 2021 +0100

    Add e_soup_session_util_get_message_request_body()
    
    Required for evolution-ews

 src/libedataserver/e-soup-session.c | 64 +++++++++++++++++++++++++++++++------
 src/libedataserver/e-soup-session.h |  5 ++-
 2 files changed, 59 insertions(+), 10 deletions(-)
---
diff --git a/src/libedataserver/e-soup-session.c b/src/libedataserver/e-soup-session.c
index 786abb00f..bf277d8da 100644
--- a/src/libedataserver/e-soup-session.c
+++ b/src/libedataserver/e-soup-session.c
@@ -1309,8 +1309,7 @@ message_data_new (GInputStream *input_stream,
 }
 
 static void
-message_data_free (gpointer ptr,
-                  GClosure *closure)
+message_data_free (gpointer ptr)
 {
        MessageData *md = ptr;
 
@@ -1324,14 +1323,18 @@ static void
 e_soup_session_message_restarted_cb (SoupMessage *message,
                                     gpointer user_data)
 {
-       MessageData *md = user_data;
+       GInputStream *input_stream;
+       gssize length = 0;
 
-       if (G_IS_SEEKABLE (md->input_stream) && md->read_from != g_seekable_tell (G_SEEKABLE 
(md->input_stream)))
-               g_seekable_seek (G_SEEKABLE (md->input_stream), md->read_from, G_SEEK_SET, NULL, NULL);
+       input_stream = e_soup_session_util_get_message_request_body (message, &length);
+
+       g_return_if_fail (input_stream != NULL);
 
-       soup_message_set_request_body (message, NULL, md->input_stream, md->length);
+       soup_message_set_request_body (message, NULL, input_stream, length);
 }
 
+#define MESSAGE_DATA_KEY "ESoupSession::message-data"
+
 /**
  * e_soup_session_util_set_message_request_body:
  * @message: a #SoupMessage
@@ -1360,8 +1363,10 @@ e_soup_session_util_set_message_request_body (SoupMessage *message,
 
        md = message_data_new (input_stream, length);
 
-       g_signal_connect_data (message, "restarted",
-               G_CALLBACK (e_soup_session_message_restarted_cb), md, message_data_free, 0);
+       g_object_set_data_full (G_OBJECT (message), MESSAGE_DATA_KEY, md, message_data_free);
+
+       g_signal_connect (message, "restarted",
+               G_CALLBACK (e_soup_session_message_restarted_cb), NULL);
 
        soup_message_set_request_body (message, content_type, input_stream, length);
 }
@@ -1388,7 +1393,7 @@ e_soup_session_util_set_message_request_body_from_data (SoupMessage *message,
                                                        gboolean create_copy,
                                                        const gchar *content_type,
                                                        gconstpointer data,
-                                                       gsize length,
+                                                       gssize length,
                                                        GDestroyNotify free_func)
 {
        GInputStream *input_stream;
@@ -1407,3 +1412,44 @@ e_soup_session_util_set_message_request_body_from_data (SoupMessage *message,
 
        g_object_unref (input_stream);
 }
+
+/**
+ * e_soup_session_util_get_message_request_body:
+ * @message: a #SoupMessage
+ * @out_length: (out): length of the input stream
+ *
+ * Returns referenced request data for the @message, as being previously
+ * set by the e_soup_session_util_set_message_request_body() or
+ * e_soup_session_util_set_message_request_body_from_data().
+ *
+ * Do not call this function while the @message is queued in
+ * a #SoupSession, nor modify the input stream position until
+ * the @message lefts the #SoupSession.
+ *
+ * Returns: (nullable) (transfer none): a #GInputStream with the request body
+ *    being previously set, on %NULL. The @out_length is set to the length
+ *    of the returned input stream.
+ *
+ * Since: 3.44
+ **/
+GInputStream *
+e_soup_session_util_get_message_request_body (SoupMessage *message,
+                                             gssize *out_length)
+{
+       MessageData *md;
+
+       g_return_val_if_fail (SOUP_IS_MESSAGE (message), NULL);
+       g_return_val_if_fail (out_length != NULL, NULL);
+
+       md = g_object_get_data (G_OBJECT (message), MESSAGE_DATA_KEY);
+
+       if (!md || !md->input_stream)
+               return NULL;
+
+       if (G_IS_SEEKABLE (md->input_stream) && md->read_from != g_seekable_tell (G_SEEKABLE 
(md->input_stream)))
+               g_seekable_seek (G_SEEKABLE (md->input_stream), md->read_from, G_SEEK_SET, NULL, NULL);
+
+       *out_length = md->length;
+
+       return md->input_stream;
+}
diff --git a/src/libedataserver/e-soup-session.h b/src/libedataserver/e-soup-session.h
index 716d80202..ad8d3da84 100644
--- a/src/libedataserver/e-soup-session.h
+++ b/src/libedataserver/e-soup-session.h
@@ -129,8 +129,11 @@ void               e_soup_session_util_set_message_request_body_from_data
                                                         gboolean create_copy,
                                                         const gchar *content_type,
                                                         gconstpointer data,
-                                                        gsize length,
+                                                        gssize length,
                                                         GDestroyNotify free_func);
+GInputStream * e_soup_session_util_get_message_request_body
+                                                       (SoupMessage *message,
+                                                        gssize *out_length);
 G_END_DECLS
 
 #endif /* E_SOUP_SESSION_H */


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