// // EntityItemID.cpp // libraries/entities/src // // Created by Brad Hefta-Gaub on 12/4/13. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #include #include #include #include "EntityItemID.h" // for locally created models QHash EntityItemID::_tokenIDsToIDs; uint32_t EntityItemID::_nextCreatorTokenID = 0; EntityItemID::EntityItemID() : id(NEW_ENTITY), creatorTokenID(UNKNOWN_ENTITY_TOKEN), isKnownID(false) { }; EntityItemID::EntityItemID(const EntityItemID& other) : id(other.id), creatorTokenID(other.creatorTokenID), isKnownID(other.isKnownID) { } EntityItemID::EntityItemID(const QUuid& id, uint32_t creatorTokenID, bool isKnownID) : id(id), creatorTokenID(creatorTokenID), isKnownID(isKnownID) { }; EntityItemID::EntityItemID(const QUuid& id) : id(id), creatorTokenID(UNKNOWN_ENTITY_TOKEN), isKnownID(true) { }; EntityItemID EntityItemID::getIDfromCreatorTokenID(uint32_t creatorTokenID) { if (_tokenIDsToIDs.find(creatorTokenID) != _tokenIDsToIDs.end()) { return EntityItemID(_tokenIDsToIDs[creatorTokenID], creatorTokenID, true); } return EntityItemID(UNKNOWN_ENTITY_ID); } uint32_t EntityItemID::getNextCreatorTokenID() { uint32_t creatorTokenID = _nextCreatorTokenID; _nextCreatorTokenID++; return creatorTokenID; } EntityItemID EntityItemID::assignActualIDForToken() const { EntityItemID newlyAssignedEntityID; newlyAssignedEntityID.creatorTokenID = creatorTokenID; newlyAssignedEntityID.isKnownID = true; newlyAssignedEntityID.id = QUuid::createUuid(); return newlyAssignedEntityID; } EntityItemID EntityItemID::convertToKnownIDVersion() const { EntityItemID knownIDVersionEntityID; knownIDVersionEntityID.creatorTokenID = UNKNOWN_ENTITY_TOKEN; knownIDVersionEntityID.isKnownID = true; knownIDVersionEntityID.id = id; return knownIDVersionEntityID; } EntityItemID EntityItemID::convertToCreatorTokenVersion() const { EntityItemID knownIDVersionEntityID; knownIDVersionEntityID.creatorTokenID = creatorTokenID; knownIDVersionEntityID.isKnownID = false; knownIDVersionEntityID.id = UNKNOWN_ENTITY_ID; return knownIDVersionEntityID; } EntityItemID EntityItemID::readEntityItemIDFromBuffer(const unsigned char* data, int bytesLeftToRead) { EntityItemID result; if (bytesLeftToRead >= NUM_BYTES_RFC4122_UUID) { // id QByteArray encodedID((const char*)data, NUM_BYTES_RFC4122_UUID); result.id = QUuid::fromRfc4122(encodedID); result.isKnownID = true; result.creatorTokenID = UNKNOWN_ENTITY_TOKEN; } return result; } void EntityItemID::handleAddEntityResponse(const QByteArray& packet) { const unsigned char* dataAt = reinterpret_cast(packet.data()); int numBytesPacketHeader = numBytesForPacketHeader(packet); int bytesRead = numBytesPacketHeader; dataAt += numBytesPacketHeader; uint32_t creatorTokenID; memcpy(&creatorTokenID, dataAt, sizeof(creatorTokenID)); dataAt += sizeof(creatorTokenID); bytesRead += sizeof(creatorTokenID); QUuid entityID = QUuid::fromRfc4122(packet.mid(bytesRead, NUM_BYTES_RFC4122_UUID)); dataAt += NUM_BYTES_RFC4122_UUID; // add our token to id mapping _tokenIDsToIDs[creatorTokenID] = entityID; } QScriptValue EntityItemIDtoScriptValue(QScriptEngine* engine, const EntityItemID& id) { QScriptValue obj = engine->newObject(); obj.setProperty("id", id.id.toString()); obj.setProperty("creatorTokenID", id.creatorTokenID); obj.setProperty("isKnownID", id.isKnownID); return obj; } void EntityItemIDfromScriptValue(const QScriptValue &object, EntityItemID& id) { id.id = QUuid(object.property("id").toVariant().toString()); id.creatorTokenID = object.property("creatorTokenID").toVariant().toUInt(); id.isKnownID = object.property("isKnownID").toVariant().toBool(); }