[libsoup/carlosgc/message-flags: 3/7] message: add convenient API to add, remove and query flags




commit 03a081c6817f1e3928e276aada2a9cb14bf23598
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Fri Nov 6 11:59:35 2020 +0100

    message: add convenient API to add, remove and query flags

 docs/reference/libsoup-3.0-sections.txt |  3 ++
 libsoup/soup-message.c                  | 62 +++++++++++++++++++++++++++++++++
 libsoup/soup-message.h                  | 12 +++++++
 tests/misc-test.c                       | 58 ++++++++++++++++++++++++++++++
 4 files changed, 135 insertions(+)
---
diff --git a/docs/reference/libsoup-3.0-sections.txt b/docs/reference/libsoup-3.0-sections.txt
index cd222b48..904e0b6c 100644
--- a/docs/reference/libsoup-3.0-sections.txt
+++ b/docs/reference/libsoup-3.0-sections.txt
@@ -38,6 +38,9 @@ soup_message_add_status_code_handler
 SoupMessageFlags
 soup_message_set_flags
 soup_message_get_flags
+soup_message_add_flags
+soup_message_remove_flags
+soup_message_query_flags
 <SUBSECTION>
 soup_message_disable_feature
 soup_message_is_feature_disabled
diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c
index f36ffaa2..04424fda 100644
--- a/libsoup/soup-message.c
+++ b/libsoup/soup-message.c
@@ -1394,6 +1394,9 @@ soup_message_set_flags (SoupMessage *msg, SoupMessageFlags flags)
        g_return_if_fail (SOUP_IS_MESSAGE (msg));
        priv = soup_message_get_instance_private (msg);
 
+       if (priv->msg_flags == flags)
+               return;
+
        priv->msg_flags = flags;
        g_object_notify (G_OBJECT (msg), "flags");
 }
@@ -1418,6 +1421,65 @@ soup_message_get_flags (SoupMessage *msg)
        return priv->msg_flags;
 }
 
