aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers')
-rw-r--r--camel/providers/mbox/camel-mbox-folder.c7
-rw-r--r--camel/providers/mbox/camel-mbox-summary.c43
-rw-r--r--camel/providers/mbox/camel-mbox-summary.h7
3 files changed, 32 insertions, 25 deletions
diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c
index 305935fcdd..07accc5a35 100644
--- a/camel/providers/mbox/camel-mbox-folder.c
+++ b/camel/providers/mbox/camel-mbox-folder.c
@@ -243,9 +243,10 @@ mbox_close (CamelFolder *folder, gboolean expunge, CamelException *ex)
/* call parent implementation */
parent_class->close (folder, expunge, ex);
- if (expunge) {
+ if (expunge)
mbox_expunge(folder, ex);
- }
+ else
+ camel_mbox_summary_sync(mbox_folder->summary, FALSE);
/* save index */
if (mbox_folder->index) {
@@ -268,7 +269,7 @@ mbox_expunge (CamelFolder *folder, CamelException *ex)
{
CamelMboxFolder *mbox = (CamelMboxFolder *)folder;
- if (camel_mbox_summary_expunge(mbox->summary) == -1) {
+ if (camel_mbox_summary_sync(mbox->summary, TRUE) == -1) {
camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID, /* FIXME: right error code */
"Could not expunge: %s", strerror(errno));
}
diff --git a/camel/providers/mbox/camel-mbox-summary.c b/camel/providers/mbox/camel-mbox-summary.c
index e78bede490..c2fd326104 100644
--- a/camel/providers/mbox/camel-mbox-summary.c
+++ b/camel/providers/mbox/camel-mbox-summary.c
@@ -524,7 +524,7 @@ copy_block(int fromfd, int tofd, off_t start, size_t bytes)
}
int
-camel_mbox_summary_expunge(CamelMboxSummary *mbs)
+camel_mbox_summary_sync(CamelMboxSummary *mbs, gboolean expunge)
{
CamelMimeParser *mp=NULL;
int i, count;
@@ -539,6 +539,7 @@ camel_mbox_summary_expunge(CamelMboxSummary *mbs)
int len;
guint32 uid, flags;
int quick = TRUE, work = FALSE;
+ struct stat st;
/* make sure we're in sync */
count = camel_folder_summary_count(s);
@@ -550,16 +551,17 @@ camel_mbox_summary_expunge(CamelMboxSummary *mbs)
}
/* check if we have any work to do */
- d(printf("Performing expunge, %d messages in inbox\n", count));
+ d(printf("Performing sync, %d messages in inbox\n", count));
for (i=0;quick && i<count;i++) {
info = (CamelMboxMessageInfo *)camel_folder_summary_index(s, i);
- if (info->info.flags & (CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_FOLDER_NOXEV))
+ if ((expunge && (info->info.flags & CAMEL_MESSAGE_DELETED)) ||
+ (info->info.flags & CAMEL_MESSAGE_FOLDER_NOXEV))
quick = FALSE;
else
work |= (info->info.flags & CAMEL_MESSAGE_FOLDER_FLAGGED) != 0;
}
- d(printf("Options: %s %s\n", quick?"quick":"", work?"Work":""));
+ d(printf("Options: %s %s %s\n", expunge?"expunge":"", quick?"quick":"", work?"Work":""));
if (quick && !work)
return 0;
@@ -588,8 +590,11 @@ camel_mbox_summary_expunge(CamelMboxSummary *mbs)
}
for (i=0;i<count;i++) {
- off_t frompos, bodypos;
- off_t xevoffset;
+ off_t frompos, bodypos, lastpos;
+ /* This has to be an int, not an off_t, because that's
+ * what camel_mime_parser_header returns... FIXME.
+ */
+ int xevoffset;
info = (CamelMboxMessageInfo *)camel_folder_summary_index(s, i);
@@ -619,14 +624,14 @@ camel_mbox_summary_expunge(CamelMboxSummary *mbs)
goto error;
if (camel_mime_parser_tell_start_from(mp) != info->frompos) {
- g_error("Summary/mbox mismatch, aborting expunge");
+ g_warning("Summary/mbox mismatch, aborting sync");
goto error;
}
if (camel_mime_parser_step(mp, &buffer, &len) == HSCAN_FROM_END)
goto error;
- xev = camel_mime_parser_header(mp, "X-Evolution", (int *)&xevoffset);
+ xev = camel_mime_parser_header(mp, "X-Evolution", &xevoffset);
if (xev && header_evolution_decode(xev, &uid, &flags) != -1) {
char name[64];
@@ -640,13 +645,16 @@ camel_mbox_summary_expunge(CamelMboxSummary *mbs)
xevnew = header_evolution_encode(strtoul(info->info.uid, NULL, 10), info->info.flags & 0xffff);
if (quick) {
if (!xevok) {
- g_error("The summary told me I had an X-Evolution header, but i dont!");
+ g_warning("The summary told me I had an X-Evolution header, but i dont!");
goto error;
}
buffer = g_strdup_printf("X-Evolution: %s", xevnew);
+ lastpos = lseek (fd, 0, SEEK_CUR);
+ lseek (fd, xevoffset, SEEK_SET);
do {
len = write(fd, buffer, strlen(buffer));
} while (len == -1 && errno == EINTR);
+ lseek (fd, lastpos, SEEK_SET);
g_free(buffer);
if (len == -1) {
goto error;
@@ -706,8 +714,6 @@ camel_mbox_summary_expunge(CamelMboxSummary *mbs)
}
if (!quick) {
- struct stat st;
-
if (close(fdout) == -1) {
g_warning("Cannot close tmp folder: %s", strerror(errno));
goto error;
@@ -719,17 +725,18 @@ camel_mbox_summary_expunge(CamelMboxSummary *mbs)
}
tmpname = 0;
- if (stat(mbs->folder_path, &st) == -1)
- goto error;
-
- camel_folder_summary_touch(s);
- s->time = st.st_mtime;
- mbs->folder_size = st.st_size;
- camel_folder_summary_save(s);
if (mbs->index)
ibex_save(mbs->index);
}
+ if (stat(mbs->folder_path, &st) == -1)
+ goto error;
+
+ camel_folder_summary_touch(s);
+ s->time = st.st_mtime;
+ mbs->folder_size = st.st_size;
+ camel_folder_summary_save(s);
+
gtk_object_unref((GtkObject *)mp);
return 0;
diff --git a/camel/providers/mbox/camel-mbox-summary.h b/camel/providers/mbox/camel-mbox-summary.h
index 6d98fd051d..ad7af33e91 100644
--- a/camel/providers/mbox/camel-mbox-summary.h
+++ b/camel/providers/mbox/camel-mbox-summary.h
@@ -35,8 +35,7 @@ typedef struct _CamelMboxSummaryClass CamelMboxSummaryClass;
/* extra summary flags */
enum {
- CAMEL_MESSAGE_FOLDER_NOXEV = 1<<16,
-/* CAMEL_MESSAGE_FOLDER_FLAGGED = 1<<17,*/
+ CAMEL_MESSAGE_FOLDER_NOXEV = 1<<17,
};
typedef struct _CamelMboxMessageContentInfo {
@@ -72,7 +71,7 @@ CamelMboxSummary *camel_mbox_summary_new (const char *filename, const char
int camel_mbox_summary_load(CamelMboxSummary *mbs, int forceindex);
/* incremental update */
int camel_mbox_summary_update(CamelMboxSummary *mbs, off_t offset);
-/* perform a folder expunge */
-int camel_mbox_summary_expunge(CamelMboxSummary *mbs);
+/* perform a folder sync or expunge, if needed */
+int camel_mbox_summary_sync (CamelMboxSummary *mbs, gboolean expunge);
#endif /* ! _CAMEL_MBOX_SUMMARY_H */