diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp index 8810a44396..2e3164d7c1 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.cpp +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -847,7 +847,23 @@ namespace Slic3r try { json j = json::parse(body); - const std::string provider = GUI::wxGetApp().get_printer_cloud_provider(); + + const bool has_request_context = j.contains("provider") && j.contains("agent_id") && j.contains("generation"); + const std::string provider = j.contains("provider") ? j["provider"].get() + : GUI::wxGetApp().get_printer_cloud_provider(); + const std::string agent_id = j.contains("agent_id") ? j["agent_id"].get() + : get_current_printer_agent_id(); + const std::uint64_t generation = j.value("generation", std::uint64_t(0)); + + if (has_request_context && + (provider != GUI::wxGetApp().get_printer_cloud_provider() || + agent_id != get_current_printer_agent_id() || + generation != (m_agent ? m_agent->get_user_machine_list_generation() : 0))) { + BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ": ignoring stale response provider=" + << provider << " agent_id=" << agent_id + << " generation=" << generation; + return; + } #if !BBL_RELEASE_TO_PUBLIC BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": " << j; @@ -872,12 +888,12 @@ namespace Slic3r obj->set_dev_id(dev_id); // A device can be rediscovered by a different agent after a preset // switch while retaining the same MachineObject instance. - obj->printer_agent_id = get_current_printer_agent_id(); + obj->printer_agent_id = agent_id; } else { obj = new MachineObject(this, m_agent, "", "", ""); - obj->printer_agent_id = get_current_printer_agent_id(); + obj->printer_agent_id = agent_id; if (m_agent) { obj->set_bind_status(m_agent->get_user_name(provider)); diff --git a/src/slic3r/Utils/NetworkAgent.cpp b/src/slic3r/Utils/NetworkAgent.cpp index 9078449913..b214a1bc60 100644 --- a/src/slic3r/Utils/NetworkAgent.cpp +++ b/src/slic3r/Utils/NetworkAgent.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "IPrinterAgent.hpp" #include "libslic3r/Utils.hpp" #include "NetworkAgent.hpp" @@ -116,6 +117,8 @@ void NetworkAgent::add_cloud_agent(const std::string& provider, std::shared_ptr< void NetworkAgent::set_printer_agent(std::shared_ptr printer_agent) { + m_user_machine_list_generation.fetch_add(1); + // Disconnect all callbacks from the old agent auto old_printer_agent = m_printer_agent; @@ -433,10 +436,26 @@ int NetworkAgent::check_user_task_report(int* task_id, bool* printable, const st int NetworkAgent::get_user_print_info(unsigned int* http_code, std::string* http_body, const std::string& provider) { + const std::string request_agent_id = m_printer_agent_id; + const std::uint64_t request_generation = m_user_machine_list_generation.fetch_add(1) + 1; const auto cloud_agent = get_cloud_agent(provider); - if (cloud_agent) - return cloud_agent->get_user_print_info(http_code, http_body); - return -1; + if (!cloud_agent) + return -1; + + const int result = cloud_agent->get_user_print_info(http_code, http_body); + if (result == 0 && http_body) { + try { + nlohmann::json response = nlohmann::json::parse(*http_body); + response["provider"] = provider; + response["agent_id"] = request_agent_id; + response["generation"] = request_generation; + *http_body = response.dump(); + } + catch (const std::exception& e) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " metadata injection exception=" << e.what(); + } + } + return result; } int NetworkAgent::get_user_tasks(TaskQueryParams params, std::string* http_body, const std::string& provider) diff --git a/src/slic3r/Utils/NetworkAgent.hpp b/src/slic3r/Utils/NetworkAgent.hpp index 0fc4c52e41..12fd33a29e 100644 --- a/src/slic3r/Utils/NetworkAgent.hpp +++ b/src/slic3r/Utils/NetworkAgent.hpp @@ -8,6 +8,8 @@ #include "IPrinterAgent.hpp" #include +#include +#include #include #include #include @@ -54,6 +56,7 @@ public: // Sub-agent accessors std::shared_ptr get_cloud_agent(const std::string& provider = ORCA_CLOUD_PROVIDER) const; std::shared_ptr get_printer_agent() const { return m_printer_agent; } + std::uint64_t get_user_machine_list_generation() const { return m_user_machine_list_generation.load(); } // Shared agent management void add_cloud_agent(const std::string& provider, std::shared_ptr agent); @@ -214,6 +217,7 @@ private: std::map> m_cloud_agents; std::shared_ptr m_printer_agent; std::string m_printer_agent_id; + std::atomic m_user_machine_list_generation{0}; }; }