summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-05-01 23:23:52 +0200
committerCarl Hetherington <cth@carlh.net>2025-06-03 22:46:26 +0200
commit9c9e2e1eba91d074d5477549a5230555c6edcedf (patch)
tree3398fb47ea8fd3db14f4f3647f53f73441193dd0
parentcd2dffcd903a2a1d9f2b452bdd3cfec45cebe614 (diff)
Support specification of maximum simultaneous connections for upload.
-rw-r--r--src/lib/config.cc1
-rw-r--r--src/lib/curl_uploader.cc3
-rw-r--r--src/lib/upload_destination.cc6
-rw-r--r--src/lib/upload_destination.h3
-rw-r--r--src/wx/upload_destination_dialog.cc30
-rw-r--r--src/wx/upload_destination_dialog.h4
6 files changed, 47 insertions, 0 deletions
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<FileTransferProtocol>(f.optional_number_child<int>("TMSProtocol").get_value_or(static_cast<int>(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<void (string)
curl_easy_setopt(_curl, CURLOPT_READDATA, this);
curl_easy_setopt(_curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(_curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
+ if (destination.maximum_connections) {
+ curl_easy_setopt(_curl, CURLOPT_MAXCONNECTS, *destination.maximum_connections);
+ }
curl_easy_setopt(_curl, CURLOPT_READDATA, this);
curl_easy_setopt(_curl, CURLOPT_USERNAME, destination.user.c_str());
curl_easy_setopt(_curl, CURLOPT_PASSWORD, destination.password.c_str());
diff --git a/src/lib/upload_destination.cc b/src/lib/upload_destination.cc
index fe5a94eeb..c91ba6a6f 100644
--- a/src/lib/upload_destination.cc
+++ b/src/lib/upload_destination.cc
@@ -21,12 +21,14 @@
#include "upload_destination.h"
#include <libcxml/cxml.h>
+#include <fmt/format.h>
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<int>("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<int> 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<int> 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();
}
@@ -76,19 +85,34 @@ 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<int>(destination.protocol));
checked_set(_passive, destination.passive_ftp);
+ checked_set(_limit_connections, static_cast<bool>(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<UploadDestination>
UploadDestinationDialog::get () const
{
@@ -97,11 +121,17 @@ UploadDestinationDialog::get () const
protocol = file_transfer_protocol_from_string(*protocol_name);
}
+ optional<int> 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;