diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 0308042391..8c4807f412 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -114,7 +114,7 @@ void AssetServer::handleAssetGetInfo(QSharedPointer packet, SharedNode replyPacket->writePrimitive(AssetServerError::NO_ERROR); replyPacket->writePrimitive(fileInfo.size()); } else { - qDebug() << "Asset not found: " << assetHash; + qDebug() << "Asset not found: " << QString(hexHash); replyPacket->writePrimitive(AssetServerError::ASSET_NOT_FOUND); } diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index ea1c99f228..4d228fc6bd 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -49,11 +49,12 @@ AssetRequest* AssetClient::createRequest(const QString& hash, const QString& ext auto nodeList = DependencyManager::get(); SharedNodePointer assetServer = nodeList->soloNodeOfType(NodeType::AssetServer); - if (assetServer) { - return new AssetRequest(this, hash, extension); + if (!assetServer) { + qDebug() << "No Asset Server"; + return nullptr; } - return nullptr; + return new AssetRequest(this, hash, extension); } AssetUpload* AssetClient::createUpload(const QString& filename) { @@ -152,7 +153,7 @@ void AssetClient::handleAssetGetInfoReply(QSharedPointer packet, Share if (_pendingInfoRequests.contains(messageID)) { auto callback = _pendingInfoRequests.take(messageID); - callback(error == NO_ERROR, info); + callback(error, info); } } @@ -181,7 +182,7 @@ void AssetClient::handleAssetGetReply(QSharedPointer packetList, S if (_pendingRequests.contains(messageID)) { auto callback = _pendingRequests.take(messageID); - callback(error == NO_ERROR, data); + callback(error, data); } } @@ -234,6 +235,6 @@ void AssetClient::handleAssetUploadReply(QSharedPointer packet, Shared if (_pendingUploads.contains(messageID)) { auto callback = _pendingUploads.take(messageID); - callback(error == NO_ERROR, hashString); + callback(error, hashString); } } diff --git a/libraries/networking/src/AssetClient.h b/libraries/networking/src/AssetClient.h index e44737df21..7fa1771873 100644 --- a/libraries/networking/src/AssetClient.h +++ b/libraries/networking/src/AssetClient.h @@ -29,9 +29,9 @@ struct AssetInfo { int64_t size; }; -using ReceivedAssetCallback = std::function; -using GetInfoCallback = std::function; -using UploadResultCallback = std::function; +using ReceivedAssetCallback = std::function; +using GetInfoCallback = std::function; +using UploadResultCallback = std::function; class AssetClient : public QObject, public Dependency { Q_OBJECT diff --git a/libraries/networking/src/AssetRequest.cpp b/libraries/networking/src/AssetRequest.cpp index 771b256287..69bf86302c 100644 --- a/libraries/networking/src/AssetRequest.cpp +++ b/libraries/networking/src/AssetRequest.cpp @@ -16,9 +16,9 @@ #include #include "AssetClient.h" +#include "NetworkLogging.h" #include "NodeList.h" - AssetRequest::AssetRequest(QObject* parent, const QString& hash, const QString& extension) : QObject(parent), _hash(hash), @@ -33,45 +33,48 @@ void AssetRequest::start() { return; } - if (_state == NOT_STARTED) { - _state = WAITING_FOR_INFO; - - auto assetClient = DependencyManager::get(); - assetClient->getAssetInfo(_hash, _extension, [this](bool success, AssetInfo info) { - _info = info; - _data.resize(info.size); - const DataOffset CHUNK_SIZE = 1024000000; - - qDebug() << "Got size of " << _hash << " : " << info.size << " bytes"; - - // Round up - int numChunks = (info.size + CHUNK_SIZE - 1) / CHUNK_SIZE; - auto assetClient = DependencyManager::get(); - for (int i = 0; i < numChunks; ++i) { - ++_numPendingRequests; - auto start = i * CHUNK_SIZE; - auto end = std::min((i + 1) * CHUNK_SIZE, info.size); - - assetClient->getAsset(_hash, _extension, start, end, [this, start, end](bool success, const QByteArray& data) { - Q_ASSERT(data.size() == (end - start)); - - if (success) { - _result = Success; - memcpy((_data.data() + start), data.constData(), end - start); - _totalReceived += data.size(); - emit progress(_totalReceived, _info.size); - } else { - _result = Error; - qDebug() << "Got error retrieving asset"; - } - - --_numPendingRequests; - if (_numPendingRequests == 0) { - _state = FINISHED; - emit finished(this); - } - }); - } - }); + if (_state != NOT_STARTED) { + qCWarning(networking) << "AssetRequest already started."; + return; } + + _state = WAITING_FOR_INFO; + + auto assetClient = DependencyManager::get(); + assetClient->getAssetInfo(_hash, _extension, [this](AssetServerError error, AssetInfo info) { + _info = info; + _error = error; + + if (_error != NO_ERROR) { + qCDebug(networking) << "Got error retrieving asset info for" << _hash; + _state = FINISHED; + emit finished(this); + return; + } + + _state = WAITING_FOR_DATA; + _data.resize(info.size); + + qCDebug(networking) << "Got size of " << _hash << " : " << info.size << " bytes"; + + int start = 0, end = _info.size; + + auto assetClient = DependencyManager::get(); + assetClient->getAsset(_hash, _extension, start, end, [this, start, end](AssetServerError error, + const QByteArray& data) { + Q_ASSERT(data.size() == (end - start)); + + _error = error; + if (_error == NO_ERROR) { + memcpy(_data.data() + start, data.constData(), data.size()); + _totalReceived += data.size(); + emit progress(_totalReceived, _info.size); + } else { + qCDebug(networking) << "Got error retrieving asset" << _hash; + } + + _state = FINISHED; + emit finished(this); + }); + }); } diff --git a/libraries/networking/src/AssetRequest.h b/libraries/networking/src/AssetRequest.h index c369db6a2b..b33954d34e 100644 --- a/libraries/networking/src/AssetRequest.h +++ b/libraries/networking/src/AssetRequest.h @@ -30,26 +30,21 @@ public: FINISHED }; - enum Result { - Success = 0, - Timeout, - NotFound, - Error, - }; - AssetRequest(QObject* parent, const QString& hash, const QString& extension); Q_INVOKABLE void start(); - const QByteArray& getData() { return _data; } + const QByteArray& getData() const { return _data; } + State getState() const { return _state; } + AssetServerError getError() const { return _error; } signals: - void finished(AssetRequest*); + void finished(AssetRequest* thisRequest); void progress(qint64 totalReceived, qint64 total); private: State _state = NOT_STARTED; - Result _result; + AssetServerError _error; AssetInfo _info; uint64_t _totalReceived { 0 }; QString _hash; diff --git a/libraries/networking/src/AssetResourceRequest.cpp b/libraries/networking/src/AssetResourceRequest.cpp index 2fa01d917e..93c1b49329 100644 --- a/libraries/networking/src/AssetResourceRequest.cpp +++ b/libraries/networking/src/AssetResourceRequest.cpp @@ -29,16 +29,24 @@ void AssetResourceRequest::doSend() { connect(request, &AssetRequest::progress, this, &AssetResourceRequest::progress); QObject::connect(request, &AssetRequest::finished, [this](AssetRequest* req) mutable { - if (_state != InProgress) return; - _state = Finished; - if (true) { - _data = req->getData(); - _result = ResourceRequest::Success; - emit finished(); - } else { - _result = ResourceRequest::Error; - emit finished(); + Q_ASSERT(_state == InProgress); + Q_ASSERT(req->getState() == AssetRequest::FINISHED); + + switch (req->getError()) { + case NO_ERROR: + _data = req->getData(); + _result = Success; + break; + case ASSET_NOT_FOUND: + _result = NotFound; + break; + default: + _result = Error; + break; } + + _state = Finished; + emit finished(); }); request->start(); diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 5598fda24a..f3b534af15 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -323,10 +323,11 @@ void Resource::attemptRequest() { } void Resource::finishedLoading(bool success) { - qDebug() << "Finished loading: " << _url; if (success) { + qDebug() << "Finished loading:" << _url; _loaded = true; } else { + qDebug() << "Failed to load:" << _url; _failedToLoad = true; } _loadPriorities.clear();