summaryrefslogtreecommitdiff
path: root/ui/qt/capture_interfaces_dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ui/qt/capture_interfaces_dialog.cpp')
-rw-r--r--ui/qt/capture_interfaces_dialog.cpp609
1 files changed, 510 insertions, 99 deletions
diff --git a/ui/qt/capture_interfaces_dialog.cpp b/ui/qt/capture_interfaces_dialog.cpp
index effdf1a311..173faf1269 100644
--- a/ui/qt/capture_interfaces_dialog.cpp
+++ b/ui/qt/capture_interfaces_dialog.cpp
@@ -24,13 +24,16 @@
#include <glib.h>
#include "capture_interfaces_dialog.h"
+#include "capture_filter_combo.h"
#include "ui_capture_interfaces_dialog.h"
+#include "compiled_filter_output.h"
#include "wireshark_application.h"
#ifdef HAVE_LIBPCAP
#include <QTimer>
+#include <QMessageBox>
#include "capture_ui_utils.h"
#include "ui/capture_globals.h"
@@ -38,6 +41,7 @@
#include "ui/ui_util.h"
#include "ui/utf8_entities.h"
+#include "ui/preference_utils.h"
#include <cstdio>
#include <epan/prefs.h>
@@ -59,14 +63,51 @@ CaptureInterfacesDialog::CaptureInterfacesDialog(QWidget *parent) :
// XXX - Enable / disable as needed
start_bt_ = ui->buttonBox->addButton(tr("Start"), QDialogButtonBox::YesRole);
- connect(start_bt_, SIGNAL(clicked()), this, SLOT(on_bStart_clicked()));
- stop_bt_ = ui->buttonBox->addButton(tr("Stop"), QDialogButtonBox::NoRole);
- stop_bt_->setEnabled(false);
- connect(stop_bt_, SIGNAL(clicked()), this, SLOT(on_bStop_clicked()));
+ start_bt_->setEnabled((global_capture_opts.num_selected > 0)? true: false);
+ connect(start_bt_, SIGNAL(clicked(bool)), this, SLOT(start_button_clicked()));
- //connect(ui->tbInterfaces,SIGNAL(itemPressed(QTableWidgetItem *)),this,SLOT(tableItemPressed(QTableWidgetItem *)));
connect(ui->tbInterfaces,SIGNAL(itemClicked(QTableWidgetItem *)),this,SLOT(tableItemClicked(QTableWidgetItem *)));
+ 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()));
+}
+
+void CaptureInterfacesDialog::allFilterChanged()
+{
+ QList<QTableWidgetItem*> selected = ui->tbInterfaces->selectedItems();
+ for (int row = 0; row < ui->tbInterfaces->rowCount(); row++)
+ {
+ QTableWidgetItem *it = ui->tbInterfaces->item(row, FILTER);
+ if (selected.contains(it)) {
+ QString str = ui->allFilterComboBox->currentText();
+ it->setText(str);
+ }
+ }
+}
+
+void CaptureInterfacesDialog::tableSelected()
+{
+ interface_t device;
+
+ if (!ui->tbInterfaces->selectedItems().size()) {
+ for (guint i = 0; i < global_capture_opts.all_ifaces->len; i++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
+ device.selected = false;
+ device.locked = true;
+ 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);
+ }
+ global_capture_opts.num_selected = 0;
+ start_bt_->setEnabled(false);
+ emit setSelectedInterfaces();
+ for (guint i = 0; i < global_capture_opts.all_ifaces->len; i++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
+ device.locked = 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 CaptureInterfacesDialog::tableItemClicked(QTableWidgetItem * item)
@@ -74,28 +115,39 @@ void CaptureInterfacesDialog::tableItemClicked(QTableWidgetItem * item)
Q_UNUSED(item)
interface_t device;
+ guint i;
global_capture_opts.num_selected = 0;
+ QString filter = ui->allFilterComboBox->currentText();
+ QList<QTableWidgetItem*> selected = ui->tbInterfaces->selectedItems();
for (int row = 0; row < ui->tbInterfaces->rowCount(); row++)
{
- bool checked = (ui->tbInterfaces->item(row, 0)->checkState() == Qt::Checked) ? true : false;
- QString interface_name = ui->tbInterfaces->item(row, 1)->text();
-
- device = g_array_index(global_capture_opts.all_ifaces, interface_t, row);
+ QTableWidgetItem *it = ui->tbInterfaces->item(row, INTERFACE);
+ QString interface_name = it->text();
- if (checked == true)
- {
- device.selected = TRUE;
+ for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
+ if (interface_name.compare(device.display_name)) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ if (selected.contains(it)) {
+ device.selected = true;
global_capture_opts.num_selected++;
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, row);
- g_array_insert_val(global_capture_opts.all_ifaces, row, device);
+ } else {
+ device.selected = false;
}
- else
- {
- device.selected = FALSE;
- global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, row);
- g_array_insert_val(global_capture_opts.all_ifaces, row, device);
+ 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);
+
+ start_bt_->setEnabled((global_capture_opts.num_selected > 0)? true: false);
+
+ if (filter.compare(QString(""))) {
+ emit interfacesChanged();
}
+ emit setSelectedInterfaces();
}
}
@@ -111,7 +163,17 @@ void CaptureInterfacesDialog::SetTab(int index)
void CaptureInterfacesDialog::on_capturePromModeCheckBox_toggled(bool checked)
{
+ interface_t device;
prefs.capture_prom_mode = checked;
+ for (int row = 0; row < ui->tbInterfaces->rowCount(); row++){
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, deviceMap[row]);
+ QString device_name = ui->tbInterfaces->item(row, INTERFACE)->text();
+ device.pmode = checked;
+ global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, deviceMap[row]);
+ g_array_insert_val(global_capture_opts.all_ifaces, deviceMap[row], device);
+ QTableWidgetItem *it = ui->tbInterfaces->item(row, PMODE);
+ it->setText(checked? tr("enabled"):tr("disabled"));
+ }
}
void CaptureInterfacesDialog::on_gbStopCaptureAuto_toggled(bool checked)
@@ -155,25 +217,20 @@ void CaptureInterfacesDialog::on_cbResolveTransportNames_toggled(bool checked)
gbl_resolv_flags.transport_name = checked;
}
-void CaptureInterfacesDialog::on_bStart_clicked()
+void CaptureInterfacesDialog::start_button_clicked()
{
qDebug("Starting capture");
- emit startCapture();
+ saveOptionsToPreferences();
+ emit setFilterValid(true);
accept();
}
-void CaptureInterfacesDialog::on_bStop_clicked()
-{
- qDebug("Stop capture");
-
- emit stopCapture();
-}
-
// Not sure why we have to do this manually.
void CaptureInterfacesDialog::on_buttonBox_rejected()
{
+ saveOptionsToPreferences();
reject();
}
@@ -205,27 +262,17 @@ void CaptureInterfacesDialog::UpdateInterfaces()
ui->tbInterfaces->setRowCount(0);
- GList *if_list;
- int err;
- gchar *err_str = NULL;
GList *list;
char *snaplen_string, *linkname;
- //guint i;
link_row *linkr = NULL;
- //interface_t device;
#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
gint buffer;
#endif
gint snaplen;
gboolean hassnap, pmode;
- if_list = capture_interface_list(&err, &err_str,main_window_update);
- if_list = g_list_sort(if_list, if_list_comparator_alph);
-
- // XXX Do we need to check for this? capture_interface_list returns an error if the length is 0.
- if (g_list_length(if_list) > 0) {
+ if (global_capture_opts.all_ifaces->len > 0) {
interface_t device;
- //setDisabled(false);
for (guint i = 0; i < global_capture_opts.all_ifaces->len; i++) {
QList<int> *points;
@@ -236,22 +283,20 @@ void CaptureInterfacesDialog::UpdateInterfaces()
if (device.hidden) {
continue;
}
-
+ deviceMap[ui->tbInterfaces->rowCount()] = i;
QString output;
ui->tbInterfaces->setRowCount(ui->tbInterfaces->rowCount() + 1);
- QTableWidgetItem *cbSelected = new QTableWidgetItem();
- cbSelected->setCheckState(device.selected ? Qt::Checked : Qt::Unchecked);
- ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, CAPTURE, cbSelected);
-
// traffic lines
ui->tbInterfaces->setItemDelegateForColumn(TRAFFIC, new SparkLineDelegate());
points = new QList<int>();
QTableWidgetItem *ti = new QTableWidgetItem();
+ ti->setFlags(Qt::NoItemFlags);
ti->setData(Qt::UserRole, qVariantFromValue(points));
ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, TRAFFIC, ti);
+ ui->tbInterfaces->setItemDelegateForColumn(INTERFACE, &combobox_item_delegate_);
output = QString(device.display_name);
ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, INTERFACE, new QTableWidgetItem(output));
@@ -300,38 +345,61 @@ void CaptureInterfacesDialog::UpdateInterfaces()
}
#endif
+ combobox_item_delegate_.setTable(ui->tbInterfaces);
+ ui->tbInterfaces->setColumnWidth(LINK, 100);
+ ui->tbInterfaces->setItemDelegateForColumn(LINK, &combobox_item_delegate_);
output = QString(linkname);
ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, LINK, new QTableWidgetItem(output));
- output = QString(device.pmode ? "true" : "false");
+ ui->tbInterfaces->setItemDelegateForColumn(PMODE, &combobox_item_delegate_);
+ output = QString(device.pmode ? tr("enabled") : tr("disabled"));
ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, PMODE, new QTableWidgetItem(output));
+ ui->tbInterfaces->setItemDelegateForColumn(SNAPLEN, &combobox_item_delegate_);
output = QString(snaplen_string);
ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, SNAPLEN, new QTableWidgetItem(output));
-
+#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
+ ui->tbInterfaces->setItemDelegateForColumn(BUFFER, &combobox_item_delegate_);
output = QString().sprintf("%d", device.buffer);
ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, BUFFER, new QTableWidgetItem(output));
-
+#else
+ ui->tbInterfaces->setColumnHidden(SNAPLEN+1, true);
+#endif
#if defined (HAVE_PCAP_CREATE)
- output = QString(device.monitor_mode_enabled ? "true" : "false");
+ ui->tbInterfaces->setItemDelegateForColumn(MONITOR, &combobox_item_delegate_);
+ output = QString(device.monitor_mode_supported? (device.monitor_mode_enabled ? tr("enabled") : tr("disabled")) : tr("n/a"));
ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, MONITOR, new QTableWidgetItem(output));
-#else
+#elif defined (_WIN32)
ui->tbInterfaces->setColumnHidden(BUFFER+1, true);
+#else
+ ui->tbInterfaces->setColumnHidden(SNAPLEN+2, true);
#endif
+ ui->tbInterfaces->setItemDelegateForColumn(FILTER, &combobox_item_delegate_);
+ gchar* prefFilter = capture_dev_user_cfilter_find(device.name);
+ if (prefFilter) {
+ device.cfilter = g_strdup(prefFilter);
+ }
+ output = QString(device.cfilter);
+ ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, FILTER, new QTableWidgetItem(output));
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) {
- ui->tbInterfaces->item(ui->tbInterfaces->rowCount()-1, 0)->setSelected(true);
+ for (int j = 0; j < NUM_COLUMNS; j++) {
+ if (ui->tbInterfaces->isColumnHidden(j))
+ continue;
+ else
+ ui->tbInterfaces->item(ui->tbInterfaces->rowCount()-1, j)->setSelected(true);
+ }
}
+ 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);
}
}
- free_interface_list(if_list);
resizeEvent(NULL);
+ start_bt_->setEnabled((global_capture_opts.num_selected > 0)? true: false);
if (!stat_timer_) {
updateStatistics();
@@ -343,76 +411,419 @@ void CaptureInterfacesDialog::UpdateInterfaces()
void CaptureInterfacesDialog::updateStatistics(void)
{
- //guint diff;
QList<int> *points = NULL;
+ interface_t device;
+ for (int row = 0; row < ui->tbInterfaces->rowCount(); row++) {
+ points = new QList<int>();
- if (!stat_cache_) {
- // Start gathering statistics using dumpcap
- // We crash (on OS X at least) if we try to do this from ::showEvent.
- stat_cache_ = capture_stat_start(&global_capture_opts);
+ for (guint if_idx = 0; if_idx < global_capture_opts.all_ifaces->len; if_idx++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, if_idx);
+ QString device_name = ui->tbInterfaces->item(row, INTERFACE)->text();
+ if (device_name.compare(device.display_name) || device.hidden || device.type == IF_PIPE) {
+ continue;
+ }
+ points = ui->tbInterfaces->item(row, TRAFFIC)->data(Qt::UserRole).value<QList<int> *>();
+ points->append(device.packet_diff);
+ QTableWidgetItem *ti = new QTableWidgetItem();
+ ti = ui->tbInterfaces->item(row, TRAFFIC);
+ ti->setData(Qt::UserRole, qVariantFromValue(points));
+ ui->tbInterfaces->viewport()->update();
+ }
}
- if (!stat_cache_) return;
-
+}
+void CaptureInterfacesDialog::on_compileBPF_clicked()
+{
+ QString filter = ui->allFilterComboBox->currentText();
+ if (!filter.compare(QString(""))) {
+ QMessageBox::warning(this, tr("Error"),
+ tr("Set a filter string to compile."));
+ return;
+ }
+ QList<QTableWidgetItem*> selected = ui->tbInterfaces->selectedItems();
+ if (selected.length() == 0) {
+ QMessageBox::warning(this, tr("Error"),
+ tr("No interfaces selected."));
+ return;
+ }
+ QStringList *interfaces = new QStringList();
for (int row = 0; row < ui->tbInterfaces->rowCount(); row++)
{
- //bool checked = (ui->tbInterfaces->item(row, 0)->checkState() == Qt::Checked) ? true : false;
+ QTableWidgetItem *it = ui->tbInterfaces->item(row, INTERFACE);
+ if (selected.contains(it)) {
+ QString str = it->text();
+ interfaces->append(it->text());
+ }
+ }
- //points = new QList<int>();
+ CompiledFilterOutput *cfo = new CompiledFilterOutput(this, interfaces, filter);
-// for (if_idx = 0; if_idx < global_capture_opts.all_ifaces->len; if_idx++) {
-// device = g_array_index(global_capture_opts.all_ifaces, interface_t, if_idx);
-// QString device_name = ui->tbInterfaces->item(row, INTERFACE)->text();
-// if (device_name.compare(device.name) || device.hidden || device.type == IF_PIPE)
-// continue;
+ cfo->show();
+}
- //diff = 0;
-// if (capture_stats(stat_cache_, device.name, &stats)) {
-// if ((int)(stats.ps_recv - device.last_packets) >= 0) {
-// diff = stats.ps_recv - device.last_packets;
-// }
-// device.last_packets = stats.ps_recv;
-// }
+void CaptureInterfacesDialog::saveOptionsToPreferences()
+{
+ interface_t device;
+ gchar *new_prefs, *tmp_prefs;
- points = ui->tbInterfaces->item(row, TRAFFIC)->data(Qt::UserRole).value<QList<int> *>();
- emit getPoints(row, points);
- //ui->tbInterfaces->item
+ for (int col = LINK; col <= FILTER; col++){
+ if (ui->tbInterfaces->isColumnHidden(col)) {
+ continue;
+ }
+ /* All entries are separated by comma. There is also one before the first interface to be able to identify
+ word boundaries. As 'lo' is part of 'nflog' an exact match is necessary. */
+ switch (col) {
+ case LINK:
+ new_prefs = (gchar *)g_malloc0(MAX_VAL_LEN);
+
+ for (int row = 0; row < ui->tbInterfaces->rowCount(); row++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, deviceMap[row]);
+ if (device.active_dlt == -1) {
+ continue;
+ }
+ g_strlcat(new_prefs, ",", MAX_VAL_LEN);
+ tmp_prefs = g_strdup_printf("%s(%d)", device.name, device.active_dlt);
+ g_strlcat(new_prefs, tmp_prefs, MAX_VAL_LEN);
+ g_free(tmp_prefs);
+ }
+ g_free(prefs.capture_devices_linktypes);
+ prefs.capture_devices_linktypes = new_prefs;
+ break;
+#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
+ case BUFFER:
+ new_prefs = (gchar *)g_malloc0(MAX_VAL_LEN);
+
+ for (int row = 0; row < ui->tbInterfaces->rowCount(); row++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, deviceMap[row]);
+ if (device.buffer == -1) {
+ continue;
+ }
+ g_strlcat(new_prefs, ",", MAX_VAL_LEN);
+ tmp_prefs = g_strdup_printf("%s(%d)", device.name, device.buffer);
+ g_strlcat(new_prefs, tmp_prefs, MAX_VAL_LEN);
+ g_free(tmp_prefs);
+ }
+ g_free(prefs.capture_devices_buffersize);
+ prefs.capture_devices_buffersize = new_prefs;
+ break;
+#endif
+ case SNAPLEN:
+ new_prefs = (gchar *)g_malloc0(MAX_VAL_LEN);
+
+ for (int row = 0; row < ui->tbInterfaces->rowCount(); row++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, deviceMap[row]);
+ g_strlcat(new_prefs, ",", MAX_VAL_LEN);
+ tmp_prefs = g_strdup_printf("%s:%d(%d)", device.name, device.has_snaplen, (device.has_snaplen?device.snaplen:WTAP_MAX_PACKET_SIZE));
+ g_strlcat(new_prefs, tmp_prefs, MAX_VAL_LEN);
+ g_free(tmp_prefs);
+ }
+ g_free(prefs.capture_devices_snaplen);
+ prefs.capture_devices_snaplen = new_prefs;
+ break;
+ case PMODE:
+ new_prefs = (gchar *)g_malloc0(MAX_VAL_LEN);
+
+ for (int row = 0; row < ui->tbInterfaces->rowCount(); row++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, deviceMap[row]);
+ if (device.pmode == -1) {
+ continue;
+ }
+ g_strlcat(new_prefs, ",", MAX_VAL_LEN);
+ tmp_prefs = g_strdup_printf("%s(%d)", device.name, device.pmode);
+ g_strlcat(new_prefs, tmp_prefs, MAX_VAL_LEN);
+ g_free(tmp_prefs);
+ }
+ g_free(prefs.capture_devices_pmode);
+ prefs.capture_devices_pmode = new_prefs;
+ break;
+#ifdef HAVE_PCAP_CREATE
+ case MONITOR:
+ new_prefs = (gchar *)g_malloc0(MAX_VAL_LEN);
+
+ for (int row = 0; row < ui->tbInterfaces->rowCount(); row++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, deviceMap[row]);
+ if (!device.monitor_mode_supported || (device.monitor_mode_supported && !device.monitor_mode_enabled)) {
+ continue;
+ }
+ g_strlcat(new_prefs, ",", MAX_VAL_LEN);
+ tmp_prefs = g_strdup_printf("%s", device.name);
+ g_strlcat(new_prefs, tmp_prefs, MAX_VAL_LEN);
+ g_free(tmp_prefs);
+ }
+ g_free(prefs.capture_devices_monitor_mode);
+ prefs.capture_devices_monitor_mode = new_prefs;
+ break;
+#endif
+ case FILTER:
+ new_prefs = (gchar *)g_malloc0(MAX_VAL_LEN);
+
+ for (int row = 0; row < ui->tbInterfaces->rowCount(); row++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, deviceMap[row]);
+ if (!device.cfilter) {
+ continue;
+ }
+ g_strlcat(new_prefs, ",", MAX_VAL_LEN);
+ tmp_prefs = g_strdup_printf("%s(%s)", device.name, device.cfilter);
+ g_strlcat(new_prefs, tmp_prefs, MAX_VAL_LEN);
+ g_free(tmp_prefs);
+ }
+ g_free(prefs.capture_devices_filter);
+ prefs.capture_devices_filter = new_prefs;
+ break;
+ }
+ }
+ if (!prefs.gui_use_pref_save) {
+ prefs_main_write();
+ }
+}
- //ui->tbInterfaces->setItemDelegateForColumn(TRAFFIC, new SparkLineDelegate());
- //points = new QList<int>();
- //QTableWidgetItem *ti = new QTableWidgetItem();
- //ti->setData(Qt::UserRole, qVariantFromValue(points));
- QTableWidgetItem *ti = ui->tbInterfaces->item(ui->tbInterfaces->rowCount()-1, TRAFFIC);
- ti->setData(Qt::UserRole, qVariantFromValue(points));
- //ui->tbInterfaces->setItem(ui->tbInterfaces->rowCount()-1, TRAFFIC, ti);
+#include <QComboBox>
- //points->append(diff);
- ui->tbInterfaces->viewport()->update();
-// global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, if_idx);
-// g_array_insert_val(global_capture_opts.all_ifaces, if_idx, device);
+TbInterfacesDelegate::TbInterfacesDelegate(QObject *parent)
+ : QStyledItemDelegate(parent)
+{
+}
+
+
+TbInterfacesDelegate::~TbInterfacesDelegate()
+{
+}
+
+
+QWidget* TbInterfacesDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
+{
+ Q_UNUSED(option);
+ QWidget *w = NULL;
+#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
+ gint buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
+#endif
+ guint snap = WTAP_MAX_PACKET_SIZE;
+ if (index.column() > 1) {
+ interface_t device;
+ QTableWidgetItem *it = table->item(index.row(), INTERFACE);
+ QString interface_name = it->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);
+#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
+ buffer = device.buffer;
+#endif
+ snap = device.snaplen;
+ if (interface_name.compare(device.display_name) || device.hidden || device.type == IF_PIPE) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ switch (index.column()) {
+ case INTERFACE:
+ break;
+ case LINK:
+ {
+ GList *list;
+ link_row *temp;
+ QComboBox *cb = new QComboBox(parent);
+ for (list=device.links; list!=NULL; list=g_list_next(list)) {
+ temp = (link_row*)(list->data);
+ cb->addItem(QString("%1").arg(temp->name));
+ }
+ connect(cb, SIGNAL(currentIndexChanged(QString)), this, SLOT(link_changed(QString)));
+ w = (QWidget*) cb;
+ break;
+ }
+ case PMODE:
+ {
+ // Create the combobox and populate it
+ QComboBox *cb = new QComboBox(parent);
+ cb->addItem(QString(tr("enabled")));
+ cb->addItem(QString(tr("disabled")));
+ connect(cb, SIGNAL(currentIndexChanged(QString)), this, SLOT(pmode_changed(QString)));
+ w = (QWidget*) cb;
+ break;
+ }
+#if defined (HAVE_PCAP_CREATE)
+ case MONITOR:
+ {
+ if (index.data().toString().compare(QString("n/a"))) {
+ QComboBox *cb = new QComboBox(parent);
+ cb->addItem(QString(tr("enabled")));
+ cb->addItem(QString(tr("disabled")));
+ connect(cb, SIGNAL(currentIndexChanged(QString)), this, SLOT(monitor_changed(QString)));
+ w = (QWidget*) cb;
+ }
+ break;
+ }
+#endif
+ case SNAPLEN:
+ {
+ QSpinBox *sb = new QSpinBox(parent);
+ sb->setRange(1, 65535);
+ sb->setValue(snap);
+ sb->setWrapping(true);
+ connect(sb, SIGNAL(valueChanged(int)), this, SLOT(snaplen_changed(int)));
+ w = (QWidget*) sb;
+ break;
+ }
+#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
+ case BUFFER:
+ {
+ QSpinBox *sb = new QSpinBox(parent);
+ sb->setRange(1, 65535);
+ sb->setValue(buffer);
+ sb->setWrapping(true);
+ connect(sb, SIGNAL(valueChanged(int)), this, SLOT(buffer_changed(int)));
+ w = (QWidget*) sb;
+ break;
+ }
+#endif
+ case FILTER:
+ {
+ CaptureFilterCombo *cf = new CaptureFilterCombo(parent);
+ w = (QWidget*) cf;
+ }
+ }
}
+ return w;
}
-/*
-void CaptureInterfacesDialog::on_tbInterfaces_hideEvent(QHideEvent *evt)
+bool TbInterfacesDelegate::eventFilter(QObject *object, QEvent *event)
{
- Q_UNUSED(evt);
- if (stat_timer_) stat_timer_->stop();
- if (stat_cache_) {
- capture_stat_stop(stat_cache_);
- stat_cache_ = NULL;
+ QComboBox * comboBox = dynamic_cast<QComboBox*>(object);
+ if (comboBox) {
+ if (event->type() == QEvent::MouseButtonRelease) {
+ comboBox->showPopup();
+ return true;
+ }
+ } else {
+ return QStyledItemDelegate::eventFilter( object, event );
}
+ return false;
}
-void CaptureInterfacesDialog::on_tbInterfaces_showEvent(QShowEvent *evt)
+void TbInterfacesDelegate::pmode_changed(QString index)
{
- Q_UNUSED(evt);
- if (stat_timer_) stat_timer_->start(stat_update_interval_);
+ interface_t device;
+ guint i;
+ QTableWidgetItem *it = table->item(table->currentRow(), INTERFACE);
+ QString interface_name = it->text();
+ for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
+ if (interface_name.compare(device.display_name) || device.hidden || device.type == IF_PIPE) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ if (!index.compare(QString(tr("enabled")))) {
+ device.pmode = true;
+ } else {
+ device.pmode = 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);
+}
+
+#if defined (HAVE_PCAP_CREATE)
+void TbInterfacesDelegate::monitor_changed(QString index)
+{
+ interface_t device;
+ guint i;
+ QTableWidgetItem *it = table->item(table->currentRow(), INTERFACE);
+ QString interface_name = it->text();
+ for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
+ if (interface_name.compare(device.display_name) || device.hidden || device.type == IF_PIPE) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ if (!index.compare(QString(tr("enabled")))) {
+ device.monitor_mode_enabled = true;
+ } else {
+ device.monitor_mode_enabled = 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);
}
-*/
+#endif
+
+void TbInterfacesDelegate::link_changed(QString index)
+{
+ GList *list;
+ link_row *temp;
+ interface_t device;
+ guint i;
+
+ QTableWidgetItem *it = table->item(table->currentRow(), INTERFACE);
+ QString interface_name = it->text();
+ for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
+ if (interface_name.compare(device.display_name) || device.hidden || device.type == IF_PIPE) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ for (list = device.links; list != NULL; list = g_list_next(list)) {
+ temp = (link_row*) (list->data);
+ if (!index.compare(temp->name)) {
+ device.active_dlt = temp->dlt;
+ }
+ }
+ 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 TbInterfacesDelegate::snaplen_changed(int value)
+{
+ interface_t device;
+ guint i;
+ QTableWidgetItem *it = table->item(table->currentRow(), INTERFACE);
+ QString interface_name = it->text();
+ for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
+ if (interface_name.compare(device.display_name) || device.hidden || device.type == IF_PIPE) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ if (value != WTAP_MAX_PACKET_SIZE) {
+ device.has_snaplen = true;
+ device.snaplen = value;
+ } else {
+ device.has_snaplen = false;
+ device.snaplen = WTAP_MAX_PACKET_SIZE;
+ }
+ 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 TbInterfacesDelegate::buffer_changed(int value)
+{
+#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
+ interface_t device;
+ guint i;
+ QTableWidgetItem *it = table->item(table->currentRow(), INTERFACE);
+ QString interface_name = it->text();
+ for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
+ device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
+ if (interface_name.compare(device.display_name) || device.hidden || device.type == IF_PIPE) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ device.buffer = value;
+ 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);
+#endif
+}
+
#endif /* HAVE_LIBPCAP */
/*