[gvfs] split create_file_info() function
- From: Benjamin Otte <otte src gnome org>
- To: svn-commits-list gnome org
- Subject: [gvfs] split create_file_info() function
- Date: Sun, 26 Apr 2009 15:55:08 -0400 (EDT)
commit 345e4b2d5849294286f6a740ae43f22fb8a09a79
Author: Benjamin Otte <otte gnome org>
Date: Sun Apr 26 21:47:34 2009 +0200
split create_file_info() function
The previous function was looking ugly due to early returns.
This caused leaks and made it hard to read.
---
daemon/gvfsbackendftp.c | 94 +++++++++++++++++++++++++++--------------------
1 files changed, 54 insertions(+), 40 deletions(-)
diff --git a/daemon/gvfsbackendftp.c b/daemon/gvfsbackendftp.c
index e087839..4076053 100644
--- a/daemon/gvfsbackendftp.c
+++ b/daemon/gvfsbackendftp.c
@@ -2158,56 +2158,41 @@ enumerate_directory (GVfsBackendFtp *ftp,
return files;
}
-/* NB: This gets a file info for the given object, no matter if it's a dir
- * or a file */
static GFileInfo *
-create_file_info (GVfsBackendFtp *ftp, FtpConnection *conn, const char *filename, char **symlink)
+create_file_info_from_parent (GVfsBackendFtp *ftp, FtpConnection *conn,
+ const FtpFile *dir, const FtpFile *file, char **symlink)
{
const GList *walk, *files;
- char *dirname;
- FtpFile *dir, *file;
- GFileInfo *info;
+ GFileInfo *info = NULL;
gpointer iter;
- if (symlink)
- *symlink = NULL;
-
- if (g_str_equal (filename, "/"))
- return ftp->dir_ops->get_root (conn);
-
- dirname = g_path_get_dirname (filename);
- dir = ftp_filename_from_gvfs_path (conn, dirname);
- g_free (dirname);
-
files = enumerate_directory (ftp, conn, dir, TRUE);
- if (files)
- {
- iter = ftp->dir_ops->iter_new (conn);
- for (walk = files; walk; walk = walk->next)
- {
- info = ftp->dir_ops->iter_process (iter,
- conn,
- dir,
- file,
- walk->data,
- symlink);
- if (info)
- break;
- }
- ftp->dir_ops->iter_free (iter);
- g_static_rw_lock_reader_unlock (&ftp->directory_cache_lock);
+ if (files == NULL)
+ return NULL;
- if (info != NULL)
- {
- g_free (dir);
- return info;
- }
+ iter = ftp->dir_ops->iter_new (conn);
+ for (walk = files; walk; walk = walk->next)
+ {
+ info = ftp->dir_ops->iter_process (iter,
+ conn,
+ dir,
+ file,
+ walk->data,
+ symlink);
+ if (info)
+ break;
}
+ ftp->dir_ops->iter_free (iter);
+ g_static_rw_lock_reader_unlock (&ftp->directory_cache_lock);
- g_free (dir);
+ return info;
+}
- /* try to find hidden file/directory */
- file = ftp_filename_from_gvfs_path (conn, filename);
+static GFileInfo *
+create_file_info_from_file (GVfsBackendFtp *ftp, FtpConnection *conn,
+ const FtpFile *file, const char *filename, char **symlink)
+{
+ GFileInfo *info;
if (ftp_connection_try_cd (conn, file))
{
@@ -2241,6 +2226,7 @@ create_file_info (GVfsBackendFtp *ftp, FtpConnection *conn, const char *filename
}
else
{
+ info = NULL;
/* clear error from ftp_connection_send() in else if line above */
ftp_connection_clear_error (conn);
@@ -2250,6 +2236,34 @@ create_file_info (GVfsBackendFtp *ftp, FtpConnection *conn, const char *filename
* If you have ways to improve file detection, patches are welcome. */
}
+ return info;
+}
+
+/* NB: This gets a file info for the given object, no matter if it's a dir
+ * or a file */
+static GFileInfo *
+create_file_info (GVfsBackendFtp *ftp, FtpConnection *conn, const char *filename, char **symlink)
+{
+ char *dirname;
+ FtpFile *dir, *file;
+ GFileInfo *info;
+
+ if (symlink)
+ *symlink = NULL;
+
+ if (g_str_equal (filename, "/"))
+ return ftp->dir_ops->get_root (conn);
+
+ dirname = g_path_get_dirname (filename);
+ dir = ftp_filename_from_gvfs_path (conn, dirname);
+ g_free (dirname);
+ file = ftp_filename_from_gvfs_path (conn, filename);
+
+ info = create_file_info_from_parent (ftp, conn, dir, file, symlink);
+ if (info == NULL)
+ info = create_file_info_from_file (ftp, conn, file, filename, symlink);
+
+ g_free (dir);
g_free (file);
return info;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]