From 1f9f834d792ee66551ce62dc86eafe5a0a5f8634 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 29 Dec 2025 14:34:15 +0800 Subject: [PATCH 01/51] fix code format. --- src/slic3r/GUI/GUI_App.cpp | 42 ++---------------------------------- src/slic3r/GUI/GUI_App.hpp | 2 +- src/slic3r/GUI/MainFrame.cpp | 5 ++++- 3 files changed, 7 insertions(+), 42 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index b92533e3f5..e7d7e1ea77 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -909,44 +909,6 @@ void GUI_App::post_init() } //#endif - //BBS: remove GCodeViewer as seperate APP logic - /*if (this->init_params->start_as_gcodeviewer) { - if (! this->init_params->input_files.empty()) - this->plater()->load_gcode(wxString::FromUTF8(this->init_params->input_files[0].c_str())); - } - else - { - if (! this->init_params->preset_substitutions.empty()) - show_substitutions_info(this->init_params->preset_substitutions); - -#if 0 - // Load the cummulative config over the currently active profiles. - //FIXME if multiple configs are loaded, only the last one will have an effect. - // We need to decide what to do about loading of separate presets (just print preset, just filament preset etc). - // As of now only the full configs are supported here. - if (!m_print_config.empty()) - this->gui->mainframe->load_config(m_print_config); -#endif - if (! this->init_params->load_configs.empty()) - // Load the last config to give it a name at the UI. The name of the preset may be later - // changed by loading an AMF or 3MF. - //FIXME this is not strictly correct, as one may pass a print/filament/printer profile here instead of a full config. - this->mainframe->load_config_file(this->init_params->load_configs.back()); - // If loading a 3MF file, the config is loaded from the last one. - if (!this->init_params->input_files.empty()) { - const std::vector res = this->plater()->load_files(this->init_params->input_files); - if (!res.empty() && this->init_params->input_files.size() == 1) { - // Update application titlebar when opening a project file - const std::string& filename = this->init_params->input_files.front(); - //BBS: remove amf logic as project - if (boost::algorithm::iends_with(filename, ".3mf")) - this->plater()->set_project_filename(filename); - } - } - if (! this->init_params->extra_config.empty()) - this->mainframe->load_config(this->init_params->extra_config); - }*/ - // BBS: to be checked #if 1 // show "Did you know" notification @@ -5032,7 +4994,7 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que } // namespace -void GUI_App::check_new_version_sf(bool show_tips, int by_user) +void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { AppConfig* app_config = wxGetApp().app_config; bool check_stable_only = app_config->get_bool("check_stable_update_only"); @@ -5120,7 +5082,7 @@ void GUI_App::check_new_version_sf(bool show_tips, int by_user) } // if we're the most recent, don't do anything if ((check_stable_only ? best_release : best_pre) <= current_version) { - if (by_user != 0) + if (by_user) this->no_new_version(); return; } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index da12caa315..c3388969d5 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -587,7 +587,7 @@ private: void check_update(bool show_tips, int by_user); void check_new_version(bool show_tips = false, int by_user = 0); - void check_new_version_sf(bool show_tips = false, int by_user = 0); + void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); void request_new_version(int by_user); void enter_force_upgrade(); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index c7be6c24d0..98270c4f84 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -77,6 +77,9 @@ #include "sentry_wrapper/SentryWrapper.hpp" +#define UPDATE_BUSER true +#define UPDATE_BUAUTO false + namespace Slic3r { namespace GUI { @@ -2294,7 +2297,7 @@ static wxMenu* generate_help_menu() // Check New Version append_menu_item(helpMenu, wxID_ANY, _L("Check for Update"), _L("Check for Update"), [](wxCommandEvent&) { - wxGetApp().check_new_version_sf(true, 1); + wxGetApp().check_new_version_sf(true, UPDATE_BUSER); }, "", nullptr, []() { return true; }); From b12779a88580e8be096511a53a60a2efb9738545 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 29 Dec 2025 15:54:48 +0800 Subject: [PATCH 02/51] feature remove not work code --- src/slic3r/GUI/GUI_App.cpp | 58 +++----------------------------------- 1 file changed, 4 insertions(+), 54 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index e7d7e1ea77..36207e18f3 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2534,17 +2534,7 @@ bool GUI_App::on_init_inner() preset_updater = new PresetUpdater(); Bind(EVT_SLIC3R_VERSION_ONLINE, [this](const wxCommandEvent& evt) { if (this->plater_ != nullptr) { - // this->plater_->get_notification_manager()->push_notification(NotificationType::NewAppAvailable); - //BBS show msg box to download new version - /* wxString tips = wxString::Format(_L("Click to download new version in default browser: %s"), version_info.version_str); - DownloadDialog dialog(this->mainframe, - tips, - _L("New version of Snapmaker Orca"), - false, - wxCENTER | wxICON_INFORMATION); - - dialog.SetExtendedMessage(extmsg);*/ std::string skip_version_str = this->app_config->get("app", "skip_version"); bool skip_this_version = false; if (!skip_version_str.empty()) { @@ -2732,26 +2722,6 @@ bool GUI_App::on_init_inner() mainframe->Show(true); BOOST_LOG_TRIVIAL(info) << "main frame firstly shown"; -//#if BBL_HAS_FIRST_PAGE - //BBS: set tp3DEditor firstly - /*plater_->canvas3D()->enable_render(false); - mainframe->select_tab(size_t(MainFrame::tp3DEditor)); - scrn->SetText(_L("Loading Opengl resourses...")); - plater_->select_view_3D("3D"); - //BBS init the opengl resource here - Size canvas_size = plater_->canvas3D()->get_canvas_size(); - wxGetApp().imgui()->set_display_size(static_cast(canvas_size.get_width()), static_cast(canvas_size.get_height())); - wxGetApp().init_opengl(); - plater_->canvas3D()->init(); - wxGetApp().imgui()->new_frame(); - plater_->canvas3D()->enable_render(true); - plater_->canvas3D()->render(); - if (is_editor()) - mainframe->select_tab(size_t(0));*/ -//#else - //plater_->trigger_restore_project(1); -//#endif - obj_list()->set_min_height(); update_mode(); // update view mode after fix of the object_list size @@ -2827,28 +2797,6 @@ bool GUI_App::on_init_inner() "configuration file.\nPlease note, application settings will be lost, but printer profiles will not be affected.")); } - - //启动定时器,轮询进行机器发现 - // m_machine_find_timer = new wxTimer(this, m_machine_find_id); - - // Bind(wxEVT_TIMER, [this](wxTimerEvent& event) { - // if (!m_machine_find_engine && GUI_App::m_app_alive.load()) { - // machine_find(); - // } - // }, m_machine_find_timer->GetId()); - - // if (!m_machine_find_engine && GUI_App::m_app_alive.load()) { - // machine_find(); - // } - -//#ifdef __APPLE__ -// m_machine_find_timer->Start(1000 * 60 * 2); -//#elif defined(__linux__) -// m_machine_find_timer->Start(1000 * 60 * 2); -//#else -// m_machine_find_timer->Start(5000); -//#endif - return true; } @@ -5007,9 +4955,11 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) }) .timeout_connect(1) .on_complete([this,by_user, check_stable_only](std::string body, unsigned http_status) { - // Http response OK - if (http_status != 200) + // Http response OK + if (http_status != 200) { + BOOST_LOG_TRIVIAL(error) << format("status not 200 with: `%1%`: HTTP %2%", "check_new_version_sf", http_status); return; + } try { boost::trim(body); // Orca: parse github release, inspired by SS From a014f7964a9c568e7772f4d214490a5e252c4182 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 29 Dec 2025 18:38:19 +0800 Subject: [PATCH 03/51] feature add soft force update. --- src/slic3r/GUI/GUI_App.cpp | 122 +++++++++++++------------------------ 1 file changed, 43 insertions(+), 79 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 36207e18f3..a02255d84b 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2586,6 +2586,7 @@ bool GUI_App::on_init_inner() { case wxID_YES: wxLaunchDefaultBrowser(download_url); + wxGetApp().mainframe->Close(true); break; case wxID_NO: wxGetApp().mainframe->Close(true); @@ -4944,106 +4945,69 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { + std::string update_url = ""; + +#ifdef __WINDOWS__ + update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/win/manifest.json"; +#endif +#ifdef __APPLE__ + update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/mac/manifest.json"; +#endif +#ifdef __LINUX__ + update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/linux/manifest.json"; +#endif + AppConfig* app_config = wxGetApp().app_config; - bool check_stable_only = app_config->get_bool("check_stable_update_only"); - auto version_check_url = app_config->version_check_url(check_stable_only); - Http::get(version_check_url) + + Http::get(update_url) .on_error([&](std::string body, std::string error, unsigned http_status) { (void)body; BOOST_LOG_TRIVIAL(error) << format("Error getting: `%1%`: HTTP %2%, %3%", "check_new_version_sf", http_status, error); }) .timeout_connect(1) - .on_complete([this,by_user, check_stable_only](std::string body, unsigned http_status) { + .on_complete([this,by_user](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) { BOOST_LOG_TRIVIAL(error) << format("status not 200 with: `%1%`: HTTP %2%", "check_new_version_sf", http_status); return; } - try { - boost::trim(body); - // Orca: parse github release, inspired by SS - boost::property_tree::ptree root; - std::stringstream json_stream(body); - boost::property_tree::read_json(json_stream, root); + try { + json jsonData = json::parse(body); + // auto isFullUpgrade = jsonData["is_full_upgrade"]; + auto isForceUpgrade = jsonData["data"]["is_full_upgrade"]; + version_info.version_str = jsonData["data"]["version"]; + + auto fileSize = jsonData["data"]["full"]["file_size"]; + auto fileMd5 = jsonData["data"]["full"]["file_md5"]; + auto fileSha256 = jsonData["data"]["full"]["file_sha256"]; + version_info.url = jsonData["data"]["full"]["file_url"]; + version_info.description = jsonData["data"]["full"]["file_describe"]; + version_info.force_upgrade = isForceUpgrade; - // at least two number, use '.' as separator. can be followed by -Az23 for prereleased and +Az42 for - // metadata std::regex matcher("[0-9]+\\.[0-9]+(\\.[0-9]+)*(-[A-Za-z0-9]+)?(\\+[A-Za-z0-9]+)?"); + Semver current_version = get_version(Snapmaker_VERSION, matcher); - Semver current_version = get_version(Snapmaker_VERSION, matcher); - Semver best_pre(0, 0, 0); - Semver best_release(0, 0, 0); - std::string best_pre_url; - std::string best_release_url; - std::string best_release_content; - std::string best_pre_content; - const std::regex reg_num("([0-9]+)"); - if (check_stable_only) { - std::string tag = root.get("tag_name"); - if (tag[0] == 'v') - tag.erase(0, 1); - for (std::regex_iterator it = std::sregex_iterator(tag.begin(), tag.end(), reg_num); it != std::sregex_iterator(); ++it) {} - Semver tag_version = get_version(tag, matcher); - if (root.get("prerelease")) { - if (best_pre < tag_version) { - best_pre = tag_version; - best_pre_url = root.get("html_url"); - best_pre_content = root.get("body"); - best_pre.set_prerelease("Preview"); - } - } else { - if (best_release < tag_version) { - best_release = tag_version; - best_release_url = root.get("html_url"); - best_release_content = root.get("body"); - } - } - } else { - for (auto json_version : root) { - std::string tag = json_version.second.get("tag_name"); - if (tag[0] == 'v') - tag.erase(0, 1); - for (std::regex_iterator it = std::sregex_iterator(tag.begin(), tag.end(), reg_num); it != std::sregex_iterator(); - ++it) {} - Semver tag_version = get_version(tag, matcher); - if (json_version.second.get("prerelease")) { - if (best_pre < tag_version) { - best_pre = tag_version; - best_pre_url = json_version.second.get("html_url"); - best_pre_content = json_version.second.get("body"); - best_pre.set_prerelease("Preview"); - } - } else { - if (best_release < tag_version) { - best_release = tag_version; - best_release_url = json_version.second.get("html_url"); - best_release_content = json_version.second.get("body"); - } - } - } - } + Semver server_version = get_version(version_info.version_str, matcher); - // if release is more recent than beta, use release anyway - if (best_pre < best_release) { - best_pre = best_release; - best_pre_url = best_release_url; - best_pre_content = best_release_content; - } - // if we're the most recent, don't do anything - if ((check_stable_only ? best_release : best_pre) <= current_version) { - if (by_user) - this->no_new_version(); + if (current_version >= server_version) { + this->no_new_version(); return; } - version_info.url = check_stable_only ? best_release_url : best_pre_url; - version_info.version_str = check_stable_only ? best_release.to_string_sf() : best_pre.to_string_sf(); - version_info.description = check_stable_only ? best_release_content : best_pre_content; - version_info.force_upgrade = false; + if (isForceUpgrade) + { + wxGetApp().app_config->set_bool("force_upgrade", version_info.force_upgrade); + wxGetApp().app_config->set("upgrade", "force_upgrade", true); + wxGetApp().app_config->set("upgrade", "description", version_info.description); + wxGetApp().app_config->set("upgrade", "version", version_info.version_str); + wxGetApp().app_config->set("upgrade", "url", version_info.url); + GUI::wxGetApp().enter_force_upgrade(); + return; + } wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); - evt->SetString((check_stable_only ? best_release : best_pre).to_string()); + evt->SetString(version_info.url); GUI::wxGetApp().QueueEvent(evt); } catch (...) {} }) From 282a8ec6673469e035c70c46746b83042322f38b Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 11:01:36 +0800 Subject: [PATCH 04/51] feature remove not work code for code format --- src/slic3r/GUI/GUI_App.cpp | 99 -------------------------------- src/slic3r/GUI/GUI_App.hpp | 3 - src/slic3r/GUI/UpdateDialogs.cpp | 2 - src/slic3r/GUI/UpdateDialogs.hpp | 4 -- 4 files changed, 108 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index a02255d84b..9d03230e83 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -965,7 +965,6 @@ void GUI_App::post_init() this->check_new_version_sf(); if (is_user_login() && !app_config->get_stealth_mode()) { - // this->check_privacy_version(0); request_user_handle(0); } }); @@ -4576,95 +4575,6 @@ void GUI_App::reset_to_active() last_active_point = std::chrono::system_clock::now(); } -void GUI_App::check_update(bool show_tips, int by_user) -{ - if (version_info.version_str.empty()) return; - if (version_info.url.empty()) return; - - auto curr_version = Semver::parse(SLIC3R_VERSION); - auto remote_version = Semver::parse(version_info.version_str); - if (curr_version && remote_version && (*remote_version > *curr_version)) { - if (version_info.force_upgrade) { - wxGetApp().app_config->set_bool("force_upgrade", version_info.force_upgrade); - wxGetApp().app_config->set("upgrade", "force_upgrade", true); - wxGetApp().app_config->set("upgrade", "description", version_info.description); - wxGetApp().app_config->set("upgrade", "version", version_info.version_str); - wxGetApp().app_config->set("upgrade", "url", version_info.url); - GUI::wxGetApp().enter_force_upgrade(); - } - else { - GUI::wxGetApp().request_new_version(by_user); - } - } else { - wxGetApp().app_config->set("upgrade", "force_upgrade", false); - if (show_tips) - this->no_new_version(); - } -} - -void GUI_App::check_new_version(bool show_tips, int by_user) -{ - return; // orca: not used, see check_new_version_sf - std::string platform = "windows"; - -#ifdef __WINDOWS__ - platform = "windows"; -#endif -#ifdef __APPLE__ - platform = "macos"; -#endif -#ifdef __LINUX__ - platform = "linux"; -#endif - std::string query_params = (boost::format("?name=slicer&version=%1%&guide_version=%2%") - % VersionInfo::convert_full_version(SLIC3R_VERSION) - % VersionInfo::convert_full_version("0.0.0.1") - ).str(); - - std::string url = get_http_url(app_config->get_country_code()) + query_params; - Slic3r::Http http = Slic3r::Http::get(url); - - http.header("accept", "application/json") - .timeout_connect(TIMEOUT_CONNECT) - .timeout_max(TIMEOUT_RESPONSE) - .on_complete([this, show_tips, by_user](std::string body, unsigned) { - try { - json j = json::parse(body); - if (j.contains("message")) { - if (j["message"].get() == "success") { - if (j.contains("software")) { - if (j["software"].empty() && show_tips) { - this->no_new_version(); - } - else { - if (j["software"].contains("url") - && j["software"].contains("version") - && j["software"].contains("description")) { - version_info.url = j["software"]["url"].get(); - version_info.version_str = j["software"]["version"].get(); - version_info.description = j["software"]["description"].get(); - } - if (j["software"].contains("force_update")) { - version_info.force_upgrade = j["software"]["force_update"].get(); - } - CallAfter([this, show_tips, by_user](){ - this->check_update(show_tips, by_user); - }); - } - } - } - } - } - catch (...) { - ; - } - }) - .on_error([this](std::string body, std::string error, unsigned int status) { - handle_http_error(status, body); - BOOST_LOG_TRIVIAL(error) << "check new version error" << body; - }).perform(); -} - //parse the string, if it doesn't contain a valid version string, return invalid version. Semver get_version(const std::string& str, const std::regex& regexp) { std::smatch match; @@ -5020,15 +4930,6 @@ void GUI_App::process_network_msg(std::string dev_id, std::string msg) } } -//BBS pop up a dialog and download files -void GUI_App::request_new_version(int by_user) -{ - wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); - evt->SetString(GUI::from_u8(version_info.version_str)); - evt->SetInt(by_user); - GUI::wxGetApp().QueueEvent(evt); -} - void GUI_App::enter_force_upgrade() { wxCommandEvent *evt = new wxCommandEvent(EVT_ENTER_FORCE_UPGRADE); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index c3388969d5..b3623ccaf9 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -585,11 +585,8 @@ private: bool m_studio_active = true; std::chrono::system_clock::time_point last_active_point; - void check_update(bool show_tips, int by_user); - void check_new_version(bool show_tips = false, int by_user = 0); void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); - void request_new_version(int by_user); void enter_force_upgrade(); void set_skip_version(bool skip = true); void no_new_version(); diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index 8069fa5da2..780329523d 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -92,8 +92,6 @@ bool MsgUpdateSlic3r::disable_version_check() const return true; } -// MsgUpdateConfig - MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_before_wizard /* = false*/) : DPIDialog(wxGetApp().mainframe, wxID_ANY, _L("Configuration update"), wxDefaultPosition, wxDefaultSize, wxCAPTION) { diff --git a/src/slic3r/GUI/UpdateDialogs.hpp b/src/slic3r/GUI/UpdateDialogs.hpp index 04eb4ffb3c..153d8d409f 100644 --- a/src/slic3r/GUI/UpdateDialogs.hpp +++ b/src/slic3r/GUI/UpdateDialogs.hpp @@ -61,10 +61,6 @@ public: // force_before_wizard - indicates that check of updated is forced before ConfigWizard opening MsgUpdateConfig(const std::vector &updates, bool force_before_wizard = false); void on_dpi_changed(const wxRect &suggested_rect); - // MsgUpdateConfig(MsgUpdateConfig &&) = delete; - //MsgUpdateConfig(const MsgUpdateConfig &) = delete; - //MsgUpdateConfig &operator=(MsgUpdateConfig &&) = delete; - //MsgUpdateConfig &operator=(const MsgUpdateConfig &) = delete; ~MsgUpdateConfig(); }; From 9be8ff80e84f61af9fb7dc9ae0b4820e9f6c8c57 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 12:10:27 +0800 Subject: [PATCH 05/51] feature remove not work code. --- src/slic3r/GUI/GUI_App.cpp | 201 +---------------------------------- src/slic3r/GUI/GUI_App.hpp | 14 +-- src/slic3r/GUI/MainFrame.cpp | 5 - src/slic3r/GUI/MainFrame.hpp | 5 - 4 files changed, 5 insertions(+), 220 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 9d03230e83..810d1f1cb1 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -964,15 +964,10 @@ void GUI_App::post_init() this->preset_updater->sync(http_url, language, network_ver, sys_preset ? preset_bundle : nullptr); this->check_new_version_sf(); - if (is_user_login() && !app_config->get_stealth_mode()) { - request_user_handle(0); - } + }); } - if (is_user_login()) - request_user_handle(0); - if(!m_networking_need_update && m_agent) { m_agent->set_on_ssdp_msg_fn( [this](std::string json_str) { @@ -1612,37 +1607,11 @@ void GUI_App::init_networking_callbacks() { BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": enter, m_agent=%1%")%m_agent; if (m_agent) { - //set callbacks - //m_agent->set_on_user_login_fn([this](int online_login, bool login) { - // GUI::wxGetApp().request_user_handle(online_login); - // }); m_agent->set_server_callback([](std::string url, int status) { BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(": server_callback, url=%1%, status=%2%") % url % status; - //CallAfter([this]() { - // if (!m_server_error_dialog) { - // /*m_server_error_dialog->EndModal(wxCLOSE); - // m_server_error_dialog->Destroy(); - // m_server_error_dialog = nullptr;*/ - // m_server_error_dialog = new NetworkErrorDialog(mainframe); - // } - // - // if(plater()->get_select_machine_dialog() && plater()->get_select_machine_dialog()->IsShown()){ - // return; - // } - // - // if (m_server_error_dialog->m_show_again) { - // return; - // } - // - // if (m_server_error_dialog->IsShown()) { - // return; - // } - // - // m_server_error_dialog->ShowModal(); - //}); - }); + }); m_agent->set_on_server_connected_fn([this](int return_code, int reason_code) { if (m_is_closing) { @@ -2622,13 +2591,6 @@ bool GUI_App::on_init_inner() preset_bundle->backup_user_folder(); - Bind(EVT_SET_SELECTED_MACHINE, &GUI_App::on_set_selected_machine, this); - Bind(EVT_UPDATE_MACHINE_LIST, &GUI_App::on_update_machine_list, this); - Bind(EVT_USER_LOGIN, &GUI_App::on_user_login, this); - Bind(EVT_USER_LOGIN_HANDLE, &GUI_App::on_user_login_handle, this); - Bind(EVT_CHECK_PRIVACY_VER, &GUI_App::on_check_privacy_update, this); - Bind(EVT_CHECK_PRIVACY_SHOW, &GUI_App::show_check_privacy_dlg, this); - Bind(EVT_SHOW_IP_DIALOG, &GUI_App::show_ip_address_enter_dialog_handler, this); @@ -4100,20 +4062,6 @@ bool GUI_App::check_login() return result; } -void GUI_App::request_user_handle(int online_login) -{ - auto evt = new wxCommandEvent(EVT_USER_LOGIN_HANDLE); - evt->SetInt(online_login); - wxQueueEvent(this, evt); -} - -void GUI_App::request_user_login(int online_login) -{ - auto evt = new wxCommandEvent(EVT_USER_LOGIN); - evt->SetInt(online_login); - wxQueueEvent(this, evt); -} - void GUI_App::request_user_logout() { if (m_agent && m_agent->is_user_login()) { @@ -4494,54 +4442,6 @@ void GUI_App::enable_user_preset_folder(bool enable) } } -void GUI_App::on_set_selected_machine(wxCommandEvent &evt) -{ - // Orca: do not connect to default device during app startup, because some of the lan machines might not online yet - // and user will be prompted by several "Connect XXX failed" error message. - return; - - DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (dev) { - dev->set_selected_machine(m_agent->get_user_selected_machine()); - } -} - -void GUI_App::on_update_machine_list(wxCommandEvent &evt) -{ - /* DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (dev) { - dev->add_user_subscribe(); - }*/ -} - -void GUI_App::on_user_login_handle(wxCommandEvent &evt) -{ - if (!m_agent) { return; } - - int online_login = evt.GetInt(); - m_agent->connect_server(); - - // get machine list - DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) return; - - boost::thread update_thread = boost::thread([this, dev] { - dev->update_user_machine_list_info(); - auto evt = new wxCommandEvent(EVT_SET_SELECTED_MACHINE); - wxQueueEvent(this, evt); - }); - - if (online_login) { - remove_user_presets(); - enable_user_preset_folder(true); - preset_bundle->load_user_presets(m_agent->get_user_id(), ForwardCompatibilitySubstitutionRule::Enable); - mainframe->update_side_preset_ui(); - - GUI::wxGetApp().mainframe->show_sync_dialog(); - } -} - - void GUI_App::check_track_enable() { // Orca: alaways disable track event @@ -4551,14 +4451,6 @@ void GUI_App::check_track_enable() } } -void GUI_App::on_user_login(wxCommandEvent &evt) -{ - if (!m_agent) { return; } - int online_login = evt.GetInt(); - // check privacy before handle - check_privacy_version(online_login); - check_track_enable(); -} bool GUI_App::is_studio_active() { @@ -4885,7 +4777,7 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) try { json jsonData = json::parse(body); // auto isFullUpgrade = jsonData["is_full_upgrade"]; - auto isForceUpgrade = jsonData["data"]["is_full_upgrade"]; + auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; version_info.version_str = jsonData["data"]["version"]; auto fileSize = jsonData["data"]["full"]["file_size"]; @@ -4946,33 +4838,6 @@ void GUI_App::set_skip_version(bool skip) } } -void GUI_App::show_check_privacy_dlg(wxCommandEvent& evt) -{ - int online_login = evt.GetInt(); - PrivacyUpdateDialog privacy_dlg(this->mainframe, wxID_ANY, _L("Privacy Policy Update")); - privacy_dlg.Bind(EVT_PRIVACY_UPDATE_CONFIRM, [this, online_login](wxCommandEvent &e) { - app_config->set("privacy_version", privacy_version_info.version_str); - app_config->set_bool("privacy_update_checked", true); - request_user_handle(online_login); - }); - privacy_dlg.Bind(EVT_PRIVACY_UPDATE_CANCEL, [this](wxCommandEvent &e) { - app_config->set_bool("privacy_update_checked", false); - if (m_agent) { - m_agent->user_logout(); - } - }); - - privacy_dlg.set_text(privacy_version_info.description); - privacy_dlg.on_show(); -} - -void GUI_App::on_show_check_privacy_dlg(int online_login) -{ - auto evt = new wxCommandEvent(EVT_CHECK_PRIVACY_SHOW); - evt->SetInt(online_login); - wxQueueEvent(this, evt); -} - bool GUI_App::check_privacy_update() { if (privacy_version_info.version_str.empty() || privacy_version_info.description.empty() @@ -4991,66 +4856,6 @@ bool GUI_App::check_privacy_update() return false; } -void GUI_App::on_check_privacy_update(wxCommandEvent& evt) -{ - int online_login = evt.GetInt(); - bool result = check_privacy_update(); - if (result) - on_show_check_privacy_dlg(online_login); - else - request_user_handle(online_login); -} - -void GUI_App::check_privacy_version(int online_login) -{ - update_http_extra_header(); - std::string query_params = "?policy/privacy=00.00.00.00"; - std::string url = get_http_url(app_config->get_country_code()) + query_params; - Slic3r::Http http = Slic3r::Http::get(url); - - http.header("accept", "application/json") - .timeout_connect(TIMEOUT_CONNECT) - .timeout_max(TIMEOUT_RESPONSE) - .on_complete([this, online_login](std::string body, unsigned) { - try { - json j = json::parse(body); - if (j.contains("message")) { - if (j["message"].get() == "success") { - if (j.contains("resources")) { - for (auto it = j["resources"].begin(); it != j["resources"].end(); it++) { - if (it->contains("type")) { - if ((*it)["type"] == std::string("policy/privacy") - && it->contains("version") - && it->contains("description") - && it->contains("url") - && it->contains("force_update")) { - privacy_version_info.version_str = (*it)["version"].get(); - privacy_version_info.description = (*it)["description"].get(); - privacy_version_info.url = (*it)["url"].get(); - privacy_version_info.force_upgrade = (*it)["force_update"].get(); - break; - } - } - } - CallAfter([this, online_login]() { - auto evt = new wxCommandEvent(EVT_CHECK_PRIVACY_VER); - evt->SetInt(online_login); - wxQueueEvent(this, evt); - }); - } - } - } - } - catch (...) { - request_user_handle(online_login); - } - }) - .on_error([this, online_login](std::string body, std::string error, unsigned int status) { - request_user_handle(online_login); - BOOST_LOG_TRIVIAL(error) << "check privacy version error" << body; - }).perform(); -} - void GUI_App::no_new_version() { wxCommandEvent* evt = new wxCommandEvent(EVT_SHOW_NO_NEW_VERSION); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index b3623ccaf9..ebc867febb 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -557,9 +557,7 @@ private: void sm_request_login(bool show_user_info = false); void sm_ShowUserLogin(bool show = true); void sm_request_user_logout(); - - void request_user_login(int online_login = 0); - void request_user_handle(int online_login = 0); + void request_user_logout(); int request_user_unbind(std::string dev_id); std::string handle_web_request(std::string cmd); @@ -573,10 +571,6 @@ private: void handle_http_error(unsigned int status, std::string body); void on_http_error(wxCommandEvent &evt); - void on_set_selected_machine(wxCommandEvent& evt); - void on_update_machine_list(wxCommandEvent& evt); - void on_user_login(wxCommandEvent &evt); - void on_user_login_handle(wxCommandEvent& evt); void enable_user_preset_folder(bool enable); // BBS @@ -606,12 +600,8 @@ private: void start_page_http_server(); void stop_page_http_server(); void switch_staff_pick(bool on); - - void on_show_check_privacy_dlg(int online_login = 0); - void show_check_privacy_dlg(wxCommandEvent& evt); - void on_check_privacy_update(wxCommandEvent &evt); bool check_privacy_update(); - void check_privacy_version(int online_login = 0); + void check_track_enable(); static bool catch_error(std::function cb, const std::string& err); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 98270c4f84..5c2e217e85 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -85,12 +85,7 @@ namespace GUI { wxDEFINE_EVENT(EVT_SELECT_TAB, wxCommandEvent); wxDEFINE_EVENT(EVT_HTTP_ERROR, wxCommandEvent); -wxDEFINE_EVENT(EVT_USER_LOGIN, wxCommandEvent); -wxDEFINE_EVENT(EVT_USER_LOGIN_HANDLE, wxCommandEvent); -wxDEFINE_EVENT(EVT_CHECK_PRIVACY_VER, wxCommandEvent); -wxDEFINE_EVENT(EVT_CHECK_PRIVACY_SHOW, wxCommandEvent); wxDEFINE_EVENT(EVT_SHOW_IP_DIALOG, wxCommandEvent); -wxDEFINE_EVENT(EVT_SET_SELECTED_MACHINE, wxCommandEvent); wxDEFINE_EVENT(EVT_UPDATE_MACHINE_LIST, wxCommandEvent); wxDEFINE_EVENT(EVT_UPDATE_PRESET_CB, SimpleEvent); diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index e5b03e3b54..095f1f7ea1 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -417,12 +417,7 @@ public: }; wxDECLARE_EVENT(EVT_HTTP_ERROR, wxCommandEvent); -wxDECLARE_EVENT(EVT_USER_LOGIN, wxCommandEvent); -wxDECLARE_EVENT(EVT_USER_LOGIN_HANDLE, wxCommandEvent); -wxDECLARE_EVENT(EVT_CHECK_PRIVACY_VER, wxCommandEvent); -wxDECLARE_EVENT(EVT_CHECK_PRIVACY_SHOW, wxCommandEvent); wxDECLARE_EVENT(EVT_SHOW_IP_DIALOG, wxCommandEvent); -wxDECLARE_EVENT(EVT_SET_SELECTED_MACHINE, wxCommandEvent); wxDECLARE_EVENT(EVT_UPDATE_MACHINE_LIST, wxCommandEvent); wxDECLARE_EVENT(EVT_UPDATE_PRESET_CB, SimpleEvent); From 8911f696d60eaffe877c63788ee66beb70826ab9 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 14:23:17 +0800 Subject: [PATCH 06/51] feature remove not work code. --- src/slic3r/GUI/GUI_App.cpp | 21 --------------------- src/slic3r/GUI/GUI_App.hpp | 1 - src/slic3r/GUI/UpdateDialogs.cpp | 1 - src/slic3r/GUI/WebSMUserLoginDialog.cpp | 1 - src/slic3r/GUI/WebUserLoginDialog.cpp | 1 - 5 files changed, 25 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 810d1f1cb1..8f297823d0 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4295,27 +4295,6 @@ std::string GUI_App::handle_web_request(std::string cmd) return ""; } -void GUI_App::handle_script_message(std::string msg) -{ - try { - json j = json::parse(msg); - if (j.contains("command")) { - wxString cmd = j["command"]; - if (cmd == "user_login") { - if (m_agent) { - m_agent->change_user(j.dump()); - if (m_agent->is_user_login()) { - request_user_login(1); - } - } - } - } - } - catch (...) { - ; - } -} - void GUI_App::request_model_download(wxString url) { if (plater_) { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index ebc867febb..ec2a8922fd 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -561,7 +561,6 @@ private: void request_user_logout(); int request_user_unbind(std::string dev_id); std::string handle_web_request(std::string cmd); - void handle_script_message(std::string msg); void request_model_download(wxString url); void download_project(std::string project_id); void request_project_download(std::string project_id); diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index 780329523d..9a9f2eafd1 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -121,7 +121,6 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_ wxBoxSizer *m_sizer_right = new wxBoxSizer(wxVERTICAL); - auto m_text_up_info = new wxStaticText(this, wxID_ANY, _L("A new configuration package is available. Do you want to install it?"), wxDefaultPosition, wxDefaultSize, 0); m_text_up_info->SetFont(::Label::Head_14); m_text_up_info->SetForegroundColour(wxColour(0x26, 0x2E, 0x30)); diff --git a/src/slic3r/GUI/WebSMUserLoginDialog.cpp b/src/slic3r/GUI/WebSMUserLoginDialog.cpp index 5292c4cd67..a886588cac 100644 --- a/src/slic3r/GUI/WebSMUserLoginDialog.cpp +++ b/src/slic3r/GUI/WebSMUserLoginDialog.cpp @@ -305,7 +305,6 @@ void SMUserLogin::OnScriptMessage(wxWebViewEvent &evt) } if (strCmd == "user_login") { j["data"]["autotest_token"] = m_AutotestToken; - wxGetApp().handle_script_message(j.dump()); Close(); } else if (strCmd == "get_localhost_url") { diff --git a/src/slic3r/GUI/WebUserLoginDialog.cpp b/src/slic3r/GUI/WebUserLoginDialog.cpp index 5afc43568a..48f90920df 100644 --- a/src/slic3r/GUI/WebUserLoginDialog.cpp +++ b/src/slic3r/GUI/WebUserLoginDialog.cpp @@ -279,7 +279,6 @@ void ZUserLogin::OnScriptMessage(wxWebViewEvent &evt) } if (strCmd == "user_login") { j["data"]["autotest_token"] = m_AutotestToken; - wxGetApp().handle_script_message(j.dump()); Close(); } else if (strCmd == "get_localhost_url") { From 5ffd8504266178e0979ab3e921507e52c275d7ab Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 14:37:04 +0800 Subject: [PATCH 07/51] feature remove not work code. --- src/slic3r/GUI/HttpServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/HttpServer.cpp b/src/slic3r/GUI/HttpServer.cpp index f2a01268af..bc9944adfd 100644 --- a/src/slic3r/GUI/HttpServer.cpp +++ b/src/slic3r/GUI/HttpServer.cpp @@ -676,7 +676,7 @@ std::shared_ptr HttpServer::bbl_auth_handle_request(const j["data"]["user"]["avatar"] = user_avatar; agent->change_user(j.dump()); if (agent->is_user_login()) { - wxGetApp().request_user_login(1); + //wxGetApp().request_user_login(1); } GUI::wxGetApp().CallAfter([] { wxGetApp().ShowUserLogin(false); }); std::string location_str = (boost::format("%1%?result=success") % redirect_url).str(); From c9939e45c21955a6bb5f5ad78d37305fdeb45378 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 18:09:57 +0800 Subject: [PATCH 08/51] feature add preset upgrade for soft --- src/libslic3r/AppConfig.cpp | 2 +- src/slic3r/GUI/GUI_App.cpp | 3 + src/slic3r/Utils/PresetUpdater.cpp | 93 +++++++++++++++++++++++++----- 3 files changed, 84 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index a8d3fa620d..4e17f94527 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -39,7 +39,7 @@ namespace Slic3r { static const std::string VERSION_CHECK_URL_STABLE = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases/latest"; static const std::string VERSION_CHECK_URL = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases"; -static const std::string PROFILE_UPDATE_URL = "https://api.github.com/repos/Snapmaker/Orca_Presets/releases/latest"; +static const std::string PROFILE_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/profile/preset_config.json"; static const std::string MODELS_STR = "models"; const std::string AppConfig::SECTION_FILAMENTS = "filaments"; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 8f297823d0..abfb91661f 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4755,6 +4755,9 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) } try { json jsonData = json::parse(body); + auto errCode = jsonData["code"]; + if (errCode != 200) + return; // auto isFullUpgrade = jsonData["is_full_upgrade"]; auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; version_info.version_str = jsonData["data"]["version"]; diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 0ec8c0bdc0..fe835cc1f0 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -227,6 +227,7 @@ struct PresetUpdater::priv void parse_version_string(const std::string& body) const; void sync_resources(std::string http_url, std::map &resources, bool check_patch = false, std::string current_version="", std::string changelog_file=""); void sync_config(); + bool download_file(const std::string& url, const std::string& target_path, int timeout_sec = 30, bool* cancel_flag = nullptr); void sync_tooltip(std::string http_url, std::string language); void sync_plugins(std::string http_url, std::string plugin_version); void sync_printer_config(std::string http_url); @@ -649,8 +650,65 @@ void PresetUpdater::priv::sync_resources(std::string http_url, std::map() == "Not Found") { - // The current Orca version does not have any OTA updates, delete the cache file - if (fs::exists(cache_profile_path / "profiles")) - fs::remove_all(cache_profile_path / "profiles"); - if (fs::exists(cache_profile_update_file)) - fs::remove(cache_profile_update_file); - } - } catch (...) {} - } BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_config_orca", http_status, error); }) .timeout_connect(5) @@ -700,6 +746,27 @@ void PresetUpdater::priv::sync_config() if (http_status != 200) return; try { + + { + + json jsonData = json::parse(body); + auto errCode = jsonData["code"]; + if (errCode != 200) + return; + + auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto fileVersion = jsonData["data"]["file_version"]; + auto fileSize = jsonData["data"]["file_size"]; + auto fileMd5 = jsonData["data"]["file_md5"]; + auto fileSha256 = jsonData["data"]["file_sha256"]; + auto fileUrl = jsonData["data"]["file_url"]; + auto description = jsonData["data"]["file_describe"]; + + std::string fileName = cache_profile_path.string() + "/profiles.zip"; + download_file(fileUrl, fileName); + } + + json j = json::parse(body); struct update From 4ea4bf86c0f41124a4909f33f93f9f443753b6ee Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 18:59:34 +0800 Subject: [PATCH 09/51] feature add preset update. --- src/slic3r/Utils/PresetUpdater.cpp | 105 +++++++---------------------- 1 file changed, 25 insertions(+), 80 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index fe835cc1f0..5ae6f5c454 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -746,93 +746,38 @@ void PresetUpdater::priv::sync_config() if (http_status != 200) return; try { - - { - - json jsonData = json::parse(body); - auto errCode = jsonData["code"]; - if (errCode != 200) - return; - - auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; - auto fileVersion = jsonData["data"]["file_version"]; - auto fileSize = jsonData["data"]["file_size"]; - auto fileMd5 = jsonData["data"]["file_md5"]; - auto fileSha256 = jsonData["data"]["file_sha256"]; - auto fileUrl = jsonData["data"]["file_url"]; - auto description = jsonData["data"]["file_describe"]; - - std::string fileName = cache_profile_path.string() + "/profiles.zip"; - download_file(fileUrl, fileName); - } - - - json j = json::parse(body); - - struct update - { - std::string url; - std::string name; - int ver = -9999; - } latest_update; - - if (!(j.contains("message") && j["message"].get() == "Not Found")) { - json assets = j.at("assets"); - if (assets.is_array()) { - for (auto asset : assets) { - std::string name = asset["name"].get(); - int versionNumber = -1; - std::regex regexPattern("Snapmaker_Orca-profiles_ota_.*\\.([0-9]+)\\.zip$"); - std::smatch matches; - if (std::regex_search(name, matches, regexPattern) && matches.size() > 1) { - versionNumber = std::stoi(matches[1].str()); - } - if (versionNumber > 0 && versionNumber > latest_update.ver) { - latest_update.url = asset["browser_download_url"].get(); - latest_update.name = name; - latest_update.ver = versionNumber; - } - } - } - } - - if (cancel) + json jsonData = json::parse(body); + auto errCode = jsonData["code"]; + if (errCode != 200) return; - if (latest_update.ver > 0) { - if (latest_update.name == asset_name) - return; - if (fs::exists(cache_profile_path / "profiles")) - fs::remove_all(cache_profile_path / "profiles"); - fs::create_directories(cache_profile_path / "profiles"); - // download the file - std::string download_url = latest_update.url; - std::string download_file = (cache_path / (latest_update.name + TMP_EXTENSION)).string(); - if (!get_file(download_url, download_file)) { - return; - } + auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto fileVersion = jsonData["data"]["file_version"]; + auto fileSize = jsonData["data"]["file_size"]; + auto fileMd5 = jsonData["data"]["file_md5"]; + auto fileSha256 = jsonData["data"]["file_sha256"]; + auto fileUrl = jsonData["data"]["file_url"]; + auto description = jsonData["data"]["file_describe"]; - // extract the file downloaded - BOOST_LOG_TRIVIAL(info) << "[Orca Updater]start to unzip the downloaded file " << download_file; - if (!extract_file(download_file, cache_profile_path)) { - BOOST_LOG_TRIVIAL(warning) << "[Orca Updater]extract downloaded file" - << " failed, path: " << download_file; + auto localProfilesjson = cache_path / "profiles/Snapmaker.json"; + std::string json_path = data_dir() + "/system/Snapmaker.json"; + std::string fileName = cache_profile_path.string() + "/profiles.zip"; + Semver currentPresetVersion = get_version_from_json(json_path); + Semver remoteVersion(fileVersion); + + std::string localOtaPresetVersion = ""; + if (fs::exists(localProfilesjson)) { + Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); + + if (localOtaVersion >= remoteVersion) { + BOOST_LOG_TRIVIAL(info) << format("this the newest preset config for snapmaker orca"); return; } - BOOST_LOG_TRIVIAL(info) << "[Orca Updater]finished unzip the downloaded file " << download_file; - boost::nowide::ofstream f(cache_profile_update_file.string()); - json data; - data["name"] = latest_update.name; - f << data << std::endl; - f.close(); - } else { - // The current Orca version does not have any OTA updates, delete the cache file - if (fs::exists(cache_profile_path / "profiles")) - fs::remove_all(cache_profile_path / "profiles"); - if (fs::exists(cache_profile_update_file)) - fs::remove(cache_profile_update_file); } + if (currentPresetVersion < remoteVersion) + download_file(fileUrl, fileName); + } catch (...) {} }) .perform_sync(); From 1947fd155152f0beea06f4adef0576ea7e387f90 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 31 Dec 2025 15:07:28 +0800 Subject: [PATCH 10/51] feature remove not work code --- src/slic3r/GUI/GUI_App.cpp | 7 +++++++ src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/MainFrame.cpp | 11 +++++++++++ src/slic3r/Utils/PresetUpdater.cpp | 21 +++------------------ 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index abfb91661f..c5649d002e 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4724,6 +4724,13 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que } // namespace +bool GUI_App::check_preset_version() +{ + bool is_newest_version = false; + + + return is_newest_version; +} void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { std::string update_url = ""; diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index ec2a8922fd..07e820a42f 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -578,6 +578,7 @@ private: bool m_studio_active = true; std::chrono::system_clock::time_point last_active_point; + bool check_preset_version(); void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); void enter_force_upgrade(); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 5c2e217e85..6366cbf428 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2297,6 +2297,17 @@ static wxMenu* generate_help_menu() return true; }); + append_menu_item( + helpMenu, wxID_ANY, _L("Check for Preset Update"), _L("Check for Preset Update"), + [](wxCommandEvent&) { + + wxString msg = _L("This is the newest version."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); + }, + "", nullptr, []() { return true; }); + + append_menu_item(helpMenu, wxID_ANY, _L("Import Profile"), _L("Import Profile"), [](wxCommandEvent&) { wxGetApp().import_presets(); }); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 5ae6f5c454..709568900f 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -712,22 +712,7 @@ bool PresetUpdater::priv::download_file(const std::string& url, void PresetUpdater::priv::sync_config() { auto cache_profile_path = cache_path; - auto cache_profile_update_file = cache_path / "profiles_update.json"; - std::string asset_name; - if (fs::exists(cache_profile_update_file)) { - try { - boost::nowide::ifstream f(cache_profile_update_file.string()); - json data = json::parse(f); - if (data.contains("name")) - asset_name = data["name"].get(); - f.close(); - } catch (const std::exception& ex) { - BOOST_LOG_TRIVIAL(error) << "[Orca Updater]: failed to read profiles_update.json when sync_config: " << ex.what() << std::endl; - } catch (...) { - // catch any other errors (that we have no information about) - BOOST_LOG_TRIVIAL(error) << "[Orca Updater]: unknown failure when reading profiles_update.json in sync_config" << std::endl; - } - } + AppConfig *app_config = GUI::wxGetApp().app_config; // auto profile_update_url = app_config->profile_update_url() + "/" + Snapmaker_VERSION; @@ -735,13 +720,13 @@ void PresetUpdater::priv::sync_config() // parse the assets section and get the latest asset by comparing the name Http::get(profile_update_url) - .on_error([cache_profile_path, cache_profile_update_file](std::string body, std::string error, unsigned http_status) { + .on_error([cache_profile_path ](std::string body, std::string error, unsigned http_status) { // Orca: we check the response body to see if it's "Not Found", if so, it means for the current Orca version we don't have OTA // updates, we can delete the cache file BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_config_orca", http_status, error); }) .timeout_connect(5) - .on_complete([this, asset_name, cache_profile_path, cache_profile_update_file](std::string body, unsigned http_status) { + .on_complete([this, cache_profile_path](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) return; From 0163f9b31aeb7e54410becb4792da50fd2283b0c Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 31 Dec 2025 16:18:55 +0800 Subject: [PATCH 11/51] feature add tips dialog for no update on preset --- src/slic3r/GUI/GUI_App.cpp | 16 +++++++---- src/slic3r/GUI/GUI_App.hpp | 2 +- src/slic3r/GUI/MainFrame.cpp | 4 +-- src/slic3r/Utils/PresetUpdater.cpp | 45 ++++++++++++++++++++++++++---- src/slic3r/Utils/PresetUpdater.hpp | 3 ++ 5 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index c5649d002e..f30c0f2b84 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2578,6 +2578,12 @@ bool GUI_App::on_init_inner() }); dlg.ShowModal(); }); + + Bind(EVT_NO_PRESET_UPDATE, [this](const wxCommandEvent& evt) { + wxString msg = _L("This is the newest version."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); + }); } else { #ifdef __WXMSW__ @@ -4724,12 +4730,10 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que } // namespace -bool GUI_App::check_preset_version() -{ - bool is_newest_version = false; - - - return is_newest_version; +void GUI_App::check_preset_version() +{ + if (preset_updater != nullptr) + preset_updater->sync_config_async(); } void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 07e820a42f..24d1ab1690 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -578,7 +578,7 @@ private: bool m_studio_active = true; std::chrono::system_clock::time_point last_active_point; - bool check_preset_version(); + void check_preset_version(); void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); void enter_force_upgrade(); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 6366cbf428..b6597ffedc 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2300,10 +2300,8 @@ static wxMenu* generate_help_menu() append_menu_item( helpMenu, wxID_ANY, _L("Check for Preset Update"), _L("Check for Preset Update"), [](wxCommandEvent&) { + wxGetApp().check_preset_version(); - wxString msg = _L("This is the newest version."); - InfoDialog dlg(nullptr, _L("Info"), msg); - dlg.ShowModal(); }, "", nullptr, []() { return true; }); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 709568900f..60daeebe9b 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -182,6 +182,7 @@ struct Updates }; +wxDEFINE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); @@ -226,7 +227,7 @@ struct PresetUpdater::priv void sync_version() const; void parse_version_string(const std::string& body) const; void sync_resources(std::string http_url, std::map &resources, bool check_patch = false, std::string current_version="", std::string changelog_file=""); - void sync_config(); + void sync_config(bool isAuto_check = true); bool download_file(const std::string& url, const std::string& target_path, int timeout_sec = 30, bool* cancel_flag = nullptr); void sync_tooltip(std::string http_url, std::string language); void sync_plugins(std::string http_url, std::string plugin_version); @@ -709,7 +710,7 @@ bool PresetUpdater::priv::download_file(const std::string& url, return res; } // Orca: sync config update for currect App version -void PresetUpdater::priv::sync_config() +void PresetUpdater::priv::sync_config(bool isAuto_check) { auto cache_profile_path = cache_path; @@ -720,13 +721,13 @@ void PresetUpdater::priv::sync_config() // parse the assets section and get the latest asset by comparing the name Http::get(profile_update_url) - .on_error([cache_profile_path ](std::string body, std::string error, unsigned http_status) { + .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { // Orca: we check the response body to see if it's "Not Found", if so, it means for the current Orca version we don't have OTA // updates, we can delete the cache file BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_config_orca", http_status, error); }) .timeout_connect(5) - .on_complete([this, cache_profile_path](std::string body, unsigned http_status) { + .on_complete([this, cache_profile_path, isAuto_check](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) return; @@ -755,13 +756,27 @@ void PresetUpdater::priv::sync_config() Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); if (localOtaVersion >= remoteVersion) { - BOOST_LOG_TRIVIAL(info) << format("this the newest preset config for snapmaker orca"); + if (!isAuto_check) + { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the preset update."); + } return; } } if (currentPresetVersion < remoteVersion) download_file(fileUrl, fileName); + { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the preset update local no profiles."); + } + } } catch (...) {} }) @@ -1540,6 +1555,26 @@ bool PresetUpdater::install_bundles_rsrc(std::vector bundles, bool return p->install_bundles_rsrc(bundles, snapshot); } + +void PresetUpdater::sync_config_async() +{ + if (p->thread.joinable()) { + p->cancel = true; + p->thread.join(); + } + + p->cancel = false; + p->thread = std::thread([this]() { + BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_config_async started"; + this->p->sync_config(false); + + GUI::wxGetApp().CallAfter([] { + BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_config_async completed, checking updates..."; + GUI::wxGetApp().check_config_updates_from_updater(); + }); + }); +} + void PresetUpdater::on_update_notification_confirm() { if (!p->has_waiting_updates) diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index 59215926d8..3e8edaa7ca 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -65,11 +65,14 @@ public: void import_flutter_web(); + void sync_config_async(); + public: struct priv; std::unique_ptr p; }; +wxDECLARE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); From 398800a3009380c8ede1c62bef1e5c014fbce984 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 31 Dec 2025 18:21:17 +0800 Subject: [PATCH 12/51] feature get flutter web resource from server. --- src/libslic3r/AppConfig.cpp | 6 ++ src/libslic3r/AppConfig.hpp | 2 + src/slic3r/GUI/GUI_App.cpp | 14 ++- src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/MainFrame.cpp | 6 ++ src/slic3r/Utils/PresetUpdater.cpp | 165 +++++++++++++++++++++-------- src/slic3r/Utils/PresetUpdater.hpp | 5 +- 7 files changed, 150 insertions(+), 49 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 4e17f94527..cf8800fda1 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -40,6 +40,7 @@ namespace Slic3r { static const std::string VERSION_CHECK_URL_STABLE = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases/latest"; static const std::string VERSION_CHECK_URL = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases"; static const std::string PROFILE_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/profile/preset_config.json"; +static const std::string FLUTTER_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/flutter/flutter_config.json"; static const std::string MODELS_STR = "models"; const std::string AppConfig::SECTION_FILAMENTS = "filaments"; @@ -1429,6 +1430,11 @@ std::string AppConfig::version_check_url(bool stable_only/* = false*/) const return from_settings.empty() ? stable_only ? VERSION_CHECK_URL_STABLE : VERSION_CHECK_URL : from_settings; } +std::string AppConfig::flutter_resource_update_url() const +{ + return FLUTTER_UPDATE_URL; +} + std::string AppConfig::profile_update_url() const { return PROFILE_UPDATE_URL; diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index fce62c2a0d..d70bb36af8 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -328,6 +328,8 @@ public: // Get the Orca profile update url. std::string profile_update_url() const; + std::string flutter_resource_update_url() const; + // Returns the original Slic3r version found in the ini file before it was overwritten // by the current version Semver orig_version() const { return m_orig_version; } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index f30c0f2b84..5477fa8836 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2579,10 +2579,10 @@ bool GUI_App::on_init_inner() dlg.ShowModal(); }); - Bind(EVT_NO_PRESET_UPDATE, [this](const wxCommandEvent& evt) { - wxString msg = _L("This is the newest version."); - InfoDialog dlg(nullptr, _L("Info"), msg); - dlg.ShowModal(); + Bind(EVT_NO_PRESET_UPDATE, [this](const wxCommandEvent& evt) { + wxString msg = _L("This is the newest version."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); }); } else { @@ -4730,6 +4730,12 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que } // namespace +void GUI_App::check_web_version() +{ + if (preset_updater != nullptr) + preset_updater->sync_web_async(); +} + void GUI_App::check_preset_version() { if (preset_updater != nullptr) diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 24d1ab1690..052ab0f96e 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -578,6 +578,7 @@ private: bool m_studio_active = true; std::chrono::system_clock::time_point last_active_point; + void check_web_version(); void check_preset_version(); void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index b6597ffedc..94c67c8d20 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2305,6 +2305,12 @@ static wxMenu* generate_help_menu() }, "", nullptr, []() { return true; }); + append_menu_item( + helpMenu, wxID_ANY, _L("Check for Web Update"), _L("Check for Web Update"), + [](wxCommandEvent&) { + wxGetApp().check_web_version(); + }, + "", nullptr, []() { return true; }); append_menu_item(helpMenu, wxID_ANY, _L("Import Profile"), _L("Import Profile"), [](wxCommandEvent&) { wxGetApp().import_presets(); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 60daeebe9b..098d06546c 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -181,7 +181,7 @@ struct Updates std::vector updates; }; - +wxDEFINE_EVENT(EVT_NO_WEB_RESOURCE_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); @@ -228,6 +228,7 @@ struct PresetUpdater::priv void parse_version_string(const std::string& body) const; void sync_resources(std::string http_url, std::map &resources, bool check_patch = false, std::string current_version="", std::string changelog_file=""); void sync_config(bool isAuto_check = true); + void sync_update_flutter_resource(bool isAuto_check = true); bool download_file(const std::string& url, const std::string& target_path, int timeout_sec = 30, bool* cancel_flag = nullptr); void sync_tooltip(std::string http_url, std::string language); void sync_plugins(std::string http_url, std::string plugin_version); @@ -709,6 +710,77 @@ bool PresetUpdater::priv::download_file(const std::string& url, return res; } + + +void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) +{ + auto cache_profile_path = cache_path; + + AppConfig* app_config = GUI::wxGetApp().app_config; + + auto preset_update_url = app_config->flutter_resource_update_url(); + + Http::get(preset_update_url) + .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { + BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_update_flutter_resource", http_status, error); + }) + .timeout_connect(5) + .on_complete([this, cache_profile_path, isAuto_check](std::string body, unsigned http_status) { + // Http response OK + if (http_status != 200) + return; + try { + json jsonData = json::parse(body); + auto errCode = jsonData["code"]; + if (errCode != 200) + return; + + auto buildNumber = jsonData["data"]["build_number"]; + auto supportPcVersion = jsonData["data"]["support_snapmaker_version"]; + auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto fileVersion = jsonData["data"]["file_version"]; + auto fileSize = jsonData["data"]["file_size"]; + auto fileMd5 = jsonData["data"]["file_md5"]; + auto fileSha256 = jsonData["data"]["file_sha256"]; + auto fileUrl = jsonData["data"]["file_url"]; + auto description = jsonData["data"]["file_describe"]; + + auto localProfilesjson = cache_path / "flutter_web/version.json"; + std::string json_path = data_dir() + "/web/flutter_web/version.json"; + std::string fileName = cache_profile_path.string() + "/flutter_web.zip"; + Semver currentPresetVersion = get_version_from_json(json_path); + Semver remoteVersion(fileVersion); + + std::string localOtaPresetVersion = ""; + if (fs::exists(localProfilesjson)) { + Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); + + if (localOtaVersion >= remoteVersion) { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); + } + return; + } + } + + if (currentPresetVersion < remoteVersion) + download_file(fileUrl, fileName); + else { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update local no profiles."); + } + } + + } catch (...) {} + }) + .perform_sync(); +} // Orca: sync config update for currect App version void PresetUpdater::priv::sync_config(bool isAuto_check) { @@ -769,7 +841,7 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) if (currentPresetVersion < remoteVersion) download_file(fileUrl, fileName); - { + else { if (!isAuto_check) { wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); GUI::wxGetApp().QueueEvent(evt); @@ -777,7 +849,7 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) BOOST_LOG_TRIVIAL(info) << format("use check the preset update local no profiles."); } } - + } catch (...) {} }) .perform_sync(); @@ -1555,6 +1627,25 @@ bool PresetUpdater::install_bundles_rsrc(std::vector bundles, bool return p->install_bundles_rsrc(bundles, snapshot); } +void PresetUpdater::sync_web_async() +{ + if (p->thread.joinable()) { + p->cancel = true; + p->thread.join(); + } + + p->cancel = false; + p->thread = std::thread([this]() { + BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_web_async started"; + this->p->sync_update_flutter_resource(false); + + GUI::wxGetApp().CallAfter([this] { + std::string zipfilepath = this->p->cache_path.string() + "/flutter_web.zip"; + BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_web_async completed, checking updates..."; + load_lutter_web(zipfilepath); + }); + }); +} void PresetUpdater::sync_config_async() { @@ -1634,31 +1725,20 @@ bool PresetUpdater::version_check_enabled() const return p->enabled_version_check; } -void PresetUpdater::import_flutter_web() + +void PresetUpdater::load_lutter_web(const std::string& zip_file) { - // 1. 弹出文件选择框 - wxFileDialog dialog(nullptr, _L("Please choose a web resource package file:"), "", "", "resource packages (*.zip)|*.zip", - wxFD_OPEN | wxFD_FILE_MUST_EXIST); - - if (dialog.ShowModal() != wxID_OK) - return; - - std::string zip_file = dialog.GetPath().ToUTF8().data(); - - // 2. 创建临时目录用于解压 boost::filesystem::path temp_path = boost::filesystem::temp_directory_path() / "orca_temp_flutter_import"; try { if (boost::filesystem::exists(temp_path)) boost::filesystem::remove_all(temp_path); boost::filesystem::create_directories(temp_path); - // 3. 解压zip文件到临时目录 if (!p->extract_file(zip_file, temp_path.string())) { GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); return; } - // 4. 检查版本并导入 std::vector outdated_presets; Updates updates; @@ -1667,40 +1747,33 @@ void PresetUpdater::import_flutter_web() GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); } - // 读取当前flutter资源包版本 - std::string ori_version_str = "0"; + std::string ori_version_str = "0"; std::string ori_build_number_str = "0"; - auto ori_version_file = boost::filesystem::path(data_dir()) / "web" / "flutter_web" / "version.json"; + auto ori_version_file = boost::filesystem::path(data_dir()) / "web" / "flutter_web" / "version.json"; boost::property_tree::ptree ori_config; boost::property_tree::read_json(ori_version_file.string(), ori_config); ori_version_str = ori_config.get("version", "0"); ori_build_number_str = ori_config.get("build_number", "0"); - // 遍历解压的文件夹 for (auto& dir_entry : boost::filesystem::directory_iterator(temp_path / "flutter_web")) { if (dir_entry.path().filename() == "version.json") { try { - // 读取json文件获取版本信息 + boost::property_tree::ptree config; boost::property_tree::read_json(dir_entry.path().string(), config); - std::string version_str = config.get("version", "0"); + std::string version_str = config.get("version", "0"); std::string build_number_str = config.get("build_number", "0"); - // std::string vendor = dir_entry.path().stem().string(); - - - - // 使用 Semver 进行版本比较 Semver online_version = version_str; Semver current_version = ori_version_str; - if (/* current_version < online_version && */ori_build_number_str < build_number_str) { + if (/* current_version < online_version && */ ori_build_number_str < build_number_str) { auto source_folder_path = fs::path(dir_entry.path().parent_path()); auto target_folder_path = (boost::filesystem::path(data_dir()) / "web" / "flutter_web"); - // 创建Version对象 + Version version; - version.config_version = online_version; // 将Semver赋值给Version的config_version + version.config_version = online_version; // changelog std::string changelog = ""; @@ -1711,16 +1784,14 @@ void PresetUpdater::import_flutter_web() oss << ifs.rdbuf(); changelog = oss.str(); ifs.close(); - // 替换所有的 \\n 为 \n size_t pos = 0; while ((pos = changelog.find("\\n", pos)) != std::string::npos) { changelog.replace(pos, 2, "\n"); - pos += 1; // 移动到下一个可能的位置 + pos += 1; } } - // 检查最小要求软件版本 - Semver min_ver = get_min_version_from_json(dir_entry.path().string()); + Semver min_ver = get_min_version_from_json(dir_entry.path().string()); Semver soft_ver = Semver(std::string(Snapmaker_VERSION)); bool legal = true; @@ -1731,13 +1802,10 @@ void PresetUpdater::import_flutter_web() .ToStdString(); } - // 版本较新且兼容,添加到更新列表 - - updates.updates.emplace_back(std::move(source_folder_path), std::move(target_folder_path), version, "flutter_web", changelog, "", - false, true, legal); + updates.updates.emplace_back(std::move(source_folder_path), std::move(target_folder_path), version, "flutter_web", + changelog, "", false, true, legal); } else { - // 版本较旧或不兼容,添加到提示列表 outdated_presets.push_back("flutter_web"); } } catch (std::exception& e) { @@ -1747,7 +1815,6 @@ void PresetUpdater::import_flutter_web() } } - // 5. 执行更新并提示结果 bool need_restart = false; if (!updates.updates.empty()) { std::vector updates_msg; @@ -1784,8 +1851,6 @@ void PresetUpdater::import_flutter_web() GUI::MessageDialog(nullptr, message).ShowModal(); } - - if (need_restart) { GUI::MessageDialog msg_wingow(nullptr, _L("Updating the web resources requires application restart.") + "\n" + @@ -1797,17 +1862,29 @@ void PresetUpdater::import_flutter_web() app->recreate_GUI(_L("Update web resources")); } - } catch (std::exception& e) { BOOST_LOG_TRIVIAL(error) << "Failed to importweb resources: " << e.what(); GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); } - // 6. 清理临时目录 boost::filesystem::remove_all(temp_path); } + +void PresetUpdater::import_flutter_web() +{ + wxFileDialog dialog(nullptr, _L("Please choose a web resource package file:"), "", "", "resource packages (*.zip)|*.zip", + wxFD_OPEN | wxFD_FILE_MUST_EXIST); + + if (dialog.ShowModal() != wxID_OK) + return; + + std::string zip_file = dialog.GetPath().ToUTF8().data(); + + load_lutter_web(zip_file); +} + void PresetUpdater::import_system_profile() { // 1. 弹出文件选择框 diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index 3e8edaa7ca..745931f96b 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -65,13 +65,16 @@ public: void import_flutter_web(); + void load_lutter_web(const std::string& zip_file); + void sync_config_async(); + void sync_web_async(); public: struct priv; std::unique_ptr p; }; - +wxDECLARE_EVENT(EVT_NO_WEB_RESOURCE_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); From 9399c860b57e8231fa806789a7b04fa59ce7b0f2 Mon Sep 17 00:00:00 2001 From: alves Date: Sun, 4 Jan 2026 16:49:23 +0800 Subject: [PATCH 13/51] feature update preset logic for get the server latest version --- src/slic3r/GUI/GUI_App.cpp | 21 ++++++++++++++------ src/slic3r/GUI/GUI_App.hpp | 2 +- src/slic3r/Utils/PresetUpdater.cpp | 32 ++++++++++++++++++------------ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 5477fa8836..366c5410f1 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -164,6 +164,8 @@ typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS2)( #include #endif +#define UPDATE_BY_USER 1 + using namespace std::literals; namespace pt = boost::property_tree; @@ -2580,9 +2582,15 @@ bool GUI_App::on_init_inner() }); Bind(EVT_NO_PRESET_UPDATE, [this](const wxCommandEvent& evt) { - wxString msg = _L("This is the newest version."); - InfoDialog dlg(nullptr, _L("Info"), msg); - dlg.ShowModal(); + wxString msg = _L("The configuration is up to date."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); + }); + + Bind(EVT_NO_WEB_RESOURCE_UPDATE, [this](const wxCommandEvent& evt) { + wxString msg = _L("This is the newest version."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); }); } else { @@ -4791,7 +4799,7 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) Semver server_version = get_version(version_info.version_str, matcher); - if (current_version >= server_version) { + if (current_version >= server_version && by_user) { this->no_new_version(); return; } @@ -4809,6 +4817,8 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); evt->SetString(version_info.url); + if (by_user) + evt->SetInt(UPDATE_BY_USER); GUI::wxGetApp().QueueEvent(evt); } catch (...) {} }) @@ -6912,8 +6922,7 @@ void GUI_App::check_updates(const bool verbose) m_app_conf_exists = true; } else if (verbose && updater_result == PresetUpdater::R_NOOP) { - MsgNoUpdates dlg; - dlg.ShowModal(); + } } catch (const std::exception & ex) { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 052ab0f96e..1313918b3c 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -782,7 +782,7 @@ private: bool check_networking_version(); void cancel_networking_install(); void restart_networking(); - void check_config_updates_from_updater() { check_updates(false); } + void check_config_updates_from_updater(bool updateByuser = false) { check_updates(updateByuser); } private: int updating_bambu_networking(); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 098d06546c..0f24555ba7 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -735,9 +735,10 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) if (errCode != 200) return; - auto buildNumber = jsonData["data"]["build_number"]; - auto supportPcVersion = jsonData["data"]["support_snapmaker_version"]; + auto buildNumber = jsonData["data"]["build_number"]; auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto minSupportPcVersion = jsonData["data"]["min_support_pc_version"]; + auto maxSupportPcVersion = jsonData["data"]["max_support_pc_version"]; auto fileVersion = jsonData["data"]["file_version"]; auto fileSize = jsonData["data"]["file_size"]; auto fileMd5 = jsonData["data"]["file_md5"]; @@ -810,6 +811,8 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) return; auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto minSupportPcVersion = jsonData["data"]["min_support_pc_version"]; + auto maxSupportPcVersion = jsonData["data"]["max_support_pc_version"]; auto fileVersion = jsonData["data"]["file_version"]; auto fileSize = jsonData["data"]["file_size"]; auto fileMd5 = jsonData["data"]["file_md5"]; @@ -826,17 +829,20 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) std::string localOtaPresetVersion = ""; if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); - - if (localOtaVersion >= remoteVersion) { - if (!isAuto_check) - { - wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); - GUI::wxGetApp().QueueEvent(evt); - - BOOST_LOG_TRIVIAL(info) << format("use check the preset update."); - } + //don't allow jump version. first upgrade localOta + if (localOtaVersion >= currentPresetVersion) return; - } + else + { + if (currentPresetVersion >= remoteVersion) { + if (!isAuto_check) {//show tipsdlg by user check upgrade + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + BOOST_LOG_TRIVIAL(info) << format("use check the preset update."); + } + return; + } + } } if (currentPresetVersion < remoteVersion) @@ -1661,7 +1667,7 @@ void PresetUpdater::sync_config_async() GUI::wxGetApp().CallAfter([] { BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_config_async completed, checking updates..."; - GUI::wxGetApp().check_config_updates_from_updater(); + GUI::wxGetApp().check_config_updates_from_updater(true); }); }); } From 7b23bde61d294096c68cf69e158787025a73d565 Mon Sep 17 00:00:00 2001 From: alves Date: Sun, 4 Jan 2026 16:54:08 +0800 Subject: [PATCH 14/51] feature update web resource upgrade logic for process soft. --- src/slic3r/Utils/PresetUpdater.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 0f24555ba7..6803f141e7 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -756,14 +756,19 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); - if (localOtaVersion >= remoteVersion) { - if (!isAuto_check) { - wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); - GUI::wxGetApp().QueueEvent(evt); - - BOOST_LOG_TRIVIAL(info) << format("use check the web update."); - } + if (localOtaVersion >= remoteVersion) return; + else { + if (currentPresetVersion >= remoteVersion){ + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); + } + return; + } + } } From f8c2084e3337a34d6b8081174b56b8fcdeddaee7 Mon Sep 17 00:00:00 2001 From: alves Date: Sun, 4 Jan 2026 17:14:50 +0800 Subject: [PATCH 15/51] feature update preset pack path for on the menu import preset. --- src/slic3r/Utils/PresetUpdater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 6803f141e7..e1e30afda2 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -1930,7 +1930,7 @@ void PresetUpdater::import_system_profile() } // 遍历解压的文件夹 - for (auto& dir_entry : boost::filesystem::directory_iterator(temp_path / "profiles")) { + for (auto& dir_entry : boost::filesystem::directory_iterator(temp_path)) { if (dir_entry.path().extension() == ".json") { try { // 读取json文件获取版本信息 From f65b104c1ff23febff8c80ecc9add9305497588b Mon Sep 17 00:00:00 2001 From: alves Date: Sun, 4 Jan 2026 18:21:53 +0800 Subject: [PATCH 16/51] feature diff server update and import update on web resource --- src/slic3r/Utils/PresetUpdater.cpp | 6 +++--- src/slic3r/Utils/PresetUpdater.hpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index e1e30afda2..fab0e940d7 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -1653,7 +1653,7 @@ void PresetUpdater::sync_web_async() GUI::wxGetApp().CallAfter([this] { std::string zipfilepath = this->p->cache_path.string() + "/flutter_web.zip"; BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_web_async completed, checking updates..."; - load_lutter_web(zipfilepath); + load_lutter_web(zipfilepath, true); }); }); } @@ -1737,7 +1737,7 @@ bool PresetUpdater::version_check_enabled() const } -void PresetUpdater::load_lutter_web(const std::string& zip_file) +void PresetUpdater::load_lutter_web(const std::string& zip_file, bool serverUpdate) { boost::filesystem::path temp_path = boost::filesystem::temp_directory_path() / "orca_temp_flutter_import"; try { @@ -1854,7 +1854,7 @@ void PresetUpdater::load_lutter_web(const std::string& zip_file) } wxString message; - if (!outdated_presets.empty()) { + if (!outdated_presets.empty() && !serverUpdate) { message = _L("This web resouce could not be imported due to outdated versions.") + "\n"; for (const auto& preset : outdated_presets) { message += "• " + preset + "\n"; diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index 745931f96b..c1c7a49638 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -65,7 +65,7 @@ public: void import_flutter_web(); - void load_lutter_web(const std::string& zip_file); + void load_lutter_web(const std::string& zip_file,bool serverUpdate = false); void sync_config_async(); From 020423542d6dbd194a0f0d8182e1968c4831de06 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 5 Jan 2026 17:36:27 +0800 Subject: [PATCH 17/51] feature diff cn and the other area to download soft.and request to server fail show the error dialog. --- src/libslic3r/AppConfig.cpp | 25 +++++++++++++++++++++++++ src/libslic3r/AppConfig.hpp | 1 + src/slic3r/GUI/GUI_App.cpp | 26 ++++++++++++++------------ src/slic3r/GUI/Preferences.cpp | 8 ++++---- src/slic3r/Utils/PresetUpdater.cpp | 18 ++++++++++++++---- src/slic3r/Utils/PresetUpdater.hpp | 1 + 6 files changed, 59 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index cf8800fda1..d7fbed9d27 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -43,6 +43,20 @@ static const std::string PROFILE_UPDATE_URL = "https://public.resource.snapmaker static const std::string FLUTTER_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/flutter/flutter_config.json"; static const std::string MODELS_STR = "models"; +#define APP_UPDATE_URL_BASE_CN "https://public.resource.snapmaker.com/upgrade/packages/orca" +#define APP_UPDATE_URL_BASE_EN "https://public.resource.snapmaker.com/upgrade/packages/orca" + +#if defined(_WIN32) +static const std::string APP_UPDATE_URL = std::string("/win/manifest.json"); +#elif defined(__APPLE__) +static const std::string APP_UPDATE_URL = std::string("/mac/manifest.json"); +#elif defined(__linux__) +static const std::string APP_UPDATE_URL = std::string("/linux/manifest.json"); +#else +static const std::string APP_UPDATE_URL = ""; +#endif + + const std::string AppConfig::SECTION_FILAMENTS = "filaments"; const std::string AppConfig::SECTION_MATERIALS = "sla_materials"; const std::string AppConfig::SECTION_EMBOSS_STYLE = "font"; @@ -1424,6 +1438,17 @@ std::string AppConfig::config_path() return path; } +std::string AppConfig::get_version_upgrade_url(bool stable_only /* = false*/) +{ + //get local area and get the resource from diff server + std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL; + auto countryArea = get_country_code(); + if (countryArea == std::string("CN")) + url = APP_UPDATE_URL_BASE_CN + APP_UPDATE_URL; + + return url; +} + std::string AppConfig::version_check_url(bool stable_only/* = false*/) const { auto from_settings = get("version_check_url"); diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index d70bb36af8..04770946d5 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -324,6 +324,7 @@ public: // Get the Slic3r version check url. // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. std::string version_check_url(bool stable_only = false) const; + std::string get_version_upgrade_url(bool stable_only = false); // Get the Orca profile update url. std::string profile_update_url() const; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 366c5410f1..2032eca133 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2592,6 +2592,12 @@ bool GUI_App::on_init_inner() InfoDialog dlg(nullptr, _L("Info"), msg); dlg.ShowModal(); }); + + Bind(EVT_REQUEST_SERVER_FAIL, [this](const wxCommandEvent& evt) { + wxString msg = evt.GetString(); + InfoDialog dlg(nullptr, _L("Error"), msg); + dlg.ShowModal(); + }); } else { #ifdef __WXMSW__ @@ -4751,27 +4757,23 @@ void GUI_App::check_preset_version() } void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { - std::string update_url = ""; - -#ifdef __WINDOWS__ - update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/win/manifest.json"; -#endif -#ifdef __APPLE__ - update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/mac/manifest.json"; -#endif -#ifdef __LINUX__ - update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/linux/manifest.json"; -#endif + std::string update_url = app_config->get_version_upgrade_url(); AppConfig* app_config = wxGetApp().app_config; Http::get(update_url) .on_error([&](std::string body, std::string error, unsigned http_status) { (void)body; + + wxCommandEvent* evt = new wxCommandEvent(EVT_REQUEST_SERVER_FAIL); + wxString errorMsg = wxString::Format(_L("request to server update soft fail with body:%s,error:%s,status:%d"), body, + error, http_status); + evt->SetString(errorMsg); + GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(error) << format("Error getting: `%1%`: HTTP %2%, %3%", "check_new_version_sf", http_status, error); }) - .timeout_connect(1) + .timeout_connect(TIMEOUT_CONNECT) .on_complete([this,by_user](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) { diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index d7d5240070..e01861b8a1 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -1196,7 +1196,7 @@ wxWindow* PreferencesDialog::create_general_page() app_config->save(); - auto item_check_stable_version_only = create_item_checkbox(_L("Check for stable updates only"), page, _L("Check for stable updates only"), 50, "check_stable_update_only"); + //auto item_check_stable_version_only = create_item_checkbox(_L("Check for stable updates only"), page, _L("Check for stable updates only"), 50, "check_stable_update_only"); std::vector Units = {_L("Metric") + " (mm, g)", _L("Imperial") + " (in, oz)"}; auto item_currency = create_item_combobox(_L("Units"), page, _L("Units"), "use_inches", Units); @@ -1231,7 +1231,7 @@ wxWindow* PreferencesDialog::create_general_page() auto item_multi_machine = create_item_checkbox(_L("Multi-device Management (Take effect after restarting Snapmaker Orca)."), page, _L("With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices."), 50, "enable_multi_machine"); auto item_auto_arrange = create_item_checkbox(_L("Auto arrange plate after cloning"), page, _L("Auto arrange plate after object cloning"), 50, "auto_arrange"); auto title_presets = create_item_title(_L("Presets"), page, _L("Presets")); - auto title_network = create_item_title(_L("Network"), page, _L("Network")); + //auto title_network = create_item_title(_L("Network"), page, _L("Network")); auto item_user_sync = create_item_checkbox(_L("Auto sync user presets (Printer/Filament/Process)"), page, _L("User Sync"), 50, "sync_user_preset"); auto item_system_sync = create_item_checkbox(_L("Update built-in Presets automatically."), page, _L("System Sync"), 50, "sync_system_preset"); auto item_save_presets = create_item_button(_L("Clear my choice on the unsaved presets."), _L("Clear"), page, L"", _L("Clear my choice on the unsaved presets."), []() { @@ -1336,8 +1336,8 @@ wxWindow* PreferencesDialog::create_general_page() sizer_page->Add(item_system_sync, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_remember_printer_config, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_save_presets, 0, wxTOP, FromDIP(3)); - sizer_page->Add(title_network, 0, wxTOP | wxEXPAND, FromDIP(20)); - sizer_page->Add(item_check_stable_version_only, 0, wxTOP, FromDIP(3)); + //sizer_page->Add(title_network, 0, wxTOP | wxEXPAND, FromDIP(20)); + //sizer_page->Add(item_check_stable_version_only, 0, wxTOP, FromDIP(3)); // SM Beta: temporarily open the item_stealth_mode and close the network plugin diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index fab0e940d7..31208f5f53 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -181,6 +181,7 @@ struct Updates std::vector updates; }; +wxDEFINE_EVENT(EVT_REQUEST_SERVER_FAIL, wxCommandEvent); wxDEFINE_EVENT(EVT_NO_WEB_RESOURCE_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); @@ -722,9 +723,14 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) Http::get(preset_update_url) .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { + wxCommandEvent* evt = new wxCommandEvent(EVT_REQUEST_SERVER_FAIL); + wxString errorMsg = wxString::Format(_L("request to server update web resource fail with body:%s,error:%s,status:%d"), body, error, http_status); + evt->SetString(errorMsg); + GUI::wxGetApp().QueueEvent(evt); + GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_update_flutter_resource", http_status, error); }) - .timeout_connect(5) + .timeout_connect(TIMEOUT_CONNECT) .on_complete([this, cache_profile_path, isAuto_check](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) @@ -756,7 +762,7 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); - if (localOtaVersion >= remoteVersion) + if (localOtaVersion > remoteVersion) return; else { if (currentPresetVersion >= remoteVersion){ @@ -802,9 +808,13 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { // Orca: we check the response body to see if it's "Not Found", if so, it means for the current Orca version we don't have OTA // updates, we can delete the cache file + wxCommandEvent* evt = new wxCommandEvent(EVT_REQUEST_SERVER_FAIL); + wxString errorMsg = wxString::Format(_L("request to server update preset resource fail with body:%s,error:%s,status:%d"), body,error, http_status); + evt->SetString(errorMsg); + GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_config_orca", http_status, error); }) - .timeout_connect(5) + .timeout_connect(TIMEOUT_CONNECT) .on_complete([this, cache_profile_path, isAuto_check](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) @@ -835,7 +845,7 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); //don't allow jump version. first upgrade localOta - if (localOtaVersion >= currentPresetVersion) + if (localOtaVersion > currentPresetVersion) return; else { diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index c1c7a49638..b18857245a 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -74,6 +74,7 @@ public: struct priv; std::unique_ptr p; }; +wxDECLARE_EVENT(EVT_REQUEST_SERVER_FAIL, wxCommandEvent); wxDECLARE_EVENT(EVT_NO_WEB_RESOURCE_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); From a22981ec6e87f1c52d2c1e00a4c9dc955dc1c7aa Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 5 Jan 2026 18:13:59 +0800 Subject: [PATCH 18/51] feature update to get the url function --- src/libslic3r/AppConfig.cpp | 44 ++++++++++++++++++------------ src/libslic3r/AppConfig.hpp | 7 ++--- src/slic3r/Utils/PresetUpdater.cpp | 7 ++--- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index d7fbed9d27..3195d32579 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -39,19 +39,19 @@ namespace Slic3r { static const std::string VERSION_CHECK_URL_STABLE = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases/latest"; static const std::string VERSION_CHECK_URL = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases"; -static const std::string PROFILE_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/profile/preset_config.json"; -static const std::string FLUTTER_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/flutter/flutter_config.json"; +static const std::string PROFILE_UPDATE_URL = "/upgrade/packages/profile/preset_config.json"; +static const std::string FLUTTER_UPDATE_URL = "/upgrade/packages/flutter/flutter_config.json"; static const std::string MODELS_STR = "models"; -#define APP_UPDATE_URL_BASE_CN "https://public.resource.snapmaker.com/upgrade/packages/orca" -#define APP_UPDATE_URL_BASE_EN "https://public.resource.snapmaker.com/upgrade/packages/orca" +#define APP_UPDATE_URL_BASE_CN "https://public.resource.snapmaker.com" +#define APP_UPDATE_URL_BASE_EN "https://public.resource.snapmaker.com" #if defined(_WIN32) -static const std::string APP_UPDATE_URL = std::string("/win/manifest.json"); +static const std::string APP_UPDATE_URL = std::string("/upgrade/packages/orca/win/manifest.json"); #elif defined(__APPLE__) -static const std::string APP_UPDATE_URL = std::string("/mac/manifest.json"); +static const std::string APP_UPDATE_URL = std::string("/upgrade/packages/orca/mac/manifest.json"); #elif defined(__linux__) -static const std::string APP_UPDATE_URL = std::string("/linux/manifest.json"); +static const std::string APP_UPDATE_URL = std::string("/upgrade/packages/orca/linux/manifest.json"); #else static const std::string APP_UPDATE_URL = ""; #endif @@ -1438,6 +1438,26 @@ std::string AppConfig::config_path() return path; } +std::string AppConfig::get_preset_upgrade_url() +{ + std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL; + auto countryArea = get_country_code(); + if (countryArea == std::string("CN")) + url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL; + + return url; +} + +std::string AppConfig::get_web_resource_upgrade_url() +{ + std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL; + auto countryArea = get_country_code(); + if (countryArea == std::string("CN")) + url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL; + + return url; +} + std::string AppConfig::get_version_upgrade_url(bool stable_only /* = false*/) { //get local area and get the resource from diff server @@ -1455,16 +1475,6 @@ std::string AppConfig::version_check_url(bool stable_only/* = false*/) const return from_settings.empty() ? stable_only ? VERSION_CHECK_URL_STABLE : VERSION_CHECK_URL : from_settings; } -std::string AppConfig::flutter_resource_update_url() const -{ - return FLUTTER_UPDATE_URL; -} - -std::string AppConfig::profile_update_url() const -{ - return PROFILE_UPDATE_URL; -} - bool AppConfig::exists() { return boost::filesystem::exists(config_path()); diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index 04770946d5..a1251d1ff9 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -325,11 +325,8 @@ public: // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. std::string version_check_url(bool stable_only = false) const; std::string get_version_upgrade_url(bool stable_only = false); - - // Get the Orca profile update url. - std::string profile_update_url() const; - - std::string flutter_resource_update_url() const; + std::string get_preset_upgrade_url(); + std::string get_web_resource_upgrade_url(); // Returns the original Slic3r version found in the ini file before it was overwritten // by the current version diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 31208f5f53..8b15071d6d 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -267,7 +267,7 @@ void PresetUpdater::priv::set_download_prefs(AppConfig *app_config) { version_check_url = app_config->version_check_url(); - auto profile_update_url = app_config->profile_update_url(); + auto profile_update_url = app_config->get_preset_upgrade_url(); if (!profile_update_url.empty()) enabled_config_update = true; else @@ -719,7 +719,7 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) AppConfig* app_config = GUI::wxGetApp().app_config; - auto preset_update_url = app_config->flutter_resource_update_url(); + auto preset_update_url = app_config->get_web_resource_upgrade_url(); Http::get(preset_update_url) .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { @@ -800,8 +800,7 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) AppConfig *app_config = GUI::wxGetApp().app_config; - // auto profile_update_url = app_config->profile_update_url() + "/" + Snapmaker_VERSION; - auto profile_update_url = app_config->profile_update_url(); + auto profile_update_url = app_config->get_preset_upgrade_url(); // parse the assets section and get the latest asset by comparing the name Http::get(profile_update_url) From 9fd09cc9737957fc77600cb6026b9e2bed541b6d Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 5 Jan 2026 18:20:54 +0800 Subject: [PATCH 19/51] feature add parameter for get language on the update describe --- src/libslic3r/AppConfig.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 3195d32579..c41d10e09c 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -1440,20 +1440,22 @@ std::string AppConfig::config_path() std::string AppConfig::get_preset_upgrade_url() { - std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL; + std::string localLanguage = get("language"); + std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL + std::string("/?language=") + localLanguage; auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL; + url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL + std::string("/?language=") + localLanguage; return url; } std::string AppConfig::get_web_resource_upgrade_url() { - std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL; + std::string localLanguage = get("language"); + std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL + std::string("/?language=") + localLanguage; auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL; + url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL + std::string("/?language=") + localLanguage; return url; } @@ -1461,10 +1463,11 @@ std::string AppConfig::get_web_resource_upgrade_url() std::string AppConfig::get_version_upgrade_url(bool stable_only /* = false*/) { //get local area and get the resource from diff server - std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL; + std::string localLanguage = get("language"); + std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL + std::string("/?language=") + localLanguage; auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + APP_UPDATE_URL; + url = APP_UPDATE_URL_BASE_CN + APP_UPDATE_URL + std::string("/?language=") + localLanguage; return url; } From 2af9e4838897f903379743a70ba4bf1ec94c24e0 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 6 Jan 2026 11:11:27 +0800 Subject: [PATCH 20/51] feature code format. --- src/slic3r/GUI/GUI_App.cpp | 7 +++-- src/slic3r/Utils/PresetUpdater.cpp | 41 +++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 2032eca133..7858e0b50d 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4785,14 +4785,17 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) auto errCode = jsonData["code"]; if (errCode != 200) return; - // auto isFullUpgrade = jsonData["is_full_upgrade"]; + auto isFullUpgrade = jsonData["data"]["is_full_upgrade"]; auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto versionType = jsonData["data"]["stable"]; + auto softPlatform = jsonData["data"]["platform_type"]; version_info.version_str = jsonData["data"]["version"]; auto fileSize = jsonData["data"]["full"]["file_size"]; auto fileMd5 = jsonData["data"]["full"]["file_md5"]; auto fileSha256 = jsonData["data"]["full"]["file_sha256"]; - version_info.url = jsonData["data"]["full"]["file_url"]; + //windows x86_x64, mac arm/x86_x64 universal + version_info.url = jsonData["data"]["full"]["file_url"]; version_info.description = jsonData["data"]["full"]["file_describe"]; version_info.force_upgrade = isForceUpgrade; diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 8b15071d6d..416787e4ec 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -736,21 +736,25 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) if (http_status != 200) return; try { - json jsonData = json::parse(body); - auto errCode = jsonData["code"]; + json jsonObj = json::parse(body); + auto errCode = jsonObj["code"]; if (errCode != 200) return; - auto buildNumber = jsonData["data"]["build_number"]; - auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; - auto minSupportPcVersion = jsonData["data"]["min_support_pc_version"]; - auto maxSupportPcVersion = jsonData["data"]["max_support_pc_version"]; - auto fileVersion = jsonData["data"]["file_version"]; - auto fileSize = jsonData["data"]["file_size"]; - auto fileMd5 = jsonData["data"]["file_md5"]; - auto fileSha256 = jsonData["data"]["file_sha256"]; - auto fileUrl = jsonData["data"]["file_url"]; - auto description = jsonData["data"]["file_describe"]; + auto dataObj = jsonObj.value("data", json::object()); + auto buildNumer = dataObj.value("build_number", ""); + auto minSupportPcVersion = dataObj.value("min_support_pc_version", ""); + auto maxSupportPcVersion = dataObj.value("max_support_pc_version", ""); + + auto isForceUpgrade = dataObj.value("is_force_upgrade", false); + auto fileVersion = dataObj.value("file_version", ""); + auto fileSize = dataObj.value("file_size", 0); + auto fileMd5 = dataObj.value("file_md5", ""); + auto fileSha256 = dataObj.value("file_sha256", ""); + auto fileUrl = dataObj.value("file_url", ""); + auto description = dataObj.value("file_describe", ""); + auto reserveData = dataObj.value("reserve_1", ""); + auto reserveData2 = dataObj.value("reserve_2", ""); auto localProfilesjson = cache_path / "flutter_web/version.json"; std::string json_path = data_dir() + "/web/flutter_web/version.json"; @@ -758,6 +762,17 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) Semver currentPresetVersion = get_version_from_json(json_path); Semver remoteVersion(fileVersion); + if (fileVersion.empty()) + { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); + } + return; + } + std::string localOtaPresetVersion = ""; if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); @@ -833,6 +848,8 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) auto fileSha256 = jsonData["data"]["file_sha256"]; auto fileUrl = jsonData["data"]["file_url"]; auto description = jsonData["data"]["file_describe"]; + auto reserverData = jsonData["data"]["reserver_1"]; + auto reserverData2 = jsonData["data"]["reserver_2"]; auto localProfilesjson = cache_path / "profiles/Snapmaker.json"; std::string json_path = data_dir() + "/system/Snapmaker.json"; From 6d3673be848cce4c25be8d25e48b6408f8350df1 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 6 Jan 2026 14:35:27 +0800 Subject: [PATCH 21/51] feature update json data for safe read server res. --- src/slic3r/GUI/GUI_App.cpp | 39 ++++++++++++++++++--------- src/slic3r/Utils/PresetUpdater.cpp | 43 +++++++++++++++++++----------- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7858e0b50d..f85f9f5f21 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4781,22 +4781,35 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) return; } try { - json jsonData = json::parse(body); - auto errCode = jsonData["code"]; + json jsonObj = json::parse(body); + auto errCode = jsonObj["code"]; if (errCode != 200) return; - auto isFullUpgrade = jsonData["data"]["is_full_upgrade"]; - auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; - auto versionType = jsonData["data"]["stable"]; - auto softPlatform = jsonData["data"]["platform_type"]; - version_info.version_str = jsonData["data"]["version"]; - auto fileSize = jsonData["data"]["full"]["file_size"]; - auto fileMd5 = jsonData["data"]["full"]["file_md5"]; - auto fileSha256 = jsonData["data"]["full"]["file_sha256"]; - //windows x86_x64, mac arm/x86_x64 universal - version_info.url = jsonData["data"]["full"]["file_url"]; - version_info.description = jsonData["data"]["full"]["file_describe"]; + auto dataObj = jsonObj.value("data", json::object()); + + auto isFullUpgrade = dataObj.value("is_full_upgrade", true); + auto isForceUpgrade = dataObj.value("is_force_upgrade", false); + + version_info.version_str = dataObj.value("version", ""); + auto releaseType = dataObj.value("release_type", ""); + auto platformType = dataObj.value("platform_type", ""); + int fileSize = 0; + std::string fileMd5 = ""; + std::string fileSha256 = ""; + std::string reservedData = ""; + std::string reservedData2 = ""; + + auto fullObj = dataObj.value("full", json::object()); + fileSize = fullObj.value("file_size", 0); + fileMd5 = fullObj.value("file_md5", ""); + fileSha256 = fullObj.value("file_sha256", ""); + // windows x86_x64, mac arm/x86_x64 universal + version_info.url = fullObj.value("file_url", ""); + version_info.description = fullObj.value("file_describe", ""); + reservedData = fullObj.value("reserved_1", ""); + reservedData2 = fullObj.value("reserved_2", ""); + version_info.force_upgrade = isForceUpgrade; std::regex matcher("[0-9]+\\.[0-9]+(\\.[0-9]+)*(-[A-Za-z0-9]+)?(\\+[A-Za-z0-9]+)?"); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 416787e4ec..3906ccbf74 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -727,7 +727,6 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) wxString errorMsg = wxString::Format(_L("request to server update web resource fail with body:%s,error:%s,status:%d"), body, error, http_status); evt->SetString(errorMsg); GUI::wxGetApp().QueueEvent(evt); - GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_update_flutter_resource", http_status, error); }) .timeout_connect(TIMEOUT_CONNECT) @@ -753,8 +752,8 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) auto fileSha256 = dataObj.value("file_sha256", ""); auto fileUrl = dataObj.value("file_url", ""); auto description = dataObj.value("file_describe", ""); - auto reserveData = dataObj.value("reserve_1", ""); - auto reserveData2 = dataObj.value("reserve_2", ""); + auto reservedData = dataObj.value("reserved_1", ""); + auto reservedData2 = dataObj.value("reserved_2", ""); auto localProfilesjson = cache_path / "flutter_web/version.json"; std::string json_path = data_dir() + "/web/flutter_web/version.json"; @@ -834,22 +833,24 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) if (http_status != 200) return; try { - json jsonData = json::parse(body); - auto errCode = jsonData["code"]; + json jsonObj = json::parse(body); + auto errCode = jsonObj["code"]; if (errCode != 200) return; - auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; - auto minSupportPcVersion = jsonData["data"]["min_support_pc_version"]; - auto maxSupportPcVersion = jsonData["data"]["max_support_pc_version"]; - auto fileVersion = jsonData["data"]["file_version"]; - auto fileSize = jsonData["data"]["file_size"]; - auto fileMd5 = jsonData["data"]["file_md5"]; - auto fileSha256 = jsonData["data"]["file_sha256"]; - auto fileUrl = jsonData["data"]["file_url"]; - auto description = jsonData["data"]["file_describe"]; - auto reserverData = jsonData["data"]["reserver_1"]; - auto reserverData2 = jsonData["data"]["reserver_2"]; + auto dataObj = jsonObj.value("data", json::object()); + + auto isForceUpgrade = dataObj.value("is_force_upgrade", false); + auto minSupportPcVersion = dataObj.value("min_support_pc_version", ""); + auto maxSupportPcVersion = dataObj.value("max_support_pc_version", ""); + auto fileVersion = dataObj.value("file_version", ""); + auto fileSize = dataObj.value("file_size", 0); + auto fileMd5 = dataObj.value("file_md5", ""); + auto fileSha256 = dataObj.value("file_sha256", ""); + auto fileUrl = dataObj.value("file_url", ""); + auto description = dataObj.value("file_describe", ""); + auto reservedData = dataObj.value("reserved_1", ""); + auto reservedData2 = dataObj.value("reserved_2", ""); auto localProfilesjson = cache_path / "profiles/Snapmaker.json"; std::string json_path = data_dir() + "/system/Snapmaker.json"; @@ -857,6 +858,16 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) Semver currentPresetVersion = get_version_from_json(json_path); Semver remoteVersion(fileVersion); + if (fileVersion.empty()) { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); + } + return; + } + std::string localOtaPresetVersion = ""; if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); From 378f76bd4dd9656f3bf3284b345f318c9ee66226 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 29 Dec 2025 14:34:15 +0800 Subject: [PATCH 22/51] fix code format. --- src/slic3r/GUI/GUI_App.cpp | 42 ++---------------------------------- src/slic3r/GUI/GUI_App.hpp | 2 +- src/slic3r/GUI/MainFrame.cpp | 5 ++++- 3 files changed, 7 insertions(+), 42 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 905d9eaf6b..383385878b 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -909,44 +909,6 @@ void GUI_App::post_init() } //#endif - //BBS: remove GCodeViewer as seperate APP logic - /*if (this->init_params->start_as_gcodeviewer) { - if (! this->init_params->input_files.empty()) - this->plater()->load_gcode(wxString::FromUTF8(this->init_params->input_files[0].c_str())); - } - else - { - if (! this->init_params->preset_substitutions.empty()) - show_substitutions_info(this->init_params->preset_substitutions); - -#if 0 - // Load the cummulative config over the currently active profiles. - //FIXME if multiple configs are loaded, only the last one will have an effect. - // We need to decide what to do about loading of separate presets (just print preset, just filament preset etc). - // As of now only the full configs are supported here. - if (!m_print_config.empty()) - this->gui->mainframe->load_config(m_print_config); -#endif - if (! this->init_params->load_configs.empty()) - // Load the last config to give it a name at the UI. The name of the preset may be later - // changed by loading an AMF or 3MF. - //FIXME this is not strictly correct, as one may pass a print/filament/printer profile here instead of a full config. - this->mainframe->load_config_file(this->init_params->load_configs.back()); - // If loading a 3MF file, the config is loaded from the last one. - if (!this->init_params->input_files.empty()) { - const std::vector res = this->plater()->load_files(this->init_params->input_files); - if (!res.empty() && this->init_params->input_files.size() == 1) { - // Update application titlebar when opening a project file - const std::string& filename = this->init_params->input_files.front(); - //BBS: remove amf logic as project - if (boost::algorithm::iends_with(filename, ".3mf")) - this->plater()->set_project_filename(filename); - } - } - if (! this->init_params->extra_config.empty()) - this->mainframe->load_config(this->init_params->extra_config); - }*/ - // BBS: to be checked #if 1 // show "Did you know" notification @@ -5024,7 +4986,7 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que } // namespace -void GUI_App::check_new_version_sf(bool show_tips, int by_user) +void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { AppConfig* app_config = wxGetApp().app_config; bool check_stable_only = app_config->get_bool("check_stable_update_only"); @@ -5112,7 +5074,7 @@ void GUI_App::check_new_version_sf(bool show_tips, int by_user) } // if we're the most recent, don't do anything if ((check_stable_only ? best_release : best_pre) <= current_version) { - if (by_user != 0) + if (by_user) this->no_new_version(); return; } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index da12caa315..c3388969d5 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -587,7 +587,7 @@ private: void check_update(bool show_tips, int by_user); void check_new_version(bool show_tips = false, int by_user = 0); - void check_new_version_sf(bool show_tips = false, int by_user = 0); + void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); void request_new_version(int by_user); void enter_force_upgrade(); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index c7be6c24d0..98270c4f84 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -77,6 +77,9 @@ #include "sentry_wrapper/SentryWrapper.hpp" +#define UPDATE_BUSER true +#define UPDATE_BUAUTO false + namespace Slic3r { namespace GUI { @@ -2294,7 +2297,7 @@ static wxMenu* generate_help_menu() // Check New Version append_menu_item(helpMenu, wxID_ANY, _L("Check for Update"), _L("Check for Update"), [](wxCommandEvent&) { - wxGetApp().check_new_version_sf(true, 1); + wxGetApp().check_new_version_sf(true, UPDATE_BUSER); }, "", nullptr, []() { return true; }); From cc66ab7ec419a59192c8d604658b73d0bf529d42 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 29 Dec 2025 15:54:48 +0800 Subject: [PATCH 23/51] feature remove not work code --- src/slic3r/GUI/GUI_App.cpp | 58 +++----------------------------------- 1 file changed, 4 insertions(+), 54 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 383385878b..7a73047d7a 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2534,17 +2534,7 @@ bool GUI_App::on_init_inner() preset_updater = new PresetUpdater(); Bind(EVT_SLIC3R_VERSION_ONLINE, [this](const wxCommandEvent& evt) { if (this->plater_ != nullptr) { - // this->plater_->get_notification_manager()->push_notification(NotificationType::NewAppAvailable); - //BBS show msg box to download new version - /* wxString tips = wxString::Format(_L("Click to download new version in default browser: %s"), version_info.version_str); - DownloadDialog dialog(this->mainframe, - tips, - _L("New version of Snapmaker Orca"), - false, - wxCENTER | wxICON_INFORMATION); - - dialog.SetExtendedMessage(extmsg);*/ std::string skip_version_str = this->app_config->get("app", "skip_version"); bool skip_this_version = false; if (!skip_version_str.empty()) { @@ -2732,26 +2722,6 @@ bool GUI_App::on_init_inner() mainframe->Show(true); BOOST_LOG_TRIVIAL(info) << "main frame firstly shown"; -//#if BBL_HAS_FIRST_PAGE - //BBS: set tp3DEditor firstly - /*plater_->canvas3D()->enable_render(false); - mainframe->select_tab(size_t(MainFrame::tp3DEditor)); - scrn->SetText(_L("Loading Opengl resourses...")); - plater_->select_view_3D("3D"); - //BBS init the opengl resource here - Size canvas_size = plater_->canvas3D()->get_canvas_size(); - wxGetApp().imgui()->set_display_size(static_cast(canvas_size.get_width()), static_cast(canvas_size.get_height())); - wxGetApp().init_opengl(); - plater_->canvas3D()->init(); - wxGetApp().imgui()->new_frame(); - plater_->canvas3D()->enable_render(true); - plater_->canvas3D()->render(); - if (is_editor()) - mainframe->select_tab(size_t(0));*/ -//#else - //plater_->trigger_restore_project(1); -//#endif - obj_list()->set_min_height(); update_mode(); // update view mode after fix of the object_list size @@ -2827,28 +2797,6 @@ bool GUI_App::on_init_inner() "configuration file.\nPlease note, application settings will be lost, but printer profiles will not be affected.")); } - - //启动定时器,轮询进行机器发现 - // m_machine_find_timer = new wxTimer(this, m_machine_find_id); - - // Bind(wxEVT_TIMER, [this](wxTimerEvent& event) { - // if (!m_machine_find_engine && GUI_App::m_app_alive.load()) { - // machine_find(); - // } - // }, m_machine_find_timer->GetId()); - - // if (!m_machine_find_engine && GUI_App::m_app_alive.load()) { - // machine_find(); - // } - -//#ifdef __APPLE__ -// m_machine_find_timer->Start(1000 * 60 * 2); -//#elif defined(__linux__) -// m_machine_find_timer->Start(1000 * 60 * 2); -//#else -// m_machine_find_timer->Start(5000); -//#endif - return true; } @@ -4999,9 +4947,11 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) }) .timeout_connect(1) .on_complete([this,by_user, check_stable_only](std::string body, unsigned http_status) { - // Http response OK - if (http_status != 200) + // Http response OK + if (http_status != 200) { + BOOST_LOG_TRIVIAL(error) << format("status not 200 with: `%1%`: HTTP %2%", "check_new_version_sf", http_status); return; + } try { boost::trim(body); // Orca: parse github release, inspired by SS From 5bc0dffec3d2780792b34186849195b5e418d18b Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 29 Dec 2025 18:38:19 +0800 Subject: [PATCH 24/51] feature add soft force update. --- src/slic3r/GUI/GUI_App.cpp | 122 +++++++++++++------------------------ 1 file changed, 43 insertions(+), 79 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7a73047d7a..53af067f05 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2586,6 +2586,7 @@ bool GUI_App::on_init_inner() { case wxID_YES: wxLaunchDefaultBrowser(download_url); + wxGetApp().mainframe->Close(true); break; case wxID_NO: wxGetApp().mainframe->Close(true); @@ -4936,106 +4937,69 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { + std::string update_url = ""; + +#ifdef __WINDOWS__ + update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/win/manifest.json"; +#endif +#ifdef __APPLE__ + update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/mac/manifest.json"; +#endif +#ifdef __LINUX__ + update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/linux/manifest.json"; +#endif + AppConfig* app_config = wxGetApp().app_config; - bool check_stable_only = app_config->get_bool("check_stable_update_only"); - auto version_check_url = app_config->version_check_url(check_stable_only); - Http::get(version_check_url) + + Http::get(update_url) .on_error([&](std::string body, std::string error, unsigned http_status) { (void)body; BOOST_LOG_TRIVIAL(error) << format("Error getting: `%1%`: HTTP %2%, %3%", "check_new_version_sf", http_status, error); }) .timeout_connect(1) - .on_complete([this,by_user, check_stable_only](std::string body, unsigned http_status) { + .on_complete([this,by_user](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) { BOOST_LOG_TRIVIAL(error) << format("status not 200 with: `%1%`: HTTP %2%", "check_new_version_sf", http_status); return; } - try { - boost::trim(body); - // Orca: parse github release, inspired by SS - boost::property_tree::ptree root; - std::stringstream json_stream(body); - boost::property_tree::read_json(json_stream, root); + try { + json jsonData = json::parse(body); + // auto isFullUpgrade = jsonData["is_full_upgrade"]; + auto isForceUpgrade = jsonData["data"]["is_full_upgrade"]; + version_info.version_str = jsonData["data"]["version"]; + + auto fileSize = jsonData["data"]["full"]["file_size"]; + auto fileMd5 = jsonData["data"]["full"]["file_md5"]; + auto fileSha256 = jsonData["data"]["full"]["file_sha256"]; + version_info.url = jsonData["data"]["full"]["file_url"]; + version_info.description = jsonData["data"]["full"]["file_describe"]; + version_info.force_upgrade = isForceUpgrade; - // at least two number, use '.' as separator. can be followed by -Az23 for prereleased and +Az42 for - // metadata std::regex matcher("[0-9]+\\.[0-9]+(\\.[0-9]+)*(-[A-Za-z0-9]+)?(\\+[A-Za-z0-9]+)?"); + Semver current_version = get_version(Snapmaker_VERSION, matcher); - Semver current_version = get_version(Snapmaker_VERSION, matcher); - Semver best_pre(0, 0, 0); - Semver best_release(0, 0, 0); - std::string best_pre_url; - std::string best_release_url; - std::string best_release_content; - std::string best_pre_content; - const std::regex reg_num("([0-9]+)"); - if (check_stable_only) { - std::string tag = root.get("tag_name"); - if (tag[0] == 'v') - tag.erase(0, 1); - for (std::regex_iterator it = std::sregex_iterator(tag.begin(), tag.end(), reg_num); it != std::sregex_iterator(); ++it) {} - Semver tag_version = get_version(tag, matcher); - if (root.get("prerelease")) { - if (best_pre < tag_version) { - best_pre = tag_version; - best_pre_url = root.get("html_url"); - best_pre_content = root.get("body"); - best_pre.set_prerelease("Preview"); - } - } else { - if (best_release < tag_version) { - best_release = tag_version; - best_release_url = root.get("html_url"); - best_release_content = root.get("body"); - } - } - } else { - for (auto json_version : root) { - std::string tag = json_version.second.get("tag_name"); - if (tag[0] == 'v') - tag.erase(0, 1); - for (std::regex_iterator it = std::sregex_iterator(tag.begin(), tag.end(), reg_num); it != std::sregex_iterator(); - ++it) {} - Semver tag_version = get_version(tag, matcher); - if (json_version.second.get("prerelease")) { - if (best_pre < tag_version) { - best_pre = tag_version; - best_pre_url = json_version.second.get("html_url"); - best_pre_content = json_version.second.get("body"); - best_pre.set_prerelease("Preview"); - } - } else { - if (best_release < tag_version) { - best_release = tag_version; - best_release_url = json_version.second.get("html_url"); - best_release_content = json_version.second.get("body"); - } - } - } - } + Semver server_version = get_version(version_info.version_str, matcher); - // if release is more recent than beta, use release anyway - if (best_pre < best_release) { - best_pre = best_release; - best_pre_url = best_release_url; - best_pre_content = best_release_content; - } - // if we're the most recent, don't do anything - if ((check_stable_only ? best_release : best_pre) <= current_version) { - if (by_user) - this->no_new_version(); + if (current_version >= server_version) { + this->no_new_version(); return; } - version_info.url = check_stable_only ? best_release_url : best_pre_url; - version_info.version_str = check_stable_only ? best_release.to_string_sf() : best_pre.to_string_sf(); - version_info.description = check_stable_only ? best_release_content : best_pre_content; - version_info.force_upgrade = false; + if (isForceUpgrade) + { + wxGetApp().app_config->set_bool("force_upgrade", version_info.force_upgrade); + wxGetApp().app_config->set("upgrade", "force_upgrade", true); + wxGetApp().app_config->set("upgrade", "description", version_info.description); + wxGetApp().app_config->set("upgrade", "version", version_info.version_str); + wxGetApp().app_config->set("upgrade", "url", version_info.url); + GUI::wxGetApp().enter_force_upgrade(); + return; + } wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); - evt->SetString((check_stable_only ? best_release : best_pre).to_string()); + evt->SetString(version_info.url); GUI::wxGetApp().QueueEvent(evt); } catch (...) {} }) From 60acdf143d63b167a6138556a0abf6a3be6ccc4c Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 11:01:36 +0800 Subject: [PATCH 25/51] feature remove not work code for code format --- src/slic3r/GUI/GUI_App.cpp | 99 -------------------------------- src/slic3r/GUI/GUI_App.hpp | 3 - src/slic3r/GUI/UpdateDialogs.cpp | 2 - src/slic3r/GUI/UpdateDialogs.hpp | 4 -- 4 files changed, 108 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 53af067f05..f6d1615c6b 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -965,7 +965,6 @@ void GUI_App::post_init() this->check_new_version_sf(); if (is_user_login() && !app_config->get_stealth_mode()) { - // this->check_privacy_version(0); request_user_handle(0); } }); @@ -4568,95 +4567,6 @@ void GUI_App::reset_to_active() last_active_point = std::chrono::system_clock::now(); } -void GUI_App::check_update(bool show_tips, int by_user) -{ - if (version_info.version_str.empty()) return; - if (version_info.url.empty()) return; - - auto curr_version = Semver::parse(SLIC3R_VERSION); - auto remote_version = Semver::parse(version_info.version_str); - if (curr_version && remote_version && (*remote_version > *curr_version)) { - if (version_info.force_upgrade) { - wxGetApp().app_config->set_bool("force_upgrade", version_info.force_upgrade); - wxGetApp().app_config->set("upgrade", "force_upgrade", true); - wxGetApp().app_config->set("upgrade", "description", version_info.description); - wxGetApp().app_config->set("upgrade", "version", version_info.version_str); - wxGetApp().app_config->set("upgrade", "url", version_info.url); - GUI::wxGetApp().enter_force_upgrade(); - } - else { - GUI::wxGetApp().request_new_version(by_user); - } - } else { - wxGetApp().app_config->set("upgrade", "force_upgrade", false); - if (show_tips) - this->no_new_version(); - } -} - -void GUI_App::check_new_version(bool show_tips, int by_user) -{ - return; // orca: not used, see check_new_version_sf - std::string platform = "windows"; - -#ifdef __WINDOWS__ - platform = "windows"; -#endif -#ifdef __APPLE__ - platform = "macos"; -#endif -#ifdef __LINUX__ - platform = "linux"; -#endif - std::string query_params = (boost::format("?name=slicer&version=%1%&guide_version=%2%") - % VersionInfo::convert_full_version(SLIC3R_VERSION) - % VersionInfo::convert_full_version("0.0.0.1") - ).str(); - - std::string url = get_http_url(app_config->get_country_code()) + query_params; - Slic3r::Http http = Slic3r::Http::get(url); - - http.header("accept", "application/json") - .timeout_connect(TIMEOUT_CONNECT) - .timeout_max(TIMEOUT_RESPONSE) - .on_complete([this, show_tips, by_user](std::string body, unsigned) { - try { - json j = json::parse(body); - if (j.contains("message")) { - if (j["message"].get() == "success") { - if (j.contains("software")) { - if (j["software"].empty() && show_tips) { - this->no_new_version(); - } - else { - if (j["software"].contains("url") - && j["software"].contains("version") - && j["software"].contains("description")) { - version_info.url = j["software"]["url"].get(); - version_info.version_str = j["software"]["version"].get(); - version_info.description = j["software"]["description"].get(); - } - if (j["software"].contains("force_update")) { - version_info.force_upgrade = j["software"]["force_update"].get(); - } - CallAfter([this, show_tips, by_user](){ - this->check_update(show_tips, by_user); - }); - } - } - } - } - } - catch (...) { - ; - } - }) - .on_error([this](std::string body, std::string error, unsigned int status) { - handle_http_error(status, body); - BOOST_LOG_TRIVIAL(error) << "check new version error" << body; - }).perform(); -} - //parse the string, if it doesn't contain a valid version string, return invalid version. Semver get_version(const std::string& str, const std::regex& regexp) { std::smatch match; @@ -5012,15 +4922,6 @@ void GUI_App::process_network_msg(std::string dev_id, std::string msg) } } -//BBS pop up a dialog and download files -void GUI_App::request_new_version(int by_user) -{ - wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); - evt->SetString(GUI::from_u8(version_info.version_str)); - evt->SetInt(by_user); - GUI::wxGetApp().QueueEvent(evt); -} - void GUI_App::enter_force_upgrade() { wxCommandEvent *evt = new wxCommandEvent(EVT_ENTER_FORCE_UPGRADE); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index c3388969d5..b3623ccaf9 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -585,11 +585,8 @@ private: bool m_studio_active = true; std::chrono::system_clock::time_point last_active_point; - void check_update(bool show_tips, int by_user); - void check_new_version(bool show_tips = false, int by_user = 0); void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); - void request_new_version(int by_user); void enter_force_upgrade(); void set_skip_version(bool skip = true); void no_new_version(); diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index 8069fa5da2..780329523d 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -92,8 +92,6 @@ bool MsgUpdateSlic3r::disable_version_check() const return true; } -// MsgUpdateConfig - MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_before_wizard /* = false*/) : DPIDialog(wxGetApp().mainframe, wxID_ANY, _L("Configuration update"), wxDefaultPosition, wxDefaultSize, wxCAPTION) { diff --git a/src/slic3r/GUI/UpdateDialogs.hpp b/src/slic3r/GUI/UpdateDialogs.hpp index 04eb4ffb3c..153d8d409f 100644 --- a/src/slic3r/GUI/UpdateDialogs.hpp +++ b/src/slic3r/GUI/UpdateDialogs.hpp @@ -61,10 +61,6 @@ public: // force_before_wizard - indicates that check of updated is forced before ConfigWizard opening MsgUpdateConfig(const std::vector &updates, bool force_before_wizard = false); void on_dpi_changed(const wxRect &suggested_rect); - // MsgUpdateConfig(MsgUpdateConfig &&) = delete; - //MsgUpdateConfig(const MsgUpdateConfig &) = delete; - //MsgUpdateConfig &operator=(MsgUpdateConfig &&) = delete; - //MsgUpdateConfig &operator=(const MsgUpdateConfig &) = delete; ~MsgUpdateConfig(); }; From 2507522b2bac43f71a6b13076fc6b447ecb5318b Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 12:10:27 +0800 Subject: [PATCH 26/51] feature remove not work code. --- src/slic3r/GUI/GUI_App.cpp | 201 +---------------------------------- src/slic3r/GUI/GUI_App.hpp | 14 +-- src/slic3r/GUI/MainFrame.cpp | 5 - src/slic3r/GUI/MainFrame.hpp | 5 - 4 files changed, 5 insertions(+), 220 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index f6d1615c6b..b8e5ea9059 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -964,15 +964,10 @@ void GUI_App::post_init() this->preset_updater->sync(http_url, language, network_ver, sys_preset ? preset_bundle : nullptr); this->check_new_version_sf(); - if (is_user_login() && !app_config->get_stealth_mode()) { - request_user_handle(0); - } + }); } - if (is_user_login()) - request_user_handle(0); - if(!m_networking_need_update && m_agent) { m_agent->set_on_ssdp_msg_fn( [this](std::string json_str) { @@ -1612,37 +1607,11 @@ void GUI_App::init_networking_callbacks() { BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": enter, m_agent=%1%")%m_agent; if (m_agent) { - //set callbacks - //m_agent->set_on_user_login_fn([this](int online_login, bool login) { - // GUI::wxGetApp().request_user_handle(online_login); - // }); m_agent->set_server_callback([](std::string url, int status) { BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(": server_callback, url=%1%, status=%2%") % url % status; - //CallAfter([this]() { - // if (!m_server_error_dialog) { - // /*m_server_error_dialog->EndModal(wxCLOSE); - // m_server_error_dialog->Destroy(); - // m_server_error_dialog = nullptr;*/ - // m_server_error_dialog = new NetworkErrorDialog(mainframe); - // } - // - // if(plater()->get_select_machine_dialog() && plater()->get_select_machine_dialog()->IsShown()){ - // return; - // } - // - // if (m_server_error_dialog->m_show_again) { - // return; - // } - // - // if (m_server_error_dialog->IsShown()) { - // return; - // } - // - // m_server_error_dialog->ShowModal(); - //}); - }); + }); m_agent->set_on_server_connected_fn([this](int return_code, int reason_code) { if (m_is_closing) { @@ -2622,13 +2591,6 @@ bool GUI_App::on_init_inner() preset_bundle->backup_user_folder(); - Bind(EVT_SET_SELECTED_MACHINE, &GUI_App::on_set_selected_machine, this); - Bind(EVT_UPDATE_MACHINE_LIST, &GUI_App::on_update_machine_list, this); - Bind(EVT_USER_LOGIN, &GUI_App::on_user_login, this); - Bind(EVT_USER_LOGIN_HANDLE, &GUI_App::on_user_login_handle, this); - Bind(EVT_CHECK_PRIVACY_VER, &GUI_App::on_check_privacy_update, this); - Bind(EVT_CHECK_PRIVACY_SHOW, &GUI_App::show_check_privacy_dlg, this); - Bind(EVT_SHOW_IP_DIALOG, &GUI_App::show_ip_address_enter_dialog_handler, this); @@ -4092,20 +4054,6 @@ bool GUI_App::check_login() return result; } -void GUI_App::request_user_handle(int online_login) -{ - auto evt = new wxCommandEvent(EVT_USER_LOGIN_HANDLE); - evt->SetInt(online_login); - wxQueueEvent(this, evt); -} - -void GUI_App::request_user_login(int online_login) -{ - auto evt = new wxCommandEvent(EVT_USER_LOGIN); - evt->SetInt(online_login); - wxQueueEvent(this, evt); -} - void GUI_App::request_user_logout() { if (m_agent && m_agent->is_user_login()) { @@ -4486,54 +4434,6 @@ void GUI_App::enable_user_preset_folder(bool enable) } } -void GUI_App::on_set_selected_machine(wxCommandEvent &evt) -{ - // Orca: do not connect to default device during app startup, because some of the lan machines might not online yet - // and user will be prompted by several "Connect XXX failed" error message. - return; - - DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (dev) { - dev->set_selected_machine(m_agent->get_user_selected_machine()); - } -} - -void GUI_App::on_update_machine_list(wxCommandEvent &evt) -{ - /* DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (dev) { - dev->add_user_subscribe(); - }*/ -} - -void GUI_App::on_user_login_handle(wxCommandEvent &evt) -{ - if (!m_agent) { return; } - - int online_login = evt.GetInt(); - m_agent->connect_server(); - - // get machine list - DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) return; - - boost::thread update_thread = boost::thread([this, dev] { - dev->update_user_machine_list_info(); - auto evt = new wxCommandEvent(EVT_SET_SELECTED_MACHINE); - wxQueueEvent(this, evt); - }); - - if (online_login) { - remove_user_presets(); - enable_user_preset_folder(true); - preset_bundle->load_user_presets(m_agent->get_user_id(), ForwardCompatibilitySubstitutionRule::Enable); - mainframe->update_side_preset_ui(); - - GUI::wxGetApp().mainframe->show_sync_dialog(); - } -} - - void GUI_App::check_track_enable() { // Orca: alaways disable track event @@ -4543,14 +4443,6 @@ void GUI_App::check_track_enable() } } -void GUI_App::on_user_login(wxCommandEvent &evt) -{ - if (!m_agent) { return; } - int online_login = evt.GetInt(); - // check privacy before handle - check_privacy_version(online_login); - check_track_enable(); -} bool GUI_App::is_studio_active() { @@ -4877,7 +4769,7 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) try { json jsonData = json::parse(body); // auto isFullUpgrade = jsonData["is_full_upgrade"]; - auto isForceUpgrade = jsonData["data"]["is_full_upgrade"]; + auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; version_info.version_str = jsonData["data"]["version"]; auto fileSize = jsonData["data"]["full"]["file_size"]; @@ -4938,33 +4830,6 @@ void GUI_App::set_skip_version(bool skip) } } -void GUI_App::show_check_privacy_dlg(wxCommandEvent& evt) -{ - int online_login = evt.GetInt(); - PrivacyUpdateDialog privacy_dlg(this->mainframe, wxID_ANY, _L("Privacy Policy Update")); - privacy_dlg.Bind(EVT_PRIVACY_UPDATE_CONFIRM, [this, online_login](wxCommandEvent &e) { - app_config->set("privacy_version", privacy_version_info.version_str); - app_config->set_bool("privacy_update_checked", true); - request_user_handle(online_login); - }); - privacy_dlg.Bind(EVT_PRIVACY_UPDATE_CANCEL, [this](wxCommandEvent &e) { - app_config->set_bool("privacy_update_checked", false); - if (m_agent) { - m_agent->user_logout(); - } - }); - - privacy_dlg.set_text(privacy_version_info.description); - privacy_dlg.on_show(); -} - -void GUI_App::on_show_check_privacy_dlg(int online_login) -{ - auto evt = new wxCommandEvent(EVT_CHECK_PRIVACY_SHOW); - evt->SetInt(online_login); - wxQueueEvent(this, evt); -} - bool GUI_App::check_privacy_update() { if (privacy_version_info.version_str.empty() || privacy_version_info.description.empty() @@ -4983,66 +4848,6 @@ bool GUI_App::check_privacy_update() return false; } -void GUI_App::on_check_privacy_update(wxCommandEvent& evt) -{ - int online_login = evt.GetInt(); - bool result = check_privacy_update(); - if (result) - on_show_check_privacy_dlg(online_login); - else - request_user_handle(online_login); -} - -void GUI_App::check_privacy_version(int online_login) -{ - update_http_extra_header(); - std::string query_params = "?policy/privacy=00.00.00.00"; - std::string url = get_http_url(app_config->get_country_code()) + query_params; - Slic3r::Http http = Slic3r::Http::get(url); - - http.header("accept", "application/json") - .timeout_connect(TIMEOUT_CONNECT) - .timeout_max(TIMEOUT_RESPONSE) - .on_complete([this, online_login](std::string body, unsigned) { - try { - json j = json::parse(body); - if (j.contains("message")) { - if (j["message"].get() == "success") { - if (j.contains("resources")) { - for (auto it = j["resources"].begin(); it != j["resources"].end(); it++) { - if (it->contains("type")) { - if ((*it)["type"] == std::string("policy/privacy") - && it->contains("version") - && it->contains("description") - && it->contains("url") - && it->contains("force_update")) { - privacy_version_info.version_str = (*it)["version"].get(); - privacy_version_info.description = (*it)["description"].get(); - privacy_version_info.url = (*it)["url"].get(); - privacy_version_info.force_upgrade = (*it)["force_update"].get(); - break; - } - } - } - CallAfter([this, online_login]() { - auto evt = new wxCommandEvent(EVT_CHECK_PRIVACY_VER); - evt->SetInt(online_login); - wxQueueEvent(this, evt); - }); - } - } - } - } - catch (...) { - request_user_handle(online_login); - } - }) - .on_error([this, online_login](std::string body, std::string error, unsigned int status) { - request_user_handle(online_login); - BOOST_LOG_TRIVIAL(error) << "check privacy version error" << body; - }).perform(); -} - void GUI_App::no_new_version() { wxCommandEvent* evt = new wxCommandEvent(EVT_SHOW_NO_NEW_VERSION); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index b3623ccaf9..ebc867febb 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -557,9 +557,7 @@ private: void sm_request_login(bool show_user_info = false); void sm_ShowUserLogin(bool show = true); void sm_request_user_logout(); - - void request_user_login(int online_login = 0); - void request_user_handle(int online_login = 0); + void request_user_logout(); int request_user_unbind(std::string dev_id); std::string handle_web_request(std::string cmd); @@ -573,10 +571,6 @@ private: void handle_http_error(unsigned int status, std::string body); void on_http_error(wxCommandEvent &evt); - void on_set_selected_machine(wxCommandEvent& evt); - void on_update_machine_list(wxCommandEvent& evt); - void on_user_login(wxCommandEvent &evt); - void on_user_login_handle(wxCommandEvent& evt); void enable_user_preset_folder(bool enable); // BBS @@ -606,12 +600,8 @@ private: void start_page_http_server(); void stop_page_http_server(); void switch_staff_pick(bool on); - - void on_show_check_privacy_dlg(int online_login = 0); - void show_check_privacy_dlg(wxCommandEvent& evt); - void on_check_privacy_update(wxCommandEvent &evt); bool check_privacy_update(); - void check_privacy_version(int online_login = 0); + void check_track_enable(); static bool catch_error(std::function cb, const std::string& err); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 98270c4f84..5c2e217e85 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -85,12 +85,7 @@ namespace GUI { wxDEFINE_EVENT(EVT_SELECT_TAB, wxCommandEvent); wxDEFINE_EVENT(EVT_HTTP_ERROR, wxCommandEvent); -wxDEFINE_EVENT(EVT_USER_LOGIN, wxCommandEvent); -wxDEFINE_EVENT(EVT_USER_LOGIN_HANDLE, wxCommandEvent); -wxDEFINE_EVENT(EVT_CHECK_PRIVACY_VER, wxCommandEvent); -wxDEFINE_EVENT(EVT_CHECK_PRIVACY_SHOW, wxCommandEvent); wxDEFINE_EVENT(EVT_SHOW_IP_DIALOG, wxCommandEvent); -wxDEFINE_EVENT(EVT_SET_SELECTED_MACHINE, wxCommandEvent); wxDEFINE_EVENT(EVT_UPDATE_MACHINE_LIST, wxCommandEvent); wxDEFINE_EVENT(EVT_UPDATE_PRESET_CB, SimpleEvent); diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index e5b03e3b54..095f1f7ea1 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -417,12 +417,7 @@ public: }; wxDECLARE_EVENT(EVT_HTTP_ERROR, wxCommandEvent); -wxDECLARE_EVENT(EVT_USER_LOGIN, wxCommandEvent); -wxDECLARE_EVENT(EVT_USER_LOGIN_HANDLE, wxCommandEvent); -wxDECLARE_EVENT(EVT_CHECK_PRIVACY_VER, wxCommandEvent); -wxDECLARE_EVENT(EVT_CHECK_PRIVACY_SHOW, wxCommandEvent); wxDECLARE_EVENT(EVT_SHOW_IP_DIALOG, wxCommandEvent); -wxDECLARE_EVENT(EVT_SET_SELECTED_MACHINE, wxCommandEvent); wxDECLARE_EVENT(EVT_UPDATE_MACHINE_LIST, wxCommandEvent); wxDECLARE_EVENT(EVT_UPDATE_PRESET_CB, SimpleEvent); From 75dc7d586711bf8c4013c9006c99edec3888ca8d Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 14:23:17 +0800 Subject: [PATCH 27/51] feature remove not work code. --- src/slic3r/GUI/GUI_App.cpp | 21 --------------------- src/slic3r/GUI/GUI_App.hpp | 1 - src/slic3r/GUI/UpdateDialogs.cpp | 1 - src/slic3r/GUI/WebSMUserLoginDialog.cpp | 1 - src/slic3r/GUI/WebUserLoginDialog.cpp | 1 - 5 files changed, 25 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index b8e5ea9059..1b41d921de 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4287,27 +4287,6 @@ std::string GUI_App::handle_web_request(std::string cmd) return ""; } -void GUI_App::handle_script_message(std::string msg) -{ - try { - json j = json::parse(msg); - if (j.contains("command")) { - wxString cmd = j["command"]; - if (cmd == "user_login") { - if (m_agent) { - m_agent->change_user(j.dump()); - if (m_agent->is_user_login()) { - request_user_login(1); - } - } - } - } - } - catch (...) { - ; - } -} - void GUI_App::request_model_download(wxString url) { if (plater_) { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index ebc867febb..ec2a8922fd 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -561,7 +561,6 @@ private: void request_user_logout(); int request_user_unbind(std::string dev_id); std::string handle_web_request(std::string cmd); - void handle_script_message(std::string msg); void request_model_download(wxString url); void download_project(std::string project_id); void request_project_download(std::string project_id); diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index 780329523d..9a9f2eafd1 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -121,7 +121,6 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_ wxBoxSizer *m_sizer_right = new wxBoxSizer(wxVERTICAL); - auto m_text_up_info = new wxStaticText(this, wxID_ANY, _L("A new configuration package is available. Do you want to install it?"), wxDefaultPosition, wxDefaultSize, 0); m_text_up_info->SetFont(::Label::Head_14); m_text_up_info->SetForegroundColour(wxColour(0x26, 0x2E, 0x30)); diff --git a/src/slic3r/GUI/WebSMUserLoginDialog.cpp b/src/slic3r/GUI/WebSMUserLoginDialog.cpp index 5292c4cd67..a886588cac 100644 --- a/src/slic3r/GUI/WebSMUserLoginDialog.cpp +++ b/src/slic3r/GUI/WebSMUserLoginDialog.cpp @@ -305,7 +305,6 @@ void SMUserLogin::OnScriptMessage(wxWebViewEvent &evt) } if (strCmd == "user_login") { j["data"]["autotest_token"] = m_AutotestToken; - wxGetApp().handle_script_message(j.dump()); Close(); } else if (strCmd == "get_localhost_url") { diff --git a/src/slic3r/GUI/WebUserLoginDialog.cpp b/src/slic3r/GUI/WebUserLoginDialog.cpp index 5afc43568a..48f90920df 100644 --- a/src/slic3r/GUI/WebUserLoginDialog.cpp +++ b/src/slic3r/GUI/WebUserLoginDialog.cpp @@ -279,7 +279,6 @@ void ZUserLogin::OnScriptMessage(wxWebViewEvent &evt) } if (strCmd == "user_login") { j["data"]["autotest_token"] = m_AutotestToken; - wxGetApp().handle_script_message(j.dump()); Close(); } else if (strCmd == "get_localhost_url") { From 3a2799a4a429f720a3c98461d5fe810a927ba79c Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 14:37:04 +0800 Subject: [PATCH 28/51] feature remove not work code. --- src/slic3r/GUI/HttpServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/HttpServer.cpp b/src/slic3r/GUI/HttpServer.cpp index f2a01268af..bc9944adfd 100644 --- a/src/slic3r/GUI/HttpServer.cpp +++ b/src/slic3r/GUI/HttpServer.cpp @@ -676,7 +676,7 @@ std::shared_ptr HttpServer::bbl_auth_handle_request(const j["data"]["user"]["avatar"] = user_avatar; agent->change_user(j.dump()); if (agent->is_user_login()) { - wxGetApp().request_user_login(1); + //wxGetApp().request_user_login(1); } GUI::wxGetApp().CallAfter([] { wxGetApp().ShowUserLogin(false); }); std::string location_str = (boost::format("%1%?result=success") % redirect_url).str(); From e16ebc26bb1d8b77b8869beb46c75804580e3a1b Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 18:09:57 +0800 Subject: [PATCH 29/51] feature add preset upgrade for soft --- src/libslic3r/AppConfig.cpp | 2 +- src/slic3r/GUI/GUI_App.cpp | 3 + src/slic3r/Utils/PresetUpdater.cpp | 93 +++++++++++++++++++++++++----- 3 files changed, 84 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index a8d3fa620d..4e17f94527 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -39,7 +39,7 @@ namespace Slic3r { static const std::string VERSION_CHECK_URL_STABLE = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases/latest"; static const std::string VERSION_CHECK_URL = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases"; -static const std::string PROFILE_UPDATE_URL = "https://api.github.com/repos/Snapmaker/Orca_Presets/releases/latest"; +static const std::string PROFILE_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/profile/preset_config.json"; static const std::string MODELS_STR = "models"; const std::string AppConfig::SECTION_FILAMENTS = "filaments"; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 1b41d921de..fbc54ea07e 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4747,6 +4747,9 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) } try { json jsonData = json::parse(body); + auto errCode = jsonData["code"]; + if (errCode != 200) + return; // auto isFullUpgrade = jsonData["is_full_upgrade"]; auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; version_info.version_str = jsonData["data"]["version"]; diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 0ec8c0bdc0..fe835cc1f0 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -227,6 +227,7 @@ struct PresetUpdater::priv void parse_version_string(const std::string& body) const; void sync_resources(std::string http_url, std::map &resources, bool check_patch = false, std::string current_version="", std::string changelog_file=""); void sync_config(); + bool download_file(const std::string& url, const std::string& target_path, int timeout_sec = 30, bool* cancel_flag = nullptr); void sync_tooltip(std::string http_url, std::string language); void sync_plugins(std::string http_url, std::string plugin_version); void sync_printer_config(std::string http_url); @@ -649,8 +650,65 @@ void PresetUpdater::priv::sync_resources(std::string http_url, std::map() == "Not Found") { - // The current Orca version does not have any OTA updates, delete the cache file - if (fs::exists(cache_profile_path / "profiles")) - fs::remove_all(cache_profile_path / "profiles"); - if (fs::exists(cache_profile_update_file)) - fs::remove(cache_profile_update_file); - } - } catch (...) {} - } BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_config_orca", http_status, error); }) .timeout_connect(5) @@ -700,6 +746,27 @@ void PresetUpdater::priv::sync_config() if (http_status != 200) return; try { + + { + + json jsonData = json::parse(body); + auto errCode = jsonData["code"]; + if (errCode != 200) + return; + + auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto fileVersion = jsonData["data"]["file_version"]; + auto fileSize = jsonData["data"]["file_size"]; + auto fileMd5 = jsonData["data"]["file_md5"]; + auto fileSha256 = jsonData["data"]["file_sha256"]; + auto fileUrl = jsonData["data"]["file_url"]; + auto description = jsonData["data"]["file_describe"]; + + std::string fileName = cache_profile_path.string() + "/profiles.zip"; + download_file(fileUrl, fileName); + } + + json j = json::parse(body); struct update From 26ca095e0adf9a62b6226c50fa292a603483484a Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 30 Dec 2025 18:59:34 +0800 Subject: [PATCH 30/51] feature add preset update. --- src/slic3r/Utils/PresetUpdater.cpp | 105 +++++++---------------------- 1 file changed, 25 insertions(+), 80 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index fe835cc1f0..5ae6f5c454 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -746,93 +746,38 @@ void PresetUpdater::priv::sync_config() if (http_status != 200) return; try { - - { - - json jsonData = json::parse(body); - auto errCode = jsonData["code"]; - if (errCode != 200) - return; - - auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; - auto fileVersion = jsonData["data"]["file_version"]; - auto fileSize = jsonData["data"]["file_size"]; - auto fileMd5 = jsonData["data"]["file_md5"]; - auto fileSha256 = jsonData["data"]["file_sha256"]; - auto fileUrl = jsonData["data"]["file_url"]; - auto description = jsonData["data"]["file_describe"]; - - std::string fileName = cache_profile_path.string() + "/profiles.zip"; - download_file(fileUrl, fileName); - } - - - json j = json::parse(body); - - struct update - { - std::string url; - std::string name; - int ver = -9999; - } latest_update; - - if (!(j.contains("message") && j["message"].get() == "Not Found")) { - json assets = j.at("assets"); - if (assets.is_array()) { - for (auto asset : assets) { - std::string name = asset["name"].get(); - int versionNumber = -1; - std::regex regexPattern("Snapmaker_Orca-profiles_ota_.*\\.([0-9]+)\\.zip$"); - std::smatch matches; - if (std::regex_search(name, matches, regexPattern) && matches.size() > 1) { - versionNumber = std::stoi(matches[1].str()); - } - if (versionNumber > 0 && versionNumber > latest_update.ver) { - latest_update.url = asset["browser_download_url"].get(); - latest_update.name = name; - latest_update.ver = versionNumber; - } - } - } - } - - if (cancel) + json jsonData = json::parse(body); + auto errCode = jsonData["code"]; + if (errCode != 200) return; - if (latest_update.ver > 0) { - if (latest_update.name == asset_name) - return; - if (fs::exists(cache_profile_path / "profiles")) - fs::remove_all(cache_profile_path / "profiles"); - fs::create_directories(cache_profile_path / "profiles"); - // download the file - std::string download_url = latest_update.url; - std::string download_file = (cache_path / (latest_update.name + TMP_EXTENSION)).string(); - if (!get_file(download_url, download_file)) { - return; - } + auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto fileVersion = jsonData["data"]["file_version"]; + auto fileSize = jsonData["data"]["file_size"]; + auto fileMd5 = jsonData["data"]["file_md5"]; + auto fileSha256 = jsonData["data"]["file_sha256"]; + auto fileUrl = jsonData["data"]["file_url"]; + auto description = jsonData["data"]["file_describe"]; - // extract the file downloaded - BOOST_LOG_TRIVIAL(info) << "[Orca Updater]start to unzip the downloaded file " << download_file; - if (!extract_file(download_file, cache_profile_path)) { - BOOST_LOG_TRIVIAL(warning) << "[Orca Updater]extract downloaded file" - << " failed, path: " << download_file; + auto localProfilesjson = cache_path / "profiles/Snapmaker.json"; + std::string json_path = data_dir() + "/system/Snapmaker.json"; + std::string fileName = cache_profile_path.string() + "/profiles.zip"; + Semver currentPresetVersion = get_version_from_json(json_path); + Semver remoteVersion(fileVersion); + + std::string localOtaPresetVersion = ""; + if (fs::exists(localProfilesjson)) { + Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); + + if (localOtaVersion >= remoteVersion) { + BOOST_LOG_TRIVIAL(info) << format("this the newest preset config for snapmaker orca"); return; } - BOOST_LOG_TRIVIAL(info) << "[Orca Updater]finished unzip the downloaded file " << download_file; - boost::nowide::ofstream f(cache_profile_update_file.string()); - json data; - data["name"] = latest_update.name; - f << data << std::endl; - f.close(); - } else { - // The current Orca version does not have any OTA updates, delete the cache file - if (fs::exists(cache_profile_path / "profiles")) - fs::remove_all(cache_profile_path / "profiles"); - if (fs::exists(cache_profile_update_file)) - fs::remove(cache_profile_update_file); } + if (currentPresetVersion < remoteVersion) + download_file(fileUrl, fileName); + } catch (...) {} }) .perform_sync(); From 6c20bc3b31e21a9e0946fe88362867d892328f97 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 31 Dec 2025 15:07:28 +0800 Subject: [PATCH 31/51] feature remove not work code --- src/slic3r/GUI/GUI_App.cpp | 7 +++++++ src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/MainFrame.cpp | 11 +++++++++++ src/slic3r/Utils/PresetUpdater.cpp | 21 +++------------------ 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index fbc54ea07e..9fb8b58cc8 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4716,6 +4716,13 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que } // namespace +bool GUI_App::check_preset_version() +{ + bool is_newest_version = false; + + + return is_newest_version; +} void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { std::string update_url = ""; diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index ec2a8922fd..07e820a42f 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -578,6 +578,7 @@ private: bool m_studio_active = true; std::chrono::system_clock::time_point last_active_point; + bool check_preset_version(); void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); void enter_force_upgrade(); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 5c2e217e85..6366cbf428 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2297,6 +2297,17 @@ static wxMenu* generate_help_menu() return true; }); + append_menu_item( + helpMenu, wxID_ANY, _L("Check for Preset Update"), _L("Check for Preset Update"), + [](wxCommandEvent&) { + + wxString msg = _L("This is the newest version."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); + }, + "", nullptr, []() { return true; }); + + append_menu_item(helpMenu, wxID_ANY, _L("Import Profile"), _L("Import Profile"), [](wxCommandEvent&) { wxGetApp().import_presets(); }); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 5ae6f5c454..709568900f 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -712,22 +712,7 @@ bool PresetUpdater::priv::download_file(const std::string& url, void PresetUpdater::priv::sync_config() { auto cache_profile_path = cache_path; - auto cache_profile_update_file = cache_path / "profiles_update.json"; - std::string asset_name; - if (fs::exists(cache_profile_update_file)) { - try { - boost::nowide::ifstream f(cache_profile_update_file.string()); - json data = json::parse(f); - if (data.contains("name")) - asset_name = data["name"].get(); - f.close(); - } catch (const std::exception& ex) { - BOOST_LOG_TRIVIAL(error) << "[Orca Updater]: failed to read profiles_update.json when sync_config: " << ex.what() << std::endl; - } catch (...) { - // catch any other errors (that we have no information about) - BOOST_LOG_TRIVIAL(error) << "[Orca Updater]: unknown failure when reading profiles_update.json in sync_config" << std::endl; - } - } + AppConfig *app_config = GUI::wxGetApp().app_config; // auto profile_update_url = app_config->profile_update_url() + "/" + Snapmaker_VERSION; @@ -735,13 +720,13 @@ void PresetUpdater::priv::sync_config() // parse the assets section and get the latest asset by comparing the name Http::get(profile_update_url) - .on_error([cache_profile_path, cache_profile_update_file](std::string body, std::string error, unsigned http_status) { + .on_error([cache_profile_path ](std::string body, std::string error, unsigned http_status) { // Orca: we check the response body to see if it's "Not Found", if so, it means for the current Orca version we don't have OTA // updates, we can delete the cache file BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_config_orca", http_status, error); }) .timeout_connect(5) - .on_complete([this, asset_name, cache_profile_path, cache_profile_update_file](std::string body, unsigned http_status) { + .on_complete([this, cache_profile_path](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) return; From d82cca2f507e3170231487a1c7922b2809853506 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 31 Dec 2025 16:18:55 +0800 Subject: [PATCH 32/51] feature add tips dialog for no update on preset --- src/slic3r/GUI/GUI_App.cpp | 16 +++++++---- src/slic3r/GUI/GUI_App.hpp | 2 +- src/slic3r/GUI/MainFrame.cpp | 4 +-- src/slic3r/Utils/PresetUpdater.cpp | 45 ++++++++++++++++++++++++++---- src/slic3r/Utils/PresetUpdater.hpp | 3 ++ 5 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 9fb8b58cc8..437279baa0 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2578,6 +2578,12 @@ bool GUI_App::on_init_inner() }); dlg.ShowModal(); }); + + Bind(EVT_NO_PRESET_UPDATE, [this](const wxCommandEvent& evt) { + wxString msg = _L("This is the newest version."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); + }); } else { #ifdef __WXMSW__ @@ -4716,12 +4722,10 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que } // namespace -bool GUI_App::check_preset_version() -{ - bool is_newest_version = false; - - - return is_newest_version; +void GUI_App::check_preset_version() +{ + if (preset_updater != nullptr) + preset_updater->sync_config_async(); } void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 07e820a42f..24d1ab1690 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -578,7 +578,7 @@ private: bool m_studio_active = true; std::chrono::system_clock::time_point last_active_point; - bool check_preset_version(); + void check_preset_version(); void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); void enter_force_upgrade(); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 6366cbf428..b6597ffedc 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2300,10 +2300,8 @@ static wxMenu* generate_help_menu() append_menu_item( helpMenu, wxID_ANY, _L("Check for Preset Update"), _L("Check for Preset Update"), [](wxCommandEvent&) { + wxGetApp().check_preset_version(); - wxString msg = _L("This is the newest version."); - InfoDialog dlg(nullptr, _L("Info"), msg); - dlg.ShowModal(); }, "", nullptr, []() { return true; }); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 709568900f..60daeebe9b 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -182,6 +182,7 @@ struct Updates }; +wxDEFINE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); @@ -226,7 +227,7 @@ struct PresetUpdater::priv void sync_version() const; void parse_version_string(const std::string& body) const; void sync_resources(std::string http_url, std::map &resources, bool check_patch = false, std::string current_version="", std::string changelog_file=""); - void sync_config(); + void sync_config(bool isAuto_check = true); bool download_file(const std::string& url, const std::string& target_path, int timeout_sec = 30, bool* cancel_flag = nullptr); void sync_tooltip(std::string http_url, std::string language); void sync_plugins(std::string http_url, std::string plugin_version); @@ -709,7 +710,7 @@ bool PresetUpdater::priv::download_file(const std::string& url, return res; } // Orca: sync config update for currect App version -void PresetUpdater::priv::sync_config() +void PresetUpdater::priv::sync_config(bool isAuto_check) { auto cache_profile_path = cache_path; @@ -720,13 +721,13 @@ void PresetUpdater::priv::sync_config() // parse the assets section and get the latest asset by comparing the name Http::get(profile_update_url) - .on_error([cache_profile_path ](std::string body, std::string error, unsigned http_status) { + .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { // Orca: we check the response body to see if it's "Not Found", if so, it means for the current Orca version we don't have OTA // updates, we can delete the cache file BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_config_orca", http_status, error); }) .timeout_connect(5) - .on_complete([this, cache_profile_path](std::string body, unsigned http_status) { + .on_complete([this, cache_profile_path, isAuto_check](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) return; @@ -755,13 +756,27 @@ void PresetUpdater::priv::sync_config() Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); if (localOtaVersion >= remoteVersion) { - BOOST_LOG_TRIVIAL(info) << format("this the newest preset config for snapmaker orca"); + if (!isAuto_check) + { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the preset update."); + } return; } } if (currentPresetVersion < remoteVersion) download_file(fileUrl, fileName); + { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the preset update local no profiles."); + } + } } catch (...) {} }) @@ -1540,6 +1555,26 @@ bool PresetUpdater::install_bundles_rsrc(std::vector bundles, bool return p->install_bundles_rsrc(bundles, snapshot); } + +void PresetUpdater::sync_config_async() +{ + if (p->thread.joinable()) { + p->cancel = true; + p->thread.join(); + } + + p->cancel = false; + p->thread = std::thread([this]() { + BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_config_async started"; + this->p->sync_config(false); + + GUI::wxGetApp().CallAfter([] { + BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_config_async completed, checking updates..."; + GUI::wxGetApp().check_config_updates_from_updater(); + }); + }); +} + void PresetUpdater::on_update_notification_confirm() { if (!p->has_waiting_updates) diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index 59215926d8..3e8edaa7ca 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -65,11 +65,14 @@ public: void import_flutter_web(); + void sync_config_async(); + public: struct priv; std::unique_ptr p; }; +wxDECLARE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); From 6940b359a05a50206d535a3d0cd6181dca4310ce Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 31 Dec 2025 18:21:17 +0800 Subject: [PATCH 33/51] feature get flutter web resource from server. --- src/libslic3r/AppConfig.cpp | 6 ++ src/libslic3r/AppConfig.hpp | 2 + src/slic3r/GUI/GUI_App.cpp | 14 ++- src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/MainFrame.cpp | 6 ++ src/slic3r/Utils/PresetUpdater.cpp | 165 +++++++++++++++++++++-------- src/slic3r/Utils/PresetUpdater.hpp | 5 +- 7 files changed, 150 insertions(+), 49 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 4e17f94527..cf8800fda1 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -40,6 +40,7 @@ namespace Slic3r { static const std::string VERSION_CHECK_URL_STABLE = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases/latest"; static const std::string VERSION_CHECK_URL = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases"; static const std::string PROFILE_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/profile/preset_config.json"; +static const std::string FLUTTER_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/flutter/flutter_config.json"; static const std::string MODELS_STR = "models"; const std::string AppConfig::SECTION_FILAMENTS = "filaments"; @@ -1429,6 +1430,11 @@ std::string AppConfig::version_check_url(bool stable_only/* = false*/) const return from_settings.empty() ? stable_only ? VERSION_CHECK_URL_STABLE : VERSION_CHECK_URL : from_settings; } +std::string AppConfig::flutter_resource_update_url() const +{ + return FLUTTER_UPDATE_URL; +} + std::string AppConfig::profile_update_url() const { return PROFILE_UPDATE_URL; diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index fce62c2a0d..d70bb36af8 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -328,6 +328,8 @@ public: // Get the Orca profile update url. std::string profile_update_url() const; + std::string flutter_resource_update_url() const; + // Returns the original Slic3r version found in the ini file before it was overwritten // by the current version Semver orig_version() const { return m_orig_version; } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 437279baa0..b948b85dbd 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2579,10 +2579,10 @@ bool GUI_App::on_init_inner() dlg.ShowModal(); }); - Bind(EVT_NO_PRESET_UPDATE, [this](const wxCommandEvent& evt) { - wxString msg = _L("This is the newest version."); - InfoDialog dlg(nullptr, _L("Info"), msg); - dlg.ShowModal(); + Bind(EVT_NO_PRESET_UPDATE, [this](const wxCommandEvent& evt) { + wxString msg = _L("This is the newest version."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); }); } else { @@ -4722,6 +4722,12 @@ void maybe_attach_updater_signature(Http& http, const std::string& canonical_que } // namespace +void GUI_App::check_web_version() +{ + if (preset_updater != nullptr) + preset_updater->sync_web_async(); +} + void GUI_App::check_preset_version() { if (preset_updater != nullptr) diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 24d1ab1690..052ab0f96e 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -578,6 +578,7 @@ private: bool m_studio_active = true; std::chrono::system_clock::time_point last_active_point; + void check_web_version(); void check_preset_version(); void check_new_version_sf(bool show_tips = false, bool by_user = false); void process_network_msg(std::string dev_id, std::string msg); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index b6597ffedc..94c67c8d20 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2305,6 +2305,12 @@ static wxMenu* generate_help_menu() }, "", nullptr, []() { return true; }); + append_menu_item( + helpMenu, wxID_ANY, _L("Check for Web Update"), _L("Check for Web Update"), + [](wxCommandEvent&) { + wxGetApp().check_web_version(); + }, + "", nullptr, []() { return true; }); append_menu_item(helpMenu, wxID_ANY, _L("Import Profile"), _L("Import Profile"), [](wxCommandEvent&) { wxGetApp().import_presets(); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 60daeebe9b..098d06546c 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -181,7 +181,7 @@ struct Updates std::vector updates; }; - +wxDEFINE_EVENT(EVT_NO_WEB_RESOURCE_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); @@ -228,6 +228,7 @@ struct PresetUpdater::priv void parse_version_string(const std::string& body) const; void sync_resources(std::string http_url, std::map &resources, bool check_patch = false, std::string current_version="", std::string changelog_file=""); void sync_config(bool isAuto_check = true); + void sync_update_flutter_resource(bool isAuto_check = true); bool download_file(const std::string& url, const std::string& target_path, int timeout_sec = 30, bool* cancel_flag = nullptr); void sync_tooltip(std::string http_url, std::string language); void sync_plugins(std::string http_url, std::string plugin_version); @@ -709,6 +710,77 @@ bool PresetUpdater::priv::download_file(const std::string& url, return res; } + + +void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) +{ + auto cache_profile_path = cache_path; + + AppConfig* app_config = GUI::wxGetApp().app_config; + + auto preset_update_url = app_config->flutter_resource_update_url(); + + Http::get(preset_update_url) + .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { + BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_update_flutter_resource", http_status, error); + }) + .timeout_connect(5) + .on_complete([this, cache_profile_path, isAuto_check](std::string body, unsigned http_status) { + // Http response OK + if (http_status != 200) + return; + try { + json jsonData = json::parse(body); + auto errCode = jsonData["code"]; + if (errCode != 200) + return; + + auto buildNumber = jsonData["data"]["build_number"]; + auto supportPcVersion = jsonData["data"]["support_snapmaker_version"]; + auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto fileVersion = jsonData["data"]["file_version"]; + auto fileSize = jsonData["data"]["file_size"]; + auto fileMd5 = jsonData["data"]["file_md5"]; + auto fileSha256 = jsonData["data"]["file_sha256"]; + auto fileUrl = jsonData["data"]["file_url"]; + auto description = jsonData["data"]["file_describe"]; + + auto localProfilesjson = cache_path / "flutter_web/version.json"; + std::string json_path = data_dir() + "/web/flutter_web/version.json"; + std::string fileName = cache_profile_path.string() + "/flutter_web.zip"; + Semver currentPresetVersion = get_version_from_json(json_path); + Semver remoteVersion(fileVersion); + + std::string localOtaPresetVersion = ""; + if (fs::exists(localProfilesjson)) { + Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); + + if (localOtaVersion >= remoteVersion) { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); + } + return; + } + } + + if (currentPresetVersion < remoteVersion) + download_file(fileUrl, fileName); + else { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update local no profiles."); + } + } + + } catch (...) {} + }) + .perform_sync(); +} // Orca: sync config update for currect App version void PresetUpdater::priv::sync_config(bool isAuto_check) { @@ -769,7 +841,7 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) if (currentPresetVersion < remoteVersion) download_file(fileUrl, fileName); - { + else { if (!isAuto_check) { wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); GUI::wxGetApp().QueueEvent(evt); @@ -777,7 +849,7 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) BOOST_LOG_TRIVIAL(info) << format("use check the preset update local no profiles."); } } - + } catch (...) {} }) .perform_sync(); @@ -1555,6 +1627,25 @@ bool PresetUpdater::install_bundles_rsrc(std::vector bundles, bool return p->install_bundles_rsrc(bundles, snapshot); } +void PresetUpdater::sync_web_async() +{ + if (p->thread.joinable()) { + p->cancel = true; + p->thread.join(); + } + + p->cancel = false; + p->thread = std::thread([this]() { + BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_web_async started"; + this->p->sync_update_flutter_resource(false); + + GUI::wxGetApp().CallAfter([this] { + std::string zipfilepath = this->p->cache_path.string() + "/flutter_web.zip"; + BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_web_async completed, checking updates..."; + load_lutter_web(zipfilepath); + }); + }); +} void PresetUpdater::sync_config_async() { @@ -1634,31 +1725,20 @@ bool PresetUpdater::version_check_enabled() const return p->enabled_version_check; } -void PresetUpdater::import_flutter_web() + +void PresetUpdater::load_lutter_web(const std::string& zip_file) { - // 1. 弹出文件选择框 - wxFileDialog dialog(nullptr, _L("Please choose a web resource package file:"), "", "", "resource packages (*.zip)|*.zip", - wxFD_OPEN | wxFD_FILE_MUST_EXIST); - - if (dialog.ShowModal() != wxID_OK) - return; - - std::string zip_file = dialog.GetPath().ToUTF8().data(); - - // 2. 创建临时目录用于解压 boost::filesystem::path temp_path = boost::filesystem::temp_directory_path() / "orca_temp_flutter_import"; try { if (boost::filesystem::exists(temp_path)) boost::filesystem::remove_all(temp_path); boost::filesystem::create_directories(temp_path); - // 3. 解压zip文件到临时目录 if (!p->extract_file(zip_file, temp_path.string())) { GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); return; } - // 4. 检查版本并导入 std::vector outdated_presets; Updates updates; @@ -1667,40 +1747,33 @@ void PresetUpdater::import_flutter_web() GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); } - // 读取当前flutter资源包版本 - std::string ori_version_str = "0"; + std::string ori_version_str = "0"; std::string ori_build_number_str = "0"; - auto ori_version_file = boost::filesystem::path(data_dir()) / "web" / "flutter_web" / "version.json"; + auto ori_version_file = boost::filesystem::path(data_dir()) / "web" / "flutter_web" / "version.json"; boost::property_tree::ptree ori_config; boost::property_tree::read_json(ori_version_file.string(), ori_config); ori_version_str = ori_config.get("version", "0"); ori_build_number_str = ori_config.get("build_number", "0"); - // 遍历解压的文件夹 for (auto& dir_entry : boost::filesystem::directory_iterator(temp_path / "flutter_web")) { if (dir_entry.path().filename() == "version.json") { try { - // 读取json文件获取版本信息 + boost::property_tree::ptree config; boost::property_tree::read_json(dir_entry.path().string(), config); - std::string version_str = config.get("version", "0"); + std::string version_str = config.get("version", "0"); std::string build_number_str = config.get("build_number", "0"); - // std::string vendor = dir_entry.path().stem().string(); - - - - // 使用 Semver 进行版本比较 Semver online_version = version_str; Semver current_version = ori_version_str; - if (/* current_version < online_version && */ori_build_number_str < build_number_str) { + if (/* current_version < online_version && */ ori_build_number_str < build_number_str) { auto source_folder_path = fs::path(dir_entry.path().parent_path()); auto target_folder_path = (boost::filesystem::path(data_dir()) / "web" / "flutter_web"); - // 创建Version对象 + Version version; - version.config_version = online_version; // 将Semver赋值给Version的config_version + version.config_version = online_version; // changelog std::string changelog = ""; @@ -1711,16 +1784,14 @@ void PresetUpdater::import_flutter_web() oss << ifs.rdbuf(); changelog = oss.str(); ifs.close(); - // 替换所有的 \\n 为 \n size_t pos = 0; while ((pos = changelog.find("\\n", pos)) != std::string::npos) { changelog.replace(pos, 2, "\n"); - pos += 1; // 移动到下一个可能的位置 + pos += 1; } } - // 检查最小要求软件版本 - Semver min_ver = get_min_version_from_json(dir_entry.path().string()); + Semver min_ver = get_min_version_from_json(dir_entry.path().string()); Semver soft_ver = Semver(std::string(Snapmaker_VERSION)); bool legal = true; @@ -1731,13 +1802,10 @@ void PresetUpdater::import_flutter_web() .ToStdString(); } - // 版本较新且兼容,添加到更新列表 - - updates.updates.emplace_back(std::move(source_folder_path), std::move(target_folder_path), version, "flutter_web", changelog, "", - false, true, legal); + updates.updates.emplace_back(std::move(source_folder_path), std::move(target_folder_path), version, "flutter_web", + changelog, "", false, true, legal); } else { - // 版本较旧或不兼容,添加到提示列表 outdated_presets.push_back("flutter_web"); } } catch (std::exception& e) { @@ -1747,7 +1815,6 @@ void PresetUpdater::import_flutter_web() } } - // 5. 执行更新并提示结果 bool need_restart = false; if (!updates.updates.empty()) { std::vector updates_msg; @@ -1784,8 +1851,6 @@ void PresetUpdater::import_flutter_web() GUI::MessageDialog(nullptr, message).ShowModal(); } - - if (need_restart) { GUI::MessageDialog msg_wingow(nullptr, _L("Updating the web resources requires application restart.") + "\n" + @@ -1797,17 +1862,29 @@ void PresetUpdater::import_flutter_web() app->recreate_GUI(_L("Update web resources")); } - } catch (std::exception& e) { BOOST_LOG_TRIVIAL(error) << "Failed to importweb resources: " << e.what(); GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); } - // 6. 清理临时目录 boost::filesystem::remove_all(temp_path); } + +void PresetUpdater::import_flutter_web() +{ + wxFileDialog dialog(nullptr, _L("Please choose a web resource package file:"), "", "", "resource packages (*.zip)|*.zip", + wxFD_OPEN | wxFD_FILE_MUST_EXIST); + + if (dialog.ShowModal() != wxID_OK) + return; + + std::string zip_file = dialog.GetPath().ToUTF8().data(); + + load_lutter_web(zip_file); +} + void PresetUpdater::import_system_profile() { // 1. 弹出文件选择框 diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index 3e8edaa7ca..745931f96b 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -65,13 +65,16 @@ public: void import_flutter_web(); + void load_lutter_web(const std::string& zip_file); + void sync_config_async(); + void sync_web_async(); public: struct priv; std::unique_ptr p; }; - +wxDECLARE_EVENT(EVT_NO_WEB_RESOURCE_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); From 13922dfc02c262a19804909c12133d44b9f62657 Mon Sep 17 00:00:00 2001 From: alves Date: Sun, 4 Jan 2026 16:49:23 +0800 Subject: [PATCH 34/51] feature update preset logic for get the server latest version --- src/slic3r/GUI/GUI_App.cpp | 21 ++++++++++++++------ src/slic3r/GUI/GUI_App.hpp | 2 +- src/slic3r/Utils/PresetUpdater.cpp | 32 ++++++++++++++++++------------ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index b948b85dbd..17506175dd 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -164,6 +164,8 @@ typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS2)( #include #endif +#define UPDATE_BY_USER 1 + using namespace std::literals; namespace pt = boost::property_tree; @@ -2580,9 +2582,15 @@ bool GUI_App::on_init_inner() }); Bind(EVT_NO_PRESET_UPDATE, [this](const wxCommandEvent& evt) { - wxString msg = _L("This is the newest version."); - InfoDialog dlg(nullptr, _L("Info"), msg); - dlg.ShowModal(); + wxString msg = _L("The configuration is up to date."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); + }); + + Bind(EVT_NO_WEB_RESOURCE_UPDATE, [this](const wxCommandEvent& evt) { + wxString msg = _L("This is the newest version."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); }); } else { @@ -4783,7 +4791,7 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) Semver server_version = get_version(version_info.version_str, matcher); - if (current_version >= server_version) { + if (current_version >= server_version && by_user) { this->no_new_version(); return; } @@ -4801,6 +4809,8 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE); evt->SetString(version_info.url); + if (by_user) + evt->SetInt(UPDATE_BY_USER); GUI::wxGetApp().QueueEvent(evt); } catch (...) {} }) @@ -6904,8 +6914,7 @@ void GUI_App::check_updates(const bool verbose) m_app_conf_exists = true; } else if (verbose && updater_result == PresetUpdater::R_NOOP) { - MsgNoUpdates dlg; - dlg.ShowModal(); + } } catch (const std::exception & ex) { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 052ab0f96e..1313918b3c 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -782,7 +782,7 @@ private: bool check_networking_version(); void cancel_networking_install(); void restart_networking(); - void check_config_updates_from_updater() { check_updates(false); } + void check_config_updates_from_updater(bool updateByuser = false) { check_updates(updateByuser); } private: int updating_bambu_networking(); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 098d06546c..0f24555ba7 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -735,9 +735,10 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) if (errCode != 200) return; - auto buildNumber = jsonData["data"]["build_number"]; - auto supportPcVersion = jsonData["data"]["support_snapmaker_version"]; + auto buildNumber = jsonData["data"]["build_number"]; auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto minSupportPcVersion = jsonData["data"]["min_support_pc_version"]; + auto maxSupportPcVersion = jsonData["data"]["max_support_pc_version"]; auto fileVersion = jsonData["data"]["file_version"]; auto fileSize = jsonData["data"]["file_size"]; auto fileMd5 = jsonData["data"]["file_md5"]; @@ -810,6 +811,8 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) return; auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto minSupportPcVersion = jsonData["data"]["min_support_pc_version"]; + auto maxSupportPcVersion = jsonData["data"]["max_support_pc_version"]; auto fileVersion = jsonData["data"]["file_version"]; auto fileSize = jsonData["data"]["file_size"]; auto fileMd5 = jsonData["data"]["file_md5"]; @@ -826,17 +829,20 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) std::string localOtaPresetVersion = ""; if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); - - if (localOtaVersion >= remoteVersion) { - if (!isAuto_check) - { - wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); - GUI::wxGetApp().QueueEvent(evt); - - BOOST_LOG_TRIVIAL(info) << format("use check the preset update."); - } + //don't allow jump version. first upgrade localOta + if (localOtaVersion >= currentPresetVersion) return; - } + else + { + if (currentPresetVersion >= remoteVersion) { + if (!isAuto_check) {//show tipsdlg by user check upgrade + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + BOOST_LOG_TRIVIAL(info) << format("use check the preset update."); + } + return; + } + } } if (currentPresetVersion < remoteVersion) @@ -1661,7 +1667,7 @@ void PresetUpdater::sync_config_async() GUI::wxGetApp().CallAfter([] { BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_config_async completed, checking updates..."; - GUI::wxGetApp().check_config_updates_from_updater(); + GUI::wxGetApp().check_config_updates_from_updater(true); }); }); } From 0ef1983150e9eeda28e04f373a9911640e67ee31 Mon Sep 17 00:00:00 2001 From: alves Date: Sun, 4 Jan 2026 16:54:08 +0800 Subject: [PATCH 35/51] feature update web resource upgrade logic for process soft. --- src/slic3r/Utils/PresetUpdater.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 0f24555ba7..6803f141e7 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -756,14 +756,19 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); - if (localOtaVersion >= remoteVersion) { - if (!isAuto_check) { - wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); - GUI::wxGetApp().QueueEvent(evt); - - BOOST_LOG_TRIVIAL(info) << format("use check the web update."); - } + if (localOtaVersion >= remoteVersion) return; + else { + if (currentPresetVersion >= remoteVersion){ + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); + } + return; + } + } } From c53e76df14e3d61b1f4d0a9d52f4ad8149a7e766 Mon Sep 17 00:00:00 2001 From: alves Date: Sun, 4 Jan 2026 17:14:50 +0800 Subject: [PATCH 36/51] feature update preset pack path for on the menu import preset. --- src/slic3r/Utils/PresetUpdater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 6803f141e7..e1e30afda2 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -1930,7 +1930,7 @@ void PresetUpdater::import_system_profile() } // 遍历解压的文件夹 - for (auto& dir_entry : boost::filesystem::directory_iterator(temp_path / "profiles")) { + for (auto& dir_entry : boost::filesystem::directory_iterator(temp_path)) { if (dir_entry.path().extension() == ".json") { try { // 读取json文件获取版本信息 From 8fcabfcbb5c9528b1c1f97274bd1de027c82d193 Mon Sep 17 00:00:00 2001 From: alves Date: Sun, 4 Jan 2026 18:21:53 +0800 Subject: [PATCH 37/51] feature diff server update and import update on web resource --- src/slic3r/Utils/PresetUpdater.cpp | 6 +++--- src/slic3r/Utils/PresetUpdater.hpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index e1e30afda2..fab0e940d7 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -1653,7 +1653,7 @@ void PresetUpdater::sync_web_async() GUI::wxGetApp().CallAfter([this] { std::string zipfilepath = this->p->cache_path.string() + "/flutter_web.zip"; BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_web_async completed, checking updates..."; - load_lutter_web(zipfilepath); + load_lutter_web(zipfilepath, true); }); }); } @@ -1737,7 +1737,7 @@ bool PresetUpdater::version_check_enabled() const } -void PresetUpdater::load_lutter_web(const std::string& zip_file) +void PresetUpdater::load_lutter_web(const std::string& zip_file, bool serverUpdate) { boost::filesystem::path temp_path = boost::filesystem::temp_directory_path() / "orca_temp_flutter_import"; try { @@ -1854,7 +1854,7 @@ void PresetUpdater::load_lutter_web(const std::string& zip_file) } wxString message; - if (!outdated_presets.empty()) { + if (!outdated_presets.empty() && !serverUpdate) { message = _L("This web resouce could not be imported due to outdated versions.") + "\n"; for (const auto& preset : outdated_presets) { message += "• " + preset + "\n"; diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index 745931f96b..c1c7a49638 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -65,7 +65,7 @@ public: void import_flutter_web(); - void load_lutter_web(const std::string& zip_file); + void load_lutter_web(const std::string& zip_file,bool serverUpdate = false); void sync_config_async(); From 808e1da45b6324f25c6256c1a6c2b0b4c531b973 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 5 Jan 2026 17:36:27 +0800 Subject: [PATCH 38/51] feature diff cn and the other area to download soft.and request to server fail show the error dialog. --- src/libslic3r/AppConfig.cpp | 25 +++++++++++++++++++++++++ src/libslic3r/AppConfig.hpp | 1 + src/slic3r/GUI/GUI_App.cpp | 26 ++++++++++++++------------ src/slic3r/GUI/Preferences.cpp | 8 ++++---- src/slic3r/Utils/PresetUpdater.cpp | 18 ++++++++++++++---- src/slic3r/Utils/PresetUpdater.hpp | 1 + 6 files changed, 59 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index cf8800fda1..d7fbed9d27 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -43,6 +43,20 @@ static const std::string PROFILE_UPDATE_URL = "https://public.resource.snapmaker static const std::string FLUTTER_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/flutter/flutter_config.json"; static const std::string MODELS_STR = "models"; +#define APP_UPDATE_URL_BASE_CN "https://public.resource.snapmaker.com/upgrade/packages/orca" +#define APP_UPDATE_URL_BASE_EN "https://public.resource.snapmaker.com/upgrade/packages/orca" + +#if defined(_WIN32) +static const std::string APP_UPDATE_URL = std::string("/win/manifest.json"); +#elif defined(__APPLE__) +static const std::string APP_UPDATE_URL = std::string("/mac/manifest.json"); +#elif defined(__linux__) +static const std::string APP_UPDATE_URL = std::string("/linux/manifest.json"); +#else +static const std::string APP_UPDATE_URL = ""; +#endif + + const std::string AppConfig::SECTION_FILAMENTS = "filaments"; const std::string AppConfig::SECTION_MATERIALS = "sla_materials"; const std::string AppConfig::SECTION_EMBOSS_STYLE = "font"; @@ -1424,6 +1438,17 @@ std::string AppConfig::config_path() return path; } +std::string AppConfig::get_version_upgrade_url(bool stable_only /* = false*/) +{ + //get local area and get the resource from diff server + std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL; + auto countryArea = get_country_code(); + if (countryArea == std::string("CN")) + url = APP_UPDATE_URL_BASE_CN + APP_UPDATE_URL; + + return url; +} + std::string AppConfig::version_check_url(bool stable_only/* = false*/) const { auto from_settings = get("version_check_url"); diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index d70bb36af8..04770946d5 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -324,6 +324,7 @@ public: // Get the Slic3r version check url. // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. std::string version_check_url(bool stable_only = false) const; + std::string get_version_upgrade_url(bool stable_only = false); // Get the Orca profile update url. std::string profile_update_url() const; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 17506175dd..71616a018d 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2592,6 +2592,12 @@ bool GUI_App::on_init_inner() InfoDialog dlg(nullptr, _L("Info"), msg); dlg.ShowModal(); }); + + Bind(EVT_REQUEST_SERVER_FAIL, [this](const wxCommandEvent& evt) { + wxString msg = evt.GetString(); + InfoDialog dlg(nullptr, _L("Error"), msg); + dlg.ShowModal(); + }); } else { #ifdef __WXMSW__ @@ -4743,27 +4749,23 @@ void GUI_App::check_preset_version() } void GUI_App::check_new_version_sf(bool show_tips, bool by_user) { - std::string update_url = ""; - -#ifdef __WINDOWS__ - update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/win/manifest.json"; -#endif -#ifdef __APPLE__ - update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/mac/manifest.json"; -#endif -#ifdef __LINUX__ - update_url = "https://public.resource.snapmaker.com/upgrade/packages/orca/linux/manifest.json"; -#endif + std::string update_url = app_config->get_version_upgrade_url(); AppConfig* app_config = wxGetApp().app_config; Http::get(update_url) .on_error([&](std::string body, std::string error, unsigned http_status) { (void)body; + + wxCommandEvent* evt = new wxCommandEvent(EVT_REQUEST_SERVER_FAIL); + wxString errorMsg = wxString::Format(_L("request to server update soft fail with body:%s,error:%s,status:%d"), body, + error, http_status); + evt->SetString(errorMsg); + GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(error) << format("Error getting: `%1%`: HTTP %2%, %3%", "check_new_version_sf", http_status, error); }) - .timeout_connect(1) + .timeout_connect(TIMEOUT_CONNECT) .on_complete([this,by_user](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) { diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 5909829264..01cd28c70c 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -1198,7 +1198,7 @@ wxWindow* PreferencesDialog::create_general_page() app_config->save(); - auto item_check_stable_version_only = create_item_checkbox(_L("Check for stable updates only"), page, _L("Check for stable updates only"), 50, "check_stable_update_only"); + //auto item_check_stable_version_only = create_item_checkbox(_L("Check for stable updates only"), page, _L("Check for stable updates only"), 50, "check_stable_update_only"); std::vector Units = {_L("Metric") + " (mm, g)", _L("Imperial") + " (in, oz)"}; auto item_currency = create_item_combobox(_L("Units"), page, _L("Units"), "use_inches", Units); @@ -1233,7 +1233,7 @@ wxWindow* PreferencesDialog::create_general_page() auto item_multi_machine = create_item_checkbox(_L("Multi-device Management (Take effect after restarting Snapmaker Orca)."), page, _L("With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices."), 50, "enable_multi_machine"); auto item_auto_arrange = create_item_checkbox(_L("Auto arrange plate after cloning"), page, _L("Auto arrange plate after object cloning"), 50, "auto_arrange"); auto title_presets = create_item_title(_L("Presets"), page, _L("Presets")); - auto title_network = create_item_title(_L("Network"), page, _L("Network")); + //auto title_network = create_item_title(_L("Network"), page, _L("Network")); auto item_user_sync = create_item_checkbox(_L("Auto sync user presets (Printer/Filament/Process)"), page, _L("User Sync"), 50, "sync_user_preset"); auto item_system_sync = create_item_checkbox(_L("Update built-in Presets automatically."), page, _L("System Sync"), 50, "sync_system_preset"); auto item_save_presets = create_item_button(_L("Clear my choice on the unsaved presets."), _L("Clear"), page, L"", _L("Clear my choice on the unsaved presets."), []() { @@ -1338,8 +1338,8 @@ wxWindow* PreferencesDialog::create_general_page() sizer_page->Add(item_system_sync, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_remember_printer_config, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_save_presets, 0, wxTOP, FromDIP(3)); - sizer_page->Add(title_network, 0, wxTOP | wxEXPAND, FromDIP(20)); - sizer_page->Add(item_check_stable_version_only, 0, wxTOP, FromDIP(3)); + //sizer_page->Add(title_network, 0, wxTOP | wxEXPAND, FromDIP(20)); + //sizer_page->Add(item_check_stable_version_only, 0, wxTOP, FromDIP(3)); // SM Beta: temporarily open the item_stealth_mode and close the network plugin diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index fab0e940d7..31208f5f53 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -181,6 +181,7 @@ struct Updates std::vector updates; }; +wxDEFINE_EVENT(EVT_REQUEST_SERVER_FAIL, wxCommandEvent); wxDEFINE_EVENT(EVT_NO_WEB_RESOURCE_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); @@ -722,9 +723,14 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) Http::get(preset_update_url) .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { + wxCommandEvent* evt = new wxCommandEvent(EVT_REQUEST_SERVER_FAIL); + wxString errorMsg = wxString::Format(_L("request to server update web resource fail with body:%s,error:%s,status:%d"), body, error, http_status); + evt->SetString(errorMsg); + GUI::wxGetApp().QueueEvent(evt); + GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_update_flutter_resource", http_status, error); }) - .timeout_connect(5) + .timeout_connect(TIMEOUT_CONNECT) .on_complete([this, cache_profile_path, isAuto_check](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) @@ -756,7 +762,7 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); - if (localOtaVersion >= remoteVersion) + if (localOtaVersion > remoteVersion) return; else { if (currentPresetVersion >= remoteVersion){ @@ -802,9 +808,13 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { // Orca: we check the response body to see if it's "Not Found", if so, it means for the current Orca version we don't have OTA // updates, we can delete the cache file + wxCommandEvent* evt = new wxCommandEvent(EVT_REQUEST_SERVER_FAIL); + wxString errorMsg = wxString::Format(_L("request to server update preset resource fail with body:%s,error:%s,status:%d"), body,error, http_status); + evt->SetString(errorMsg); + GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_config_orca", http_status, error); }) - .timeout_connect(5) + .timeout_connect(TIMEOUT_CONNECT) .on_complete([this, cache_profile_path, isAuto_check](std::string body, unsigned http_status) { // Http response OK if (http_status != 200) @@ -835,7 +845,7 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); //don't allow jump version. first upgrade localOta - if (localOtaVersion >= currentPresetVersion) + if (localOtaVersion > currentPresetVersion) return; else { diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index c1c7a49638..b18857245a 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -74,6 +74,7 @@ public: struct priv; std::unique_ptr p; }; +wxDECLARE_EVENT(EVT_REQUEST_SERVER_FAIL, wxCommandEvent); wxDECLARE_EVENT(EVT_NO_WEB_RESOURCE_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_NO_PRESET_UPDATE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); From a0287af55736052d0f1eefdd1528b36b63571b8e Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 5 Jan 2026 18:13:59 +0800 Subject: [PATCH 39/51] feature update to get the url function --- src/libslic3r/AppConfig.cpp | 44 ++++++++++++++++++------------ src/libslic3r/AppConfig.hpp | 7 ++--- src/slic3r/Utils/PresetUpdater.cpp | 7 ++--- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index d7fbed9d27..3195d32579 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -39,19 +39,19 @@ namespace Slic3r { static const std::string VERSION_CHECK_URL_STABLE = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases/latest"; static const std::string VERSION_CHECK_URL = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases"; -static const std::string PROFILE_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/profile/preset_config.json"; -static const std::string FLUTTER_UPDATE_URL = "https://public.resource.snapmaker.com/upgrade/packages/flutter/flutter_config.json"; +static const std::string PROFILE_UPDATE_URL = "/upgrade/packages/profile/preset_config.json"; +static const std::string FLUTTER_UPDATE_URL = "/upgrade/packages/flutter/flutter_config.json"; static const std::string MODELS_STR = "models"; -#define APP_UPDATE_URL_BASE_CN "https://public.resource.snapmaker.com/upgrade/packages/orca" -#define APP_UPDATE_URL_BASE_EN "https://public.resource.snapmaker.com/upgrade/packages/orca" +#define APP_UPDATE_URL_BASE_CN "https://public.resource.snapmaker.com" +#define APP_UPDATE_URL_BASE_EN "https://public.resource.snapmaker.com" #if defined(_WIN32) -static const std::string APP_UPDATE_URL = std::string("/win/manifest.json"); +static const std::string APP_UPDATE_URL = std::string("/upgrade/packages/orca/win/manifest.json"); #elif defined(__APPLE__) -static const std::string APP_UPDATE_URL = std::string("/mac/manifest.json"); +static const std::string APP_UPDATE_URL = std::string("/upgrade/packages/orca/mac/manifest.json"); #elif defined(__linux__) -static const std::string APP_UPDATE_URL = std::string("/linux/manifest.json"); +static const std::string APP_UPDATE_URL = std::string("/upgrade/packages/orca/linux/manifest.json"); #else static const std::string APP_UPDATE_URL = ""; #endif @@ -1438,6 +1438,26 @@ std::string AppConfig::config_path() return path; } +std::string AppConfig::get_preset_upgrade_url() +{ + std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL; + auto countryArea = get_country_code(); + if (countryArea == std::string("CN")) + url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL; + + return url; +} + +std::string AppConfig::get_web_resource_upgrade_url() +{ + std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL; + auto countryArea = get_country_code(); + if (countryArea == std::string("CN")) + url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL; + + return url; +} + std::string AppConfig::get_version_upgrade_url(bool stable_only /* = false*/) { //get local area and get the resource from diff server @@ -1455,16 +1475,6 @@ std::string AppConfig::version_check_url(bool stable_only/* = false*/) const return from_settings.empty() ? stable_only ? VERSION_CHECK_URL_STABLE : VERSION_CHECK_URL : from_settings; } -std::string AppConfig::flutter_resource_update_url() const -{ - return FLUTTER_UPDATE_URL; -} - -std::string AppConfig::profile_update_url() const -{ - return PROFILE_UPDATE_URL; -} - bool AppConfig::exists() { return boost::filesystem::exists(config_path()); diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index 04770946d5..a1251d1ff9 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -325,11 +325,8 @@ public: // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. std::string version_check_url(bool stable_only = false) const; std::string get_version_upgrade_url(bool stable_only = false); - - // Get the Orca profile update url. - std::string profile_update_url() const; - - std::string flutter_resource_update_url() const; + std::string get_preset_upgrade_url(); + std::string get_web_resource_upgrade_url(); // Returns the original Slic3r version found in the ini file before it was overwritten // by the current version diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 31208f5f53..8b15071d6d 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -267,7 +267,7 @@ void PresetUpdater::priv::set_download_prefs(AppConfig *app_config) { version_check_url = app_config->version_check_url(); - auto profile_update_url = app_config->profile_update_url(); + auto profile_update_url = app_config->get_preset_upgrade_url(); if (!profile_update_url.empty()) enabled_config_update = true; else @@ -719,7 +719,7 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) AppConfig* app_config = GUI::wxGetApp().app_config; - auto preset_update_url = app_config->flutter_resource_update_url(); + auto preset_update_url = app_config->get_web_resource_upgrade_url(); Http::get(preset_update_url) .on_error([cache_profile_path, isAuto_check](std::string body, std::string error, unsigned http_status) { @@ -800,8 +800,7 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) AppConfig *app_config = GUI::wxGetApp().app_config; - // auto profile_update_url = app_config->profile_update_url() + "/" + Snapmaker_VERSION; - auto profile_update_url = app_config->profile_update_url(); + auto profile_update_url = app_config->get_preset_upgrade_url(); // parse the assets section and get the latest asset by comparing the name Http::get(profile_update_url) From cec6ccc4b03582cf6d1203649c780942a555fb18 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 5 Jan 2026 18:20:54 +0800 Subject: [PATCH 40/51] feature add parameter for get language on the update describe --- src/libslic3r/AppConfig.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 3195d32579..c41d10e09c 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -1440,20 +1440,22 @@ std::string AppConfig::config_path() std::string AppConfig::get_preset_upgrade_url() { - std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL; + std::string localLanguage = get("language"); + std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL + std::string("/?language=") + localLanguage; auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL; + url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL + std::string("/?language=") + localLanguage; return url; } std::string AppConfig::get_web_resource_upgrade_url() { - std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL; + std::string localLanguage = get("language"); + std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL + std::string("/?language=") + localLanguage; auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL; + url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL + std::string("/?language=") + localLanguage; return url; } @@ -1461,10 +1463,11 @@ std::string AppConfig::get_web_resource_upgrade_url() std::string AppConfig::get_version_upgrade_url(bool stable_only /* = false*/) { //get local area and get the resource from diff server - std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL; + std::string localLanguage = get("language"); + std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL + std::string("/?language=") + localLanguage; auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + APP_UPDATE_URL; + url = APP_UPDATE_URL_BASE_CN + APP_UPDATE_URL + std::string("/?language=") + localLanguage; return url; } From 5d611bad086772dc602a59013a857b03f4c8e959 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 6 Jan 2026 11:11:27 +0800 Subject: [PATCH 41/51] feature code format. --- src/slic3r/GUI/GUI_App.cpp | 7 +++-- src/slic3r/Utils/PresetUpdater.cpp | 41 +++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 71616a018d..77ddd01d18 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4777,14 +4777,17 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) auto errCode = jsonData["code"]; if (errCode != 200) return; - // auto isFullUpgrade = jsonData["is_full_upgrade"]; + auto isFullUpgrade = jsonData["data"]["is_full_upgrade"]; auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; + auto versionType = jsonData["data"]["stable"]; + auto softPlatform = jsonData["data"]["platform_type"]; version_info.version_str = jsonData["data"]["version"]; auto fileSize = jsonData["data"]["full"]["file_size"]; auto fileMd5 = jsonData["data"]["full"]["file_md5"]; auto fileSha256 = jsonData["data"]["full"]["file_sha256"]; - version_info.url = jsonData["data"]["full"]["file_url"]; + //windows x86_x64, mac arm/x86_x64 universal + version_info.url = jsonData["data"]["full"]["file_url"]; version_info.description = jsonData["data"]["full"]["file_describe"]; version_info.force_upgrade = isForceUpgrade; diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 8b15071d6d..416787e4ec 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -736,21 +736,25 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) if (http_status != 200) return; try { - json jsonData = json::parse(body); - auto errCode = jsonData["code"]; + json jsonObj = json::parse(body); + auto errCode = jsonObj["code"]; if (errCode != 200) return; - auto buildNumber = jsonData["data"]["build_number"]; - auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; - auto minSupportPcVersion = jsonData["data"]["min_support_pc_version"]; - auto maxSupportPcVersion = jsonData["data"]["max_support_pc_version"]; - auto fileVersion = jsonData["data"]["file_version"]; - auto fileSize = jsonData["data"]["file_size"]; - auto fileMd5 = jsonData["data"]["file_md5"]; - auto fileSha256 = jsonData["data"]["file_sha256"]; - auto fileUrl = jsonData["data"]["file_url"]; - auto description = jsonData["data"]["file_describe"]; + auto dataObj = jsonObj.value("data", json::object()); + auto buildNumer = dataObj.value("build_number", ""); + auto minSupportPcVersion = dataObj.value("min_support_pc_version", ""); + auto maxSupportPcVersion = dataObj.value("max_support_pc_version", ""); + + auto isForceUpgrade = dataObj.value("is_force_upgrade", false); + auto fileVersion = dataObj.value("file_version", ""); + auto fileSize = dataObj.value("file_size", 0); + auto fileMd5 = dataObj.value("file_md5", ""); + auto fileSha256 = dataObj.value("file_sha256", ""); + auto fileUrl = dataObj.value("file_url", ""); + auto description = dataObj.value("file_describe", ""); + auto reserveData = dataObj.value("reserve_1", ""); + auto reserveData2 = dataObj.value("reserve_2", ""); auto localProfilesjson = cache_path / "flutter_web/version.json"; std::string json_path = data_dir() + "/web/flutter_web/version.json"; @@ -758,6 +762,17 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) Semver currentPresetVersion = get_version_from_json(json_path); Semver remoteVersion(fileVersion); + if (fileVersion.empty()) + { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); + } + return; + } + std::string localOtaPresetVersion = ""; if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); @@ -833,6 +848,8 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) auto fileSha256 = jsonData["data"]["file_sha256"]; auto fileUrl = jsonData["data"]["file_url"]; auto description = jsonData["data"]["file_describe"]; + auto reserverData = jsonData["data"]["reserver_1"]; + auto reserverData2 = jsonData["data"]["reserver_2"]; auto localProfilesjson = cache_path / "profiles/Snapmaker.json"; std::string json_path = data_dir() + "/system/Snapmaker.json"; From 3d2d7f556b2edcf58bf6d678104f27ae53c9d7ac Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 6 Jan 2026 14:35:27 +0800 Subject: [PATCH 42/51] feature update json data for safe read server res. --- src/slic3r/GUI/GUI_App.cpp | 39 ++++++++++++++++++--------- src/slic3r/Utils/PresetUpdater.cpp | 43 +++++++++++++++++++----------- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 77ddd01d18..bb93e83ec9 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4773,22 +4773,35 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) return; } try { - json jsonData = json::parse(body); - auto errCode = jsonData["code"]; + json jsonObj = json::parse(body); + auto errCode = jsonObj["code"]; if (errCode != 200) return; - auto isFullUpgrade = jsonData["data"]["is_full_upgrade"]; - auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; - auto versionType = jsonData["data"]["stable"]; - auto softPlatform = jsonData["data"]["platform_type"]; - version_info.version_str = jsonData["data"]["version"]; - auto fileSize = jsonData["data"]["full"]["file_size"]; - auto fileMd5 = jsonData["data"]["full"]["file_md5"]; - auto fileSha256 = jsonData["data"]["full"]["file_sha256"]; - //windows x86_x64, mac arm/x86_x64 universal - version_info.url = jsonData["data"]["full"]["file_url"]; - version_info.description = jsonData["data"]["full"]["file_describe"]; + auto dataObj = jsonObj.value("data", json::object()); + + auto isFullUpgrade = dataObj.value("is_full_upgrade", true); + auto isForceUpgrade = dataObj.value("is_force_upgrade", false); + + version_info.version_str = dataObj.value("version", ""); + auto releaseType = dataObj.value("release_type", ""); + auto platformType = dataObj.value("platform_type", ""); + int fileSize = 0; + std::string fileMd5 = ""; + std::string fileSha256 = ""; + std::string reservedData = ""; + std::string reservedData2 = ""; + + auto fullObj = dataObj.value("full", json::object()); + fileSize = fullObj.value("file_size", 0); + fileMd5 = fullObj.value("file_md5", ""); + fileSha256 = fullObj.value("file_sha256", ""); + // windows x86_x64, mac arm/x86_x64 universal + version_info.url = fullObj.value("file_url", ""); + version_info.description = fullObj.value("file_describe", ""); + reservedData = fullObj.value("reserved_1", ""); + reservedData2 = fullObj.value("reserved_2", ""); + version_info.force_upgrade = isForceUpgrade; std::regex matcher("[0-9]+\\.[0-9]+(\\.[0-9]+)*(-[A-Za-z0-9]+)?(\\+[A-Za-z0-9]+)?"); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 416787e4ec..3906ccbf74 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -727,7 +727,6 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) wxString errorMsg = wxString::Format(_L("request to server update web resource fail with body:%s,error:%s,status:%d"), body, error, http_status); evt->SetString(errorMsg); GUI::wxGetApp().QueueEvent(evt); - GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_update_flutter_resource", http_status, error); }) .timeout_connect(TIMEOUT_CONNECT) @@ -753,8 +752,8 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) auto fileSha256 = dataObj.value("file_sha256", ""); auto fileUrl = dataObj.value("file_url", ""); auto description = dataObj.value("file_describe", ""); - auto reserveData = dataObj.value("reserve_1", ""); - auto reserveData2 = dataObj.value("reserve_2", ""); + auto reservedData = dataObj.value("reserved_1", ""); + auto reservedData2 = dataObj.value("reserved_2", ""); auto localProfilesjson = cache_path / "flutter_web/version.json"; std::string json_path = data_dir() + "/web/flutter_web/version.json"; @@ -834,22 +833,24 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) if (http_status != 200) return; try { - json jsonData = json::parse(body); - auto errCode = jsonData["code"]; + json jsonObj = json::parse(body); + auto errCode = jsonObj["code"]; if (errCode != 200) return; - auto isForceUpgrade = jsonData["data"]["is_force_upgrade"]; - auto minSupportPcVersion = jsonData["data"]["min_support_pc_version"]; - auto maxSupportPcVersion = jsonData["data"]["max_support_pc_version"]; - auto fileVersion = jsonData["data"]["file_version"]; - auto fileSize = jsonData["data"]["file_size"]; - auto fileMd5 = jsonData["data"]["file_md5"]; - auto fileSha256 = jsonData["data"]["file_sha256"]; - auto fileUrl = jsonData["data"]["file_url"]; - auto description = jsonData["data"]["file_describe"]; - auto reserverData = jsonData["data"]["reserver_1"]; - auto reserverData2 = jsonData["data"]["reserver_2"]; + auto dataObj = jsonObj.value("data", json::object()); + + auto isForceUpgrade = dataObj.value("is_force_upgrade", false); + auto minSupportPcVersion = dataObj.value("min_support_pc_version", ""); + auto maxSupportPcVersion = dataObj.value("max_support_pc_version", ""); + auto fileVersion = dataObj.value("file_version", ""); + auto fileSize = dataObj.value("file_size", 0); + auto fileMd5 = dataObj.value("file_md5", ""); + auto fileSha256 = dataObj.value("file_sha256", ""); + auto fileUrl = dataObj.value("file_url", ""); + auto description = dataObj.value("file_describe", ""); + auto reservedData = dataObj.value("reserved_1", ""); + auto reservedData2 = dataObj.value("reserved_2", ""); auto localProfilesjson = cache_path / "profiles/Snapmaker.json"; std::string json_path = data_dir() + "/system/Snapmaker.json"; @@ -857,6 +858,16 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) Semver currentPresetVersion = get_version_from_json(json_path); Semver remoteVersion(fileVersion); + if (fileVersion.empty()) { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); + } + return; + } + std::string localOtaPresetVersion = ""; if (fs::exists(localProfilesjson)) { Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); From efff2b4700146726831e321ad9f94a717013d594 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 15 Jan 2026 09:36:28 +0800 Subject: [PATCH 43/51] feature update server address for request upgrade. --- src/libslic3r/AppConfig.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index c41d10e09c..c2c16142ca 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -39,19 +39,19 @@ namespace Slic3r { static const std::string VERSION_CHECK_URL_STABLE = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases/latest"; static const std::string VERSION_CHECK_URL = "https://api.github.com/repos/Snapmaker/OrcaSlicer/releases"; -static const std::string PROFILE_UPDATE_URL = "/upgrade/packages/profile/preset_config.json"; -static const std::string FLUTTER_UPDATE_URL = "/upgrade/packages/flutter/flutter_config.json"; +static const std::string PROFILE_UPDATE_URL = "/upgrade/profile/"; +static const std::string FLUTTER_UPDATE_URL = "/upgrade/flutter/"; static const std::string MODELS_STR = "models"; -#define APP_UPDATE_URL_BASE_CN "https://public.resource.snapmaker.com" -#define APP_UPDATE_URL_BASE_EN "https://public.resource.snapmaker.com" +#define APP_UPDATE_URL_BASE_CN "https://meta-cfg.snapmaker.cn" +#define APP_UPDATE_URL_BASE_EN "https://meta-cfg.snapmaker.com" #if defined(_WIN32) -static const std::string APP_UPDATE_URL = std::string("/upgrade/packages/orca/win/manifest.json"); +static const std::string APP_UPDATE_URL = std::string("/upgrade/orca/win/"); #elif defined(__APPLE__) -static const std::string APP_UPDATE_URL = std::string("/upgrade/packages/orca/mac/manifest.json"); +static const std::string APP_UPDATE_URL = std::string("/upgrade/orca/mac/"); #elif defined(__linux__) -static const std::string APP_UPDATE_URL = std::string("/upgrade/packages/orca/linux/manifest.json"); +static const std::string APP_UPDATE_URL = std::string("/upgrade/orca/linux/"); #else static const std::string APP_UPDATE_URL = ""; #endif @@ -1441,10 +1441,11 @@ std::string AppConfig::config_path() std::string AppConfig::get_preset_upgrade_url() { std::string localLanguage = get("language"); - std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL + std::string("/?language=") + localLanguage; + //("/upgrade/orca/win/"); + std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL + std::string("version.json"); auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL + std::string("/?language=") + localLanguage; + url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL + std::string("version.json"); return url; } @@ -1452,10 +1453,10 @@ std::string AppConfig::get_preset_upgrade_url() std::string AppConfig::get_web_resource_upgrade_url() { std::string localLanguage = get("language"); - std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL + std::string("/?language=") + localLanguage; + std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL + std::string("version.json"); auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL + std::string("/?language=") + localLanguage; + url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL + std::string("version.json"); return url; } @@ -1464,10 +1465,10 @@ std::string AppConfig::get_version_upgrade_url(bool stable_only /* = false*/) { //get local area and get the resource from diff server std::string localLanguage = get("language"); - std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL + std::string("/?language=") + localLanguage; + std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL + localLanguage + std::string("/version.json"); auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + APP_UPDATE_URL + std::string("/?language=") + localLanguage; + url = APP_UPDATE_URL_BASE_CN + APP_UPDATE_URL + localLanguage + std::string("/version.json"); return url; } From a4096ea6c8826d72dc8ee54a8b7064527f1dc9a3 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 15 Jan 2026 19:12:00 +0800 Subject: [PATCH 44/51] feature update soft upgrade logic for protocol. --- src/slic3r/GUI/GUI_App.cpp | 73 +++++++++++++++++----- src/slic3r/GUI/UpdateDialogs.cpp | 16 +---- src/slic3r/Utils/PresetUpdater.cpp | 99 ++++++++++++++++++------------ src/slic3r/Utils/PresetUpdater.hpp | 2 +- 4 files changed, 122 insertions(+), 68 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index bb93e83ec9..18f8cadb6a 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -964,8 +964,8 @@ void GUI_App::post_init() std::string network_ver = Slic3r::NetworkAgent::get_version(); bool sys_preset = app_config->get("sync_system_preset") == "true"; this->preset_updater->sync(http_url, language, network_ver, sys_preset ? preset_bundle : nullptr); - - this->check_new_version_sf(); + this->preset_updater->sync_web_async(true); + this->check_new_version_sf(false, false); }); } @@ -4754,14 +4754,15 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) AppConfig* app_config = wxGetApp().app_config; Http::get(update_url) - .on_error([&](std::string body, std::string error, unsigned http_status) { + .on_error([&, by_user](std::string body, std::string error, unsigned http_status) { (void)body; wxCommandEvent* evt = new wxCommandEvent(EVT_REQUEST_SERVER_FAIL); wxString errorMsg = wxString::Format(_L("request to server update soft fail with body:%s,error:%s,status:%d"), body, error, http_status); evt->SetString(errorMsg); - GUI::wxGetApp().QueueEvent(evt); + if(by_user) + GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(error) << format("Error getting: `%1%`: HTTP %2%, %3%", "check_new_version_sf", http_status, error); }) @@ -4778,10 +4779,10 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) if (errCode != 200) return; - auto dataObj = jsonObj.value("data", json::object()); - + auto dataObj = jsonObj.value("data", json::object()); auto isFullUpgrade = dataObj.value("is_full_upgrade", true); auto isForceUpgrade = dataObj.value("is_force_upgrade", false); + version_info.force_upgrade = isForceUpgrade; version_info.version_str = dataObj.value("version", ""); auto releaseType = dataObj.value("release_type", ""); @@ -4792,17 +4793,61 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) std::string reservedData = ""; std::string reservedData2 = ""; + // win x86_x64, mac arm/x86_x64 universal auto fullObj = dataObj.value("full", json::object()); - fileSize = fullObj.value("file_size", 0); - fileMd5 = fullObj.value("file_md5", ""); - fileSha256 = fullObj.value("file_sha256", ""); - // windows x86_x64, mac arm/x86_x64 universal - version_info.url = fullObj.value("file_url", ""); + auto defaultObj = fullObj.value("default", json::object()); + auto armObj = fullObj.value("arm", json::object()); + auto intelObj = fullObj.value("intel", json::object()); version_info.description = fullObj.value("file_describe", ""); - reservedData = fullObj.value("reserved_1", ""); - reservedData2 = fullObj.value("reserved_2", ""); - version_info.force_upgrade = isForceUpgrade; + if (platformType == "win") { + fileSize = defaultObj.value("file_size", 0); + fileMd5 = defaultObj.value("file_md5", ""); + fileSha256 = defaultObj.value("file_sha256", ""); + version_info.url = defaultObj.value("file_url", ""); + + reservedData = defaultObj.value("reserved_1", ""); + reservedData2 = defaultObj.value("reserved_2", ""); + } + else if (platformType == "mac") + { + + if (platformType == "arm") + { + fileSize = armObj.value("file_size", 0); + fileMd5 = armObj.value("file_md5", ""); + fileSha256 = armObj.value("file_sha256", ""); + version_info.url = armObj.value("file_url", ""); + + reservedData = armObj.value("reserved_1", ""); + reservedData2 = armObj.value("reserved_2", ""); + } + else if (platformType == "intel") + { + fileSize = intelObj.value("file_size", 0); + fileMd5 = intelObj.value("file_md5", ""); + fileSha256 = intelObj.value("file_sha256", ""); + version_info.url = intelObj.value("file_url", ""); + + reservedData = intelObj.value("reserved_1", ""); + reservedData2 = intelObj.value("reserved_2", ""); + } + + if (intelObj.empty() && armObj.empty()) { + fileSize = defaultObj.value("file_size", 0); + fileMd5 = defaultObj.value("file_md5", ""); + fileSha256 = defaultObj.value("file_sha256", ""); + version_info.url = defaultObj.value("file_url", ""); + + reservedData = defaultObj.value("reserved_1", ""); + reservedData2 = defaultObj.value("reserved_2", ""); + } + } + else + { + BOOST_LOG_TRIVIAL(warning) << "don't support linux upgrade"; + return; + } std::regex matcher("[0-9]+\\.[0-9]+(\\.[0-9]+)*(-[A-Za-z0-9]+)?(\\+[A-Za-z0-9]+)?"); Semver current_version = get_version(Snapmaker_VERSION, matcher); diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index 9a9f2eafd1..6f7c88151f 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -176,17 +176,12 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_ wxBoxSizer *content_sizer = new wxBoxSizer(wxVERTICAL); - - - - const auto lang_code = wxGetApp().current_language_code_safe().ToStdString(); auto *versions = new wxBoxSizer(wxVERTICAL); // BBS: use changelog string instead of url wxStaticText *changelog_textctrl = new wxStaticText(m_scrollwindw_release_note, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(560), -1)); - for (const auto &update : updates) { auto* versions = new wxBoxSizer(wxVERTICAL); wxStaticText* changelog_textctrl = new wxStaticText(m_scrollwindw_release_note, wxID_ANY, wxEmptyString, wxDefaultPosition, @@ -211,12 +206,8 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_ versions->Add(flex); - - - // BBS: use changelog string instead of url - - //auto change_log = new wxStaticText(m_scrollwindw_release_note, wxID_ANY, from_u8(update.change_log), wxDefaultPosition, wxDefaultSize); - changelog_textctrl->SetLabel(changelog_textctrl->GetLabel() + wxString::Format("%s\n", from_u8(update.change_log))); + //auto change_log = new wxStaticText(m_scrollwindw_release_note, wxID_ANY, from_u8(update.change_log), wxDefaultPosition, wxDefaultSize); + changelog_textctrl->SetLabel(changelog_textctrl->GetLabel() + wxString::Format("%s\n", from_u8(update.change_log))); content_sizer->Add(versions); @@ -224,16 +215,13 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_ if (changelog_textctrl) content_sizer->Add(changelog_textctrl, 1, wxEXPAND | wxTOP, FromDIP(30)); } - m_butto_ok->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { EndModal(wxID_OK); }); m_button_cancel->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { EndModal(wxID_CLOSE); }); - m_scrollwindw_release_note->SetSizer(content_sizer); m_scrollwindw_release_note->Layout(); - SetSizer(m_sizer_main); Layout(); m_sizer_main->Fit(this); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 3906ccbf74..4604c1a51b 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -726,7 +726,8 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) wxCommandEvent* evt = new wxCommandEvent(EVT_REQUEST_SERVER_FAIL); wxString errorMsg = wxString::Format(_L("request to server update web resource fail with body:%s,error:%s,status:%d"), body, error, http_status); evt->SetString(errorMsg); - GUI::wxGetApp().QueueEvent(evt); + if (!isAuto_check) + GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_update_flutter_resource", http_status, error); }) .timeout_connect(TIMEOUT_CONNECT) @@ -760,6 +761,24 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) std::string fileName = cache_profile_path.string() + "/flutter_web.zip"; Semver currentPresetVersion = get_version_from_json(json_path); Semver remoteVersion(fileVersion); + Semver minSpVersion(minSupportPcVersion); + Semver maxSpVersion(maxSupportPcVersion); + std::regex matcher("[0-9]+\\.[0-9]+(\\.[0-9]+)*(-[A-Za-z0-9]+)?(\\+[A-Za-z0-9]+)?"); + + auto get_version = [this](const std::string& str, const std::regex& regexp) + { + std::smatch match; + if (std::regex_match(str, match, regexp)) { + std::string version_cleaned = match[0]; + const boost::optional version = Semver::parse(version_cleaned); + if (version.has_value()) { + return *version; + } + } + return Semver::invalid(); + }; + + Semver currentSoftVersion = get_version(Snapmaker_VERSION, matcher); if (fileVersion.empty()) { @@ -772,24 +791,14 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) return; } - std::string localOtaPresetVersion = ""; - if (fs::exists(localProfilesjson)) { - Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); + if (currentSoftVersion > maxSpVersion || currentSoftVersion < minSpVersion) { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); - if (localOtaVersion > remoteVersion) - return; - else { - if (currentPresetVersion >= remoteVersion){ - if (!isAuto_check) { - wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); - GUI::wxGetApp().QueueEvent(evt); - - BOOST_LOG_TRIVIAL(info) << format("use check the web update."); - } - return; - } - + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); } + return; } if (currentPresetVersion < remoteVersion) @@ -824,7 +833,8 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) wxCommandEvent* evt = new wxCommandEvent(EVT_REQUEST_SERVER_FAIL); wxString errorMsg = wxString::Format(_L("request to server update preset resource fail with body:%s,error:%s,status:%d"), body,error, http_status); evt->SetString(errorMsg); - GUI::wxGetApp().QueueEvent(evt); + if (!isAuto_check) + GUI::wxGetApp().QueueEvent(evt); BOOST_LOG_TRIVIAL(info) << format("Error getting: `%1%`: HTTP %2%, %3%", "sync_config_orca", http_status, error); }) .timeout_connect(TIMEOUT_CONNECT) @@ -857,6 +867,24 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) std::string fileName = cache_profile_path.string() + "/profiles.zip"; Semver currentPresetVersion = get_version_from_json(json_path); Semver remoteVersion(fileVersion); + Semver minSpVersion(minSupportPcVersion); + Semver maxSpVersion(maxSupportPcVersion); + + std::regex matcher("[0-9]+\\.[0-9]+(\\.[0-9]+)*(-[A-Za-z0-9]+)?(\\+[A-Za-z0-9]+)?"); + + auto get_version = [this](const std::string& str, const std::regex& regexp) { + std::smatch match; + if (std::regex_match(str, match, regexp)) { + std::string version_cleaned = match[0]; + const boost::optional version = Semver::parse(version_cleaned); + if (version.has_value()) { + return *version; + } + } + return Semver::invalid(); + }; + + Semver currentSoftVersion = get_version(Snapmaker_VERSION, matcher); if (fileVersion.empty()) { if (!isAuto_check) { @@ -868,23 +896,15 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) return; } - std::string localOtaPresetVersion = ""; - if (fs::exists(localProfilesjson)) { - Semver localOtaVersion = get_version_from_json(localProfilesjson.string()); - //don't allow jump version. first upgrade localOta - if (localOtaVersion > currentPresetVersion) - return; - else - { - if (currentPresetVersion >= remoteVersion) { - if (!isAuto_check) {//show tipsdlg by user check upgrade - wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); - GUI::wxGetApp().QueueEvent(evt); - BOOST_LOG_TRIVIAL(info) << format("use check the preset update."); - } - return; - } - } + if (currentSoftVersion > maxSpVersion || currentSoftVersion < minSpVersion) + { + if (!isAuto_check) { + wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); + GUI::wxGetApp().QueueEvent(evt); + + BOOST_LOG_TRIVIAL(info) << format("use check the web update."); + } + return; } if (currentPresetVersion < remoteVersion) @@ -1675,7 +1695,7 @@ bool PresetUpdater::install_bundles_rsrc(std::vector bundles, bool return p->install_bundles_rsrc(bundles, snapshot); } -void PresetUpdater::sync_web_async() +void PresetUpdater::sync_web_async(bool isAutoUpdata) { if (p->thread.joinable()) { p->cancel = true; @@ -1683,9 +1703,9 @@ void PresetUpdater::sync_web_async() } p->cancel = false; - p->thread = std::thread([this]() { + p->thread = std::thread([this, isAutoUpdata]() { BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_web_async started"; - this->p->sync_update_flutter_resource(false); + this->p->sync_update_flutter_resource(isAutoUpdata); GUI::wxGetApp().CallAfter([this] { std::string zipfilepath = this->p->cache_path.string() + "/flutter_web.zip"; @@ -1783,7 +1803,8 @@ void PresetUpdater::load_lutter_web(const std::string& zip_file, bool serverUpda boost::filesystem::create_directories(temp_path); if (!p->extract_file(zip_file, temp_path.string())) { - GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); + if (!serverUpdate) + GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); return; } diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index b18857245a..f309654c5d 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -69,7 +69,7 @@ public: void sync_config_async(); - void sync_web_async(); + void sync_web_async(bool isAutoUpdata = false); public: struct priv; std::unique_ptr p; From 0b53a5a555a0c40d0726e238f22f16f63a908fc7 Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 16 Jan 2026 10:31:25 +0800 Subject: [PATCH 45/51] feature update protocol for upgrade soft. --- src/slic3r/GUI/GUI_App.cpp | 56 ++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 18f8cadb6a..4fb1a9a61f 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4811,37 +4811,33 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) } else if (platformType == "mac") { + bool isArm64 = false; +#if defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) + isArm64 = true; +#else + isArm64 = false; +#endif + json platformObj = defaultObj; + if (isArm64) { + if (!armObj.empty()) { + platformObj = armObj; + } + } + else + { + if (!intelObj.empty()) { + platformObj = intelObj; + } + } + + fileSize = platformObj.value("file_size", 0); + fileMd5 = platformObj.value("file_md5", ""); + fileSha256 = platformObj.value("file_sha256", ""); + version_info.url = platformObj.value("file_url", ""); + + reservedData = platformObj.value("reserved_1", ""); + reservedData2 = platformObj.value("reserved_2", ""); - if (platformType == "arm") - { - fileSize = armObj.value("file_size", 0); - fileMd5 = armObj.value("file_md5", ""); - fileSha256 = armObj.value("file_sha256", ""); - version_info.url = armObj.value("file_url", ""); - - reservedData = armObj.value("reserved_1", ""); - reservedData2 = armObj.value("reserved_2", ""); - } - else if (platformType == "intel") - { - fileSize = intelObj.value("file_size", 0); - fileMd5 = intelObj.value("file_md5", ""); - fileSha256 = intelObj.value("file_sha256", ""); - version_info.url = intelObj.value("file_url", ""); - - reservedData = intelObj.value("reserved_1", ""); - reservedData2 = intelObj.value("reserved_2", ""); - } - - if (intelObj.empty() && armObj.empty()) { - fileSize = defaultObj.value("file_size", 0); - fileMd5 = defaultObj.value("file_md5", ""); - fileSha256 = defaultObj.value("file_sha256", ""); - version_info.url = defaultObj.value("file_url", ""); - - reservedData = defaultObj.value("reserved_1", ""); - reservedData2 = defaultObj.value("reserved_2", ""); - } } else { From 25909a398e0affba686b5b8863e4ef7d19a3a9db Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 16 Jan 2026 10:51:15 +0800 Subject: [PATCH 46/51] fix update machine ip error bug. --- src/slic3r/GUI/SSWCP.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/SSWCP.cpp b/src/slic3r/GUI/SSWCP.cpp index 70364b2ad5..a401ca5a4b 100644 --- a/src/slic3r/GUI/SSWCP.cpp +++ b/src/slic3r/GUI/SSWCP.cpp @@ -1858,7 +1858,7 @@ void SSWCP_MachineFind_Instance::sw_StopMachineFind() void SSWCP_MachineFind_Instance::add_machine_to_list(const json& machine_info) { try { - BOOST_LOG_TRIVIAL(info) << "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT" << machine_info.dump(); + BOOST_LOG_TRIVIAL(info) << "check the machine list on json: " << machine_info.dump(); for (const auto& [key, value] : machine_info.items()) { std::string sn = value["sn"].get(); bool need_send = false; @@ -1881,7 +1881,7 @@ void SSWCP_MachineFind_Instance::add_machine_to_list(const json& machine_info) m_res_data[key]["connected"] = true; } std::string ip = value["ip"].get(); - if (info.ip != ip && info.link_mode != "wan") { + if (0) { info.ip = ip; wxGetApp().app_config->save_device_info(info); From ba6d25c9bea4c6e2cf28e10d004050276f550875 Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 16 Jan 2026 11:07:00 +0800 Subject: [PATCH 47/51] feature remove the login page not work logic. --- src/slic3r/GUI/WebSMUserLoginDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/WebSMUserLoginDialog.cpp b/src/slic3r/GUI/WebSMUserLoginDialog.cpp index 58c17c6f80..79fa7c3450 100644 --- a/src/slic3r/GUI/WebSMUserLoginDialog.cpp +++ b/src/slic3r/GUI/WebSMUserLoginDialog.cpp @@ -91,7 +91,7 @@ SMUserLogin::SMUserLogin(bool isLogout) : wxDialog((wxWindow *) (wxGetApp().main Bind(wxEVT_WEBVIEW_NEWWINDOW, &SMUserLogin::OnNewWindow, this, m_browser->GetId()); Bind(wxEVT_WEBVIEW_TITLE_CHANGED, &SMUserLogin::OnTitleChanged, this, m_browser->GetId()); Bind(wxEVT_WEBVIEW_FULLSCREEN_CHANGED, &SMUserLogin::OnFullScreenChanged, this, m_browser->GetId()); - Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &SMUserLogin::OnScriptMessage, this, m_browser->GetId()); + //Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &SMUserLogin::OnScriptMessage, this, m_browser->GetId()); // Connect the idle events // Bind(wxEVT_IDLE, &SMUserLogin::OnIdle, this); From 92d5b560dd6b4a17912bec0cc5ea2ea49605c488 Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 16 Jan 2026 12:00:46 +0800 Subject: [PATCH 48/51] feature update sentry dsn. --- src/sentry_wrapper/SentryWrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry_wrapper/SentryWrapper.cpp b/src/sentry_wrapper/SentryWrapper.cpp index 562e82b0d4..53cfc6544f 100644 --- a/src/sentry_wrapper/SentryWrapper.cpp +++ b/src/sentry_wrapper/SentryWrapper.cpp @@ -127,7 +127,7 @@ static sentry_value_t before_send(sentry_value_t event, void* hint, void* data) void initSentryEx() { sentry_options_t* options = sentry_options_new(); - std::string dsn = std::string("https://c74b617c2aedc291444d3a238d23e780@o4508125599563776.ingest.us.sentry.io/4510425163956224"); + std::string dsn = std::string("https://282935326eecb9758e7f84a2ad3ae0ab@o4508125599563776.ingest.us.sentry.io/4510425163956224"); { sentry_options_set_dsn(options, dsn.c_str()); std::string handlerDir = ""; From f374b14ea0f2f43c27f782b3b0a32fa29536e12e Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 16 Jan 2026 15:36:30 +0800 Subject: [PATCH 49/51] feature add logic for force upgrade dialog res. --- src/slic3r/GUI/GUI_App.cpp | 4 +++- src/slic3r/GUI/ReleaseNote.cpp | 19 ++----------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index e506b384d4..d6760551f9 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2521,7 +2521,6 @@ bool GUI_App::on_init_inner() UpdateVersionDialog dialog(this->mainframe); wxString extmsg = wxString::FromUTF8(version_info.description); dialog.update_version_info(extmsg, version_info.version_str); - //dialog.update_version_info(version_info.description); if (evt.GetInt() != 0) { dialog.m_button_skip_version->Hide(); } @@ -2561,6 +2560,9 @@ bool GUI_App::on_init_inner() case wxID_NO: wxGetApp().mainframe->Close(true); break; + case wxID_CANCEL: + wxGetApp().mainframe->Close(true); + break; default: wxGetApp().mainframe->Close(true); } diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index b8f2b0a210..f67f9a5d05 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -96,7 +96,6 @@ ReleaseNoteDialog::ReleaseNoteDialog(Plater *plater /*= nullptr*/) ReleaseNoteDialog::~ReleaseNoteDialog() {} - void ReleaseNoteDialog::on_dpi_changed(const wxRect &suggested_rect) { } @@ -129,19 +128,14 @@ UpdatePluginDialog::UpdatePluginDialog(wxWindow* parent /*= nullptr*/) m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(30)); wxBoxSizer* m_sizer_body = new wxBoxSizer(wxHORIZONTAL); - - - auto sm = create_scaled_bitmap("Snapmaker_Orca", nullptr, 55); auto brand = new wxStaticBitmap(this, wxID_ANY, sm, wxDefaultPosition, wxSize(FromDIP(55), FromDIP(55))); - wxBoxSizer* m_sizer_right = new wxBoxSizer(wxVERTICAL); m_text_up_info = new Label(this, Label::Head_13, wxEmptyString, LB_AUTO_WRAP); m_text_up_info->SetMaxSize(wxSize(FromDIP(260), -1)); m_text_up_info->SetForegroundColour(wxColour(0x26, 0x2E, 0x30)); - operation_tips = new ::Label(this, Label::Body_12, _L("Click OK to update the Network plug-in when Snapmaker Orca launches next time."), LB_AUTO_WRAP); operation_tips->SetMinSize(wxSize(FromDIP(260), -1)); operation_tips->SetMaxSize(wxSize(FromDIP(260), -1)); @@ -213,7 +207,6 @@ UpdatePluginDialog::UpdatePluginDialog(wxWindow* parent /*= nullptr*/) UpdatePluginDialog::~UpdatePluginDialog() {} - void UpdatePluginDialog::on_dpi_changed(const wxRect& suggested_rect) { } @@ -269,18 +262,11 @@ UpdateVersionDialog::UpdateVersionDialog(wxWindow *parent) auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); - - wxBoxSizer *m_sizer_body = new wxBoxSizer(wxHORIZONTAL); - - - + wxBoxSizer *m_sizer_body = new wxBoxSizer(wxHORIZONTAL); auto sm = create_scaled_bitmap("Snapmaker_Orca", nullptr, 70); - m_brand = new wxStaticBitmap(this, wxID_ANY, sm, wxDefaultPosition, wxSize(FromDIP(70), FromDIP(70))); - - + m_brand = new wxStaticBitmap(this, wxID_ANY, sm, wxDefaultPosition, wxSize(FromDIP(70), FromDIP(70))); wxBoxSizer *m_sizer_right = new wxBoxSizer(wxVERTICAL); - m_text_up_info = new Label(this, Label::Head_14, wxEmptyString, LB_AUTO_WRAP); m_text_up_info->SetForegroundColour(wxColour(0x26, 0x2E, 0x30)); @@ -424,7 +410,6 @@ UpdateVersionDialog::UpdateVersionDialog(wxWindow *parent) UpdateVersionDialog::~UpdateVersionDialog() {} - wxWebView* UpdateVersionDialog::CreateTipView(wxWindow* parent) { wxWebView* tipView = WebView::CreateWebView(parent, ""); From d6f2972429a6bef8a2f949a700c8a5d74856b6a5 Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 16 Jan 2026 17:54:33 +0800 Subject: [PATCH 50/51] feature diff country on local area for update preset web resource. --- src/libslic3r/AppConfig.cpp | 21 +++++++++++++-------- src/slic3r/GUI/GUI_App.cpp | 3 ++- src/slic3r/GUI/MainFrame.cpp | 4 ++-- src/slic3r/GUI/MsgDialog.cpp | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index c2c16142ca..de8814679e 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -1441,11 +1441,12 @@ std::string AppConfig::config_path() std::string AppConfig::get_preset_upgrade_url() { std::string localLanguage = get("language"); - //("/upgrade/orca/win/"); - std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL + std::string("version.json"); - auto countryArea = get_country_code(); + if (localLanguage != "zh_CN") + localLanguage = "en"; + std::string url = APP_UPDATE_URL_BASE_EN + PROFILE_UPDATE_URL + localLanguage + std::string("/version.json"); + auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL + std::string("version.json"); + url = APP_UPDATE_URL_BASE_CN + PROFILE_UPDATE_URL + localLanguage + std::string("/version.json"); return url; } @@ -1453,10 +1454,12 @@ std::string AppConfig::get_preset_upgrade_url() std::string AppConfig::get_web_resource_upgrade_url() { std::string localLanguage = get("language"); - std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL + std::string("version.json"); - auto countryArea = get_country_code(); + if (localLanguage != "zh_CN") + localLanguage = "en"; + std::string url = APP_UPDATE_URL_BASE_EN + FLUTTER_UPDATE_URL + localLanguage + std::string("/version.json"); + auto countryArea = get_country_code(); if (countryArea == std::string("CN")) - url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL + std::string("version.json"); + url = APP_UPDATE_URL_BASE_CN + FLUTTER_UPDATE_URL + localLanguage + std::string("/version.json"); return url; } @@ -1465,7 +1468,9 @@ std::string AppConfig::get_version_upgrade_url(bool stable_only /* = false*/) { //get local area and get the resource from diff server std::string localLanguage = get("language"); - std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL + localLanguage + std::string("/version.json"); + if (localLanguage != "zh_CN") + localLanguage = "en"; + std::string url = APP_UPDATE_URL_BASE_EN + APP_UPDATE_URL + localLanguage + std::string("/version.json"); auto countryArea = get_country_code(); if (countryArea == std::string("CN")) url = APP_UPDATE_URL_BASE_CN + APP_UPDATE_URL + localLanguage + std::string("/version.json"); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index d6760551f9..b528aab5df 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2549,7 +2549,7 @@ bool GUI_App::on_init_inner() false, wxCENTER | wxICON_INFORMATION); dialog.SetExtendedMessage(description_text); - + int result = dialog.ShowModal(); switch (result) { @@ -4862,6 +4862,7 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) return; } + //if (true) if (isForceUpgrade) { wxGetApp().app_config->set_bool("force_upgrade", version_info.force_upgrade); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 94c67c8d20..2eb43b2cfd 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2298,7 +2298,7 @@ static wxMenu* generate_help_menu() }); append_menu_item( - helpMenu, wxID_ANY, _L("Check for Preset Update"), _L("Check for Preset Update"), + helpMenu, wxID_ANY, _L("Check for Process Preset Updates"), _L("Check for Process Preset Updates"), [](wxCommandEvent&) { wxGetApp().check_preset_version(); @@ -2306,7 +2306,7 @@ static wxMenu* generate_help_menu() "", nullptr, []() { return true; }); append_menu_item( - helpMenu, wxID_ANY, _L("Check for Web Update"), _L("Check for Web Update"), + helpMenu, wxID_ANY, _L("Check for Web ResourceUpdates"), _L("Check for Web ResourceUpdates"), [](wxCommandEvent&) { wxGetApp().check_web_version(); }, diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index b7d9b63e8b..31cff49156 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -441,7 +441,7 @@ DownloadDialog::DownloadDialog(wxWindow *parent, const wxString &msg, const wxSt : MsgDialog(parent, title, msg, style), msg(msg) { add_button(wxID_YES, true, _L("Download")); - add_button(wxID_CANCEL, true, _L("Skip")); + //add_button(wxID_CANCEL, true, _L("Skip")); finalize(); } From 101929e636ce7b61edef4d755d956ebbfa454cb3 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 19 Jan 2026 11:11:01 +0800 Subject: [PATCH 51/51] feature update web recourse on sync. --- src/slic3r/GUI/GUI_App.cpp | 4 ++-- src/slic3r/Utils/PresetUpdater.cpp | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index b528aab5df..41a9e0a268 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -963,7 +963,7 @@ void GUI_App::post_init() std::string language = GUI::into_u8(current_language_code()); std::string network_ver = Slic3r::NetworkAgent::get_version(); bool sys_preset = app_config->get("sync_system_preset") == "true"; - this->preset_updater->sync(http_url, language, network_ver, sys_preset ? preset_bundle : nullptr); + //this->preset_updater->sync(http_url, language, network_ver, sys_preset ? preset_bundle : nullptr); this->preset_updater->sync_web_async(true); this->check_new_version_sf(false, false); @@ -4881,7 +4881,7 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user) GUI::wxGetApp().QueueEvent(evt); } catch (...) {} }) - .perform(); + .perform_sync(); } void GUI_App::process_network_msg(std::string dev_id, std::string msg) { diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 4604c1a51b..54ce378d9e 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -203,6 +203,8 @@ struct PresetUpdater::priv bool cancel; std::thread thread; + bool m_web_thread_cancel; + std::thread m_web_resource_thread; bool has_waiting_updates { false }; Updates waiting_updates; bool has_waiting_printer_updates { false }; @@ -1536,6 +1538,12 @@ PresetUpdater::~PresetUpdater() p->cancel = true; p->thread.join(); } + + if (p && p->m_web_resource_thread.joinable()) + { + p->m_web_thread_cancel = true; + p->m_web_resource_thread.join(); + } } //BBS: change directories by design @@ -1697,13 +1705,13 @@ bool PresetUpdater::install_bundles_rsrc(std::vector bundles, bool void PresetUpdater::sync_web_async(bool isAutoUpdata) { - if (p->thread.joinable()) { - p->cancel = true; - p->thread.join(); + if (p->m_web_resource_thread.joinable()) { + p->m_web_thread_cancel = true; + p->m_web_resource_thread.join(); } - p->cancel = false; - p->thread = std::thread([this, isAutoUpdata]() { + p->m_web_thread_cancel = false; + p->m_web_resource_thread = std::thread([this, isAutoUpdata]() { BOOST_LOG_TRIVIAL(debug) << "[Orca Updater] sync_web_async started"; this->p->sync_update_flutter_resource(isAutoUpdata);