2013-11-25 14:15:49 +00:00
/* capture_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 .
*/
2013-11-25 22:01:03 +00:00
# include "config.h"
2013-11-25 14:15:49 +00:00
2013-12-13 18:36:59 +00:00
# include <glib.h>
2013-11-25 14:15:49 +00:00
# include "capture_interfaces_dialog.h"
2014-06-04 09:03:59 +00:00
# include "capture_filter_combo.h"
2013-11-25 14:15:49 +00:00
# include "ui_capture_interfaces_dialog.h"
2014-06-04 09:03:59 +00:00
# include "compiled_filter_output.h"
2014-06-24 09:36:51 +00:00
# include "manage_interfaces_dialog.h"
2013-11-25 14:15:49 +00:00
2013-12-13 18:36:59 +00:00
# include "wireshark_application.h"
2013-11-25 21:50:58 +00:00
2013-12-13 18:36:59 +00:00
# ifdef HAVE_LIBPCAP
2013-11-25 14:15:49 +00:00
# include <QTimer>
2014-08-18 08:04:16 +00:00
# include <QFileDialog>
# include <QMessageBox>
2013-11-25 14:15:49 +00:00
2014-08-18 08:04:16 +00:00
# include "ringbuffer.h"
2014-06-30 01:36:22 +00:00
# include "ui/capture_ui_utils.h"
2013-11-25 14:15:49 +00:00
# include "ui/capture_globals.h"
# include "ui/iface_lists.h"
2014-08-18 08:04:16 +00:00
# include "ui/last_open_dir.h"
2013-11-25 17:01:10 +00:00
# include "ui/ui_util.h"
2014-08-18 08:04:16 +00:00
# include "ui/util.h"
2013-11-25 14:15:49 +00:00
# include "ui/utf8_entities.h"
2014-06-04 09:03:59 +00:00
# include "ui/preference_utils.h"
2013-11-25 14:15:49 +00:00
# include <cstdio>
# include <epan/prefs.h>
# include <epan/prefs-int.h>
2013-12-21 18:40:20 +00:00
# include <epan/addr_resolv.h>
2014-08-18 08:04:16 +00:00
# include <wsutil/filesystem.h>
2013-11-25 14:15:49 +00:00
2014-08-14 20:20:09 +00:00
# include "qt_ui_utils.h"
2013-11-25 14:15:49 +00:00
# include "sparkline_delegate.h"
2014-08-06 21:50:48 +00:00
// To do:
// - Set a size hint for item delegates.
// - Make promiscuous a checkbox.
// - Allow sorting by the traffic column? We'd have to subclass QTreeWidgetItem
// (see ConversationTreeWidget).
2013-11-25 14:15:49 +00:00
const int stat_update_interval_ = 1000 ; // ms
2014-08-06 21:50:48 +00:00
# if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
# define SHOW_BUFFER_COLUMN 1
# endif
# if defined(HAVE_PCAP_CREATE)
# define SHOW_MONITOR_COLUMN 1
# endif
/*
* Symbolic names for column indices .
*/
enum
{
col_interface_ = 0 ,
col_traffic_ ,
col_link_ ,
col_pmode_ ,
col_snaplen_ ,
col_buffer_ ,
col_monitor_ ,
col_filter_ ,
col_num_columns_
} ;
class InterfaceTreeWidgetItem : public QTreeWidgetItem
{
public :
InterfaceTreeWidgetItem ( QTreeWidget * tree ) : QTreeWidgetItem ( tree ) { }
bool operator < ( const QTreeWidgetItem & other ) const ;
} ;
2013-11-25 14:15:49 +00:00
CaptureInterfacesDialog : : CaptureInterfacesDialog ( QWidget * parent ) :
QDialog ( parent ) ,
ui ( new Ui : : CaptureInterfacesDialog )
{
ui - > setupUi ( this ) ;
2014-12-31 22:21:50 +00:00
setWindowTitle ( wsApp - > windowTitleString ( tr ( " Capture Interfaces " ) ) ) ;
2013-11-25 14:15:49 +00:00
stat_timer_ = NULL ;
stat_cache_ = NULL ;
2013-12-13 18:36:59 +00:00
// XXX - Enable / disable as needed
start_bt_ = ui - > buttonBox - > addButton ( tr ( " Start " ) , QDialogButtonBox : : YesRole ) ;
2014-06-04 09:03:59 +00:00
start_bt_ - > setEnabled ( ( global_capture_opts . num_selected > 0 ) ? true : false ) ;
connect ( start_bt_ , SIGNAL ( clicked ( bool ) ) , this , SLOT ( start_button_clicked ( ) ) ) ;
2013-12-13 18:36:59 +00:00
2014-08-06 21:50:48 +00:00
ui - > interfaceTree - > sortByColumn ( col_interface_ , Qt : : AscendingOrder ) ;
ui - > interfaceTree - > setItemDelegateForColumn ( col_interface_ , & interface_item_delegate_ ) ;
ui - > interfaceTree - > setItemDelegateForColumn ( col_traffic_ , new SparkLineDelegate ( ) ) ;
ui - > interfaceTree - > setItemDelegateForColumn ( col_link_ , & interface_item_delegate_ ) ;
ui - > interfaceTree - > setItemDelegateForColumn ( col_pmode_ , & interface_item_delegate_ ) ;
ui - > interfaceTree - > setItemDelegateForColumn ( col_snaplen_ , & interface_item_delegate_ ) ;
# ifdef SHOW_BUFFER_COLUMN
ui - > interfaceTree - > setItemDelegateForColumn ( col_buffer_ , & interface_item_delegate_ ) ;
# else
ui - > interfaceTree - > setColumnHidden ( col_buffer_ , true ) ;
# endif
# ifdef SHOW_MONITOR_COLUMN
ui - > interfaceTree - > setItemDelegateForColumn ( col_monitor_ , & interface_item_delegate_ ) ;
# else
ui - > interfaceTree - > setColumnHidden ( col_monitor_ , true ) ;
# endif
ui - > interfaceTree - > setItemDelegateForColumn ( col_filter_ , & interface_item_delegate_ ) ;
2014-08-14 20:20:09 +00:00
interface_item_delegate_ . setTree ( ui - > interfaceTree ) ;
ui - > interfaceTree - > setColumnWidth ( col_link_ , 100 ) ;
2014-08-06 21:50:48 +00:00
connect ( ui - > interfaceTree , SIGNAL ( itemClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( interfaceClicked ( QTreeWidgetItem * , int ) ) ) ;
connect ( ui - > interfaceTree , SIGNAL ( itemSelectionChanged ( ) ) , this , SLOT ( interfaceSelected ( ) ) ) ;
2014-06-04 09:03:59 +00:00
connect ( ui - > allFilterComboBox , SIGNAL ( captureFilterSyntaxChanged ( bool ) ) , this , SLOT ( allFilterChanged ( ) ) ) ;
connect ( this , SIGNAL ( interfacesChanged ( ) ) , ui - > allFilterComboBox , SIGNAL ( interfacesChanged ( ) ) ) ;
2014-06-24 09:36:51 +00:00
connect ( this , SIGNAL ( ifsChanged ( ) ) , this , SLOT ( refreshInterfaceList ( ) ) ) ;
2014-07-22 00:15:31 +00:00
connect ( wsApp , SIGNAL ( localInterfaceListChanged ( ) ) , this , SLOT ( updateLocalInterfaces ( ) ) ) ;
2014-08-18 08:04:16 +00:00
connect ( ui - > browseButton , SIGNAL ( clicked ( ) ) , this , SLOT ( on_browseButton_clicked ( ) ) ) ;
2014-06-04 09:03:59 +00:00
}
void CaptureInterfacesDialog : : allFilterChanged ( )
{
2014-08-06 21:50:48 +00:00
foreach ( QTreeWidgetItem * ti , ui - > interfaceTree - > selectedItems ( ) ) {
QString str = ui - > allFilterComboBox - > currentText ( ) ;
ti - > setText ( col_filter_ , str ) ;
2014-06-04 09:03:59 +00:00
}
2014-07-22 00:33:38 +00:00
updateWidgets ( ) ;
2014-06-04 09:03:59 +00:00
}
2014-08-06 21:50:48 +00:00
void CaptureInterfacesDialog : : interfaceSelected ( )
2014-06-04 09:03:59 +00:00
{
interface_t device ;
2014-08-06 21:50:48 +00:00
if ( ! ui - > interfaceTree - > selectedItems ( ) . size ( ) ) {
2014-06-04 09:03:59 +00:00
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 ) ;
}
}
2014-07-22 00:33:38 +00:00
updateWidgets ( ) ;
}
void CaptureInterfacesDialog : : updateWidgets ( )
{
SyntaxLineEdit * sle = qobject_cast < SyntaxLineEdit * > ( ui - > allFilterComboBox - > lineEdit ( ) ) ;
if ( ! sle ) {
return ;
}
bool can_capture = false ;
2014-08-06 21:50:48 +00:00
if ( ui - > interfaceTree - > selectedItems ( ) . count ( ) > 0 & & sle - > syntaxState ( ) ! = SyntaxLineEdit : : Invalid ) {
2014-07-22 00:33:38 +00:00
can_capture = true ;
}
ui - > compileBPF - > setEnabled ( can_capture ) ;
start_bt_ - > setEnabled ( can_capture ) ;
2013-11-25 14:15:49 +00:00
}
2014-08-06 21:50:48 +00:00
void CaptureInterfacesDialog : : interfaceClicked ( QTreeWidgetItem * item , int column )
2013-11-25 14:15:49 +00:00
{
Q_UNUSED ( item )
2014-08-06 21:50:48 +00:00
Q_UNUSED ( column )
2014-06-04 09:03:59 +00:00
guint i ;
2014-08-06 21:50:48 +00:00
QString filter = ui - > allFilterComboBox - > currentText ( ) ;
2013-11-25 14:15:49 +00:00
global_capture_opts . num_selected = 0 ;
2014-08-06 21:50:48 +00:00
for ( i = 0 ; i < global_capture_opts . all_ifaces - > len ; i + + ) {
interface_t * device = & g_array_index ( global_capture_opts . all_ifaces , interface_t , i ) ;
device - > selected = FALSE ;
}
2013-11-25 14:15:49 +00:00
2014-08-06 21:50:48 +00:00
foreach ( QTreeWidgetItem * ti , ui - > interfaceTree - > selectedItems ( ) )
2013-11-25 14:15:49 +00:00
{
2014-08-06 21:50:48 +00:00
QString interface_name = ti - > text ( col_interface_ ) ;
2013-11-25 14:15:49 +00:00
2014-06-04 09:03:59 +00:00
for ( i = 0 ; i < global_capture_opts . all_ifaces - > len ; i + + ) {
2014-08-06 21:50:48 +00:00
interface_t * device = & g_array_index ( global_capture_opts . all_ifaces , interface_t , i ) ;
if ( interface_name . compare ( device - > display_name ) ) {
2014-06-04 09:03:59 +00:00
continue ;
} else {
2014-08-06 21:50:48 +00:00
device - > selected = TRUE ;
global_capture_opts . num_selected + + ;
2014-06-04 09:03:59 +00:00
break ;
}
}
2014-08-06 21:50:48 +00:00
start_bt_ - > setEnabled ( ( global_capture_opts . num_selected > 0 ) ? true : false ) ;
2014-06-04 09:03:59 +00:00
if ( filter . compare ( QString ( " " ) ) ) {
emit interfacesChanged ( ) ;
2013-11-25 14:15:49 +00:00
}
2014-06-04 09:03:59 +00:00
emit setSelectedInterfaces ( ) ;
2013-11-25 14:15:49 +00:00
}
}
CaptureInterfacesDialog : : ~ CaptureInterfacesDialog ( )
{
delete ui ;
}
void CaptureInterfacesDialog : : SetTab ( int index )
{
ui - > tabWidget - > setCurrentIndex ( index ) ;
}
void CaptureInterfacesDialog : : on_capturePromModeCheckBox_toggled ( bool checked )
{
2014-06-04 09:03:59 +00:00
interface_t device ;
2013-11-25 14:15:49 +00:00
prefs . capture_prom_mode = checked ;
2014-08-06 21:50:48 +00:00
for ( int row = 0 ; row < ui - > interfaceTree - > topLevelItemCount ( ) ; row + + ) {
2014-06-04 09:03:59 +00:00
device = g_array_index ( global_capture_opts . all_ifaces , interface_t , deviceMap [ row ] ) ;
2014-08-06 21:50:48 +00:00
// QString device_name = ui->interfaceTree->topLevelItem(row)->text(col_interface_);
2014-06-04 09:03:59 +00:00
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 ) ;
2014-08-06 21:50:48 +00:00
QTreeWidgetItem * ti = ui - > interfaceTree - > topLevelItem ( row ) ;
ti - > setText ( col_pmode_ , checked ? tr ( " enabled " ) : tr ( " disabled " ) ) ;
2014-06-04 09:03:59 +00:00
}
2013-11-25 14:15:49 +00:00
}
2014-08-18 08:04:16 +00:00
void CaptureInterfacesDialog : : on_browseButton_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 ( this , tr ( " Specify a Capture File " ) , open_dir ) ;
ui - > lineEdit - > setText ( file_name ) ;
}
2013-12-13 18:36:59 +00:00
void CaptureInterfacesDialog : : on_gbStopCaptureAuto_toggled ( bool checked )
2013-11-25 14:15:49 +00:00
{
global_capture_opts . has_file_duration = checked ;
}
2013-12-13 18:36:59 +00:00
void CaptureInterfacesDialog : : on_gbNewFileAuto_toggled ( bool checked )
2013-11-25 14:15:49 +00:00
{
global_capture_opts . multi_files_on = checked ;
2014-08-18 08:04:16 +00:00
ui - > stopMBCheckBox - > setEnabled ( checked ? false : true ) ;
ui - > stopMBSpinBox - > setEnabled ( checked ? false : true ) ;
ui - > stopMBComboBox - > setEnabled ( checked ? false : true ) ;
2013-11-25 14:15:49 +00:00
}
void CaptureInterfacesDialog : : on_cbUpdatePacketsRT_toggled ( bool checked )
{
global_capture_opts . real_time_mode = checked ;
}
void CaptureInterfacesDialog : : on_cbAutoScroll_toggled ( bool checked )
{
2014-08-18 08:04:16 +00:00
auto_scroll_live = checked ;
2013-11-25 14:15:49 +00:00
}
void CaptureInterfacesDialog : : on_cbExtraCaptureInfo_toggled ( bool checked )
{
global_capture_opts . show_info = checked ;
}
void CaptureInterfacesDialog : : on_cbResolveMacAddresses_toggled ( bool checked )
{
gbl_resolv_flags . mac_name = checked ;
}
void CaptureInterfacesDialog : : on_cbResolveNetworkNames_toggled ( bool checked )
{
gbl_resolv_flags . network_name = checked ;
}
void CaptureInterfacesDialog : : on_cbResolveTransportNames_toggled ( bool checked )
{
gbl_resolv_flags . transport_name = checked ;
}
2014-06-04 09:03:59 +00:00
void CaptureInterfacesDialog : : start_button_clicked ( )
2013-11-25 14:15:49 +00:00
{
qDebug ( " Starting capture " ) ;
2014-08-18 08:04:16 +00:00
if ( saveOptionsToPreferences ( ) ) {
emit setFilterValid ( true ) ;
accept ( ) ;
}
2013-11-25 14:15:49 +00:00
}
2013-12-13 18:36:59 +00:00
// Not sure why we have to do this manually.
void CaptureInterfacesDialog : : on_buttonBox_rejected ( )
{
2014-08-18 08:04:16 +00:00
if ( saveOptionsToPreferences ( ) ) {
reject ( ) ;
}
2013-12-13 18:36:59 +00:00
}
void CaptureInterfacesDialog : : on_buttonBox_helpRequested ( )
{
// Probably the wrong URL.
wsApp - > helpTopicAction ( HELP_CAPTURE_INTERFACES_DIALOG ) ;
}
2014-08-06 21:50:48 +00:00
void CaptureInterfacesDialog : : updateInterfaces ( )
2013-11-25 14:15:49 +00:00
{
2013-12-13 18:36:59 +00:00
if ( prefs . capture_pcap_ng ) {
ui - > rbPcapng - > setChecked ( true ) ;
} else {
ui - > rbPcap - > setChecked ( true ) ;
}
2013-11-25 14:15:49 +00:00
ui - > capturePromModeCheckBox - > setChecked ( prefs . capture_prom_mode ) ;
2014-08-18 08:04:16 +00:00
if ( global_capture_opts . saving_to_file ) {
ui - > lineEdit - > setText ( QString ( global_capture_opts . orig_save_file ) ) ;
}
2013-12-13 18:36:59 +00:00
ui - > gbNewFileAuto - > setChecked ( global_capture_opts . multi_files_on ) ;
2014-08-18 08:04:16 +00:00
ui - > MBRadioButton - > setChecked ( global_capture_opts . has_autostop_filesize ) ;
ui - > SecsRadioButton - > setChecked ( global_capture_opts . has_file_duration ) ;
if ( global_capture_opts . has_autostop_filesize ) {
int value = global_capture_opts . autostop_filesize ;
if ( value > 1000000 ) {
if ( global_capture_opts . multi_files_on ) {
ui - > MBSpinBox - > setValue ( value / 1000000 ) ;
ui - > MBComboBox - > setCurrentIndex ( 2 ) ;
} else {
ui - > stopMBCheckBox - > setChecked ( true ) ;
ui - > stopMBSpinBox - > setValue ( value / 1000000 ) ;
ui - > stopMBComboBox - > setCurrentIndex ( 2 ) ;
}
} else if ( value > 1000 & & value % 1000 = = 0 ) {
if ( global_capture_opts . multi_files_on ) {
ui - > MBSpinBox - > setValue ( value / 1000 ) ;
ui - > MBComboBox - > setCurrentIndex ( 1 ) ;
} else {
ui - > stopMBCheckBox - > setChecked ( true ) ;
ui - > stopMBSpinBox - > setValue ( value / 1000 ) ;
ui - > stopMBComboBox - > setCurrentIndex ( 1 ) ;
}
} else {
if ( global_capture_opts . multi_files_on ) {
ui - > MBSpinBox - > setValue ( value ) ;
ui - > MBComboBox - > setCurrentIndex ( 0 ) ;
} else {
ui - > stopMBCheckBox - > setChecked ( true ) ;
ui - > stopMBSpinBox - > setValue ( value ) ;
ui - > stopMBComboBox - > setCurrentIndex ( 0 ) ;
}
}
}
if ( global_capture_opts . has_file_duration ) {
int value = global_capture_opts . file_duration ;
if ( value > 3600 & & value % 3600 = = 0 ) {
ui - > SecsSpinBox - > setValue ( value / 3600 ) ;
ui - > SecsComboBox - > setCurrentIndex ( 2 ) ;
} else if ( value > 60 & & value % 60 = = 0 ) {
ui - > SecsSpinBox - > setValue ( value / 60 ) ;
ui - > SecsComboBox - > setCurrentIndex ( 1 ) ;
} else {
ui - > SecsSpinBox - > setValue ( value ) ;
ui - > SecsComboBox - > setCurrentIndex ( 0 ) ;
}
}
if ( global_capture_opts . has_ring_num_files ) {
ui - > RbSpinBox - > setValue ( global_capture_opts . ring_num_files ) ;
ui - > RbCheckBox - > setCheckState ( Qt : : Checked ) ;
}
if ( global_capture_opts . has_autostop_duration ) {
ui - > stopSecsCheckBox - > setChecked ( true ) ;
int value = global_capture_opts . file_duration ;
if ( value > 3600 & & value % 3600 = = 0 ) {
ui - > stopSecsSpinBox - > setValue ( value / 3600 ) ;
ui - > stopSecsComboBox - > setCurrentIndex ( 2 ) ;
} else if ( value > 60 & & value % 60 = = 0 ) {
ui - > stopSecsSpinBox - > setValue ( value / 60 ) ;
ui - > stopSecsComboBox - > setCurrentIndex ( 1 ) ;
} else {
ui - > stopSecsSpinBox - > setValue ( value ) ;
ui - > stopSecsComboBox - > setCurrentIndex ( 0 ) ;
}
}
if ( global_capture_opts . has_autostop_packets ) {
ui - > stopPktCheckBox - > setChecked ( true ) ;
ui - > stopPktSpinBox - > setValue ( global_capture_opts . autostop_packets ) ;
}
2013-11-25 14:15:49 +00:00
ui - > cbUpdatePacketsRT - > setChecked ( global_capture_opts . real_time_mode ) ;
ui - > cbAutoScroll - > setChecked ( true ) ;
ui - > cbExtraCaptureInfo - > setChecked ( global_capture_opts . show_info ) ;
ui - > cbResolveMacAddresses - > setChecked ( gbl_resolv_flags . mac_name ) ;
ui - > cbResolveNetworkNames - > setChecked ( gbl_resolv_flags . network_name ) ;
ui - > cbResolveTransportNames - > setChecked ( gbl_resolv_flags . transport_name ) ;
2014-08-06 21:50:48 +00:00
ui - > interfaceTree - > clear ( ) ;
2013-11-25 14:15:49 +00:00
GList * list ;
link_row * linkr = NULL ;
2014-08-06 21:50:48 +00:00
# ifdef SHOW_BUFFER_COLUMN
2013-11-25 14:15:49 +00:00
gint buffer ;
2014-08-06 21:50:48 +00:00
# endif
2013-11-25 14:15:49 +00:00
gint snaplen ;
gboolean hassnap , pmode ;
2014-06-04 09:03:59 +00:00
if ( global_capture_opts . all_ifaces - > len > 0 ) {
2013-11-25 14:15:49 +00:00
interface_t device ;
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 ;
}
2014-08-06 21:50:48 +00:00
deviceMap [ ui - > interfaceTree - > topLevelItemCount ( ) ] = i ;
2013-11-25 14:15:49 +00:00
2014-08-06 21:50:48 +00:00
// Traffic sparklines
2013-11-25 14:15:49 +00:00
points = new QList < int > ( ) ;
2014-08-06 21:50:48 +00:00
InterfaceTreeWidgetItem * ti = new InterfaceTreeWidgetItem ( ui - > interfaceTree ) ;
ti - > setFlags ( ti - > flags ( ) | Qt : : ItemIsEditable ) ;
ti - > setData ( col_traffic_ , Qt : : UserRole , qVariantFromValue ( points ) ) ;
ti - > setText ( col_interface_ , device . display_name ) ;
if ( device . no_addresses > 0 ) {
QString addr_str = tr ( " %1: %2 " ) . arg ( device . no_addresses > 1 ? tr ( " Addresses " ) : tr ( " Address " ) ) . arg ( device . addresses ) ;
QTreeWidgetItem * addr_ti = new QTreeWidgetItem ( ti ) ;
addr_str . replace ( ' \n ' , " , " ) ;
addr_ti - > setText ( 0 , addr_str ) ;
addr_ti - > setFlags ( addr_ti - > flags ( ) ^ Qt : : ItemIsSelectable ) ;
addr_ti - > setFirstColumnSpanned ( true ) ;
2014-08-14 20:20:09 +00:00
addr_ti - > setToolTip ( col_interface_ , QString ( " <span>%1</span> " ) . arg ( addr_str ) ) ;
2014-08-06 21:50:48 +00:00
ti - > setToolTip ( col_interface_ , QString ( " <span>%1</span> " ) . arg ( addr_str ) ) ;
} else {
ti - > setToolTip ( col_interface_ , tr ( " no addresses " ) ) ;
}
QString linkname = " unknown " ;
2013-11-25 14:15:49 +00:00
if ( capture_dev_user_linktype_find ( device . name ) ! = - 1 ) {
device . active_dlt = capture_dev_user_linktype_find ( device . name ) ;
}
for ( list = device . links ; list ! = NULL ; list = g_list_next ( list ) ) {
2014-08-06 21:50:48 +00:00
linkr = ( link_row * ) ( list - > data ) ;
if ( linkr - > dlt = = device . active_dlt ) {
linkname = linkr - > name ;
break ;
}
2013-11-25 14:15:49 +00:00
}
pmode = capture_dev_user_pmode_find ( device . name ) ;
if ( pmode ! = - 1 ) {
2014-08-06 21:50:48 +00:00
device . pmode = pmode ;
2013-11-25 14:15:49 +00:00
}
hassnap = capture_dev_user_hassnap_find ( device . name ) ;
snaplen = capture_dev_user_snaplen_find ( device . name ) ;
if ( snaplen ! = - 1 & & hassnap ! = - 1 ) {
2014-08-06 21:50:48 +00:00
/* Default snap length set in preferences */
device . snaplen = snaplen ;
device . has_snaplen = hassnap ;
2013-11-25 14:15:49 +00:00
} else {
2014-08-06 21:50:48 +00:00
/* No preferences set yet, use default values */
device . snaplen = WTAP_MAX_PACKET_SIZE ;
device . has_snaplen = FALSE ;
2013-11-25 14:15:49 +00:00
}
2014-08-06 21:50:48 +00:00
QString snaplen_string = device . has_snaplen ? QString : : number ( device . snaplen ) : tr ( " default " ) ;
2013-11-25 14:15:49 +00:00
2014-08-06 21:50:48 +00:00
# ifdef SHOW_BUFFER_COLUMN
2013-11-25 14:15:49 +00:00
if ( capture_dev_user_buffersize_find ( device . name ) ! = - 1 ) {
2014-08-06 21:50:48 +00:00
buffer = capture_dev_user_buffersize_find ( device . name ) ;
device . buffer = buffer ;
2013-11-25 14:15:49 +00:00
} else {
2014-08-06 21:50:48 +00:00
device . buffer = DEFAULT_CAPTURE_BUFFER_SIZE ;
2013-11-25 14:15:49 +00:00
}
2014-08-06 21:50:48 +00:00
# endif
2013-11-25 14:15:49 +00:00
2014-08-06 21:50:48 +00:00
ti - > setText ( col_link_ , linkname ) ;
2013-11-25 14:15:49 +00:00
2014-08-06 21:50:48 +00:00
ti - > setText ( col_pmode_ , device . pmode ? tr ( " enabled " ) : tr ( " disabled " ) ) ;
2013-11-25 14:15:49 +00:00
2014-08-06 21:50:48 +00:00
ti - > setText ( col_snaplen_ , snaplen_string ) ;
# ifdef SHOW_BUFFER_COLUMN
ti - > setText ( col_buffer_ , QString : : number ( device . buffer ) ) ;
2014-06-04 09:03:59 +00:00
# endif
2014-08-06 21:50:48 +00:00
# ifdef SHOW_MONITOR_COLUMN
ti - > setText ( col_monitor_ , QString ( device . monitor_mode_supported ? ( device . monitor_mode_enabled ? tr ( " enabled " ) : tr ( " disabled " ) ) : tr ( " n/a " ) ) ) ;
2013-11-25 15:43:08 +00:00
# endif
2014-06-04 09:03:59 +00:00
gchar * prefFilter = capture_dev_user_cfilter_find ( device . name ) ;
if ( prefFilter ) {
device . cfilter = g_strdup ( prefFilter ) ;
}
2014-08-06 21:50:48 +00:00
ti - > setText ( col_filter_ , device . cfilter ) ;
2013-11-25 14:15:49 +00:00
2014-06-24 09:36:51 +00:00
if ( prefs . capture_device & & strstr ( prefs . capture_device , device . name ) ! = NULL ) {
2013-11-25 14:15:49 +00:00
device . selected = TRUE ;
global_capture_opts . num_selected + + ;
}
2014-08-06 21:50:48 +00:00
ti - > setSelected ( device . selected ) ;
2014-06-04 09:03:59 +00:00
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 ) ;
2013-11-25 14:15:49 +00:00
}
}
2014-08-06 21:50:48 +00:00
for ( int i = 0 ; i < ui - > interfaceTree - > topLevelItemCount ( ) ; i + + ) {
ui - > interfaceTree - > resizeColumnToContents ( i ) ;
}
2014-06-04 09:03:59 +00:00
start_bt_ - > setEnabled ( ( global_capture_opts . num_selected > 0 ) ? true : false ) ;
2013-11-25 14:15:49 +00:00
if ( ! stat_timer_ ) {
updateStatistics ( ) ;
stat_timer_ = new QTimer ( this ) ;
connect ( stat_timer_ , SIGNAL ( timeout ( ) ) , this , SLOT ( updateStatistics ( ) ) ) ;
stat_timer_ - > start ( stat_update_interval_ ) ;
}
}
2014-06-24 09:36:51 +00:00
void CaptureInterfacesDialog : : refreshInterfaceList ( )
{
2014-08-06 21:50:48 +00:00
updateInterfaces ( ) ;
2014-06-24 09:36:51 +00:00
emit interfaceListChanged ( ) ;
}
2014-07-22 00:15:31 +00:00
void CaptureInterfacesDialog : : updateLocalInterfaces ( )
{
2014-08-06 21:50:48 +00:00
updateInterfaces ( ) ;
2014-07-22 00:15:31 +00:00
}
2013-11-25 17:01:10 +00:00
void CaptureInterfacesDialog : : updateStatistics ( void )
{
2014-06-04 09:03:59 +00:00
interface_t device ;
2013-11-25 14:15:49 +00:00
2014-08-06 21:50:48 +00:00
for ( int row = 0 ; row < ui - > interfaceTree - > topLevelItemCount ( ) ; row + + ) {
2013-11-25 14:15:49 +00:00
2014-06-04 09:03:59 +00:00
for ( guint if_idx = 0 ; if_idx < global_capture_opts . all_ifaces - > len ; if_idx + + ) {
2014-08-06 21:50:48 +00:00
QTreeWidgetItem * ti = ui - > interfaceTree - > topLevelItem ( row ) ;
if ( ! ti ) {
continue ;
}
2014-06-04 09:03:59 +00:00
device = g_array_index ( global_capture_opts . all_ifaces , interface_t , if_idx ) ;
2014-08-06 21:50:48 +00:00
QString device_name = ti - > text ( col_interface_ ) ;
2014-06-04 09:03:59 +00:00
if ( device_name . compare ( device . display_name ) | | device . hidden | | device . type = = IF_PIPE ) {
continue ;
}
2014-08-08 07:01:37 +00:00
QList < int > * points = ti - > data ( col_traffic_ , Qt : : UserRole ) . value < QList < int > * > ( ) ;
2014-06-04 09:03:59 +00:00
points - > append ( device . packet_diff ) ;
2014-08-06 21:50:48 +00:00
ti - > setData ( col_traffic_ , Qt : : UserRole , qVariantFromValue ( points ) ) ;
2014-06-04 09:03:59 +00:00
}
2013-11-25 14:15:49 +00:00
}
2014-08-06 21:50:48 +00:00
ui - > interfaceTree - > viewport ( ) - > update ( ) ;
2014-06-04 09:03:59 +00:00
}
2013-11-25 14:15:49 +00:00
2014-06-04 09:03:59 +00:00
void CaptureInterfacesDialog : : on_compileBPF_clicked ( )
{
2014-08-06 21:50:48 +00:00
QStringList interfaces ;
foreach ( QTreeWidgetItem * ti , ui - > interfaceTree - > selectedItems ( ) ) {
interfaces . append ( ti - > text ( col_interface_ ) ) ;
2014-06-04 09:03:59 +00:00
}
2013-11-25 14:15:49 +00:00
2014-07-22 00:33:38 +00:00
QString filter = ui - > allFilterComboBox - > currentText ( ) ;
2014-06-04 09:03:59 +00:00
CompiledFilterOutput * cfo = new CompiledFilterOutput ( this , interfaces , filter ) ;
2013-11-25 14:15:49 +00:00
2014-06-04 09:03:59 +00:00
cfo - > show ( ) ;
}
2013-11-25 14:15:49 +00:00
2014-08-18 08:04:16 +00:00
bool CaptureInterfacesDialog : : saveOptionsToPreferences ( )
2014-06-04 09:03:59 +00:00
{
interface_t device ;
2013-11-25 14:15:49 +00:00
2014-08-18 08:04:16 +00:00
if ( ui - > rbPcapng - > isChecked ( ) ) {
global_capture_opts . use_pcapng = true ;
prefs . capture_pcap_ng = true ;
} else {
global_capture_opts . use_pcapng = false ;
prefs . capture_pcap_ng = false ;
}
QString filename = ui - > lineEdit - > text ( ) ;
if ( filename . length ( ) > 0 ) {
/* User specified a file to which the capture should be written. */
global_capture_opts . saving_to_file = true ;
2014-08-14 20:20:09 +00:00
global_capture_opts . save_file = qstring_strdup ( filename ) ;
global_capture_opts . orig_save_file = qstring_strdup ( filename ) ;
2014-08-18 08:04:16 +00:00
/* Save the directory name for future file dialogs. */
2014-08-14 20:20:09 +00:00
set_last_open_dir ( get_dirname ( filename . toUtf8 ( ) . data ( ) ) ) ;
2014-08-18 08:04:16 +00:00
} else {
/* User didn't specify a file; save to a temporary file. */
global_capture_opts . save_file = NULL ;
}
global_capture_opts . has_ring_num_files = ui - > RbCheckBox - > isChecked ( ) ;
if ( global_capture_opts . has_ring_num_files ) {
global_capture_opts . ring_num_files = ui - > RbSpinBox - > value ( ) ;
if ( global_capture_opts . ring_num_files > RINGBUFFER_MAX_NUM_FILES )
global_capture_opts . ring_num_files = RINGBUFFER_MAX_NUM_FILES ;
# if RINGBUFFER_MIN_NUM_FILES > 0
else if ( global_capture_opts . ring_num_files < RINGBUFFER_MIN_NUM_FILES )
global_capture_opts . ring_num_files = RINGBUFFER_MIN_NUM_FILES ;
# endif
}
global_capture_opts . multi_files_on = ui - > gbNewFileAuto - > isChecked ( ) ;
if ( global_capture_opts . multi_files_on ) {
global_capture_opts . has_file_duration = ui - > SecsRadioButton - > isChecked ( ) ;
if ( global_capture_opts . has_file_duration ) {
global_capture_opts . file_duration = ui - > SecsSpinBox - > value ( ) ;
int index = ui - > SecsComboBox - > currentIndex ( ) ;
switch ( index ) {
case 1 : global_capture_opts . file_duration * = 60 ;
break ;
case 2 : global_capture_opts . file_duration * = 3600 ;
break ;
}
}
global_capture_opts . has_autostop_filesize = ui - > MBRadioButton - > isChecked ( ) ;
if ( global_capture_opts . has_autostop_filesize ) {
global_capture_opts . autostop_filesize = ui - > MBSpinBox - > value ( ) ;
int index = ui - > MBComboBox - > currentIndex ( ) ;
switch ( index ) {
case 1 : if ( global_capture_opts . autostop_filesize > 2000 ) {
QMessageBox : : warning ( this , tr ( " Error " ) ,
tr ( " Multiple files: Requested filesize too large! The filesize cannot be greater than 2 GiB. " ) ) ;
return false ;
} else {
global_capture_opts . autostop_filesize * = 1000 ;
}
break ;
case 2 : if ( global_capture_opts . autostop_filesize > 2 ) {
QMessageBox : : warning ( this , tr ( " Error " ) ,
tr ( " Multiple files: Requested filesize too large! The filesize cannot be greater than 2 GiB. " ) ) ;
return false ;
} else {
global_capture_opts . autostop_filesize * = 1000000 ;
}
break ;
}
}
/* test if the settings are ok for a ringbuffer */
if ( global_capture_opts . save_file = = NULL ) {
QMessageBox : : warning ( this , tr ( " Error " ) ,
tr ( " Multiple files: No capture file name given! You must specify a filename if you want to use multiple files. " ) ) ;
return false ;
} else if ( ! global_capture_opts . has_autostop_filesize & & ! global_capture_opts . has_file_duration ) {
QMessageBox : : warning ( this , tr ( " Error " ) ,
tr ( " Multiple files: No file limit given! You must specify a file size or duration at which is switched to the next capture file \n if you want to use multiple files. " ) ) ;
g_free ( global_capture_opts . save_file ) ;
global_capture_opts . save_file = NULL ;
return false ;
}
} else {
global_capture_opts . has_autostop_filesize = ui - > stopMBCheckBox - > isChecked ( ) ;
if ( global_capture_opts . has_autostop_filesize ) {
global_capture_opts . autostop_filesize = ui - > stopMBSpinBox - > value ( ) ;
int index = ui - > stopMBComboBox - > currentIndex ( ) ;
switch ( index ) {
case 1 : if ( global_capture_opts . autostop_filesize > 2000 ) {
QMessageBox : : warning ( this , tr ( " Error " ) ,
tr ( " Multiple files: Requested filesize too large! The filesize cannot be greater than 2 GiB. " ) ) ;
return false ;
} else {
global_capture_opts . autostop_filesize * = 1000 ;
}
break ;
case 2 : if ( global_capture_opts . autostop_filesize > 2 ) {
QMessageBox : : warning ( this , tr ( " Error " ) ,
tr ( " Multiple files: Requested filesize too large! The filesize cannot be greater than 2 GiB. " ) ) ;
return false ;
} else {
global_capture_opts . autostop_filesize * = 1000000 ;
}
break ;
}
}
}
global_capture_opts . has_autostop_duration = ui - > stopSecsCheckBox - > isChecked ( ) ;
if ( global_capture_opts . has_autostop_duration ) {
global_capture_opts . autostop_duration = ui - > stopSecsSpinBox - > value ( ) ;
int index = ui - > stopSecsComboBox - > currentIndex ( ) ;
switch ( index ) {
case 1 : global_capture_opts . autostop_duration * = 60 ;
break ;
case 2 : global_capture_opts . autostop_duration * = 3600 ;
break ;
}
}
global_capture_opts . has_autostop_packets = ui - > stopPktCheckBox - > isChecked ( ) ;
if ( global_capture_opts . has_autostop_packets ) {
global_capture_opts . autostop_packets = ui - > stopPktSpinBox - > value ( ) ;
}
2014-08-06 21:50:48 +00:00
for ( int col = col_link_ ; col < = col_filter_ ; col + + ) {
if ( ui - > interfaceTree - > isColumnHidden ( col ) ) {
2014-06-04 09:03:59 +00:00
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 ) {
2014-08-06 21:50:48 +00:00
case col_link_ :
2014-08-14 20:20:09 +00:00
{
QStringList link_list ;
2014-06-04 09:03:59 +00:00
2014-08-06 21:50:48 +00:00
for ( int row = 0 ; row < ui - > interfaceTree - > topLevelItemCount ( ) ; row + + ) {
2014-06-04 09:03:59 +00:00
device = g_array_index ( global_capture_opts . all_ifaces , interface_t , deviceMap [ row ] ) ;
if ( device . active_dlt = = - 1 ) {
continue ;
}
2014-08-14 20:20:09 +00:00
link_list < < QString ( " %1(%2) " ) . arg ( device . name ) . arg ( device . active_dlt ) ;
2014-06-04 09:03:59 +00:00
}
g_free ( prefs . capture_devices_linktypes ) ;
2014-08-14 20:20:09 +00:00
prefs . capture_devices_linktypes = qstring_strdup ( link_list . join ( " , " ) ) ;
2014-06-04 09:03:59 +00:00
break ;
2014-08-14 20:20:09 +00:00
}
2014-08-06 21:50:48 +00:00
# ifdef SHOW_BUFFER_COLUMN
case col_buffer_ :
2014-08-14 20:20:09 +00:00
{
QStringList buffer_size_list ;
2014-06-04 09:03:59 +00:00
2014-08-06 21:50:48 +00:00
for ( int row = 0 ; row < ui - > interfaceTree - > topLevelItemCount ( ) ; row + + ) {
2014-06-04 09:03:59 +00:00
device = g_array_index ( global_capture_opts . all_ifaces , interface_t , deviceMap [ row ] ) ;
if ( device . buffer = = - 1 ) {
continue ;
}
2014-08-14 20:20:09 +00:00
buffer_size_list < < QString ( " %1(%2) " ) . arg ( device . name ) . arg ( device . buffer ) ;
2014-06-04 09:03:59 +00:00
}
g_free ( prefs . capture_devices_buffersize ) ;
2014-08-14 20:20:09 +00:00
prefs . capture_devices_buffersize = qstring_strdup ( buffer_size_list . join ( " , " ) ) ;
2014-06-04 09:03:59 +00:00
break ;
2014-08-14 20:20:09 +00:00
}
2014-08-06 21:50:48 +00:00
# endif // HAVE_BUFFER_SETTING
case col_snaplen_ :
2014-08-14 20:20:09 +00:00
{
QStringList snaplen_list ;
2014-06-04 09:03:59 +00:00
2014-08-06 21:50:48 +00:00
for ( int row = 0 ; row < ui - > interfaceTree - > topLevelItemCount ( ) ; row + + ) {
2014-06-04 09:03:59 +00:00
device = g_array_index ( global_capture_opts . all_ifaces , interface_t , deviceMap [ row ] ) ;
2014-08-14 20:20:09 +00:00
snaplen_list < < QString ( " %1:%2(%3) " )
. arg ( device . name )
. arg ( device . has_snaplen )
. arg ( device . has_snaplen ? device . snaplen : WTAP_MAX_PACKET_SIZE ) ;
2014-06-04 09:03:59 +00:00
}
g_free ( prefs . capture_devices_snaplen ) ;
2014-08-14 20:20:09 +00:00
prefs . capture_devices_snaplen = qstring_strdup ( snaplen_list . join ( " , " ) ) ;
2014-06-04 09:03:59 +00:00
break ;
2014-08-14 20:20:09 +00:00
}
2014-08-06 21:50:48 +00:00
case col_pmode_ :
2014-08-14 20:20:09 +00:00
{
QStringList pmode_list ;
2014-06-04 09:03:59 +00:00
2014-08-06 21:50:48 +00:00
for ( int row = 0 ; row < ui - > interfaceTree - > topLevelItemCount ( ) ; row + + ) {
2014-06-04 09:03:59 +00:00
device = g_array_index ( global_capture_opts . all_ifaces , interface_t , deviceMap [ row ] ) ;
if ( device . pmode = = - 1 ) {
continue ;
}
2014-08-14 20:20:09 +00:00
pmode_list < < QString ( " %1(%2) " ) . arg ( device . name ) . arg ( device . pmode ) ;
2014-06-04 09:03:59 +00:00
}
g_free ( prefs . capture_devices_pmode ) ;
2014-08-14 20:20:09 +00:00
prefs . capture_devices_pmode = qstring_strdup ( pmode_list . join ( " , " ) ) ;
2014-06-04 09:03:59 +00:00
break ;
2014-08-14 20:20:09 +00:00
}
2014-08-06 21:50:48 +00:00
# ifdef SHOW_MONITOR_COLUMN
case col_monitor_ :
2014-08-14 20:20:09 +00:00
{
QStringList monitor_list ;
2014-06-04 09:03:59 +00:00
2014-08-06 21:50:48 +00:00
for ( int row = 0 ; row < ui - > interfaceTree - > topLevelItemCount ( ) ; row + + ) {
2014-06-04 09:03:59 +00:00
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 ;
}
2014-08-14 20:20:09 +00:00
monitor_list < < device . name ;
2014-06-04 09:03:59 +00:00
}
g_free ( prefs . capture_devices_monitor_mode ) ;
2014-08-14 20:20:09 +00:00
prefs . capture_devices_monitor_mode = qstring_strdup ( monitor_list . join ( " , " ) ) ;
2014-06-04 09:03:59 +00:00
break ;
2014-08-14 20:20:09 +00:00
}
2014-08-06 21:50:48 +00:00
# endif // HAVE_MONITOR_SETTING
case col_filter_ :
2014-08-14 20:20:09 +00:00
{
QStringList filter_list ;
2014-06-04 09:03:59 +00:00
2014-08-06 21:50:48 +00:00
for ( int row = 0 ; row < ui - > interfaceTree - > topLevelItemCount ( ) ; row + + ) {
2014-06-04 09:03:59 +00:00
device = g_array_index ( global_capture_opts . all_ifaces , interface_t , deviceMap [ row ] ) ;
if ( ! device . cfilter ) {
continue ;
}
2014-08-14 20:20:09 +00:00
filter_list < < QString ( " %1(%2) " ) . arg ( device . name ) . arg ( device . cfilter ) ;
2014-06-04 09:03:59 +00:00
}
g_free ( prefs . capture_devices_filter ) ;
2014-08-14 20:20:09 +00:00
prefs . capture_devices_filter = qstring_strdup ( filter_list . join ( " , " ) ) ;
2014-06-04 09:03:59 +00:00
break ;
}
2014-08-14 20:20:09 +00:00
}
2014-06-04 09:03:59 +00:00
}
if ( ! prefs . gui_use_pref_save ) {
prefs_main_write ( ) ;
}
2014-08-18 08:04:16 +00:00
return true ;
2014-06-04 09:03:59 +00:00
}
2013-11-25 14:15:49 +00:00
2014-06-24 09:36:51 +00:00
void CaptureInterfacesDialog : : on_manage_clicked ( )
{
2014-08-18 08:04:16 +00:00
if ( saveOptionsToPreferences ( ) ) {
ManageInterfacesDialog * dlg = new ManageInterfacesDialog ( this ) ;
dlg - > show ( ) ;
}
2014-06-24 09:36:51 +00:00
}
2013-12-21 16:55:43 +00:00
void CaptureInterfacesDialog : : changeEvent ( QEvent * event )
{
if ( 0 ! = event )
{
switch ( event - > type ( ) )
{
case QEvent : : LanguageChange :
ui - > retranslateUi ( this ) ;
break ;
default :
break ;
}
}
QDialog : : changeEvent ( event ) ;
}
2014-08-06 21:50:48 +00:00
//
// InterfaceTreeItem
//
bool InterfaceTreeWidgetItem : : operator < ( const QTreeWidgetItem & other ) const {
if ( treeWidget ( ) - > sortColumn ( ) = = col_traffic_ ) {
QList < int > * points = data ( col_traffic_ , Qt : : UserRole ) . value < QList < int > * > ( ) ;
QList < int > * other_points = other . data ( col_traffic_ , Qt : : UserRole ) . value < QList < int > * > ( ) ;
double avg = 0 , other_avg = 0 ;
foreach ( int point , * points ) {
avg + = ( double ) point / points - > length ( ) ;
}
foreach ( int point , * other_points ) {
other_avg + = ( double ) point / other_points - > length ( ) ;
}
return avg < other_avg ;
}
return QTreeWidgetItem : : operator < ( other ) ;
}
//
// InterfaceTreeDelegate
//
2014-06-04 09:03:59 +00:00
# include <QComboBox>
2013-11-25 14:15:49 +00:00
2014-08-06 21:50:48 +00:00
InterfaceTreeDelegate : : InterfaceTreeDelegate ( QObject * parent )
2014-06-04 09:03:59 +00:00
: QStyledItemDelegate ( parent )
{
}
2014-08-06 21:50:48 +00:00
InterfaceTreeDelegate : : ~ InterfaceTreeDelegate ( )
2014-06-04 09:03:59 +00:00
{
}
2014-08-06 21:50:48 +00:00
QWidget * InterfaceTreeDelegate : : createEditor ( QWidget * parent , const QStyleOptionViewItem & option , const QModelIndex & index ) const
2014-06-04 09:03:59 +00:00
{
Q_UNUSED ( option ) ;
QWidget * w = NULL ;
2014-08-06 21:50:48 +00:00
# ifdef SHOW_BUFFER_COLUMN
2014-06-04 09:03:59 +00:00
gint buffer = DEFAULT_CAPTURE_BUFFER_SIZE ;
# endif
guint snap = WTAP_MAX_PACKET_SIZE ;
2014-06-12 18:54:21 +00:00
GList * links = NULL ;
2013-11-25 14:15:49 +00:00
2014-06-04 09:03:59 +00:00
if ( index . column ( ) > 1 ) {
interface_t device ;
2014-08-06 21:50:48 +00:00
QTreeWidgetItem * ti = tree_ - > topLevelItem ( index . row ( ) ) ;
QString interface_name = ti - > text ( col_interface_ ) ;
2014-06-04 09:03:59 +00:00
for ( guint i = 0 ; i < global_capture_opts . all_ifaces - > len ; i + + ) {
device = g_array_index ( global_capture_opts . all_ifaces , interface_t , i ) ;
2014-08-06 21:50:48 +00:00
# ifdef SHOW_BUFFER_COLUMN
2014-06-04 09:03:59 +00:00
buffer = device . buffer ;
# endif
snap = device . snaplen ;
2014-06-12 18:54:21 +00:00
links = device . links ;
2014-06-04 09:03:59 +00:00
if ( interface_name . compare ( device . display_name ) | | device . hidden | | device . type = = IF_PIPE ) {
continue ;
} else {
break ;
}
}
switch ( index . column ( ) ) {
2014-08-06 21:50:48 +00:00
case col_interface_ :
case col_traffic_ :
2014-06-04 09:03:59 +00:00
break ;
2014-08-06 21:50:48 +00:00
case col_link_ :
2014-06-04 09:03:59 +00:00
{
GList * list ;
link_row * temp ;
2014-08-06 21:50:48 +00:00
if ( g_list_length ( links ) < 2 ) {
break ;
}
2014-06-04 09:03:59 +00:00
QComboBox * cb = new QComboBox ( parent ) ;
2014-06-12 18:54:21 +00:00
for ( list = links ; list ! = NULL ; list = g_list_next ( list ) ) {
2014-06-04 09:03:59 +00:00
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 ;
}
2014-08-06 21:50:48 +00:00
case col_pmode_ :
2014-06-04 09:03:59 +00:00
{
// 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 ;
}
2014-08-06 21:50:48 +00:00
case col_snaplen_ :
2014-06-04 09:03:59 +00:00
{
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 ;
}
2014-08-06 21:50:48 +00:00
# ifdef SHOW_BUFFER_COLUMN
case col_buffer_ :
2014-06-04 09:03:59 +00:00
{
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
2014-08-06 21:50:48 +00:00
# ifdef SHOW_MONITOR_COLUMN
case col_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 col_filter_ :
2014-06-04 09:03:59 +00:00
{
CaptureFilterCombo * cf = new CaptureFilterCombo ( parent ) ;
w = ( QWidget * ) cf ;
}
2014-08-06 21:50:48 +00:00
default :
break ;
2014-06-04 09:03:59 +00:00
}
2014-08-06 21:50:48 +00:00
// if (w) {
// ti->setSizeHint(index.column(), w->sizeHint());
// }
2013-11-25 14:15:49 +00:00
}
2014-06-04 09:03:59 +00:00
return w ;
2013-11-25 14:15:49 +00:00
}
2014-08-06 21:50:48 +00:00
bool InterfaceTreeDelegate : : eventFilter ( QObject * object , QEvent * event )
2013-11-25 17:01:10 +00:00
{
2014-06-04 09:03:59 +00:00
QComboBox * comboBox = dynamic_cast < QComboBox * > ( object ) ;
if ( comboBox ) {
if ( event - > type ( ) = = QEvent : : MouseButtonRelease ) {
comboBox - > showPopup ( ) ;
return true ;
}
} else {
return QStyledItemDelegate : : eventFilter ( object , event ) ;
2013-11-25 14:15:49 +00:00
}
2014-06-04 09:03:59 +00:00
return false ;
2013-11-25 14:15:49 +00:00
}
2014-08-06 21:50:48 +00:00
void InterfaceTreeDelegate : : pmode_changed ( QString index )
2013-11-25 17:01:10 +00:00
{
2014-06-04 09:03:59 +00:00
interface_t device ;
guint i ;
2014-08-06 21:50:48 +00:00
QTreeWidgetItem * ti = tree_ - > currentItem ( ) ;
if ( ! ti ) {
return ;
}
QString interface_name = ti - > text ( col_interface_ ) ;
2014-06-04 09:03:59 +00:00
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 ) ;
}
2014-08-06 21:50:48 +00:00
# ifdef SHOW_MONITOR_COLUMN
void InterfaceTreeDelegate : : monitor_changed ( QString index )
2014-06-04 09:03:59 +00:00
{
interface_t device ;
guint i ;
2014-08-06 21:50:48 +00:00
QTreeWidgetItem * ti = tree_ - > currentItem ( ) ;
if ( ! ti ) {
return ;
}
QString interface_name = ti - > text ( col_interface_ ) ;
2014-06-04 09:03:59 +00:00
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 ) ;
2013-11-25 14:15:49 +00:00
}
2014-06-04 09:03:59 +00:00
# endif
2014-08-06 21:50:48 +00:00
void InterfaceTreeDelegate : : link_changed ( QString index )
2014-06-04 09:03:59 +00:00
{
GList * list ;
link_row * temp ;
interface_t device ;
guint i ;
2014-08-06 21:50:48 +00:00
QTreeWidgetItem * ti = tree_ - > currentItem ( ) ;
if ( ! ti ) {
return ;
}
QString interface_name = ti - > text ( col_interface_ ) ;
2014-06-04 09:03:59 +00:00
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 ) ;
}
2014-08-06 21:50:48 +00:00
void InterfaceTreeDelegate : : snaplen_changed ( int value )
2014-06-04 09:03:59 +00:00
{
interface_t device ;
guint i ;
2014-08-06 21:50:48 +00:00
QTreeWidgetItem * ti = tree_ - > currentItem ( ) ;
if ( ! ti ) {
return ;
}
QString interface_name = ti - > text ( col_interface_ ) ;
2014-06-04 09:03:59 +00:00
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 ) ;
}
2014-08-06 21:50:48 +00:00
void InterfaceTreeDelegate : : buffer_changed ( int value )
2014-06-04 09:03:59 +00:00
{
2014-08-06 21:50:48 +00:00
# ifdef SHOW_BUFFER_COLUMN
2014-06-04 09:03:59 +00:00
interface_t device ;
guint i ;
2014-08-06 21:50:48 +00:00
QTreeWidgetItem * ti = tree_ - > currentItem ( ) ;
if ( ! ti ) {
return ;
}
QString interface_name = ti - > text ( col_interface_ ) ;
2014-06-04 09:03:59 +00:00
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
}
2013-11-25 21:50:58 +00:00
# endif /* HAVE_LIBPCAP */
2013-11-25 14:15:49 +00:00
/*
* Editor modelines
*
* Local Variables :
* c - basic - offset : 4
* tab - width : 8
* indent - tabs - mode : nil
* End :
*
* ex : set shiftwidth = 4 tabstop = 8 expandtab :
* : indentSize = 4 : tabSize = 8 : noTabs = true :
*/