[libsoup/content-sniffing] Make parameters a signal argument



commit 90f62bfb8fa00bf04aa38c2fbe60e08aaf7c6a30
Author: Gustavo Noronha Silva <gns gnome org>
Date:   Tue Jun 23 22:30:53 2009 -0300

    Make parameters a signal argument
    
    Instead of sending the full header as a string in the signal, send
    only the type, and a hash table with the parameters, matching the
    get/set_content_type() APIs.

 libsoup/soup-content-sniffer.c |   23 ++++++++++++-----------
 libsoup/soup-content-sniffer.h |    6 ++++--
 libsoup/soup-marshal.list      |    2 +-
 libsoup/soup-message-io.c      |    9 ++++++---
 libsoup/soup-message.c         |   13 ++++++++-----
 libsoup/soup-message.h         |    2 +-
 tests/sniffing-test.c          |    4 ++--
 7 files changed, 34 insertions(+), 25 deletions(-)
---
diff --git a/libsoup/soup-content-sniffer.c b/libsoup/soup-content-sniffer.c
index e87f470..0525406 100644
--- a/libsoup/soup-content-sniffer.c
+++ b/libsoup/soup-content-sniffer.c
@@ -33,7 +33,7 @@
  * Since: 2.27.3
  **/
 
-static char *sniff (SoupContentSniffer *sniffer, SoupMessage *msg, SoupBuffer *buffer);
+static char *sniff (SoupContentSniffer *sniffer, SoupMessage *msg, SoupBuffer *buffer, GHashTable **params);
 static gsize get_buffer_size (SoupContentSniffer *sniffer);
 
 static void soup_content_sniffer_session_feature_init (SoupSessionFeatureInterface *feature_interface, gpointer interface_data);
@@ -82,13 +82,14 @@ soup_content_sniffer_new ()
 
 char *
 soup_content_sniffer_sniff (SoupContentSniffer *sniffer,
-			    SoupMessage *msg, SoupBuffer *buffer)
+			    SoupMessage *msg, SoupBuffer *buffer,
+			    GHashTable **params)
 {
 	g_return_val_if_fail (SOUP_IS_CONTENT_SNIFFER (sniffer), NULL);
 	g_return_val_if_fail (SOUP_IS_MESSAGE (msg), NULL);
 	g_return_val_if_fail (buffer != NULL, NULL);
 
-	return SOUP_CONTENT_SNIFFER_GET_CLASS (sniffer)->sniff (sniffer, msg, buffer);
+	return SOUP_CONTENT_SNIFFER_GET_CLASS (sniffer)->sniff (sniffer, msg, buffer, params);
 }
 
 /* This table is based on the HTML5 spec;
@@ -349,7 +350,7 @@ sniff_unknown (SoupContentSniffer *sniffer, SoupMessage *msg,
 /* HTML5: 2.7.3 Content-Type sniffing: text or binary */
 static char*
 sniff_text_or_binary (SoupContentSniffer *sniffer, SoupMessage *msg,
-		      SoupBuffer *buffer, const char *official_type)
+		      SoupBuffer *buffer)
 {
 	const char *resource = buffer->data;
 	int resource_length = MIN (512, buffer->length);
@@ -361,7 +362,7 @@ sniff_text_or_binary (SoupContentSniffer *sniffer, SoupMessage *msg,
 		if ((resource[0] == 0xFE && resource[1] == 0xFF) ||
 		    (resource[0] == 0xFF && resource[1] == 0xFE) ||
 		    (resource[0] == 0xEF && resource[1] == 0xBB && resource[2] == 0xBF))
-			return g_strdup (official_type);
+			return g_strdup ("text/plain");
 	}
 
 	/* Look to see if any of the first n bytes looks binary */
@@ -373,7 +374,7 @@ sniff_text_or_binary (SoupContentSniffer *sniffer, SoupMessage *msg,
 	}
 
 	if (!looks_binary)
-		return g_strdup (official_type);
+		return g_strdup ("text/plain");
 
 	return sniff_unknown (sniffer, msg, buffer, TRUE);
 }
@@ -406,12 +407,12 @@ sniff_images (SoupContentSniffer *sniffer, SoupMessage *msg,
 }
 
 static char*
