-static gint procmsg_read_cache_data_str(FILE *fp, gchar **str)
-{
- 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;
-
- if (ret < 0)
- g_warning("Cache data is corrupted\n");
-
- return ret;
-}
-
-#define READ_CACHE_DATA(data, fp) \
-{ \
- if (procmsg_read_cache_data_str(fp, &data) < 0) { \
- procmsg_msginfo_free(msginfo); \
- break; \
- } \
-}
-
-#define READ_CACHE_DATA_INT(n, fp) \
-{ \
- if (fread(&n, sizeof(n), 1, fp) != 1) { \
- g_warning("Cache data is corrupted\n"); \
- procmsg_msginfo_free(msginfo); \
- break; \
- } \
-}
-
-GSList *procmsg_read_cache(FolderItem *item, gboolean scan_file)
-{
- GSList *mlist = NULL;
- GSList *last = NULL;
- gchar *cache_file;
- FILE *fp;
- MsgInfo *msginfo;
- MsgFlags default_flags;
- gchar file_buf[BUFFSIZE];
- gint ver;
- guint num;
- FolderType type;
-
- g_return_val_if_fail(item != NULL, NULL);
- g_return_val_if_fail(item->folder != NULL, NULL);
- type = item->folder->type;
-
- default_flags.perm_flags = MSG_NEW|MSG_UNREAD;
- default_flags.tmp_flags = MSG_CACHED;
- if (type == F_MH || type == F_IMAP) {
- if (item->stype == F_QUEUE) {
- MSG_SET_TMP_FLAGS(default_flags, MSG_QUEUED);
- } else if (item->stype == F_DRAFT) {
- MSG_SET_TMP_FLAGS(default_flags, MSG_DRAFT);
- }
- }
- if (type == F_IMAP) {
- MSG_SET_TMP_FLAGS(default_flags, MSG_IMAP);
- } else if (type == F_NEWS) {
- MSG_SET_TMP_FLAGS(default_flags, MSG_NEWS);
- }
-
- if (type == F_MH) {
- gchar *path;
-
- path = folder_item_get_path(item);
- if (change_dir(path) < 0) {
- g_free(path);
- return NULL;
- }
- g_free(path);
- }
- cache_file = folder_item_get_cache_file(item);
- if ((fp = fopen(cache_file, "rb")) == NULL) {
- debug_print("\tNo cache file\n");
- g_free(cache_file);
- return NULL;
- }
- setvbuf(fp, file_buf, _IOFBF, sizeof(file_buf));
- g_free(cache_file);
-
- debug_print("\tReading summary cache...\n");
-
- /* 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;
- }
-
- while (fread(&num, sizeof(num), 1, fp) == 1) {
- msginfo = procmsg_msginfo_new();
- msginfo->msgnum = num;
- 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);
-
-
- MSG_SET_PERM_FLAGS(msginfo->flags, default_flags.perm_flags);
- MSG_SET_TMP_FLAGS(msginfo->flags, default_flags.tmp_flags);
-
- /* if the message file doesn't exist or is changed,
- don't add the data */
- if (type == F_MH && scan_file &&
- folder_item_is_msg_changed(item, msginfo))
- procmsg_msginfo_free(msginfo);
- else {
- msginfo->folder = item;
-
- if (!mlist)
- last = mlist = g_slist_append(NULL, msginfo);
- else {
- last = g_slist_append(last, msginfo);
- last = last->next;
- }
- }
- }
-
- fclose(fp);
- debug_print("done.\n");
-
- return mlist;
-}
-
-#undef READ_CACHE_DATA
-#undef READ_CACHE_DATA_INT
-
-void procmsg_set_flags(GSList *mlist, FolderItem *item)
-{
- GSList *cur, *tmp;
- gint newmsg = 0;
- gint lastnum = 0;
- gchar *markdir;
- MsgInfo *msginfo;
- GHashTable *mark_table;
- MsgFlags *flags;
-
- if (!mlist) return;
- g_return_if_fail(item != NULL);
- g_return_if_fail(item->folder != NULL);
-
- debug_print("\tMarking the messages...\n");
-
- markdir = folder_item_get_path(item);
- if (!is_dir_exist(markdir))
- make_dir_hier(markdir);
-
- mark_table = procmsg_read_mark_file(markdir);
- g_free(markdir);
-
- if (!mark_table) return;
-
- for (cur = mlist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
-
- if (lastnum < msginfo->msgnum)
- lastnum = msginfo->msgnum;
-
- flags = g_hash_table_lookup
- (mark_table, GUINT_TO_POINTER(msginfo->msgnum));
-
- if (flags != NULL) {
- /* add the permanent flags only */
- msginfo->flags.perm_flags = flags->perm_flags;
- if (item->folder->type == F_IMAP) {
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_IMAP);
- } else if (item->folder->type == F_NEWS) {
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_NEWS);
- }
- } else {
- /* not found (new message) */
- if (newmsg == 0) {
- for (tmp = mlist; tmp != cur; tmp = tmp->next)
- MSG_UNSET_PERM_FLAGS
- (((MsgInfo *)tmp->data)->flags,
- MSG_NEW);
- }
- newmsg++;
- }
- }
-
- item->last_num = lastnum;
-
- debug_print("done.\n");
- if (newmsg)
- debug_print("\t%d new message(s)\n", newmsg);
-
- hash_free_value_mem(mark_table);
- g_hash_table_destroy(mark_table);
-}
-