summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2001-07-13 15:06:14 +0000
committerJeffrey Stedfast <fejj@src.gnome.org>2001-07-13 15:06:14 +0000
commit4766fc394b5f36521808811210a1fb56f2936f26 (patch)
treee58afe5c9d83fb5f17df56f74f7faf5f94f214b1
parent5b8757431b80a46783ba684fd969c8e6aa1fa36c (diff)
downloadevolution-data-server-4766fc394b5f36521808811210a1fb56f2936f26.tar.gz
We now use a structure as the bucket data rather than just a cache level
2001-07-13 Jeffrey Stedfast <fejj@ximian.com> * camel-uid-cache.c (camel_uid_cache_new): We now use a structure as the bucket data rather than just a cache level so set the save state to TRUE. (maybe_write_uid): We only save the uid if the cache levels are the same *and* if the save state is TRUE. (free_uid): Free the state value. (camel_uid_cache_get_new_uids): New uids that get added to the cache start with a save state of FALSE. (camel_uid_cache_save_uid): Set the save state of the uid to TRUE. What should we do if the uid isn't already in the cache? Currently I make it add the uid, but maybe it shouldn't? * providers/imap/camel-imap-folder.c (imap_filter_timeout): Update to reflect CamelFilterDriver API changes. * camel-filter-driver.c (camel_filter_driver_filter_folder): Take a cache argument so we can tell the cache whether or not the uid should be saved (meaning we have successfully filtered it).
-rw-r--r--camel/ChangeLog21
-rw-r--r--camel/camel-filter-driver.c6
-rw-r--r--camel/camel-filter-driver.h13
-rw-r--r--camel/camel-uid-cache.c88
-rw-r--r--camel/camel-uid-cache.h7
-rw-r--r--camel/providers/imap/camel-imap-folder.c3
6 files changed, 106 insertions, 32 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 20da6bff9..d5760cc10 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,24 @@
+2001-07-13 Jeffrey Stedfast <fejj@ximian.com>
+
+ * camel-uid-cache.c (camel_uid_cache_new): We now use a structure
+ as the bucket data rather than just a cache level so set the save
+ state to TRUE.
+ (maybe_write_uid): We only save the uid if the cache levels are
+ the same *and* if the save state is TRUE.
+ (free_uid): Free the state value.
+ (camel_uid_cache_get_new_uids): New uids that get added to the
+ cache start with a save state of FALSE.
+ (camel_uid_cache_save_uid): Set the save state of the uid to
+ TRUE. What should we do if the uid isn't already in the cache?
+ Currently I make it add the uid, but maybe it shouldn't?
+
+ * providers/imap/camel-imap-folder.c (imap_filter_timeout): Update
+ to reflect CamelFilterDriver API changes.
+
+ * camel-filter-driver.c (camel_filter_driver_filter_folder): Take
+ a cache argument so we can tell the cache whether or not the uid
+ should be saved (meaning we have successfully filtered it).
+
2001-07-12 Jeffrey Stedfast <fejj@ximian.com>
* camel-filter-driver.c (camel_filter_driver_filter_message):
diff --git a/camel/camel-filter-driver.c b/camel/camel-filter-driver.c
index 6ecc4bffc..c77c2d90b 100644
--- a/camel/camel-filter-driver.c
+++ b/camel/camel-filter-driver.c
@@ -712,6 +712,7 @@ fail:
* camel_filter_driver_filter_folder:
* @driver: CamelFilterDriver
* @folder: CamelFolder to be filtered
+ * @cache: UID cache (needed for POP folders)
* @uids: message uids to be filtered or NULL (as a shortcut to filter all messages)
* @remove: TRUE to mark filtered messages as deleted
* @ex: exception
@@ -724,7 +725,7 @@ fail:
*
**/
int
-camel_filter_driver_filter_folder (CamelFilterDriver *driver, CamelFolder *folder,
+camel_filter_driver_filter_folder (CamelFilterDriver *driver, CamelFolder *folder, CamelUIDCache *cache,
GPtrArray *uids, gboolean remove, CamelException *ex)
{
struct _CamelFilterDriverPrivate *p = _PRIVATE (driver);
@@ -793,6 +794,9 @@ camel_filter_driver_filter_folder (CamelFilterDriver *driver, CamelFolder *folde
CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN,
CAMEL_MESSAGE_DELETED | CAMEL_MESSAGE_SEEN);
+ if (cache)
+ camel_uid_cache_save_uid (cache, uids->pdata[i]);
+
camel_object_unref (CAMEL_OBJECT (message));
}
diff --git a/camel/camel-filter-driver.h b/camel/camel-filter-driver.h
index 7f4f3f7f1..ff7028a89 100644
--- a/camel/camel-filter-driver.h
+++ b/camel/camel-filter-driver.h
@@ -27,6 +27,7 @@
#include <camel/camel-object.h>
#include <camel/camel-session.h>
#include <camel/camel-folder.h>
+#include <camel/camel-uid-cache.h>
#define CAMEL_FILTER_DRIVER_TYPE (camel_filter_driver_get_type())
#define CAMEL_FILTER_DRIVER(obj) CAMEL_CHECK_CAST (obj, camel_filter_driver_get_type (), CamelFilterDriver)
@@ -75,11 +76,13 @@ void camel_filter_driver_add_rule (CamelFilterDriver *d, const char *name, con
int camel_filter_driver_filter_message (CamelFilterDriver *driver, CamelMimeMessage *message,
CamelMessageInfo *info, const char *uri,
- CamelFolder *source, const char *source_url, const char *original_source_url,
- CamelException *ex);
-int camel_filter_driver_filter_mbox (CamelFilterDriver *driver, const char *mbox, const char *original_source_url,
- CamelException *ex);
-int camel_filter_driver_filter_folder (CamelFilterDriver *driver, CamelFolder *folder,
+ CamelFolder *source, const char *source_url,
+ const char *original_source_url, CamelException *ex);
+
+int camel_filter_driver_filter_mbox (CamelFilterDriver *driver, const char *mbox,
+ const char *original_source_url, CamelException *ex);
+
+int camel_filter_driver_filter_folder (CamelFilterDriver *driver, CamelFolder *folder, CamelUIDCache *cache,
GPtrArray *uids, gboolean remove, CamelException *ex);
#if 0
diff --git a/camel/camel-uid-cache.c b/camel/camel-uid-cache.c
index 83305c1fd..37cbde311 100644
--- a/camel/camel-uid-cache.c
+++ b/camel/camel-uid-cache.c
@@ -35,6 +35,11 @@
#include "camel-uid-cache.h"
+struct _uid_state {
+ int level;
+ gboolean save;
+};
+
static void free_uid (gpointer key, gpointer value, gpointer data);
static void maybe_write_uid (gpointer key, gpointer value, gpointer data);
@@ -55,37 +60,42 @@ camel_uid_cache_new (const char *filename)
struct stat st;
char *buf, **uids;
int fd, i;
-
+
fd = open (filename, O_RDWR | O_CREAT, 0700);
if (fd == -1)
return NULL;
-
+
if (fstat (fd, &st) != 0) {
close (fd);
return NULL;
}
buf = g_malloc (st.st_size + 1);
-
+
if (read (fd, buf, st.st_size) == -1) {
close (fd);
g_free (buf);
return NULL;
}
buf[st.st_size] = '\0';
-
+
cache = g_new (CamelUIDCache, 1);
cache->fd = fd;
cache->level = 1;
cache->uids = g_hash_table_new (g_str_hash, g_str_equal);
-
+
uids = g_strsplit (buf, "\n", 0);
g_free (buf);
for (i = 0; uids[i]; i++) {
- g_hash_table_insert (cache->uids, uids[i],
- GINT_TO_POINTER (cache->level));
+ struct _uid_state *state;
+
+ state = g_new (struct _uid_state, 1);
+ state->level = cache->level;
+ state->save = TRUE;
+
+ g_hash_table_insert (cache->uids, uids[i], state);
}
g_free (uids);
-
+
return cache;
}
@@ -110,13 +120,15 @@ static void
maybe_write_uid (gpointer key, gpointer value, gpointer data)
{
CamelUIDCache *cache = data;
-
- if (GPOINTER_TO_INT (value) == cache->level) {
+ struct _uid_state *state = value;
+
+ if (state && state->level == cache->level && state->save) {
write (cache->fd, key, strlen (key));
write (cache->fd, "\n", 1);
}
}
+
/**
* camel_uid_cache_destroy:
* @cache: a CamelUIDCache
@@ -136,8 +148,10 @@ static void
free_uid (gpointer key, gpointer value, gpointer data)
{
g_free (key);
+ g_free (value);
}
+
/**
* camel_uid_cache_get_new_uids:
* @cache: a CamelUIDCache
@@ -153,28 +167,62 @@ GPtrArray *
camel_uid_cache_get_new_uids (CamelUIDCache *cache, GPtrArray *uids)
{
GPtrArray *new_uids;
- gpointer old_uid, old_level;
+ gpointer old_uid;
char *uid;
int i;
-
+
new_uids = g_ptr_array_new ();
cache->level++;
-
+
for (i = 0; i < uids->len; i++) {
+ struct _uid_state *state;
+
uid = uids->pdata[i];
- if (g_hash_table_lookup_extended (cache->uids, uid,
- &old_uid, &old_level)) {
+ if (g_hash_table_lookup_extended (cache->uids, uid, &old_uid, &state)) {
g_hash_table_remove (cache->uids, uid);
g_free (old_uid);
- } else
+ } else {
g_ptr_array_add (new_uids, g_strdup (uid));
- g_hash_table_insert (cache->uids, g_strdup (uid),
- GINT_TO_POINTER (cache->level));
+ state = g_new (struct _uid_state, 1);
+ state->save = FALSE;
+ }
+
+ state->level = cache->level;
+ g_hash_table_insert (cache->uids, g_strdup (uid), state);
}
-
+
return new_uids;
}
+
+/**
+ * camel_uid_cache_save_uid:
+ * @cache: a CamelUIDCache
+ * @uid: a uid to save
+ *
+ * Marks a uid for saving.
+ **/
+void
+camel_uid_cache_save_uid (CamelUIDCache *cache, const char *uid)
+{
+ struct _uid_state *state;
+ gpointer old_uid;
+
+ g_return_if_fail (uid != NULL);
+
+ if (g_hash_table_lookup_extended (cache->uids, uid, &old_uid, &state)) {
+ state->save = TRUE;
+ state->level = cache->level;
+ } else {
+ state = g_new (struct _uid_state, 1);
+ state->save = TRUE;
+ state->level = cache->level;
+
+ g_hash_table_insert (cache->uids, g_strdup (uid), state);
+ }
+}
+
+
/**
* camel_uid_cache_free_uids:
* @uids: an array returned from camel_uid_cache_get_new_uids()
@@ -185,7 +233,7 @@ void
camel_uid_cache_free_uids (GPtrArray *uids)
{
int i;
-
+
for (i = 0; i < uids->len; i++)
g_free (uids->pdata[i]);
g_ptr_array_free (uids, TRUE);
diff --git a/camel/camel-uid-cache.h b/camel/camel-uid-cache.h
index 98838b30c..2a381f0be 100644
--- a/camel/camel-uid-cache.h
+++ b/camel/camel-uid-cache.h
@@ -43,14 +43,13 @@ CamelUIDCache *camel_uid_cache_new (const char *filename);
gboolean camel_uid_cache_save (CamelUIDCache *cache);
void camel_uid_cache_destroy (CamelUIDCache *cache);
-GPtrArray *camel_uid_cache_get_new_uids (CamelUIDCache *cache,
- GPtrArray *uids);
-void camel_uid_cache_free_uids (GPtrArray *uids);
+GPtrArray *camel_uid_cache_get_new_uids (CamelUIDCache *cache, GPtrArray *uids);
+void camel_uid_cache_save_uid (CamelUIDCache *cache, const char *uid);
+void camel_uid_cache_free_uids (GPtrArray *uids);
#ifdef __cplusplus
}
#endif /* __cplusplus */
-
#endif /* CAMEL_UID_CACHE_H */
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index 80f12e42a..1d119cf4d 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -1677,8 +1677,7 @@ imap_filter_timeout (gpointer user_data)
"incoming", &ex);
if (driver) {
- camel_filter_driver_filter_folder (driver,
- ftd->folder,
+ camel_filter_driver_filter_folder (driver, ftd->folder, NULL,
ftd->recents, FALSE, &ex);
if (camel_exception_is_set (&ex))