From 63ed0a3a98545bb18b67d47ce18bff612dfa0896 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 17 Dec 2018 10:01:52 -0800 Subject: [PATCH] move blob conversion recipes to EntityItemProperties --- interface/src/avatar/MyAvatar.cpp | 45 +++---------------- libraries/avatars/src/AvatarData.cpp | 3 +- .../entities/src/EntityItemProperties.cpp | 32 +++++++++++++ libraries/entities/src/EntityItemProperties.h | 3 ++ 4 files changed, 42 insertions(+), 41 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 582bf1aea7..18494e2c42 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1460,38 +1460,6 @@ void MyAvatar::clearAvatarEntity(const QUuid& entityID, bool requiresRemovalFrom }); } -bool blobToProperties(QScriptEngine& scriptEngine, const QByteArray& blob, EntityItemProperties& properties) { - // begin recipe for converting unfortunately-formatted-binary-blob to EntityItemProperties - QJsonDocument jsonProperties = QJsonDocument::fromBinaryData(blob); - if (!jsonProperties.isObject()) { - qCDebug(interfaceapp) << "bad avatarEntityData json" << QString(blob.toHex()); - return false; - } - QVariant variant = jsonProperties.toVariant(); - QVariantMap variantMap = variant.toMap(); - QScriptValue scriptValue = variantMapToScriptValue(variantMap, scriptEngine); - EntityItemPropertiesFromScriptValueHonorReadOnly(scriptValue, properties); - // end recipe - return true; -} - -void propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties, QByteArray& blob) { - // begin recipe for extracting unfortunately-formatted-binary-blob from EntityItem - QScriptValue scriptValue = EntityItemNonDefaultPropertiesToScriptValue(&scriptEngine, properties); - QVariant variantProperties = scriptValue.toVariant(); - QJsonDocument jsonProperties = QJsonDocument::fromVariant(variantProperties); - // the ID of the parent/avatar changes from session to session. use a special UUID to indicate the avatar - QJsonObject jsonObject = jsonProperties.object(); - if (jsonObject.contains("parentID")) { - if (QUuid(jsonObject["parentID"].toString()) == myAvatarID) { - jsonObject["parentID"] = AVATAR_SELF_ID.toString(); - } - } - jsonProperties = QJsonDocument(jsonObject); - blob = jsonProperties.toBinaryData(); - // end recipe -} - void MyAvatar::sanitizeAvatarEntityProperties(EntityItemProperties& properties) const { properties.setEntityHostType(entity::HostType::AVATAR); properties.setOwningAvatarID(getID()); @@ -1605,7 +1573,7 @@ void MyAvatar::updateAvatarEntities() { blobFailed = true; // blob doesn't exist return; } - if (!blobToProperties(*_myScriptEngine, itr.value(), properties)) { + if (!EntityItemProperties::blobToProperties(*_myScriptEngine, itr.value(), properties)) { blobFailed = true; // blob is corrupt } }); @@ -1634,7 +1602,7 @@ void MyAvatar::updateAvatarEntities() { skip = true; return; } - if (!blobToProperties(*_myScriptEngine, itr.value(), properties)) { + if (!EntityItemProperties::blobToProperties(*_myScriptEngine, itr.value(), properties)) { skip = true; } }); @@ -1740,7 +1708,7 @@ bool MyAvatar::updateStaleAvatarEntityBlobs() const { if (found) { ++numFound; QByteArray blob; - propertiesToBlob(*_myScriptEngine, getID(), properties, blob); + EntityItemProperties::propertiesToBlob(*_myScriptEngine, getID(), properties, blob); _avatarEntitiesLock.withWriteLock([&] { _cachedAvatarEntityBlobs[id] = blob; }); @@ -1767,7 +1735,7 @@ AvatarEntityMap MyAvatar::getAvatarEntityData() const { void MyAvatar::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) { // Note: this is an invokable Script call - // The argument is expected to be a map of QByteArrays that represent EntityItemProperties objects from JavaScript, + // avatarEntityData is expected to be a map of QByteArrays that represent EntityItemProperties objects from JavaScript, // aka: unfortunately-formatted-binary-blobs because we store them in non-human-readable format in Settings. // if (avatarEntityData.size() > MAX_NUM_AVATAR_ENTITIES) { @@ -1788,13 +1756,10 @@ void MyAvatar::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) { _avatarEntitiesLock.withWriteLock([&] { // find new and updated IDs AvatarEntityMap::const_iterator constItr = avatarEntityData.begin(); - std::vector blobsToCache; - blobsToCache.reserve(avatarEntityData.size()); while (constItr != avatarEntityData.end()) { QUuid id = constItr.key(); if (_cachedAvatarEntityBlobs.find(id) == _cachedAvatarEntityBlobs.end()) { _entitiesToAdd.push_back(id); - blobsToCache.push_back(id); } else { _entitiesToUpdate.push_back(id); } @@ -1812,7 +1777,7 @@ void MyAvatar::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) { ++itr; } } - // now that we've 'deleted' unknown ids, copy over the new ones + // copy new data constItr = avatarEntityData.begin(); while (constItr != avatarEntityData.end()) { _cachedAvatarEntityBlobs.insert(constItr.key(), constItr.value()); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 4f50333505..5eda53329b 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -2794,7 +2794,8 @@ AvatarEntityMap AvatarData::getAvatarEntityData() const { void AvatarData::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) { // overridden where needed - // NOTE: the argument is expected to be a map of unfortunately-formatted-binary-blobs + // avatarEntityData is expected to be a map of QByteArrays + // each QByteArray represents an EntityItemProperties object from JavaScript } void AvatarData::insertDetachedEntityID(const QUuid entityID) { diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 2c8548033f..d466de0507 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -4612,6 +4612,38 @@ void EntityItemProperties::convertToCloneProperties(const EntityItemID& entityID setCloneAvatarEntity(ENTITY_ITEM_DEFAULT_CLONE_AVATAR_ENTITY); } +bool EntityItemProperties::blobToProperties(QScriptEngine& scriptEngine, const QByteArray& blob, EntityItemProperties& properties) { + // begin recipe for converting unfortunately-formatted-binary-blob to EntityItemProperties + QJsonDocument jsonProperties = QJsonDocument::fromBinaryData(blob); + if (!jsonProperties.isObject()) { + qCDebug(entities) << "bad avatarEntityData json" << QString(blob.toHex()); + return false; + } + QVariant variant = jsonProperties.toVariant(); + QVariantMap variantMap = variant.toMap(); + QScriptValue scriptValue = variantMapToScriptValue(variantMap, scriptEngine); + EntityItemPropertiesFromScriptValueHonorReadOnly(scriptValue, properties); + // end recipe + return true; +} + +void EntityItemProperties::propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties, QByteArray& blob) { + // begin recipe for extracting unfortunately-formatted-binary-blob from EntityItem + QScriptValue scriptValue = EntityItemNonDefaultPropertiesToScriptValue(&scriptEngine, properties); + QVariant variantProperties = scriptValue.toVariant(); + QJsonDocument jsonProperties = QJsonDocument::fromVariant(variantProperties); + // the ID of the parent/avatar changes from session to session. use a special UUID to indicate the avatar + QJsonObject jsonObject = jsonProperties.object(); + if (jsonObject.contains("parentID")) { + if (QUuid(jsonObject["parentID"].toString()) == myAvatarID) { + jsonObject["parentID"] = AVATAR_SELF_ID.toString(); + } + } + jsonProperties = QJsonDocument(jsonObject); + blob = jsonProperties.toBinaryData(); + // end recipe +} + QDebug& operator<<(QDebug& dbg, const EntityPropertyFlags& f) { QString result = "[ "; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 48f4aa333e..bb4d8c5878 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -98,6 +98,9 @@ class EntityItemProperties { friend class ZoneEntityItem; friend class MaterialEntityItem; public: + static bool blobToProperties(QScriptEngine& scriptEngine, const QByteArray& blob, EntityItemProperties& properties); + static void propertiesToBlob(QScriptEngine& scriptEngine, const QUuid& myAvatarID, const EntityItemProperties& properties, QByteArray& blob); + EntityItemProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()); virtual ~EntityItemProperties() = default;