basically got IMAP into the tree view

svn path=/trunk/; revision=3643
This commit is contained in:
Jeffrey Stedfast
2000-06-20 04:57:39 +00:00
parent 12da85716e
commit 1ede35fcdd
7 changed files with 192 additions and 48 deletions

View File

@ -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>

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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:". */