From 9c9e2e1eba91d074d5477549a5230555c6edcedf Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 1 May 2025 23:23:52 +0200 Subject: Support specification of maximum simultaneous connections for upload. --- src/lib/config.cc | 1 + src/lib/curl_uploader.cc | 3 +++ src/lib/upload_destination.cc | 6 ++++++ src/lib/upload_destination.h | 3 +++ src/wx/upload_destination_dialog.cc | 30 ++++++++++++++++++++++++++++++ src/wx/upload_destination_dialog.h | 4 ++++ 6 files changed, 47 insertions(+) diff --git a/src/lib/config.cc b/src/lib/config.cc index 51246981f..c5b14b868 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -350,6 +350,7 @@ try _("TMS"), static_cast(f.optional_number_child("TMSProtocol").get_value_or(static_cast(FileTransferProtocol::SCP))), f.optional_bool_child("TMSPassive").get_value_or(true), + boost::none, f.string_child("TMSIP"), f.string_child("TMSPath"), f.string_child("TMSUser"), diff --git a/src/lib/curl_uploader.cc b/src/lib/curl_uploader.cc index c2e46538f..30a2e57c0 100644 --- a/src/lib/curl_uploader.cc +++ b/src/lib/curl_uploader.cc @@ -63,6 +63,9 @@ CurlUploader::CurlUploader(UploadDestination destination, function +#include UploadDestination::UploadDestination(cxml::ConstNodePtr node) : name(node->string_child("Name")) , protocol(file_transfer_protocol_from_string(node->string_child("Protocol"))) , passive_ftp(node->bool_child("PassiveFTP")) + , maximum_connections(node->optional_number_child("MaximumConnections")) , host(node->string_child("Host")) , path(node->string_child("Path")) , user(node->string_child("User")) @@ -42,6 +44,9 @@ UploadDestination::as_xml(xmlpp::Element* parent) const cxml::add_text_child(parent, "Name", name); cxml::add_text_child(parent, "Protocol", file_transfer_protocol_to_string(protocol)); cxml::add_text_child(parent, "PassiveFTP", passive_ftp ? "1" : "0"); + if (maximum_connections) { + cxml::add_text_child(parent, "MaximumConnections", fmt::to_string(*maximum_connections)); + } cxml::add_text_child(parent, "Host", host); cxml::add_text_child(parent, "Path", path); cxml::add_text_child(parent, "User", user); @@ -55,6 +60,7 @@ operator==(UploadDestination const& a, UploadDestination const& b) return a.name == b.name && a.protocol == b.protocol && a.passive_ftp == b.passive_ftp + && a.maximum_connections == b.maximum_connections && a.host == b.host && a.path == b.path && a.user == b.user diff --git a/src/lib/upload_destination.h b/src/lib/upload_destination.h index 8913c82f1..6d062d172 100644 --- a/src/lib/upload_destination.h +++ b/src/lib/upload_destination.h @@ -34,6 +34,7 @@ public: std::string name_, FileTransferProtocol protocol_, bool passive_ftp_, + boost::optional maximum_connections_, std::string host_, std::string path_, std::string user_, @@ -42,6 +43,7 @@ public: : name(name_) , protocol(protocol_) , passive_ftp(passive_ftp_) + , maximum_connections(maximum_connections_) , host(host_) , path(path_) , user(user_) @@ -55,6 +57,7 @@ public: std::string name; FileTransferProtocol protocol; bool passive_ftp = true; + boost::optional maximum_connections; std::string host; std::string path; std::string user; diff --git a/src/wx/upload_destination_dialog.cc b/src/wx/upload_destination_dialog.cc index d4da24bb0..64509f4da 100644 --- a/src/wx/upload_destination_dialog.cc +++ b/src/wx/upload_destination_dialog.cc @@ -21,6 +21,7 @@ #include "check_box.h" #include "dcpomatic_choice.h" +#include "dcpomatic_spin_ctrl.h" #include "password_entry.h" #include "upload_destination_dialog.h" #include "wx_util.h" @@ -30,6 +31,7 @@ using std::shared_ptr; using std::string; using std::vector; +using boost::optional; UploadDestinationDialog::UploadDestinationDialog(wxWindow* parent) @@ -41,6 +43,9 @@ UploadDestinationDialog::UploadDestinationDialog(wxWindow* parent) _protocol = add(new Choice(this)); _passive = add(new CheckBox(this, _("Passive"))); add_spacer(); + _limit_connections = add(new CheckBox(this, _("Limit connections"))); + _maximum_connections = add(new SpinCtrl(this, DCPOMATIC_SPIN_CTRL_WIDTH), 0); + _maximum_connections->SetRange(1, 100); add(_("Host"), true); _host = add(new wxTextCtrl(this, wxID_ANY)); add(_("Path"), true); @@ -56,6 +61,7 @@ UploadDestinationDialog::UploadDestinationDialog(wxWindow* parent) _protocol->add_entry(_("FTPS"), file_transfer_protocol_to_string(FileTransferProtocol::FTPS)); _protocol->bind(&UploadDestinationDialog::protocol_changed, this); + _limit_connections->bind(&UploadDestinationDialog::limit_connections_changed, this); layout(); @@ -63,6 +69,9 @@ UploadDestinationDialog::UploadDestinationDialog(wxWindow* parent) _protocol->set(0); protocol_changed(); + _limit_connections->set(false); + _maximum_connections->set(5); + limit_connections_changed(); } @@ -75,20 +84,35 @@ UploadDestinationDialog::protocol_changed() } +void +UploadDestinationDialog::limit_connections_changed() +{ + _maximum_connections->Enable(_limit_connections->get()); +} + + void UploadDestinationDialog::set(UploadDestination const& destination) { checked_set(_name, destination.name); checked_set(_protocol, static_cast(destination.protocol)); checked_set(_passive, destination.passive_ftp); + checked_set(_limit_connections, static_cast(destination.maximum_connections)); + if (_limit_connections->get()) { + checked_set(_maximum_connections, *destination.maximum_connections); + } else { + checked_set(_maximum_connections, 5); + } checked_set(_host, destination.host); checked_set(_path, destination.path); checked_set(_user, destination.user); checked_set(_password, destination.password); protocol_changed(); + limit_connections_changed(); } + vector UploadDestinationDialog::get () const { @@ -97,11 +121,17 @@ UploadDestinationDialog::get () const protocol = file_transfer_protocol_from_string(*protocol_name); } + optional max; + if (_limit_connections->get()) { + max = _maximum_connections->get(); + } + return { UploadDestination( wx_to_std(_name->GetValue()), protocol, _passive->get(), + max, wx_to_std(_host->GetValue()), wx_to_std(_path->GetValue()), wx_to_std(_user->GetValue()), diff --git a/src/wx/upload_destination_dialog.h b/src/wx/upload_destination_dialog.h index 62abafe0f..1ebe13552 100644 --- a/src/wx/upload_destination_dialog.h +++ b/src/wx/upload_destination_dialog.h @@ -27,6 +27,7 @@ class CheckBox; class Choice; class PasswordEntry; +class SpinCtrl; class wxTextCtrl; @@ -40,10 +41,13 @@ public: private: void protocol_changed(); + void limit_connections_changed(); wxTextCtrl* _name; Choice* _protocol; CheckBox* _passive; + CheckBox* _limit_connections; + SpinCtrl* _maximum_connections; wxTextCtrl* _host; wxTextCtrl* _path; wxTextCtrl* _user; -- cgit v1.2.3