From 092d98b60199dca344a980f3da9b3dc96ad84696 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Thu, 19 Jun 2025 18:23:08 +0200 Subject: [PATCH] Refactor asset blacklist and replace having to deal with LLSD all the time --- indra/newview/fsassetblacklist.cpp | 108 +++++++++++++--------- indra/newview/fsassetblacklist.h | 22 ++++- indra/newview/fsdata.cpp | 2 +- indra/newview/fsfloaterassetblacklist.cpp | 44 ++++----- indra/newview/fsfloaterassetblacklist.h | 4 +- 5 files changed, 103 insertions(+), 77 deletions(-) diff --git a/indra/newview/fsassetblacklist.cpp b/indra/newview/fsassetblacklist.cpp index 9cd46577f1..eaf4c01b50 100644 --- a/indra/newview/fsassetblacklist.cpp +++ b/indra/newview/fsassetblacklist.cpp @@ -66,6 +66,38 @@ static LLAssetType::EType S32toAssetType(S32 assetindex) return type; } +LLSD FSAssetBlacklistData::toLLSD() const +{ + std::string input_date = date.asString(); + input_date.replace(input_date.find("T"), 1, " "); + input_date.resize(input_date.size() - 1); + + LLSD data; + data["asset_name"] = name; + data["asset_region"] = region; + data["asset_type"] = type; + data["asset_blacklist_flag"] = flags; + data["asset_date"] = date; + data["asset_permanent"] = permanent; + + return data; +} + +FSAssetBlacklistData FSAssetBlacklistData::fromLLSD(const LLSD& data) +{ + std::string asset_date = data["asset_date"].asString() + "Z"; + asset_date.replace(asset_date.find(" "), 1, "T"); + + name = data["asset_name"].asString(); + region = data["asset_region"].asString(); + type = S32toAssetType(data["asset_type"].asInteger()); + flags = data.has("asset_blacklist_flag") ? data["asset_blacklist_flag"].asInteger() : 0; + date = LLDate(asset_date); + permanent = data["asset_permanent"].asBoolean(); + + return *this; +} + void FSAssetBlacklist::init() { mBlacklistFileName = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "asset_blacklist.xml"); @@ -95,13 +127,7 @@ bool FSAssetBlacklist::isBlacklisted(const LLUUID& id, LLAssetType::EType type, return false; } - eBlacklistFlag stored_flag{ eBlacklistFlag::NONE }; - if (const LLSD& data = data_it->second; data.has("asset_blacklist_flag")) - { - stored_flag = static_cast(data["asset_blacklist_flag"].asInteger()); - } - - return (stored_flag == eBlacklistFlag::NONE && flag == eBlacklistFlag::NONE) || (static_cast(stored_flag) & static_cast(flag)) != 0; + return (data_it->second.flags == eBlacklistFlag::NONE && flag == eBlacklistFlag::NONE) || (data_it->second.flags & flag) != 0; } void FSAssetBlacklist::addNewItemToBlacklist(const LLUUID& id, const std::string& name, const std::string& region, LLAssetType::EType type, eBlacklistFlag flag /*= eBlacklistFlag::NONE*/, bool permanent /*= true*/, bool save /*= true*/) @@ -111,30 +137,28 @@ void FSAssetBlacklist::addNewItemToBlacklist(const LLUUID& id, const std::string input_date.replace(input_date.find("T"), 1, " "); input_date.resize(input_date.size() - 1); - LLSD data; + FSAssetBlacklistData data; if (auto it = mBlacklistData.find(id); it != mBlacklistData.end()) { data = it->second; - S32 existing_flag = data.has("asset_blacklist_flag") ? data["asset_blacklist_flag"].asInteger() : 0; - data["asset_blacklist_flag"] = static_cast(existing_flag | static_cast(flag)); - - data["asset_name"] = name; - data["asset_region"] = region; - data["asset_date"] = input_date; - data["asset_permanent"] = permanent; + data.name = name; + data.region = region; + data.date = LLDate((double)time_corrected()); + data.permanent = permanent; + data.flags |= flag; addNewItemToBlacklistData(id, data, save); } else { - data["asset_name"] = name; - data["asset_region"] = region; - data["asset_type"] = type; - data["asset_blacklist_flag"] = static_cast(flag); - data["asset_date"] = input_date; - data["asset_permanent"] = permanent; + data.name = name; + data.region = region; + data.date = LLDate((double)time_corrected()); + data.permanent = permanent; + data.flags = flag; + data.type = type; addNewItemToBlacklistData(id, data, save); } @@ -157,10 +181,10 @@ bool FSAssetBlacklist::removeItem(const LLUUID& id) container.erase(id); } - LLSD data = it->second; + auto data = it->second; mBlacklistData.erase(it); - return data["asset_permanent"].asBoolean(); + return data.permanent; } void FSAssetBlacklist::removeItemFromBlacklist(const LLUUID& id) @@ -173,7 +197,8 @@ void FSAssetBlacklist::removeItemsFromBlacklist(const uuid_vec_t& ids) if (!ids.empty()) { bool need_save = false; - LLSD data; + + changed_signal_data_t data; for (const auto& id : ids) { @@ -181,7 +206,7 @@ void FSAssetBlacklist::removeItemsFromBlacklist(const uuid_vec_t& ids) { need_save = true; } - data.append(id.asString()); + data.emplace_back(id, std::nullopt); } if (need_save) @@ -204,42 +229,35 @@ void FSAssetBlacklist::removeFlagsFromItem(const LLUUID& id, S32 combined_flags) return; } - LLSD& data = it->second; - S32 current_flags = data.has("asset_blacklist_flag") ? data["asset_blacklist_flag"].asInteger() : 0; + auto& data = it->second; + S32 current_flags = data.flags; current_flags &= ~combined_flags; - if (current_flags == 0) + if (current_flags == eBlacklistFlag::NONE) { removeItemsFromBlacklist({ id }); } else { - data["asset_blacklist_flag"] = current_flags; + data.flags = current_flags; addNewItemToBlacklistData(id, data, true); - - if (!mBlacklistChangedCallback.empty()) - { - mBlacklistChangedCallback(LLSD().with(id.asString(), data), eBlacklistOperation::BLACKLIST_ADD); - } } } -void FSAssetBlacklist::addNewItemToBlacklistData(const LLUUID& id, const LLSD& data, bool save) +void FSAssetBlacklist::addNewItemToBlacklistData(const LLUUID& id, const FSAssetBlacklistData& data, bool save) { - LLAssetType::EType type = S32toAssetType(data["asset_type"].asInteger()); - if (auto it = mBlacklistData.find(id); it != mBlacklistData.end()) { it->second = data; } else { - addEntryToBlacklistMap(id, type); - mBlacklistData[id] = data; + addEntryToBlacklistMap(id, data.type); + mBlacklistData.try_emplace(id, data); } - if (type == LLAssetType::AT_SOUND && data["asset_blacklist_flag"].asInteger() == 0) + if (data.type == LLAssetType::AT_SOUND && data.flags == eBlacklistFlag::NONE) { LLFileSystem::removeFile(id, LLAssetType::AT_SOUND); std::string wav_path = gDirUtilp->getExpandedFilename(LL_PATH_FS_SOUND_CACHE, id.asString()) + ".dsf"; @@ -260,7 +278,7 @@ void FSAssetBlacklist::addNewItemToBlacklistData(const LLUUID& id, const LLSD& d if (!mBlacklistChangedCallback.empty()) { - mBlacklistChangedCallback(LLSD().with(id.asString(), data), eBlacklistOperation::BLACKLIST_ADD); + mBlacklistChangedCallback({ {id, data} }, eBlacklistOperation::BLACKLIST_ADD); } } @@ -314,7 +332,7 @@ void FSAssetBlacklist::loadBlacklist() gObjectList.addDerenderedItem(uid, true); } - addNewItemToBlacklistData(uid, entry_data, false); + addNewItemToBlacklistData(uid, FSAssetBlacklistData().fromLLSD(entry_data), false); } } } @@ -352,7 +370,7 @@ void FSAssetBlacklist::loadBlacklist() newdata["asset_date"] = data["entry_date"].asString(); newdata["asset_permanent"] = true; // For conversion of old data - addNewItemToBlacklistData(uid, newdata, false); + addNewItemToBlacklistData(uid, FSAssetBlacklistData().fromLLSD(newdata), false); } } oldfile.close(); @@ -373,12 +391,12 @@ void FSAssetBlacklist::saveBlacklist() for (const auto& [id, data] : mBlacklistData) { - if (data["asset_permanent"].asBoolean()) + if (data.permanent) { LLUUID shadow_id{ id }; LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES); cipher.encrypt(shadow_id.mData, UUID_BYTES); - savedata[shadow_id.asString()] = data; + savedata[shadow_id.asString()] = data.toLLSD(); } } diff --git a/indra/newview/fsassetblacklist.h b/indra/newview/fsassetblacklist.h index 6607f9e17f..68ab4bfff5 100644 --- a/indra/newview/fsassetblacklist.h +++ b/indra/newview/fsassetblacklist.h @@ -35,16 +35,29 @@ #include "llsingleton.h" #include "llassettype.h" +struct FSAssetBlacklistData +{ + std::string name; + std::string region; + LLAssetType::EType type; + S32 flags{ 0 }; + LLDate date; + bool permanent{ false }; + + LLSD toLLSD() const; + FSAssetBlacklistData fromLLSD(const LLSD& data); +}; + using blacklisted_uuid_container_t = std::unordered_set; using blacklist_type_map_t = std::map; -using blacklist_data_t = std::unordered_map; +using blacklist_data_t = std::unordered_map; class FSAssetBlacklist : public LLSingleton { LLSINGLETON_EMPTY_CTOR(FSAssetBlacklist); public: - enum class eBlacklistFlag + enum eBlacklistFlag { NONE = 0, WORN = 1 << 0, @@ -57,7 +70,7 @@ public: void init(); bool isBlacklisted(const LLUUID& id, LLAssetType::EType type, eBlacklistFlag flag = eBlacklistFlag::NONE) const; void addNewItemToBlacklist(const LLUUID& id, const std::string& name, const std::string& region, LLAssetType::EType type, eBlacklistFlag flag = eBlacklistFlag::NONE,bool permanent = true, bool save = true); - void addNewItemToBlacklistData(const LLUUID& id, const LLSD& data, bool save = true); + void addNewItemToBlacklistData(const LLUUID& id, const FSAssetBlacklistData& data, bool save = true); void removeItemFromBlacklist(const LLUUID& id); void removeItemsFromBlacklist(const uuid_vec_t& ids); void removeFlagsFromItem(const LLUUID& id, S32 combined_flags); @@ -71,7 +84,8 @@ public: BLACKLIST_REMOVE }; - typedef boost::signals2::signal blacklist_changed_callback_t; + using changed_signal_data_t = std::vector>>; + using blacklist_changed_callback_t = boost::signals2::signal; boost::signals2::connection setBlacklistChangedCallback(const blacklist_changed_callback_t::slot_type& cb) { return mBlacklistChangedCallback.connect(cb); diff --git a/indra/newview/fsdata.cpp b/indra/newview/fsdata.cpp index b31182ed4e..89d181ede4 100644 --- a/indra/newview/fsdata.cpp +++ b/indra/newview/fsdata.cpp @@ -513,7 +513,7 @@ void FSData::processAssets(const LLSD& assets) { continue; } - FSAssetBlacklist::instance().addNewItemToBlacklistData(uid, data, false); + FSAssetBlacklist::instance().addNewItemToBlacklistData(uid, FSAssetBlacklistData().fromLLSD(data), false); LL_DEBUGS("fsdata") << "Added " << uid << " to assets list." << LL_ENDL; } } diff --git a/indra/newview/fsfloaterassetblacklist.cpp b/indra/newview/fsfloaterassetblacklist.cpp index b90fb7d449..17d79f8265 100644 --- a/indra/newview/fsfloaterassetblacklist.cpp +++ b/indra/newview/fsfloaterassetblacklist.cpp @@ -149,44 +149,37 @@ void FSFloaterAssetBlacklist::buildBlacklist() mResultList->updateSort(); } -void FSFloaterAssetBlacklist::addElementToList(const LLUUID& id, const LLSD& data) +void FSFloaterAssetBlacklist::addElementToList(const LLUUID& id, const FSAssetBlacklistData& data) { - // Undo the persisted date in legacy format... - std::string asset_date = data["asset_date"].asString() + "Z"; - asset_date.replace(asset_date.find(" "), 1, "T"); - LLDate date(asset_date); - std::string date_str = getString("DateFormatString"); LLSD substitution; - substitution["datetime"] = date.secondsSinceEpoch(); + substitution["datetime"] = data.date.secondsSinceEpoch(); LLStringUtil::format(date_str, substitution); - const S32 asset_type = data["asset_type"].asInteger(); - S32 flags = data.has("asset_blacklist_flag") && data["asset_blacklist_flag"].asInteger() > 0 ? data["asset_blacklist_flag"].asInteger() : static_cast(FSAssetBlacklist::eBlacklistFlag::NONE); const S32 last_flag_value = static_cast(FSAssetBlacklist::eBlacklistFlag::LAST_FLAG); for (S32 flag_value = 1; flag_value <= last_flag_value; flag_value <<= 1) { - if ((flags & flag_value) || flags == static_cast(FSAssetBlacklist::eBlacklistFlag::NONE)) + if ((data.flags & flag_value) || data.flags == FSAssetBlacklist::eBlacklistFlag::NONE) { FSAssetBlacklist::eBlacklistFlag flag = static_cast(flag_value); - if (flags == static_cast(FSAssetBlacklist::eBlacklistFlag::NONE)) + if (data.flags == FSAssetBlacklist::eBlacklistFlag::NONE) flag = FSAssetBlacklist::eBlacklistFlag::NONE; LLSD element; element["id"] = id; element["columns"][0]["column"] = "name"; element["columns"][0]["type"] = "text"; - element["columns"][0]["value"] = !data["asset_name"].asString().empty() ? data["asset_name"].asString() : getString("unknown_object"); + element["columns"][0]["value"] = !data.name.empty() ? data.name : getString("unknown_object"); element["columns"][1]["column"] = "region"; element["columns"][1]["type"] = "text"; - element["columns"][1]["value"] = !data["asset_region"].asString().empty() ? data["asset_region"].asString() : getString("unknown_region"); + element["columns"][1]["value"] = !data.region.empty() ? data.region : getString("unknown_region"); element["columns"][2]["column"] = "type"; element["columns"][2]["type"] = "text"; - element["columns"][2]["value"] = getTypeString(asset_type); + element["columns"][2]["value"] = getTypeString(data.type); element["columns"][3]["column"] = "flags"; element["columns"][3]["type"] = "text"; @@ -199,15 +192,15 @@ void FSFloaterAssetBlacklist::addElementToList(const LLUUID& id, const LLSD& dat element["columns"][5]["column"] = "permanent"; element["columns"][5]["type"] = "text"; element["columns"][5]["halign"] = "center"; - element["columns"][5]["value"] = data["asset_permanent"].asBoolean() ? getString("asset_permanent") : LLStringUtil::null; + element["columns"][5]["value"] = data.permanent ? getString("asset_permanent") : LLStringUtil::null; element["columns"][6]["column"] = "date_sort"; element["columns"][6]["type"] = "text"; - element["columns"][6]["value"] = llformat("%u", (U64)date.secondsSinceEpoch()); + element["columns"][6]["value"] = llformat("%u", (U64)data.date.secondsSinceEpoch()); element["columns"][7]["column"] = "asset_type"; element["columns"][7]["type"] = "integer"; - element["columns"][7]["value"] = data["asset_type"].asInteger(); + element["columns"][7]["value"] = (S32)data.type; LLSD value; value["flag"] = static_cast(flag); @@ -215,7 +208,7 @@ void FSFloaterAssetBlacklist::addElementToList(const LLUUID& id, const LLSD& dat mResultList->addElement(element, ADD_BOTTOM); - if (flags == static_cast(FSAssetBlacklist::eBlacklistFlag::NONE)) + if (data.flags == FSAssetBlacklist::eBlacklistFlag::NONE) break; } } @@ -248,19 +241,20 @@ void FSFloaterAssetBlacklist::removeElements() } } -void FSFloaterAssetBlacklist::onBlacklistChanged(const LLSD& data, FSAssetBlacklist::eBlacklistOperation op) +void FSFloaterAssetBlacklist::onBlacklistChanged(const FSAssetBlacklist::changed_signal_data_t& data, FSAssetBlacklist::eBlacklistOperation op) { if (op == FSAssetBlacklist::eBlacklistOperation::BLACKLIST_ADD) { bool need_sort = mResultList->isSorted(); mResultList->setNeedsSort(false); - for (LLSD::map_const_iterator it = data.beginMap(); it != data.endMap(); ++it) + for (const auto& [id, data] : data) { - LLUUID id = LLUUID(it->first); mResultList->deleteItems(id); - LLSD insert_data = it->second; - addElementToList(id, insert_data); + if (data.has_value()) + { + addElementToList(id, data.value()); + } } mResultList->setNeedsSort(need_sort); @@ -268,9 +262,9 @@ void FSFloaterAssetBlacklist::onBlacklistChanged(const LLSD& data, FSAssetBlackl } else { - for (LLSD::array_const_iterator it = data.beginArray(); it != data.endArray(); ++it) + for (const auto& [id, data] : data) { - mResultList->deleteItems(*it); + mResultList->deleteItems(id); } mResultList->updateLayout(); } diff --git a/indra/newview/fsfloaterassetblacklist.h b/indra/newview/fsfloaterassetblacklist.h index 6e8dfd60d8..7696762a12 100644 --- a/indra/newview/fsfloaterassetblacklist.h +++ b/indra/newview/fsfloaterassetblacklist.h @@ -50,7 +50,7 @@ public: bool tick() override; void closeFloater(bool app_quitting = false) override; - void addElementToList(const LLUUID& id, const LLSD& data); + void addElementToList(const LLUUID& id, const FSAssetBlacklistData& data); void removeElements(); protected: @@ -60,7 +60,7 @@ protected: void onStopBtn(); void onCloseBtn(); void onFilterEdit(const std::string& search_string); - void onBlacklistChanged(const LLSD& data, FSAssetBlacklist::eBlacklistOperation op); + void onBlacklistChanged(const FSAssetBlacklist::changed_signal_data_t& data, FSAssetBlacklist::eBlacklistOperation op); void onSelectionChanged(); void buildBlacklist();