Update AssetClient callbacks to return whether a response was received

This commit is contained in:
Ryan Huffman 2015-09-14 11:20:32 -07:00
parent 71456eee5e
commit 6468046c68
5 changed files with 62 additions and 49 deletions

View file

@ -169,7 +169,7 @@ void AssetClient::handleAssetGetInfoReply(QSharedPointer<NLPacket> packet, Share
auto requestIt = messageCallbackMap.find(messageID); auto requestIt = messageCallbackMap.find(messageID);
if (requestIt != messageCallbackMap.end()) { if (requestIt != messageCallbackMap.end()) {
auto callback = requestIt->second; auto callback = requestIt->second;
callback(error, info); callback(true, error, info);
messageCallbackMap.erase(requestIt); messageCallbackMap.erase(requestIt);
} }
@ -212,7 +212,7 @@ void AssetClient::handleAssetGetReply(QSharedPointer<NLPacketList> packetList, S
auto requestIt = messageCallbackMap.find(messageID); auto requestIt = messageCallbackMap.find(messageID);
if (requestIt != messageCallbackMap.end()) { if (requestIt != messageCallbackMap.end()) {
auto callback = requestIt->second; auto callback = requestIt->second;
callback(error, data); callback(true, error, data);
messageCallbackMap.erase(requestIt); messageCallbackMap.erase(requestIt);
} }
@ -276,7 +276,7 @@ void AssetClient::handleAssetUploadReply(QSharedPointer<NLPacket> packet, Shared
auto requestIt = messageCallbackMap.find(messageID); auto requestIt = messageCallbackMap.find(messageID);
if (requestIt != messageCallbackMap.end()) { if (requestIt != messageCallbackMap.end()) {
auto callback = requestIt->second; auto callback = requestIt->second;
callback(error, hashString); callback(true, error, hashString);
messageCallbackMap.erase(requestIt); messageCallbackMap.erase(requestIt);
} }
@ -290,7 +290,7 @@ void AssetClient::handleNodeKilled(SharedNodePointer node) {
auto messageMapIt = _pendingRequests.find(node); auto messageMapIt = _pendingRequests.find(node);
if (messageMapIt != _pendingRequests.end()) { if (messageMapIt != _pendingRequests.end()) {
for (const auto& value : messageMapIt->second) { for (const auto& value : messageMapIt->second) {
value.second(AssetServerError::NetworkError, QByteArray()); value.second(false, AssetServerError::NoError, QByteArray());
} }
messageMapIt->second.clear(); messageMapIt->second.clear();
} }
@ -301,7 +301,7 @@ void AssetClient::handleNodeKilled(SharedNodePointer node) {
if (messageMapIt != _pendingInfoRequests.end()) { if (messageMapIt != _pendingInfoRequests.end()) {
AssetInfo info { "", 0 }; AssetInfo info { "", 0 };
for (const auto& value : messageMapIt->second) { for (const auto& value : messageMapIt->second) {
value.second(AssetServerError::NetworkError, info); value.second(false, AssetServerError::NoError, info);
} }
messageMapIt->second.clear(); messageMapIt->second.clear();
} }
@ -311,7 +311,7 @@ void AssetClient::handleNodeKilled(SharedNodePointer node) {
auto messageMapIt = _pendingUploads.find(node); auto messageMapIt = _pendingUploads.find(node);
if (messageMapIt != _pendingUploads.end()) { if (messageMapIt != _pendingUploads.end()) {
for (const auto& value : messageMapIt->second) { for (const auto& value : messageMapIt->second) {
value.second(AssetServerError::NetworkError, ""); value.second(false, AssetServerError::NoError, "");
} }
messageMapIt->second.clear(); messageMapIt->second.clear();
} }

View file

@ -30,9 +30,9 @@ struct AssetInfo {
int64_t size; int64_t size;
}; };
using ReceivedAssetCallback = std::function<void(AssetServerError serverError, const QByteArray& data)>; using ReceivedAssetCallback = std::function<void(bool responseReceived, AssetServerError serverError, const QByteArray& data)>;
using GetInfoCallback = std::function<void(AssetServerError serverError, AssetInfo info)>; using GetInfoCallback = std::function<void(bool responseReceived, AssetServerError serverError, AssetInfo info)>;
using UploadResultCallback = std::function<void(AssetServerError serverError, const QString& hash)>; using UploadResultCallback = std::function<void(bool responseReceived, AssetServerError serverError, const QString& hash)>;
class AssetClient : public QObject, public Dependency { class AssetClient : public QObject, public Dependency {
Q_OBJECT Q_OBJECT

View file

@ -41,17 +41,28 @@ void AssetRequest::start() {
_state = WAITING_FOR_INFO; _state = WAITING_FOR_INFO;
auto assetClient = DependencyManager::get<AssetClient>(); auto assetClient = DependencyManager::get<AssetClient>();
assetClient->getAssetInfo(_hash, _extension, [this](AssetServerError serverError, AssetInfo info) { assetClient->getAssetInfo(_hash, _extension, [this](bool responseReceived, AssetServerError serverError, AssetInfo info) {
_info = info; _info = info;
if (serverError != AssetServerError::NoError) { if (!responseReceived) {
_error = NetworkError;
} else if (serverError != AssetServerError::NoError) {
switch(serverError) {
case AssetServerError::AssetNotFound:
_error = NotFound;
break;
default:
_error = UnknownError;
break;
}
}
if (_error != NoError) {
qCDebug(networking) << "Got error retrieving asset info for" << _hash; qCDebug(networking) << "Got error retrieving asset info for" << _hash;
_state = FINISHED; _state = Finished;
emit finished(this); emit finished(this);
_error = (serverError == AssetServerError::AssetNotFound) ? NotFound : UnknownError;
return; return;
} }
@ -63,11 +74,25 @@ void AssetRequest::start() {
int start = 0, end = _info.size; int start = 0, end = _info.size;
auto assetClient = DependencyManager::get<AssetClient>(); auto assetClient = DependencyManager::get<AssetClient>();
assetClient->getAsset(_hash, _extension, start, end, [this, start, end](AssetServerError serverError, assetClient->getAsset(_hash, _extension, start, end, [this, start, end](bool responseReceived, AssetServerError serverError,
const QByteArray& data) { const QByteArray& data) {
Q_ASSERT(data.size() == (end - start)); Q_ASSERT(data.size() == (end - start));
if (serverError == AssetServerError::NoError) { if (!responseReceived) {
_error = NetworkError;
} else if (serverError != AssetServerError::NoError) {
switch (serverError) {
case AssetServerError::AssetNotFound:
_error = NotFound;
break;
case AssetServerError::InvalidByteRange:
_error = InvalidByteRange;
break;
default:
_error = UnknownError;
break;
}
} else {
// we need to check the hash of the received data to make sure it matches what we expect // we need to check the hash of the received data to make sure it matches what we expect
if (hashData(data).toHex() == _hash) { if (hashData(data).toHex() == _hash) {
@ -79,28 +104,13 @@ void AssetRequest::start() {
_error = HashVerificationFailed; _error = HashVerificationFailed;
} }
} else {
switch (serverError) {
case AssetServerError::AssetNotFound:
_error = NotFound;
break;
case AssetServerError::InvalidByteRange:
_error = InvalidByteRange;
break;
case AssetServerError::NetworkError:
_error = Error::NetworkError;
break;
default:
_error = UnknownError;
break;
}
} }
if (_error != NoError) { if (_error != NoError) {
qCDebug(networking) << "Got error retrieving asset" << _hash << "- error code" << _error; qCDebug(networking) << "Got error retrieving asset" << _hash << "- error code" << _error;
} }
_state = FINISHED; _state = Finished;
emit finished(this); emit finished(this);
}); });
}); });

View file

@ -43,20 +43,24 @@ void AssetUpload::start() {
qDebug() << "Attempting to upload" << _filename << "to asset-server."; qDebug() << "Attempting to upload" << _filename << "to asset-server.";
assetClient->uploadAsset(data, _extension, [this](AssetServerError error, const QString& hash){ assetClient->uploadAsset(data, _extension, [this](bool responseReceived, AssetServerError error, const QString& hash){
switch (error) { if (!responseReceived) {
case AssetServerError::NoError: _error = NetworkError;
_error = NoError; } else {
break; switch (error) {
case AssetServerError::AssetTooLarge: case AssetServerError::NoError:
_error = TooLarge; _error = NoError;
break; break;
case AssetServerError::PermissionDenied: case AssetServerError::AssetTooLarge:
_error = PermissionDenied; _error = TooLarge;
break; break;
default: case AssetServerError::PermissionDenied:
_error = FileOpenError; _error = PermissionDenied;
break; break;
default:
_error = FileOpenError;
break;
}
} }
emit finished(this, hash); emit finished(this, hash);
}); });

View file

@ -28,8 +28,7 @@ enum AssetServerError : uint8_t {
AssetNotFound, AssetNotFound,
InvalidByteRange, InvalidByteRange,
AssetTooLarge, AssetTooLarge,
PermissionDenied, PermissionDenied
NetworkError = 128
}; };
const QString ATP_SCHEME = "atp"; const QString ATP_SCHEME = "atp";