diff --git a/indra/newview/llfloateravatarrendersettings.cpp b/indra/newview/llfloateravatarrendersettings.cpp index 017c09f08d74fb79a2011f324dbf60144d4581a4..3933321d0b7ba66cc90d3392f9f20b141561e1c2 100644 --- a/indra/newview/llfloateravatarrendersettings.cpp +++ b/indra/newview/llfloateravatarrendersettings.cpp @@ -138,20 +138,20 @@ void LLFloaterAvatarRenderSettings::updateList() mAvatarSettingsList->deleteAllItems(); LLAvatarName av_name; LLNameListCtrl::NameItem item_params; - for (std::map<LLUUID, S32>::iterator iter = LLRenderMuteList::getInstance()->sVisuallyMuteSettingsMap.begin(); iter != LLRenderMuteList::getInstance()->sVisuallyMuteSettingsMap.end(); iter++) - { - item_params.value = iter->first; - LLAvatarNameCache::get(iter->first, &av_name); - if(!isHiddenRow(av_name.getCompleteName())) - { - item_params.columns.add().value(av_name.getCompleteName()).column("name"); - std::string setting = getString(iter->second == 1 ? "av_never_render" : "av_always_render"); - item_params.columns.add().value(setting).column("setting"); - std::string timestamp = createTimestamp(LLRenderMuteList::getInstance()->getVisualMuteDate(iter->first)); - item_params.columns.add().value(timestamp).column("timestamp"); - mAvatarSettingsList->addNameItemRow(item_params); - } - } + for (auto iter = LLRenderMuteList::getInstance()->mVisuallyMutedAgents.cbegin(); iter != LLRenderMuteList::getInstance()->mVisuallyMutedAgents.cend(); iter++) + { + item_params.value = iter->first; + LLAvatarNameCache::get(iter->first, &av_name); + if (!isHiddenRow(av_name.getCompleteName())) + { + item_params.columns.add().value(av_name.getCompleteName()).column("name"); + std::string setting = getString(iter->second.first == 1 ? "av_never_render" : "av_always_render"); + item_params.columns.add().value(setting).column("setting"); + std::string timestamp = createTimestamp(iter->second.second); + item_params.columns.add().value(timestamp).column("timestamp"); + mAvatarSettingsList->addNameItemRow(item_params); + } + } } void LLFloaterAvatarRenderSettings::onFilterEdit(const std::string& search_string) diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index a75d98ea61bd7f01457bb6ff63336fa50e8f5162..5357e63e910d9a129a72ccca4b4cd076397f205a 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -66,6 +66,7 @@ #include "llviewerregion.h" #include "llvoavatar.h" #include "lltrans.h" +#include "llsdserialize.h" namespace { @@ -840,54 +841,65 @@ void LLMuteList::notifyObserversDetailed(const LLMute& mute) } } -LLRenderMuteList::LLRenderMuteList() -{} - bool LLRenderMuteList::saveToFile() { - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "render_mute_settings.txt"); - LLFILE* fp = LLFile::fopen(filename, "wb"); - if (!fp) + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "render_mute_settings.json"); + llofstream outfile(filename); + if (!outfile.is_open()) { LL_WARNS() << "Couldn't open render mute list file: " << filename << LL_ENDL; return false; } + LLSD visual_mute_settings; + for (auto it = mVisuallyMutedAgents.cbegin(), end_it = mVisuallyMutedAgents.cend(); it != end_it; ++it) + { + if (it->second.first != 0) + { + std::string id_string; + it->first.toString(id_string); - for (std::map<LLUUID, S32>::iterator it = sVisuallyMuteSettingsMap.begin(); it != sVisuallyMuteSettingsMap.end(); ++it) - { - if (it->second != 0) - { - std::string id_string; - it->first.toString(id_string); - fprintf(fp, "%d %s [%d]\n", (S32)it->second, id_string.c_str(), (S32)sVisuallyMuteDateMap[it->first]); - } - } - fclose(fp); + LLSD setting_data; + setting_data["setting"] = LLSD::Integer(it->second.first); + setting_data["time"] = LLSD::Integer(it->second.second); + visual_mute_settings.insert(id_string, setting_data); + } + } + + LLSDSerialize::toPrettyNotation(visual_mute_settings, outfile); return true; } bool LLRenderMuteList::loadFromFile() { - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "render_mute_settings.txt"); - LLFILE* fp = LLFile::fopen(filename, "rb"); - if (!fp) + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "render_mute_settings.json"); + llifstream infile(filename); + if (!infile.is_open()) { LL_WARNS() << "Couldn't open render mute list file: " << filename << LL_ENDL; return false; } - char id_buffer[MAX_STRING]; - char buffer[MAX_STRING]; - while (!feof(fp) && fgets(buffer, MAX_STRING, fp)) + LLSD visual_mute_settings = LLSD::emptyMap(); + LLSDSerialize::fromNotation(visual_mute_settings, infile, LLSDSerialize::SIZE_UNLIMITED); + + if (visual_mute_settings.isMap() && visual_mute_settings.size() > 0) { - id_buffer[0] = '\0'; - S32 setting = 0; - S32 time = 0; - sscanf(buffer, " %d %254s [%d]\n", &setting, id_buffer, &time); - sVisuallyMuteSettingsMap[LLUUID(id_buffer)] = setting; - sVisuallyMuteDateMap[LLUUID(id_buffer)] = (time == 0) ? (S32)time_corrected() : time; + for (auto it = visual_mute_settings.beginMap(); it != visual_mute_settings.endMap(); ++it) + { + LLUUID agent_id(it->first); + if (agent_id.isNull()) + return false; + + LLSD data = it->second; + if (!data.has("setting") || !data.has("time")) + return false; + + S32 setting = data["setting"].asInteger(); + S32 time = (data["time"].asInteger() == 0) ? (S32) time_corrected() : data["time"].asInteger(); + mVisuallyMutedAgents.emplace(agent_id, std::make_pair(setting, (time == 0) ? (S32) time_corrected() : time)); + } } - fclose(fp); + return true; } @@ -895,16 +907,11 @@ void LLRenderMuteList::saveVisualMuteSetting(const LLUUID& agent_id, S32 setting { if(setting == 0) { - sVisuallyMuteSettingsMap.erase(agent_id); - sVisuallyMuteDateMap.erase(agent_id); + mVisuallyMutedAgents.erase(agent_id); } else { - sVisuallyMuteSettingsMap[agent_id] = setting; - if (sVisuallyMuteDateMap.find(agent_id) == sVisuallyMuteDateMap.end()) - { - sVisuallyMuteDateMap[agent_id] = (S32)time_corrected(); - } + mVisuallyMutedAgents.emplace(agent_id, std::make_pair(setting, (S32) time_corrected())); } saveToFile(); notifyObservers(); @@ -912,22 +919,22 @@ void LLRenderMuteList::saveVisualMuteSetting(const LLUUID& agent_id, S32 setting S32 LLRenderMuteList::getSavedVisualMuteSetting(const LLUUID& agent_id) { - std::map<LLUUID, S32>::iterator iter = sVisuallyMuteSettingsMap.find(agent_id); - if (iter != sVisuallyMuteSettingsMap.end()) - { - return iter->second; - } + auto iter = mVisuallyMutedAgents.find(agent_id); + if (iter != mVisuallyMutedAgents.cend()) + { + return iter->second.first; + } return 0; } S32 LLRenderMuteList::getVisualMuteDate(const LLUUID& agent_id) { - std::map<LLUUID, S32>::iterator iter = sVisuallyMuteDateMap.find(agent_id); - if (iter != sVisuallyMuteDateMap.end()) - { - return iter->second; - } + auto iter = mVisuallyMutedAgents.find(agent_id); + if (iter != mVisuallyMutedAgents.cend()) + { + return iter->second.second; + } return 0; } diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 09050eb7644c5e06f00ff7c7f8653c82691f7efd..3fd35d7454f35dc34d90dc8c1e4ecd40170d5bf5 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -179,7 +179,7 @@ public: class LLRenderMuteList : public LLSingleton<LLRenderMuteList> { - LLSINGLETON(LLRenderMuteList); + LLSINGLETON_EMPTY_CTOR(LLRenderMuteList); public: bool loadFromFile(); bool saveToFile(); @@ -191,8 +191,7 @@ public: void addObserver(LLMuteListObserver* observer); void removeObserver(LLMuteListObserver* observer); - std::map<LLUUID, S32> sVisuallyMuteSettingsMap; - std::map<LLUUID, S32> sVisuallyMuteDateMap; + std::map<LLUUID, std::pair<S32, S32> > mVisuallyMutedAgents; private: void notifyObservers();