MsgCache *msgcache_read_cache(FolderItem *item, const gchar *cache_file) { MsgCache *cache; FILE *fp; MsgInfo *msginfo; MsgTmpFlags tmp_flags = 0; gchar file_buf[BUFFSIZE]; guint num; gboolean error = FALSE; StringConverter *conv = NULL; gchar *srccharset = NULL; const gchar *dstcharset = NULL; g_return_val_if_fail(cache_file != NULL, NULL); g_return_val_if_fail(item != NULL, NULL); if ((fp = msgcache_open_data_file (cache_file, CACHE_VERSION, DATA_READ, file_buf, sizeof(file_buf))) == NULL) return NULL; debug_print("\tReading message cache from %s...\n", cache_file); if (item->stype == F_QUEUE) { tmp_flags |= MSG_QUEUED; } else if (item->stype == F_DRAFT) { tmp_flags |= MSG_DRAFT; } if (msgcache_read_cache_data_str(fp, &srccharset, NULL) < 0) return NULL; dstcharset = conv_get_current_charset_str(); 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); 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); READ_CACHE_DATA_INT(msginfo->planned_download, fp); READ_CACHE_DATA_INT(msginfo->total_size, fp); msginfo->folder = item; msginfo->flags.tmp_flags |= tmp_flags; 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); if (conv != NULL) { if (conv->free != NULL) conv->free(conv); g_free(conv); } if (error) { msgcache_destroy(cache); return NULL; } cache->last_access = time(NULL); 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; }
static void rssyl_update_format_func(FolderItem *item, gpointer data) { RFolderItem *ritem; RUpdateFormatCtx *ctx = (RUpdateFormatCtx *)data; Folder *f = NULL; FolderItem *new_item = NULL; gchar *name; OldRFeed *of; if( !IS_RSSYL_FOLDER_ITEM(item) ) return; /* Do not do anything once we reached first new folder * (which we created earlier in this process) */ if( ctx->reached_first_new ) return; if( item->folder == ctx->n_first ) { ctx->reached_first_new = TRUE; debug_print("RSSyl: (FORMAT) reached first new folder\n"); return; } debug_print("RSSyl: (FORMAT) item '%s'\n", item->name); if( folder_item_parent(item) == NULL ) { /* Root rssyl folder */ ctx->oldroots = g_slist_prepend(ctx->oldroots, item); /* Create its counterpart */ name = rssyl_strreplace(folder_item_get_name(item), " (RSSyl)", ""); debug_print("RSSyl: (FORMAT) adding new root folder '%s'\n", name); f = folder_new(rssyl_folder_get_class(), name, NULL); g_free(name); g_return_if_fail(f != NULL); folder_add(f); folder_write_list(); new_item = FOLDER_ITEM(f->node->data); /* If user has more than one old rssyl foldertrees, keep the n_first * pointer at the beginning of first one. */ if (ctx->n_first == NULL) ctx->n_first = f; ctx->n_parent = new_item; } else { /* Non-root folder */ if (folder_item_parent(item) == ctx->o_prev) { /* We went one step deeper in folder hierarchy, adjust pointers * to parents */ ctx->o_parent = ctx->o_prev; ctx->n_parent = ctx->n_prev; } else if (folder_item_parent(item) != ctx->o_parent) { /* We are not in same folder anymore, which can only mean we have * moved up in the hierarchy. Find a correct parent */ while (folder_item_parent(item) != ctx->o_parent) { ctx->o_parent = folder_item_parent(ctx->o_parent); ctx->n_parent = folder_item_parent(ctx->n_parent); if (ctx->o_parent == NULL) { /* This shouldn't happen, unless we are magically moved to a * completely different folder structure */ debug_print("RSSyl: MISHAP WHILE UPGRADING STORAGE FORMAT: couldn't find folder parent\n"); alertpanel_error(_("Internal problem while upgrading storage format. This should not happen. Please report this, with debug output attached.\n")); return; } } } else { /* We have remained in the same subfolder, nothing to do here */ } debug_print("RSSyl: (FORMAT) adding folder '%s'\n", item->name); new_item = folder_create_folder(ctx->n_parent, item->name); if (new_item == NULL) { debug_print("RSSyl: (FORMAT) couldn't add folder '%s', skipping it\n", item->name); return; } of = rssyl_old_feed_get_by_name(ctx->oldfeeds, item->name); if (of != NULL && of->url != NULL) { /* Folder with an actual subscribed feed */ debug_print("RSSyl: (FORMAT) making '%s' a feed with URL '%s'\n", item->name, of->url); ritem = (RFolderItem *)new_item; ritem->url = g_strdup(of->url); rssyl_feed_start_refresh_timeout(ritem); ritem->official_title = g_strdup(of->official_name); ritem->default_refresh_interval = (of->default_refresh_interval != 0 ? TRUE : FALSE); ritem->refresh_interval = of->refresh_interval; ritem->keep_old = (of->expired_num > -1 ? TRUE : FALSE); ritem->fetch_comments = (of->fetch_comments != 0 ? TRUE : FALSE); ritem->fetch_comments_max_age = of->fetch_comments_for; ritem->silent_update = of->silent_update; ritem->ssl_verify_peer = of->ssl_verify_peer; folder_item_prefs_copy_prefs(item, &ritem->item); } rssyl_update_format_move_contents(item, new_item); /* destroy the new folder's cache so we'll re-read the migrated one */ if (new_item->cache) { msgcache_destroy(new_item->cache); new_item->cache = NULL; } /* Store folderlist with the new folder */ folder_item_scan(new_item); folder_write_list(); } ctx->o_prev = item; ctx->n_prev = new_item; }