basically got IMAP into the tree view
svn path=/trunk/; revision=3643
This commit is contained in:
@ -1,15 +1,23 @@
|
||||
2000-06-20 Jeffrey Stedfast <fejj@helixcode.com>
|
||||
|
||||
* providers/imap/camel-imap-folder.c: Added namespace stuff
|
||||
which we will need later on...
|
||||
(imap_parse_subfolder_line): Convenience function for use in
|
||||
get_subfolder_names()
|
||||
(imap_get_subfolder_names): Updated.
|
||||
|
||||
2000-06-19 Jeffrey Stedfast <fejj@helixcode.com>
|
||||
|
||||
* providers/imap/camel-imap-folder.c (camel_imap_folder_init):
|
||||
Set summary equal to NULL.
|
||||
* providers/imap/camel-imap-folder.c (camel_imap_folder_init): Set
|
||||
summary equal to NULL.
|
||||
(imap_get_summary): Store the summary in the ImapFolder
|
||||
(imap_summary_get_by_uid): If we have a summary cache in the
|
||||
ImapFolder, first check to see if that message info is in the
|
||||
cached summary first, if not fetch it directly from the IMAP
|
||||
server and append it to the summary cache.
|
||||
(imap_get_message_flags): Don't free the message info that we
|
||||
get back from summary_get_by_uid as we don't want to be
|
||||
corrupting our cached summary.
|
||||
(imap_get_message_flags): Don't free the message info that we get
|
||||
back from summary_get_by_uid as we don't want to be corrupting our
|
||||
cached summary.
|
||||
|
||||
2000-06-19 Peter Williams <peterw@curious-george.helixcode.com>
|
||||
|
||||
|
||||
@ -70,6 +70,7 @@ static gboolean imap_delete_messages (CamelFolder *folder, CamelException *ex);
|
||||
static gint imap_get_message_count (CamelFolder *folder, CamelException *ex);
|
||||
static void imap_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex);
|
||||
static GPtrArray *imap_get_uids (CamelFolder *folder, CamelException *ex);
|
||||
static gboolean imap_parse_subfolder_line (gchar *buf, gchar **flags, gchar **sep, gchar **folder);
|
||||
static GPtrArray *imap_get_subfolder_names (CamelFolder *folder, CamelException *ex);
|
||||
static GPtrArray *imap_get_summary (CamelFolder *folder, CamelException *ex);
|
||||
static void imap_free_summary (CamelFolder *folder, GPtrArray *array);
|
||||
@ -103,7 +104,6 @@ static gboolean imap_get_message_user_flag (CamelFolder *folder, const char *uid
|
||||
static void imap_set_message_user_flag (CamelFolder *folder, const char *uid, const char *name,
|
||||
gboolean value, CamelException *ex);
|
||||
|
||||
|
||||
static void
|
||||
camel_imap_folder_class_init (CamelImapFolderClass *camel_imap_folder_class)
|
||||
{
|
||||
@ -153,6 +153,7 @@ camel_imap_folder_init (gpointer object, gpointer klass)
|
||||
folder->has_summary_capability = TRUE;
|
||||
folder->has_search_capability = FALSE; /* default - we have to query IMAP to know for sure */
|
||||
|
||||
imap_folder->namespace = NULL;
|
||||
imap_folder->summary = NULL;
|
||||
imap_folder->count = -1;
|
||||
}
|
||||
@ -191,6 +192,19 @@ camel_imap_folder_new (CamelStore *parent, CamelException *ex)
|
||||
return folder;
|
||||
}
|
||||
|
||||
void
|
||||
camel_imap_folder_set_namespace (CamelFolder *folder, gchar *namespace)
|
||||
{
|
||||
CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
|
||||
g_return_if_fail (folder != NULL);
|
||||
g_return_if_fail (namespace != NULL);
|
||||
|
||||
if (imap_folder->namespace)
|
||||
g_free (imap_folder->namespace);
|
||||
|
||||
imap_folder->namespace = g_strdup (namespace);
|
||||
}
|
||||
|
||||
static void
|
||||
imap_finalize (GtkObject *object)
|
||||
{
|
||||
@ -254,6 +268,8 @@ imap_init (CamelFolder *folder, CamelStore *parent_store, CamelFolder *parent_fo
|
||||
|
||||
imap_folder->search = NULL;
|
||||
imap_folder->summary = NULL;
|
||||
if (!imap_folder->namespace)
|
||||
imap_folder->namespace = g_strdup("mail");
|
||||
|
||||
/* SELECT the IMAP mail spool */
|
||||
status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder,
|
||||
@ -502,21 +518,67 @@ imap_get_uids (CamelFolder *folder, CamelException *ex)
|
||||
return array;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
imap_parse_subfolder_line (gchar *buf, gchar **flags, gchar **sep, gchar **folder)
|
||||
{
|
||||
gchar *ptr, *eptr;
|
||||
|
||||
*flags = NULL;
|
||||
*sep = NULL;
|
||||
*folder = NULL;
|
||||
|
||||
if (strncasecmp (buf, "* LIST", 6))
|
||||
return FALSE;
|
||||
|
||||
ptr = strstr (buf + 6, "(");
|
||||
if (!ptr)
|
||||
return FALSE;
|
||||
|
||||
ptr++;
|
||||
eptr = strstr (ptr, ")");
|
||||
if (!eptr)
|
||||
return FALSE;
|
||||
|
||||
*flags = g_strndup (ptr, (gint)(eptr - ptr));
|
||||
|
||||
ptr = strstr (eptr, "\"");
|
||||
if (!ptr)
|
||||
return FALSE;
|
||||
|
||||
ptr++;
|
||||
eptr = strstr (ptr, "\"");
|
||||
if (!eptr)
|
||||
return FALSE;
|
||||
|
||||
*sep = g_strndup (ptr, (gint)(eptr - ptr));
|
||||
|
||||
ptr = eptr + 1;
|
||||
*folder = g_strdup (ptr);
|
||||
g_strstrip (*folder);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GPtrArray *
|
||||
imap_get_subfolder_names (CamelFolder *folder, CamelException *ex)
|
||||
{
|
||||
CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
|
||||
GPtrArray *listing;
|
||||
gint status;
|
||||
gchar *result;
|
||||
gchar *result, *fname;
|
||||
|
||||
g_return_val_if_fail (folder != NULL, g_ptr_array_new());
|
||||
|
||||
if (imap_folder->count != -1)
|
||||
return g_ptr_array_new ();
|
||||
|
||||
if (!strcmp (folder->full_name, "INBOX"))
|
||||
fname = imap_folder->namespace;
|
||||
else
|
||||
fname = folder->full_name;
|
||||
|
||||
status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder,
|
||||
&result, "LSUB \"\" \"%s\"", folder->full_name);
|
||||
&result, "LIST \"\" \"%s/*\"", fname);
|
||||
|
||||
if (status != CAMEL_IMAP_OK) {
|
||||
CamelService *service = CAMEL_SERVICE (folder->parent_store);
|
||||
@ -531,40 +593,43 @@ imap_get_subfolder_names (CamelFolder *folder, CamelException *ex)
|
||||
|
||||
/* parse out the subfolders */
|
||||
listing = g_ptr_array_new ();
|
||||
g_ptr_array_add (listing, g_strdup("INBOX"));
|
||||
/*g_ptr_array_add (listing, g_strdup("INBOX"));*/
|
||||
if (result) {
|
||||
char *ptr = result;
|
||||
|
||||
while (*ptr == '*') {
|
||||
gchar *flags, *end, *dir_sep, *param = NULL;
|
||||
while (ptr && *ptr == '*') {
|
||||
gchar *flags, *sep, *folder, *buf, *end, *f;
|
||||
gboolean ret;
|
||||
|
||||
ptr = flags = strchr (ptr, '(') + 1; /* jump to the flags section */
|
||||
end = strchr (flags, ')'); /* locate end of flags */
|
||||
flags = g_strndup(flags, (gint)(end - flags));
|
||||
for (end = ptr; *end && *end != '\n'; end++);
|
||||
buf = g_strndup (ptr, (gint)(end - ptr));
|
||||
ptr = end;
|
||||
|
||||
if (strstr (flags, "\\NoSelect")) {
|
||||
ret = imap_parse_subfolder_line (buf, &flags, &sep, &folder);
|
||||
g_free (buf);
|
||||
|
||||
if (!ret || (flags && strstr (flags, "NoSelect"))) {
|
||||
g_free (flags);
|
||||
g_free (sep);
|
||||
g_free (folder);
|
||||
|
||||
if (*ptr == '\n')
|
||||
ptr++;
|
||||
|
||||
continue;
|
||||
}
|
||||
g_free (flags);
|
||||
|
||||
ptr = dir_sep = strchr (ptr, '"') + 1; /* jump to the first param */
|
||||
end = strchr (param, '"'); /* locate the end of the param */
|
||||
dir_sep = g_strndup (dir_sep, (gint)(end - param));
|
||||
f = folder + strlen (fname) + 1;
|
||||
memmove (folder, f, strlen (f) + 1);
|
||||
printf ("adding folder: %s\n", folder);
|
||||
|
||||
g_ptr_array_add (listing, folder);
|
||||
|
||||
/* skip to the actual directory parameter */
|
||||
for (ptr = end++; *ptr == ' '; ptr++);
|
||||
for (end = ptr; *end && *end != '\n'; end++);
|
||||
param = g_strndup (ptr, (gint)(end - ptr));
|
||||
|
||||
g_ptr_array_add (listing, param);
|
||||
|
||||
g_free (dir_sep); /* TODO: decide if we really need dir_sep */
|
||||
|
||||
if (*end)
|
||||
ptr = end + 1;
|
||||
else
|
||||
ptr = end;
|
||||
g_free (sep); /* TODO: decide if we really need dir_sep */
|
||||
|
||||
if (*ptr == '\n')
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
g_free(result);
|
||||
@ -675,8 +740,6 @@ get_header_field (gchar *header, gchar *field)
|
||||
GPtrArray *
|
||||
imap_get_summary (CamelFolder *folder, CamelException *ex)
|
||||
{
|
||||
/* FIXME: we leak mem here if the summary already exists
|
||||
* Q: where do we want to free the pre-existing summary? */
|
||||
CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
|
||||
GPtrArray *array = NULL;
|
||||
CamelMessageInfo *info;
|
||||
|
||||
@ -47,6 +47,7 @@ typedef struct {
|
||||
|
||||
CamelFolderSearch *search; /* used to run searches */
|
||||
GPtrArray *summary;
|
||||
gchar *namespace;
|
||||
gint count;
|
||||
} CamelImapFolder;
|
||||
|
||||
@ -61,6 +62,7 @@ typedef struct {
|
||||
|
||||
/* public methods */
|
||||
CamelFolder *camel_imap_folder_new (CamelStore *parent, CamelException *ex);
|
||||
void camel_imap_folder_set_namespace (CamelFolder *folder, gchar *namespace);
|
||||
|
||||
/* Standard Gtk function */
|
||||
GtkType camel_imap_folder_get_type (void);
|
||||
|
||||
@ -556,6 +556,7 @@ camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **
|
||||
respbuf = camel_stream_buffer_read_line (stream);
|
||||
if (!respbuf || !strncmp(respbuf, cmdid, strlen(cmdid)) ) {
|
||||
/* IMAP's last response starts with our command id */
|
||||
fprintf(stderr, "received: %s\n", respbuf ? respbuf : "(null)");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@ -1,3 +1,8 @@
|
||||
2000-06-20 Jeffrey Stedfast <fejj@helixcode.com>
|
||||
|
||||
* component-factory.c (create_imap_storage): Now creates the IMAP
|
||||
storage (listing subfolders and such)
|
||||
|
||||
2000-06-19 Dan Winship <danw@helixcode.com>
|
||||
|
||||
* mail-format.c (find_preferred_alternative): add an option to
|
||||
|
||||
@ -27,6 +27,8 @@
|
||||
|
||||
#include <bonobo.h>
|
||||
|
||||
#include "camel.h"
|
||||
|
||||
#include "Evolution.h"
|
||||
#include "evolution-storage.h"
|
||||
|
||||
@ -39,7 +41,7 @@
|
||||
#include "component-factory.h"
|
||||
|
||||
static void create_vfolder_storage (EvolutionShellComponent *shell_component);
|
||||
/*static void create_imap_storage (EvolutionShellComponent *shell_component);*/
|
||||
static void create_imap_storage (EvolutionShellComponent *shell_component);
|
||||
|
||||
#ifdef USING_OAF
|
||||
#define COMPONENT_FACTORY_ID "OAFIID:evolution-shell-component-factory:evolution-mail:0ea887d5-622b-4b8c-b525-18aa1cbe18a6"
|
||||
@ -83,8 +85,8 @@ create_view (EvolutionShellComponent *shell_component,
|
||||
browsers = g_list_prepend (browsers, folder_browser_widget);
|
||||
|
||||
/* dum de dum, hack to let the folder browser know the storage its in */
|
||||
gtk_object_set_data(GTK_OBJECT (folder_browser_widget), "e-storage",
|
||||
gtk_object_get_data(GTK_OBJECT (shell_component), "e-storage"));
|
||||
gtk_object_set_data (GTK_OBJECT (folder_browser_widget), "e-storage",
|
||||
gtk_object_get_data(GTK_OBJECT (shell_component), "e-storage"));
|
||||
|
||||
*control_return = control;
|
||||
|
||||
@ -104,9 +106,7 @@ create_folder (EvolutionShellComponent *shell_component,
|
||||
|
||||
CORBA_exception_init (&ev);
|
||||
|
||||
Evolution_ShellComponentListener_report_result (listener,
|
||||
Evolution_ShellComponentListener_OK,
|
||||
&ev);
|
||||
Evolution_ShellComponentListener_report_result (listener, Evolution_ShellComponentListener_OK, &ev);
|
||||
|
||||
CORBA_exception_free (&ev);
|
||||
}
|
||||
@ -119,6 +119,7 @@ owner_set_cb (EvolutionShellComponent *shell_component,
|
||||
g_print ("evolution-mail: Yeeeh! We have an owner!\n"); /* FIXME */
|
||||
|
||||
create_vfolder_storage (shell_component);
|
||||
create_imap_storage (shell_component);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -245,28 +246,86 @@ create_vfolder_storage (EvolutionShellComponent *shell_component)
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
create_imap_storage (EvolutionShellComponent *shell_component)
|
||||
{
|
||||
/* FIXME: KLUDGE! */
|
||||
extern gchar *evolution_dir;
|
||||
Evolution_Shell corba_shell;
|
||||
EvolutionStorage *storage;
|
||||
char *path, *source, *server, *p;
|
||||
CamelStore *store;
|
||||
CamelFolder *folder;
|
||||
CamelException *ex;
|
||||
GPtrArray *lsub;
|
||||
int i, max;
|
||||
|
||||
path = g_strdup_printf ("=%s/config=/mail/source", evolution_dir);
|
||||
source = gnome_config_get_string (path);
|
||||
g_free (path);
|
||||
|
||||
if (strncasecmp (source, "imap://", 7))
|
||||
return;
|
||||
|
||||
corba_shell = evolution_shell_component_get_owner (shell_component);
|
||||
if (corba_shell == CORBA_OBJECT_NIL) {
|
||||
g_warning ("We have no shell!?");
|
||||
return;
|
||||
}
|
||||
|
||||
storage = evolution_storage_new ("IMAP Folders");
|
||||
|
||||
if (!(server = strchr (source, '@')))
|
||||
return;
|
||||
server++;
|
||||
for (p = server; *p && *p != '/'; p++);
|
||||
|
||||
server = g_strndup (server, (gint)(p - server));
|
||||
|
||||
storage = evolution_storage_new (server);
|
||||
g_free (server);
|
||||
|
||||
if (evolution_storage_register_on_shell (storage, corba_shell) != EVOLUTION_STORAGE_OK) {
|
||||
g_warning ("Cannot register storage");
|
||||
return;
|
||||
}
|
||||
|
||||
/* save the storage for later */
|
||||
gtk_object_set_data(GTK_OBJECT (shell_component), "e-storage", storage);
|
||||
gtk_object_set_data (GTK_OBJECT (shell_component), "e-storage", storage);
|
||||
|
||||
ex = camel_exception_new ();
|
||||
|
||||
store = camel_session_get_store (session, source, ex);
|
||||
if (!store) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
camel_service_connect (CAMEL_SERVICE (store), ex);
|
||||
if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
evolution_storage_new_folder (storage, "name", "mail", "some string or other", "description");
|
||||
folder = camel_store_get_root_folder (store, ex);
|
||||
if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* we need a way to set the namespace */
|
||||
lsub = camel_folder_get_subfolder_names (folder, ex);
|
||||
|
||||
evolution_storage_new_folder (storage, "/INBOX", "mail", source, "description");
|
||||
|
||||
max = lsub->len;
|
||||
fprintf (stderr, "\n************* We have %d folders\n\n", max + 1);
|
||||
for (i = 0; i < max; i++) {
|
||||
char *path;
|
||||
|
||||
path = g_strdup_printf ("/%s", (char *)lsub->pdata[i]);
|
||||
g_print ("Adding %s\n", path);
|
||||
evolution_storage_new_folder (storage, path, "mail", source, "description");
|
||||
}
|
||||
|
||||
cleanup:
|
||||
camel_exception_free (ex);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
@ -102,13 +102,19 @@ folder_browser_load_folder (FolderBrowser *fb, const char *name)
|
||||
|
||||
} else if (!strncmp(name, "imap:", 5)) {
|
||||
/* uhm, I'm just guessing here - this code might be wrong */
|
||||
fprintf(stderr, "\n*** name = %s ***\n\n", name);
|
||||
fprintf (stderr, "\n****** name = %s ******\n\n", name);
|
||||
store = camel_session_get_store (session, name, ex);
|
||||
if (store) {
|
||||
char *folder_name;
|
||||
|
||||
folder_name = name += 5;
|
||||
new_folder = camel_store_get_folder (store, folder_name, TRUE, ex);
|
||||
folder_name = strstr (name, "//");
|
||||
if (folder_name) {
|
||||
for (folder_name += 2; *folder_name && *folder_name != '/'; folder_name++);
|
||||
if (*folder_name) {
|
||||
folder_name++;
|
||||
new_folder = camel_store_get_folder (store, folder_name, TRUE, ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (!strncmp(name, "file:", 5)) {
|
||||
/* Change "file:" to "mbox:". */
|
||||
|
||||
Reference in New Issue
Block a user