From 1f9f834d792ee66551ce62dc86eafe5a0a5f8634 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 29 Dec 2025 14:34:15 +0800 Subject: [PATCH 01/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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());