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)
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);
g_hash_table_remove(cache->msgnum_table, &oldmsginfo->msgnum);
+ }
+ if (oldmsginfo)
procmsg_msginfo_free(oldmsginfo);
- }
+
cache->memusage -= procmsg_msginfo_memusage(oldmsginfo);
newmsginfo = procmsg_msginfo_new_ref(msginfo);
#define READ_CACHE_DATA_INT(n, fp) \
{ \
- if (fread(&n, sizeof(n), 1, fp) != 1) { \
+ guint32 idata; \
+ \
+ if (fread(&idata, sizeof(idata), 1, fp) != 1) { \
g_warning("Cache data is corrupted\n"); \
procmsg_msginfo_free(msginfo); \
error = TRUE; \
break; \
- } \
+ } else \
+ n = idata;\
}
-#define WRITE_CACHE_DATA_INT(n, fp) \
- fwrite(&n, sizeof(n), 1, fp)
+#define WRITE_CACHE_DATA_INT(n, fp) \
+{ \
+ guint32 idata; \
+ \
+ idata = (guint32)n; \
+ fwrite(&idata, sizeof(idata), 1, fp); \
+}
#define WRITE_CACHE_DATA(data, fp) \
{ \
- gint len; \
+ size_t len; \
if (data == NULL) \
len = 0; \
else \
{
gchar buf[BUFFSIZE];
gint ret = 0;
- size_t len;
+ guint32 len;
if (fread(&len, sizeof(len), 1, fp) == 1) {
- if (len < 0)
+ if (len > G_MAXINT)
ret = -1;
else {
gchar *tmp = NULL;
READ_CACHE_DATA(msginfo->inreplyto, fp);
READ_CACHE_DATA(msginfo->references, fp);
READ_CACHE_DATA(msginfo->xref, fp);
+ READ_CACHE_DATA_INT(msginfo->planned_download, fp);
msginfo->folder = item;
msginfo->flags.tmp_flags |= tmp_flags;
cache->memusage += procmsg_msginfo_memusage(msginfo);
}
fclose(fp);
+ g_hash_table_thaw(cache->msgnum_table);
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);
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);
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);
}
static void msgcache_write_flags(MsgInfo *msginfo, FILE *fp)