static void DeserializePrefs(const char *prefsTxt, SerializableGlobalPrefs& globalPrefs, FileHistory& fh, Favorites *favs) { BencObj *obj = BencObj::Decode(prefsTxt); if (!obj || obj->Type() != BT_DICT) goto Exit; BencDict *prefs = static_cast<BencDict *>(obj); BencDict *global = prefs->GetDict(GLOBAL_PREFS_STR); if (!global) goto Exit; DeserializeStruct(gGlobalPrefInfo, dimof(gGlobalPrefInfo), &globalPrefs, global); free(globalPrefs.prevSerialization); globalPrefs.prevSerialization = global->Encode(); int weekDiff = GetWeekCount() - globalPrefs.openCountWeek; globalPrefs.openCountWeek = GetWeekCount(); BencArray *fileHistory = prefs->GetArray(FILE_HISTORY_STR); if (!fileHistory) goto Exit; size_t dlen = fileHistory->Length(); for (size_t i = 0; i < dlen; i++) { BencDict *dict = fileHistory->GetDict(i); assert(dict); if (!dict) continue; DisplayState *state = DeserializeDisplayState(dict, globalPrefs.globalPrefsOnly); if (state) { // "age" openCount statistics (cut in in half after every week) state->openCount >>= weekDiff; fh.Append(state); } } BencArray *favsArr = prefs->GetArray(FAVS_STR); if (!favsArr) goto Exit; for (size_t i = 0; i < favsArr->Length(); i += 2) { BencString *filePathBenc = favsArr->GetString(i); BencArray *favData = favsArr->GetArray(i+1); if (!filePathBenc || !favData) break; ScopedMem<WCHAR> filePath(filePathBenc->Value()); for (size_t j = 0; j < favData->Length(); j += 2) { // we're lenient about errors BencInt *pageNoBenc = favData->GetInt(j); BencString *nameBenc = favData->GetString(j + 1); if (!pageNoBenc || !nameBenc) break; int pageNo = (int)pageNoBenc->Value(); ScopedMem<WCHAR> name(nameBenc->Value()); favs->AddOrReplace(filePath, pageNo, EmptyToNull(name)); } } Exit: delete obj; }
/* Caller needs to prefs::CleanUp() */ bool Load() { CrashIf(gGlobalPrefs); ScopedMem<WCHAR> path(GetSettingsPath()); ScopedMem<char> prefsData(file::ReadAll(path, NULL)); gGlobalPrefs = (GlobalPrefs *)DeserializeStruct(&gGlobalPrefsInfo, prefsData); CrashAlwaysIf(!gGlobalPrefs); #ifdef DISABLE_EBOOK_UI if (!file::Exists(path)) gGlobalPrefs->ebookUI.useFixedPageUI = gGlobalPrefs->chmUI.useFixedPageUI = true; #endif #ifdef DISABLE_TABS if (!file::Exists(path)) gGlobalPrefs->useTabs = false; #endif if (!gGlobalPrefs->uiLanguage || !trans::ValidateLangCode(gGlobalPrefs->uiLanguage)) { // guess the ui language on first start str::ReplacePtr(&gGlobalPrefs->uiLanguage, trans::DetectUserLang()); } gGlobalPrefs->lastPrefUpdate = file::GetModificationTime(path); gGlobalPrefs->defaultDisplayModeEnum = conv::ToDisplayMode(gGlobalPrefs->defaultDisplayMode, DM_AUTOMATIC); gGlobalPrefs->defaultZoomFloat = conv::ToZoom(gGlobalPrefs->defaultZoom, ZOOM_ACTUAL_SIZE); CrashIf(!IsValidZoom(gGlobalPrefs->defaultZoomFloat)); int weekDiff = GetWeekCount() - gGlobalPrefs->openCountWeek; gGlobalPrefs->openCountWeek = GetWeekCount(); if (weekDiff > 0) { // "age" openCount statistics (cut in in half after every week) for (DisplayState **ds = gGlobalPrefs->fileStates->IterStart(); ds; ds = gGlobalPrefs->fileStates->IterNext()) { (*ds)->openCount >>= weekDiff; } } // make sure that zoom levels are in the order expected by DisplayModel gGlobalPrefs->zoomLevels->Sort(cmpFloat); while (gGlobalPrefs->zoomLevels->Count() > 0 && gGlobalPrefs->zoomLevels->At(0) < ZOOM_MIN) { gGlobalPrefs->zoomLevels->PopAt(0); } while (gGlobalPrefs->zoomLevels->Count() > 0 && gGlobalPrefs->zoomLevels->Last() > ZOOM_MAX) { gGlobalPrefs->zoomLevels->Pop(); } // TODO: verify that all states have a non-NULL file path? gFileHistory.UpdateStatesSource(gGlobalPrefs->fileStates); SetDefaultEbookFont(gGlobalPrefs->ebookUI.fontName, gGlobalPrefs->ebookUI.fontSize); if (!file::Exists(path)) Save(); return true; }
static BencDict* SerializeGlobalPrefs(SerializableGlobalPrefs& globalPrefs) { BencDict *prefs = new BencDict(); if (!prefs) return NULL; prefs->Add(TOOLBAR_VISIBLE_STR, globalPrefs.toolbarVisible); prefs->Add(TOC_VISIBLE_STR, globalPrefs.tocVisible); prefs->Add(FAV_VISIBLE_STR, globalPrefs.favVisible); prefs->Add(SIDEBAR_DX_STR, globalPrefs.sidebarDx); prefs->Add(TOC_DY_STR, globalPrefs.tocDy); prefs->Add(PDF_ASSOCIATE_DONT_ASK_STR, globalPrefs.pdfAssociateDontAskAgain); prefs->Add(PDF_ASSOCIATE_ASSOCIATE_STR, globalPrefs.pdfAssociateShouldAssociate); prefs->Add(BG_COLOR_STR, globalPrefs.bgColor); prefs->Add(ESC_TO_EXIT_STR, globalPrefs.escToExit); prefs->Add(USE_SYS_COLORS_STR, globalPrefs.useSysColors); prefs->Add(ENABLE_AUTO_UPDATE_STR, globalPrefs.enableAutoUpdate); prefs->Add(REMEMBER_OPENED_FILES_STR, globalPrefs.rememberOpenedFiles); prefs->Add(GLOBAL_PREFS_ONLY_STR, globalPrefs.globalPrefsOnly); prefs->Add(SHOW_RECENT_FILES_STR, globalPrefs.showStartPage); const WCHAR *mode = DisplayModeConv::NameFromEnum(globalPrefs.defaultDisplayMode); prefs->Add(DISPLAY_MODE_STR, mode); CrashIf(!IsValidZoom(globalPrefs.defaultZoom)); ScopedMem<char> zoom(str::Format("%.4f", globalPrefs.defaultZoom)); prefs->AddRaw(ZOOM_VIRTUAL_STR, zoom); prefs->Add(WINDOW_STATE_STR, globalPrefs.windowState); prefs->Add(WINDOW_X_STR, globalPrefs.windowPos.x); prefs->Add(WINDOW_Y_STR, globalPrefs.windowPos.y); prefs->Add(WINDOW_DX_STR, globalPrefs.windowPos.dx); prefs->Add(WINDOW_DY_STR, globalPrefs.windowPos.dy); if (globalPrefs.inverseSearchCmdLine) prefs->Add(INVERSE_SEARCH_COMMANDLINE, globalPrefs.inverseSearchCmdLine); prefs->Add(ENABLE_TEX_ENHANCEMENTS_STR, globalPrefs.enableTeXEnhancements); if (globalPrefs.versionToSkip) prefs->Add(VERSION_TO_SKIP_STR, globalPrefs.versionToSkip); if (globalPrefs.lastUpdateTime) prefs->AddRaw(LAST_UPDATE_STR, globalPrefs.lastUpdateTime); prefs->AddRaw(UI_LANGUAGE_STR, globalPrefs.currentLanguage); if (!globalPrefs.openCountWeek) globalPrefs.openCountWeek = GetWeekCount(); prefs->Add(OPEN_COUNT_WEEK_STR, globalPrefs.openCountWeek); prefs->Add(FWDSEARCH_OFFSET, globalPrefs.fwdSearch.offset); prefs->Add(FWDSEARCH_COLOR, globalPrefs.fwdSearch.color); prefs->Add(FWDSEARCH_WIDTH, globalPrefs.fwdSearch.width); prefs->Add(FWDSEARCH_PERMANENT, globalPrefs.fwdSearch.permanent); prefs->Add(CBX_RIGHT2LEFT, globalPrefs.cbxR2L); return prefs; }
static BencDict* SerializeGlobalPrefs(SerializableGlobalPrefs& globalPrefs) { CrashIf(!IsValidZoom(globalPrefs.defaultZoom)); if (!globalPrefs.openCountWeek) globalPrefs.openCountWeek = GetWeekCount(); BencDict *prevDict = NULL; if (globalPrefs.prevSerialization) prevDict = BencDict::Decode(globalPrefs.prevSerialization, NULL); return SerializeStruct(gGlobalPrefInfo, dimof(gGlobalPrefInfo), &globalPrefs, prevDict); }
static void DeserializePrefs(const char *prefsTxt, SerializableGlobalPrefs& globalPrefs, FileHistory& fh, Favorites *favs) { BencObj *obj = BencObj::Decode(prefsTxt); if (!obj || obj->Type() != BT_DICT) goto Exit; BencDict *prefs = static_cast<BencDict *>(obj); BencDict *global = prefs->GetDict(GLOBAL_PREFS_STR); if (!global) goto Exit; Retrieve(global, TOOLBAR_VISIBLE_STR, globalPrefs.toolbarVisible); Retrieve(global, TOC_VISIBLE_STR, globalPrefs.tocVisible); Retrieve(global, FAV_VISIBLE_STR, globalPrefs.favVisible); Retrieve(global, SIDEBAR_DX_STR, globalPrefs.sidebarDx); Retrieve(global, TOC_DY_STR, globalPrefs.tocDy); Retrieve(global, PDF_ASSOCIATE_DONT_ASK_STR, globalPrefs.pdfAssociateDontAskAgain); Retrieve(global, PDF_ASSOCIATE_ASSOCIATE_STR, globalPrefs.pdfAssociateShouldAssociate); Retrieve(global, ESC_TO_EXIT_STR, globalPrefs.escToExit); Retrieve(global, USE_SYS_COLORS_STR, globalPrefs.useSysColors); Retrieve(global, BG_COLOR_STR, globalPrefs.bgColor); Retrieve(global, ENABLE_AUTO_UPDATE_STR, globalPrefs.enableAutoUpdate); Retrieve(global, REMEMBER_OPENED_FILES_STR, globalPrefs.rememberOpenedFiles); Retrieve(global, GLOBAL_PREFS_ONLY_STR, globalPrefs.globalPrefsOnly); Retrieve(global, SHOW_RECENT_FILES_STR, globalPrefs.showStartPage); Retrieve(global, DISPLAY_MODE_STR, globalPrefs.defaultDisplayMode); Retrieve(global, ZOOM_VIRTUAL_STR, globalPrefs.defaultZoom); Retrieve(global, WINDOW_STATE_STR, globalPrefs.windowState); Retrieve(global, WINDOW_X_STR, globalPrefs.windowPos.x); Retrieve(global, WINDOW_Y_STR, globalPrefs.windowPos.y); Retrieve(global, WINDOW_DX_STR, globalPrefs.windowPos.dx); Retrieve(global, WINDOW_DY_STR, globalPrefs.windowPos.dy); Retrieve(global, INVERSE_SEARCH_COMMANDLINE, globalPrefs.inverseSearchCmdLine); Retrieve(global, ENABLE_TEX_ENHANCEMENTS_STR, globalPrefs.enableTeXEnhancements); Retrieve(global, VERSION_TO_SKIP_STR, globalPrefs.versionToSkip); RetrieveRaw(global, LAST_UPDATE_STR, globalPrefs.lastUpdateTime); const char *lang = GetRawString(global, UI_LANGUAGE_STR); const char *langCode = trans::ValidateLanguageCode(lang); if (langCode) globalPrefs.currentLanguage = langCode; Retrieve(global, FWDSEARCH_OFFSET, globalPrefs.fwdSearch.offset); Retrieve(global, FWDSEARCH_COLOR, globalPrefs.fwdSearch.color); Retrieve(global, FWDSEARCH_WIDTH, globalPrefs.fwdSearch.width); Retrieve(global, FWDSEARCH_PERMANENT, globalPrefs.fwdSearch.permanent); Retrieve(global, CBX_RIGHT2LEFT, globalPrefs.cbxR2L); Retrieve(global, OPEN_COUNT_WEEK_STR, globalPrefs.openCountWeek); int weekDiff = GetWeekCount() - globalPrefs.openCountWeek; globalPrefs.openCountWeek = GetWeekCount(); BencArray *fileHistory = prefs->GetArray(FILE_HISTORY_STR); if (!fileHistory) goto Exit; size_t dlen = fileHistory->Length(); for (size_t i = 0; i < dlen; i++) { BencDict *dict = fileHistory->GetDict(i); assert(dict); if (!dict) continue; DisplayState *state = DeserializeDisplayState(dict, globalPrefs.globalPrefsOnly); if (state) { // "age" openCount statistics (cut in in half after every week) state->openCount >>= weekDiff; fh.Append(state); } } BencArray *favsArr = prefs->GetArray(FAVS_STR); if (!favsArr) goto Exit; for (size_t i = 0; i < favsArr->Length(); i += 2) { BencString *filePathBenc = favsArr->GetString(i); BencArray *favData = favsArr->GetArray(i+1); if (!filePathBenc || !favData) break; ScopedMem<WCHAR> filePath(filePathBenc->Value()); for (size_t j = 0; j < favData->Length(); j += 2) { // we're lenient about errors BencInt *pageNoBenc = favData->GetInt(j); BencString *nameBenc = favData->GetString(j + 1); if (!pageNoBenc || !nameBenc) break; int pageNo = (int)pageNoBenc->Value(); ScopedMem<WCHAR> name(nameBenc->Value()); favs->AddOrReplace(filePath, pageNo, EmptyToNull(name)); } } Exit: delete obj; }