-sniff (SoupContentSniffer *sniffer, SoupMessage *msg, SoupBuffer *buffer)
+sniff (SoupContentSniffer *sniffer, SoupMessage *msg, SoupBuffer *buffer, GHashTable **params)
 {
 	const char *content_type_with_params;
 	const char *content_type;
 
-	content_type = soup_message_headers_get_content_type (msg->response_headers, NULL);
+	content_type = soup_message_headers_get_content_type (msg->response_headers, params);
 	content_type_with_params = soup_message_headers_get_one (msg->response_headers, "Content-Type");
 
 
@@ -425,7 +426,7 @@ sniff (SoupContentSniffer *sniffer, SoupMessage *msg, SoupBuffer *buffer)
 	if (g_str_has_suffix (content_type, "+xml") ||
 	    !g_ascii_strcasecmp (content_type, "text/xml") ||
 	    !g_ascii_strcasecmp (content_type, "application/xml"))
-		return g_strdup (content_type_with_params);
+		return g_strdup (content_type);
 
 	/* 2.7.5 Content-Type sniffing: image
 	 * The spec says:
@@ -445,10 +446,10 @@ sniff (SoupContentSniffer *sniffer, SoupMessage *msg, SoupBuffer *buffer)
 	    g_str_equal (content_type_with_params, "text/plain; charset=ISO-8859-1") ||
 	    g_str_equal (content_type_with_params, "text/plain; charset=iso-8859-1") ||
 	    g_str_equal (content_type_with_params, "text/plain; charset=UTF-8")) {
-		return sniff_text_or_binary (sniffer, msg, buffer, content_type_with_params);
+		return sniff_text_or_binary (sniffer, msg, buffer);
 	}
 
-	return g_strdup (content_type_with_params);
+	return g_strdup (content_type);
 }
 
 static gsize
diff --git a/libsoup/soup-content-sniffer.h b/libsoup/soup-content-sniffer.h
index bfcc2e8..a8aa915 100644
--- a/libsoup/soup-content-sniffer.h
+++ b/libsoup/soup-content-sniffer.h
@@ -31,7 +31,8 @@ typedef struct {
 
 	char* (*sniff)              (SoupContentSniffer *sniffer,
 				     SoupMessage *msg,
-				     SoupBuffer *buffer);
+				     SoupBuffer *buffer,
+				     GHashTable **params);
 	gsize (*get_buffer_size)    (SoupContentSniffer *sniffer);
 
 	/* Padding for future expansion */
@@ -48,7 +49,8 @@ SoupContentSniffer *soup_content_sniffer_new      (void);
 
 char               *soup_content_sniffer_sniff    (SoupContentSniffer *sniffer,
 						   SoupMessage *msg,
-						   SoupBuffer *buffer);
+						   SoupBuffer *buffer,
+						   GHashTable **params);
 
 G_END_DECLS
 
diff --git a/libsoup/soup-marshal.list b/libsoup/soup-marshal.list
index 785fd6f..d0c53ef 100644
--- a/libsoup/soup-marshal.list
+++ b/libsoup/soup-marshal.list
@@ -6,4 +6,4 @@ NONE:OBJECT,OBJECT
 NONE:OBJECT,POINTER
 NONE:BOXED,BOXED
 NONE:OBJECT,OBJECT,BOOLEAN
-NONE:STRING
+NONE:STRING,BOXED
diff --git a/libsoup/soup-message-io.c b/libsoup/soup-message-io.c
index 6ae072e..45031f3 100644
--- a/libsoup/soup-message-io.c
+++ b/libsoup/soup-message-io.c
@@ -223,13 +223,16 @@ io_sniff_content (SoupMessage *msg)
 	SoupMessageIOData *io = priv->io_data;
 	SoupBuffer *sniffed_buffer = soup_message_body_flatten (io->delayed_chunk_data);
 	char *sniffed_mime_type;
+	GHashTable *params;
 
 	io->delay_got_chunks = FALSE;
 
-	sniffed_mime_type = soup_content_sniffer_sniff (priv->sniffer, msg, sniffed_buffer);
+	sniffed_mime_type = soup_content_sniffer_sniff (priv->sniffer, msg, sniffed_buffer, &params);
 	SOUP_MESSAGE_IO_PREPARE_FOR_CALLBACK;
-	soup_message_content_sniffed (msg, sniffed_mime_type);
+	soup_message_content_sniffed (msg, sniffed_mime_type, params);
 	g_free (sniffed_mime_type);
