2005-07-01 [colin] 1.9.12cvs8
[claws.git] / src / msgcache.c
index 94a6b9b69d39dffa638bcc22dcdcbb977cd8690f..4721a13fbfb1cc6c5eb28ce1d328681d9b502c1e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2001 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2005 Hiroyuki Yamamoto & The Sylpheed Claws Team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include "defs.h"
 
 #include <glib.h>
+#include <glib/gi18n.h>
 
 #include <time.h>
 
-#include "intl.h"
 #include "msgcache.h"
 #include "utils.h"
 #include "procmsg.h"
+#include "codeconv.h"
+
+typedef enum
+{
+       DATA_READ,
+       DATA_WRITE,
+       DATA_APPEND
+} DataOpenMode;
 
 struct _MsgCache {
        GHashTable      *msgnum_table;
@@ -35,7 +43,26 @@ struct _MsgCache {
        time_t           last_access;
 };
 
-MsgCache *msgcache_new()
+typedef struct _StringConverter StringConverter;
+struct _StringConverter {
+       gchar *(*convert) (StringConverter *converter, gchar *srcstr);
+       void   (*free)    (StringConverter *converter);
+};
+
+typedef struct _StrdupConverter StrdupConverter;
+struct _StrdupConverter {
+       StringConverter converter;
+};
+
+typedef struct _CharsetConverter CharsetConverter;
+struct _CharsetConverter {
+       StringConverter converter;
+
+       gchar *srccharset;
+       gchar *dstcharset;
+};
+
+MsgCache *msgcache_new(void)
 {
        MsgCache *cache;
        
@@ -77,7 +104,7 @@ void msgcache_add_msg(MsgCache *cache, MsgInfo *msginfo)
        cache->memusage += procmsg_msginfo_memusage(msginfo);
        cache->last_access = time(NULL);
 
-       debug_print("Cache size: %d messages, %d byte\n", g_hash_table_size(cache->msgnum_table), cache->memusage);
+       debug_print("Cache size: %d messages, %d bytes\n", g_hash_table_size(cache->msgnum_table), cache->memusage);
 }
 
 void msgcache_remove_msg(MsgCache *cache, guint msgnum)
@@ -109,12 +136,13 @@ void msgcache_update_msg(MsgCache *cache, MsgInfo *msginfo)
        g_return_if_fail(msginfo != NULL);
 
        oldmsginfo = g_hash_table_lookup(cache->msgnum_table, &msginfo->msgnum);
-       if(msginfo) {
+       if(oldmsginfo && oldmsginfo->msgid) 
                g_hash_table_remove(cache->msgid_table, oldmsginfo->msgid);
+       if (oldmsginfo) {
                g_hash_table_remove(cache->msgnum_table, &oldmsginfo->msgnum);
+               cache->memusage -= procmsg_msginfo_memusage(oldmsginfo);
                procmsg_msginfo_free(oldmsginfo);
        }
-       cache->memusage -= procmsg_msginfo_memusage(oldmsginfo);
 
        newmsginfo = procmsg_msginfo_new_ref(msginfo);
        g_hash_table_insert(cache->msgnum_table, &newmsginfo->msgnum, newmsginfo);
@@ -128,68 +156,234 @@ void msgcache_update_msg(MsgCache *cache, MsgInfo *msginfo)
        return;
 }
 
-static gint msgcache_read_cache_data_str(FILE *fp, gchar **str)
+MsgInfo *msgcache_get_msg(MsgCache *cache, guint num)
 {
-       gchar buf[BUFFSIZE];
-       gint ret = 0;
-       size_t len;
-
-       if (fread(&len, sizeof(len), 1, fp) == 1) {
-               if (len < 0)
-                       ret = -1;
-               else {
-                       gchar *tmp = NULL;
-
-                       while (len > 0) {
-                               size_t size = MIN(len, BUFFSIZE - 1);
-
-                               if (fread(buf, size, 1, fp) != 1) {
-                                       ret = -1;
-                                       if (tmp) g_free(tmp);
-                                       *str = NULL;
-                                       break;
-                               }
-
-                               buf[size] = '\0';
-                               if (tmp) {
-                                       *str = g_strconcat(tmp, buf, NULL);
-                                       g_free(tmp);
-                                       tmp = *str;
-                               } else
-                                       tmp = *str = g_strdup(buf);
-
-                               len -= size;
-                       }
-               }
-       } else
-               ret = -1;
+       MsgInfo *msginfo;
+
+       g_return_val_if_fail(cache != NULL, NULL);
+
+       msginfo = g_hash_table_lookup(cache->msgnum_table, &num);
+       if(!msginfo)
+               return NULL;
+       cache->last_access = time(NULL);
+       
+       return procmsg_msginfo_new_ref(msginfo);
+}
+
+MsgInfo *msgcache_get_msg_by_id(MsgCache *cache, const gchar *msgid)
+{
+       MsgInfo *msginfo;
+       
+       g_return_val_if_fail(cache != NULL, NULL);
+       g_return_val_if_fail(msgid != NULL, NULL);
 
-       if (ret < 0)
-               g_warning(_("Cache data is corrupted\n"));
+       msginfo = g_hash_table_lookup(cache->msgid_table, msgid);
+       if(!msginfo)
+               return NULL;
+       cache->last_access = time(NULL);
+       
+       return procmsg_msginfo_new_ref(msginfo);        
+}
 
-       return ret;
+static void msgcache_get_msg_list_func(gpointer key, gpointer value, gpointer user_data)
+{
+       MsgInfoList **listptr = user_data;
+       MsgInfo *msginfo = value;
+
+       *listptr = g_slist_prepend(*listptr, procmsg_msginfo_new_ref(msginfo));
 }
 
+MsgInfoList *msgcache_get_msg_list(MsgCache *cache)
+{
+       MsgInfoList *msg_list = NULL;
+
+       g_return_val_if_fail(cache != NULL, NULL);
 
-#define READ_CACHE_DATA(data, fp) \
+       g_hash_table_foreach((GHashTable *)cache->msgnum_table, msgcache_get_msg_list_func, (gpointer)&msg_list);       
+       cache->last_access = time(NULL);
+       
+       msg_list = g_slist_reverse(msg_list);
+
+       return msg_list;
+}
+
+time_t msgcache_get_last_access_time(MsgCache *cache)
+{
+       g_return_val_if_fail(cache != NULL, 0);
+       
+       return cache->last_access;
+}
+
+gint msgcache_get_memory_usage(MsgCache *cache)
+{
+       g_return_val_if_fail(cache != NULL, 0);
+
+       return cache->memusage;
+}
+
+/*
+ *  Cache saving functions
+ */
+
+#define READ_CACHE_DATA(data, fp, total_len) \
 { \
-       if (msgcache_read_cache_data_str(fp, &data) < 0) { \
+       if ((tmp_len = msgcache_read_cache_data_str(fp, &data, conv)) < 0) { \
                procmsg_msginfo_free(msginfo); \
                error = TRUE; \
                break; \
        } \
+       total_len += tmp_len; \
 }
 
 #define READ_CACHE_DATA_INT(n, fp) \
 { \
-       if (fread(&n, sizeof(n), 1, fp) != 1) { \
-               g_warning(_("Cache data is corrupted\n")); \
+       guint32 idata; \
+       size_t ni; \
+ \
+       if ((ni = fread(&idata, 1, sizeof(idata), fp)) != sizeof(idata)) { \
+               g_warning("read_int: Cache data corrupted, read %d of %d at " \
+                         "offset %ld\n", ni, sizeof(idata), ftell(fp)); \
                procmsg_msginfo_free(msginfo); \
                error = TRUE; \
                break; \
+       } else \
+               n = idata;\
+}
+
+#define WRITE_CACHE_DATA_INT(n, fp)            \
+{                                              \
+       guint32 idata;                          \
+                                               \
+       idata = (guint32)n;                     \
+       fwrite(&idata, sizeof(idata), 1, fp);   \
+}
+
+#define WRITE_CACHE_DATA(data, fp) \
+{ \
+       size_t len; \
+       if (data == NULL) \
+               len = 0; \
+       else \
+               len = strlen(data); \
+       WRITE_CACHE_DATA_INT(len, fp); \
+       if (len > 0) { \
+               fwrite(data, len, 1, fp); \
        } \
 }
 
+static FILE *msgcache_open_data_file(const gchar *file, guint version,
+                                    DataOpenMode mode,
+                                    gchar *buf, size_t buf_size)
+{
+       FILE *fp;
+       gint32 data_ver;
+
+       g_return_val_if_fail(file != NULL, NULL);
+
+       if (mode == DATA_WRITE) {
+               if ((fp = fopen(file, "wb")) == NULL) {
+                       FILE_OP_ERROR(file, "fopen");
+                       return NULL;
+               }
+               if (change_file_mode_rw(fp, file) < 0)
+                       FILE_OP_ERROR(file, "chmod");
+
+               WRITE_CACHE_DATA_INT(version, fp);
+               return fp;
+       }
+
+       /* check version */
+       if ((fp = fopen(file, "rb")) == NULL)
+               debug_print("Mark/Cache file '%s' not found\n", file);
+       else {
+               if (buf && buf_size > 0)
+                       setvbuf(fp, buf, _IOFBF, buf_size);
+               if (fread(&data_ver, sizeof(data_ver), 1, fp) != 1 ||
+                        version != data_ver) {
+                       g_message("%s: Mark/Cache version is different (%u != %u). Discarding it.\n",
+                                 file, data_ver, version);
+                       fclose(fp);
+                       fp = NULL;
+               }
+       }
+       
+       if (mode == DATA_READ)
+               return fp;
+
+       if (fp) {
+               /* reopen with append mode */
+               fclose(fp);
+               if ((fp = fopen(file, "ab")) == NULL)
+                       FILE_OP_ERROR(file, "fopen");
+       } else {
+               /* open with overwrite mode if mark file doesn't exist or
+                  version is different */
+               fp = msgcache_open_data_file(file, version, DATA_WRITE, buf,
+                                           buf_size);
+       }
+
+       return fp;
+}
+
+static gint msgcache_read_cache_data_str(FILE *fp, gchar **str, 
+                                        StringConverter *conv)
+{
+       gchar *tmpstr = NULL;
+       size_t ni;
+       guint32 len;
+
+       *str = NULL;
+       if ((ni = fread(&len, 1, sizeof(len), fp) != sizeof(len)) ||
+           len > G_MAXINT) {
+               g_warning("read_data_str: Cache data (len) corrupted, read %d "
+                         "of %d bytes at offset %ld\n", ni, sizeof(len), 
+                         ftell(fp));
+               return -1;
+       }
+
+       if (len == 0)
+               return 0;
+
+       tmpstr = g_malloc(len + 1);
+
+       if ((ni = fread(tmpstr, 1, len, fp)) != len) {
+               g_warning("read_data_str: Cache data corrupted, read %d of %d "
+                         "bytes at offset %ld\n", 
+                         ni, len, ftell(fp));
+               g_free(tmpstr);
+               return -1;
+       }
+       tmpstr[len] = 0;
+
+       if (conv != NULL) {
+               *str = conv->convert(conv, tmpstr);
+               g_free(tmpstr);
+       } else 
+               *str = tmpstr;
+
+       return len;
+}
+
+gchar *strconv_strdup_convert(StringConverter *conv, gchar *srcstr)
+{
+       return g_strdup(srcstr);
+}
+
+gchar *strconv_charset_convert(StringConverter *conv, gchar *srcstr)
+{
+       CharsetConverter *charsetconv = (CharsetConverter *) conv;
+
+       return conv_codeset_strdup(srcstr, charsetconv->srccharset, charsetconv->dstcharset);
+}
+
+void strconv_charset_free(StringConverter *conv)
+{
+       CharsetConverter *charsetconv = (CharsetConverter *) conv;
+
+       g_free(charsetconv->srccharset);
+       g_free(charsetconv->dstcharset);
+}
+
 MsgCache *msgcache_read_cache(FolderItem *item, const gchar *cache_file)
 {
        MsgCache *cache;
@@ -197,59 +391,108 @@ MsgCache *msgcache_read_cache(FolderItem *item, const gchar *cache_file)
        MsgInfo *msginfo;
        MsgTmpFlags tmp_flags = 0;
        gchar file_buf[BUFFSIZE];
-       gint ver;
-       guint num;
+       guint32 num;
+        guint refnum;
        gboolean error = FALSE;
-
+       StringConverter *conv = NULL;
+       gchar *srccharset = NULL;
+       const gchar *dstcharset = NULL;
+       gchar *ref = NULL;
+       guint memusage = 0;
+       guint tmp_len = 0;
+#if 0
+       struct timeval start;
+       struct timeval end;
+       struct timeval diff;
+       gettimeofday(&start, NULL);
+#endif
        g_return_val_if_fail(cache_file != NULL, NULL);
        g_return_val_if_fail(item != NULL, NULL);
 
-       if ((fp = fopen(cache_file, "rb")) == NULL) {
-               debug_print("\tNo cache file\n");
+       if ((fp = msgcache_open_data_file
+               (cache_file, CACHE_VERSION, DATA_READ, file_buf, sizeof(file_buf))) == NULL)
                return NULL;
-       }
-       setvbuf(fp, file_buf, _IOFBF, sizeof(file_buf));
 
        debug_print("\tReading message cache from %s...\n", cache_file);
 
-       /* compare cache version */
-       if (fread(&ver, sizeof(ver), 1, fp) != 1 ||
-           CACHE_VERSION != ver) {
-               debug_print("Cache version is different. Discarding it.\n");
-               fclose(fp);
-               return NULL;
-       }
-
        if (item->stype == F_QUEUE) {
                tmp_flags |= MSG_QUEUED;
        } else if (item->stype == F_DRAFT) {
                tmp_flags |= MSG_DRAFT;
        }
 
-       cache = msgcache_new();
+       if (msgcache_read_cache_data_str(fp, &srccharset, NULL) < 0)
+               return NULL;
+       dstcharset = CS_UTF_8;
+       if (srccharset == NULL || dstcharset == NULL) {
+               conv = NULL;
+       } else if (strcmp(srccharset, dstcharset) == 0) {
+               StrdupConverter *strdupconv;
+
+               debug_print("using StrdupConverter\n");
+
+               strdupconv = g_new0(StrdupConverter, 1);
+               strdupconv->converter.convert = strconv_strdup_convert;
+               strdupconv->converter.free = NULL;
 
+               conv = (StringConverter *) strdupconv;
+       } else {
+               CharsetConverter *charsetconv;
+
+               debug_print("using CharsetConverter\n");
+
+               charsetconv = g_new0(CharsetConverter, 1);
+               charsetconv->converter.convert = strconv_charset_convert;
+               charsetconv->converter.free = strconv_charset_free;
+               charsetconv->srccharset = g_strdup(srccharset);
+               charsetconv->dstcharset = g_strdup(dstcharset);
+
+               conv = (StringConverter *) charsetconv;
+       }
+       g_free(srccharset);
+
+       cache = msgcache_new();
        g_hash_table_freeze(cache->msgnum_table);
+       g_hash_table_freeze(cache->msgid_table);
 
        while (fread(&num, sizeof(num), 1, fp) == 1) {
                msginfo = procmsg_msginfo_new();
                msginfo->msgnum = num;
+               memusage += sizeof(MsgInfo);
+               
                READ_CACHE_DATA_INT(msginfo->size, fp);
                READ_CACHE_DATA_INT(msginfo->mtime, fp);
                READ_CACHE_DATA_INT(msginfo->date_t, fp);
                READ_CACHE_DATA_INT(msginfo->flags.tmp_flags, fp);
-
-               READ_CACHE_DATA(msginfo->fromname, fp);
-
-               READ_CACHE_DATA(msginfo->date, fp);
-               READ_CACHE_DATA(msginfo->from, fp);
-               READ_CACHE_DATA(msginfo->to, fp);
-               READ_CACHE_DATA(msginfo->cc, fp);
-               READ_CACHE_DATA(msginfo->newsgroups, fp);
-               READ_CACHE_DATA(msginfo->subject, fp);
-               READ_CACHE_DATA(msginfo->msgid, fp);
-               READ_CACHE_DATA(msginfo->inreplyto, fp);
-               READ_CACHE_DATA(msginfo->references, fp);
-               READ_CACHE_DATA(msginfo->xref, fp);
+                               
+               READ_CACHE_DATA(msginfo->fromname, fp, memusage);
+
+               READ_CACHE_DATA(msginfo->date, fp, memusage);
+               READ_CACHE_DATA(msginfo->from, fp, memusage);
+               READ_CACHE_DATA(msginfo->to, fp, memusage);
+               READ_CACHE_DATA(msginfo->cc, fp, memusage);
+               READ_CACHE_DATA(msginfo->newsgroups, fp, memusage);
+               READ_CACHE_DATA(msginfo->subject, fp, memusage);
+               READ_CACHE_DATA(msginfo->msgid, fp, memusage);
+               READ_CACHE_DATA(msginfo->inreplyto, fp, memusage);
+               READ_CACHE_DATA(msginfo->xref, fp, memusage);
+               
+               READ_CACHE_DATA_INT(msginfo->planned_download, fp);
+               READ_CACHE_DATA_INT(msginfo->total_size, fp);
+               READ_CACHE_DATA_INT(refnum, fp);
+               
+               for (; refnum != 0; refnum--) {
+                       ref = NULL;
+
+                       READ_CACHE_DATA(ref, fp, memusage);
+
+                       if (ref && strlen(ref))
+                               msginfo->references =
+                                       g_slist_prepend(msginfo->references, ref);
+               }
+               if (msginfo->references)
+                       msginfo->references =
+                               g_slist_reverse(msginfo->references);
 
                msginfo->folder = item;
                msginfo->flags.tmp_flags |= tmp_flags;
@@ -257,22 +500,32 @@ MsgCache *msgcache_read_cache(FolderItem *item, const gchar *cache_file)
                g_hash_table_insert(cache->msgnum_table, &msginfo->msgnum, msginfo);
                if(msginfo->msgid)
                        g_hash_table_insert(cache->msgid_table, msginfo->msgid, msginfo);
-               cache->memusage += procmsg_msginfo_memusage(msginfo);
        }
        fclose(fp);
+       g_hash_table_thaw(cache->msgnum_table);
+       g_hash_table_thaw(cache->msgid_table);
+
+       if (conv != NULL) {
+               if (conv->free != NULL)
+                       conv->free(conv);
+               g_free(conv);
+       }
 
        if(error) {
-               g_hash_table_thaw(cache->msgnum_table);
                msgcache_destroy(cache);
                return NULL;
        }
 
        cache->last_access = time(NULL);
-       g_hash_table_thaw(cache->msgnum_table);
+       cache->memusage = memusage;
 
        debug_print("done. (%d items read)\n", g_hash_table_size(cache->msgnum_table));
        debug_print("Cache size: %d messages, %d byte\n", g_hash_table_size(cache->msgnum_table), cache->memusage);
-
+#if 0
+       gettimeofday(&end, NULL);
+       timersub(&end, &start, &diff);
+       printf("spent %d seconds %d usages %d;%d\n", diff.tv_sec, diff.tv_usec, cache->memusage, memusage);
+#endif
        return cache;
 }
 
@@ -281,50 +534,28 @@ void msgcache_read_mark(MsgCache *cache, const gchar *mark_file)
        FILE *fp;
        MsgInfo *msginfo;
        MsgPermFlags perm_flags;
-       gint ver;
-       guint num;
+       guint32 num;
 
-       if ((fp = fopen(mark_file, "rb")) == NULL) {
-               debug_print("Mark file not found.\n");
+       if ((fp = msgcache_open_data_file(mark_file, MARK_VERSION, DATA_READ, NULL, 0)) == NULL)
                return;
-       } else if (fread(&ver, sizeof(ver), 1, fp) != 1 || MARK_VERSION != ver) {
-               debug_print("Mark version is different (%d != %d). "
-                             "Discarding it.\n", ver, MARK_VERSION);
-       } else {
-               debug_print("\tReading message marks from %s...\n", mark_file);
 
-               while (fread(&num, sizeof(num), 1, fp) == 1) {
-                       if (fread(&perm_flags, sizeof(perm_flags), 1, fp) != 1) break;
+       debug_print("\tReading message marks from %s...\n", mark_file);
+
+       while (fread(&num, sizeof(num), 1, fp) == 1) {
+               if (fread(&perm_flags, sizeof(perm_flags), 1, fp) != 1) break;
 
-                       msginfo = g_hash_table_lookup(cache->msgnum_table, &num);
-                       if(msginfo) {
-                               msginfo->flags.perm_flags = perm_flags;
-                       }
+               msginfo = g_hash_table_lookup(cache->msgnum_table, &num);
+               if(msginfo) {
+                       msginfo->flags.perm_flags = perm_flags;
                }
        }
        fclose(fp);
 }
 
-#define WRITE_CACHE_DATA_INT(n, fp) \
-       fwrite(&n, sizeof(n), 1, fp)
-
-#define WRITE_CACHE_DATA(data, fp) \
-{ \
-       gint len; \
- \
-       if (data == NULL || (len = strlen(data)) == 0) { \
-               len = 0; \
-               WRITE_CACHE_DATA_INT(len, fp); \
-       } else { \
-               len = strlen(data); \
-               WRITE_CACHE_DATA_INT(len, fp); \
-               fwrite(data, len, 1, fp); \
-       } \
-}
-
 void msgcache_write_cache(MsgInfo *msginfo, FILE *fp)
 {
        MsgTmpFlags flags = msginfo->flags.tmp_flags & MSG_CACHED_FLAG_MASK;
+       GSList *cur;
 
        WRITE_CACHE_DATA_INT(msginfo->msgnum, fp);
        WRITE_CACHE_DATA_INT(msginfo->size, fp);
@@ -342,8 +573,15 @@ void msgcache_write_cache(MsgInfo *msginfo, FILE *fp)
        WRITE_CACHE_DATA(msginfo->subject, fp);
        WRITE_CACHE_DATA(msginfo->msgid, fp);
        WRITE_CACHE_DATA(msginfo->inreplyto, fp);
-       WRITE_CACHE_DATA(msginfo->references, fp);
        WRITE_CACHE_DATA(msginfo->xref, fp);
+       WRITE_CACHE_DATA_INT(msginfo->planned_download, fp);
+       WRITE_CACHE_DATA_INT(msginfo->total_size, fp);
+        
+       WRITE_CACHE_DATA_INT(g_slist_length(msginfo->references), fp);
+
+       for (cur = msginfo->references; cur != NULL; cur = cur->next) {
+               WRITE_CACHE_DATA((gchar *)cur->data, fp);
+       }
 }
 
 static void msgcache_write_flags(MsgInfo *msginfo, FILE *fp)
@@ -364,7 +602,7 @@ static void msgcache_write_func(gpointer key, gpointer value, gpointer user_data
 {
        MsgInfo *msginfo;
        struct write_fps *write_fps;
-       
+
        msginfo = (MsgInfo *)value;
        write_fps = user_data;
 
@@ -374,36 +612,30 @@ static void msgcache_write_func(gpointer key, gpointer value, gpointer user_data
 
 gint msgcache_write(const gchar *cache_file, const gchar *mark_file, MsgCache *cache)
 {
-       FILE *fp;
        struct write_fps write_fps;
-       gint ver;
 
        g_return_val_if_fail(cache_file != NULL, -1);
        g_return_val_if_fail(mark_file != NULL, -1);
        g_return_val_if_fail(cache != NULL, -1);
 
-       debug_print("\tWriting message cache to %s and %s...\n", cache_file, mark_file);
-
-       if ((fp = fopen(cache_file, "wb")) == NULL) {
-               FILE_OP_ERROR(cache_file, "fopen");
+       write_fps.cache_fp = msgcache_open_data_file(cache_file, CACHE_VERSION,
+               DATA_WRITE, NULL, 0);
+       if (write_fps.cache_fp == NULL)
                return -1;
-       }
-       if (change_file_mode_rw(fp, cache_file) < 0)
-               FILE_OP_ERROR(cache_file, "chmod");
 
-       ver = CACHE_VERSION;
-       WRITE_CACHE_DATA_INT(ver, fp);  
-       write_fps.cache_fp = fp;
+       WRITE_CACHE_DATA(CS_UTF_8, write_fps.cache_fp);
 
-       if ((fp = fopen(mark_file, "wb")) == NULL) {
-               FILE_OP_ERROR(mark_file, "fopen");
+       write_fps.mark_fp = msgcache_open_data_file(mark_file, MARK_VERSION,
+               DATA_WRITE, NULL, 0);
+       if (write_fps.mark_fp == NULL) {
                fclose(write_fps.cache_fp);
                return -1;
        }
 
-       ver = MARK_VERSION;
-       WRITE_CACHE_DATA_INT(ver, fp);
-       write_fps.mark_fp = fp;
+       debug_print("\tWriting message cache to %s and %s...\n", cache_file, mark_file);
+
+       if (change_file_mode_rw(write_fps.cache_fp, cache_file) < 0)
+               FILE_OP_ERROR(cache_file, "chmod");
 
        g_hash_table_foreach(cache->msgnum_table, msgcache_write_func, (gpointer)&write_fps);
 
@@ -416,66 +648,3 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, MsgCache *c
        return 0;
 }
 
-MsgInfo *msgcache_get_msg(MsgCache *cache, guint num)
-{
-       MsgInfo *msginfo;
-
-       g_return_val_if_fail(cache != NULL, NULL);
-
-       msginfo = g_hash_table_lookup(cache->msgnum_table, &num);
-       if(!msginfo)
-               return NULL;
-       cache->last_access = time(NULL);
-       
-       return procmsg_msginfo_new_ref(msginfo);
-}
-
-MsgInfo *msgcache_get_msg_by_id(MsgCache *cache, const gchar *msgid)
-{
-       MsgInfo *msginfo;
-       
-       g_return_val_if_fail(cache != NULL, NULL);
-
-       msginfo = g_hash_table_lookup(cache->msgid_table, msgid);
-       if(!msginfo)
-               return NULL;
-       cache->last_access = time(NULL);
-       
-       return procmsg_msginfo_new_ref(msginfo);        
-}
-
-static void msgcache_get_msg_list_func(gpointer key, gpointer value, gpointer user_data)
-{
-       GSList **listptr = user_data;
-       MsgInfo *msginfo = value;
-
-       *listptr = g_slist_prepend(*listptr, procmsg_msginfo_new_ref(msginfo));
-}
-
-GSList *msgcache_get_msg_list(MsgCache *cache)
-{
-       GSList *msg_list = NULL;
-
-       g_return_val_if_fail(cache != NULL, NULL);
-
-       g_hash_table_foreach((GHashTable *)cache->msgnum_table, msgcache_get_msg_list_func, (gpointer)&msg_list);       
-       cache->last_access = time(NULL);
-       
-       msg_list = g_slist_reverse(msg_list);
-
-       return msg_list;
-}
-
-time_t msgcache_get_last_access_time(MsgCache *cache)
-{
-       g_return_val_if_fail(cache != NULL, 0);
-       
-       return cache->last_access;
-}
-
-gint msgcache_get_memory_usage(MsgCache *cache)
-{
-       g_return_val_if_fail(cache != NULL, 0);
-
-       return cache->memusage;
-}