[gthumb] Add an escaped uri field to the file_data struct



commit 82846f16d9aa1cec014bb18f3db2e263149d2111
Author: Michael J. Chudobiak <mjc avtechpulse com>
Date:   Tue May 19 15:01:04 2009 -0400

    Add an escaped uri field to the file_data struct
    
    Also, make all gnome_thumbnail functions use this new uri field.
    The new uri field is symlink resolved.
---
 libgthumb/file-data.c    |   12 ++++++++++++
 libgthumb/file-data.h    |    9 +++++----
 libgthumb/file-utils.c   |   26 +++++++++++++-------------
 libgthumb/thumb-cache.c  |   31 +++++--------------------------
 libgthumb/thumb-loader.c |   12 ++++++------
 5 files changed, 41 insertions(+), 49 deletions(-)

diff --git a/libgthumb/file-data.c b/libgthumb/file-data.c
index a08e182..e2ea382 100644
--- a/libgthumb/file-data.c
+++ b/libgthumb/file-data.c
@@ -60,8 +60,10 @@ load_info (FileData *fd)
 {
 	GFileInfo *info;
 	GFile     *gfile;
+	GFile     *gfile_resolved;
 	GError    *error = NULL;
 	GTimeVal   tv;
+	char      *resolved_path;
 
 	g_free (fd->local_path);
 	gfile = gfile_new (fd->path);
@@ -77,6 +79,14 @@ load_info (FileData *fd)
 		fd->local_path = NULL;
 	}
 