+	if (params)
+		g_hash_table_destroy (params);
 	SOUP_MESSAGE_IO_RETURN_VAL_IF_CANCELLED_OR_PAUSED (FALSE);
 
 	SOUP_MESSAGE_IO_PREPARE_FOR_CALLBACK;
@@ -340,7 +343,7 @@ read_body_chunk (SoupMessage *msg)
 		if (priv->should_sniff_content)
 			io->delay_got_chunks = TRUE;
 		else if (priv->sniffer)
-			soup_message_content_sniffed (msg, NULL);
+			soup_message_content_sniffed (msg, NULL, NULL);
 		io->acked_content_sniff_decision = TRUE;
 	}
 
diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c
index cc3a5d7..f614946 100644
--- a/libsoup/soup-message.c
+++ b/libsoup/soup-message.c
@@ -406,6 +406,7 @@ soup_message_class_init (SoupMessageClass *message_class)
 	 * SoupMessage::content-sniffed:
 	 * @msg: the message
 	 * @type: the content type that we got from sniffing
+	 * @params: a #GHashTable with the parameters
 	 *
 	 * This signal is emitted after %got-headers, and before the
 	 * first %got-chunk. If content sniffing is disabled, or no
@@ -434,9 +435,10 @@ soup_message_class_init (SoupMessageClass *message_class)
 			      G_SIGNAL_RUN_FIRST,
 			      0,
 			      NULL, NULL,
-			      soup_marshal_NONE__STRING,
-			      G_TYPE_NONE, 1,
-			      G_TYPE_STRING);
+			      soup_marshal_NONE__STRING_BOXED,
+			      G_TYPE_NONE, 2,
+			      G_TYPE_STRING,
+			      G_TYPE_HASH_TABLE);
 
 	/**
 	 * SoupMessage::restarted:
@@ -899,6 +901,7 @@ soup_message_got_body (SoupMessage *msg)
  * soup_message_content_sniffed:
  * @msg: a #SoupMessage
  * @type: a string with the sniffed content type
+ * @params: a #GHashTable with the parameters
  *
  * Emits the %content_sniffed signal, indicating that the IO layer
  * finished sniffing the content type for @msg. If content sniffing
@@ -907,9 +910,9 @@ soup_message_got_body (SoupMessage *msg)
  * after %got_headers, with %NULL as @content_type.
  **/
 void
-soup_message_content_sniffed (SoupMessage *msg, const char *content_type)
+soup_message_content_sniffed (SoupMessage *msg, const char *content_type, GHashTable *params)
 {
-	g_signal_emit (msg, signals[CONTENT_SNIFFED], 0, content_type);
+	g_signal_emit (msg, signals[CONTENT_SNIFFED], 0, content_type, params);
 }
 
 static void
diff --git a/libsoup/soup-message.h b/libsoup/soup-message.h
index 4a51466..b940ac6 100644
--- a/libsoup/soup-message.h
+++ b/libsoup/soup-message.h
@@ -155,7 +155,7 @@ void soup_message_got_informational   (SoupMessage *msg);
 void soup_message_got_headers         (SoupMessage *msg);
 void soup_message_got_chunk           (SoupMessage *msg, SoupBuffer *chunk);
 void soup_message_got_body            (SoupMessage *msg);
-void soup_message_content_sniffed     (SoupMessage *msg, const char *content_type);
+void soup_message_content_sniffed     (SoupMessage *msg, const char *content_type, GHashTable *params);
 void soup_message_restarted           (SoupMessage *msg);
 void soup_message_finished            (SoupMessage *msg);
 
diff --git a/tests/sniffing-test.c b/tests/sniffing-test.c
index 9cc960e..d79c5b5 100644
--- a/tests/sniffing-test.c
+++ b/tests/sniffing-test.c
@@ -172,7 +172,7 @@ unpause_msg (gpointer data)
 
 
 static void
-content_sniffed (SoupMessage *msg, char *content_type, gpointer data)
+content_sniffed (SoupMessage *msg, char *content_type, GHashTable *params, gpointer data)
 {
 	gboolean should_pause = GPOINTER_TO_INT (data);
 
@@ -304,7 +304,7 @@ do_signals_test (gboolean should_content_sniff,
 }
 
 static void
-sniffing_content_sniffed (SoupMessage *msg, char *content_type, gpointer data)
+sniffing_content_sniffed (SoupMessage *msg, char *content_type, GHashTable *params, gpointer data)
 {
 	char *expected_type = (char*)data;
 



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