aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/ephy-file-helpers.c81
-rw-r--r--lib/ephy-file-helpers.h3
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);