struct _MsgCache {
GHashTable *msgnum_table;
+ GHashTable *msgid_table;
guint memusage;
time_t last_access;
};
MsgCache *cache;
cache = g_new0(MsgCache, 1),
- cache->msgnum_table = g_hash_table_new(NULL, NULL);
+ cache->msgnum_table = g_hash_table_new(g_int_hash, g_int_equal);
+ cache->msgid_table = g_hash_table_new(g_str_hash, g_str_equal);
cache->last_access = time(NULL);
return cache;
g_return_if_fail(cache != NULL);
g_hash_table_foreach_remove(cache->msgnum_table, msgcache_msginfo_free_func, NULL);
+ g_hash_table_destroy(cache->msgid_table);
g_hash_table_destroy(cache->msgnum_table);
g_free(cache);
}
g_return_if_fail(msginfo != NULL);
newmsginfo = procmsg_msginfo_new_ref(msginfo);
- g_hash_table_insert(cache->msgnum_table, GINT_TO_POINTER(msginfo->msgnum), newmsginfo);
+ g_hash_table_insert(cache->msgnum_table, &newmsginfo->msgnum, newmsginfo);
+ if(newmsginfo->msgid != NULL)
+ g_hash_table_insert(cache->msgid_table, newmsginfo->msgid, newmsginfo);
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 byte\n", g_hash_table_size(cache->msgnum_table), cache->memusage);
}
void msgcache_remove_msg(MsgCache *cache, guint msgnum)
g_return_if_fail(cache != NULL);
g_return_if_fail(msgnum > 0);
- msginfo = (MsgInfo *) g_hash_table_lookup(cache->msgnum_table, GINT_TO_POINTER(msgnum));
+ msginfo = (MsgInfo *) g_hash_table_lookup(cache->msgnum_table, &msgnum);
if(!msginfo)
return;
cache->memusage -= procmsg_msginfo_memusage(msginfo);
+ if(msginfo->msgid)
+ g_hash_table_remove(cache->msgid_table, msginfo->msgid);
+ g_hash_table_remove(cache->msgnum_table, &msginfo->msgnum);
procmsg_msginfo_free(msginfo);
- g_hash_table_remove(cache->msgnum_table, GINT_TO_POINTER(msgnum));
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 byte\n", g_hash_table_size(cache->msgnum_table), cache->memusage);
}
void msgcache_update_msg(MsgCache *cache, MsgInfo *msginfo)
g_return_if_fail(cache != NULL);
g_return_if_fail(msginfo != NULL);
- oldmsginfo = g_hash_table_lookup(cache->msgnum_table, GINT_TO_POINTER(msginfo->msgnum));
+ oldmsginfo = g_hash_table_lookup(cache->msgnum_table, &msginfo->msgnum);
if(msginfo) {
- g_hash_table_remove(cache->msgnum_table, GINT_TO_POINTER(oldmsginfo->msgnum));
+ g_hash_table_remove(cache->msgid_table, oldmsginfo->msgid);
+ g_hash_table_remove(cache->msgnum_table, &oldmsginfo->msgnum);
procmsg_msginfo_free(oldmsginfo);
}
cache->memusage -= procmsg_msginfo_memusage(oldmsginfo);
newmsginfo = procmsg_msginfo_new_ref(msginfo);
- g_hash_table_insert(cache->msgnum_table, GINT_TO_POINTER(msginfo->msgnum), newmsginfo);
+ g_hash_table_insert(cache->msgnum_table, &newmsginfo->msgnum, newmsginfo);
+ if(newmsginfo->msgid)
+ g_hash_table_insert(cache->msgid_table, newmsginfo->msgid, newmsginfo);
cache->memusage += procmsg_msginfo_memusage(newmsginfo);
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 byte\n", g_hash_table_size(cache->msgnum_table), cache->memusage);
return;
}
ret = -1;
if (ret < 0)
- g_warning(_("Cache data is corrupted\n"));
+ g_warning("Cache data is corrupted\n");
return ret;
}
#define READ_CACHE_DATA_INT(n, fp) \
{ \
if (fread(&n, sizeof(n), 1, fp) != 1) { \
- g_warning(_("Cache data is corrupted\n")); \
+ g_warning("Cache data is corrupted\n"); \
procmsg_msginfo_free(msginfo); \
error = TRUE; \
break; \
MsgCache *cache;
FILE *fp;
MsgInfo *msginfo;
-/* MsgFlags default_flags; */
+ MsgTmpFlags tmp_flags = 0;
gchar file_buf[BUFFSIZE];
gint ver;
guint num;
g_return_val_if_fail(item != NULL, NULL);
if ((fp = fopen(cache_file, "rb")) == NULL) {
- debug_print(_("\tNo cache file\n"));
+ debug_print("\tNo cache file\n");
return NULL;
}
setvbuf(fp, file_buf, _IOFBF, sizeof(file_buf));
- debug_print(_("\tReading message cache from %s...\n"), cache_file);
+ 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"));
+ 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();
g_hash_table_freeze(cache->msgnum_table);
READ_CACHE_DATA(msginfo->references, fp);
READ_CACHE_DATA(msginfo->xref, fp);
-/*
- MSG_SET_PERM_FLAGS(msginfo->flags, default_flags.perm_flags);
- MSG_SET_TMP_FLAGS(msginfo->flags, default_flags.tmp_flags);
-*/
msginfo->folder = item;
+ msginfo->flags.tmp_flags |= tmp_flags;
- g_hash_table_insert(cache->msgnum_table, GINT_TO_POINTER(msginfo->msgnum), msginfo);
+ 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);
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);
+ 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);
return cache;
}
guint num;
if ((fp = fopen(mark_file, "rb")) == NULL) {
- debug_print(_("Mark file not found.\n"));
+ debug_print("Mark file not found.\n");
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);
+ 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);
+ 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, GUINT_TO_POINTER(num));
+ msginfo = g_hash_table_lookup(cache->msgnum_table, &num);
if(msginfo) {
msginfo->flags.perm_flags = perm_flags;
}
#define WRITE_CACHE_DATA(data, fp) \
{ \
gint len; \
- \
- if (data == NULL || (len = strlen(data)) == 0) { \
+ if (data == NULL) \
len = 0; \
- WRITE_CACHE_DATA_INT(len, fp); \
- } else { \
+ else \
len = strlen(data); \
- WRITE_CACHE_DATA_INT(len, fp); \
+ WRITE_CACHE_DATA_INT(len, fp); \
+ if (len > 0) { \
fwrite(data, len, 1, fp); \
} \
}
{
MsgInfo *msginfo;
struct write_fps *write_fps;
-
+
msginfo = (MsgInfo *)value;
write_fps = user_data;
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);
+ 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");
cache->last_access = time(NULL);
- debug_print(_("done.\n"));
+ debug_print("done.\n");
+ return 0;
}
MsgInfo *msgcache_get_msg(MsgCache *cache, guint num)
g_return_val_if_fail(cache != NULL, NULL);
- msginfo = g_hash_table_lookup(cache->msgnum_table, GINT_TO_POINTER(num));
+ 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;
+ MsgInfoList **listptr = user_data;
MsgInfo *msginfo = value;
*listptr = g_slist_prepend(*listptr, procmsg_msginfo_new_ref(msginfo));
}
-GSList *msgcache_get_msg_list(MsgCache *cache)
+MsgInfoList *msgcache_get_msg_list(MsgCache *cache)
{
- GSList *msg_list = NULL;
+ MsgInfoList *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;
}