diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gui_file.hh | 25 | ||||
| -rw-r--r-- | src/gui_form.hh | 9 | ||||
| -rw-r--r-- | src/gui_gtk.cc | 66 | ||||
| -rw-r--r-- | src/gui_main.hh | 7 | ||||
| -rw-r--r-- | src/gui_qt.cc | 81 | ||||
| -rw-r--r-- | src/monitor-gui.cc | 10 |
6 files changed, 134 insertions, 64 deletions
diff --git a/src/gui_file.hh b/src/gui_file.hh new file mode 100644 index 0000000..74d2fee --- /dev/null +++ b/src/gui_file.hh @@ -0,0 +1,25 @@ +// -*- mode: c++; c-basic-offset: 2; -*- + +#ifndef GUI_FILE_HH +#define GUI_FILE_HH + +#include <string> +#include <vector> + +class GuiFile { +public: + struct Filter { + std::string name; + std::vector<std::string> masks; + }; + static const uint8_t FILE_OPEN; + static const uint8_t FILE_SAVE; + +private: + GuiFile() {} + ~GuiFile() {} + GuiFile(GuiFile const&) = delete; + GuiFile& operator=(GuiFile const&) = delete; +}; + +#endif // GUI_FILE_HH diff --git a/src/gui_form.hh b/src/gui_form.hh index 1c65ee6..4bb8251 100644 --- a/src/gui_form.hh +++ b/src/gui_form.hh @@ -6,6 +6,7 @@ #include <string> #include <vector> +#include "gui_file.hh" #include "gui_window.hh" class GuiForm : public GuiWindow { @@ -29,16 +30,10 @@ public: virtual void add_number(std::string const& id, std::string const& label, uint64_t value, std::string const& description) = 0; - struct Filter { - std::string name; - std::vector<std::string> masks; - }; - static const uint8_t FILE_OPEN; - static const uint8_t FILE_SAVE; virtual void add_file(std::string const& id, std::string const& label, std::string const& value, std::string const& description, uint8_t flags, - std::vector<Filter> const& filter) = 0; + std::vector<GuiFile::Filter> const& filter) = 0; virtual void add_bool(std::string const& id, std::string const& label, bool value, std::string const& description) = 0; diff --git a/src/gui_gtk.cc b/src/gui_gtk.cc index 301b92f..12972cf 100644 --- a/src/gui_gtk.cc +++ b/src/gui_gtk.cc @@ -573,6 +573,18 @@ private: std::unordered_map<std::string, std::string> memory_; }; +void set_filter(GtkFileChooser* chooser, + std::vector<GuiFile::Filter> const& filters) { + for (auto const& filter : filters) { + auto f = gtk_file_filter_new(); + gtk_file_filter_set_name(f, filter.name.c_str()); + for (auto const& mask : filter.masks) { + gtk_file_filter_add_pattern(f, mask.c_str()); + } + gtk_file_chooser_add_filter(chooser, f); + } +} + class GtkGuiMain : public virtual GuiMain, public GtkGuiWindow { public: GtkGuiMain(std::string const& title, uint32_t width, uint32_t height) @@ -697,6 +709,32 @@ public: gtk_target_entry_free(target); } + std::string file_dialog(std::string const& title, std::string const& file, + uint8_t flags, + std::vector<GuiFile::Filter> const& filter) override { + auto chooser = gtk_file_chooser_native_new( + title.c_str(), + reinterpret_cast<GtkWindow*>(impl()), + flags & GuiFile::FILE_SAVE ? GTK_FILE_CHOOSER_ACTION_SAVE + : GTK_FILE_CHOOSER_ACTION_OPEN, + nullptr, nullptr); + if (flags & GuiFile::FILE_SAVE) { + gtk_file_chooser_set_do_overwrite_confirmation( + GTK_FILE_CHOOSER(chooser), true); + } + if (file.empty()) { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(chooser), file.c_str()); + } + set_filter(GTK_FILE_CHOOSER(chooser), filter); + std::string ret_file; + auto ret = gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser)); + if (ret == GTK_RESPONSE_ACCEPT) { + ret_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); + } + gtk_widget_destroy(GTK_WIDGET(chooser)); + return ret_file; + } + private: bool notify_about_to_exit() { auto it = observers_.notify(); @@ -935,7 +973,7 @@ public: std::string const& value, std::string const& description, uint8_t flags, - std::vector<Filter> const& filter) override { + std::vector<GuiFile::Filter> const& filter) override { values_.emplace_back(new FileValue(this, id, label, description, value, flags, filter)); } @@ -1004,7 +1042,7 @@ public: for (auto const& value : values_) { if (value->id_ == id && value->type_ == FILE) { auto v = static_cast<FileValue*>(value.get()); - if ((v->flags_ & FILE_SAVE) == 0 && v->chooser_) { + if ((v->flags_ & GuiFile::FILE_SAVE) == 0 && v->chooser_) { std::string ret; auto file = gtk_file_chooser_get_filename(v->chooser_); if (file) { @@ -1079,7 +1117,8 @@ public: label = nullptr; } if (value->type_ != FILE - || (static_cast<FileValue*>(value.get())->flags_ & FILE_SAVE)) { + || (static_cast<FileValue*>(value.get()) + ->flags_ & GuiFile::FILE_SAVE)) { value->entry_ = gtk_entry_new(); gtk_entry_set_activates_default(GTK_ENTRY(value->entry_), true); } @@ -1104,7 +1143,7 @@ public: } case FILE: { auto v = static_cast<FileValue*>(value.get()); - if ((v->flags_ & FILE_SAVE) == 0) { + if ((v->flags_ & GuiFile::FILE_SAVE) == 0) { assert(!value->entry_); value->entry_ = gtk_file_chooser_button_new( v->label_.c_str(), GTK_FILE_CHOOSER_ACTION_OPEN); @@ -1130,14 +1169,7 @@ public: if (!v->value_.empty()) { gtk_file_chooser_set_filename(v->chooser_, v->value_.c_str()); } - for (auto const& filter : v->filter_) { - auto f = gtk_file_filter_new(); - gtk_file_filter_set_name(f, filter.name.c_str()); - for (auto const& mask : filter.masks) { - gtk_file_filter_add_pattern(f, mask.c_str()); - } - gtk_file_chooser_add_filter(v->chooser_, f); - } + set_filter(v->chooser_, v->filter_); break; } case BOOLEAN: @@ -1200,7 +1232,7 @@ public: break; case FILE: { auto v = static_cast<FileValue*>(value.get()); - if ((v->flags_ & FILE_SAVE) == 0) { + if ((v->flags_ & GuiFile::FILE_SAVE) == 0) { auto file = gtk_file_chooser_get_filename(v->chooser_); if (file) { v->value_ = file; @@ -1273,13 +1305,13 @@ protected: struct FileValue : public Value { std::string value_; uint8_t flags_; - std::vector<Filter> filter_; + std::vector<GuiFile::Filter> filter_; GtkFileChooser* chooser_; GtkWidget* button_; FileValue(GtkGuiForm* me, std::string const& id, std::string const& label, std::string const& description, std::string const& value, - uint8_t flags, std::vector<Filter> const& filter) + uint8_t flags, std::vector<GuiFile::Filter> const& filter) : Value(me, FILE, id, label, description), value_(value), flags_(flags), filter_(filter), chooser_(nullptr), button_(nullptr) { } @@ -2079,8 +2111,8 @@ GuiForm* GuiForm::create(std::string const& title, } // static -uint8_t const GuiForm::FILE_OPEN = 0; -uint8_t const GuiForm::FILE_SAVE = 1; +uint8_t const GuiFile::FILE_OPEN = 0; +uint8_t const GuiFile::FILE_SAVE = 1; // static GuiFormApply* GuiFormApply::create(std::string const& title, diff --git a/src/gui_main.hh b/src/gui_main.hh index 83c0f8d..3b98b71 100644 --- a/src/gui_main.hh +++ b/src/gui_main.hh @@ -8,6 +8,7 @@ #include <string> #include "gui_attrtext.hh" +#include "gui_file.hh" #include "gui_window.hh" class Config; @@ -62,6 +63,12 @@ public: virtual Config* config() = 0; + virtual std::string file_dialog( + std::string const& title, + std::string const& file, + uint8_t flags, + std::vector<GuiFile::Filter> const& filter) = 0; + protected: GuiMain() {} }; diff --git a/src/gui_qt.cc b/src/gui_qt.cc index 77e292e..c032c87 100644 --- a/src/gui_qt.cc +++ b/src/gui_qt.cc @@ -362,6 +362,34 @@ private: std::unordered_map<std::string, std::string> memory_; }; +QString show_file_dialog(QWidget* parent, std::string const& title, + QString const& value, uint8_t flags, + std::vector<GuiFile::Filter> const& filters) { + QString filter; + for (auto const& f : filters) { + if (!filter.isEmpty()) filter.append(";;"); + filter.append(QString::fromStdString(f.name)); + filter.append(" ("); + bool first = true; + for (auto const& mask : f.masks) { + if (first) { + first = false; + } else { + filter.append(' '); + } + filter.append(QString::fromStdString(mask)); + } + filter.append(')'); + } + if (!(flags & GuiFile::FILE_SAVE)) { + return QFileDialog::getOpenFileName( + parent, QString::fromStdString(title), value, filter); + } else { + return QFileDialog::getSaveFileName( + parent, QString::fromStdString(title), value, filter); + } +} + class QtGuiMain : public GuiMain, public QtGuiWindow { public: QtGuiMain(std::string const& title, uint32_t width, uint32_t height) @@ -489,6 +517,14 @@ public: return config_.get(); } + std::string file_dialog(std::string const& title, std::string const& file, + uint8_t flags, + std::vector<GuiFile::Filter> const& filter) override { + auto ret = show_file_dialog(main_.get(), title, QString::fromStdString(file), + flags, filter); + return ret.isNull() ? "" : ret.toStdString(); + } + private: static bool valid_utf8(std::string const& data) { QTextCodec::ConverterState state; @@ -859,7 +895,7 @@ public: std::string const& value, std::string const& description, uint8_t flags, - std::vector<Filter> const& filter) override { + std::vector<GuiFile::Filter> const& filter) override { values_.emplace_back(new FileValue(id, label, description, value, flags, filter)); } @@ -1014,13 +1050,13 @@ protected: struct FileValue : public Value { std::string value_; uint8_t flags_; - std::vector<Filter> filter_; + std::vector<GuiFile::Filter> filter_; QPushButton* button_; FileValue(std::string const& id, std::string const& label, std::string const& description, std::string const& value, - uint8_t flags, std::vector<Filter> const& filter) + uint8_t flags, std::vector<GuiFile::Filter> const& filter) : Value(FILE, id, label, description), value_(value), flags_(flags), filter_(filter), button_(nullptr) { } @@ -1202,36 +1238,11 @@ protected: } void showFileDialog(FileValue* value) { - QString filter; - for (auto const& f : value->filter_) { - if (!filter.isEmpty()) filter.append(";;"); - filter.append(QString::fromStdString(f.name)); - filter.append(" ("); - bool first = true; - for (auto const& mask : f.masks) { - if (first) { - first = false; - } else { - filter.append(' '); - } - filter.append(QString::fromStdString(mask)); - } - filter.append(')'); - } - if (!(value->flags_ & FILE_SAVE)) { - auto file = QFileDialog::getOpenFileName( - dialog_, QString::fromStdString(value->label_), - value->edit_->text(), filter); - if (!file.isNull()) { - value->edit_->setText(file); - } - } else { - auto file = QFileDialog::getSaveFileName( - dialog_, QString::fromStdString(value->label_), - value->edit_->text(), filter); - if (!file.isNull()) { - value->edit_->setText(file); - } + auto file = show_file_dialog(dialog_, value->label_, + value->edit_->text(), value->flags_, + value->filter_); + if (!file.isNull()) { + value->edit_->setText(file); } } @@ -1697,8 +1708,8 @@ GuiForm* GuiForm::create(std::string const& title, } // static -uint8_t const GuiForm::FILE_OPEN = 0; -uint8_t const GuiForm::FILE_SAVE = 1; +uint8_t const GuiFile::FILE_OPEN = 0; +uint8_t const GuiFile::FILE_SAVE = 1; // static GuiFormApply* GuiFormApply::create(std::string const& title, diff --git a/src/monitor-gui.cc b/src/monitor-gui.cc index 3494855..4f6b21d 100644 --- a/src/monitor-gui.cc +++ b/src/monitor-gui.cc @@ -714,7 +714,7 @@ public: mitm, "If enabled SSL connections will be intercepted" " by the proxy to log unencrypted traffic."); - std::vector<GuiFormApply::Filter> filter; + std::vector<GuiFile::Filter> filter; filter.emplace_back(); filter.back().name = "PEM"; filter.back().masks.emplace_back("*.pem"); @@ -722,7 +722,7 @@ public: main_->config()->get("ssl-ca", main_->config()->get("genca-output", "")), "CA and key to sign all fake server certificates with", - GuiForm::FILE_OPEN, filter); + GuiFile::FILE_OPEN, filter); connect_->enable("ssl-ca", mitm); filter.back().name = "CRT"; filter.back().masks.emplace_back("*.crt"); @@ -730,7 +730,7 @@ public: main_->config()->get("ssl-certs", default_cert_bundle()), "Certificate bundle to verify remote SSL connections", - GuiForm::FILE_OPEN, filter); + GuiFile::FILE_OPEN, filter); connect_->enable("ssl-certs", mitm); connect_->add_bool("unsecure", "Allow unsecure remote connections", main_->config()->get("unsecure", false), @@ -822,13 +822,13 @@ public: dlg->add_string("issuer", "Issuer name", main_->config()->get("issuer", ""), "Issuer name to user instead of default."); - std::vector<GuiFormApply::Filter> filter; + std::vector<GuiFile::Filter> filter; filter.emplace_back(); filter.back().name = "PEM"; filter.back().masks.emplace_back("*.pem"); dlg->add_file("output", "File", "", "File to save certificate and key pair to.", - GuiForm::FILE_SAVE, filter); + GuiFile::FILE_SAVE, filter); dlg->add_listener(lst.get()); dlg->show(main_.get()); #endif // HAVE_SSL |
