Fetch avatars' fst files

This commit is contained in:
Simon Walton 2019-04-03 17:43:22 -07:00
parent facf8a9305
commit e4f6f2cb14
3 changed files with 75 additions and 3 deletions

View file

@ -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;

View file

@ -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 <ResourceManager.h>
#include "MixerAvatar.h"
#include "AvatarLogging.h"
void MixerAvatar::fetchAvatarFST() {
_avatarFSTValid = false;
auto resourceManager = DependencyManager::get<ResourceManager>();
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<ResourceRequest*>(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();
}
}

View file

@ -17,14 +17,26 @@
#include <AvatarData.h>
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<MixerAvatar>;