From afc23954c57a47d648f5ba70b84a1a86f87a2253 Mon Sep 17 00:00:00 2001 From: Kasen IO Date: Fri, 3 Jul 2020 16:37:02 -0400 Subject: [PATCH 1/3] Import entities now works on domains that you do not have rights on. --- interface/src/Application.cpp | 2 +- libraries/entities/src/EntityTree.cpp | 9 +++++---- libraries/entities/src/EntityTree.h | 4 ++-- libraries/octree/src/Octree.cpp | 15 +++++++++------ libraries/octree/src/Octree.h | 8 ++++---- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fccd6b50c5..374d53096a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5542,7 +5542,7 @@ bool Application::importEntities(const QString& urlOrFilename, const bool isObse // FIXME: readFromURL() can take over the main event loop which may cause problems, especially if downloading the JSON // from the Web. - success = _entityClipboard->readFromURL(urlOrFilename, isObservable, callerId); + success = _entityClipboard->readFromURL(urlOrFilename, isObservable, callerId, true); if (success) { _entityClipboard->reaverageOctreeElements(); } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 7b339c090d..25d6dcf382 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -537,7 +537,7 @@ bool EntityTree::updateEntity(EntityItemPointer entity, const EntityItemProperti return true; } -EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const EntityItemProperties& properties, bool isClone) { +EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const EntityItemProperties& properties, bool isClone, bool isImport) { EntityItemProperties props = properties; auto nodeList = DependencyManager::get(); @@ -548,7 +548,8 @@ EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const Enti if (properties.getEntityHostType() == entity::HostType::DOMAIN && getIsClient() && !nodeList->getThisNodeCanRez() && !nodeList->getThisNodeCanRezTmp() && - !nodeList->getThisNodeCanRezCertified() && !nodeList->getThisNodeCanRezTmpCertified() && !_serverlessDomain && !isClone) { + !nodeList->getThisNodeCanRezCertified() && !nodeList->getThisNodeCanRezTmpCertified() && + !_serverlessDomain && !isClone && !isImport) { return nullptr; } @@ -2932,7 +2933,7 @@ void convertGrabUserDataToProperties(EntityItemProperties& properties) { } -bool EntityTree::readFromMap(QVariantMap& map) { +bool EntityTree::readFromMap(QVariantMap& map, const bool isImport) { // These are needed to deal with older content (before adding inheritance modes) int contentVersion = map["Version"].toInt(); @@ -3102,7 +3103,7 @@ bool EntityTree::readFromMap(QVariantMap& map) { } } - EntityItemPointer entity = addEntity(entityItemID, properties); + EntityItemPointer entity = addEntity(entityItemID, properties, isImport); if (!entity) { qCDebug(entities) << "adding Entity failed:" << entityItemID << properties.getType(); success = false; diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 9f59080718..f74ab26e6d 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -118,7 +118,7 @@ public: // The newer API... void postAddEntity(EntityItemPointer entityItem); - EntityItemPointer addEntity(const EntityItemID& entityID, const EntityItemProperties& properties, bool isClone = false); + EntityItemPointer addEntity(const EntityItemID& entityID, const EntityItemProperties& properties, bool isClone = false, bool isImport = false); // use this method if you only know the entityID bool updateEntity(const EntityItemID& entityID, const EntityItemProperties& properties, const SharedNodePointer& senderNode = SharedNodePointer(nullptr)); @@ -196,7 +196,7 @@ public: virtual bool writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues, bool skipThoseWithBadParents) override; - virtual bool readFromMap(QVariantMap& entityDescription) override; + virtual bool readFromMap(QVariantMap& entityDescription, const bool isImport = false) override; virtual bool writeToJSON(QString& jsonString, const OctreeElementPointer& element) override; diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index aac0de27a1..897ac142bf 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -734,7 +734,8 @@ QString getMarketplaceID(const QString& urlString) { bool Octree::readFromURL( const QString& urlString, const bool isObservable, - const qint64 callerId + const qint64 callerId, + const bool isImport ) { QString trimmedUrl = urlString.trimmed(); QString marketplaceID = getMarketplaceID(trimmedUrl); @@ -766,7 +767,7 @@ bool Octree::readFromURL( } QDataStream inputStream(data); - return readFromStream(data.size(), inputStream, marketplaceID); + return readFromStream(data.size(), inputStream, marketplaceID, isImport); } bool Octree::readFromByteArray( @@ -791,7 +792,8 @@ bool Octree::readFromByteArray( bool Octree::readFromStream( uint64_t streamLength, QDataStream& inputStream, - const QString& marketplaceID + const QString& marketplaceID, + const bool isImport ) { // decide if this is binary SVO or JSON-formatted SVO QIODevice *device = inputStream.device(); @@ -804,7 +806,7 @@ bool Octree::readFromStream( return false; } else { qCDebug(octree) << "Reading from JSON SVO Stream length:" << streamLength; - return readJSONFromStream(streamLength, inputStream, marketplaceID); + return readJSONFromStream(streamLength, inputStream, marketplaceID, isImport); } } @@ -834,7 +836,8 @@ const int READ_JSON_BUFFER_SIZE = 2048; bool Octree::readJSONFromStream( uint64_t streamLength, QDataStream& inputStream, - const QString& marketplaceID /*=""*/ + const QString& marketplaceID, /*=""*/ + const bool isImport ) { // if the data is gzipped we may not have a useful bytesAvailable() result, so just keep reading until // we get an eof. Leave streamLength parameter for consistency. @@ -866,7 +869,7 @@ bool Octree::readJSONFromStream( addMarketplaceIDToDocumentEntities(asMap, marketplaceID); } - bool success = readFromMap(asMap); + bool success = readFromMap(asMap, isImport); delete[] rawData; return success; } diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 45dae3049d..27a27a03e5 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -216,13 +216,13 @@ public: // Octree importers bool readFromFile(const char* filename); - bool readFromURL(const QString& url, const bool isObservable = true, const qint64 callerId = -1); // will support file urls as well... + bool readFromURL(const QString& url, const bool isObservable = true, const qint64 callerId = -1, const bool isImport = false); // will support file urls as well... bool readFromByteArray(const QString& url, const QByteArray& byteArray); - bool readFromStream(uint64_t streamLength, QDataStream& inputStream, const QString& marketplaceID=""); + bool readFromStream(uint64_t streamLength, QDataStream& inputStream, const QString& marketplaceID="", const bool isImport = false); bool readSVOFromStream(uint64_t streamLength, QDataStream& inputStream); - bool readJSONFromStream(uint64_t streamLength, QDataStream& inputStream, const QString& marketplaceID=""); + bool readJSONFromStream(uint64_t streamLength, QDataStream& inputStream, const QString& marketplaceID="", const bool isImport = false); bool readJSONFromGzippedFile(QString qFileName); - virtual bool readFromMap(QVariantMap& entityDescription) = 0; + virtual bool readFromMap(QVariantMap& entityDescription, const bool isImport = false) = 0; uint64_t getOctreeElementsCount(); From 7ba3eba3b98b956b17c700b947bdc9ac735b0be7 Mon Sep 17 00:00:00 2001 From: Kasen IO Date: Fri, 3 Jul 2020 16:44:41 -0400 Subject: [PATCH 2/3] Add missing constant. --- libraries/entities/src/EntityTree.cpp | 2 +- libraries/entities/src/EntityTree.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 25d6dcf382..c60ddb09a9 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -537,7 +537,7 @@ bool EntityTree::updateEntity(EntityItemPointer entity, const EntityItemProperti return true; } -EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const EntityItemProperties& properties, bool isClone, bool isImport) { +EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const EntityItemProperties& properties, bool isClone, const bool isImport) { EntityItemProperties props = properties; auto nodeList = DependencyManager::get(); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index f74ab26e6d..2d366315a5 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -118,7 +118,7 @@ public: // The newer API... void postAddEntity(EntityItemPointer entityItem); - EntityItemPointer addEntity(const EntityItemID& entityID, const EntityItemProperties& properties, bool isClone = false, bool isImport = false); + EntityItemPointer addEntity(const EntityItemID& entityID, const EntityItemProperties& properties, bool isClone = false, const bool isImport = false); // use this method if you only know the entityID bool updateEntity(const EntityItemID& entityID, const EntityItemProperties& properties, const SharedNodePointer& senderNode = SharedNodePointer(nullptr)); From f22c56038ca6b7720bff96e06a0d798b6789408c Mon Sep 17 00:00:00 2001 From: kasenvr <52365539+kasenvr@users.noreply.github.com> Date: Mon, 6 Jul 2020 22:21:39 -0400 Subject: [PATCH 3/3] Update libraries/octree/src/Octree.h Co-authored-by: David Rowe --- libraries/octree/src/Octree.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 27a27a03e5..a7885801de 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -219,7 +219,6 @@ public: bool readFromURL(const QString& url, const bool isObservable = true, const qint64 callerId = -1, const bool isImport = false); // will support file urls as well... bool readFromByteArray(const QString& url, const QByteArray& byteArray); bool readFromStream(uint64_t streamLength, QDataStream& inputStream, const QString& marketplaceID="", const bool isImport = false); - bool readSVOFromStream(uint64_t streamLength, QDataStream& inputStream); bool readJSONFromStream(uint64_t streamLength, QDataStream& inputStream, const QString& marketplaceID="", const bool isImport = false); bool readJSONFromGzippedFile(QString qFileName); virtual bool readFromMap(QVariantMap& entityDescription, const bool isImport = false) = 0;