From e4f6f2cb148b4b797d7e6608edeb16d24c6f61c0 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 3 Apr 2019 17:43:22 -0700 Subject: [PATCH] Fetch avatars' fst files --- .../src/avatars/AvatarMixerClientData.cpp | 1 + assignment-client/src/avatars/MixerAvatar.cpp | 59 +++++++++++++++++++ assignment-client/src/avatars/MixerAvatar.h | 18 +++++- 3 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 assignment-client/src/avatars/MixerAvatar.cpp diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index 1b86e0dff2..3eff0d90f9 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -183,6 +183,7 @@ void AvatarMixerClientData::processSetTraitsMessage(ReceivedMessage& message, if (traitType == AvatarTraits::SkeletonModelURL) { // special handling for skeleton model URL, since we need to make sure it is in the whitelist checkSkeletonURLAgainstWhitelist(slaveSharedData, sendingNode, packetTraitVersion); + _avatar->fetchAvatarFST(); } anyTraitsChanged = true; diff --git a/assignment-client/src/avatars/MixerAvatar.cpp b/assignment-client/src/avatars/MixerAvatar.cpp new file mode 100644 index 0000000000..af82fb3bc9 --- /dev/null +++ b/assignment-client/src/avatars/MixerAvatar.cpp @@ -0,0 +1,59 @@ +// +// MixerAvatar.cpp +// assignment-client/src/avatars +// +// Created by Simon Walton April 2019 +// +// 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 + +#include "MixerAvatar.h" +#include "AvatarLogging.h" + +void MixerAvatar::fetchAvatarFST() { + _avatarFSTValid = false; + auto resourceManager = DependencyManager::get(); + QUrl avatarURL = getSkeletonModelURL(); + if (avatarURL.isEmpty()) { + return; + } + _avatarURLString = avatarURL.toDisplayString(); + + ResourceRequest * fstRequest = resourceManager->createResourceRequest(this, avatarURL); + if (fstRequest) { + QMutexLocker certifyLocker(&_avatarCertifyLock); + + if (_avatarRequest) { + _avatarRequest->deleteLater(); + } + _avatarRequest = fstRequest; + connect(fstRequest, &ResourceRequest::finished, this, &MixerAvatar::fstRequestComplete); + fstRequest->send(); + } else { + qCDebug(avatars) << "Couldn't create FST request for" << avatarURL; + } + +} + +void MixerAvatar::fstRequestComplete() { + ResourceRequest* fstRequest = static_cast(QObject::sender()); + QMutexLocker certifyLocker(&_avatarCertifyLock); + if (fstRequest == _avatarRequest) { + auto result = fstRequest->getResult(); + if (result != ResourceRequest::Success) { + qCDebug(avatars) << "FST request for" << fstRequest->getUrl() << "failed:" << result; + } else { + _avatarFSTContents = fstRequest->getData(); + _avatarFSTValid = true; + } + _avatarRequest->deleteLater(); + _avatarRequest = nullptr; + } else { + qCDebug(avatars) << "Incorrect request for" << getDisplayName(); + } +} diff --git a/assignment-client/src/avatars/MixerAvatar.h b/assignment-client/src/avatars/MixerAvatar.h index 01e5e91b44..f89004d997 100644 --- a/assignment-client/src/avatars/MixerAvatar.h +++ b/assignment-client/src/avatars/MixerAvatar.h @@ -17,14 +17,26 @@ #include +class ResourceRequest; + class MixerAvatar : public AvatarData { public: bool getNeedsHeroCheck() const { return _needsHeroCheck; } - void setNeedsHeroCheck(bool needsHeroCheck = true) - { _needsHeroCheck = needsHeroCheck; } + void setNeedsHeroCheck(bool needsHeroCheck = true) { _needsHeroCheck = needsHeroCheck; } + + void fetchAvatarFST(); private: - bool _needsHeroCheck { false }; + bool _needsHeroCheck{ false }; + + QMutex _avatarCertifyLock; + ResourceRequest* _avatarRequest{ nullptr }; + QString _avatarURLString; + QByteArray _avatarFSTContents; + bool _avatarFSTValid { false }; + +private slots: + void fstRequestComplete(); }; using MixerAvatarSharedPointer = std::shared_ptr;