1 /* copy_from_profile_button.cpp
2  *
3  * Wireshark - Network traffic analyzer
4  * By Gerald Combs <gerald@wireshark.org>
5  * Copyright 1998 Gerald Combs
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  */
9 
10 #include <ui/qt/widgets/copy_from_profile_button.h>
11 #include <ui/qt/models/profile_model.h>
12 #include <wsutil/filesystem.h>
13 
14 #include <QDir>
15 #include <QFileInfo>
16 #include <QMenu>
17 #include <QAction>
18 
CopyFromProfileButton(QWidget * parent,QString fileName,QString toolTip)19 CopyFromProfileButton::CopyFromProfileButton(QWidget * parent, QString fileName, QString toolTip) :
20     QPushButton(parent),
21     buttonMenu_(Q_NULLPTR)
22 {
23     setText(tr("Copy from"));
24     if (toolTip.length() == 0)
25         setToolTip(tr("Copy entries from another profile."));
26     else {
27         setToolTip(toolTip);
28     }
29 
30     if (fileName.length() > 0)
31         setFilename(fileName);
32 }
33 
setFilename(QString filename)34 void CopyFromProfileButton::setFilename(QString filename)
35 {
36     setEnabled(false);
37 
38     if (filename.length() <= 0)
39         return;
40 
41     ProfileModel model(this);
42 
43     QList<QAction *> global;
44     QList<QAction *> user;
45 
46     QAction * pa = systemDefault(filename);
47     if (pa)
48         global << pa;
49 
50     if (! buttonMenu_)
51         buttonMenu_ = new QMenu();
52 
53     if (buttonMenu_->actions().count() > 0)
54         buttonMenu_->clear();
55 
56     for (int cnt = 0; cnt < model.rowCount(); cnt++)
57     {
58         QModelIndex idx = model.index(cnt, ProfileModel::COL_NAME);
59         QString profilePath = idx.data(ProfileModel::DATA_PATH).toString();
60         if (! idx.isValid() || profilePath.isEmpty())
61             continue;
62 
63         if (! idx.data(ProfileModel::DATA_PATH_IS_NOT_DESCRIPTION).toBool() || idx.data(ProfileModel::DATA_IS_SELECTED).toBool())
64             continue;
65 
66         QDir profileDir(profilePath);
67         if (! profileDir.exists())
68             continue;
69 
70         QFileInfo fi = profileDir.filePath(filename);
71         if (! fi.exists())
72             continue;
73 
74         if (! config_file_exists_with_entries(fi.absoluteFilePath().toUtf8().constData(), '#'))
75             continue;
76 
77         QString name = idx.data().toString();
78         pa = new QAction(name, this);
79         if (idx.data(ProfileModel::DATA_IS_DEFAULT).toBool())
80             buttonMenu_->addAction(pa);
81         else if (idx.data(ProfileModel::DATA_IS_GLOBAL).toBool())
82             global << pa;
83         else
84             user << pa;
85 
86         pa->setFont(idx.data(Qt::FontRole).value<QFont>());
87         pa->setProperty("profile_name", name);
88         pa->setProperty("profile_is_global", idx.data(ProfileModel::DATA_IS_GLOBAL));
89         pa->setProperty("profile_filename", fi.absoluteFilePath());
90     }
91 
92     buttonMenu_->addActions(user);
93     if (global.count() > 0)
94     {
95         if (actions().count() > 0)
96             buttonMenu_->addSeparator();
97         buttonMenu_->addActions(global);
98     }
99     if (buttonMenu_->actions().count() <= 0)
100         return;
101 
102     connect(buttonMenu_, &QMenu::triggered, this, &CopyFromProfileButton::menuActionTriggered);
103     setMenu(buttonMenu_);
104     setEnabled(true);
105 }
106 
107 // "System default" is not a profile.
108 // Add a special entry for this if the filename exists.
systemDefault(QString filename)109 QAction * CopyFromProfileButton::systemDefault(QString filename)
110 {
111     QAction * data = Q_NULLPTR;
112 
113     QDir dataDir(get_datafile_dir());
114     QString path = dataDir.filePath(filename);
115     if (QFile::exists(path))
116     {
117         data = new QAction(tr("System default"), this);
118         data->setData(path);
119         QFont font = data->font();
120         font.setItalic(true);
121         data->setFont(font);
122     }
123 
124     return data;
125 }
126 
menuActionTriggered(QAction * action)127 void CopyFromProfileButton::menuActionTriggered(QAction * action)
128 {
129     if (action->property("profile_filename").toString().length() > 0)
130     {
131         QString filename = action->property("profile_filename").toString();
132         if (QFileInfo::exists(filename))
133             emit copyProfile(filename);
134     }
135 }
136