From 6b3ded37e4a4825be2df3612bdcbb7dfc00a1800 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 4 Mar 2014 20:41:13 +0000 Subject: HistoryStats sources git-svn-id: http://svn.miranda-ng.org/main/trunk@8397 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- .../HistoryStats/settingsserializer.cpp | 513 +++++++++++++++++++++ 1 file changed, 513 insertions(+) create mode 100644 plugins/!NotAdopted/HistoryStats/settingsserializer.cpp (limited to 'plugins/!NotAdopted/HistoryStats/settingsserializer.cpp') diff --git a/plugins/!NotAdopted/HistoryStats/settingsserializer.cpp b/plugins/!NotAdopted/HistoryStats/settingsserializer.cpp new file mode 100644 index 0000000000..7703f241e2 --- /dev/null +++ b/plugins/!NotAdopted/HistoryStats/settingsserializer.cpp @@ -0,0 +1,513 @@ +#include "_globals.h" +#include "settingsserializer.h" + +#include "settingstree.h" +#include "column.h" + +/* + * SettingsSerializer + */ + +static const mu_ansi* g_UsedSettings[] = { + // special + con::SettVersion, + con::SettLastPage, + con::SettShowColumnInfo, + con::SettShowSupportInfo, + con::SettLastStatisticsFile, + // normal + con::SettAutoOpenOptions, + con::SettAutoOpenStartup, + con::SettAutoOpenMenu, + con::SettAverageMinTime, + con::SettCalcTotals, + con::SettChatSessionMinDur, + con::SettChatSessionTimeout, + con::SettColumns, + con::SettFilterBBCodes, + con::SettFilterWords, + con::SettGraphicsMode, + con::SettHeaderTooltips, + con::SettHeaderTooltipsIfCustom, + con::SettHideContactMenuProtos, + con::SettIgnoreAfter, + con::SettIgnoreBefore, + con::SettIgnoreOld, + con::SettMenuItem, + con::SettMergeContacts, + con::SettMergeContactsGroups, + con::SettMergeMode, + con::SettMetaContactsMode, + con::SettNickname, + con::SettOmitByRank, + con::SettOmitByTime, + con::SettOmitByTimeDays, + con::SettOmitByValue, + con::SettOmitByValueData, + con::SettOmitByValueLimit, + con::SettOmitContacts, + con::SettOmitNumOnTop, + con::SettOmittedInTotals, + con::SettOmittedInExtraRow, + con::SettOnStartup, + con::SettOutput, + con::SettOutputExtraFolder, + con::SettOutputExtraToFolder, + con::SettOutputVariables, + con::SettOverwriteAlways, + con::SettPathToBrowser, + con::SettPNGMode, + con::SettProtosIgnore, + con::SettRemoveEmptyContacts, + con::SettRemoveInChatsZero, + con::SettRemoveInBytesZero, + con::SettRemoveOutChatsZero, + con::SettRemoveOutBytesZero, + con::SettShowContactMenu, + con::SettShowContactMenuPseudo, + con::SettShowMenuSub, + con::SettSort, + con::SettTableHeader, + con::SettTableHeaderRepeat, + con::SettTableHeaderVerbose, + con::SettThreadLowPriority, + con::SettWordDelimiters, +}; + +SettingsSerializer::SettingsSerializer(const mu_ansi* module) +{ + m_DB.setContact(0); + m_DB.setModule(module); +} + +void SettingsSerializer::readFromDB() +{ + clearColumns(); + + ext::string defaultNick = mu::clist::getContactDisplayName(0); + SettingsTree settingsTree; + + // read version tag + m_VersionInDB = m_DB.readDWord(con::SettVersion, 0); + + // -- global settings -- + + m_OnStartup = m_DB.readBool(con::SettOnStartup , false); + m_GraphicsMode = m_DB.readByte(con::SettGraphicsMode , gmHTML); + m_PNGMode = m_DB.readByte(con::SettPNGMode , pmHTMLFallBack); + m_ShowMainMenu = m_DB.readBool(con::SettMenuItem , true); + m_ShowMainMenuSub = m_DB.readBool(con::SettShowMenuSub , true); + m_ShowContactMenu = m_DB.readBool(con::SettShowContactMenu , true); + m_ShowContactMenuPseudo = m_DB.readBool(con::SettShowContactMenuPseudo, false); + m_ThreadLowPriority = m_DB.readBool(con::SettThreadLowPriority , true); + m_PathToBrowser = m_DB.readStr (con::SettPathToBrowser , muT("")); + + m_HideContactMenuProtos.clear(); + m_DB.readTree(con::SettHideContactMenuProtos, getDefaultHideContactMenuProtos(), settingsTree); + + int nHideContactMenuProtos = settingsTree.readInt(con::KeyNum, 0); + + upto_each_(i, nHideContactMenuProtos) + { + m_HideContactMenuProtos.insert(utils::toA(settingsTree.readStr(utils::intToString(i).c_str(), muT("")))); + } + + // -- input settings -- + + + m_ChatSessionMinDur = m_DB.readWord(con::SettChatSessionMinDur , 0); + m_ChatSessionTimeout = m_DB.readWord(con::SettChatSessionTimeout, 900); + m_AverageMinTime = m_DB.readWord(con::SettAverageMinTime , 0); + m_WordDelimiters = m_DB.readStr (con::SettWordDelimiters , getDefaultWordDelimiters()); + + m_ProtosIgnore.clear(); + m_DB.readTree(con::SettProtosIgnore, getDefaultProtosIgnore(), settingsTree); + + int nIgnoreProtos = settingsTree.readInt(con::KeyNum, 0); + + upto_each_(i, nIgnoreProtos) + { + m_ProtosIgnore.insert(utils::toA(settingsTree.readStr(utils::intToString(i).c_str(), muT("")))); + } + + m_IgnoreOld = m_DB.readWord(con::SettIgnoreOld , 0); + m_IgnoreBefore = m_DB.readStr (con::SettIgnoreBefore , muT("")); + m_IgnoreAfter = m_DB.readStr (con::SettIgnoreAfter , muT("")); + m_FilterRawRTF = m_DB.readBool(con::SettFilterRawRTF , false); + m_FilterBBCodes = m_DB.readBool(con::SettFilterBBCodes , false); + m_MetaContactsMode = m_DB.readByte(con::SettMetaContactsMode , mcmBoth); + m_MergeContacts = m_DB.readBool(con::SettMergeContacts , false); + m_MergeContactsGroups = m_DB.readBool(con::SettMergeContactsGroups, false); + m_MergeMode = m_DB.readByte(con::SettMergeMode , mmStrictMerge); + + // -- column settings -- + + clearColumns(); + m_DB.readTree(con::SettColumns, getDefaultColumns(), settingsTree); + + int nCols = settingsTree.readInt(con::KeyNum, 0); + + upto_each_(i, nCols) + { + ext::string colPrefix = utils::intToString(i); + + settingsTree.setKey(colPrefix.c_str()); + + Column* pCol = Column::fromUID(settingsTree.readStr(con::KeyGUID, muT(""))); + + if (pCol) + { + pCol->setEnabled(settingsTree.readBool(con::KeyEnabled, true)); + pCol->setCustomTitle(settingsTree.readStr(con::KeyTitle, muT(""))); + + settingsTree.setKey((colPrefix + con::SuffixData).c_str()); + + pCol->configRead(settingsTree); + + addCol(pCol); + } + } + + // -- output settings -- + + m_RemoveEmptyContacts = m_DB.readBool (con::SettRemoveEmptyContacts , false); + m_RemoveOutChatsZero = m_DB.readBool (con::SettRemoveOutChatsZero , false); + m_RemoveOutBytesZero = m_DB.readBool (con::SettRemoveOutBytesZero , false); + m_RemoveInChatsZero = m_DB.readBool (con::SettRemoveInChatsZero , false); + m_RemoveInBytesZero = m_DB.readBool (con::SettRemoveInBytesZero , false); + m_OmitContacts = m_DB.readBool (con::SettOmitContacts , false); + m_OmitByValue = m_DB.readBool (con::SettOmitByValue , false); + m_OmitByValueData = m_DB.readByte (con::SettOmitByValueData , obvChatsTotal); + m_OmitByValueLimit = m_DB.readDWord(con::SettOmitByValueLimit , 5); + m_OmitByTime = m_DB.readBool (con::SettOmitByTime , false); + m_OmitByTimeDays = m_DB.readWord (con::SettOmitByTimeDays , 180); + m_OmitByRank = m_DB.readBool (con::SettOmitByRank , true); + m_OmitNumOnTop = m_DB.readWord (con::SettOmitNumOnTop , 10); + m_OmittedInTotals = m_DB.readBool (con::SettOmittedInTotals , true); + m_OmittedInExtraRow = m_DB.readBool (con::SettOmittedInExtraRow , true); + m_CalcTotals = m_DB.readBool (con::SettCalcTotals , true); + m_TableHeader = m_DB.readBool (con::SettTableHeader , true); + m_TableHeaderRepeat = m_DB.readWord (con::SettTableHeaderRepeat , 0); + m_TableHeaderVerbose = m_DB.readBool (con::SettTableHeaderVerbose , false); + m_HeaderTooltips = m_DB.readBool (con::SettHeaderTooltips , true); + m_HeaderTooltipsIfCustom = m_DB.readBool (con::SettHeaderTooltipsIfCustom, true); + + m_DB.readTree(con::SettSort, getDefaultSort(), settingsTree); + + upto_each_(i, cNumSortLevels) + { + settingsTree.setKey(utils::intToString(i).c_str()); + + m_Sort[i].by = settingsTree.readIntRanged(con::KeyBy, (i == 0) ? skBytesTotalAvg : skNothing, (i == 0) ? skFIRST : skNothing, skLAST); + m_Sort[i].asc = settingsTree.readBool(con::KeyAsc, i != 0); + } + + m_OwnNick = m_DB.readStr (con::SettNickname , defaultNick.c_str()); + m_OutputVariables = m_DB.readBool(con::SettOutputVariables , false); + m_OutputFile = m_DB.readStr (con::SettOutput , getDefaultOutputFile()); + m_OutputExtraToFolder = m_DB.readBool(con::SettOutputExtraToFolder, true); + m_OutputExtraFolder = m_DB.readStr (con::SettOutputExtraFolder , getDefaultOutputExtraFolder()); + m_OverwriteAlways = m_DB.readBool(con::SettOverwriteAlways , false); + m_AutoOpenOptions = m_DB.readBool(con::SettAutoOpenOptions , false); + m_AutoOpenStartup = m_DB.readBool(con::SettAutoOpenStartup , false); + m_AutoOpenMenu = m_DB.readBool(con::SettAutoOpenMenu , false); + + // -- shared column data -- + + m_FilterWords.clear(); + m_DB.readTree(con::SettFilterWords, getDefaultFilterWords(), settingsTree); + + int nFilters = settingsTree.readInt(con::KeyNum, 0); + + upto_each_(i, nFilters) + { + ext::string strPrefix = utils::intToString(i); + + // read filter attributes + settingsTree.setKey(strPrefix.c_str()); + + Filter& curFilter = *(m_FilterWords.insert(Filter(settingsTree.readStr(con::KeyID, muT("")))).first); + + curFilter.setName(settingsTree.readStr(con::KeyName, muT(""))); + curFilter.setMode(settingsTree.readIntRanged(con::KeyMode, fwmWordsMatching, fwmFIRST, fwmLAST)); + + int nNumWords = settingsTree.readInt(con::KeyNumWords, 0); + + if (nNumWords > 0) + { + // read filter words + strPrefix += con::SuffixWords; + settingsTree.setKey(strPrefix.c_str()); + + upto_each_(j, nNumWords) + { + curFilter.addWord(settingsTree.readStr(utils::intToString(j).c_str(), muT(""))); + } + } + } + + m_DB.writeTree(con::SettFilterWords, settingsTree); + + // ensure constraints + ensureConstraints(); +} + +void SettingsSerializer::writeToDB() +{ + // update silently if DB entries are from an older version + if (isDBUpdateNeeded()) + { + updateDB(); + } + + + SettingsTree settingsTree; + + // -- global settings -- + + m_DB.writeBool(con::SettOnStartup , m_OnStartup); + m_DB.writeBool(con::SettMenuItem , m_ShowMainMenu); + m_DB.writeBool(con::SettShowMenuSub , m_ShowMainMenuSub); + m_DB.writeBool(con::SettShowContactMenu , m_ShowContactMenu); + m_DB.writeBool(con::SettShowContactMenuPseudo, m_ShowContactMenuPseudo); + m_DB.writeByte(con::SettGraphicsMode , m_GraphicsMode); + m_DB.writeByte(con::SettPNGMode , m_PNGMode); + m_DB.writeBool(con::SettThreadLowPriority , m_ThreadLowPriority); + m_DB.writeStr (con::SettPathToBrowser , m_PathToBrowser.c_str()); + + settingsTree.clear(); + settingsTree.writeInt(con::KeyNum, m_HideContactMenuProtos.size()); + + { + int i = 0; + + citer_each_(ProtoSet, j, m_HideContactMenuProtos) + { + settingsTree.writeStr(utils::intToString(i++).c_str(), utils::fromA(*j).c_str()); + } + } + + m_DB.writeTree(con::SettHideContactMenuProtos, settingsTree); + + // -- input settings -- + + m_DB.writeWord(con::SettChatSessionMinDur , m_ChatSessionMinDur); + m_DB.writeWord(con::SettChatSessionTimeout, m_ChatSessionTimeout); + m_DB.writeWord(con::SettAverageMinTime , m_AverageMinTime); + m_DB.writeStr (con::SettWordDelimiters , m_WordDelimiters.c_str()); + + settingsTree.clear(); + settingsTree.writeInt(con::KeyNum, m_ProtosIgnore.size()); + + { + int i = 0; + + citer_each_(ProtoSet, j, m_ProtosIgnore) + { + settingsTree.writeStr(utils::intToString(i++).c_str(), utils::fromA(*j).c_str()); + } + } + + m_DB.writeTree(con::SettProtosIgnore, settingsTree); + + m_DB.writeWord(con::SettIgnoreOld , m_IgnoreOld); + m_DB.writeStr (con::SettIgnoreBefore , m_IgnoreBefore.c_str()); + m_DB.writeStr (con::SettIgnoreAfter , m_IgnoreAfter.c_str()); + m_DB.writeBool(con::SettFilterRawRTF , m_FilterRawRTF); + m_DB.writeBool(con::SettFilterBBCodes , m_FilterBBCodes); + m_DB.writeByte(con::SettMetaContactsMode , m_MetaContactsMode); + m_DB.writeBool(con::SettMergeContacts , m_MergeContacts); + m_DB.writeBool(con::SettMergeContactsGroups, m_MergeContactsGroups); + m_DB.writeByte(con::SettMergeMode , m_MergeMode); + + // -- column settings -- + + settingsTree.clear(); + settingsTree.writeInt(con::KeyNum, countCol()); + + upto_each_(i, countCol()) + { + ext::string colPrefix = utils::intToString(i); + const Column* pCol = getCol(i); + + // write common data + settingsTree.setKey(colPrefix.c_str()); + + settingsTree.writeStr(con::KeyGUID, pCol->getUID()); + settingsTree.writeBool(con::KeyEnabled, pCol->isEnabled()); + settingsTree.writeStr(con::KeyTitle, pCol->getCustomTitle().c_str()); + + // write column specific data + colPrefix += con::SuffixData; + settingsTree.setKey(colPrefix.c_str()); + + pCol->configWrite(settingsTree); + } + + m_DB.writeTree(con::SettColumns, settingsTree); + + // -- output settings -- + + m_DB.writeBool (con::SettRemoveEmptyContacts , m_RemoveEmptyContacts); + m_DB.writeBool (con::SettRemoveOutChatsZero , m_RemoveOutChatsZero); + m_DB.writeBool (con::SettRemoveOutBytesZero , m_RemoveOutBytesZero); + m_DB.writeBool (con::SettRemoveInChatsZero , m_RemoveInChatsZero); + m_DB.writeBool (con::SettRemoveInBytesZero , m_RemoveInBytesZero); + m_DB.writeBool (con::SettOmitContacts , m_OmitContacts); + m_DB.writeBool (con::SettOmitByValue , m_OmitByValue); + m_DB.writeByte (con::SettOmitByValueData , m_OmitByValueData); + m_DB.writeDWord(con::SettOmitByValueLimit , m_OmitByValueLimit); + m_DB.writeBool (con::SettOmitByTime , m_OmitByTime); + m_DB.writeWord (con::SettOmitByTimeDays , m_OmitByTimeDays); + m_DB.writeBool (con::SettOmitByRank , m_OmitByRank); + m_DB.writeWord (con::SettOmitNumOnTop , m_OmitNumOnTop); + m_DB.writeBool (con::SettOmittedInTotals , m_OmittedInTotals); + m_DB.writeBool (con::SettOmittedInExtraRow , m_OmittedInExtraRow); + m_DB.writeBool (con::SettCalcTotals , m_CalcTotals); + m_DB.writeBool (con::SettTableHeader , m_TableHeader); + m_DB.writeWord (con::SettTableHeaderRepeat , m_TableHeaderRepeat); + m_DB.writeBool (con::SettTableHeaderVerbose , m_TableHeaderVerbose); + m_DB.writeBool (con::SettHeaderTooltips , m_HeaderTooltips); + m_DB.writeBool (con::SettHeaderTooltipsIfCustom, m_HeaderTooltipsIfCustom); + + settingsTree.clear(); + + upto_each_(i, cNumSortLevels) + { + settingsTree.setKey(utils::intToString(i).c_str()); + + settingsTree.writeInt(con::KeyBy, m_Sort[i].by); + settingsTree.writeBool(con::KeyAsc, m_Sort[i].asc); + } + + m_DB.writeStr (con::SettNickname , m_OwnNick.c_str()); + m_DB.writeBool(con::SettOutputVariables , m_OutputVariables); + m_DB.writeStr (con::SettOutput , m_OutputFile.c_str()); + m_DB.writeBool(con::SettOutputExtraToFolder, m_OutputExtraToFolder); + m_DB.writeStr (con::SettOutputExtraFolder , m_OutputExtraFolder.c_str()); + m_DB.writeBool(con::SettOverwriteAlways , m_OverwriteAlways); + m_DB.writeBool(con::SettAutoOpenOptions , m_AutoOpenOptions); + m_DB.writeBool(con::SettAutoOpenStartup , m_AutoOpenStartup); + m_DB.writeBool(con::SettAutoOpenMenu , m_AutoOpenMenu); + + m_DB.writeTree(con::SettSort, settingsTree); + + // -- shared column data -- + + settingsTree.clear(); + settingsTree.writeInt(con::KeyNum, m_FilterWords.size()); + + { + int nFilterNr = 0; + + citer_each_(FilterSet, i, m_FilterWords) + { + ext::string strPrefix = utils::intToString(nFilterNr++); + + // write filter attributes + settingsTree.setKey(strPrefix.c_str()); + settingsTree.writeStr(con::KeyID, i->getID().c_str()); + settingsTree.writeStr(con::KeyName, i->getName().c_str()); + settingsTree.writeInt(con::KeyMode, i->getMode()); + settingsTree.writeInt(con::KeyNumWords, i->getWords().size()); + + if (!i->getWords().empty()) + { + // write filter words + strPrefix += con::SuffixWords; + settingsTree.setKey(strPrefix.c_str()); + + int nWordNr = 0; + + citer_each_(WordSet, j, i->getWords()) + { + settingsTree.writeStr(utils::intToString(nWordNr++).c_str(), j->c_str()); + } + } + } + } + + m_DB.writeTree(con::SettFilterWords, settingsTree); +} + +bool SettingsSerializer::isDBUpdateNeeded() +{ + return (m_VersionInDB < m_VersionCurrent); +} + +void SettingsSerializer::updateDB() +{ + std::set settings; + m_DB.enumSettings(std::inserter(settings, settings.begin())); + + array_each_(i, g_UsedSettings) + { + settings.erase(g_UsedSettings[i]); + } + + iter_each_(std::set, si, settings) + { + m_DB.delSetting((*si).c_str()); + } + + // write version tag + m_DB.writeDWord(con::SettVersion, m_VersionCurrent); + m_VersionInDB = m_VersionCurrent; +} + +int SettingsSerializer::getLastPage() +{ + return m_DB.readDWord(con::SettLastPage, 0); +} + +void SettingsSerializer::setLastPage(int nPage) +{ + m_DB.writeDWord(con::SettLastPage, nPage); +} + +bool SettingsSerializer::getShowColumnInfo() +{ + return m_DB.readBool(con::SettShowColumnInfo, true); +} + +void SettingsSerializer::setShowColumnInfo(bool bShow) +{ + m_DB.writeBool(con::SettShowColumnInfo, bShow); +} + +bool SettingsSerializer::getShowSupportInfo() +{ + return m_DB.readBool(con::SettShowSupportInfo, false); +} + +void SettingsSerializer::setShowSupportInfo(bool bShow) +{ + m_DB.writeBool(con::SettShowSupportInfo, bShow); +} + +ext::string SettingsSerializer::getLastStatisticsFile() +{ + return m_DB.readStr(con::SettLastStatisticsFile, muT("")); +} + +void SettingsSerializer::setLastStatisticsFile(const mu_text* szFileName) +{ + m_DB.writeStr(con::SettLastStatisticsFile, szFileName); +} + +bool SettingsSerializer::canShowStatistics() +{ + ext::string strFileName = getLastStatisticsFile(); + + return !strFileName.empty() && utils::fileExists(strFileName); +} + +void SettingsSerializer::showStatistics() +{ + ext::string strFileName = getLastStatisticsFile(); + + if (!strFileName.empty() && utils::fileExists(strFileName)) + { + openURL(strFileName.c_str()); + } +} -- cgit v1.2.3