From c83477345fa5dceb62b85efd0a76a54f94a78858 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Fri, 3 Dec 2004 03:36:57 +0000 Subject: have our own so we don't need to link with glib. * camel-lock-helper.c (g_strerror): have our own so we don't need to link with glib. * providers/*/Makefile.am: Do not install ANY provider header files. No providers are subclassable. No providers are directly linkable. * camel.pc.in: create package config file. * tests/lib/folders.c (test_folder_message_ops): updated counts for delete also marking unread. * tests/lib/camel-test.c (camel_test_provider_init): new api for initialising test system 'in-build'. * camel-provider.c: remove the assertions, init if we need to,k use pthread_once stuff to serialise it. * tests/folder/test3.c (main): remove gtk stuff (???). * tests/*: Fix all the makefiles. Made make-check work 'in-build'. * tests/lib/folders.c (test_folder_counts): update for api changes. (test_message_info): similar. * providers/Makefile.am: removed groupwise from the build, this can't go in here anymore, not in its current state. * camel-net-utils.c (camel_gethostbyaddr_r) (camel_gethostbyname_r): the old e_gethost* calls from e-host-utils.c. 2004-11-15 Not Zed * providers/imap/camel-imap-utils.c (imap_path_to_physical): copied from e-path.c. (imap_path_find_folders): copied from e-path.c. * camel.h: remove the provider stuff from the header. * camel-provider.c: globalise provider_init variable, and asserton it in all functions that rely on it. * camel-service.c: removed getaddrinfo/etc. * camel-net-utils.[ch]: separate out camel_getaddrinfo etc. * Makefile.am: split camel into 2 libraries, libcamel and libcamel-store. * camel-multipart-signed.c (camel_multipart_signed_sign) (camel_multipart_signed_verify, prepare_sign): remove old deprecated api. * camel-multipart-encrypted.c (camel_multipart_encrypted_encrypt) (camel_multipart_encrypted_decrypt): remove old deprecated api. svn path=/trunk/; revision=28046 --- camel/providers/imap/Makefile.am | 10 +- camel/providers/imap/camel-imap-folder.c | 6 +- camel/providers/imap/camel-imap-private.h | 2 +- camel/providers/imap/camel-imap-search.c | 2 +- camel/providers/imap/camel-imap-search.h | 2 +- camel/providers/imap/camel-imap-store-summary.c | 4 +- camel/providers/imap/camel-imap-store.c | 17 ++- camel/providers/imap/camel-imap-store.h | 2 +- camel/providers/imap/camel-imap-utils.c | 164 ++++++++++++++++++++++++ camel/providers/imap/camel-imap-utils.h | 5 + 10 files changed, 189 insertions(+), 25 deletions(-) (limited to 'camel/providers/imap') diff --git a/camel/providers/imap/Makefile.am b/camel/providers/imap/Makefile.am index 1a2f46faf9..7c18acfa7f 100644 --- a/camel/providers/imap/Makefile.am +++ b/camel/providers/imap/Makefile.am @@ -1,7 +1,5 @@ ## Process this file with automake to produce Makefile.in -libcamelimapincludedir = $(privincludedir)/camel - camel_provider_LTLIBRARIES = libcamelimap.la camel_provider_DATA = libcamelimap.urls @@ -28,7 +26,7 @@ libcamelimap_la_SOURCES = \ camel-imap-utils.c \ camel-imap-wrapper.c -libcamelimapinclude_HEADERS = \ +noinst_HEADERS = \ camel-imap-command.h \ camel-imap-folder.h \ camel-imap-message-cache.h \ @@ -38,11 +36,9 @@ libcamelimapinclude_HEADERS = \ camel-imap-summary.h \ camel-imap-types.h \ camel-imap-utils.h \ - camel-imap-wrapper.h + camel-imap-wrapper.h \ + camel-imap-private.h libcamelimap_la_LDFLAGS = -avoid-version -module -noinst_HEADERS = \ - camel-imap-private.h - EXTRA_DIST = libcamelimap.urls diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index 229fbbb82b..6cdd96bcf7 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -37,8 +37,8 @@ #include #include -#include "e-util/e-path.h" -#include "e-util/e-time-utils.h" +/*#include "libedataserver/e-path.h"*/ +#include "libedataserver/e-time-utils.h" #include "camel-imap-folder.h" #include "camel-imap-command.h" @@ -470,7 +470,7 @@ imap_rename (CamelFolder *folder, const char *new) char *folders; folders = g_strconcat (imap_store->storage_path, "/folders", NULL); - folder_dir = e_path_to_physical (folders, new); + folder_dir = imap_path_to_physical (folders, new); g_free (folders); summary_path = g_strdup_printf("%s/summary", folder_dir); diff --git a/camel/providers/imap/camel-imap-private.h b/camel/providers/imap/camel-imap-private.h index 0f80dbfd1c..d07358527a 100644 --- a/camel/providers/imap/camel-imap-private.h +++ b/camel/providers/imap/camel-imap-private.h @@ -36,7 +36,7 @@ extern "C" { #endif #ifdef ENABLE_THREADS -#include "e-util/e-msgport.h" +#include "libedataserver/e-msgport.h" #endif struct _CamelImapFolderPrivate { diff --git a/camel/providers/imap/camel-imap-search.c b/camel/providers/imap/camel-imap-search.c index eacb839cb2..2c0dcb02f6 100644 --- a/camel/providers/imap/camel-imap-search.c +++ b/camel/providers/imap/camel-imap-search.c @@ -38,7 +38,7 @@ #include "camel-imap-utils.h" #include "camel-imap-summary.h" -#include "e-util/md5-utils.h" /* md5 hash building */ +#include "libedataserver/md5-utils.h" /* md5 hash building */ #include "camel-mime-utils.h" /* base64 encoding */ #include "camel-seekable-stream.h" diff --git a/camel/providers/imap/camel-imap-search.h b/camel/providers/imap/camel-imap-search.h index 7664c4c2ed..3ad7f8decc 100644 --- a/camel/providers/imap/camel-imap-search.h +++ b/camel/providers/imap/camel-imap-search.h @@ -27,7 +27,7 @@ #define _CAMEL_IMAP_SEARCH_H #include -#include +#include #include #define CAMEL_IMAP_SEARCH_TYPE (camel_imap_search_get_type ()) diff --git a/camel/providers/imap/camel-imap-store-summary.c b/camel/providers/imap/camel-imap-store-summary.c index 32530d3c3f..434f5b5da0 100644 --- a/camel/providers/imap/camel-imap-store-summary.c +++ b/camel/providers/imap/camel-imap-store-summary.c @@ -33,8 +33,8 @@ #include "camel-file-utils.h" -#include "e-util/md5-utils.h" -#include "e-util/e-memory.h" +#include "libedataserver/md5-utils.h" +#include "libedataserver/e-memory.h" #include "camel-private.h" #include "camel-utf8.h" diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index 52e0dfba89..5811b0f691 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -34,8 +34,6 @@ #include #include -#include "e-util/e-path.h" - #include "camel-imap-store.h" #include "camel-imap-store-summary.h" #include "camel-imap-folder.h" @@ -62,6 +60,7 @@ #include "camel-private.h" #include "camel-debug.h" #include "camel-i18n.h" +#include "camel-net-utils.h" #define d(x) @@ -1042,7 +1041,7 @@ imap_forget_folder (CamelImapStore *imap_store, const char *folder_name, CamelEx name = folder_name; storage_path = g_strdup_printf ("%s/folders", imap_store->storage_path); - folder_dir = e_path_to_physical (storage_path, folder_name); + folder_dir = imap_path_to_physical (storage_path, folder_name); g_free (storage_path); if (access (folder_dir, F_OK) != 0) { g_free (folder_dir); @@ -1983,7 +1982,7 @@ get_folder_online (CamelStore *store, const char *folder_name, guint32 flags, Ca } storage_path = g_strdup_printf("%s/folders", imap_store->storage_path); - folder_dir = e_path_to_physical (storage_path, folder_name); + folder_dir = imap_path_to_physical (storage_path, folder_name); g_free(storage_path); new_folder = camel_imap_folder_new (store, folder_name, folder_dir, ex); g_free (folder_dir); @@ -2026,7 +2025,7 @@ get_folder_offline (CamelStore *store, const char *folder_name, folder_name = "INBOX"; storage_path = g_strdup_printf("%s/folders", imap_store->storage_path); - folder_dir = e_path_to_physical (storage_path, folder_name); + folder_dir = imap_path_to_physical (storage_path, folder_name); g_free(storage_path); if (!folder_dir || access (folder_dir, F_OK) != 0) { g_free (folder_dir); @@ -2196,8 +2195,8 @@ rename_folder (CamelStore *store, const char *old_name, const char *new_name_in, manage_subscriptions(store, new_name_in, TRUE); storage_path = g_strdup_printf("%s/folders", imap_store->storage_path); - oldpath = e_path_to_physical (storage_path, old_name); - newpath = e_path_to_physical (storage_path, new_name_in); + oldpath = imap_path_to_physical (storage_path, old_name); + newpath = imap_path_to_physical (storage_path, new_name_in); g_free(storage_path); /* So do we care if this didn't work? Its just a cache? */ @@ -2632,7 +2631,7 @@ fill_fi(CamelStore *store, CamelFolderInfo *fi, guint32 flags) /* This is a lot of work for one path! */ storage_path = g_strdup_printf("%s/folders", ((CamelImapStore *)store)->storage_path); - folder_dir = e_path_to_physical(storage_path, fi->full_name); + folder_dir = imap_path_to_physical(storage_path, fi->full_name); path = g_strdup_printf("%s/summary", folder_dir); s = (CamelFolderSummary *)camel_object_new(camel_imap_summary_get_type()); camel_folder_summary_set_build_content(s, TRUE); @@ -3038,7 +3037,7 @@ get_folder_info_offline (CamelStore *store, const char *top, /* A kludge to avoid having to pass a struct to the callback */ g_ptr_array_add (folders, imap_store); storage_path = g_strdup_printf("%s/folders", imap_store->storage_path); - if (!e_path_find_folders (storage_path, get_one_folder_offline, folders)) { + if (!imap_path_find_folders (storage_path, get_one_folder_offline, folders)) { camel_disco_store_check_online (CAMEL_DISCO_STORE (imap_store), ex); fi = NULL; } else { diff --git a/camel/providers/imap/camel-imap-store.h b/camel/providers/imap/camel-imap-store.h index b197cadda4..b1e3226969 100644 --- a/camel/providers/imap/camel-imap-store.h +++ b/camel/providers/imap/camel-imap-store.h @@ -35,7 +35,7 @@ extern "C" { #include #ifdef ENABLE_THREADS -#include +#include typedef struct _CamelImapMsg CamelImapMsg; diff --git a/camel/providers/imap/camel-imap-utils.c b/camel/providers/imap/camel-imap-utils.c index a557f7fcae..06028ef79d 100644 --- a/camel/providers/imap/camel-imap-utils.c +++ b/camel/providers/imap/camel-imap-utils.c @@ -30,6 +30,10 @@ #include #include #include +#include +#include +#include +#include #include "camel-imap-utils.h" #include "camel-imap-summary.h" @@ -40,6 +44,9 @@ #define d(x) +#define SUBFOLDER_DIR_NAME "subfolders" +#define SUBFOLDER_DIR_NAME_LEN 10 + const char * imap_next_word (const char *buf) { @@ -1263,3 +1270,160 @@ imap_mailbox_decode (const unsigned char *in, size_t inlen) return camel_utf7_utf8 (buf); } + +char * +imap_path_to_physical (const char *prefix, const char *vpath) +{ + const char *p, *newp; + char *dp; + char *ppath; + int ppath_len; + int prefix_len; + + while (*vpath == '/') + vpath++; + if (!prefix) + prefix = ""; + + /* Calculate the length of the real path. */ + ppath_len = strlen (vpath); + ppath_len++; /* For the ending zero. */ + + prefix_len = strlen (prefix); + ppath_len += prefix_len; + ppath_len++; /* For the separating slash. */ + + /* Take account of the fact that we need to translate every + * separator into `subfolders/'. + */ + p = vpath; + while (1) { + newp = strchr (p, '/'); + if (newp == NULL) + break; + + ppath_len += SUBFOLDER_DIR_NAME_LEN; + ppath_len++; /* For the separating slash. */ + + /* Skip consecutive slashes. */ + while (*newp == '/') + newp++; + + p = newp; + }; + + ppath = g_malloc (ppath_len); + dp = ppath; + + memcpy (dp, prefix, prefix_len); + dp += prefix_len; + *(dp++) = '/'; + + /* Copy the mangled path. */ + p = vpath; + while (1) { + newp = strchr (p, '/'); + 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++) = '/'; + + /* Skip consecutive slashes. */ + while (*newp == '/') + newp++; + + p = newp; + } + + return ppath; +} + +static gboolean +find_folders_recursive (const char *physical_path, const char *path, + IMAPPathFindFoldersCallback callback, gpointer data) +{ + DIR *dir; + char *subfolder_directory_path; + gboolean ok; + + if (*path) { + if (!callback (physical_path, path, data)) + return FALSE; + + subfolder_directory_path = g_strdup_printf ("%s/%s", physical_path, SUBFOLDER_DIR_NAME); + } else { + /* On the top level, we have no folders and, + * consequently, no subfolder directory. + */ + + subfolder_directory_path = g_strdup (physical_path); + } + + /* Now scan the subfolders and load them. */ + dir = opendir (subfolder_directory_path); + if (dir == NULL) { + g_free (subfolder_directory_path); + return TRUE; + } + + ok = TRUE; + while (ok) { + 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_strdup_printf ("%s/%s", subfolder_directory_path, + dirent->d_name); + + if (stat (file_path, &file_stat) < 0 || + ! S_ISDIR (file_stat.st_mode)) { + g_free (file_path); + continue; + } + + new_path = g_strdup_printf ("%s/%s", path, dirent->d_name); + + ok = find_folders_recursive (file_path, new_path, callback, data); + + g_free (file_path); + g_free (new_path); + } + + closedir (dir); + g_free (subfolder_directory_path); + + return ok; +} + +/** + * imap_path_find_folders: + * @prefix: directory to start from + * @callback: Callback to invoke on each folder + * @data: Data for @callback + * + * Walks the folder tree starting at @prefix and calls @callback + * on each folder. + * + * Return value: %TRUE on success, %FALSE if an error occurs at any point + **/ +gboolean +imap_path_find_folders (const char *prefix, IMAPPathFindFoldersCallback callback, gpointer data) +{ + return find_folders_recursive (prefix, "", callback, data); +} diff --git a/camel/providers/imap/camel-imap-utils.h b/camel/providers/imap/camel-imap-utils.h index e8f570137f..7278843a6b 100644 --- a/camel/providers/imap/camel-imap-utils.h +++ b/camel/providers/imap/camel-imap-utils.h @@ -88,6 +88,11 @@ char *imap_namespace_concat (CamelImapStore *store, const char *name); char *imap_mailbox_encode (const unsigned char *in, size_t inlen); char *imap_mailbox_decode (const unsigned char *in, size_t inlen); +typedef gboolean (*IMAPPathFindFoldersCallback) (const char *physical_path, const char *path, gpointer user_data); + +char *imap_path_to_physical (const char *prefix, const char *vpath); +gboolean imap_path_find_folders (const char *prefix, IMAPPathFindFoldersCallback callback, gpointer data); + #ifdef __cplusplus } #endif /* __cplusplus */ -- cgit v1.2.3