From 08cb892beab3ede04759a23e04b72e558de21cfb Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 9 Jun 2000 21:19:57 +0000 Subject: Updated to reflect changes made in camel-imap-store.c 2000-06-09 Jeffrey Stedfast * providers/imap/camel-imap-stream.c (stream_read): Updated to reflect changes made in camel-imap-store.c * providers/imap/camel-imap-store.c (imap_create): No longer checks to make sure a folder doesn't already exists (as this is no longer needed) (camel_imap_command): Now takes a CamelFolder argument so it can detect whether or not it needs to SELECT a folder or not (camel_imap_command_extended): Same. svn path=/trunk/; revision=3494 --- camel/providers/imap/camel-imap-folder.c | 68 +++++++++----------------------- camel/providers/imap/camel-imap-folder.h | 6 +-- camel/providers/imap/camel-imap-store.c | 66 ++++++++++++++++++++----------- camel/providers/imap/camel-imap-store.h | 6 +-- camel/providers/imap/camel-imap-stream.c | 1 + camel/providers/imap/camel-imap-stream.h | 5 +-- 6 files changed, 69 insertions(+), 83 deletions(-) (limited to 'camel/providers') diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index 3e60478783..722b6bbd9e 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -36,6 +36,7 @@ #include "camel-imap-folder.h" #include "camel-imap-store.h" +#include "camel-imap-stream.h" #include "string-utils.h" #include "camel-stream.h" #include "camel-stream-fs.h" @@ -178,11 +179,6 @@ camel_imap_folder_new (CamelStore *parent, CamelException *ex) static void imap_finalize (GtkObject *object) { - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (object); - - g_free (imap_folder->folder_file_path); - g_free (imap_folder->folder_dir_path); - GTK_OBJECT_CLASS (parent_class)->finalize (object); } @@ -191,7 +187,6 @@ imap_init (CamelFolder *folder, CamelStore *parent_store, CamelFolder *parent_fo const gchar *name, gchar separator, CamelException *ex) { CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - const gchar *root_dir_path; /* call parent method */ parent_class->init (folder, parent_store, parent_folder, name, separator, ex); @@ -219,25 +214,11 @@ imap_init (CamelFolder *folder, CamelStore *parent_store, CamelFolder *parent_fo imap_folder->summary = NULL; imap_folder->search = NULL; - - /* now set the name info */ - g_free (imap_folder->folder_file_path); - g_free (imap_folder->folder_dir_path); - g_free (imap_folder->index_file_path); - - root_dir_path = camel_imap_store_get_toplevel_dir (CAMEL_IMAP_STORE(folder->parent_store)); - - imap_folder->folder_file_path = g_strdup_printf ("%s/%s", root_dir_path, folder->full_name); -#if 0 - imap_folder->folder_dir_path = g_strdup_printf ("%s/%s.sdb", root_dir_path, folder->full_name); - imap_folder->index_file_path = g_strdup_printf ("%s/%s.ibex", root_dir_path, folder->full_name); -#endif } static void imap_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex) { - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); gchar *result; gint status; @@ -247,14 +228,14 @@ imap_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex) parent_class->open (folder, mode, ex); /* SELECT the IMAP mail spool */ - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), &result, - "SELECT %s", imap_folder->folder_file_path); + status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder, + &result, "SELECT %s", folder->full_name); if (status != CAMEL_IMAP_OK) { CamelService *service = CAMEL_SERVICE (folder->parent_store); camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, "Could not SELECT %s on IMAP server %s: %s.", - imap_folder->folder_file_path, + folder->full_name, service->url->host, status == CAMEL_IMAP_ERR ? result : "Unknown error"); @@ -274,20 +255,18 @@ imap_close (CamelFolder *folder, gboolean expunge, CamelException *ex) if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_NONE) parent_class->close (folder, expunge, ex); - } static void imap_expunge (CamelFolder *folder, CamelException *ex) { - /*CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);*/ gchar *result; gint status; g_return_if_fail (folder != NULL); - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), &result, - "EXPUNGE"); + status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder, + &result, "EXPUNGE"); if (status != CAMEL_IMAP_OK) { CamelService *service = CAMEL_SERVICE (folder->parent_store); @@ -308,24 +287,21 @@ static gboolean imap_exists (CamelFolder *folder, CamelException *ex) { /* make sure the folder exists */ - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); GPtrArray *lsub; gboolean exists = FALSE; int i, max; g_return_val_if_fail (folder != NULL, FALSE); - imap_folder = CAMEL_IMAP_FOLDER (folder); - /* check if the imap file path is determined */ - if (!imap_folder->folder_file_path) { + if (!folder->full_name) { camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID, "undetermined folder file path. Maybe use set_name ?"); return FALSE; } /* check if the imap dir path is determined */ - if (!imap_folder->folder_dir_path) { + if (!folder->full_name) { camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID, "undetermined folder directory path. Maybe use set_name ?"); return FALSE; @@ -337,7 +313,7 @@ imap_exists (CamelFolder *folder, CamelException *ex) /* look to see if any of those subfolders match... */ max = lsub->len; for (i = 0; i < max; i++) - if (!strcmp(g_ptr_array_index(lsub, i), imap_folder->folder_file_path)) + if (!strcmp(g_ptr_array_index(lsub, i), folder->full_name)) { exists = TRUE; break; @@ -348,13 +324,13 @@ imap_exists (CamelFolder *folder, CamelException *ex) return exists; } #endif + #if 0 static gboolean imap_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) { /* TODO: code this & what should this do? delete messages or the folder? */ CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - const gchar *folder_file_path, *folder_dir_path; gboolean folder_already_exists; g_return_val_if_fail (folder != NULL, FALSE); @@ -378,11 +354,7 @@ imap_delete (CamelFolder *folder, gboolean recurse, CamelException *ex) if (camel_exception_get_id (ex)) return FALSE; - /* get the paths of what we need to be deleted */ - folder_file_path = imap_folder->folder_file_path; - folder_dir_path = imap_folder->folder_file_path; - - if (!(folder_file_path || folder_dir_path)) { + if (!(folder->full_name || folder->name)) { camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID, "invalid folder path. Use set_name ?"); return FALSE; @@ -410,8 +382,8 @@ imap_get_message_count (CamelFolder *folder, CamelException *ex) if (imap_folder->count != -1) return imap_folder->count; - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), &result, - "STATUS %s (MESSAGES)", imap_folder->folder_file_path); + status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder, + &result, "STATUS %s (MESSAGES)", folder->full_name); if (status != CAMEL_IMAP_OK) { CamelService *service = CAMEL_SERVICE (folder->parent_store); @@ -445,7 +417,6 @@ imap_get_message_count (CamelFolder *folder, CamelException *ex) static void imap_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex) { - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); CamelStreamMem *mem; gchar *result; gint status; @@ -467,9 +438,9 @@ imap_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelExcept mem->buffer = g_byte_array_append(mem->buffer, g_strdup("\n"), 2); status = camel_imap_command(CAMEL_IMAP_STORE (folder->parent_store), - &result, + folder, &result, "APPEND %s (\\Seen) {%d}\r\n%s", - imap_folder->folder_file_path, + folder->full_name, mem->buffer->len, mem->buffer->data); @@ -520,8 +491,8 @@ imap_get_subfolder_names (CamelFolder *folder, CamelException *ex) if (imap_folder->count != -1) return g_ptr_array_new (); - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), &result, - "LSUB \"\" \"%s\"", imap_folder->folder_file_path); + status = camel_imap_command_extended(CAMEL_IMAP_STORE (folder->parent_store), folder, + &result, "LSUB \"\" \"%s\"", folder->full_name); if (status != CAMEL_IMAP_OK) { CamelService *service = CAMEL_SERVICE (folder->parent_store); @@ -580,11 +551,10 @@ imap_get_subfolder_names (CamelFolder *folder, CamelException *ex) static void imap_delete_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) { - /*CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);*/ gchar *result; gint status; - status = camel_imap_command_extended(CAMEL_IMAP_STORE (folder->parent_store), + status = camel_imap_command_extended(CAMEL_IMAP_STORE (folder->parent_store), folder, &result, "UID STORE %s +FLAGS.SILENT (\\Deleted)", uid); if (status != CAMEL_IMAP_OK) { @@ -670,7 +640,7 @@ imap_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException * g_assert(info->frompos != -1); /* get our message buffer */ - status = camel_imap_command_extended(CAMEL_IMAP_STORE (folder->parent_store), + status = camel_imap_command_extended(CAMEL_IMAP_STORE (folder->parent_store), folder, &result, "UID FETCH %s (FLAGS BODY[])", uid); if (status != CAMEL_IMAP_OK) { diff --git a/camel/providers/imap/camel-imap-folder.h b/camel/providers/imap/camel-imap-folder.h index 479a43c45c..1b7676b4f8 100644 --- a/camel/providers/imap/camel-imap-folder.h +++ b/camel/providers/imap/camel-imap-folder.h @@ -47,10 +47,6 @@ extern "C" { typedef struct { CamelFolder parent_object; - gchar *folder_file_path; /* contains the messages */ - gchar *folder_dir_path; /* contains the subfolders */ - gchar *index_file_path; /* index of body contents */ - ibex *index; /* index for this folder */ CamelImapSummary *summary; CamelFolderSearch *search; /* used to run searches, we just use the real thing (tm) */ @@ -78,3 +74,5 @@ GtkType camel_imap_folder_get_type (void); #endif /* __cplusplus */ #endif /* CAMEL_IMAP_FOLDER_H */ + + diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index 5c57a8911d..0bf8dd52e8 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -39,6 +39,7 @@ #include "camel-imap-store.h" #include "camel-imap-folder.h" +#include "camel-folder.h" #include "camel-exception.h" #include "camel-session.h" #include "camel-stream.h" @@ -272,9 +273,9 @@ imap_connect (CamelService *service, CamelException *ex) } g_free (buf); - status = camel_imap_command (store, &msg, "LOGIN \"%s\" \"%s\"", - service->url->user, - service->url->passwd); + status = camel_imap_command(store, NULL, &msg, "LOGIN \"%s\" \"%s\"", + service->url->user, + service->url->passwd); if (status != CAMEL_IMAP_OK) { camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, @@ -322,42 +323,29 @@ camel_imap_store_get_toplevel_dir (CamelImapStore *store) static gboolean imap_create (CamelFolder *folder, CamelException *ex) { - CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder); - const gchar *folder_file_path, *folder_dir_path; - gboolean folder_already_exists; gchar *result; gint status; g_return_val_if_fail (folder != NULL, FALSE); - /* get the paths of what we need to create */ - folder_file_path = imap_folder->folder_file_path; - folder_dir_path = imap_folder->folder_dir_path; - - if (!(folder_file_path || folder_dir_path)) { + if (!(folder->full_name || folder->name)) { camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID, "invalid folder path. Use set_name ?"); return FALSE; } - /* if the folder already exists, simply return */ - folder_already_exists = camel_folder_exists (folder, ex); - if (camel_exception_get_id (ex)) - return FALSE; - - if (folder_already_exists) + if (camel_folder_get_subfolder(folder->parent_folder, folder->name, FALSE, ex)) return TRUE; - /* create the directory for the subfolder */ - status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), &result, - "CREATE %s", imap_folder->folder_file_path); + /* create the directory for the subfolder */ + status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), NULL, + &result, "CREATE %s", folder->full_name); if (status != CAMEL_IMAP_OK) { CamelService *service = CAMEL_SERVICE (folder->parent_store); camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, "Could not CREATE %s on IMAP server %s: %s.", - imap_folder->folder_file_path, - service->url->host, + folder->full_name, service->url->host, status == CAMEL_IMAP_ERR ? result : "Unknown error"); g_free (result); @@ -414,13 +402,28 @@ get_folder_name (CamelStore *store, const char *folder_name, * result of the command.) **/ gint -camel_imap_command (CamelImapStore *store, char **ret, char *fmt, ...) +camel_imap_command (CamelImapStore *store, CamelFolder *folder, char **ret, char *fmt, ...) { gchar *cmdbuf, *respbuf; gchar *cmdid, *code; va_list ap; gint status; + if (folder && store->current_folder != folder && strncmp(fmt, "SELECT", 6) && + strncmp(fmt, "STATUS", 6) && strncmp(fmt, "CREATE", 5)) { + /* We need to select the correct mailbox first */ + char *r; + int s; + + s = camel_imap_command(store, folder, &r, "SELECT %s", folder->full_name); + if (s != CAMEL_IMAP_OK) { + *ret = r; + return s; + } + + store->current_folder = folder; + } + /* create the command */ cmdid = g_strdup_printf("A%.5d", store->command++); va_start (ap, fmt); @@ -500,7 +503,7 @@ camel_imap_command (CamelImapStore *store, char **ret, char *fmt, ...) **/ gint -camel_imap_command_extended (CamelImapStore *store, char **ret, char *fmt, ...) +camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **ret, char *fmt, ...) { CamelStreamBuffer *stream = CAMEL_STREAM_BUFFER (store->istream); GPtrArray *data; @@ -508,6 +511,21 @@ camel_imap_command_extended (CamelImapStore *store, char **ret, char *fmt, ...) va_list app; gint i, status = CAMEL_IMAP_OK; + if (folder && store->current_folder != folder && strncmp(fmt, "SELECT", 6) && + strncmp(fmt, "STATUS", 6) && strncmp(fmt, "CREATE", 5)) { + /* We need to select the correct mailbox first */ + char *r; + int s; + + s = camel_imap_command(store, folder, &r, "SELECT %s", folder->full_name); + if (s != CAMEL_IMAP_OK) { + *ret = r; + return s; + } + + store->current_folder = folder; + } + /* Create the command */ cmdid = g_strdup_printf("A%.5d", store->command++); va_start (app, fmt); diff --git a/camel/providers/imap/camel-imap-store.h b/camel/providers/imap/camel-imap-store.h index 5ea6eca09e..587415b153 100644 --- a/camel/providers/imap/camel-imap-store.h +++ b/camel/providers/imap/camel-imap-store.h @@ -3,7 +3,6 @@ /* * Authors: Jeffrey Stedfast - * Ross Golder * * Copyright (C) 2000 Helix Code, Inc. * @@ -45,6 +44,7 @@ extern "C" { typedef struct { CamelStore parent_object; + CamelFolder *current_folder; CamelStream *istream, *ostream; guint32 command; @@ -67,8 +67,8 @@ void camel_imap_store_close (CamelImapStore *store, gboolean expunge, enum { CAMEL_IMAP_OK, CAMEL_IMAP_ERR, CAMEL_IMAP_FAIL }; -gint camel_imap_command (CamelImapStore *store, char **ret, char *fmt, ...); -gint camel_imap_command_extended (CamelImapStore *store, char **ret, char *fmt, ...); +gint camel_imap_command (CamelImapStore *store, CamelFolder *folder, char **ret, char *fmt, ...); +gint camel_imap_command_extended (CamelImapStore *store, CamelFolder *folder, char **ret, char *fmt, ...); /* Standard Gtk function */ GtkType camel_imap_store_get_type (void); diff --git a/camel/providers/imap/camel-imap-stream.c b/camel/providers/imap/camel-imap-stream.c index f2400f4ce8..43b1afb61a 100644 --- a/camel/providers/imap/camel-imap-stream.c +++ b/camel/providers/imap/camel-imap-stream.c @@ -131,6 +131,7 @@ stream_read (CamelStream *stream, char *buffer, size_t n) gint status; status = camel_imap_command_extended(CAMEL_IMAP_STORE (folder->parent_store), + CAMEL_FOLDER (imap_stream->folder), &imap_stream->cache, "%s", imap_stream->command); diff --git a/camel/providers/imap/camel-imap-stream.h b/camel/providers/imap/camel-imap-stream.h index 6cb96e8cc5..2a6e2fc723 100644 --- a/camel/providers/imap/camel-imap-stream.h +++ b/camel/providers/imap/camel-imap-stream.h @@ -21,7 +21,6 @@ */ - #ifndef CAMEL_IMAP_STREAM_H #define CAMEL_IMAP_STREAM_H @@ -32,8 +31,8 @@ extern "C" { #endif /* __cplusplus }*/ #include -#include -#include +#include "camel-imap-folder.h" +#include "camel-imap-store.h" #include #define CAMEL_IMAP_STREAM_TYPE (camel_imap_stream_get_type ()) -- cgit v1.2.3