Tomas Bzatek 822c09e
From 47a6cb95996df5538bab4b9b07cdd8f944c0b24b Mon Sep 17 00:00:00 2001
Tomas Bzatek 822c09e
From: Christian Kellner <gicmo@gnome.org>
Tomas Bzatek 822c09e
Date: Fri, 16 Oct 2009 10:18:17 +0000
Tomas Bzatek 822c09e
Subject: [HTTP] Support g_file_input_stream_query_info()
Tomas Bzatek 822c09e
Tomas Bzatek 822c09e
Fixes bug 598505. Based on a patch from Robert Ancell.
Tomas Bzatek 822c09e
---
Tomas Bzatek 822c09e
diff --git a/daemon/gvfsbackendhttp.c b/daemon/gvfsbackendhttp.c
Tomas Bzatek 822c09e
index 97c6ce7..23d1f97 100644
Tomas Bzatek 822c09e
--- a/daemon/gvfsbackendhttp.c
Tomas Bzatek 822c09e
+++ b/daemon/gvfsbackendhttp.c
Tomas Bzatek 822c09e
@@ -529,30 +529,15 @@ try_close_read (GVfsBackend       *backend,
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
 /* *** query_info () *** */
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
-static void 
Tomas Bzatek 822c09e
-query_info_ready (SoupSession *session,
Tomas Bzatek 822c09e
-                  SoupMessage *msg,
Tomas Bzatek 822c09e
-                  gpointer     user_data)
Tomas Bzatek 822c09e
+static void
Tomas Bzatek 822c09e
+file_info_from_message (SoupMessage *msg,
Tomas Bzatek 822c09e
+                        GFileInfo *info,
Tomas Bzatek 822c09e
+                        GFileAttributeMatcher *matcher)
Tomas Bzatek 822c09e
 {
Tomas Bzatek 822c09e
-  GFileAttributeMatcher *matcher;
Tomas Bzatek 822c09e
-  GVfsJobQueryInfo      *job;
Tomas Bzatek 822c09e
-  const SoupURI         *uri;
Tomas Bzatek 822c09e
-  const char            *text;
Tomas Bzatek 822c09e
-  GFileInfo             *info;
Tomas Bzatek 822c09e
-  char                  *basename;
Tomas Bzatek 822c09e
-  char                  *ed_name;
Tomas Bzatek 822c09e
-
Tomas Bzatek 822c09e
-  job     = G_VFS_JOB_QUERY_INFO (user_data);
Tomas Bzatek 822c09e
-  info    = job->file_info;
Tomas Bzatek 822c09e
-  matcher = job->attribute_matcher;
Tomas Bzatek 822c09e
-  ed_name = NULL;
Tomas Bzatek 822c09e
-
Tomas Bzatek 822c09e
-  if (! SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
Tomas Bzatek 822c09e
-    {
Tomas Bzatek 822c09e
-      g_vfs_job_failed_from_http_status (G_VFS_JOB (job), msg->status_code,
Tomas Bzatek 822c09e
-                                         msg->reason_phrase);
Tomas Bzatek 822c09e
-      return;
Tomas Bzatek 822c09e
-    }
Tomas Bzatek 822c09e
+  const SoupURI *uri;
Tomas Bzatek 822c09e
+  const char    *text;
Tomas Bzatek 822c09e
+  char          *basename;
Tomas Bzatek 822c09e
+  char          *ed_name = NULL;
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
   uri = soup_message_get_uri (msg);
Tomas Bzatek 822c09e
   basename = http_uri_get_basename (uri->path);
Tomas Bzatek 822c09e
@@ -636,7 +621,29 @@ query_info_ready (SoupSession *session,
Tomas Bzatek 822c09e
                                         G_FILE_ATTRIBUTE_ETAG_VALUE,
Tomas Bzatek 822c09e
                                         text);
Tomas Bzatek 822c09e
     }
Tomas Bzatek 822c09e
+}
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
+static void
Tomas Bzatek 822c09e
+query_info_ready (SoupSession *session,
Tomas Bzatek 822c09e
+                  SoupMessage *msg,
Tomas Bzatek 822c09e
+                  gpointer     user_data)
Tomas Bzatek 822c09e
+{
Tomas Bzatek 822c09e
+  GFileAttributeMatcher *matcher;
Tomas Bzatek 822c09e
+  GVfsJobQueryInfo      *job;
Tomas Bzatek 822c09e
+  GFileInfo             *info;
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
+  job     = G_VFS_JOB_QUERY_INFO (user_data);
Tomas Bzatek 822c09e
+  info    = job->file_info;
Tomas Bzatek 822c09e
+  matcher = job->attribute_matcher;
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
+  if (! SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
Tomas Bzatek 822c09e
+    {
Tomas Bzatek 822c09e
+      g_vfs_job_failed_from_http_status (G_VFS_JOB (job), msg->status_code,
Tomas Bzatek 822c09e
+                                         msg->reason_phrase);
Tomas Bzatek 822c09e
+      return;
Tomas Bzatek 822c09e
+    }
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
+  file_info_from_message (msg, info, matcher);
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
   g_vfs_job_succeeded (G_VFS_JOB (job));
Tomas Bzatek 822c09e
 }
Tomas Bzatek 822c09e
@@ -663,6 +670,24 @@ try_query_info (GVfsBackend           *backend,
Tomas Bzatek 822c09e
 }
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
+static gboolean
Tomas Bzatek 822c09e
+try_query_info_on_read (GVfsBackend           *backend,
Tomas Bzatek 822c09e
+                        GVfsJobQueryInfoRead  *job,
Tomas Bzatek 822c09e
+                        GVfsBackendHandle      handle,
Tomas Bzatek 822c09e
+                        GFileInfo             *info,
Tomas Bzatek 822c09e
+                        GFileAttributeMatcher *attribute_matcher)
Tomas Bzatek 822c09e
+{
Tomas Bzatek 822c09e
+    SoupMessage *msg = soup_input_stream_get_message (G_INPUT_STREAM (handle));
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
+    file_info_from_message (msg, info, attribute_matcher);
Tomas Bzatek 822c09e
+    g_object_unref (msg);
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
+    g_vfs_job_succeeded (G_VFS_JOB (job));
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
+    return TRUE;
Tomas Bzatek 822c09e
+}
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
 static void
Tomas Bzatek 822c09e
 g_vfs_backend_http_class_init (GVfsBackendHttpClass *klass)
Tomas Bzatek 822c09e
 {
Tomas Bzatek 822c09e
@@ -673,11 +698,11 @@ g_vfs_backend_http_class_init (GVfsBackendHttpClass *klass)
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
   backend_class = G_VFS_BACKEND_CLASS (klass); 
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
-  backend_class->try_mount         = try_mount;
Tomas Bzatek 822c09e
-  backend_class->try_open_for_read = try_open_for_read;
Tomas Bzatek 822c09e
-  backend_class->try_read          = try_read;
Tomas Bzatek 822c09e
-  backend_class->try_seek_on_read  = try_seek_on_read;
Tomas Bzatek 822c09e
-  backend_class->try_close_read    = try_close_read;
Tomas Bzatek 822c09e
-  backend_class->try_query_info    = try_query_info;
Tomas Bzatek 822c09e
-
Tomas Bzatek 822c09e
+  backend_class->try_mount              = try_mount;
Tomas Bzatek 822c09e
+  backend_class->try_open_for_read      = try_open_for_read;
Tomas Bzatek 822c09e
+  backend_class->try_read               = try_read;
Tomas Bzatek 822c09e
+  backend_class->try_seek_on_read       = try_seek_on_read;
Tomas Bzatek 822c09e
+  backend_class->try_close_read         = try_close_read;
Tomas Bzatek 822c09e
+  backend_class->try_query_info         = try_query_info;
Tomas Bzatek 822c09e
+  backend_class->try_query_info_on_read = try_query_info_on_read;
Tomas Bzatek 822c09e
 }
Tomas Bzatek 822c09e
diff --git a/daemon/soup-input-stream.c b/daemon/soup-input-stream.c
Tomas Bzatek 822c09e
index facce17..e1928af 100644
Tomas Bzatek 822c09e
--- a/daemon/soup-input-stream.c
Tomas Bzatek 822c09e
+++ b/daemon/soup-input-stream.c
Tomas Bzatek 822c09e
@@ -912,6 +912,13 @@ soup_input_stream_truncate (GSeekable     *seekable,
Tomas Bzatek 822c09e
   return FALSE;
Tomas Bzatek 822c09e
 }
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
+SoupMessage *
Tomas Bzatek 822c09e
+soup_input_stream_get_message (GInputStream *stream)
Tomas Bzatek 822c09e
+{
Tomas Bzatek 822c09e
+  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
Tomas Bzatek 822c09e
+  return priv->msg ? g_object_ref (priv->msg) : NULL;
Tomas Bzatek 822c09e
+}
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
 GQuark
Tomas Bzatek 822c09e
 soup_http_error_quark (void)
Tomas Bzatek 822c09e
 {
Tomas Bzatek 822c09e
diff --git a/daemon/soup-input-stream.h b/daemon/soup-input-stream.h
Tomas Bzatek 822c09e
index dd2c540..f425291 100644
Tomas Bzatek 822c09e
--- a/daemon/soup-input-stream.h
Tomas Bzatek 822c09e
+++ b/daemon/soup-input-stream.h
Tomas Bzatek 822c09e
@@ -70,6 +70,8 @@ gboolean      soup_input_stream_send_finish (GInputStream        *stream,
Tomas Bzatek 822c09e
 					     GAsyncResult        *result,
Tomas Bzatek 822c09e
 					     GError             **error);
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
+SoupMessage  *soup_input_stream_get_message (GInputStream         *stream);
Tomas Bzatek 822c09e
+
Tomas Bzatek 822c09e
 #define SOUP_HTTP_ERROR soup_http_error_quark()
Tomas Bzatek 822c09e
 GQuark soup_http_error_quark (void);
Tomas Bzatek 822c09e
 
Tomas Bzatek 822c09e
--
Tomas Bzatek 822c09e
cgit v0.8.2