aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/imap
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2004-12-03 11:36:57 +0800
committerMichael Zucci <zucchi@src.gnome.org>2004-12-03 11:36:57 +0800
commitc83477345fa5dceb62b85efd0a76a54f94a78858 (patch)
treeaaea668a8d4f768b96174ad81aca864983addd0c /camel/providers/imap
parent300ec3f74d9f2ea59503ad267c927723ea59fd3e (diff)
downloadgsoc2013-evolution-c83477345fa5dceb62b85efd0a76a54f94a78858.tar
gsoc2013-evolution-c83477345fa5dceb62b85efd0a76a54f94a78858.tar.gz
gsoc2013-evolution-c83477345fa5dceb62b85efd0a76a54f94a78858.tar.bz2
gsoc2013-evolution-c83477345fa5dceb62b85efd0a76a54f94a78858.tar.lz
gsoc2013-evolution-c83477345fa5dceb62b85efd0a76a54f94a78858.tar.xz
gsoc2013-evolution-c83477345fa5dceb62b85efd0a76a54f94a78858.tar.zst
gsoc2013-evolution-c83477345fa5dceb62b85efd0a76a54f94a78858.zip
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 <NotZed@Ximian.com> * 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
Diffstat (limited to 'camel/providers/imap')
-rw-r--r--camel/providers/imap/Makefile.am10
-rw-r--r--camel/providers/imap/camel-imap-folder.c6
-rw-r--r--camel/providers/imap/camel-imap-private.h2
-rw-r--r--camel/providers/imap/camel-imap-search.c2
-rw-r--r--camel/providers/imap/camel-imap-search.h2
-rw-r--r--camel/providers/imap/camel-imap-store-summary.c4
-rw-r--r--camel/providers/imap/camel-imap-store.c17
-rw-r--r--camel/providers/imap/camel-imap-store.h2
-rw-r--r--camel/providers/imap/camel-imap-utils.c164
-rw-r--r--camel/providers/imap/camel-imap-utils.h5
10 files changed, 189 insertions, 25 deletions
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 <fcntl.h>
#include <ctype.h>
-#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 <camel/camel-folder-search.h>
-#include <e-util/e-msgport.h>
+#include <libedataserver/e-msgport.h>
#include <camel/camel-data-cache.h>
#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 <unistd.h>
#include <errno.h>
-#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 <camel/camel-disco-store.h>
#ifdef ENABLE_THREADS
-#include <e-util/e-msgport.h>
+#include <libedataserver/e-msgport.h>
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 <string.h>
#include <time.h>
#include <errno.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <unistd.h>
#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 */