diff options
| author | Gustavo Noronha Silva <gns@gnome.org> | 2009-06-23 22:30:53 -0300 |
|---|---|---|
| committer | Gustavo Noronha Silva <gns@gnome.org> | 2009-06-23 22:39:12 -0300 |
| commit | 90f62bfb8fa00bf04aa38c2fbe60e08aaf7c6a30 (patch) | |
| tree | 009072fa9ec4813e03561c9b434c7f81d693ad31 | |
| parent | ebd6a905c5e9b190f5842a59c84abcb66a6d7591 (diff) | |
| download | libsoup-90f62bfb8fa00bf04aa38c2fbe60e08aaf7c6a30.tar.gz | |
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.
| -rw-r--r-- | libsoup/soup-content-sniffer.c | 23 | ||||
| -rw-r--r-- | libsoup/soup-content-sniffer.h | 6 | ||||
| -rw-r--r-- | libsoup/soup-marshal.list | 2 | ||||
| -rw-r--r-- | libsoup/soup-message-io.c | 9 | ||||
| -rw-r--r-- | libsoup/soup-message.c | 13 | ||||
| -rw-r--r-- | libsoup/soup-message.h | 2 | ||||
| -rw-r--r-- | 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 e87f470b..05254064 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 bfcc2e8d..a8aa9156 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 785fd6f5..d0c53efa 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 6ae072e0..45031f3c 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 cc3a5d72..f614946b 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 4a514665..b940ac64 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 9cc960e3..d79c5b5c 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; |
