Remove expunged messages from the cache.
2004-11-01 Jeffrey Stedfast <fejj@novell.com> * providers/imap4/camel-imap4-summary.c (camel_imap4_summary_expunge): Remove expunged messages from the cache. (camel_imap4_summary_set_uidvalidity): Clear the cache if the UIDVALIDITY has changed. * providers/imap4/camel-imap4-folder.c (imap4_get_message): If the message exists in the cache, use that rather than fetching it from the server and cache messages fetched from the server for later use. (camel_imap4_folder_finalize): Unref the cache if non-NULL. (camel_imap4_folder_new): Create the CamelDataCache. svn path=/trunk/; revision=27784
This commit is contained in:
committed by
Jeffrey Stedfast
parent
588322d706
commit
c611fef686
@ -1,5 +1,18 @@
|
||||
2004-11-01 Jeffrey Stedfast <fejj@novell.com>
|
||||
|
||||
* providers/imap4/camel-imap4-summary.c
|
||||
(camel_imap4_summary_expunge): Remove expunged messages from the
|
||||
cache.
|
||||
(camel_imap4_summary_set_uidvalidity): Clear the cache if the
|
||||
UIDVALIDITY has changed.
|
||||
|
||||
* providers/imap4/camel-imap4-folder.c (imap4_get_message): If the
|
||||
message exists in the cache, use that rather than fetching it from
|
||||
the server and cache messages fetched from the server for later
|
||||
use.
|
||||
(camel_imap4_folder_finalize): Unref the cache if non-NULL.
|
||||
(camel_imap4_folder_new): Create the CamelDataCache.
|
||||
|
||||
* providers/imap4/camel-imap4-store.c (imap4_create_folder): Cache
|
||||
the folder-info on the summary if successful.
|
||||
(imap4_delete_folder): Un-cache the folder-info from the summary.
|
||||
|
||||
@ -129,6 +129,9 @@ camel_imap4_folder_finalize (CamelObject *object)
|
||||
|
||||
camel_object_unref (folder->search);
|
||||
|
||||
if (folder->cache)
|
||||
camel_object_unref (folder->cache);
|
||||
|
||||
g_free (folder->utf7_name);
|
||||
g_free (folder->cachedir);
|
||||
}
|
||||
@ -237,6 +240,8 @@ camel_imap4_folder_new (CamelStore *store, const char *full_name, CamelException
|
||||
imap_folder->cachedir = imap_store_build_filename (store, folder->full_name);
|
||||
camel_mkdir (imap_folder->cachedir, 0777);
|
||||
|
||||
imap_folder->cache = camel_data_cache_new (imap_folder->cachedir, 0, NULL);
|
||||
|
||||
path = imap_get_summary_filename (imap_folder->cachedir);
|
||||
camel_folder_summary_set_filename (folder->summary, path);
|
||||
g_free (path);
|
||||
@ -635,16 +640,47 @@ static CamelMimeMessage *
|
||||
imap4_get_message (CamelFolder *folder, const char *uid, CamelException *ex)
|
||||
{
|
||||
CamelIMAP4Engine *engine = ((CamelIMAP4Store *) folder->parent_store)->engine;
|
||||
CamelSession *session = ((CamelService *) folder->parent_store)->session;
|
||||
CamelIMAP4Folder *imap_folder = (CamelIMAP4Folder *) folder;
|
||||
CamelMimeMessage *message = NULL;
|
||||
CamelStream *stream, *cache;
|
||||
CamelIMAP4Command *ic;
|
||||
CamelStream *stream;
|
||||
int id;
|
||||
|
||||
CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock);
|
||||
|
||||
/* FIXME: try to pull the message from the cache first. if
|
||||
* that fails and we are offline, we're done. else do the
|
||||
* following code */
|
||||
if (imap_folder->cache && (stream = camel_data_cache_get (imap_folder->cache, "cache", uid, ex))) {
|
||||
message = camel_mime_message_new ();
|
||||
|
||||
if (camel_data_wrapper_construct_from_stream ((CamelDataWrapper *) message, stream) == -1) {
|
||||
if (errno == EINTR) {
|
||||
CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
|
||||
camel_exception_setv (ex, CAMEL_EXCEPTION_USER_CANCEL, _("User cancelled"));
|
||||
camel_object_unref (message);
|
||||
camel_object_unref (stream);
|
||||
return NULL;
|
||||
} else {
|
||||
camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot get message %s: %s"),
|
||||
uid, g_strerror (errno));
|
||||
camel_object_unref (message);
|
||||
message = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
camel_object_unref (stream);
|
||||
}
|
||||
|
||||
if (message != NULL) {
|
||||
CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
|
||||
return message;
|
||||
}
|
||||
|
||||
if (!camel_session_is_online (session)) {
|
||||
CAMEL_SERVICE_UNLOCK (folder->parent_store, connect_lock);
|
||||
camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
|
||||
_("This message is not available in offline mode."));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Note: While some hard-core IMAP extremists are probably
|
||||
* going to flame me for fetching entire messages here, it's
|
||||
@ -682,6 +718,16 @@ imap4_get_message (CamelFolder *folder, const char *uid, CamelException *ex)
|
||||
camel_stream_reset (stream);
|
||||
message = camel_mime_message_new ();
|
||||
camel_data_wrapper_construct_from_stream ((CamelDataWrapper *) message, stream);
|
||||
camel_stream_reset (stream);
|
||||
|
||||
/* cache the message locally */
|
||||
if (imap_folder->cache && (cache = camel_data_cache_add (imap_folder->cache, "cache", uid, NULL))) {
|
||||
if (camel_stream_write_to_stream (stream, cache) == -1
|
||||
|| camel_stream_flush (cache) == -1)
|
||||
camel_data_cache_remove (imap_folder->cache, "cache", uid, NULL);
|
||||
camel_object_unref (cache);
|
||||
}
|
||||
|
||||
break;
|
||||
case CAMEL_IMAP4_RESULT_NO:
|
||||
/* FIXME: would be good to save the NO reason into the err message */
|
||||
|
||||
@ -23,6 +23,7 @@
|
||||
|
||||
#include <camel/camel-store.h>
|
||||
#include <camel/camel-folder.h>
|
||||
#include <camel/camel-data-cache.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -43,6 +44,7 @@ struct _CamelIMAP4Folder {
|
||||
CamelFolder parent_object;
|
||||
|
||||
CamelFolderSearch *search;
|
||||
CamelDataCache *cache;
|
||||
|
||||
char *cachedir;
|
||||
char *utf7_name;
|
||||
|
||||
@ -1165,10 +1165,7 @@ imap4_get_folder_info (CamelStore *store, const char *top, guint32 flags, CamelE
|
||||
CAMEL_SERVICE_LOCK (store, connect_lock);
|
||||
|
||||
if (!camel_session_is_online (session) || engine->state == CAMEL_IMAP4_ENGINE_DISCONNECTED) {
|
||||
fprintf (stderr, "****************************************************\n");
|
||||
fprintf (stderr, "*** Getting folder info in disconnected state... ***\n");
|
||||
fi = camel_imap4_store_summary_get_folder_info (((CamelIMAP4Store *) store)->summary, top, flags);
|
||||
fprintf (stderr, "****************************************************\n");
|
||||
if (fi == NULL && camel_session_is_online (session)) {
|
||||
/* folder info hasn't yet been cached and the store hasn't been
|
||||
* connected yet, but the network is available so we can connect
|
||||
|
||||
@ -1161,6 +1161,7 @@ camel_imap4_summary_set_uidvalidity (CamelFolderSummary *summary, guint32 uidval
|
||||
}
|
||||
|
||||
camel_folder_summary_clear (summary);
|
||||
camel_data_cache_clear (((CamelIMAP4Folder *) imap4_summary->folder)->cache, "cache", NULL);
|
||||
|
||||
if (camel_folder_change_info_changed (changes))
|
||||
camel_object_trigger_event (imap4_summary->folder, "folder_changed", changes);
|
||||
@ -1177,6 +1178,7 @@ camel_imap4_summary_expunge (CamelFolderSummary *summary, int seqid)
|
||||
CamelIMAP4Summary *imap4_summary = (CamelIMAP4Summary *) summary;
|
||||
CamelFolderChangeInfo *changes;
|
||||
CamelMessageInfo *info;
|
||||
const char *uid;
|
||||
|
||||
g_return_if_fail (CAMEL_IS_IMAP4_SUMMARY (summary));
|
||||
|
||||
@ -1186,8 +1188,11 @@ camel_imap4_summary_expunge (CamelFolderSummary *summary, int seqid)
|
||||
|
||||
imap4_summary->exists--;
|
||||
|
||||
uid = camel_message_info_uid (info);
|
||||
camel_data_cache_remove (((CamelIMAP4Folder *) imap4_summary->folder)->cache, "cache", uid, NULL);
|
||||
|
||||
changes = camel_folder_change_info_new ();
|
||||
camel_folder_change_info_remove_uid (changes, camel_message_info_uid (info));
|
||||
camel_folder_change_info_remove_uid (changes, uid);
|
||||
|
||||
camel_folder_summary_info_free (summary, info);
|
||||
camel_folder_summary_remove_index (summary, seqid);
|
||||
|
||||
Reference in New Issue
Block a user