diff options
author | Diego Escalante Urrelo <descalante@igalia.com> | 2011-09-05 05:34:49 +0800 |
---|---|---|
committer | Diego Escalante Urrelo <descalante@igalia.com> | 2011-09-05 05:56:44 +0800 |
commit | 7dafb390f5091bfbf1b5236aebf8e5f33aa0bbf1 (patch) | |
tree | 91ebd2a5c9f9a5739d1629cd51454e9bc98472ab /lib | |
parent | 5208e2eab48e8a64912d2f00264b9a6c96c572e0 (diff) | |
download | gsoc2013-epiphany-7dafb390f5091bfbf1b5236aebf8e5f33aa0bbf1.tar gsoc2013-epiphany-7dafb390f5091bfbf1b5236aebf8e5f33aa0bbf1.tar.gz gsoc2013-epiphany-7dafb390f5091bfbf1b5236aebf8e5f33aa0bbf1.tar.bz2 gsoc2013-epiphany-7dafb390f5091bfbf1b5236aebf8e5f33aa0bbf1.tar.lz gsoc2013-epiphany-7dafb390f5091bfbf1b5236aebf8e5f33aa0bbf1.tar.xz gsoc2013-epiphany-7dafb390f5091bfbf1b5236aebf8e5f33aa0bbf1.tar.zst gsoc2013-epiphany-7dafb390f5091bfbf1b5236aebf8e5f33aa0bbf1.zip |
e-file-helpers: implement and use ephy_file_delete_dir_recursively
Move the implementation from ephy-web-app-utils.c to
ephy-file-helpers.c.
The current one was not doing recursive delete, this caused the bug of
private instances leaving their profile directories behind in /tmp.
Bug #658201
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ephy-file-helpers.c | 81 | ||||
-rw-r--r-- | lib/ephy-file-helpers.h | 3 |
2 files changed, 62 insertions, 22 deletions
diff --git a/lib/ephy-file-helpers.c b/lib/ephy-file-helpers.c index f1e2e0e41..80d30e06d 100644 --- a/lib/ephy-file-helpers.c +++ b/lib/ephy-file-helpers.c @@ -381,8 +381,15 @@ ephy_file_helpers_shutdown (void) { if (!keep_temp_directory) { - /* recursively delete the contents and the directory */ - ephy_file_delete_directory (tmp_dir); + GFile *tmp_dir_file; + tmp_dir_file = g_file_new_for_path (tmp_dir); + + /* recursively delete the contents and the + * directory */ + LOG ("shutdown: delete tmp_dir %s", tmp_dir); + ephy_file_delete_dir_recursively (tmp_dir_file, + NULL); + g_object_unref (tmp_dir_file); } g_free (tmp_dir); @@ -855,30 +862,62 @@ ephy_file_browse_to (GFile *file, } /** - * ephy_file_delete_directory: - * @path: the path to remove + * ephy_file_delete_dir_recursively: + * @directory: directory to remove + * @error: location to set any #GError * * Remove @path and its contents. Like calling rm -rf @path. **/ -void -ephy_file_delete_directory (const char *path) +gboolean +ephy_file_delete_dir_recursively (GFile *directory, GError **error) { - GFile *file; - gboolean ret; - - file = g_file_new_for_path (path); - - ret = g_file_delete (file, NULL, NULL); - - if (ret == TRUE) - { - LOG ("Deleted dir '%s'", path); - } - else - { - LOG ("Couldn't delete dir '%s'", path); + GFileEnumerator *children = NULL; + GFileInfo *info; + gboolean ret = TRUE; + + children = g_file_enumerate_children (directory, + "standard::name,standard::type", + 0, NULL, error); + if (error) + goto out; + + info = g_file_enumerator_next_file (children, NULL, error); + while (info || error) { + GFile *child; + const char *name; + GFileType type; + + if (error) + goto out; + + name = g_file_info_get_name (info); + child = g_file_get_child (directory, name); + type = g_file_info_get_file_type (info); + + LOG ("ephy-file-delete-dir: delete child %s", name); + if (type == G_FILE_TYPE_DIRECTORY) + ret = ephy_file_delete_dir_recursively (child, error); + else if (type == G_FILE_TYPE_REGULAR) + ret = g_file_delete (child, NULL, error); + + g_object_unref (info); + + if (!ret) + goto out; + + info = g_file_enumerator_next_file (children, NULL, error); } - g_object_unref (file); + + ret = TRUE; + + LOG ("ephy-file-delete-dir: delete successful"); + g_file_delete (directory, NULL, error); + +out: + if (children) + g_object_unref (children); + + return ret; } /** diff --git a/lib/ephy-file-helpers.h b/lib/ephy-file-helpers.h index 0c5ab9b3d..d36783579 100644 --- a/lib/ephy-file-helpers.h +++ b/lib/ephy-file-helpers.h @@ -83,7 +83,8 @@ gboolean ephy_file_launch_handler (const char *mime_type, guint32 user_time); gboolean ephy_file_browse_to (GFile *file, guint32 user_time); -void ephy_file_delete_directory (const char *path); +gboolean ephy_file_delete_dir_recursively (GFile *file, + GError **error); void ephy_file_delete_uri (const char *uri); void ephy_file_load_accels (void); void ephy_file_save_accels (void); |