aboutsummaryrefslogtreecommitdiffstats
path: root/shell/e-local-storage.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/e-local-storage.c')
-rw-r--r--shell/e-local-storage.c206
1 files changed, 28 insertions, 178 deletions
diff --git a/shell/e-local-storage.c b/shell/e-local-storage.c
index 233a3a4107..e843b8ddd6 100644
--- a/shell/e-local-storage.c
+++ b/shell/e-local-storage.c
@@ -49,6 +49,7 @@
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-util.h>
#include <gal/util/e-util.h>
+#include "e-util/e-path.h"
#include "e-local-folder.h"
#include "evolution-local-storage.h"
@@ -59,9 +60,6 @@
#define PARENT_TYPE E_TYPE_STORAGE
static EStorageClass *parent_class = NULL;
-#define SUBFOLDER_DIR_NAME "subfolders"
-#define SUBFOLDER_DIR_NAME_LEN 10
-
struct _ELocalStoragePrivate {
EFolderTypeRegistry *folder_type_registry;
char *base_path;
@@ -130,88 +128,6 @@ shell_component_result_to_storage_result (EvolutionShellComponentResult result)
/* Utility functions. */
-/* Translate a storage path into a physical path on the file system. */
-static char *
-get_physical_path (ELocalStorage *local_storage,
- const char *path)
-{
- EStorage *storage;
- ELocalStoragePrivate *priv;
- const char *p, *newp;
- char *dp;
- char *real_path;
- int real_path_len;
- int base_path_len;
-
- storage = E_STORAGE (local_storage);
- priv = local_storage->priv;
-
- /* @path is always absolute, so it starts with a slash. The base class should
- make sure this is the case; if not, it's broken. */
- g_assert (*path == G_DIR_SEPARATOR);
- path++;
-
- /* Calculate the length of the real path. */
-
- real_path_len = strlen (path);
- real_path_len++; /* For the ending zero. */
-
- base_path_len = strlen (priv->base_path);
- real_path_len += base_path_len;
- real_path_len++; /* For the separating slash. */
-
- /* Take account for the fact that we need to translate every separator into
- `subfolders/'. */
- p = path;
- while (1) {
- newp = strchr (p, G_DIR_SEPARATOR);
- if (newp == NULL)
- break;
-
- real_path_len += SUBFOLDER_DIR_NAME_LEN;
- real_path_len++; /* For the separating slash. */
-
- /* Skip consecutive slashes. */
- while (*newp == G_DIR_SEPARATOR)
- newp++;
-
- p = newp;
- };
-
- real_path = g_malloc (real_path_len);
- dp = real_path;
-
- memcpy (dp, priv->base_path, base_path_len);
- dp += base_path_len;
- *(dp++) = G_DIR_SEPARATOR;
-
- /* Copy the mangled path. */
- p = path;
- while (1) {
- newp = strchr (p, G_DIR_SEPARATOR);
- if (newp == NULL) {
- strcpy (dp, p);
- break;
- }
-
- memcpy (dp, p, newp - p + 1); /* `+ 1' to copy the slash too. */
- dp += newp - p + 1;
-
- memcpy (dp, SUBFOLDER_DIR_NAME, SUBFOLDER_DIR_NAME_LEN);
- dp += SUBFOLDER_DIR_NAME_LEN;
-
- *(dp++) = G_DIR_SEPARATOR;
-
- /* Skip consecutive slashes. */
- while (*newp == G_DIR_SEPARATOR)
- newp++;
-
- p = newp;
- }
-
- return real_path;
-}
-
static void
new_folder (ELocalStorage *local_storage,
const char *path,
@@ -233,79 +149,16 @@ new_folder (ELocalStorage *local_storage,
}
static gboolean
-load_folders (ELocalStorage *local_storage,
- const char *parent_path,
- const char *path,
- const char *physical_path)
+load_folder (const char *physical_path, const char *path, gpointer data)
{
- DIR *dir;
- char *subfolder_directory_path;
-
- if (parent_path == NULL) {
- /* On the top level, we don't have any folders and, consequently, no
- subfolder directory. */
-
- subfolder_directory_path = g_strdup (physical_path);
- } else {
- EFolder *folder;
-
- /* Otherwise, we have to load the corresponding folder. */
-
- folder = e_local_folder_new_from_path (physical_path);
- if (folder == NULL)
- return FALSE;
-
- new_folder (local_storage, path, folder);
-
- subfolder_directory_path = g_concat_dir_and_file (physical_path, SUBFOLDER_DIR_NAME);
- }
-
- /* Now scan the subfolders and load them. The subfolders are represented by
- directories under the "SUBFOLDER_DIR_NAME" directory. */
-
- dir = opendir (subfolder_directory_path);
+ ELocalStorage *local_storage = data;
+ EFolder *folder;
- if (dir == NULL) {
- g_free (subfolder_directory_path);
+ folder = e_local_folder_new_from_path (physical_path);
+ if (folder == NULL)
return FALSE;
- }
-
- while (1) {
- struct stat file_stat;
- struct dirent *dirent;
- char *file_path;
- char *new_path;
-
- dirent = readdir (dir);
- if (dirent == NULL)
- break;
-
- if (strcmp (dirent->d_name, ".") == 0 || strcmp (dirent->d_name, "..") == 0)
- continue;
-
- file_path = g_concat_dir_and_file (subfolder_directory_path,
- dirent->d_name);
-
- if (stat (file_path, &file_stat) < 0) {
- g_free (file_path);
- continue;
- }
- if (! S_ISDIR (file_stat.st_mode)) {
- g_free (file_path);
- continue;
- }
-
- new_path = g_concat_dir_and_file (path, dirent->d_name);
-
- load_folders (local_storage, path, new_path, file_path);
-
- g_free (file_path);
- g_free (new_path);
- }
-
- closedir (dir);
- g_free (subfolder_directory_path);
+ new_folder (local_storage, path, folder);
return TRUE;
}
@@ -316,7 +169,7 @@ load_all_folders (ELocalStorage *local_storage)
base_path = e_local_storage_get_base_path (local_storage);
- return load_folders (local_storage, NULL, G_DIR_SEPARATOR_S, base_path);
+ return e_path_find_folders (base_path, load_folder, local_storage);
}
static void
@@ -435,38 +288,27 @@ create_folder_directory (ELocalStorage *local_storage,
folder_name = g_basename (path);
- if (folder_name == path + 1) {
- /* We want a direct child of the root, so we don't need to create a
- `subfolders' directory. */
- physical_path = get_physical_path (local_storage, path);
- } else {
- char *parent_physical_path;
+ if (folder_name != path + 1) {
char *subfolders_directory_physical_path;
char *parent_path;
/* Create the `subfolders' subdirectory under the parent. */
- parent_path = g_strndup (path, folder_name - path - 1);
- parent_physical_path = get_physical_path (local_storage, parent_path);
+ parent_path = g_strndup (path, folder_name - path);
+ subfolders_directory_physical_path = e_path_to_physical (priv->base_path, parent_path);
g_free (parent_path);
- subfolders_directory_physical_path = g_concat_dir_and_file (parent_physical_path,
- SUBFOLDER_DIR_NAME);
-
if (! g_file_exists (subfolders_directory_physical_path)) {
if (mkdir (subfolders_directory_physical_path, 0700) == -1) {
g_free (subfolders_directory_physical_path);
- g_free (parent_physical_path);
return errno_to_storage_result ();
}
}
-
- physical_path = g_concat_dir_and_file (subfolders_directory_physical_path,
- folder_name);
g_free (subfolders_directory_physical_path);
- g_free (parent_physical_path);
}
-
+
+ physical_path = e_path_to_physical (priv->base_path, path);
+
/* Create the directory that holds the folder. */
*physical_path_return = physical_path;
@@ -554,19 +396,27 @@ static EStorageResult
remove_folder_directory (ELocalStorage *local_storage,
const char *path)
{
- char *physical_path;
- char *file_name;
+ ELocalStoragePrivate *priv;
+ char *physical_path, *subfolder_physical_path;
+ char *file_name, *subfolder_path;
- physical_path = get_physical_path (local_storage, path);
+ priv = local_storage->priv;
+
+ subfolder_path = g_strdup_printf ("%s/", path);
+ subfolder_physical_path = e_path_to_physical (priv->base_path, subfolder_path);
+ g_free (subfolder_path);
/* 1. Delete the subfolder directory. If this fails, it means that we
have subfolders. */
- file_name = g_concat_dir_and_file (physical_path, SUBFOLDER_DIR_NAME);
- if (g_file_exists (file_name) && rmdir (file_name) == -1)
+ if (g_file_exists (subfolder_physical_path) &&
+ rmdir (subfolder_physical_path) == -1) {
+ g_free (subfolder_physical_path);
return E_STORAGE_NOTEMPTY; /* FIXME? */
- g_free (file_name);
+ }
+ g_free (subfolder_physical_path);
/* 2. Delete the metadata file associated with this folder. */
+ physical_path = e_path_to_physical (priv->base_path, path);
file_name = g_concat_dir_and_file (physical_path, E_LOCAL_FOLDER_METADATA_FILE_NAME);
unlink (file_name);
g_free (file_name);