summaryrefslogtreecommitdiffstats
path: root/ui/qt/extcap_argument_file.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /ui/qt/extcap_argument_file.cpp
parentInitial commit. (diff)
downloadwireshark-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.cpp170
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();
+}
+