Compare commits

...
5 changed files with 37 additions and 23 deletions
+4 -1
View File
@@ -276,7 +276,10 @@ void MonitorPanel::select_machine(std::string machine_sn)
void MonitorPanel::on_timer(wxTimerEvent& event) void MonitorPanel::on_timer(wxTimerEvent& event)
{ {
if (update_flag) { // MediaPlayCtrl may yield the event loop while it joins its camera worker
// during window teardown. Do not let a queued monitor refresh touch panels
// that are already being destroyed.
if (!wxGetApp().is_closing() && update_flag) {
update_all(); update_all();
//Layout(); //Layout();
} }
+26 -15
View File
@@ -23,14 +23,15 @@
#include <wx/filedlg.h> #include <wx/filedlg.h>
#include <miniz.h> #include <miniz.h>
#include <algorithm> #include <algorithm>
#include <cctype>
#include "Plater.hpp" #include "Plater.hpp"
#include "BitmapCache.hpp" #include "BitmapCache.hpp"
#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_App.hpp"
#include "DeviceCore/DevManager.h" #include "DeviceCore/DevManager.h"
#include "DeviceCore/DevStorage.h" #include "DeviceCore/DevStorage.h"
#include "md4c/src/md4c-html.h"
#include "../Utils/Http.hpp" #include "../Utils/Http.hpp"
#include "md4c/src/md4c-html.h"
namespace Slic3r { namespace GUI { namespace Slic3r { namespace GUI {
@@ -1777,7 +1778,7 @@ void InputIpAddressDialog::set_machine_obj(MachineObject* obj)
auto str_ip = m_input_ip->GetTextCtrl()->GetValue(); auto str_ip = m_input_ip->GetTextCtrl()->GetValue();
auto str_access_code = m_input_access_code->GetTextCtrl()->GetValue(); auto str_access_code = m_input_access_code->GetTextCtrl()->GetValue();
// ORCA enabling / disabling buttons with conditions enough to change its style // ORCA enabling / disabling buttons with conditions enough to change its style
m_button_ok->Enable(isIp(str_ip.ToStdString()) && m_button_ok->Enable(isValidEndpoint(str_ip.ToStdString()) &&
(str_access_code.IsEmpty() || str_access_code.Length() >= 8)); (str_access_code.IsEmpty() || str_access_code.Length() >= 8));
Layout(); Layout();
@@ -1815,19 +1816,29 @@ void InputIpAddressDialog::update_test_msg(wxString msg,bool connected)
Fit(); Fit();
} }
bool InputIpAddressDialog::isIp(std::string ipstr) bool InputIpAddressDialog::isValidEndpoint(std::string endpoint)
{ {
istringstream ipstream(ipstr); if (endpoint.empty() || std::any_of(endpoint.begin(), endpoint.end(), [](unsigned char c) {
int num[4]; return std::isspace(c) != 0;
char point[3]; }))
string end; return false;
ipstream >> num[0] >> point[0] >> num[1] >> point[1] >> num[2] >> point[2] >> num[3] >> end;
for (int i = 0; i < 3; ++i) { const bool has_http_scheme = endpoint.rfind("http://", 0) == 0;
if (num[i] < 0 || num[i]>255) return false; const bool has_https_scheme = endpoint.rfind("https://", 0) == 0;
if (point[i] != '.') return false; const auto scheme_pos = endpoint.find("://");
} if (scheme_pos != std::string::npos && !has_http_scheme && !has_https_scheme)
if (num[3] < 0 || num[3]>255) return false; return false;
if (!end.empty()) return false;
std::string port;
const std::string host = Http::get_host_from_url(endpoint, &port);
if (host.empty())
return false;
// get_host_from_url returns its input when libcurl cannot parse it. For a
// URL with a scheme, that means a failed parse still needs to be rejected.
if (scheme_pos != std::string::npos && host == endpoint)
return false;
return true; return true;
} }
@@ -2130,7 +2141,7 @@ void InputIpAddressDialog::on_text(wxCommandEvent &evt)
// ORCA enabling / disabling buttons with conditions enough to change its style // ORCA enabling / disabling buttons with conditions enough to change its style
bool valid_access_code_length = str_access_code.IsEmpty() || str_access_code.Length() >= 8; bool valid_access_code_length = str_access_code.IsEmpty() || str_access_code.Length() >= 8;
bool enable_btns = isIp(str_ip.ToStdString()) && valid_access_code_length && invalid_access_code; bool enable_btns = isValidEndpoint(str_ip.ToStdString()) && valid_access_code_length && invalid_access_code;
m_button_manual_setup->Enable(enable_btns); m_button_manual_setup->Enable(enable_btns);
m_button_ok->Enable(enable_btns); m_button_ok->Enable(enable_btns);
+1 -1
View File
@@ -348,7 +348,7 @@ public:
void update_title(wxString title); void update_title(wxString title);
void set_machine_obj(MachineObject* obj); void set_machine_obj(MachineObject* obj);
void update_test_msg(wxString msg, bool connected); void update_test_msg(wxString msg, bool connected);
bool isIp(std::string ipstr); bool isValidEndpoint(std::string endpoint);
void check_ip_address_failed(int result); void check_ip_address_failed(int result);
void on_check_ip_address_failed(wxCommandEvent& evt); void on_check_ip_address_failed(wxCommandEvent& evt);
void on_ok(wxMouseEvent& evt); void on_ok(wxMouseEvent& evt);
+6 -5
View File
@@ -1,5 +1,6 @@
#include "Http.hpp" #include "Http.hpp"
#include <atomic>
#include <cstdlib> #include <cstdlib>
#include <functional> #include <functional>
#include <thread> #include <thread>
@@ -122,7 +123,7 @@ struct Http::priv
std::string error_buffer; // Used for CURLOPT_ERRORBUFFER std::string error_buffer; // Used for CURLOPT_ERRORBUFFER
std::string headers; std::string headers;
size_t limit; size_t limit;
bool cancel; std::atomic_bool cancel;
std::unique_ptr<form_file> putFile; std::unique_ptr<form_file> putFile;
std::thread io_thread; std::thread io_thread;
@@ -260,9 +261,9 @@ int Http::priv::xfercb(void *userp, curl_off_t dltotal, curl_off_t dlnow, curl_o
self->progressfn(progress, cb_cancel); self->progressfn(progress, cb_cancel);
} }
if (cb_cancel) { self->cancel = true; } if (cb_cancel) { self->cancel.store(true); }
return self->cancel; return self->cancel.load();
} }
int Http::priv::xfercb_legacy(void *userp, double dltotal, double dlnow, double ultotal, double ulnow) int Http::priv::xfercb_legacy(void *userp, double dltotal, double dlnow, double ultotal, double ulnow)
@@ -473,7 +474,7 @@ void Http::priv::http_perform()
if (res != CURLE_OK) { if (res != CURLE_OK) {
if (res == CURLE_ABORTED_BY_CALLBACK) { if (res == CURLE_ABORTED_BY_CALLBACK) {
if (cancel) { if (cancel.load()) {
// The abort comes from the request being cancelled programatically // The abort comes from the request being cancelled programatically
Progress dummyprogress(0, 0, 0, 0, std::string()); Progress dummyprogress(0, 0, 0, 0, std::string());
bool cancel = true; bool cancel = true;
@@ -784,7 +785,7 @@ void Http::perform_sync()
void Http::cancel() void Http::cancel()
{ {
if (p) { p->cancel = true; } if (p) { p->cancel.store(true); }
} }
void Http::print() const void Http::print() const
-1
View File
@@ -198,7 +198,6 @@ public:
// Return empty string on success or error message on fail. // Return empty string on success or error message on fail.
static std::string tls_global_init(); static std::string tls_global_init();
static std::string tls_system_cert_store(); static std::string tls_system_cert_store();
// converts the given string to an url_encoded_string // converts the given string to an url_encoded_string
static std::string url_encode(const std::string &str); static std::string url_encode(const std::string &str);
static std::string url_decode(const std::string &str); static std::string url_decode(const std::string &str);