+	g_free (fd->uri);
+
+	resolved_path = resolve_all_symlinks (fd->path);
+	gfile_resolved = gfile_new (resolved_path);
+	fd->uri = g_file_get_uri (gfile_resolved);
+	g_object_unref (gfile_resolved);
+	g_free (resolved_path);
+
 	info = g_file_query_info (gfile, 
 				  G_FILE_ATTRIBUTE_STANDARD_SIZE ","
 				  G_FILE_ATTRIBUTE_TIME_CHANGED ","
@@ -168,6 +178,7 @@ file_data_dup (FileData *source)
         fd->utf8_path = g_strdup (source->utf8_path);
         fd->utf8_name = file_name_from_path (fd->utf8_path);
 	fd->local_path = g_strdup (source->local_path);
+	fd->uri = g_strdup (source->uri);
 
 	fd->mime_type = get_static_string (source->mime_type);
 	fd->size = source->size;
@@ -199,6 +210,7 @@ file_data_unref (FileData *fd)
 		g_free (fd->path);
 		g_free (fd->utf8_path);
 		g_free (fd->local_path);
+		g_free (fd->uri);
 		if (fd->comment_data != NULL)
 			comment_data_free (fd->comment_data);
 		g_free (fd->comment);
diff --git a/libgthumb/file-data.h b/libgthumb/file-data.h
index 9e56a33..f562757 100644
--- a/libgthumb/file-data.h
+++ b/libgthumb/file-data.h
@@ -33,11 +33,12 @@
 typedef struct {
 	guint               ref : 8;
 
-	char               *path;          /* Full path name. */
-	const char         *name;          /* File name only. */
-	char               *utf8_path;	   /* Always unescaped UTF8 */
-	const char	   *utf8_name;     /* Always unescaped UTF8 */
+	char               *path;          /* Full path name, may be escaped or unescaped. */
+	const char         *name;          /* File name only, may be escaped on unescaped. */
+	char               *utf8_path;	   /* Full path name, always unescaped UTF8 */
+	const char	   *utf8_name;     /* File name only, always unescaped UTF8 */
 	char		   *local_path;    /* May be a gvfs mount point */
+	char		   *uri;	   /* Always escaped URI. Symlinks are resolved. */
 	const char         *mime_type;
 	goffset             size;
 	time_t              ctime;
diff --git a/libgthumb/file-utils.c b/libgthumb/file-utils.c
index de53f05..8ef990e 100644
--- a/libgthumb/file-utils.c
+++ b/libgthumb/file-utils.c
@@ -651,22 +651,22 @@ file_unlink (const char *path)
 void
 delete_thumbnail (const char *path)
 {
-	char *uri;
-	char *large_thumbnail;
-	char *normal_thumbnail;
+	char     *large_thumbnail;
+	char     *normal_thumbnail;
+	FileData *fd;
 
-	uri = add_scheme_if_absent (path);
+	fd = file_data_new (path);
 
 	/* delete associated thumbnails, if present */
-	large_thumbnail = gnome_thumbnail_path_for_uri (uri, GNOME_THUMBNAIL_SIZE_LARGE);
-	normal_thumbnail = gnome_thumbnail_path_for_uri (uri, GNOME_THUMBNAIL_SIZE_NORMAL);
+	large_thumbnail = gnome_thumbnail_path_for_uri (fd->uri, GNOME_THUMBNAIL_SIZE_LARGE);
+	normal_thumbnail = gnome_thumbnail_path_for_uri (fd->uri, GNOME_THUMBNAIL_SIZE_NORMAL);
 
 	file_unlink (large_thumbnail);
 	file_unlink (normal_thumbnail);
 
 	g_free (large_thumbnail);
 	g_free (normal_thumbnail);
-	g_free (uri);
+	file_data_unref (fd);
 }
 
 
@@ -1547,6 +1547,9 @@ char *resolve_all_symlinks (const char *uri)
 	gfile_full = gfile_new (uri);
 	gfile_curr = gfile_new (uri);
 
+	if (!g_file_query_exists (gfile_curr, NULL))
+		return g_strdup (uri);
+
 	while ((parent = g_file_get_parent (gfile_curr)) != NULL) {
 		GFileInfo  *info;
 		GError     *error = NULL;
@@ -2328,12 +2331,10 @@ gth_pixbuf_new_from_video (FileData               *file,
 			   gboolean                resolve_symlinks)
 {
       	GdkPixbuf *pixbuf = NULL;
-      	char      *file_uri = NULL;
 	char      *thumbnail_uri;
 
-	file_uri = resolve_all_symlinks (file->path);
 	thumbnail_uri = gnome_thumbnail_factory_lookup (factory,
-							file_uri,
+							file->uri,
 							file->mtime);
 	if (thumbnail_uri != NULL) {
 		char *thumbnail_path;
@@ -2343,18 +2344,17 @@ gth_pixbuf_new_from_video (FileData               *file,
 		g_free (thumbnail_path);
 	}
 	else if (gnome_thumbnail_factory_has_valid_failed_thumbnail (factory, 
-								     file_uri, 
+								     file->uri, 
 								     file->mtime)) 
 	{ 
 		pixbuf = NULL;
 	}
 	else 
 		pixbuf = gnome_thumbnail_factory_generate_thumbnail (factory,
-								     file_uri, 
+								     file->uri, 
 								     file->mime_type);
 
 	g_free (thumbnail_uri);
-	g_free (file_uri);
 
 	return pixbuf;
 }
diff --git a/libgthumb/thumb-cache.c b/libgthumb/thumb-cache.c
index a2c112b..0d4d0de 100644
--- a/libgthumb/thumb-cache.c
+++ b/libgthumb/thumb-cache.c
@@ -39,6 +39,7 @@
 #include "typedefs.h"
 #include "thumb-cache.h"
 #include "file-utils.h"
+#include "gfile-utils.h"
 #include "file-data.h"
 #include "gtk-utils.h"
 
@@ -49,34 +50,12 @@
 char *
 cache_get_nautilus_cache_name (const char *path)
 {
-	char           *parent;
-	char           *resolved_parent;
-	char           *resolved_path = NULL;
-	GnomeVFSURI    *uri;
-	char           *uri_txt;
 	char           *retval;
+	FileData       *fd;
 
-	parent = remove_level_from_path (path);
-	resolved_parent = resolve_all_symlinks (parent);
-	g_free (parent);
-
-	resolved_path = g_strconcat (resolved_parent,
-				     "/",
-				     file_name_from_path (path),
-				     NULL);
-	uri = new_uri_from_path (resolved_path);
-
-	g_free (resolved_path);
-	g_free (resolved_parent);
-
-	uri_txt = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
-	gnome_vfs_uri_unref (uri);
-
-	if (uri_txt == NULL)
-		return NULL;
-
-	retval = gnome_thumbnail_path_for_uri (uri_txt, GNOME_THUMBNAIL_SIZE_NORMAL);
-	g_free (uri_txt);
+	fd = file_data_new (path);
+	retval = gnome_thumbnail_path_for_uri (fd->uri, GNOME_THUMBNAIL_SIZE_NORMAL);
+	file_data_unref (fd);
 
 	return retval;
 }
diff --git a/libgthumb/thumb-loader.c b/libgthumb/thumb-loader.c
index c375590..05b96dc 100644
--- a/libgthumb/thumb-loader.c
+++ b/libgthumb/thumb-loader.c
@@ -374,12 +374,12 @@ thumb_loader_start__step2 (ThumbLoader *tl)
 	
 	if (tl->priv->use_cache) {
 		cache_path = gnome_thumbnail_factory_lookup (tl->priv->thumb_factory,
-							     tl->priv->file->path,
+							     tl->priv->file->uri,
 							     tl->priv->file->mtime);
 
 		if ((cache_path == NULL)  
 		    && gnome_thumbnail_factory_has_valid_failed_thumbnail (tl->priv->thumb_factory,
-									   tl->priv->file->path,
+									   tl->priv->file->uri,
 									   tl->priv->file->mtime)
 		    && ((time (NULL) - tl->priv->file->mtime) > (time_t) 5)) 
 		{
@@ -470,7 +470,7 @@ thumb_loader_save_to_cache (ThumbLoader *tl)
 		g_free (cache_base_uri);
 	}
 
-	cache_file = gnome_thumbnail_path_for_uri (tl->priv->file->path, tl->priv->thumb_size);
+	cache_file = gnome_thumbnail_path_for_uri (tl->priv->file->uri, tl->priv->thumb_size);
 	if (cache_file == NULL)
 		return FALSE;
 		
@@ -480,7 +480,7 @@ thumb_loader_save_to_cache (ThumbLoader *tl)
 	if (ensure_dir_exists (cache_dir))	
 		gnome_thumbnail_factory_save_thumbnail (tl->priv->thumb_factory,
 							tl->priv->pixbuf,
-							tl->priv->file->path,
+							tl->priv->file->uri,
 							tl->priv->file->mtime);
 	g_free (cache_dir);
 
@@ -507,7 +507,7 @@ thumb_loader_done_cb (ImageLoader *il,
 
 	if (pixbuf == NULL) {
 		gnome_thumbnail_factory_create_failed_thumbnail (priv->thumb_factory,
-								 priv->file->path,
+								 priv->file->uri,
 								 priv->file->mtime);
 		g_signal_emit (G_OBJECT (tl), thumb_loader_signals[THUMB_ERROR], 0);
 		return;
@@ -585,7 +585,7 @@ thumb_loader_error_cb (ImageLoader *il,
 		}
 
 		gnome_thumbnail_factory_create_failed_thumbnail (priv->thumb_factory,
-								 priv->file->path,
+								 priv->file->uri,
 								 priv->file->mtime);
 
 		g_signal_emit (G_OBJECT (tl), thumb_loader_signals[THUMB_ERROR], 0);



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