mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-27 19:01:02 +00:00
fix: inject provider, agent id and generation to get_user_print_info to ensure correct metadata
This commit is contained in:
@@ -847,7 +847,23 @@ namespace Slic3r
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
json j = json::parse(body);
|
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<std::string>()
|
||||||
|
: GUI::wxGetApp().get_printer_cloud_provider();
|
||||||
|
const std::string agent_id = j.contains("agent_id") ? j["agent_id"].get<std::string>()
|
||||||
|
: 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
|
#if !BBL_RELEASE_TO_PUBLIC
|
||||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": " << j;
|
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": " << j;
|
||||||
@@ -872,12 +888,12 @@ namespace Slic3r
|
|||||||
obj->set_dev_id(dev_id);
|
obj->set_dev_id(dev_id);
|
||||||
// A device can be rediscovered by a different agent after a preset
|
// A device can be rediscovered by a different agent after a preset
|
||||||
// switch while retaining the same MachineObject instance.
|
// switch while retaining the same MachineObject instance.
|
||||||
obj->printer_agent_id = get_current_printer_agent_id();
|
obj->printer_agent_id = agent_id;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
obj = new MachineObject(this, m_agent, "", "", "");
|
obj = new MachineObject(this, m_agent, "", "", "");
|
||||||
obj->printer_agent_id = get_current_printer_agent_id();
|
obj->printer_agent_id = agent_id;
|
||||||
if (m_agent)
|
if (m_agent)
|
||||||
{
|
{
|
||||||
obj->set_bind_status(m_agent->get_user_name(provider));
|
obj->set_bind_status(m_agent->get_user_name(provider));
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include <boost/log/trivial.hpp>
|
#include <boost/log/trivial.hpp>
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
#include "IPrinterAgent.hpp"
|
#include "IPrinterAgent.hpp"
|
||||||
#include "libslic3r/Utils.hpp"
|
#include "libslic3r/Utils.hpp"
|
||||||
#include "NetworkAgent.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<IPrinterAgent> printer_agent)
|
void NetworkAgent::set_printer_agent(std::shared_ptr<IPrinterAgent> printer_agent)
|
||||||
{
|
{
|
||||||
|
m_user_machine_list_generation.fetch_add(1);
|
||||||
|
|
||||||
// Disconnect all callbacks from the old agent
|
// Disconnect all callbacks from the old agent
|
||||||
auto old_printer_agent = m_printer_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)
|
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);
|
const auto cloud_agent = get_cloud_agent(provider);
|
||||||
if (cloud_agent)
|
if (!cloud_agent)
|
||||||
return cloud_agent->get_user_print_info(http_code, http_body);
|
return -1;
|
||||||
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)
|
int NetworkAgent::get_user_tasks(TaskQueryParams params, std::string* http_body, const std::string& provider)
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
#include "IPrinterAgent.hpp"
|
#include "IPrinterAgent.hpp"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <atomic>
|
||||||
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -54,6 +56,7 @@ public:
|
|||||||
// Sub-agent accessors
|
// Sub-agent accessors
|
||||||
std::shared_ptr<ICloudServiceAgent> get_cloud_agent(const std::string& provider = ORCA_CLOUD_PROVIDER) const;
|
std::shared_ptr<ICloudServiceAgent> get_cloud_agent(const std::string& provider = ORCA_CLOUD_PROVIDER) const;
|
||||||
std::shared_ptr<IPrinterAgent> get_printer_agent() const { return m_printer_agent; }
|
std::shared_ptr<IPrinterAgent> 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
|
// Shared agent management
|
||||||
void add_cloud_agent(const std::string& provider, std::shared_ptr<ICloudServiceAgent> agent);
|
void add_cloud_agent(const std::string& provider, std::shared_ptr<ICloudServiceAgent> agent);
|
||||||
@@ -214,6 +217,7 @@ private:
|
|||||||
std::map<std::string, std::shared_ptr<ICloudServiceAgent>> m_cloud_agents;
|
std::map<std::string, std::shared_ptr<ICloudServiceAgent>> m_cloud_agents;
|
||||||
std::shared_ptr<IPrinterAgent> m_printer_agent;
|
std::shared_ptr<IPrinterAgent> m_printer_agent;
|
||||||
std::string m_printer_agent_id;
|
std::string m_printer_agent_id;
|
||||||
|
std::atomic<std::uint64_t> m_user_machine_list_generation{0};
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user