summaryrefslogtreecommitdiffstats
path: root/ui/qt/extcap_argument_file.cpp
blob: bac7a5b9c41b963e948ecd289258acdc342b2d01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
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();
}