[libsoup/content-sniffing] Make parameters a signal argument
- From: Gustavo Noronha Silva <gns src gnome org>
- To: svn-commits-list gnome org
- Subject: [libsoup/content-sniffing] Make parameters a signal argument
- Date: Wed, 24 Jun 2009 01:47:40 +0000 (UTC)
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, ¶ms);
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]