Refactor asset blacklist and replace having to deal with LLSD all the time

master
Ansariel 2025-06-19 18:23:08 +02:00
parent c7a2aa95c0
commit 092d98b601
5 changed files with 103 additions and 77 deletions

View File

@ -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<eBlacklistFlag>(data["asset_blacklist_flag"].asInteger());
}
return (stored_flag == eBlacklistFlag::NONE && flag == eBlacklistFlag::NONE) || (static_cast<S32>(stored_flag) & static_cast<S32>(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<S32>(existing_flag | static_cast<S32>(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<S32>(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();
}
}

View File

@ -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<LLUUID>;
using blacklist_type_map_t = std::map<LLAssetType::EType, blacklisted_uuid_container_t>;
using blacklist_data_t = std::unordered_map<LLUUID, LLSD>;
using blacklist_data_t = std::unordered_map<LLUUID, FSAssetBlacklistData>;
class FSAssetBlacklist : public LLSingleton<FSAssetBlacklist>
{
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<void(const LLSD& data, eBlacklistOperation op)> blacklist_changed_callback_t;
using changed_signal_data_t = std::vector<std::pair<LLUUID, std::optional<FSAssetBlacklistData>>>;
using blacklist_changed_callback_t = boost::signals2::signal<void(const changed_signal_data_t& data, eBlacklistOperation op)>;
boost::signals2::connection setBlacklistChangedCallback(const blacklist_changed_callback_t::slot_type& cb)
{
return mBlacklistChangedCallback.connect(cb);

View File

@ -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;
}
}

View File

@ -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<S32>(FSAssetBlacklist::eBlacklistFlag::NONE);
const S32 last_flag_value = static_cast<S32>(FSAssetBlacklist::eBlacklistFlag::LAST_FLAG);
for (S32 flag_value = 1; flag_value <= last_flag_value; flag_value <<= 1)
{
if ((flags & flag_value) || flags == static_cast<S32>(FSAssetBlacklist::eBlacklistFlag::NONE))
if ((data.flags & flag_value) || data.flags == FSAssetBlacklist::eBlacklistFlag::NONE)
{
FSAssetBlacklist::eBlacklistFlag flag = static_cast<FSAssetBlacklist::eBlacklistFlag>(flag_value);
if (flags == static_cast<S32>(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<S32>(flag);
@ -215,7 +208,7 @@ void FSFloaterAssetBlacklist::addElementToList(const LLUUID& id, const LLSD& dat
mResultList->addElement(element, ADD_BOTTOM);
if (flags == static_cast<S32>(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();
}

View File

@ -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();