+/**
+ * soup_message_add_flags:
+ * @msg: a #SoupMessage
+ * @flags: a set of #SoupMessageFlags values
+ *
+ * Adds @flags to the set of @msg's flags
+ */
+void
+soup_message_add_flags (SoupMessage     *msg,
+                       SoupMessageFlags flags)
+{
+       SoupMessagePrivate *priv;
+
+       g_return_if_fail (SOUP_IS_MESSAGE (msg));
+
+       priv = soup_message_get_instance_private (msg);
+       soup_message_set_flags (msg, priv->msg_flags | flags);
+}
+
+/**
+ * soup_message_query_flags:
+ * @msg: a #SoupMessage
+ * @flags: a set of #SoupMessageFlags values
+ *
+ * Queries if @flags are present in the set of @msg's flags
+ *
+ * Returns: %TRUE if @flags are enabled in @msg
+ */
+gboolean
+soup_message_query_flags (SoupMessage     *msg,
+                         SoupMessageFlags flags)
+{
+        SoupMessagePrivate *priv;
+
+        g_return_val_if_fail (SOUP_IS_MESSAGE (msg), FALSE);
+
+        priv = soup_message_get_instance_private (msg);
+       return priv->msg_flags & flags;
+}
+
+/**
+ * soup_message_remove_flags:
+ * @msg: a #SoupMessage
+ * @flags: a set of #SoupMessageFlags values
+ *
+ * Removes @flags from the set of @msg's flags
+ */
+void
+soup_message_remove_flags (SoupMessage     *msg,
+                          SoupMessageFlags flags)
+{
+        SoupMessagePrivate *priv;
+
+        g_return_if_fail (SOUP_IS_MESSAGE (msg));
+
+        priv = soup_message_get_instance_private (msg);
+       soup_message_set_flags (msg, priv->msg_flags & ~flags);
+}
+
 /**
  * soup_message_set_http_version:
  * @msg: a #SoupMessage
diff --git a/libsoup/soup-message.h b/libsoup/soup-message.h
index cdb1d014..4b12478d 100644
--- a/libsoup/soup-message.h
+++ b/libsoup/soup-message.h
@@ -90,6 +90,18 @@ void             soup_message_set_flags           (SoupMessage           *msg,
 SOUP_AVAILABLE_IN_2_4
 SoupMessageFlags soup_message_get_flags           (SoupMessage           *msg);
 
+SOUP_AVAILABLE_IN_ALL
+void             soup_message_add_flags           (SoupMessage           *msg,
+                                                  SoupMessageFlags       flags);
+
+SOUP_AVAILABLE_IN_ALL
+void             soup_message_remove_flags        (SoupMessage           *msg,
+                                                  SoupMessageFlags       flags);
+
+SOUP_AVAILABLE_IN_ALL
+gboolean         soup_message_query_flags         (SoupMessage           *msg,
+                                                   SoupMessageFlags       flags);
+
 SOUP_AVAILABLE_IN_ALL
 GTlsCertificate     *soup_message_get_tls_certificate        (SoupMessage *msg);
 
diff --git a/tests/misc-test.c b/tests/misc-test.c
index 038cdbbc..53249c1d 100644
--- a/tests/misc-test.c
+++ b/tests/misc-test.c
@@ -656,6 +656,63 @@ do_aliases_test (void)
        soup_test_session_abort_unref (session);
 }
 
+static void
+do_msg_flags_test (void)
+{
+       SoupMessage *msg;
+
+       msg = soup_message_new ("GET", "http://foo.org";);
+
+       /* Flags are initially empty */
+       g_assert_cmpuint (soup_message_get_flags (msg), ==, 0);
+       g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT));
+
+       /* Set a single flag */
+       soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
+       g_assert_cmpuint (soup_message_get_flags (msg), ==, SOUP_MESSAGE_NO_REDIRECT);
+       g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT));
+       g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NEW_CONNECTION));
+
+       /* Add another flag */
+       soup_message_add_flags (msg, SOUP_MESSAGE_NEW_CONNECTION);
+       g_assert_cmpuint (soup_message_get_flags (msg), ==, (SOUP_MESSAGE_NO_REDIRECT | 
SOUP_MESSAGE_NEW_CONNECTION));
+       g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT | 
SOUP_MESSAGE_NEW_CONNECTION));
+
+       /* Add an existing flag */
+       soup_message_add_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
+       g_assert_cmpuint (soup_message_get_flags (msg), ==, (SOUP_MESSAGE_NO_REDIRECT | 
SOUP_MESSAGE_NEW_CONNECTION));
+        g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT | 
SOUP_MESSAGE_NEW_CONNECTION));
+
+       /* Remove a single flag */
+       soup_message_remove_flags (msg, SOUP_MESSAGE_NEW_CONNECTION);
+       g_assert_cmpuint (soup_message_get_flags (msg), ==, SOUP_MESSAGE_NO_REDIRECT);
+        g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT));
+        g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NEW_CONNECTION));
+
+       /* Remove a non-existing flag */
+       soup_message_remove_flags (msg, SOUP_MESSAGE_NEW_CONNECTION);
+       g_assert_cmpuint (soup_message_get_flags (msg), ==, SOUP_MESSAGE_NO_REDIRECT);
+        g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT));
+        g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NEW_CONNECTION));
+
+       /* Add a set of flags */
+       soup_message_add_flags (msg, SOUP_MESSAGE_NEW_CONNECTION | SOUP_MESSAGE_IDEMPOTENT | 
SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE);
+       g_assert_cmpuint (soup_message_get_flags (msg), ==, (SOUP_MESSAGE_NO_REDIRECT | 
SOUP_MESSAGE_NEW_CONNECTION | SOUP_MESSAGE_IDEMPOTENT | SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+       g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_NEW_CONNECTION 
| SOUP_MESSAGE_IDEMPOTENT | SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+
+       /* Remove a set of flags */
+       soup_message_remove_flags (msg, (SOUP_MESSAGE_NO_REDIRECT | SOUP_MESSAGE_IDEMPOTENT));
+       g_assert_cmpuint (soup_message_get_flags (msg), ==, (SOUP_MESSAGE_NEW_CONNECTION | 
SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+       g_assert_true (soup_message_query_flags (msg, SOUP_MESSAGE_NEW_CONNECTION | 
SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+
+       /* Remove all flags */
+       soup_message_set_flags (msg, 0);
+       g_assert_cmpuint (soup_message_get_flags (msg), ==, 0);
+        g_assert_false (soup_message_query_flags (msg, SOUP_MESSAGE_NO_REDIRECT | 
SOUP_MESSAGE_NEW_CONNECTION | SOUP_MESSAGE_IDEMPOTENT | SOUP_MESSAGE_DO_NOT_USE_AUTH_CACHE));
+
+       g_object_unref (msg);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -693,6 +750,7 @@ main (int argc, char **argv)
        g_test_add_func ("/misc/cancel-while-reading/req/delayed", do_cancel_while_reading_delayed_req_test);
        g_test_add_func ("/misc/cancel-while-reading/req/preemptive", 
do_cancel_while_reading_preemptive_req_test);
        g_test_add_func ("/misc/aliases", do_aliases_test);
+       g_test_add_func ("/misc/msg-flags", do_msg_flags_test);
 
        ret = g_test_run ();
 


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