diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /ui/qt/extcap_argument_file.cpp | |
parent | Initial commit. (diff) | |
download | wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip |
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ui/qt/extcap_argument_file.cpp')
-rw-r--r-- | ui/qt/extcap_argument_file.cpp | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/ui/qt/extcap_argument_file.cpp b/ui/qt/extcap_argument_file.cpp new file mode 100644 index 00000000..bac7a5b9 --- /dev/null +++ b/ui/qt/extcap_argument_file.cpp @@ -0,0 +1,170 @@ +/* extcap_argument_file.cpp + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include <extcap_argument.h> +#include <extcap_argument_file.h> + +#include <wsutil/utf8_entities.h> + +#include "ui/qt/widgets/wireshark_file_dialog.h" + +#include <QObject> +#include <QWidget> +#include <QLabel> +#include <QLineEdit> +#include <QBoxLayout> +#include <QPushButton> +#include <QDir> +#include <QFileInfo> +#include <QVariant> + +#include <epan/prefs.h> +#include <ui/qt/utils/color_utils.h> + +#include <ui/all_files_wildcard.h> + +#include <extcap_parser.h> + +ExtcapArgumentFileSelection::ExtcapArgumentFileSelection (extcap_arg * argument, QObject *parent) : + ExtcapArgument(argument, parent), textBox(0) +{ +} + +ExtcapArgumentFileSelection::~ExtcapArgumentFileSelection() +{ + if (textBox != NULL) + delete textBox; +} + +QWidget * ExtcapArgumentFileSelection::createEditor(QWidget * parent) +{ + QString text = defaultValue(); + QString buttonText(UTF8_HORIZONTAL_ELLIPSIS); + QString buttonClearText(tr("Clear")); + + QWidget * fileWidget = new QWidget(parent); + QHBoxLayout * editLayout = new QHBoxLayout(); + QMargins margins = editLayout->contentsMargins(); + editLayout->setContentsMargins(0, 0, 0, margins.bottom()); + fileWidget->setContentsMargins(margins.left(), margins.right(), 0, margins.bottom()); + QPushButton * buttonSelect = new QPushButton(buttonText, fileWidget); + QPushButton * buttonClear = new QPushButton(buttonClearText, fileWidget); + + textBox = new QLineEdit(text, parent); + textBox->setReadOnly(true); + + /* Value is empty if no file is selected */ + const char *prefval = (_argument->pref_valptr && (*_argument->pref_valptr)) ? *_argument->pref_valptr : NULL; + if (prefval) + { + QString storeValue(prefval); + + if (storeValue.length() > 0 && storeValue.compare(text) != 0) + text = storeValue.trimmed(); + } + textBox->setText(text); + + if (_argument->tooltip != NULL) + { + textBox->setToolTip(QString().fromUtf8(_argument->tooltip)); + buttonSelect->setToolTip(QString().fromUtf8(_argument->tooltip)); + } + + connect(buttonSelect, &QPushButton::clicked, this, &ExtcapArgumentFileSelection::openFileDialog); + connect(buttonClear, &QPushButton::clicked, this, &ExtcapArgumentFileSelection::clearFilename); + + editLayout->addWidget(textBox); + editLayout->addWidget(buttonSelect); + editLayout->addWidget(buttonClear); + + fileWidget->setLayout(editLayout); + + return fileWidget; +} + +QString ExtcapArgumentFileSelection::value() +{ + if (textBox == 0) + return QString(); + return textBox->text(); +} + +/* opens the file dialog */ +void ExtcapArgumentFileSelection::openFileDialog() +{ + QString filename = textBox->text(); + + QDir workingDir = QDir::currentPath(); + if (QFileInfo(filename).exists()) + workingDir = QFileInfo(filename).dir(); + + QString fileExt(tr("All Files (" ALL_FILES_WILDCARD ")")); + if (_argument->fileextension != NULL) + { + QString givenExt = QString().fromUtf8(_argument->fileextension); + if (givenExt.length() != 0) + fileExt.prepend(";;").prepend(givenExt); + } + + if (fileExists()) + { + /* UI should check that the file exists */ + filename = WiresharkFileDialog::getOpenFileName((QWidget*)(textBox->parent()), + QString().fromUtf8(_argument->display) + " " + tr("Open File"), + workingDir.absolutePath(), fileExt); + } + else + { + /* File might or might not exist. Actual overwrite handling is extcap specific + * (e.g. boolflag argument if user wants to always overwrite the file) + */ + filename = WiresharkFileDialog::getSaveFileName((QWidget*)(textBox->parent()), + QString().fromUtf8(_argument->display) + " " + tr("Select File"), + workingDir.absolutePath(), fileExt, nullptr, QFileDialog::Option::DontConfirmOverwrite); + } + + if (! filename.isEmpty() && (! fileExists() || QFileInfo(filename).exists())) + { + textBox->setText(filename); + emit valueChanged(); + } +} + +void ExtcapArgumentFileSelection::clearFilename() +{ + textBox->clear(); + emit valueChanged(); +} + +bool ExtcapArgumentFileSelection::isValid() +{ + bool valid = false; + + if (textBox->text().length() > 0) + { + if (_argument->fileexists) + valid = QFileInfo(textBox->text()).exists(); + else + valid = true; + } + else if (! isRequired()) + valid = true; + + QString lblInvalidColor = ColorUtils::fromColorT(prefs.gui_text_invalid).name(); + QString txtStyle("QLineEdit { background-color: %1; } "); + textBox->setStyleSheet(txtStyle.arg(valid ? QString("") : lblInvalidColor)); + + return valid; +} + +void ExtcapArgumentFileSelection::setDefaultValue() +{ + clearFilename(); +} + |