Merge pull request #133 from Snapmaker/dev_upgrade_alves

Dev upgrade alves
This commit is contained in:
Alves
2026-01-28 15:35:29 +08:00
committed by GitHub
28 changed files with 335 additions and 223 deletions
+119 -88
View File
@@ -30,7 +30,9 @@
#include <cstdlib>
#include <atomic>
#include <random>
#include <mutex>
#include "common_func/common_func.hpp"
#include <iostream>
namespace Slic3r {
@@ -63,67 +65,6 @@ static sentry_value_t on_crash_callback(const sentry_ucontext_t* uctx, sentry_va
return log;
}
static sentry_value_t before_send(sentry_value_t event, void* hint, void* data)
{
sentry_value_t level_val = sentry_value_get_by_key(event, SENTRY_KEY_LEVEL);
std::string levelName = sentry_value_as_string(level_val);
std::string eventLevel = sentry_value_as_string(sentry_value_get_by_key(event, SENTRY_KEY_LEVEL));
//module name
sentry_value_t moduleValue = sentry_value_get_by_key(event, "logger");
std::string moduleName = sentry_value_as_string(moduleValue);
if (MACHINE_MODULE == moduleName)
{
srand((unsigned int) time(0));
int random_num = rand() % 100;
int randNumber = rand() % 100 + 1;
if (randNumber < 85)
{
sentry_value_decref(event);
return sentry_value_new_null();
}
else
{
return event;
}
}
if (!get_privacy_policy() && levelName == SENTRY_EVENT_TRACE) {
sentry_value_decref(event);
return sentry_value_new_null();
}
if (SENTRY_EVENT_FATAL == eventLevel ||
SENTRY_EVENT_ERROR == eventLevel ||
SENTRY_EVENT_TRACE == eventLevel)
{
return event;
}
else if (SENTRY_EVENT_WARNING == eventLevel)
{
srand((unsigned int) time(0));
int random_num = rand() % 100;
int randNumber = rand() % 100 + 1;
if (randNumber > 5)
{
sentry_value_decref(event);
return sentry_value_new_null();
}
else
{
return event;
}
}
//info trace debug not report
sentry_value_decref(event);
return sentry_value_new_null();
}
void initSentryEx()
{
sentry_options_t* options = sentry_options_new();
@@ -154,43 +95,134 @@ void initSentryEx()
dataBaseDir = home_env;
dataBaseDir = dataBaseDir + "/Library/Application Support/Snapmaker_Orca/SentryData";
#elif _WIN32
wchar_t exeDir[MAX_PATH];
::GetModuleFileNameW(nullptr, exeDir, MAX_PATH);
std::wstring wsExeDir(exeDir);
int nPos = wsExeDir.find_last_of('\\');
std::wstring wsDmpDir = wsExeDir.substr(0, nPos + 1);
std::wstring desDir = wsDmpDir + L"crashpad_handler.exe";
wsDmpDir += L"dump";
// Use extended path length support for Windows (up to 32767 characters)
const DWORD MAX_PATH_EXTENDED = 32767;
wchar_t exeDir[MAX_PATH_EXTENDED];
DWORD pathLen = ::GetModuleFileNameW(nullptr, exeDir, MAX_PATH_EXTENDED);
// GetModuleFileNameW returns 0 on error, or the number of characters written (excluding null terminator)
// If return value equals buffer size, the path was truncated
if (pathLen == 0) {
// Failed to get module path, use fallback
DWORD lastError = GetLastError();
std::cout<< "Failed to get module file name, error: " << lastError;
handlerDir = "";
dataBaseDir = "";
} else if (pathLen >= MAX_PATH_EXTENDED) {
// Path was truncated, which shouldn't happen with MAX_PATH_EXTENDED
std::cout<< "Module file path too long or truncated, length: " << pathLen;
handlerDir = "";
dataBaseDir = "";
} else {
// Ensure null termination (GetModuleFileNameW should do this, but be safe)
exeDir[pathLen] = L'\0';
std::wstring wsExeDir(exeDir, pathLen);
size_t nPos = wsExeDir.find_last_of(L'\\');
if (nPos == std::wstring::npos) {
// No backslash found, use current directory as fallback
std::cout<< "No backslash found in executable path, using current directory";
nPos = 0;
}
// Ensure nPos + 1 doesn't exceed string length
if (nPos + 1 > wsExeDir.length()) {
std::cout<< "Invalid path position, using full path";
nPos = wsExeDir.length();
}
std::wstring wsDmpDir = wsExeDir.substr(0, nPos + 1);
std::wstring desDir = wsDmpDir + L"crashpad_handler.exe";
wsDmpDir += L"dump";
auto wstringTostring = [](std::wstring wTmpStr) -> std::string {
std::string resStr = std::string();
int len = WideCharToMultiByte(CP_UTF8, 0, wTmpStr.c_str(), -1, nullptr, 0, nullptr, nullptr);
if (len <= 0)
return std::string();
auto wstringTostring = [](const std::wstring& wTmpStr) -> std::string {
if (wTmpStr.empty())
return std::string();
int len = WideCharToMultiByte(CP_UTF8, 0, wTmpStr.c_str(), -1, nullptr, 0, nullptr, nullptr);
if (len <= 0) {
std::cout<< "WideCharToMultiByte failed, error: " << GetLastError();
return std::string();
}
std::string desStr(len, 0);
WideCharToMultiByte(CP_UTF8, 0, wTmpStr.c_str(), -1, &desStr[0], len, nullptr, nullptr);
resStr = desStr;
// Allocate buffer with size len (includes null terminator)
std::string desStr;
desStr.resize(len - 1); // Reserve space excluding null terminator
int result = WideCharToMultiByte(CP_UTF8, 0, wTmpStr.c_str(), -1, &desStr[0], len, nullptr, nullptr);
if (result == 0 || result != len) {
std::cout<< "WideCharToMultiByte conversion failed, error: " << GetLastError();
return std::string();
}
// Remove null terminator if present (safely check before accessing)
if (!desStr.empty() && desStr.back() == '\0')
desStr.pop_back();
return resStr;
};
return desStr;
};
handlerDir = wstringTostring(desDir);
handlerDir = wstringTostring(desDir);
}
// Get LocalAppData folder path
PWSTR pszPath = nullptr;
char* path = new char[MAX_PATH]();
char* path = nullptr;
size_t pathLength = 0;
HRESULT hr = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr, &pszPath);
if (SUCCEEDED(hr)) {
wcstombs_s(&pathLength, path, MAX_PATH, pszPath, MAX_PATH);
if (SUCCEEDED(hr) && pszPath != nullptr) {
// Calculate required buffer size first
size_t wcsLen = wcslen(pszPath);
if (wcsLen > 0 && wcsLen < SIZE_MAX / 3) { // Check for overflow
// Allocate buffer with extra space for safety
size_t requiredSize = wcsLen * 3 + 1; // UTF-8 can be up to 3 bytes per wchar
path = new (std::nothrow) char[requiredSize]();
if (path != nullptr) {
errno_t err = wcstombs_s(&pathLength, path, requiredSize, pszPath, _TRUNCATE);
if (err != 0) {
std::cout<< "wcstombs_s failed, error: " << err;
delete[] path;
path = nullptr;
}
} else {
std::cout<< "Failed to allocate memory for path conversion";
}
} else if (wcsLen == 0) {
std::cout<< "SHGetKnownFolderPath returned empty path";
} else {
std::cout<< "Path length overflow detected: " << wcsLen;
}
// Always free the path returned by SHGetKnownFolderPath
CoTaskMemFree(pszPath);
}
pszPath = nullptr;
} else {
std::cout<< "SHGetKnownFolderPath failed, hr: " << std::hex << hr;
// Ensure pszPath is freed even on failure (though it should be nullptr)
if (pszPath != nullptr) {
CoTaskMemFree(pszPath);
pszPath = nullptr;
}
}
std::string filePath = path;
std::string appName = "\\" + std::string("Snapmaker_Orca\\");
dataBaseDir = filePath + appName;
delete[] path;
if (path != nullptr) {
std::string filePath = path;
std::string appName = "\\" + std::string("Snapmaker_Orca\\");
dataBaseDir = filePath + appName;
delete[] path;
path = nullptr;
} else {
// Fallback: use temp directory
char tempPath[MAX_PATH];
if (GetTempPathA(MAX_PATH, tempPath) != 0) {
dataBaseDir = std::string(tempPath) + "Snapmaker_Orca\\";
std::cout<< "Using temp directory as fallback for Sentry data: " << dataBaseDir;
} else {
dataBaseDir = "";
std::cout<< "Failed to get temp path, Sentry data directory will be empty";
}
}
#endif
if (!handlerDir.empty())
@@ -211,7 +243,6 @@ void initSentryEx()
sentry_options_set_auto_session_tracking(options, 0);
sentry_options_set_symbolize_stacktraces(options, 1);
sentry_options_set_on_crash(options, on_crash_callback, NULL);
sentry_options_set_before_send(options, before_send, NULL);
sentry_options_set_sample_rate(options, 1.0);
sentry_options_set_traces_sample_rate(options, 1.0);
+1 -1
View File
@@ -846,7 +846,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
apply(config, &new_conf);
}
toggle_line("overhang_reverse_threshold", has_detect_overhang_wall && allow_overhang_reverse && has_overhang_reverse && !has_overhang_reverse_internal_only);
toggle_line("timelapse_type", true);
toggle_line("timelapse_type", is_BBL_Printer);
bool have_small_area_infill_flow_compensation = config->opt_bool("small_area_infill_flow_compensation");
+26 -37
View File
@@ -2516,24 +2516,16 @@ bool GUI_App::on_init_inner()
skip_this_version = false;
}
}
if (!skip_this_version
|| evt.GetInt() != 0) {
UpdateVersionDialog dialog(this->mainframe);
if (!skip_this_version || evt.GetInt() != 0) {
wxString extmsg = wxString::FromUTF8(version_info.description);
dialog.update_version_info(extmsg, version_info.version_str);
m_updateDialog->update_version_info(extmsg, version_info.version_str);
if (evt.GetInt() != 0) {
dialog.m_button_skip_version->Hide();
}
switch (dialog.ShowModal())
{
case wxID_YES:
wxLaunchDefaultBrowser(version_info.url);
break;
case wxID_NO:
break;
default:
;
m_updateDialog->m_button_skip_version->Hide();
}
m_updateDialog->Raise();
m_updateDialog->Show();
m_updateDialog->setUrl(version_info.url);
}
}
});
@@ -2669,6 +2661,13 @@ bool GUI_App::on_init_inner()
BOOST_LOG_TRIVIAL(info) << "create the main window";
mainframe = new MainFrame();
m_updateDialog = new UpdateVersionDialog(mainframe);
m_updateDialog->Hide();
m_updateDialog->Bind(EVT_DOWN_URL_PACK, [this](wxCommandEvent& event) {
auto downloadUlr = m_updateDialog->getUrl();
wxLaunchDefaultBrowser(downloadUlr);
});
// hide settings tabs after first Layout
if (is_editor()) {
mainframe->select_tab(size_t(0));
@@ -4045,18 +4044,14 @@ wxString GUI_App::get_international_url(const wxString& origin_url) {
string dark_mode = wxGetApp().app_config->get("dark_color_mode");
auto isAgree = wxGetApp().app_config->get("app", "privacy_policy_isagree");
std::string useAgree = (isAgree == "true" ? "1" : "0");
if (baseUrl.find("?") != std::string::npos) {
return baseUrl + wxString::FromUTF8("&locale=") + lang + wxString::FromUTF8("-") + region +
wxString::FromUTF8("&dark_mode=" + dark_mode) + wxString::FromUTF8("&privacy_policy_isagree=" + useAgree);
wxString::FromUTF8("&dark_mode=" + dark_mode);
} else {
return baseUrl + wxString::FromUTF8("?locale=") + lang + wxString::FromUTF8("-") + region +
wxString::FromUTF8("&dark_mode=" + dark_mode) + wxString::FromUTF8("&privacy_policy_isagree=" + useAgree);
wxString::FromUTF8("&dark_mode=" + dark_mode);
}
}
bool GUI_App::is_user_login()
@@ -4857,12 +4852,12 @@ 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 && by_user) {
this->no_new_version();
if (current_version >= server_version) {
if(by_user)
this->no_new_version();
return;
}
//if (true)
if (isForceUpgrade)
{
wxGetApp().app_config->set_bool("force_upgrade", version_info.force_upgrade);
@@ -4879,7 +4874,10 @@ void GUI_App::check_new_version_sf(bool show_tips, bool by_user)
if (by_user)
evt->SetInt(UPDATE_BY_USER);
GUI::wxGetApp().QueueEvent(evt);
} catch (...) {}
} catch (const std::exception& ex) {
std::string errorMsg = ex.what();
BOOST_LOG_TRIVIAL(fatal) << "request server soft update data error:" << errorMsg;
}
})
.perform_sync();
}
@@ -6690,15 +6688,6 @@ bool GUI_App::run_wizard(ConfigWizard::RunReason reason, ConfigWizard::StartPage
{
wxCHECK_MSG(mainframe != nullptr, false, "Internal error: Main frame not created / null");
//if (reason == ConfigWizard::RR_USER) {
// //TODO: turn off it currently, maybe need to turn on in the future
// if (preset_updater->config_update(app_config->orig_version(), PresetUpdater::UpdateParams::FORCED_BEFORE_WIZARD) == PresetUpdater::R_ALL_CANCELED)
// return false;
//}
//auto wizard_t = new ConfigWizard(mainframe);
//const bool res = wizard_t->run(reason, start_page);
std::string strFinish = wxGetApp().app_config->get("firstguide", "finish");
long pStyle = wxCAPTION | wxCLOSE_BOX | wxSYSTEM_MENU;
if (strFinish == "false" || strFinish.empty())
@@ -6719,7 +6708,7 @@ bool GUI_App::run_wizard(ConfigWizard::RunReason reason, ConfigWizard::StartPage
mainframe->refresh_plugin_tips();
// BBS: remove SLA related message
}
auto isAgree = wxGetApp().app_config->get("app", "privacy_policy_isagree");
auto isAgree = wxGetApp().app_config->get("app", PRIVACY_POLICY_FLAGS);
user_update_privacy_notify(isAgree == "true");
BOOST_LOG_TRIVIAL(warning) << "run_wizard changed the privacy policy with: " << (isAgree);
@@ -6932,7 +6921,7 @@ void GUI_App::user_update_privacy_notify(const bool& res)
json data;
data["privacy_policy_isagree"] = res;
data[PRIVACY_POLICY_FLAGS] = res;
for (const auto& instance : m_user_update_privacy_subscribers) {
auto ptr = instance.second.lock();
@@ -6957,7 +6946,7 @@ void GUI_App::user_login_notify(const json& res)
bool GUI_App::config_wizard_startup()
{
auto isAgree = wxGetApp().app_config->get("app", "privacy_policy_isagree");
auto isAgree = wxGetApp().app_config->get("app", PRIVACY_POLICY_FLAGS);
user_update_privacy_notify(isAgree == "true");
BOOST_LOG_TRIVIAL(warning) << "config_wizard_startup changed the privacy policy with: " << (isAgree);
if (!m_app_conf_exists || preset_bundle->printers.only_default_printers()) {
+9
View File
@@ -46,6 +46,8 @@
#define _MSW_DARK_MODE 1
#endif // _MSW_DARK_MODE
#define PRIVACY_POLICY_FLAGS "privacy_policy_isagree"
class wxMenuItem;
class wxMenuBar;
class wxTopLevelWindow;
@@ -55,7 +57,13 @@ class wxBookCtrlBase;
class Notebook;
struct wxLanguageInfo;
namespace Slic3r {
namespace GUI {
class UpdateVersionDialog;
};
};
// namespace Slice3rnamespace GUI::Slice3rnamespace GUI
namespace Slic3r {
class AppConfig;
@@ -717,6 +725,7 @@ private:
PresetUpdater* preset_updater{ nullptr };
MainFrame* mainframe{ nullptr };
Plater* plater_{ nullptr };
UpdateVersionDialog* m_updateDialog{nullptr};
PresetUpdater* get_preset_updater() { return preset_updater; }
+4 -3
View File
@@ -1747,8 +1747,9 @@ wxBoxSizer* MainFrame::create_side_tools()
{
SidePopup* p = new SidePopup(this);
// if (wxGetApp().preset_bundle && !wxGetApp().preset_bundle->is_bbl_vendor())
if (0) {
if (wxGetApp().preset_bundle && !wxGetApp().preset_bundle->is_bbl_vendor())
//if (0)
{
// ThirdParty Buttons
SideButton* export_gcode_btn = new SideButton(p, _L("Export G-code file"), "");
export_gcode_btn->SetCornerRadius(0);
@@ -2264,7 +2265,7 @@ static wxMenu* generate_help_menu()
"", nullptr, []() { return true; });
append_menu_item(
helpMenu, wxID_ANY, _L("Check for Web ResourceUpdates"), _L("Check for Web ResourceUpdates"),
helpMenu, wxID_ANY, _L("Check for Web Resource Updates"), _L("Check for Web Resource Updates"),
[](wxCommandEvent&) {
wxGetApp().check_web_version();
},
-1
View File
@@ -281,7 +281,6 @@ void MarkdownTip::OnError(wxWebViewEvent& event)
case wxWEBVIEW_NAV_ERR_OTHER: e = "wxWEBVIEW_NAV_ERR_OTHER"; break;
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":MarkdownTip error loading page %1% %2% %3% %4%") % event.GetURL() % event.GetTarget() %e % event.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init MarkdownTip webview fail", BP_WEB_VIEW);
}
void MarkdownTip::OnTimer(wxTimerEvent& event)
+1 -1
View File
@@ -172,7 +172,7 @@ Button* MsgDialog::add_button(wxWindowID btn_id, bool set_focus /*= false*/, con
btn->SetFocus();
btn_sizer->Add(btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(ButtonProps::ChoiceButtonGap()));
btn->Bind(wxEVT_BUTTON, [this, btn_id](wxCommandEvent&) { EndModal(btn_id); });
btn->SetCursor(wxCURSOR_HAND);
MsgButton *mb = new MsgButton;
ButtonData *bd = new ButtonData;
-10
View File
@@ -13818,16 +13818,6 @@ void Plater::send_gcode_legacy(int plate_idx, Export3mfProgressFn proFn, bool us
upload_job = PrintHostJob(physical_printer_config);
}
//if (wxGetApp().app_config->get("use_new_connect") == "true") {
// /*std::shared_ptr<PrintHost> temp;
// wxGetApp().get_connect_host(temp);
// upload_job.printhost = std::unique_ptr<PrintHost>(temp.get());*/
// upload_job = PrintHostJob(wxGetApp().get_host_config());
//} else {
// upload_job = PrintHostJob(physical_printer_config); //
//}
if (upload_job.empty())
return;
+3 -3
View File
@@ -748,9 +748,9 @@ wxBoxSizer *PreferencesDialog::create_item_checkbox(wxString title, wxWindow *pa
app_config->set_bool(param, checkbox->GetValue());
app_config->save();
if (param == "privacy_policy_isagree")
if (param == PRIVACY_POLICY_FLAGS)
{
app_config->set("app", "privacy_policy_isagree", checkbox->GetValue());
app_config->set("app", PRIVACY_POLICY_FLAGS, checkbox->GetValue());
BOOST_LOG_TRIVIAL(warning) <<"create_item_checkbox changed the privacy policy with: "<<(checkbox->GetValue()?"true" : "false");
wxGetApp().user_update_privacy_notify(checkbox->GetValue());
}
@@ -1300,7 +1300,7 @@ wxWindow* PreferencesDialog::create_general_page()
std::string region = app_config->get("language");
auto title_user_experience = create_item_title(_L("User Experience"), page, _L("User Experience"));
auto item_priv_policy = create_item_checkbox(_L("Join Customer Experience Improvement Program."), page, _L(""), 50, "privacy_policy_isagree");
auto item_priv_policy = create_item_checkbox(_L("Join Customer Experience Improvement Program."), page, _L(""), 50,PRIVACY_POLICY_FLAGS);
wxHyperlinkCtrl* hyperlink = nullptr;
if (region.empty() || region != "zh_CN")
hyperlink = new wxHyperlinkCtrl(page, wxID_ANY, _L("What data would be collected?"), enUrl);
-1
View File
@@ -185,7 +185,6 @@ void PrinterWebView::OnError(wxWebViewEvent &evt)
break;
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":PrinterWebView error loading page %1% %2% %3% %4%") %evt.GetURL() %evt.GetTarget() %e %evt.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init PrinterWebView webview fail", BP_WEB_VIEW);
}
void PrinterWebView::OnLoaded(wxWebViewEvent &evt)
+17 -16
View File
@@ -44,6 +44,7 @@ wxDEFINE_EVENT(EVT_UPDATE_NOZZLE, wxCommandEvent);
wxDEFINE_EVENT(EVT_JUMP_TO_HMS, wxCommandEvent);
wxDEFINE_EVENT(EVT_JUMP_TO_LIVEVIEW, wxCommandEvent);
wxDEFINE_EVENT(EVT_UPDATE_TEXT_MSG, wxCommandEvent);
wxDEFINE_EVENT(EVT_DOWN_URL_PACK, wxCommandEvent);
ReleaseNoteDialog::ReleaseNoteDialog(Plater *plater /*= nullptr*/)
: DPIDialog(static_cast<wxWindow *>(wxGetApp().mainframe), wxID_ANY, _L("Release Note"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX)
@@ -333,7 +334,13 @@ UpdateVersionDialog::UpdateVersionDialog(wxWindow *parent)
m_button_download->SetCursor(wxCURSOR_HAND);
m_button_download->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) {
EndModal(wxID_YES);
wxCommandEvent event(EVT_DOWN_URL_PACK);
wxPostEvent(this, event);
if (isModal)
EndModal(wxID_NO);
else
Close();
});
m_button_skip_version = new Button(this, _L("Skip this Version"));
@@ -347,7 +354,10 @@ UpdateVersionDialog::UpdateVersionDialog(wxWindow *parent)
m_button_skip_version->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) {
wxGetApp().set_skip_version(true);
EndModal(wxID_NO);
if (isModal)
EndModal(wxID_NO);
else
Close();
});
m_cb_stable_only = new CheckBox(this);
@@ -377,7 +387,11 @@ UpdateVersionDialog::UpdateVersionDialog(wxWindow *parent)
m_button_cancel->SetCursor(wxCURSOR_HAND);
m_button_cancel->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) {
EndModal(wxID_NO);
if (isModal)
EndModal(wxID_NO);
else
Close();
});
m_sizer_main->Add(m_line_top, 0, wxEXPAND | wxBOTTOM, 0);
@@ -446,7 +460,6 @@ void UpdateVersionDialog::OnError(wxWebViewEvent& event)
case wxWEBVIEW_NAV_ERR_OTHER: e = "wxWEBVIEW_NAV_ERR_OTHER"; break;
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":UpdateVersionDialog error loading page %1% %2% %3% %4%") % event.GetURL() % event.GetTarget() %e %event.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init UpdateVersionDialog webview fail", BP_WEB_VIEW);
event.Skip();
}
@@ -514,18 +527,6 @@ void UpdateVersionDialog::update_version_info(wxString release_note, wxString ve
//bbs check whether the web display is used
bool use_web_link = false;
url_line = "";
// Orca: not used in Orca Slicer
// auto split_array = splitWithStl(release_note.ToStdString(), "###");
// if (split_array.size() >= 3) {
// for (auto i = 0; i < split_array.size(); i++) {
// std::string url = split_array[i];
// if (std::strstr(url.c_str(), "http://") != NULL || std::strstr(url.c_str(), "https://") != NULL) {
// use_web_link = true;
// url_line = url;
// break;
// }
// }
// }
if (use_web_link) {
m_brand->Hide();
+6
View File
@@ -51,6 +51,7 @@ wxDECLARE_EVENT(EVT_LOAD_VAMS_TRAY, wxCommandEvent);
wxDECLARE_EVENT(EVT_JUMP_TO_HMS, wxCommandEvent);
wxDECLARE_EVENT(EVT_JUMP_TO_LIVEVIEW, wxCommandEvent);
wxDECLARE_EVENT(EVT_UPDATE_TEXT_MSG, wxCommandEvent);
wxDECLARE_EVENT(EVT_DOWN_URL_PACK, wxCommandEvent);
class ReleaseNoteDialog : public DPIDialog
{
@@ -95,6 +96,10 @@ public:
void update_version_info(wxString release_note, wxString version);
std::vector<std::string> splitWithStl(std::string str, std::string pattern);
void setDialogMode(bool mode) { isModal = mode; }
std::string getUrl() { return m_url; }
void setUrl(const std::string downloadUrl) { m_url = downloadUrl; }
std::string m_url{""};
wxStaticBitmap* m_brand{nullptr};
Label * m_text_up_info{nullptr};
wxWebView* m_vebview_release_note{nullptr};
@@ -108,6 +113,7 @@ public:
Button* m_button_download;
Button* m_button_cancel;
std::string url_line;
bool isModal = true;
};
class SecondaryCheckDialog : public DPIFrame
+73 -18
View File
@@ -1421,7 +1421,10 @@ void SSWCP_Instance::sw_Unsubscribe_Filter() {
}
}
}
else
{
BOOST_LOG_TRIVIAL(warning) << "no this cmd for:" << cmd;
}
send_to_js();
finish_job();
}
@@ -2075,17 +2078,15 @@ void SSWCP_MachineOption_Instance::process()
sw_UploadCameraTimelapse();
} else if (m_cmd == "sw_DeleteCameraTimelapse") {
sw_DeleteCameraTimelapse();
} else if (m_cmd == "sw_GetTimelapseInstance") {
sw_GetTimelapseInstance();
} else if (m_cmd == "sw_GetCameraTimelapseInstance") {
sw_GetCameraTimelapseInstance();
} else if (m_cmd == "sw_ServerClientManagerSetUserinfo") {
sw_ServerClientManagerSetUserinfo();
} else if (m_cmd == "sw_DefectDetactionConfig"){
sw_DefectDetactionConfig();
} else if (m_cmd == GETCAMERA_TIMELAPSE_INSTANCE) {
CmdForwarding();
}
}
else if (m_cmd == GET_DEVICEDATA_STORAGESPACE) {
CmdForwarding();
sw_GetDeviceDataStorageSpace();
}
else {
handle_general_fail();
@@ -3671,8 +3672,30 @@ void SSWCP_MachineOption_Instance::sw_UploadCameraTimelapse()
handle_general_fail();
}
}
void SSWCP_MachineOption_Instance::CmdForwarding()
{
try {
std::shared_ptr<PrintHost> host = nullptr;
wxGetApp().get_connect_host(host);
void SSWCP_MachineOption_Instance::sw_GetTimelapseInstance()
if (!host) {
handle_general_fail(-1, "Connection lost!");
return;
}
auto weak_self = std::weak_ptr<SSWCP_Instance>(shared_from_this());
host->test_async_wcp_mqtt_moonraker(m_param_data, [weak_self](const json& response) {
auto self = weak_self.lock();
if (self) {
SSWCP_Instance::on_mqtt_msg_arrived(self, response);
}
});
} catch (std::exception& e) {
handle_general_fail();
}
}
void SSWCP_MachineOption_Instance::sw_GetCameraTimelapseInstance()
{
try {
std::shared_ptr<PrintHost> host = nullptr;
@@ -3695,7 +3718,9 @@ void SSWCP_MachineOption_Instance::sw_GetTimelapseInstance()
handle_general_fail();
}
}
void SSWCP_MachineOption_Instance::CmdForwarding() {
void SSWCP_MachineOption_Instance::sw_GetDeviceDataStorageSpace()
{
try {
std::shared_ptr<PrintHost> host = nullptr;
wxGetApp().get_connect_host(host);
@@ -3706,7 +3731,7 @@ void SSWCP_MachineOption_Instance::CmdForwarding() {
}
auto weak_self = std::weak_ptr<SSWCP_Instance>(shared_from_this());
host->async_delete_camera_timelapse(m_param_data, [weak_self](const json& response) {
host->async_get_userdata_space(m_param_data, [weak_self](const json& response) {
auto self = weak_self.lock();
if (self) {
SSWCP_Instance::on_mqtt_msg_arrived(self, response);
@@ -3717,7 +3742,6 @@ void SSWCP_MachineOption_Instance::CmdForwarding() {
}
}
void SSWCP_MachineOption_Instance::sw_DeleteCameraTimelapse()
{
try {
@@ -3886,6 +3910,7 @@ void SSWCP_MachineConnect_Instance::sw_get_pin_code()
self->send_to_js();
self->finish_job();
std::string dc_msg = "success";
bool flag = mqtt_client->Disconnect(dc_msg);
wxGetApp().CallAfter([mqtt_client]() { delete mqtt_client; });
@@ -4267,7 +4292,13 @@ void SSWCP_UserLogin_Instance::process()
sw_GetUserLoginState();
} else if (m_cmd == "sw_SubscribeUserLoginState") {
sw_SubscribeUserLoginState();
} else {
}
else if (m_cmd == UPDATE_PRIVACY_STATUS) {
sw_SubUserUpdatePrivacy();
} else if (m_cmd == GET_PRIVACY_STATUS) {
sw_GetUserUpdatePrivacy();
}
else {
handle_general_fail();
}
}
@@ -4331,6 +4362,33 @@ void SSWCP_UserLogin_Instance::sw_GetUserLoginState()
handle_general_fail();
}
}
void SSWCP_UserLogin_Instance::sw_GetUserUpdatePrivacy()
{
json data;
auto isAgree = wxGetApp().app_config->get("app", PRIVACY_POLICY_FLAGS);
bool isUserAgree = false;
if (isAgree == "true")
isUserAgree = true;
data[PRIVACY_POLICY_FLAGS] = isUserAgree;
m_res_data = data;
send_to_js();
finish_job();
}
void SSWCP_UserLogin_Instance::sw_SubUserUpdatePrivacy()
{
try {
std::weak_ptr<SSWCP_Instance> weak_ptr = shared_from_this();
wxGetApp().m_user_update_privacy_subscribers[m_webview] = weak_ptr;
} catch (std::exception& e) {
handle_general_fail();
}
}
void SSWCP_UserLogin_Instance::sw_SubscribeUserLoginState()
{
@@ -5803,10 +5861,9 @@ std::unordered_set<std::string> SSWCP::m_machine_option_cmd_list = {
"sw_UpdateMachineFilamentInfo",
"sw_UploadCameraTimelapse",
"sw_DeleteCameraTimelapse",
"sw_GetTimelapseInstance",
"sw_GetCameraTimelapseInstance",
"sw_ServerClientManagerSetUserinfo",
"sw_DefectDetactionConfig",
GETCAMERA_TIMELAPSE_INSTANCE,
GET_DEVICEDATA_STORAGESPACE
};
@@ -5823,9 +5880,8 @@ std::unordered_set<std::string> SSWCP::m_project_cmd_list = {
"sw_NewProject", "sw_OpenProject", "sw_GetRecentProjects", "sw_OpenRecentFile", "sw_DeleteRecentFiles", "sw_SubscribeRecentFiles",
};
std::unordered_set<std::string> SSWCP::m_login_cmd_list = {
"sw_UserLogin", "sw_UserLogout", "sw_GetUserLoginState", "sw_SubscribeUserLoginState"
};
std::unordered_set<std::string> SSWCP::m_login_cmd_list = {"sw_UserLogin", "sw_UserLogout", "sw_GetUserLoginState", "sw_SubscribeUserLoginState",
UPDATE_PRIVACY_STATUS, GET_PRIVACY_STATUS};
std::unordered_set<std::string> SSWCP::m_machine_manage_cmd_list = {
"sw_GetLocalDevices", "sw_AddDevice", "sw_SubscribeLocalDevices", "sw_RenameDevice", "sw_SwitchModel", "sw_DeleteDevices"
@@ -5899,7 +5955,6 @@ void SSWCP::handle_web_message(std::string message, wxWebView* webview) {
if (payload.count("event_id") && !payload["event_id"].is_null()) {
event_id = payload["event_id"].get<std::string>();
}
std::shared_ptr<SSWCP_Instance> instance = create_sswcp_instance(cmd, header, params, event_id, webview);
if (instance) {
if (event_id != "") {
+7 -7
View File
@@ -26,9 +26,9 @@ using tcp = asio::ip::tcp;
//WCP Interface definition
#define UPDATE_PRIVACY_STATUS "sw_SubUserUpdatePrivacy"
#define GET_PRIVACY_STATUS "sw_GetUserUpdatePrivacy"
#define UPLOAD_CAMERA_TIMELAPSE "sw_UploadCameraTimelapse"
#define DELETE_CAMERA_TIMELAPSE "sw_DeleteCameraTimelapse"
#define GETCAMERA_TIMELAPSE_INSTANCE "sw_GetCameraTimelapseInstance"
#define GET_DEVICEDATA_STORAGESPACE "sw_GetDeviceDataStorageSpace"
namespace Slic3r { namespace GUI {
@@ -310,9 +310,6 @@ private:
void sw_mqtt_publish();
void sw_mqtt_set_engine();
private:
void clean_current_engine();
@@ -424,9 +421,11 @@ private:
void sw_GetFileListPage();
void sw_UploadCameraTimelapse();
void sw_DeleteCameraTimelapse();
void sw_GetTimelapseInstance();
void sw_GetCameraTimelapseInstance();
void sw_DefectDetactionConfig();
void sw_DefectDetactionConfig();
void sw_GetDeviceDataStorageSpace();
void CmdForwarding();
@@ -534,8 +533,9 @@ private:
void sw_SubscribeUserLoginState();
void sw_SubUserUpdatePrivacy();
void sw_GetUserUpdatePrivacy();
void sw_SubUserUpdatePrivacy();
};
// Instance class for homepage business
+1 -1
View File
@@ -118,7 +118,7 @@ void WebDeviceDialog::OnError(wxWebViewEvent &evt)
case wxWEBVIEW_NAV_ERR_OTHER: e = "wxWEBVIEW_NAV_ERR_OTHER"; break;
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":WebDeviceDialog error loading page %1% %2% %3% %4%") % evt.GetURL() % evt.GetTarget() % e %evt.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init WebDeviceDialog webview fail", BP_WEB_VIEW);
}
void WebDeviceDialog::OnScriptMessage(wxWebViewEvent &evt)
+2 -2
View File
@@ -611,7 +611,7 @@ void GuideFrame::OnError(wxWebViewEvent& event)
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":GuideFrame error loading page %1% %2% %3% %4%") % event.GetURL() % event.GetTarget() %e % event.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init GuideFrame webview fail", BP_WEB_VIEW);
}
void GuideFrame::OnScriptResponseMessage(wxCommandEvent &WXUNUSED(evt))
@@ -639,7 +639,7 @@ int GuideFrame::SaveProfile()
// m_MainPtr->app_config->set(std::string(m_SectionName.mb_str()), "privacyuse", "1");
// } else
// m_MainPtr->app_config->set(std::string(m_SectionName.mb_str()), "privacyuse", "0");
m_MainPtr->app_config->set("app", "privacy_policy_isagree", PrivacyUse);
m_MainPtr->app_config->set("app", PRIVACY_POLICY_FLAGS, PrivacyUse);
BOOST_LOG_TRIVIAL(warning) << "SaveProfile changed the privacy policy with: " << (PrivacyUse ? "true" : "false");
wxGetApp().user_update_privacy_notify(PrivacyUse);
m_MainPtr->app_config->set("region", m_Region);
+1 -1
View File
@@ -167,7 +167,7 @@ void WebPreprintDialog::OnError(wxWebViewEvent &event)
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":WebPreprintDialog error loading page %1% %2% %3% %4%") % event.GetURL() % event.GetTarget() %e % event.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init WebPreprintDialog webview fail", BP_WEB_VIEW);
}
void WebPreprintDialog::OnScriptMessage(wxWebViewEvent &evt)
+1 -1
View File
@@ -707,7 +707,7 @@ void WebPresetDialog::OnError(wxWebViewEvent& event)
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":WebPresetDialog error loading page %1% %2% %3% %4%") % event.GetURL() % event.GetTarget() %e % event.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init WebPresetDialog webview fail", BP_WEB_VIEW);
}
void WebPresetDialog::OnScriptResponseMessage(wxCommandEvent& WXUNUSED(evt))
+1 -1
View File
@@ -400,7 +400,7 @@ void SMUserLogin::OnError(wxWebViewEvent &event)
case wxWEBVIEW_NAV_ERR_OTHER: e = "wxWEBVIEW_NAV_ERR_OTHER"; break;
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":SMUserLogin error loading page %1% %2% %3% %4%") % event.GetURL() % event.GetTarget() %e % event.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init SMUserLogin webview fail", BP_WEB_VIEW);
}
void SMUserLogin::OnScriptResponseMessage(wxCommandEvent &WXUNUSED(evt))
+1 -1
View File
@@ -130,7 +130,7 @@ void WebUrlDialog::OnError(wxWebViewEvent &event)
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":WebUrlDialog error loading page %1% %2% %3% %4%") % event.GetURL() % event.GetTarget() %e % event.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init WebUrlDialog webview fail", BP_WEB_VIEW);
}
void WebUrlDialog::OnScriptMessage(wxWebViewEvent &evt)
+1 -1
View File
@@ -374,7 +374,7 @@ void ZUserLogin::OnError(wxWebViewEvent &event)
case wxWEBVIEW_NAV_ERR_OTHER: e = "wxWEBVIEW_NAV_ERR_OTHER"; break;
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":ZUserLogin error loading page %1% %2% %3% %4%") % event.GetURL() % event.GetTarget() %e % event.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init ZUserLogin webview fail", BP_WEB_VIEW);
}
void ZUserLogin::OnScriptResponseMessage(wxCommandEvent &WXUNUSED(evt))
+1 -1
View File
@@ -908,7 +908,7 @@ void WebViewPanel::OnError(wxWebViewEvent& event)
case wxWEBVIEW_NAV_ERR_OTHER: e = "wxWEBVIEW_NAV_ERR_OTHER"; break;
}
BOOST_LOG_TRIVIAL(fatal) << __FUNCTION__<< boost::format(":PrinterWebView error loading page %1% %2% %3% %4%") % event.GetURL() % event.GetTarget() %e % event.GetString();
Slic3r::sentryReportLog(Slic3r::SENTRY_LOG_FATAL, "bury_point_init WebViewPanel webview fail", BP_WEB_VIEW);
}
+24
View File
@@ -2399,6 +2399,30 @@ void Moonraker_Mqtt::async_get_timelapse_instance(const nlohmann::json& targets,
}
}
//get the mechine local storage space
void Moonraker_Mqtt::async_get_userdata_space(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)> callback)
{
auto& wcp_loger = GUI::WCP_Logger::getInstance();
std::string method = "server.files.get_userdata_space";
json params = json::object();
params = targets;
if (!send_to_request(method, params, true, callback,
[callback, &wcp_loger]() {
BOOST_LOG_TRIVIAL(warning) << "[Moonraker_Mqtt] get uoser storage space";
wcp_loger.add_log("get uoser storage space timeout", false, "", "Moonraker_Mqtt", "warning");
json res;
res["error"] = "timeout";
callback(res);
}) &&callback) {
BOOST_LOG_TRIVIAL(error) << "[Moonraker_Mqtt]send the cmd to get uoser storage space fail";
wcp_loger.add_log("send the cmd to get uoser storage space fail", false, "", "Moonraker_Mqtt", "error");
callback(json::value_t::null);
}
}
// 请求删除延时摄影文件
void Moonraker_Mqtt::async_delete_camera_timelapse(const nlohmann::json& targets,
std::function<void(const nlohmann::json& response)> callback)
+3
View File
@@ -140,6 +140,7 @@ public:
virtual void async_defect_detaction_config(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)>) {}
virtual void async_get_userdata_space(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)>) {}
protected:
// Internal upload implementations
@@ -272,6 +273,8 @@ public:
virtual void async_get_timelapse_instance(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)>) override;
virtual void async_get_userdata_space(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)>) override;
virtual void async_defect_detaction_config(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)>) override;
void set_connection_lost(std::function<void()> callback) override;
+21 -27
View File
@@ -795,7 +795,7 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check)
if (currentSoftVersion > maxSpVersion || currentSoftVersion < minSpVersion) {
if (!isAuto_check) {
wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE);
wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE);
GUI::wxGetApp().QueueEvent(evt);
BOOST_LOG_TRIVIAL(info) << format("use check the web update.");
@@ -814,7 +814,10 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check)
}
}
} catch (...) {}
} catch (const std::exception& ex) {
std::string errorMsg = ex.what();
BOOST_LOG_TRIVIAL(fatal) << "request server flutter update data error:" << errorMsg;
}
})
.perform_sync();
}
@@ -920,7 +923,10 @@ void PresetUpdater::priv::sync_config(bool isAuto_check)
}
}
} catch (...) {}
} catch (const std::exception& ex) {
std::string errorMsg = ex.what();
BOOST_LOG_TRIVIAL(fatal) << "request server preset update data error:" << errorMsg;
}
})
.perform_sync();
}
@@ -1422,8 +1428,7 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
}
}
bool version_match = ((vendor_ver.maj() == cache_ver.maj()) && (vendor_ver.min() == cache_ver.min()));
if (version_match && (vendor_ver < cache_ver)) {
if (vendor_ver < cache_ver) {
Semver min_ver = get_min_version_from_json(file_path);
Semver soft_ver = Semver(std::string(Snapmaker_VERSION));
@@ -1718,7 +1723,7 @@ void PresetUpdater::sync_web_async(bool isAutoUpdata)
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, true);
load_flutter_web(zipfilepath, true);
});
});
}
@@ -1802,7 +1807,7 @@ bool PresetUpdater::version_check_enabled() const
}
void PresetUpdater::load_lutter_web(const std::string& zip_file, bool serverUpdate)
void PresetUpdater::load_flutter_web(const std::string& zip_file, bool serverUpdate)
{
boost::filesystem::path temp_path = boost::filesystem::temp_directory_path() / "orca_temp_flutter_import";
try {
@@ -1845,7 +1850,7 @@ void PresetUpdater::load_lutter_web(const std::string& zip_file, bool serverUpda
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) {
auto source_folder_path = fs::path(dir_entry.path().parent_path());
auto target_folder_path = (boost::filesystem::path(data_dir()) / "web" / "flutter_web");
@@ -1939,6 +1944,7 @@ void PresetUpdater::load_lutter_web(const std::string& zip_file, bool serverUpda
app->recreate_GUI(_L("Update web resources"));
}
} catch (std::exception& e) {
BOOST_LOG_TRIVIAL(error) << "Failed to importweb resources: " << e.what();
@@ -1959,7 +1965,7 @@ void PresetUpdater::import_flutter_web()
std::string zip_file = dialog.GetPath().ToUTF8().data();
load_lutter_web(zip_file);
load_flutter_web(zip_file);
}
void PresetUpdater::import_system_profile()
@@ -2090,7 +2096,6 @@ void PresetUpdater::import_system_profile()
}
// 5. 执行更新并提示结果
bool need_restart = false;
if (!updates.updates.empty()) {
std::vector<GUI::MsgUpdateConfig::Update> updates_msg;
for (const auto& update : updates.updates) {
@@ -2098,9 +2103,6 @@ void PresetUpdater::import_system_profile()
if (update.is_directory)
continue;
if (update.can_install) {
need_restart = true;
}
std::string changelog = update.change_log;
updates_msg.emplace_back(update.vendor, update.version.config_version, update.descriptions, std::move(changelog));
}
@@ -2111,12 +2113,16 @@ void PresetUpdater::import_system_profile()
if (res == wxID_OK) {
p->perform_updates(std::move(updates));
// Use hot reload instead of restart
if (!reload_configs_update_gui()) {
BOOST_LOG_TRIVIAL(warning) << "[Orca Updater]:reload_configs_update_gui failed for system profiles";
} else {
BOOST_LOG_TRIVIAL(info) << "[Orca Updater]:System profiles updated successfully via hot reload";
}
} else {
boost::filesystem::remove_all(temp_path);
return;
}
}
wxString message;
@@ -2128,18 +2134,6 @@ void PresetUpdater::import_system_profile()
GUI::MessageDialog(nullptr, message).ShowModal();
}
if (need_restart) {
GUI::MessageDialog msg_wingow(nullptr,
_L("Updating the system resources requires application restart.") + "\n" +
_L("Do you want to continue?"),
L("System resource update"), wxICON_QUESTION | wxOK | wxCANCEL);
if (msg_wingow.ShowModal() == wxID_CANCEL) {
return;
}
app->recreate_GUI(_L("Update system profiles"));
}
} catch (std::exception& e) {
BOOST_LOG_TRIVIAL(error) << "Failed to import presets: " << e.what();
GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal();
+1 -1
View File
@@ -65,7 +65,7 @@ public:
void import_flutter_web();
void load_lutter_web(const std::string& zip_file,bool serverUpdate = false);
void load_flutter_web(const std::string& zip_file,bool serverUpdate = false);
void sync_config_async();
+2
View File
@@ -170,6 +170,8 @@ public:
virtual void async_delete_camera_timelapse(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)>) {}
virtual void async_get_timelapse_instance(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)>) {}
virtual void async_get_userdata_space(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)>) {}
virtual void async_defect_detaction_config(const nlohmann::json& targets, std::function<void(const nlohmann::json& response)>) {}