From ae62e1f6c9d89435b1cb07150b3dc9786a40ba26 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Thu, 17 Aug 2023 18:04:12 +0200 Subject: [PATCH] Network/WebService: Make Pool return a boolean indicating if a request finished --- include/Nazara/Network/WebService.hpp | 2 +- src/Nazara/Network/WebService.cpp | 33 ++++++++++++++++----------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/include/Nazara/Network/WebService.hpp b/include/Nazara/Network/WebService.hpp index def54f65f..4af45160a 100644 --- a/include/Nazara/Network/WebService.hpp +++ b/include/Nazara/Network/WebService.hpp @@ -44,7 +44,7 @@ namespace Nz inline const std::string& GetUserAgent() const; - void Poll(); + bool Poll(); void QueueRequest(std::unique_ptr&& request); diff --git a/src/Nazara/Network/WebService.cpp b/src/Nazara/Network/WebService.cpp index e3bbdf6e5..5e5e2e6d5 100644 --- a/src/Nazara/Network/WebService.cpp +++ b/src/Nazara/Network/WebService.cpp @@ -45,7 +45,7 @@ namespace Nz #endif } - void WebService::Poll() + bool WebService::Poll() { #ifndef NAZARA_PLATFORM_WEB assert(m_curlMulti); @@ -55,9 +55,11 @@ namespace Nz if (err != CURLM_OK) { NazaraError(fmt::format("[WebService] curl_multi_perform failed with {0}: {1}", UnderlyingCast(err), m_curl.multi_strerror(err))); - return; + return false; } + bool finishedRequest = false; + CURLMsg* m; do { @@ -80,22 +82,27 @@ namespace Nz m_curl.multi_remove_handle(m_curlMulti, handle); m_activeRequests.erase(handle); + + finishedRequest = true; } } while (m); -#else - if (!m_finishedRequests.empty()) - { - for (auto&& [request, succeeded] : m_finishedRequests) - { - if (succeeded) - request->TriggerSuccessCallback(); - else - request->TriggerErrorCallback(request->GetFetchHandle()->statusText); - } - m_finishedRequests.clear(); + return finishedRequest; //< returns true if at least one request finished +#else + if (m_finishedRequests.empty()) + return false; + + for (auto&& [request, succeeded] : m_finishedRequests) + { + if (succeeded) + request->TriggerSuccessCallback(); + else + request->TriggerErrorCallback(request->GetFetchHandle()->statusText); } + + m_finishedRequests.clear(); + return true; #endif }