Refactor asset blacklist and replace having to deal with LLSD all the time
parent
c7a2aa95c0
commit
092d98b601
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue