Manage Interfaces

- Add dialog to manage interfaces
- Add and delete pipes
- Hide local interfaces

Change-Id: I08323c306c2ea736f99e57c28e2fe3170a0c2216
Reviewed-on: https://code.wireshark.org/review/2613
Tested-by: Anders Broman <a.broman58@gmail.com>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Reviewed-by: Michael Tüxen <tuexen@wireshark.org>
This commit is contained in:
Irene Ruengeler 2014-06-24 11:36:51 +02:00 committed by Michael Tüxen
parent 2c9d2bea32
commit f3c5f14bc4
16 changed files with 1009 additions and 15 deletions

View File

@ -27,6 +27,12 @@
extern "C" {
#endif /* __cplusplus */
#ifndef _WIN32
#include <sys/types.h>
#endif
#include "capture_opts.h"
#ifdef HAVE_LIBPCAP
/* Current state of capture engine. XXX - differentiate states */
typedef enum {

View File

@ -44,7 +44,7 @@
char *
capture_dev_user_descr_find(const gchar *if_name)
{
char *p;
char *p, *str;
char *p2 = NULL;
char *descr = NULL;
int lp = 0;
@ -56,11 +56,15 @@ capture_dev_user_descr_find(const gchar *if_name)
return NULL;
}
if ((p = strstr(prefs.capture_devices_descr, if_name)) == NULL) {
/* There might be names like 'lo' and 'nflog' in Ubuntu which can lead to wrong results.
Therefore, the search must be more exact. */
str = g_strdup_printf(",%s(", if_name);
if ((p = strstr(prefs.capture_devices_descr, str)) == NULL) {
/* There are, but there isn't one for this interface. */
return NULL;
}
p++;
while (*p != '\0') {
/* error: ran into next interface description */
if (*p == ',')
@ -85,6 +89,7 @@ capture_dev_user_descr_find(const gchar *if_name)
}
}
g_free(str);
if ((lp == 1) && (ct > 0) && (p2 != NULL)) {
/* Allocate enough space to return the string,
which runs from p2 to p, plus a terminating

View File

@ -63,6 +63,7 @@ set(WIRESHARK_QT_HEADERS
main_welcome.h
main_window.h
main_window_preferences_frame.h
manage_interfaces_dialog.h
module_preferences_scroll_area.h
packet_comment_dialog.h
packet_format_group_box.h
@ -146,6 +147,7 @@ set(WIRESHARK_QT_SRC
main_window.cpp
main_window_preferences_frame.cpp
main_window_slots.cpp
manage_interfaces_dialog.cpp
module_preferences_scroll_area.cpp
packet_comment_dialog.cpp
packet_format_group_box.cpp
@ -217,6 +219,7 @@ set(WIRESHARK_QT_UI
main_welcome.ui
main_window.ui
main_window_preferences_frame.ui
manage_interfaces_dialog.ui
module_preferences_scroll_area.ui
packet_comment_dialog.ui
packet_format_group_box.ui

View File

@ -169,6 +169,8 @@ main_window.cpp main_window_slots.cpp main_window.h: ui_main_window.h
main_window_preferences_frame.cpp main_window_preferences_frame.h: ui_main_window_preferences_frame.h
manage_interfaces_dialog.cpp manage_interfaces_dialog.h: ui_manage_interfaces_dialog.h
module_preferences_scroll_area.cpp module_preferences_scroll_area.h: ui_module_preferences_scroll_area.h
packet_comment_dialog.cpp packet_comment_dialog.h: ui_packet_comment_dialog.h

View File

@ -51,6 +51,7 @@ NODIST_GENERATED_HEADER_FILES = \
ui_main_welcome.h \
ui_main_window.h \
ui_main_window_preferences_frame.h \
ui_manage_interfaces_dialog.h \
ui_module_preferences_scroll_area.h \
ui_packet_comment_dialog.h \
ui_packet_format_group_box.h \
@ -148,6 +149,7 @@ MOC_HDRS = \
main_welcome.h \
main_window.h \
main_window_preferences_frame.h \
manage_interfaces_dialog.h \
module_preferences_scroll_area.h \
packet_comment_dialog.h \
packet_format_group_box.h \
@ -209,6 +211,7 @@ UI_FILES = \
main_welcome.ui \
main_window.ui \
main_window_preferences_frame.ui \
manage_interfaces_dialog.ui \
module_preferences_scroll_area.ui \
packet_format_group_box.ui \
packet_range_group_box.ui \
@ -326,6 +329,7 @@ WIRESHARK_QT_SRC = \
main_window.cpp \
main_window_preferences_frame.cpp \
main_window_slots.cpp \
manage_interfaces_dialog.cpp \
module_preferences_scroll_area.cpp \
packet_comment_dialog.cpp \
packet_format_group_box.cpp \

View File

@ -253,7 +253,8 @@ FORMS += \
summary_dialog.ui \
time_shift_dialog.ui \
uat_dialog.ui \
tcp_stream_dialog.ui
tcp_stream_dialog.ui \
manage_interfaces_dialog.ui
HEADERS += $$HEADERS_WS_C \
about_dialog.h \
@ -295,7 +296,8 @@ HEADERS += $$HEADERS_WS_C \
summary_dialog.h \
tango_colors.h \
uat_dialog.h \
tcp_stream_dialog.h
tcp_stream_dialog.h \
manage_interfaces_dialog.h
win32 {
OBJECTS_WS_C = $$SOURCES_WS_C
@ -647,4 +649,5 @@ SOURCES += \
time_shift_dialog.cpp \
uat_dialog.cpp \
wireshark_application.cpp \
tcp_stream_dialog.cpp
tcp_stream_dialog.cpp \
manage_interfaces_dialog.cpp

View File

@ -27,6 +27,7 @@
#include "capture_filter_combo.h"
#include "ui_capture_interfaces_dialog.h"
#include "compiled_filter_output.h"
#include "manage_interfaces_dialog.h"
#include "wireshark_application.h"
@ -71,6 +72,7 @@ CaptureInterfacesDialog::CaptureInterfacesDialog(QWidget *parent) :
connect(ui->tbInterfaces, SIGNAL(itemSelectionChanged()), this, SLOT(tableSelected()));
connect(ui->allFilterComboBox, SIGNAL(captureFilterSyntaxChanged(bool)), this, SLOT(allFilterChanged()));
connect(this, SIGNAL(interfacesChanged()), ui->allFilterComboBox, SIGNAL(interfacesChanged()));
connect(this, SIGNAL(ifsChanged()), this, SLOT(refreshInterfaceList()));
}
void CaptureInterfacesDialog::allFilterChanged()
@ -261,6 +263,7 @@ void CaptureInterfacesDialog::UpdateInterfaces()
ui->cbResolveTransportNames->setChecked(gbl_resolv_flags.transport_name);
ui->tbInterfaces->setRowCount(0);
ui->tbInterfaces->clearContents();
GList *list;
char *snaplen_string, *linkname;
@ -386,7 +389,7 @@ void CaptureInterfacesDialog::UpdateInterfaces()
output = QString(device.cfilter);
ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, FILTER, new QTableWidgetItem(output));
if (strstr(prefs.capture_device, device.name) != NULL) {
if (prefs.capture_device && strstr(prefs.capture_device, device.name) != NULL) {
device.selected = TRUE;
global_capture_opts.num_selected++;
}
@ -413,6 +416,12 @@ void CaptureInterfacesDialog::UpdateInterfaces()
}
}
void CaptureInterfacesDialog::refreshInterfaceList()
{
UpdateInterfaces();
emit interfaceListChanged();
}
void CaptureInterfacesDialog::updateStatistics(void)
{
QList<int> *points = NULL;
@ -582,6 +591,13 @@ void CaptureInterfacesDialog::saveOptionsToPreferences()
}
void CaptureInterfacesDialog::on_manage_clicked()
{
saveOptionsToPreferences();
ManageInterfacesDialog *dlg = new ManageInterfacesDialog(this);
dlg->show();
}
#include <QComboBox>
TbInterfacesDelegate::TbInterfacesDelegate(QObject *parent)

View File

@ -103,6 +103,7 @@ private slots:
void on_cbExtraCaptureInfo_toggled(bool checked);
void on_cbResolveMacAddresses_toggled(bool checked);
void on_compileBPF_clicked();
void on_manage_clicked();
void on_cbResolveNetworkNames_toggled(bool checked);
void on_cbResolveTransportNames_toggled(bool checked);
void start_button_clicked();
@ -112,6 +113,7 @@ private slots:
void tableSelected();
void updateStatistics(void);
void allFilterChanged();
void refreshInterfaceList();
signals:
void startCapture();
@ -120,6 +122,8 @@ signals:
void setSelectedInterfaces();
void setFilterValid(bool valid);
void interfacesChanged();
void ifsChanged();
void interfaceListChanged();
private:
Ui::CaptureInterfacesDialog *ui;

View File

@ -23,9 +23,15 @@
<attribute name="title">
<string>Input</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_10" stretch="1,0">
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QTableWidget" name="tbInterfaces">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="editTriggers">
<set>QAbstractItemView::DoubleClicked</set>
</property>
@ -47,6 +53,9 @@
<property name="columnCount">
<number>8</number>
</property>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string>Interface</string>
@ -90,7 +99,7 @@
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1,0">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
@ -142,9 +151,12 @@
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QPushButton" name="bClose_2">
<widget class="QPushButton" name="manage">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="toolTip">
<string>Add a </string>
</property>
<property name="text">
<string>Manage Interfaces...</string>

View File

@ -23,6 +23,10 @@
#include <glib.h>
#ifdef HAVE_LIBPCAP
#include "ui/capture_globals.h"
#endif
#include "capture_preferences_frame.h"
#include "ui_capture_preferences_frame.h"
@ -73,11 +77,24 @@ void CapturePreferencesFrame::updateWidgets()
int err;
ui->defaultInterfaceComboBox->clear();
if_list = capture_interface_list(&err, NULL,main_window_update);
combo_list = build_capture_combo_list(if_list, FALSE);
free_interface_list(if_list);
for (combo_entry = combo_list; combo_entry != NULL && combo_entry->data != NULL; combo_entry = g_list_next(combo_entry)) {
ui->defaultInterfaceComboBox->addItem(QString((const char *)combo_entry->data));
if (global_capture_opts.all_ifaces->len > 0) {
interface_t device;
for (guint i = 0; i < global_capture_opts.all_ifaces->len; i++) {
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
/* Continue if capture device is hidden */
if (device.hidden) {
continue;
}
ui->defaultInterfaceComboBox->addItem(QString((const char *)device.display_name));
}
} else {
if_list = capture_interface_list(&err, NULL,main_window_update);
combo_list = build_capture_combo_list(if_list, FALSE);
free_interface_list(if_list);
for (combo_entry = combo_list; combo_entry != NULL && combo_entry->data != NULL; combo_entry = g_list_next(combo_entry)) {
ui->defaultInterfaceComboBox->addItem(QString((const char *)combo_entry->data));
}
}
if (pref_device_->stashed_val.string) {

View File

@ -331,6 +331,42 @@ void InterfaceTree::setSelectedInterfaces()
#endif // HAVE_LIBPCAP
}
void InterfaceTree::interfaceListChanged()
{
#ifdef HAVE_LIBPCAP
interface_t device;
clear();
for (guint i = 0; i < global_capture_opts.all_ifaces->len; i++) {
QList<int> *points;
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
/* Continue if capture device is hidden */
if (device.hidden) {
continue;
}
QTreeWidgetItem *ti = new QTreeWidgetItem();
ti->setText(0, QString().fromUtf8(device.display_name));
ti->setData(0, Qt::UserRole, QString(device.name));
points = new QList<int>();
ti->setData(1, Qt::UserRole, qVariantFromValue(points));
addTopLevelItem(ti);
// XXX Add other device information
resizeColumnToContents(1);
if (strstr(prefs.capture_device, device.name) != NULL) {
device.selected = TRUE;
global_capture_opts.num_selected++;
global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
g_array_insert_val(global_capture_opts.all_ifaces, i, device);
}
if (device.selected) {
ti->setSelected(true);
}
}
#endif
}
/*
* Editor modelines
*

View File

@ -65,6 +65,7 @@ public slots:
//void getPoints(int row, QList<int> *pts);
void getPoints(int row, PointList *pts);
void setSelectedInterfaces();
void interfaceListChanged();
private slots:
void getInterfaceList();

View File

@ -303,6 +303,8 @@ MainWindow::MainWindow(QWidget *parent) :
this->main_welcome_->getInterfaceTree(), SLOT(getPoints(int,PointList*)));
connect(&capture_interfaces_dialog_, SIGNAL(setSelectedInterfaces()),
this->main_welcome_->getInterfaceTree(), SLOT(setSelectedInterfaces()));
connect(&capture_interfaces_dialog_, SIGNAL(interfaceListChanged()),
this->main_welcome_->getInterfaceTree(), SLOT(interfaceListChanged()));
#endif
main_ui_->mainStack->setCurrentWidget(main_welcome_);

View File

@ -0,0 +1,450 @@
/* manage_interfaces_dialog.cpp
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include <glib.h>
#include "manage_interfaces_dialog.h"
#include "ui_manage_interfaces_dialog.h"
#include "epan/prefs.h"
#include "ui/last_open_dir.h"
#include "capture_opts.h"
#include "ui/capture_globals.h"
#include "ui/qt/capture_interfaces_dialog.h"
#include "ui/iface_lists.h"
#include "ui/preference_utils.h"
#ifdef HAVE_LIBPCAP
#include <QFileDialog>
#include <QHBoxLayout>
#include <QMessageBox>
#include <QCheckBox>
ManageInterfacesDialog::ManageInterfacesDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ManageInterfacesDialog)
{
ui->setupUi(this);
#ifdef Q_OS_MAC
ui->addButton->setAttribute(Qt::WA_MacSmallSize, true);
ui->delButton->setAttribute(Qt::WA_MacSmallSize, true);
#endif
ui->pipeList->setItemDelegateForColumn(0, &new_pipe_item_delegate_);
new_pipe_item_delegate_.setTable(ui->pipeList);
showPipes();
connect(this, SIGNAL(ifsChanged()), parent, SIGNAL(ifsChanged()));
showLocalInterfaces();
#if !defined(HAVE_PCAP_REMOTE)
ui->tabWidget->removeTab(2);
#endif
}
ManageInterfacesDialog::~ManageInterfacesDialog()
{
delete ui;
}
void ManageInterfacesDialog::showPipes()
{
ui->pipeList->setRowCount(0);
if (global_capture_opts.all_ifaces->len > 0) {
interface_t device;
for (guint i = 0; i < global_capture_opts.all_ifaces->len; i++) {
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
/* Continue if capture device is hidden */
if (device.hidden || device.type != IF_PIPE) {
continue;
}
ui->pipeList->setRowCount(ui->pipeList->rowCount()+1);
QString output = QString(device.display_name);
ui->pipeList->setItem(ui->pipeList->rowCount()-1, INTERFACE, new QTableWidgetItem(output));
}
}
}
void ManageInterfacesDialog::on_addButton_clicked()
{
ui->pipeList->setRowCount(ui->pipeList->rowCount() + 1);
QTableWidgetItem *widget = new QTableWidgetItem(QString(tr("New Pipe")));
ui->pipeList->setItem(ui->pipeList->rowCount() - 1 , 0, widget);
}
void ManageInterfacesDialog::on_buttonBox_accepted()
{
interface_t device;
gchar *pipe_name;
for (int row = 0; row < ui->pipeList->rowCount(); row++) {
pipe_name = g_strdup(ui->pipeList->item(row,0)->text().toUtf8().constData());
if (!strcmp(pipe_name, "New pipe") || !strcmp(pipe_name, "")) {
g_free(pipe_name);
return;
}
for (guint i = 0; i < global_capture_opts.all_ifaces->len; i++) {
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
if (strcmp(pipe_name, device.name) == 0) {
g_free(pipe_name);
return;
}
}
device.name = g_strdup(pipe_name);
device.display_name = g_strdup_printf("%s", device.name);
device.hidden = FALSE;
device.selected = TRUE;
device.type = IF_PIPE;
device.pmode = global_capture_opts.default_options.promisc_mode;
device.has_snaplen = global_capture_opts.default_options.has_snaplen;
device.snaplen = global_capture_opts.default_options.snaplen;
device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
device.addresses = g_strdup("");
device.no_addresses = 0;
device.last_packets = 0;
device.links = NULL;
#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
#endif
device.active_dlt = -1;
device.locked = FALSE;
device.if_info.name = g_strdup(pipe_name);
device.if_info.friendly_name = NULL;
device.if_info.vendor_description = NULL;
device.if_info.addrs = NULL;
device.if_info.loopback = FALSE;
device.if_info.type = IF_PIPE;
#if defined(HAVE_PCAP_CREATE)
device.monitor_mode_enabled = FALSE;
device.monitor_mode_supported = FALSE;
#endif
global_capture_opts.num_selected++;
g_array_append_val(global_capture_opts.all_ifaces, device);
g_free(pipe_name);
}
emit ifsChanged();
}
void ManageInterfacesDialog::on_delButton_clicked()
{
interface_t device;
bool found = false;
QList<QTableWidgetItem*> selected = ui->pipeList->selectedItems();
if (selected.length() == 0) {
QMessageBox::warning(this, tr("Error"),
tr("No interface selected."));
return;
}
QString pipename = selected[0]->text();
for (guint i = 0; i < global_capture_opts.all_ifaces->len; i++) {
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
/* Continue if capture device is hidden or not a pipe*/
if (device.hidden || device.type != IF_PIPE) {
continue;
}
if (pipename.compare(device.name)) {
continue;
}
global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
ui->pipeList->removeRow(selected[0]->row());
found = true;
break;
}
if (found)
emit ifsChanged();
else /* pipe has not been saved yet */
ui->pipeList->removeRow(selected[0]->row());
}
void ManageInterfacesDialog::showLocalInterfaces()
{
guint i;
interface_t device;
QString output;
Qt::ItemFlags eFlags;
gchar *pr_descr = g_strdup("");
char *comment = NULL;
ui->localList->setRowCount(0);
for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
if (device.local && device.type != IF_PIPE && device.type != IF_STDIN) {
ui->localList->setRowCount(ui->localList->rowCount()+1);
QTableWidgetItem *item = new QTableWidgetItem("");
item->setCheckState(device.hidden?Qt::Checked:Qt::Unchecked);
ui->localList->setItem(ui->localList->rowCount()-1, HIDE, item);
ui->localList->setColumnWidth(HIDE, 40);
#ifdef _WIN32
output = QString(device.friendly_name);
ui->localList->setItem(ui->localList->rowCount()-1, FRIENDLY, new QTableWidgetItem(output));
eFlags = ui->localList->item(ui->localList->rowCount()-1, FRIENDLY)->flags();
eFlags &= Qt::NoItemFlags;
eFlags |= Qt::ItemIsSelectable | Qt::ItemIsEnabled;
ui->localList->item(ui->localList->rowCount()-1, FRIENDLY)->setFlags(eFlags);
#else
ui->localList->setColumnHidden(FRIENDLY, true);
#endif
output = QString(device.name);
ui->localList->setItem(ui->localList->rowCount()-1, LOCAL_NAME, new QTableWidgetItem(output));
output = QString("");
eFlags = ui->localList->item(ui->localList->rowCount()-1, FRIENDLY)->flags();
eFlags &= Qt::NoItemFlags;
eFlags |= Qt::ItemIsSelectable | Qt::ItemIsEnabled;
ui->localList->item(ui->localList->rowCount()-1, LOCAL_NAME)->setFlags(eFlags);
comment = capture_dev_user_descr_find(device.name);
if (comment)
output = QString(comment);
ui->localList->setItem(ui->localList->rowCount()-1, COMMENT, new QTableWidgetItem(output));
} else {
continue;
}
}
g_free(pr_descr);
}
void ManageInterfacesDialog::saveLocalHideChanges(QTableWidgetItem* item)
{
guint i;
interface_t device;
if (item->column() != HIDE) {
return;
}
QTableWidgetItem* nameItem = ui->localList->item(item->row(), LOCAL_NAME);
if (!nameItem) {
return;
}
QString name = nameItem->text();
/* See if this is the currently selected capturing device */
for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
if (name.compare(device.name)) {
continue;
}
device.hidden = (item->checkState()==Qt::Checked?true:false);
global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
g_array_insert_val(global_capture_opts.all_ifaces, i, device);
}
}
void ManageInterfacesDialog::saveLocalCommentChanges(QTableWidgetItem* item)
{
guint i;
interface_t device;
if (item->column() != COMMENT) {
return;
}
QTableWidgetItem* nameItem = ui->localList->item(item->row(), LOCAL_NAME);
if (!nameItem) {
return;
}
QString name = nameItem->text();
QString comment = ui->localList->item(item->row(), COMMENT)->text();
/* See if this is the currently selected capturing device */
for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
if (name.compare(device.name)) {
continue;
}
if (!comment.compare("")) {
device.display_name = g_strdup_printf("%s", name.toUtf8().constData());
} else {
device.display_name = g_strdup_printf("%s: %s", comment.toUtf8().constData(), name.toUtf8().constData());
}
global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
g_array_insert_val(global_capture_opts.all_ifaces, i, device);
}
}
void ManageInterfacesDialog::checkBoxChanged(QTableWidgetItem* item)
{
guint i;
interface_t device;
if (item->column() != HIDE) {
return;
}
QTableWidgetItem* nameItem = ui->localList->item(item->row(), LOCAL_NAME);
if (!nameItem) {
return;
}
QString name = nameItem->text();
/* See if this is the currently selected capturing device */
for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
if (name.compare(device.name)) {
continue;
}
if (prefs.capture_device && strstr(prefs.capture_device, device.name) && item->checkState() == Qt::Checked) {
/* Don't allow current interface to be hidden */
QMessageBox::warning(this, tr("Error"),
tr("Default interface cannot be hidden."));
item->setCheckState(Qt::Unchecked);
return;
}
}
}
void ManageInterfacesDialog::on_localButtonBox_accepted()
{
gchar *new_hide = g_strdup("");
gchar *new_comment = NULL;
QString name;
gchar *tmp_descr = NULL;
if (global_capture_opts.all_ifaces->len > 0) {
new_hide = (gchar*)g_malloc0(MAX_VAL_LEN);
for (int row = 0; row < ui->localList->rowCount(); row++) {
QTableWidgetItem* hitem = ui->localList->item(row, HIDE);
checkBoxChanged(hitem);
if (hitem->checkState() == Qt::Checked) {
name = ui->localList->item(row, LOCAL_NAME)->text();
g_strlcat (new_hide, ",", MAX_VAL_LEN);
g_strlcat (new_hide, name.toUtf8().constData(), MAX_VAL_LEN);
}
saveLocalHideChanges(hitem);
}
/* write new "hidden" string to preferences */
g_free(prefs.capture_devices_hide);
prefs.capture_devices_hide = new_hide;
hide_interface(g_strdup(new_hide));
new_comment = (gchar*)g_malloc0(MAX_VAL_LEN);
for (int row = 0; row < ui->localList->rowCount(); row++) {
name = ui->localList->item(row, LOCAL_NAME)->text();
QTableWidgetItem* citem = ui->localList->item(row, COMMENT);
if (citem->text().compare("")) {
g_strlcat (new_comment, ",", MAX_VAL_LEN);
tmp_descr = g_strdup_printf("%s(%s)", name.toUtf8().constData(), citem->text().toUtf8().constData());
g_strlcat (new_comment, tmp_descr, MAX_VAL_LEN);
g_free(tmp_descr);
}
saveLocalCommentChanges(citem);
}
/* write new description string to preferences */
if (prefs.capture_devices_descr)
g_free(prefs.capture_devices_descr);
prefs.capture_devices_descr = new_comment;
}
/* save changes to the preferences file */
if (!prefs.gui_use_pref_save) {
prefs_main_write();
}
emit ifsChanged();
}
NewFileDelegate::NewFileDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
NewFileDelegate::~NewFileDelegate()
{
}
QWidget* NewFileDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
Q_UNUSED(option);
Q_UNUSED(index);
QWidget * widg = new QWidget(parent);
QHBoxLayout *hbox = new QHBoxLayout(widg);
widg->setLayout(hbox);
QLineEdit *le = new QLineEdit(widg);
QPushButton *pb = new QPushButton(widg);
pb->setText(QString(tr("Browse...")));
le->setText(table->currentItem()->text());
hbox->addWidget(le);
hbox->addWidget(pb);
hbox->setMargin(0);
connect(le, SIGNAL(textEdited(const QString &)), this, SLOT(setTextField(const QString &)));
connect(le, SIGNAL(editingFinished()), this, SLOT(stopEditor()));
connect(pb, SIGNAL(pressed()), this, SLOT(browse_button_clicked()));
return widg;
}
void NewFileDelegate::setTextField(const QString &text)
{
table->currentItem()->setText(text);
}
void NewFileDelegate::stopEditor()
{
closeEditor(table->cellWidget(table->currentRow(), 0));
}
void NewFileDelegate::browse_button_clicked()
{
char *open_dir = NULL;
switch (prefs.gui_fileopen_style) {
case FO_STYLE_LAST_OPENED:
open_dir = get_last_open_dir();
break;
case FO_STYLE_SPECIFIED:
if (prefs.gui_fileopen_dir[0] != '\0')
open_dir = prefs.gui_fileopen_dir;
break;
}
QString file_name = QFileDialog::getOpenFileName(table, tr("Open Pipe"), open_dir);
closeEditor(table->cellWidget(table->currentRow(), 0));
table->currentItem()->setText(file_name);
}
#endif /* HAVE_LIBPCAP */
//
// Editor modelines - http://www.wireshark.org/tools/modelines.html
//
// Local variables:
// c-basic-offset: 4
// tab-width: 4
// indent-tabs-mode: nil
// End:
//
// vi: set shiftwidth=4 tabstop=4 expandtab:
// :indentSize=4:tabSize=4:noTabs=true:
//

View File

@ -0,0 +1,106 @@
/* manage_interfaces_dialog.h
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MANAGE_INTERFACES_DIALOG_H
#define MANAGE_INTERFACES_DIALOG_H
#include <QDialog>
#include <QLineEdit>
#include <QTableWidget>
#include <QStyledItemDelegate>
enum
{
HIDE = 0,
FRIENDLY,
LOCAL_NAME,
COMMENT,
NUM_LOCAL_COLUMNS
};
class NewFileDelegate : public QStyledItemDelegate
{
Q_OBJECT
private:
QTableWidget* table;
public:
NewFileDelegate(QObject *parent = 0);
~NewFileDelegate();
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setTable(QTableWidget* tb) { table = tb; };
private slots:
void browse_button_clicked();
void setTextField(const QString &text);
void stopEditor();
};
namespace Ui {
class ManageInterfacesDialog;
}
class ManageInterfacesDialog : public QDialog
{
Q_OBJECT
public:
explicit ManageInterfacesDialog(QWidget *parent = 0);
~ManageInterfacesDialog();
private:
Ui::ManageInterfacesDialog *ui;
NewFileDelegate new_pipe_item_delegate_;
void showPipes();
void showLocalInterfaces();
void saveLocalHideChanges(QTableWidgetItem *item);
void saveLocalCommentChanges(QTableWidgetItem *item);
void checkBoxChanged(QTableWidgetItem *item);
signals:
void ifsChanged();
private slots:
void on_addButton_clicked();
void on_buttonBox_accepted();
void on_delButton_clicked();
void on_localButtonBox_accepted();
};
#endif // MANAGE_INTERFACES_DIALOG_H
//
// Editor modelines - http://www.wireshark.org/tools/modelines.html
//
// Local variables:
// c-basic-offset: 4
// tab-width: 4
// indent-tabs-mode: nil
// End:
//
// vi: set shiftwidth=4 tabstop=4 expandtab:
// :indentSize=4:tabSize=4:noTabs=true:
//

View File

@ -0,0 +1,327 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ManageInterfacesDialog</class>
<widget class="QDialog" name="ManageInterfacesDialog">
<property name="windowModality">
<enum>Qt::ApplicationModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>574</width>
<height>338</height>
</rect>
</property>
<property name="windowTitle">
<string>Manage Interfaces</string>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="modal">
<bool>false</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="Pipes">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Add a pipe to capture from or remove an existing pipe from the list.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<attribute name="title">
<string>Pipes</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QTableWidget" name="pipeList">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="rowCount">
<number>1</number>
</property>
<property name="columnCount">
<number>1</number>
</property>
<attribute name="horizontalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<row/>
<column>
<property name="text">
<string>Pipe</string>
</property>
</column>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="addButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Add a new pipe using default settings.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../image/toolbar.qrc">
<normaloff>:/stock/plus-8.png</normaloff>:/stock/plus-8.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="delButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Remove the selected pipe from the list.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../image/toolbar.qrc">
<normaloff>:/stock/minus-8.png</normaloff>:/stock/minus-8.png</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="Local">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click the checkbox to hide or show a hidden interface.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<attribute name="title">
<string>Local Interfaces</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QTableWidget" name="localList">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::DoubleClicked</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string>Hide</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
</column>
<column>
<property name="text">
<string>Friendly Name</string>
</property>
</column>
<column>
<property name="text">
<string>Interface Name</string>
</property>
</column>
<column>
<property name="text">
<string>Comment</string>
</property>
</column>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="localButtonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="Remote">
<attribute name="title">
<string>Remote Interfaces</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../../image/toolbar.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ManageInterfacesDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>469</x>
<y>303</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>164</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ManageInterfacesDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>469</x>
<y>303</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>164</y>
</hint>
</hints>
</connection>
<connection>
<sender>localButtonBox</sender>
<signal>rejected()</signal>
<receiver>ManageInterfacesDialog</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>469</x>
<y>303</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>164</y>
</hint>
</hints>
</connection>
<connection>
<sender>localButtonBox</sender>
<signal>accepted()</signal>
<receiver>ManageInterfacesDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>469</x>
<y>303</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>164</y>
</hint>
</hints>
</connection>
</connections>
</ui>