mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 01:56:54 +02:00
Fix bug where a pending asset request could receive a pending message after deletion
This commit is contained in:
parent
830d08c385
commit
96a35a8f43
2 changed files with 14 additions and 3 deletions
|
@ -228,7 +228,8 @@ bool AssetClient::getAsset(const QString& hash, DataOffset start, DataOffset end
|
||||||
|
|
||||||
nodeList->sendPacket(std::move(packet), *assetServer);
|
nodeList->sendPacket(std::move(packet), *assetServer);
|
||||||
|
|
||||||
_pendingRequests[assetServer][messageID] = { callback, progressCallback };
|
_pendingRequests[assetServer][messageID] = { QSharedPointer<ReceivedMessage>(), callback, progressCallback };
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -326,6 +327,9 @@ void AssetClient::handleAssetGetReply(QSharedPointer<ReceivedMessage> message, S
|
||||||
if (requestIt != messageCallbackMap.end()) {
|
if (requestIt != messageCallbackMap.end()) {
|
||||||
auto& callbacks = requestIt->second;
|
auto& callbacks = requestIt->second;
|
||||||
|
|
||||||
|
// Store message in case we need to disconnect from it later.
|
||||||
|
callbacks.message = message;
|
||||||
|
|
||||||
if (message->isComplete()) {
|
if (message->isComplete()) {
|
||||||
callbacks.completeCallback(true, error, message->readAll());
|
callbacks.completeCallback(true, error, message->readAll());
|
||||||
} else {
|
} else {
|
||||||
|
@ -550,6 +554,12 @@ 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) {
|
||||||
|
auto& message = value.second.message;
|
||||||
|
if (message) {
|
||||||
|
// Disconnect from all signals emitting from the pending message
|
||||||
|
disconnect(message.data(), nullptr, this, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
value.second.completeCallback(false, AssetServerError::NoError, QByteArray());
|
value.second.completeCallback(false, AssetServerError::NoError, QByteArray());
|
||||||
}
|
}
|
||||||
messageMapIt->second.clear();
|
messageMapIt->second.clear();
|
||||||
|
|
|
@ -86,14 +86,15 @@ private:
|
||||||
ReceivedAssetCallback callback, ProgressCallback progressCallback);
|
ReceivedAssetCallback callback, ProgressCallback progressCallback);
|
||||||
bool uploadAsset(const QByteArray& data, UploadResultCallback callback);
|
bool uploadAsset(const QByteArray& data, UploadResultCallback callback);
|
||||||
|
|
||||||
struct GetAssetCallbacks {
|
struct GetAssetRequestData {
|
||||||
|
QSharedPointer<ReceivedMessage> message;
|
||||||
ReceivedAssetCallback completeCallback;
|
ReceivedAssetCallback completeCallback;
|
||||||
ProgressCallback progressCallback;
|
ProgressCallback progressCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
static MessageID _currentID;
|
static MessageID _currentID;
|
||||||
std::unordered_map<SharedNodePointer, std::unordered_map<MessageID, MappingOperationCallback>> _pendingMappingRequests;
|
std::unordered_map<SharedNodePointer, std::unordered_map<MessageID, MappingOperationCallback>> _pendingMappingRequests;
|
||||||
std::unordered_map<SharedNodePointer, std::unordered_map<MessageID, GetAssetCallbacks>> _pendingRequests;
|
std::unordered_map<SharedNodePointer, std::unordered_map<MessageID, GetAssetRequestData>> _pendingRequests;
|
||||||
std::unordered_map<SharedNodePointer, std::unordered_map<MessageID, GetInfoCallback>> _pendingInfoRequests;
|
std::unordered_map<SharedNodePointer, std::unordered_map<MessageID, GetInfoCallback>> _pendingInfoRequests;
|
||||||
std::unordered_map<SharedNodePointer, std::unordered_map<MessageID, UploadResultCallback>> _pendingUploads;
|
std::unordered_map<SharedNodePointer, std::unordered_map<MessageID, UploadResultCallback>> _pendingUploads;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue