gvfs r1452 - in trunk: . daemon
- From: hadess svn gnome org
- To: svn-commits-list gnome org
- Subject: gvfs r1452 - in trunk: . daemon
- Date: Fri, 29 Feb 2008 12:23:54 +0000 (GMT)
Author: hadess
Date: Fri Feb 29 12:23:54 2008
New Revision: 1452
URL: http://svn.gnome.org/viewvc/gvfs?rev=1452&view=rev
Log:
2008-02-29 Bastien Nocera <hadess hadess net>
* daemon/gvfsbackendobexftp.c (g_vfs_backend_obexftp_finalize),
(_retrieve_folder_listing), (_query_file_info_helper),
(do_open_for_read), (do_query_info), (do_query_fs_info),
(do_enumerate), (do_delete): Use a convenience function
to load directory listings, implement a simple cache there
that keeps folder listings for 3 seconds (should speed up
folder enumeration followed by info fetching, as well
as checking for non-existant files)
Modified:
trunk/ChangeLog
trunk/daemon/gvfsbackendobexftp.c
Modified: trunk/daemon/gvfsbackendobexftp.c
==============================================================================
--- trunk/daemon/gvfsbackendobexftp.c (original)
+++ trunk/daemon/gvfsbackendobexftp.c Fri Feb 29 12:23:54 2008
@@ -61,6 +61,8 @@
#define ASYNC_PENDING 0
#define ASYNC_ERROR -1
+#define CACHE_LIFESPAN 3
+
struct _GVfsBackendObexftp
{
GVfsBackend parent_instance;
@@ -71,11 +73,17 @@
DBusGProxy *manager_proxy;
DBusGProxy *session_proxy;
+ /* Use for the async notifications and errors */
GCond *cond;
GMutex *mutex;
int status;
gboolean doing_io;
GError *error;
+
+ /* Folders listing cache */
+ char *files_listing;
+ char *directory;
+ time_t time_captured;
};
typedef struct {
@@ -148,6 +156,8 @@
backend = G_VFS_BACKEND_OBEXFTP (object);
g_free (backend->display_name);
+ g_free (backend->files_listing);
+ g_free (backend->directory);
if (backend->session_proxy != NULL)
g_object_unref (backend->session_proxy);
@@ -240,10 +250,50 @@
}
static gboolean
+_retrieve_folder_listing (GVfsBackend *backend,
+ const char *filename,
+ char **files,
+ GError **error)
+{
+ GVfsBackendObexftp *op_backend = G_VFS_BACKEND_OBEXFTP (backend);
+ time_t current;
+
+ current = time (NULL);
+
+ if (op_backend->directory != NULL &&
+ strcmp (op_backend->directory, filename) == 0 &&
+ op_backend->time_captured > current - CACHE_LIFESPAN)
+ {
+ *files = g_strdup (op_backend->files_listing);
+ return TRUE;
+ }
+ else
+ {
+ g_free (op_backend->directory);
+ op_backend->directory = NULL;
+ g_free (op_backend->files_listing);
+ op_backend->files_listing = NULL;
+ }
+
+ if (dbus_g_proxy_call (op_backend->session_proxy, "RetrieveFolderListing", error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, files, G_TYPE_INVALID) == FALSE)
+ {
+ return FALSE;
+ }
+
+ op_backend->directory = g_strdup (filename);
+ op_backend->files_listing = g_strdup (*files);
+ op_backend->time_captured = time (NULL);
+
+ return TRUE;
+}
+
+static gboolean
_query_file_info_helper (GVfsBackend *backend,
- const char *filename,
- GFileInfo *info,
- GError **error)
+ const char *filename,
+ GFileInfo *info,
+ GError **error)
{
GVfsBackendObexftp *op_backend = G_VFS_BACKEND_OBEXFTP (backend);
char *parent, *basename, *files;
@@ -277,16 +327,16 @@
g_free (parent);
return FALSE;
}
- g_free (parent);
files = NULL;
- if (dbus_g_proxy_call (op_backend->session_proxy, "RetrieveFolderListing", error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &files, G_TYPE_INVALID) == FALSE)
+ if (_retrieve_folder_listing (backend, parent, &files, error) == FALSE)
{
+ g_free (parent);
return FALSE;
}
+ g_free (parent);
+
if (gvfsbackendobexftp_fl_parser_parse (files, strlen (files), &elements, error) == FALSE)
{
g_free (files);
@@ -990,9 +1040,7 @@
}
files = NULL;
- if (dbus_g_proxy_call (op_backend->session_proxy, "RetrieveFolderListing", &error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &files, G_TYPE_INVALID) == FALSE)
+ if (_retrieve_folder_listing (backend, filename, &files, &error) == FALSE)
{
g_mutex_unlock (op_backend->mutex);
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
@@ -1089,9 +1137,7 @@
}
files = NULL;
- if (dbus_g_proxy_call (op_backend->session_proxy, "RetrieveFolderListing", &error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &files, G_TYPE_INVALID) == FALSE)
+ if (_retrieve_folder_listing (backend, filename, &files, &error) == FALSE)
{
g_mutex_unlock (op_backend->mutex);
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]