mirror of
https://github.com/JulianGro/overte.git
synced 2025-08-08 06:27:55 +02:00
135 lines
5.5 KiB
C++
135 lines
5.5 KiB
C++
//
|
|
// AvatarTraits.cpp
|
|
// libraries/avatars/src
|
|
//
|
|
// Created by Clement Brisset on 3/19/19.
|
|
// Copyright 2019 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 "AvatarTraits.h"
|
|
|
|
#include <ExtendedIODevice.h>
|
|
|
|
#include "AvatarData.h"
|
|
|
|
namespace AvatarTraits {
|
|
|
|
qint64 packTrait(TraitType traitType, ExtendedIODevice& destination, const AvatarData& avatar) {
|
|
// Call packer function
|
|
auto traitBinaryData = avatar.packTrait(traitType);
|
|
auto traitBinaryDataSize = traitBinaryData.size();
|
|
|
|
// Verify packed data
|
|
if (traitBinaryDataSize > MAXIMUM_TRAIT_SIZE) {
|
|
qWarning() << "Refusing to pack simple trait" << traitType << "of size" << traitBinaryDataSize
|
|
<< "bytes since it exceeds the maximum size" << MAXIMUM_TRAIT_SIZE << "bytes";
|
|
return 0;
|
|
}
|
|
|
|
// Write packed data to stream
|
|
qint64 bytesWritten = 0;
|
|
bytesWritten += destination.writePrimitive((TraitType)traitType);
|
|
bytesWritten += destination.writePrimitive((TraitWireSize)traitBinaryDataSize);
|
|
bytesWritten += destination.write(traitBinaryData);
|
|
return bytesWritten;
|
|
}
|
|
|
|
qint64 packVersionedTrait(TraitType traitType, ExtendedIODevice& destination,
|
|
TraitVersion traitVersion, const AvatarData& avatar) {
|
|
// Call packer function
|
|
auto traitBinaryData = avatar.packTrait(traitType);
|
|
auto traitBinaryDataSize = traitBinaryData.size();
|
|
|
|
// Verify packed data
|
|
if (traitBinaryDataSize > MAXIMUM_TRAIT_SIZE) {
|
|
qWarning() << "Refusing to pack simple trait" << traitType << "of size" << traitBinaryDataSize
|
|
<< "bytes since it exceeds the maximum size" << MAXIMUM_TRAIT_SIZE << "bytes";
|
|
return 0;
|
|
}
|
|
|
|
// Write packed data to stream
|
|
qint64 bytesWritten = 0;
|
|
bytesWritten += destination.writePrimitive((TraitType)traitType);
|
|
bytesWritten += destination.writePrimitive((TraitVersion)traitVersion);
|
|
bytesWritten += destination.writePrimitive((TraitWireSize)traitBinaryDataSize);
|
|
bytesWritten += destination.write(traitBinaryData);
|
|
return bytesWritten;
|
|
}
|
|
|
|
|
|
qint64 packTraitInstance(TraitType traitType, TraitInstanceID traitInstanceID,
|
|
ExtendedIODevice& destination, AvatarData& avatar) {
|
|
// Call packer function
|
|
auto traitBinaryData = avatar.packTraitInstance(traitType, traitInstanceID);
|
|
auto traitBinaryDataSize = traitBinaryData.size();
|
|
|
|
|
|
// Verify packed data
|
|
if (traitBinaryDataSize > AvatarTraits::MAXIMUM_TRAIT_SIZE) {
|
|
qWarning() << "Refusing to pack instanced trait" << traitType << "of size" << traitBinaryDataSize
|
|
<< "bytes since it exceeds the maximum size " << AvatarTraits::MAXIMUM_TRAIT_SIZE << "bytes";
|
|
return 0;
|
|
}
|
|
|
|
// Write packed data to stream
|
|
qint64 bytesWritten = 0;
|
|
bytesWritten += destination.writePrimitive((TraitType)traitType);
|
|
bytesWritten += destination.write(traitInstanceID.toRfc4122());
|
|
|
|
if (!traitBinaryData.isNull()) {
|
|
bytesWritten += destination.writePrimitive((TraitWireSize)traitBinaryDataSize);
|
|
bytesWritten += destination.write(traitBinaryData);
|
|
} else {
|
|
bytesWritten += destination.writePrimitive(AvatarTraits::DELETED_TRAIT_SIZE);
|
|
}
|
|
|
|
return bytesWritten;
|
|
}
|
|
|
|
qint64 packVersionedTraitInstance(TraitType traitType, TraitInstanceID traitInstanceID,
|
|
ExtendedIODevice& destination, TraitVersion traitVersion,
|
|
AvatarData& avatar) {
|
|
// Call packer function
|
|
auto traitBinaryData = avatar.packTraitInstance(traitType, traitInstanceID);
|
|
auto traitBinaryDataSize = traitBinaryData.size();
|
|
|
|
|
|
// Verify packed data
|
|
if (traitBinaryDataSize > AvatarTraits::MAXIMUM_TRAIT_SIZE) {
|
|
qWarning() << "Refusing to pack instanced trait" << traitType << "of size" << traitBinaryDataSize
|
|
<< "bytes since it exceeds the maximum size " << AvatarTraits::MAXIMUM_TRAIT_SIZE << "bytes";
|
|
return 0;
|
|
}
|
|
|
|
// Write packed data to stream
|
|
qint64 bytesWritten = 0;
|
|
bytesWritten += destination.writePrimitive((TraitType)traitType);
|
|
bytesWritten += destination.writePrimitive((TraitVersion)traitVersion);
|
|
bytesWritten += destination.write(traitInstanceID.toRfc4122());
|
|
|
|
if (!traitBinaryData.isNull()) {
|
|
bytesWritten += destination.writePrimitive((TraitWireSize)traitBinaryDataSize);
|
|
bytesWritten += destination.write(traitBinaryData);
|
|
} else {
|
|
bytesWritten += destination.writePrimitive(AvatarTraits::DELETED_TRAIT_SIZE);
|
|
}
|
|
|
|
return bytesWritten;
|
|
}
|
|
|
|
|
|
qint64 packInstancedTraitDelete(TraitType traitType, TraitInstanceID instanceID, ExtendedIODevice& destination,
|
|
TraitVersion traitVersion) {
|
|
qint64 bytesWritten = 0;
|
|
bytesWritten += destination.writePrimitive(traitType);
|
|
if (traitVersion > DEFAULT_TRAIT_VERSION) {
|
|
bytesWritten += destination.writePrimitive(traitVersion);
|
|
}
|
|
bytesWritten += destination.write(instanceID.toRfc4122());
|
|
bytesWritten += destination.writePrimitive(DELETED_TRAIT_SIZE);
|
|
return bytesWritten;
|
|
}
|
|
};
|