[libsoup/cache] Initial commit for cache support.



commit b0a27affd574e8e2b2673aa9652cd1afcbc04fe0
Author: Xan Lopez <xan gnome org>
Date:   Thu May 7 23:45:54 2009 +0300

    Initial commit for cache support.
---
 libsoup/Makefile.am            |    2 ++
 libsoup/soup-headers.c         |    3 +++
 libsoup/soup-session-async.c   |   17 +++++++++++++++++
 libsoup/soup-session-private.h |    2 ++
 libsoup/soup-session.c         |   16 ++++++++++++++++
 libsoup/soup.h                 |    1 +
 6 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/libsoup/Makefile.am b/libsoup/Makefile.am
index dc9ff55..ef05b72 100644
--- a/libsoup/Makefile.am
+++ b/libsoup/Makefile.am
@@ -55,6 +55,7 @@ soup_headers =			\
 	soup-auth-domain.h	\
 	soup-auth-domain-basic.h  \
 	soup-auth-domain-digest.h \
+	soup-cache.h		\
 	soup-cookie.h		\
 	soup-cookie-jar.h	\
 	soup-cookie-jar-text.h	\
@@ -116,6 +117,7 @@ libsoup_2_4_la_SOURCES =		\
 	soup-auth-manager.c		\
 	soup-auth-manager-ntlm.h	\
 	soup-auth-manager-ntlm.c	\
+	soup-cache.c			\
 	soup-connection.h		\
 	soup-connection.c		\
 	soup-cookie.c			\
diff --git a/libsoup/soup-headers.c b/libsoup/soup-headers.c
index f815db3..9818953 100644
--- a/libsoup/soup-headers.c
+++ b/libsoup/soup-headers.c
@@ -818,6 +818,9 @@ soup_header_g_string_append_param (GString *string, const char *name,
 {
 	const char *v;
 
+	g_return_if_fail (name);
+	g_return_if_fail (value);
+
 	g_string_append (string, name);
 	if (!value)
 		return;
diff --git a/libsoup/soup-session-async.c b/libsoup/soup-session-async.c
index a492ee5..97d4f2f 100644
--- a/libsoup/soup-session-async.c
+++ b/libsoup/soup-session-async.c
@@ -361,10 +361,21 @@ do_idle_run_queue (SoupSession *session)
 	}
 }
 
+static gboolean
+had_cache (SoupMessageQueueItem *item)
+{
+	SoupCache *cache;
+
+	cache = soup_session_get_cache (item->session);
+	soup_cache_send_response (cache, item->session, item->msg);
+	return FALSE;
+}
+
 static void
 queue_message (SoupSession *session, SoupMessage *req,
 	       SoupSessionCallback callback, gpointer user_data)
 {
+	SoupCache *cache;
 	SoupMessageQueueItem *item;
 
 	SOUP_SESSION_CLASS (soup_session_async_parent_class)->queue_message (session, req, callback, user_data);
@@ -377,6 +388,12 @@ queue_message (SoupSession *session, SoupMessage *req,
 	g_signal_connect_after (req, "finished",
 				G_CALLBACK (final_finished), item);
 
+	cache = soup_session_get_cache (session);
+	if (cache && soup_cache_has_response (cache, session, req)) {
+		g_idle_add ((GSourceFunc)had_cache, item);
+		return;
+	}
+
 	do_idle_run_queue (session);
 }
 
diff --git a/libsoup/soup-session-private.h b/libsoup/soup-session-private.h
index f8b13d5..015704f 100644
--- a/libsoup/soup-session-private.h
+++ b/libsoup/soup-session-private.h
@@ -6,6 +6,7 @@
 #ifndef SOUP_SESSION_PRIVATE_H
 #define SOUP_SESSION_PRIVATE_H 1
 
+#include "soup-cache.h"
 #include "soup-session.h"
 #include "soup-connection.h"
 #include "soup-message-queue.h"
@@ -24,6 +25,7 @@ SoupConnection   *soup_session_get_connection       (SoupSession *session,
 gboolean          soup_session_try_prune_connection (SoupSession *session);
 
 SoupProxyResolver *soup_session_get_proxy_resolver  (SoupSession *session);
+SoupCache         *soup_session_get_cache           (SoupSession *session);
 
 G_END_DECLS
 
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index cbaa42d..b8841b3 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -18,6 +18,7 @@
 #include "soup-auth-basic.h"
 #include "soup-auth-digest.h"
 #include "soup-auth-manager-ntlm.h"
+#include "soup-cache.h"
 #include "soup-connection.h"
 #include "soup-marshal.h"
 #include "soup-message-private.h"
@@ -65,6 +66,7 @@ typedef struct {
 
 typedef struct {
 	SoupProxyResolver *proxy_resolver;
+	SoupCache *cache;
 
 	char *ssl_ca_file;
 	SoupSSLCredentials *ssl_creds;
@@ -1494,6 +1496,9 @@ soup_session_add_feature (SoupSession *session, SoupSessionFeature *feature)
 
 	if (SOUP_IS_PROXY_RESOLVER (feature))
 		priv->proxy_resolver = SOUP_PROXY_RESOLVER (feature);
+
+	if (SOUP_IS_CACHE (feature))
+		priv->cache = SOUP_CACHE (feature);
 }
 
 /**
@@ -1546,6 +1551,9 @@ soup_session_remove_feature (SoupSession *session, SoupSessionFeature *feature)
 
 		if (feature == (SoupSessionFeature *)priv->proxy_resolver)
 			priv->proxy_resolver = NULL;
+
+		if (feature == (SoupSessionFeature *)priv->cache)
+			priv->cache = NULL;
 	}
 }
 
@@ -1646,3 +1654,11 @@ soup_session_get_proxy_resolver (SoupSession *session)
 
 	return priv->proxy_resolver;
 }
+
+SoupCache *
+soup_session_get_cache (SoupSession *session)
+{
+	SoupSessionPrivate *priv = SOUP_SESSION_GET_PRIVATE (session);
+
+	return priv->cache;
+}
diff --git a/libsoup/soup.h b/libsoup/soup.h
index 496a4c1..4ac0991 100644
--- a/libsoup/soup.h
+++ b/libsoup/soup.h
@@ -15,6 +15,7 @@ extern "C" {
 #include <libsoup/soup-auth-domain.h>
 #include <libsoup/soup-auth-domain-basic.h>
 #include <libsoup/soup-auth-domain-digest.h>
+#include <libsoup/soup-cache.h>
 #include <libsoup/soup-cookie.h>
 #include <libsoup/soup-cookie-jar.h>
 #include <libsoup/soup-cookie-jar-text.h>



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