Qt: Add a CaptureFile class.

Wrap the capture_file struct in a QObject which translates cf_cb_* and
capture_cb_* events into signals. Move the global cfile to
capture_file.cpp.

Don't use a void pointer for the capture file struct.

Change-Id: Ic5d5efb4bb1db64aa0247245890e5669b1da723a
Reviewed-on: https://code.wireshark.org/review/5885
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
This commit is contained in:
Gerald Combs 2014-09-09 16:42:58 -04:00
parent 2bb8255e29
commit 9ba9cd83a4
21 changed files with 567 additions and 370 deletions

View File

@ -47,8 +47,9 @@
#include <glib.h> #include <glib.h>
#include "capture_opts.h" #include "capture_opts.h"
#include <capchild/capture_session.h>
#include <capchild/capture_sync.h> #include "capchild/capture_session.h"
#include "capchild/capture_sync.h"
#ifdef HAVE_EXTCAP #ifdef HAVE_EXTCAP
#include "extcap.h" #include "extcap.h"
#endif #endif

View File

@ -41,10 +41,12 @@ typedef enum {
CAPTURE_RUNNING /**< capture child signalled ok, capture is running now */ CAPTURE_RUNNING /**< capture child signalled ok, capture is running now */
} capture_state; } capture_state;
struct _capture_file;
/* /*
* State of a capture session. * State of a capture session.
*/ */
typedef struct { typedef struct _capture_session {
int fork_child; /**< If not -1, in parent, process ID of child */ int fork_child; /**< If not -1, in parent, process ID of child */
int fork_child_status; /**< Child exit status */ int fork_child_status; /**< Child exit status */
#ifdef _WIN32 #ifdef _WIN32
@ -57,15 +59,15 @@ typedef struct {
#endif #endif
gboolean session_started; gboolean session_started;
capture_options *capture_opts; /**< options for this capture */ capture_options *capture_opts; /**< options for this capture */
void *cf; /**< handle to cfile (note: untyped handle) */ struct _capture_file *cf; /**< handle to cfile */
} capture_session; } capture_session;
extern void extern void
capture_session_init(capture_session *cap_session, void *cf); capture_session_init(capture_session *cap_session, struct _capture_file *cf);
#else #else
/* dummy is needed because clang throws the error: empty struct has size 0 in C, size 1 in C++ */ /* dummy is needed because clang throws the error: empty struct has size 0 in C, size 1 in C++ */
typedef struct {int dummy;} capture_session; typedef struct _capture_session {int dummy;} capture_session;
#endif /* HAVE_LIBPCAP */ #endif /* HAVE_LIBPCAP */

View File

@ -127,7 +127,7 @@ static void (*fetch_dumpcap_pid)(int) = NULL;
void void
capture_session_init(capture_session *cap_session, void *cf) capture_session_init(capture_session *cap_session, struct _capture_file *cf)
{ {
cap_session->cf = cf; cap_session->cf = cf;
cap_session->fork_child = -1; /* invalid process handle */ cap_session->fork_child = -1; /* invalid process handle */

View File

@ -138,7 +138,7 @@ static echld_epan_stuff_t stuff;
static void init_stuff(void) { static void init_stuff(void) {
#ifdef HAVE_LIBPCAP #ifdef HAVE_LIBPCAP
capture_opts_init(&stuff.cap_opts); capture_opts_init(&stuff.cap_opts);
capture_session_init(&stuff.cap_sess, (void *)&stuff.cfile); capture_session_init(&stuff.cap_sess, &stuff.cfile);
#endif #endif
} }

4
file.c
View File

@ -195,14 +195,14 @@ cf_callback_add(cf_callback_t func, gpointer user_data)
} }
void void
cf_callback_remove(cf_callback_t func) cf_callback_remove(cf_callback_t func, gpointer user_data)
{ {
cf_callback_data_t *cb; cf_callback_data_t *cb;
GList *cb_item = cf_callbacks; GList *cb_item = cf_callbacks;
while (cb_item != NULL) { while (cb_item != NULL) {
cb = (cf_callback_data_t *)cb_item->data; cb = (cf_callback_data_t *)cb_item->data;
if (cb->cb_fct == func) { if (cb->cb_fct == func && cb->user_data == user_data) {
cf_callbacks = g_list_remove(cf_callbacks, cb); cf_callbacks = g_list_remove(cf_callbacks, cb);
g_free(cb); g_free(cb);
return; return;

20
file.h
View File

@ -95,11 +95,29 @@ typedef struct {
field_info *finfo; field_info *finfo;
} match_data; } match_data;
/**
* Add a capture file event callback.
*
* @param func The function to be called for each event.
* The function will be passed three parameters: The event type (event),
* event-dependent data (data), and user-supplied data (user_data).
* Event-dependent data may be a capture_file pointer, character pointer,
* or NULL.
* @param user_data User-supplied data to pass to the callback. May be NULL.
*/
extern void extern void
cf_callback_add(cf_callback_t func, gpointer user_data); cf_callback_add(cf_callback_t func, gpointer user_data);
/**
* Remove a capture file event callback.
*
* @param func The function to be removed.
* @param user_data User-supplied data. Must be the same value supplied to cf_callback_add.
*/
extern void extern void
cf_callback_remove(cf_callback_t func); cf_callback_remove(cf_callback_t func, gpointer user_data);
/** /**
* Open a capture file. * Open a capture file.

View File

@ -1164,7 +1164,7 @@ main(int argc, char *argv[])
#ifdef HAVE_LIBPCAP #ifdef HAVE_LIBPCAP
capture_opts_init(&global_capture_opts); capture_opts_init(&global_capture_opts);
capture_session_init(&global_capture_session, (void *)&cfile); capture_session_init(&global_capture_session, &cfile);
#endif #endif
timestamp_set_type(TS_RELATIVE); timestamp_set_type(TS_RELATIVE);

View File

@ -105,14 +105,14 @@ capture_callback_add(capture_callback_t func, gpointer user_data)
} }
void void
capture_callback_remove(capture_callback_t func) capture_callback_remove(capture_callback_t func, gpointer user_data)
{ {
capture_callback_data_t *cb; capture_callback_data_t *cb;
GList *cb_item = capture_callbacks; GList *cb_item = capture_callbacks;
while(cb_item != NULL) { while(cb_item != NULL) {
cb = (capture_callback_data_t *)cb_item->data; cb = (capture_callback_data_t *)cb_item->data;
if(cb->cb_fct == func) { if(cb->cb_fct == func && cb->user_data == user_data) {
capture_callbacks = g_list_remove(capture_callbacks, cb); capture_callbacks = g_list_remove(capture_callbacks, cb);
g_free(cb); g_free(cb);
return; return;

View File

@ -30,7 +30,7 @@
*/ */
#include "capture_opts.h" #include "capture_opts.h"
#include <capchild/capture_session.h> #include "capchild/capture_session.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -55,7 +55,7 @@ extern void
capture_callback_add(capture_callback_t func, gpointer user_data); capture_callback_add(capture_callback_t func, gpointer user_data);
extern void extern void
capture_callback_remove(capture_callback_t func); capture_callback_remove(capture_callback_t func, gpointer user_data);
/** /**
* Start a capture session. * Start a capture session.

View File

@ -2469,7 +2469,7 @@ main(int argc, char *argv[])
by preference settings and then again by the command line parameters. */ by preference settings and then again by the command line parameters. */
capture_opts_init(&global_capture_opts); capture_opts_init(&global_capture_opts);
capture_session_init(&global_capture_session, (void *)&cfile); capture_session_init(&global_capture_session, &cfile);
#endif #endif
init_report_err(failure_alert_box, open_failure_alert_box, init_report_err(failure_alert_box, open_failure_alert_box,

View File

@ -26,6 +26,7 @@ set(WIRESHARK_QT_HEADERS
accordion_frame.h accordion_frame.h
byte_view_tab.h byte_view_tab.h
byte_view_text.h byte_view_text.h
capture_file.h
capture_file_dialog.h capture_file_dialog.h
capture_file_properties_dialog.h capture_file_properties_dialog.h
capture_filter_combo.h capture_filter_combo.h
@ -122,6 +123,7 @@ set(WIRESHARK_QT_SRC
accordion_frame.cpp accordion_frame.cpp
byte_view_tab.cpp byte_view_tab.cpp
byte_view_text.cpp byte_view_text.cpp
capture_file.cpp
capture_file_dialog.cpp capture_file_dialog.cpp
capture_file_properties_dialog.cpp capture_file_properties_dialog.cpp
capture_filter_combo.cpp capture_filter_combo.cpp

View File

@ -116,6 +116,7 @@ MOC_HDRS = \
accordion_frame.h \ accordion_frame.h \
byte_view_tab.h \ byte_view_tab.h \
byte_view_text.h \ byte_view_text.h \
capture_file.h \
capture_file_dialog.h \ capture_file_dialog.h \
capture_file_properties_dialog.h \ capture_file_properties_dialog.h \
capture_filter_combo.h \ capture_filter_combo.h \
@ -309,6 +310,7 @@ WIRESHARK_QT_SRC = \
accordion_frame.cpp \ accordion_frame.cpp \
byte_view_tab.cpp \ byte_view_tab.cpp \
byte_view_text.cpp \ byte_view_text.cpp \
capture_file.cpp \
capture_file_dialog.cpp \ capture_file_dialog.cpp \
capture_file_properties_dialog.cpp \ capture_file_properties_dialog.cpp \
capture_filter_combo.cpp \ capture_filter_combo.cpp \

View File

@ -547,6 +547,7 @@ win32: QMAKE_CLEAN += *.pdb
HEADERS += \ HEADERS += \
byte_view_tab.h \ byte_view_tab.h \
byte_view_text.h \ byte_view_text.h \
capture_file.h \
capture_file_dialog.h \ capture_file_dialog.h \
capture_filter_combo.h \ capture_filter_combo.h \
capture_filter_edit.h \ capture_filter_edit.h \
@ -589,6 +590,7 @@ SOURCES += \
accordion_frame.cpp \ accordion_frame.cpp \
byte_view_tab.cpp \ byte_view_tab.cpp \
byte_view_text.cpp \ byte_view_text.cpp \
capture_file.cpp \
capture_file_dialog.cpp \ capture_file_dialog.cpp \
capture_file_properties_dialog.cpp \ capture_file_properties_dialog.cpp \
capture_filter_combo.cpp \ capture_filter_combo.cpp \

212
ui/qt/capture_file.cpp Normal file
View File

@ -0,0 +1,212 @@
/* capture_file.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 "capture_file.h"
/*
* @file Capture file class
*
* Wraps the capture_file struct, cfile global, and callbacks.
*/
#include "globals.h"
capture_file cfile;
#include "file.h"
#include "log.h"
#include "ui/capture.h"
// To do:
// - Add isValid or isOpen methods instead of checking capFile() for NULL.
// - Add getters and (if needed) setters:
// - Base filename
// - Full filename
#include <QDebug>
CaptureFile::CaptureFile(QObject *parent, capture_file *cap_file) :
QObject(parent),
cap_file_(cap_file)
{
#ifdef HAVE_LIBPCAP
capture_callback_add(captureCallback, (gpointer) this);
#endif
cf_callback_add(captureFileCallback, (gpointer) this);
}
CaptureFile::~CaptureFile()
{
cf_callback_remove(captureFileCallback, this);
}
capture_file *CaptureFile::globalCapFile()
{
return &cfile;
}
gpointer CaptureFile::window()
{
if (cap_file_) return cap_file_->window;
return NULL;
}
void CaptureFile::captureFileCallback(gint event, gpointer data, gpointer user_data)
{
CaptureFile *capture_file = static_cast<CaptureFile *>(user_data);
if (!capture_file) return;
capture_file->captureFileEvent(event, data);
}
#ifdef HAVE_LIBPCAP
void CaptureFile::captureCallback(gint event, capture_session *cap_session, gpointer user_data)
{
CaptureFile *capture_file = static_cast<CaptureFile *>(user_data);
if (!capture_file) return;
capture_file->captureEvent(event, cap_session);
}
#endif
void CaptureFile::captureFileEvent(int event, gpointer data)
{
qDebug() << "=cfe" << event << data;
switch(event) {
case(cf_cb_file_opened):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Opened");
cap_file_ = (capture_file *) data;
qDebug() << "=cfe fo" << cap_file_;
emit captureFileOpened();
break;
case(cf_cb_file_closing):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Closing");
emit captureFileClosing();
break;
case(cf_cb_file_closed):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Closed");
qDebug() << "=cfe fc" << cap_file_;
emit captureFileClosed();
cap_file_ = NULL;
break;
case(cf_cb_file_read_started):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Read started");
emit captureFileReadStarted();
break;
case(cf_cb_file_read_finished):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Read finished");
emit captureFileReadFinished();
break;
case(cf_cb_file_reload_started):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Reload started");
emit captureFileReadStarted();
break;
case(cf_cb_file_reload_finished):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Reload finished");
emit captureFileReadFinished();
break;
case(cf_cb_packet_selected):
case(cf_cb_packet_unselected):
case(cf_cb_field_unselected):
// Signals and slots handled elsewhere.
break;
// case(cf_cb_file_save_started): // data = string
// g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Save started");
// break;
// case(cf_cb_file_save_finished):
// g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Save finished");
// break;
// case(cf_cb_file_save_failed):
// g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Save failed");
// break;
default:
g_log(NULL, G_LOG_LEVEL_DEBUG, "FIX: main_cf_callback %d %p", event, data);
g_warning("CaptureFile::captureFileCallback: event %u unknown", event);
break;
}
}
void CaptureFile::captureEvent(int event, capture_session *cap_session)
{
#ifndef HAVE_LIBPCAP
Q_UNUSED(event)
Q_UNUSED(cap_session)
#else
qDebug() << "=ce" << event << cap_session->cf;
switch(event) {
case(capture_cb_capture_prepared):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture prepared");
emit captureCapturePrepared(cap_session);
cap_file_ = cap_session->cf;
break;
case(capture_cb_capture_update_started):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture update started");
emit captureCaptureUpdateStarted(cap_session);
break;
case(capture_cb_capture_update_continue):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture update continue");
emit captureCaptureUpdateContinue(cap_session);
break;
case(capture_cb_capture_update_finished):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture update finished");
emit captureCaptureUpdateFinished(cap_session);
break;
case(capture_cb_capture_fixed_started):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture fixed started");
emit captureCaptureFixedStarted(cap_session);
break;
case(capture_cb_capture_fixed_continue):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture fixed continue");
break;
case(capture_cb_capture_fixed_finished):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture fixed finished");
emit captureCaptureFixedFinished(cap_session);
break;
case(capture_cb_capture_stopping):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture stopping");
/* Beware: this state won't be called, if the capture child
* closes the capturing on it's own! */
emit captureCaptureStopping(cap_session);
break;
case(capture_cb_capture_failed):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture failed");
emit captureCaptureFailed(cap_session);
break;
default:
g_warning("main_capture_callback: event %u unknown", event);
}
#endif // HAVE_LIBPCAP
}
/*
* 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:
*/

92
ui/qt/capture_file.h Normal file
View File

@ -0,0 +1,92 @@
/* capture_file.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 CAPTURE_FILE_H
#define CAPTURE_FILE_H
#include <QObject>
#include "config.h"
#include <glib.h>
typedef struct _capture_file capture_file;
typedef struct _capture_session capture_session;
class CaptureFile : public QObject
{
Q_OBJECT
public:
explicit CaptureFile(QObject *parent = 0, capture_file *cap_file = NULL);
~CaptureFile();
capture_file *capFile() const { return cap_file_; }
void setCapFile(capture_file *cap_file) { cap_file_ = cap_file; }
// XXX This shouldn't be needed.
static capture_file *globalCapFile();
gpointer window();
signals:
void captureFileOpened() const;
void captureFileReadStarted() const;
void captureFileReadFinished() const;
void captureFileClosing() const;
void captureFileClosed() const;
void captureCapturePrepared(capture_session *cap_session);
void captureCaptureUpdateStarted(capture_session *cap_session);
void captureCaptureUpdateContinue(capture_session *cap_session);
void captureCaptureUpdateFinished(capture_session *cap_session);
void captureCaptureFixedStarted(capture_session *cap_session);
void captureCaptureFixedFinished(capture_session *cap_session);
void captureCaptureStopping(capture_session *cap_session);
void captureCaptureFailed(capture_session *cap_session);
public slots:
private:
static void captureFileCallback(gint event, gpointer data, gpointer user_data);
#ifdef HAVE_LIBPCAP
static void captureCallback(gint event, capture_session *cap_session, gpointer user_data);
#endif
void captureFileEvent(int event, gpointer data);
void captureEvent(int event, capture_session *cap_session);
capture_file *cap_file_;
};
#endif // CAPTURE_FILE_H
/*
* 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:
*/

View File

@ -25,8 +25,6 @@
#include "main_window.h" #include "main_window.h"
#include "wireshark_application.h" #include "wireshark_application.h"
#include "globals.h"
#include <glib.h> #include <glib.h>
#include <signal.h> #include <signal.h>
@ -143,6 +141,7 @@
#include <QTextCodec> #include <QTextCodec>
#endif #endif
#include "capture_file.h"
#include "conversation_dialog.h" #include "conversation_dialog.h"
#include "endpoint_dialog.h" #include "endpoint_dialog.h"
@ -150,34 +149,12 @@
capture_options global_capture_opts; capture_options global_capture_opts;
#endif #endif
capture_file cfile;
#ifdef HAVE_AIRPCAP #ifdef HAVE_AIRPCAP
int airpcap_dll_ret_val = -1; int airpcap_dll_ret_val = -1;
#endif #endif
GString *comp_info_str, *runtime_info_str; GString *comp_info_str, *runtime_info_str;
//static gboolean have_capture_file = FALSE; /* XXX - is there an equivalent in cfile? */
#ifdef HAVE_LIBPCAP
extern capture_options global_capture_opts;
static void
main_capture_callback(gint event, capture_session *cap_session, gpointer user_data )
{
Q_UNUSED(user_data);
wsApp->captureCallback(event, cap_session);
}
#endif // HAVE_LIBPCAP
static void
main_cf_callback(gint event, gpointer data, gpointer user_data )
{
Q_UNUSED(user_data);
wsApp->captureFileCallback(event, data);
}
/* update the main window */ /* update the main window */
void main_window_update(void) void main_window_update(void)
{ {
@ -828,11 +805,6 @@ int main(int argc, char *argv[])
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
#endif #endif
#ifdef HAVE_LIBPCAP
capture_callback_add(main_capture_callback, NULL);
#endif
cf_callback_add(main_cf_callback, NULL);
set_console_log_handler(); set_console_log_handler();
#ifdef HAVE_LIBPCAP #ifdef HAVE_LIBPCAP
@ -1294,7 +1266,7 @@ int main(int argc, char *argv[])
set_disabled_protos_list(); set_disabled_protos_list();
} }
build_column_format_array(&cfile.cinfo, prefs_p->num_cols, TRUE); build_column_format_array(&CaptureFile::globalCapFile()->cinfo, prefs_p->num_cols, TRUE);
wsApp->setMonospaceFont(prefs.gui_qt_font_name); wsApp->setMonospaceFont(prefs.gui_qt_font_name);
@ -1355,7 +1327,7 @@ int main(int argc, char *argv[])
if(go_to_packet != 0) { if(go_to_packet != 0) {
/* Jump to the specified frame number, kept for backward /* Jump to the specified frame number, kept for backward
compatibility. */ compatibility. */
cf_goto_frame(&cfile, go_to_packet); cf_goto_frame(CaptureFile::globalCapFile(), go_to_packet);
} }
} }
#ifdef HAVE_LIBPCAP #ifdef HAVE_LIBPCAP
@ -1377,7 +1349,7 @@ int main(int argc, char *argv[])
to use for this capture. */ to use for this capture. */
if (global_capture_opts.ifaces->len == 0) if (global_capture_opts.ifaces->len == 0)
collect_ifaces(&global_capture_opts); collect_ifaces(&global_capture_opts);
cfile.window = main_w; CaptureFile::globalCapFile()->window = main_w;
if (capture_start(&global_capture_opts, main_w->captureSession(), main_window_update)) { if (capture_start(&global_capture_opts, main_w->captureSession(), main_window_update)) {
/* The capture started. Open stat windows; we do so after creating /* The capture started. Open stat windows; we do so after creating
the main window, to avoid GTK warnings, and after successfully the main window, to avoid GTK warnings, and after successfully

View File

@ -22,8 +22,6 @@
#include "main_window.h" #include "main_window.h"
#include "ui_main_window.h" #include "ui_main_window.h"
#include "globals.h"
#include <epan/addr_resolv.h> #include <epan/addr_resolv.h>
#include <epan/epan_dissect.h> #include <epan/epan_dissect.h>
#include <wsutil/filesystem.h> #include <wsutil/filesystem.h>
@ -149,7 +147,6 @@ MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
main_ui_(new Ui::MainWindow), main_ui_(new Ui::MainWindow),
df_combo_box_(new DisplayFilterCombo()), df_combo_box_(new DisplayFilterCombo()),
cap_file_(NULL),
previous_focus_(NULL), previous_focus_(NULL),
show_hide_actions_(NULL), show_hide_actions_(NULL),
time_display_actions_(NULL), time_display_actions_(NULL),
@ -168,7 +165,7 @@ MainWindow::MainWindow(QWidget *parent) :
} }
gbl_cur_main_window_ = this; gbl_cur_main_window_ = this;
#ifdef HAVE_LIBPCAP #ifdef HAVE_LIBPCAP
capture_session_init(&cap_session_, (void *)&cfile); capture_session_init(&cap_session_, CaptureFile::globalCapFile());
#endif #endif
main_ui_->setupUi(this); main_ui_->setupUi(this);
setTitlebarForCaptureFile(); setTitlebarForCaptureFile();
@ -277,31 +274,37 @@ MainWindow::MainWindow(QWidget *parent) :
initTimePrecisionFormatMenu(); initTimePrecisionFormatMenu();
updateNameResolutionActions(); updateNameResolutionActions();
connect(wsApp, SIGNAL(captureCapturePrepared(capture_session *)), connect(&capture_file_, SIGNAL(captureCapturePrepared(capture_session *)),
this, SLOT(captureCapturePrepared(capture_session *))); this, SLOT(captureCapturePrepared(capture_session *)));
connect(wsApp, SIGNAL(captureCaptureUpdateStarted(capture_session *)), connect(&capture_file_, SIGNAL(captureCaptureUpdateStarted(capture_session *)),
this, SLOT(captureCaptureUpdateStarted(capture_session *))); this, SLOT(captureCaptureUpdateStarted(capture_session *)));
connect(wsApp, SIGNAL(captureCaptureUpdateFinished(capture_session *)), connect(&capture_file_, SIGNAL(captureCaptureUpdateFinished(capture_session *)),
this, SLOT(captureCaptureUpdateFinished(capture_session *))); this, SLOT(captureCaptureUpdateFinished(capture_session *)));
connect(wsApp, SIGNAL(captureCaptureFixedStarted(capture_session *)), connect(&capture_file_, SIGNAL(captureCaptureFixedStarted(capture_session *)),
this, SLOT(captureCaptureFixedStarted(capture_session *))); this, SLOT(captureCaptureFixedStarted(capture_session *)));
connect(wsApp, SIGNAL(captureCaptureFixedFinished(capture_session *)), connect(&capture_file_, SIGNAL(captureCaptureFixedFinished(capture_session *)),
this, SLOT(captureCaptureFixedFinished(capture_session *))); this, SLOT(captureCaptureFixedFinished(capture_session *)));
connect(wsApp, SIGNAL(captureCaptureStopping(capture_session *)), connect(&capture_file_, SIGNAL(captureCaptureStopping(capture_session *)),
this, SLOT(captureCaptureStopping(capture_session *))); this, SLOT(captureCaptureStopping(capture_session *)));
connect(wsApp, SIGNAL(captureCaptureFailed(capture_session *)), connect(&capture_file_, SIGNAL(captureCaptureFailed(capture_session *)),
this, SLOT(captureCaptureFailed(capture_session *))); this, SLOT(captureCaptureFailed(capture_session *)));
connect(wsApp, SIGNAL(captureFileOpened(const capture_file*)), connect(&capture_file_, SIGNAL(captureFileOpened()),
this, SLOT(captureFileOpened(const capture_file*))); this, SLOT(captureFileOpened()));
connect(wsApp, SIGNAL(captureFileReadStarted(const capture_file*)), connect(&capture_file_, SIGNAL(captureFileReadStarted()),
this, SLOT(captureFileReadStarted(const capture_file*))); this, SLOT(captureFileReadStarted()));
connect(wsApp, SIGNAL(captureFileReadFinished(const capture_file*)), connect(&capture_file_, SIGNAL(captureFileReadFinished()),
this, SLOT(captureFileReadFinished(const capture_file*))); this, SLOT(captureFileReadFinished()));
connect(wsApp, SIGNAL(captureFileClosing(const capture_file*)), connect(&capture_file_, SIGNAL(captureFileClosing()),
this, SLOT(captureFileClosing(const capture_file*))); this, SLOT(captureFileClosing()));
connect(wsApp, SIGNAL(captureFileClosed(const capture_file*)), connect(&capture_file_, SIGNAL(captureFileClosed()),
this, SLOT(captureFileClosed(const capture_file*))); this, SLOT(captureFileClosed()));
connect(&capture_file_, SIGNAL(captureFileReadStarted()),
wsApp, SLOT(captureFileReadStarted()));
connect(&capture_file_, SIGNAL(captureFileReadFinished()),
wsApp, SLOT(updateTaps()));
connect(wsApp, SIGNAL(columnsChanged()), connect(wsApp, SIGNAL(columnsChanged()),
this, SLOT(recreatePacketList())); this, SLOT(recreatePacketList()));
connect(wsApp, SIGNAL(packetDissectionChanged()), connect(wsApp, SIGNAL(packetDissectionChanged()),
@ -615,11 +618,11 @@ void MainWindow::mergeCaptureFile()
dfilter_t *rfcode = NULL; dfilter_t *rfcode = NULL;
int err; int err;
if (!cap_file_) if (!capture_file_.capFile())
return; return;
if (prefs.gui_ask_unsaved) { if (prefs.gui_ask_unsaved) {
if (cf_has_unsaved_data(cap_file_)) { if (cf_has_unsaved_data(capture_file_.capFile())) {
QMessageBox msg_dialog; QMessageBox msg_dialog;
gchar *display_basename; gchar *display_basename;
int response; int response;
@ -627,14 +630,14 @@ void MainWindow::mergeCaptureFile()
msg_dialog.setIcon(QMessageBox::Question); msg_dialog.setIcon(QMessageBox::Question);
/* This file has unsaved data; ask the user whether to save /* This file has unsaved data; ask the user whether to save
the capture. */ the capture. */
if (cap_file_->is_tempfile) { if (capture_file_.capFile()->is_tempfile) {
msg_dialog.setText(tr("Save packets before merging?")); msg_dialog.setText(tr("Save packets before merging?"));
msg_dialog.setInformativeText(tr("A temporary capture file can't be merged.")); msg_dialog.setInformativeText(tr("A temporary capture file can't be merged."));
} else { } else {
/* /*
* Format the message. * Format the message.
*/ */
display_basename = g_filename_display_basename(cap_file_->filename); display_basename = g_filename_display_basename(capture_file_.capFile()->filename);
msg_dialog.setText(QString(tr("Save changes in \"%1\" before merging?")).arg(display_basename)); msg_dialog.setText(QString(tr("Save changes in \"%1\" before merging?")).arg(display_basename));
g_free(display_basename); g_free(display_basename);
msg_dialog.setInformativeText(tr("Changes must be saved before the files can be merged.")); msg_dialog.setInformativeText(tr("Changes must be saved before the files can be merged."));
@ -649,7 +652,7 @@ void MainWindow::mergeCaptureFile()
case QMessageBox::Save: case QMessageBox::Save:
/* Save the file but don't close it */ /* Save the file but don't close it */
saveCaptureFile(cap_file_, FALSE); saveCaptureFile(capture_file_.capFile(), FALSE);
break; break;
case QMessageBox::Cancel: case QMessageBox::Cancel:
@ -661,7 +664,7 @@ void MainWindow::mergeCaptureFile()
} }
for (;;) { for (;;) {
CaptureFileDialog merge_dlg(this, cap_file_, display_filter); CaptureFileDialog merge_dlg(this, capture_file_.capFile(), display_filter);
int file_type; int file_type;
cf_status_t merge_status; cf_status_t merge_status;
char *in_filenames[2]; char *in_filenames[2];
@ -689,7 +692,7 @@ void MainWindow::mergeCaptureFile()
if (merge_dlg.merge(file_name)) { if (merge_dlg.merge(file_name)) {
if (dfilter_compile(display_filter.toUtf8().constData(), &rfcode)) { if (dfilter_compile(display_filter.toUtf8().constData(), &rfcode)) {
cf_set_rfcode(cap_file_, rfcode); cf_set_rfcode(capture_file_.capFile(), rfcode);
} else { } else {
/* Not valid. Tell the user, and go back and run the file /* Not valid. Tell the user, and go back and run the file
selection box again once they dismiss the alert. */ selection box again once they dismiss the alert. */
@ -703,23 +706,23 @@ void MainWindow::mergeCaptureFile()
return; return;
} }
file_type = cap_file_->cd_t; file_type = capture_file_.capFile()->cd_t;
/* Try to merge or append the two files */ /* Try to merge or append the two files */
tmpname = NULL; tmpname = NULL;
if (merge_dlg.mergeType() == 0) { if (merge_dlg.mergeType() == 0) {
/* chronological order */ /* chronological order */
in_filenames[0] = cap_file_->filename; in_filenames[0] = capture_file_.capFile()->filename;
in_filenames[1] = file_name.toUtf8().data(); in_filenames[1] = file_name.toUtf8().data();
merge_status = cf_merge_files(&tmpname, 2, in_filenames, file_type, FALSE); merge_status = cf_merge_files(&tmpname, 2, in_filenames, file_type, FALSE);
} else if (merge_dlg.mergeType() <= 0) { } else if (merge_dlg.mergeType() <= 0) {
/* prepend file */ /* prepend file */
in_filenames[0] = file_name.toUtf8().data(); in_filenames[0] = file_name.toUtf8().data();
in_filenames[1] = cap_file_->filename; in_filenames[1] = capture_file_.capFile()->filename;
merge_status = cf_merge_files(&tmpname, 2, in_filenames, file_type, TRUE); merge_status = cf_merge_files(&tmpname, 2, in_filenames, file_type, TRUE);
} else { } else {
/* append file */ /* append file */
in_filenames[0] = cap_file_->filename; in_filenames[0] = capture_file_.capFile()->filename;
in_filenames[1] = file_name.toUtf8().data(); in_filenames[1] = file_name.toUtf8().data();
merge_status = cf_merge_files(&tmpname, 2, in_filenames, file_type, TRUE); merge_status = cf_merge_files(&tmpname, 2, in_filenames, file_type, TRUE);
} }
@ -731,13 +734,13 @@ void MainWindow::mergeCaptureFile()
continue; continue;
} }
cf_close(cap_file_); cf_close(capture_file_.capFile());
/* Try to open the merged capture file. */ /* Try to open the merged capture file. */
cfile.window = this; CaptureFile::globalCapFile()->window = this;
if (cf_open(&cfile, tmpname, WTAP_TYPE_AUTO, TRUE /* temporary file */, &err) != CF_OK) { if (cf_open(CaptureFile::globalCapFile(), tmpname, WTAP_TYPE_AUTO, TRUE /* temporary file */, &err) != CF_OK) {
/* We couldn't open it; fail. */ /* We couldn't open it; fail. */
cfile.window = NULL; CaptureFile::globalCapFile()->window = NULL;
if (rfcode != NULL) if (rfcode != NULL)
dfilter_free(rfcode); dfilter_free(rfcode);
g_free(tmpname); g_free(tmpname);
@ -747,9 +750,9 @@ void MainWindow::mergeCaptureFile()
/* Attach the new read filter to "cf" ("cf_open()" succeeded, so /* Attach the new read filter to "cf" ("cf_open()" succeeded, so
it closed the previous capture file, and thus destroyed any it closed the previous capture file, and thus destroyed any
previous read filter attached to "cf"). */ previous read filter attached to "cf"). */
cfile.rfcode = rfcode; CaptureFile::globalCapFile()->rfcode = rfcode;
switch (cf_read(&cfile, FALSE)) { switch (cf_read(CaptureFile::globalCapFile(), FALSE)) {
case CF_READ_OK: case CF_READ_OK:
case CF_READ_ERROR: case CF_READ_ERROR:
@ -1017,16 +1020,16 @@ void MainWindow::exportSelectedPackets() {
gchar *dirname; gchar *dirname;
gboolean discard_comments = FALSE; gboolean discard_comments = FALSE;
if (!cap_file_) if (!capture_file_.capFile())
return; return;
/* Init the packet range */ /* Init the packet range */
packet_range_init(&range, cap_file_); packet_range_init(&range, capture_file_.capFile());
range.process_filtered = TRUE; range.process_filtered = TRUE;
range.include_dependents = TRUE; range.include_dependents = TRUE;
for (;;) { for (;;) {
CaptureFileDialog esp_dlg(this, cap_file_); CaptureFileDialog esp_dlg(this, capture_file_.capFile());
switch (prefs.gui_fileopen_style) { switch (prefs.gui_fileopen_style) {
@ -1091,7 +1094,7 @@ void MainWindow::exportSelectedPackets() {
* name and the read file name may be relative (if supplied on * name and the read file name may be relative (if supplied on
* the command line). From Joerg Mayer. * the command line). From Joerg Mayer.
*/ */
if (files_identical(cap_file_->filename, file_name.toUtf8().constData())) { if (files_identical(capture_file_.capFile()->filename, file_name.toUtf8().constData())) {
QMessageBox msg_box; QMessageBox msg_box;
gchar *display_basename = g_filename_display_basename(file_name.toUtf8().constData()); gchar *display_basename = g_filename_display_basename(file_name.toUtf8().constData());
@ -1119,7 +1122,7 @@ void MainWindow::exportSelectedPackets() {
//#endif //#endif
/* Attempt to save the file */ /* Attempt to save the file */
status = cf_export_specified_packets(cap_file_, file_name.toUtf8().constData(), &range, file_type, compressed); status = cf_export_specified_packets(capture_file_.capFile(), file_name.toUtf8().constData(), &range, file_type, compressed);
switch (status) { switch (status) {
case CF_WRITE_OK: case CF_WRITE_OK:
@ -1147,14 +1150,14 @@ void MainWindow::exportSelectedPackets() {
} }
void MainWindow::exportDissections(export_type_e export_type) { void MainWindow::exportDissections(export_type_e export_type) {
ExportDissectionDialog ed_dlg(this, cap_file_, export_type); ExportDissectionDialog ed_dlg(this, capture_file_.capFile(), export_type);
packet_range_t range; packet_range_t range;
if (!cap_file_) if (!capture_file_.capFile())
return; return;
/* Init the packet range */ /* Init the packet range */
packet_range_init(&range, cap_file_); packet_range_init(&range, capture_file_.capFile());
range.process_filtered = TRUE; range.process_filtered = TRUE;
range.include_dependents = TRUE; range.include_dependents = TRUE;
@ -1220,11 +1223,11 @@ void MainWindow::fileAddExtension(QString &file_name, int file_type, bool compre
bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) { bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
bool capture_in_progress = FALSE; bool capture_in_progress = FALSE;
if (!cap_file_ || cap_file_->state == FILE_CLOSED) if (!capture_file_.capFile() || capture_file_.capFile()->state == FILE_CLOSED)
return true; /* Already closed, nothing to do */ return true; /* Already closed, nothing to do */
#ifdef HAVE_LIBPCAP #ifdef HAVE_LIBPCAP
if (cap_file_->state == FILE_READ_IN_PROGRESS) { if (capture_file_.capFile()->state == FILE_READ_IN_PROGRESS) {
/* This is true if we're reading a capture file *or* if we're doing /* This is true if we're reading a capture file *or* if we're doing
a live capture. If we're reading a capture file, the main loop a live capture. If we're reading a capture file, the main loop
is busy reading packets, and only accepting input from the is busy reading packets, and only accepting input from the
@ -1235,7 +1238,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
#endif #endif
if (prefs.gui_ask_unsaved) { if (prefs.gui_ask_unsaved) {
if (cf_has_unsaved_data(cap_file_) || capture_in_progress) { if (cf_has_unsaved_data(capture_file_.capFile()) || capture_in_progress) {
QMessageBox msg_dialog; QMessageBox msg_dialog;
QString question; QString question;
QPushButton *saveButton; QPushButton *saveButton;
@ -1245,7 +1248,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
msg_dialog.setWindowTitle("Unsaved packets..."); msg_dialog.setWindowTitle("Unsaved packets...");
/* This file has unsaved data or there's a capture in /* This file has unsaved data or there's a capture in
progress; ask the user whether to save the data. */ progress; ask the user whether to save the data. */
if (cap_file_->is_tempfile) { if (capture_file_.capFile()->is_tempfile) {
msg_dialog.setText(tr("You have unsaved packets")); msg_dialog.setText(tr("You have unsaved packets"));
msg_dialog.setInformativeText(tr("They will be lost if you don't save them.")); msg_dialog.setInformativeText(tr("They will be lost if you don't save them."));
@ -1269,7 +1272,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
msg_dialog.setText(question); msg_dialog.setText(question);
msg_dialog.setInformativeText(tr("Your captured packets will be lost if you don't save them.")); msg_dialog.setInformativeText(tr("Your captured packets will be lost if you don't save them."));
} else { } else {
gchar *display_basename = g_filename_display_basename(cap_file_->filename); gchar *display_basename = g_filename_display_basename(capture_file_.capFile()->filename);
question.append(QString(tr("Do you want to save the changes you've made to the capture file \"%1\"%2?")) question.append(QString(tr("Do you want to save the changes you've made to the capture file \"%1\"%2?"))
.arg(display_basename) .arg(display_basename)
.arg(before_what) .arg(before_what)
@ -1295,7 +1298,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
msg_dialog.setDefaultButton(saveButton); msg_dialog.setDefaultButton(saveButton);
if (from_quit) { if (from_quit) {
if (cap_file_->state == FILE_READ_IN_PROGRESS) { if (capture_file_.capFile()->state == FILE_READ_IN_PROGRESS) {
discardButton = msg_dialog.addButton(tr("Stop and Quit without Saving"), discardButton = msg_dialog.addButton(tr("Stop and Quit without Saving"),
QMessageBox::DestructiveRole); QMessageBox::DestructiveRole);
} else { } else {
@ -1326,7 +1329,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
captureStop(); captureStop();
#endif #endif
/* Save the file and close it */ /* Save the file and close it */
saveCaptureFile(cap_file_, TRUE); saveCaptureFile(capture_file_.capFile(), TRUE);
} }
else if(msg_dialog.clickedButton() == discardButton) else if(msg_dialog.clickedButton() == discardButton)
{ {
@ -1339,7 +1342,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
captureStop(); captureStop();
#endif #endif
/* Just close the file, discarding changes */ /* Just close the file, discarding changes */
cf_close(cap_file_); cf_close(capture_file_.capFile());
return true; return true;
} }
else //cancelButton or some other unspecified button else //cancelButton or some other unspecified button
@ -1349,7 +1352,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
} else { } else {
/* Unchanged file, just close it */ /* Unchanged file, just close it */
cf_close(cap_file_); cf_close(capture_file_.capFile());
} }
} else { } else {
/* User asked not to be bothered by those prompts, just close it. /* User asked not to be bothered by those prompts, just close it.
@ -1360,7 +1363,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
if (capture_in_progress) if (capture_in_progress)
captureStop(); captureStop();
#endif #endif
cf_close(cap_file_); cf_close(capture_file_.capFile());
} }
return true; /* File closed */ return true; /* File closed */
@ -1369,7 +1372,7 @@ bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) {
void MainWindow::captureStop() { void MainWindow::captureStop() {
stopCapture(); stopCapture();
while(cap_file_ && cap_file_->state == FILE_READ_IN_PROGRESS) { while(capture_file_.capFile() && capture_file_.capFile()->state == FILE_READ_IN_PROGRESS) {
WiresharkApplication::processEvents(); WiresharkApplication::processEvents();
} }
} }
@ -1520,7 +1523,7 @@ void MainWindow::initTimePrecisionFormatMenu()
// Titlebar // Titlebar
void MainWindow::setTitlebarForCaptureFile() void MainWindow::setTitlebarForCaptureFile()
{ {
if (cap_file_ && cap_file_->filename) { if (capture_file_.capFile() && capture_file_.capFile()->filename) {
// //
// Qt *REALLY* doesn't like windows that sometimes have a // Qt *REALLY* doesn't like windows that sometimes have a
// title set with setWindowTitle() and other times have a // title set with setWindowTitle() and other times have a
@ -1541,7 +1544,7 @@ void MainWindow::setTitlebarForCaptureFile()
// live capture at time T1 and then, after you've saved the live // live capture at time T1 and then, after you've saved the live
// capture to a user file, associated with a user file at time T2. // capture to a user file, associated with a user file at time T2.
// //
if (cap_file_->is_tempfile) { if (capture_file_.capFile()->is_tempfile) {
// //
// For a temporary file, put the source of the data // For a temporary file, put the source of the data
// in the window title, not whatever random pile // in the window title, not whatever random pile
@ -1553,7 +1556,7 @@ void MainWindow::setTitlebarForCaptureFile()
// //
gchar *window_name; gchar *window_name;
setWindowFilePath(NULL); setWindowFilePath(NULL);
window_name = g_strdup_printf("Capturing from %s[*]", cf_get_tempfile_source(cap_file_)); //TODO : Fix Translate window_name = g_strdup_printf("Capturing from %s[*]", cf_get_tempfile_source(capture_file_.capFile())); //TODO : Fix Translate
setWindowTitle(window_name); setWindowTitle(window_name);
g_free(window_name); g_free(window_name);
} else { } else {
@ -1567,7 +1570,7 @@ void MainWindow::setTitlebarForCaptureFile()
// file path to UTF-8. If that fails, we're somewhat // file path to UTF-8. If that fails, we're somewhat
// stuck. // stuck.
// //
char *utf8_filename = g_filename_to_utf8(cap_file_->filename, char *utf8_filename = g_filename_to_utf8(capture_file_.capFile()->filename,
-1, -1,
NULL, NULL,
NULL, NULL,
@ -1582,7 +1585,7 @@ void MainWindow::setTitlebarForCaptureFile()
g_free(utf8_filename); g_free(utf8_filename);
} }
} }
setWindowModified(cf_has_unsaved_data(cap_file_)); setWindowModified(cf_has_unsaved_data(capture_file_.capFile()));
} else { } else {
/* We have no capture file. */ /* We have no capture file. */
setWindowFilePath(NULL); setWindowFilePath(NULL);
@ -1601,8 +1604,8 @@ void MainWindow::setTitlebarForCaptureInProgress()
gchar *window_name; gchar *window_name;
setWindowFilePath(NULL); setWindowFilePath(NULL);
if (cap_file_) { if (capture_file_.capFile()) {
window_name = g_strdup_printf("Capturing from %s", cf_get_tempfile_source(cap_file_)); //TODO : Fix Translate window_name = g_strdup_printf("Capturing from %s", cf_get_tempfile_source(capture_file_.capFile())); //TODO : Fix Translate
setWindowTitle(window_name); setWindowTitle(window_name);
g_free(window_name); g_free(window_name);
} else { } else {
@ -1617,17 +1620,17 @@ void MainWindow::setMenusForFollowStream()
{ {
gboolean is_tcp = FALSE, is_udp = FALSE; gboolean is_tcp = FALSE, is_udp = FALSE;
if (!cap_file_) if (!capture_file_.capFile())
return; return;
if (!cap_file_->edt) if (!capture_file_.capFile()->edt)
return; return;
main_ui_->actionAnalyzeFollowTCPStream->setEnabled(false); main_ui_->actionAnalyzeFollowTCPStream->setEnabled(false);
main_ui_->actionAnalyzeFollowUDPStream->setEnabled(false); main_ui_->actionAnalyzeFollowUDPStream->setEnabled(false);
main_ui_->actionAnalyzeFollowSSLStream->setEnabled(false); main_ui_->actionAnalyzeFollowSSLStream->setEnabled(false);
proto_get_frame_protocols(cap_file_->edt->pi.layers, NULL, &is_tcp, &is_udp, NULL, NULL); proto_get_frame_protocols(capture_file_.capFile()->edt->pi.layers, NULL, &is_tcp, &is_udp, NULL, NULL);
if (is_tcp) if (is_tcp)
{ {
@ -1639,7 +1642,7 @@ void MainWindow::setMenusForFollowStream()
main_ui_->actionAnalyzeFollowUDPStream->setEnabled(true); main_ui_->actionAnalyzeFollowUDPStream->setEnabled(true);
} }
if ( epan_dissect_packet_contains_field(cap_file_->edt, "ssl") ) if ( epan_dissect_packet_contains_field(capture_file_.capFile()->edt, "ssl") )
{ {
main_ui_->actionAnalyzeFollowSSLStream->setEnabled(true); main_ui_->actionAnalyzeFollowSSLStream->setEnabled(true);
} }
@ -1650,7 +1653,7 @@ void MainWindow::setMenusForFollowStream()
and whether it could be saved except by copying the raw packet data. */ and whether it could be saved except by copying the raw packet data. */
void MainWindow::setMenusForCaptureFile(bool force_disable) void MainWindow::setMenusForCaptureFile(bool force_disable)
{ {
if (force_disable || cap_file_ == NULL || cap_file_->state == FILE_READ_IN_PROGRESS) { if (force_disable || capture_file_.capFile() == NULL || capture_file_.capFile()->state == FILE_READ_IN_PROGRESS) {
/* We have no capture file or we're currently reading a file */ /* We have no capture file or we're currently reading a file */
main_ui_->actionFileMerge->setEnabled(false); main_ui_->actionFileMerge->setEnabled(false);
main_ui_->actionFileClose->setEnabled(false); main_ui_->actionFileClose->setEnabled(false);
@ -1665,17 +1668,17 @@ void MainWindow::setMenusForCaptureFile(bool force_disable)
main_ui_->menuFileExportObjects->setEnabled(false); main_ui_->menuFileExportObjects->setEnabled(false);
main_ui_->actionViewReload->setEnabled(false); main_ui_->actionViewReload->setEnabled(false);
} else { } else {
main_ui_->actionFileMerge->setEnabled(cf_can_write_with_wiretap(cap_file_)); main_ui_->actionFileMerge->setEnabled(cf_can_write_with_wiretap(capture_file_.capFile()));
main_ui_->actionFileClose->setEnabled(true); main_ui_->actionFileClose->setEnabled(true);
main_ui_->actionFileSave->setEnabled(cf_can_save(cap_file_)); main_ui_->actionFileSave->setEnabled(cf_can_save(capture_file_.capFile()));
main_ui_->actionFileSaveAs->setEnabled(cf_can_save_as(cap_file_)); main_ui_->actionFileSaveAs->setEnabled(cf_can_save_as(capture_file_.capFile()));
main_ui_->actionStatisticsCaptureFileProperties->setEnabled(true); main_ui_->actionStatisticsCaptureFileProperties->setEnabled(true);
/* /*
* "Export Specified Packets..." should be available only if * "Export Specified Packets..." should be available only if
* we can write the file out in at least one format. * we can write the file out in at least one format.
*/ */
main_ui_->actionFileExportPackets->setEnabled(cf_can_write_with_wiretap(cap_file_)); main_ui_->actionFileExportPackets->setEnabled(cf_can_write_with_wiretap(capture_file_.capFile()));
main_ui_->menuFileExportPacketDissections->setEnabled(true); main_ui_->menuFileExportPacketDissections->setEnabled(true);
main_ui_->actionFileExportPacketBytes->setEnabled(true); main_ui_->actionFileExportPacketBytes->setEnabled(true);
main_ui_->actionFileExportPDU->setEnabled(true); main_ui_->actionFileExportPDU->setEnabled(true);

View File

@ -48,16 +48,18 @@
# include <QSocketNotifier> # include <QSocketNotifier>
#endif #endif
#include "main_welcome.h" #include "about_dialog.h"
#include "packet_list.h" #include "capture_file.h"
#include "capture_file_dialog.h"
#include "capture_file_properties_dialog.h"
#include "capture_interfaces_dialog.h"
#include "display_filter_combo.h" #include "display_filter_combo.h"
#include "progress_bar.h"
#include "file_set_dialog.h" #include "file_set_dialog.h"
#include "filter_action.h" #include "filter_action.h"
#include "capture_file_dialog.h"
#include "follow_stream_dialog.h" #include "follow_stream_dialog.h"
#include "capture_interfaces_dialog.h" #include "main_welcome.h"
#include "about_dialog.h" #include "packet_list.h"
#include "progress_bar.h"
class QAction; class QAction;
class QActionGroup; class QActionGroup;
@ -108,7 +110,7 @@ private:
QSplitter extra_split_; QSplitter extra_split_;
MainWelcome *main_welcome_; MainWelcome *main_welcome_;
DisplayFilterCombo *df_combo_box_; DisplayFilterCombo *df_combo_box_;
capture_file *cap_file_; CaptureFile capture_file_;
QFont mono_font_; QFont mono_font_;
// XXX - packet_list_, proto_tree_, and byte_view_tab_ should // XXX - packet_list_, proto_tree_, and byte_view_tab_ should
// probably be full-on values instead of pointers. // probably be full-on values instead of pointers.
@ -186,7 +188,7 @@ public slots:
void layoutToolbars(); void layoutToolbars();
void updateNameResolutionActions(); void updateNameResolutionActions();
void captureCapturePrepared(capture_session *cap_session); void captureCapturePrepared(capture_session *);
void captureCaptureUpdateStarted(capture_session *cap_session); void captureCaptureUpdateStarted(capture_session *cap_session);
void captureCaptureUpdateFinished(capture_session *cap_session); void captureCaptureUpdateFinished(capture_session *cap_session);
void captureCaptureFixedStarted(capture_session *cap_session); void captureCaptureFixedStarted(capture_session *cap_session);
@ -194,11 +196,11 @@ public slots:
void captureCaptureStopping(capture_session *cap_session); void captureCaptureStopping(capture_session *cap_session);
void captureCaptureFailed(capture_session *cap_session); void captureCaptureFailed(capture_session *cap_session);
void captureFileOpened(const capture_file *cf); void captureFileOpened();
void captureFileReadStarted(const capture_file *cf); void captureFileReadStarted();
void captureFileReadFinished(const capture_file *cf); void captureFileReadFinished();
void captureFileClosing(const capture_file *cf); void captureFileClosing();
void captureFileClosed(const capture_file *cf); void captureFileClosed();
void configurationProfileChanged(const gchar *profile_name); void configurationProfileChanged(const gchar *profile_name);
void filterExpressionsChanged(); void filterExpressionsChanged();

View File

@ -32,8 +32,6 @@
#include "main_window.h" #include "main_window.h"
#include "ui_main_window.h" #include "ui_main_window.h"
#include "globals.h"
#ifdef _WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#include <io.h> #include <io.h>
@ -128,7 +126,7 @@ void MainWindow::openCaptureFile(QString& cf_path, QString& read_filter, unsigne
for (;;) { for (;;) {
if (cf_path.isEmpty()) { if (cf_path.isEmpty()) {
CaptureFileDialog open_dlg(this, cap_file_, read_filter); CaptureFileDialog open_dlg(this, capture_file_.capFile(), read_filter);
switch (prefs.gui_fileopen_style) { switch (prefs.gui_fileopen_style) {
@ -158,7 +156,7 @@ void MainWindow::openCaptureFile(QString& cf_path, QString& read_filter, unsigne
} }
if (dfilter_compile(read_filter.toUtf8().constData(), &rfcode)) { if (dfilter_compile(read_filter.toUtf8().constData(), &rfcode)) {
cf_set_rfcode(&cfile, rfcode); cf_set_rfcode(CaptureFile::globalCapFile(), rfcode);
} else { } else {
/* Not valid. Tell the user, and go back and run the file /* Not valid. Tell the user, and go back and run the file
selection box again once they dismiss the alert. */ selection box again once they dismiss the alert. */
@ -179,20 +177,20 @@ void MainWindow::openCaptureFile(QString& cf_path, QString& read_filter, unsigne
} }
/* Try to open the capture file. This closes the current file if it succeeds. */ /* Try to open the capture file. This closes the current file if it succeeds. */
cfile.window = this; CaptureFile::globalCapFile()->window = this;
if (cf_open(&cfile, cf_path.toUtf8().constData(), type, FALSE, &err) != CF_OK) { if (cf_open(CaptureFile::globalCapFile(), cf_path.toUtf8().constData(), type, FALSE, &err) != CF_OK) {
/* We couldn't open it; don't dismiss the open dialog box, /* We couldn't open it; don't dismiss the open dialog box,
just leave it around so that the user can, after they just leave it around so that the user can, after they
dismiss the alert box popped up for the open error, dismiss the alert box popped up for the open error,
try again. */ try again. */
cfile.window = NULL; CaptureFile::globalCapFile()->window = NULL;
if (rfcode != NULL) if (rfcode != NULL)
dfilter_free(rfcode); dfilter_free(rfcode);
cf_path.clear(); cf_path.clear();
continue; continue;
} }
switch (cf_read(&cfile, FALSE)) { switch (cf_read(CaptureFile::globalCapFile(), FALSE)) {
case CF_READ_OK: case CF_READ_OK:
case CF_READ_ERROR: case CF_READ_ERROR:
@ -206,7 +204,7 @@ void MainWindow::openCaptureFile(QString& cf_path, QString& read_filter, unsigne
capture file has been closed - just free the capture file name capture file has been closed - just free the capture file name
string and return (without changing the last containing string and return (without changing the last containing
directory). */ directory). */
cap_file_ = NULL; capture_file_.setCapFile(NULL);
return; return;
} }
break; break;
@ -221,7 +219,7 @@ void MainWindow::filterPackets(QString& new_filter, bool force)
{ {
cf_status_t cf_status; cf_status_t cf_status;
cf_status = cf_filter_packets(&cfile, new_filter.toUtf8().data(), force); cf_status = cf_filter_packets(CaptureFile::globalCapFile(), new_filter.toUtf8().data(), force);
if (cf_status == CF_OK) { if (cf_status == CF_OK) {
emit displayFilterSuccess(true); emit displayFilterSuccess(true);
@ -415,7 +413,7 @@ void MainWindow::filterAction(QString &action_filter, FilterAction::Action actio
// Capture callbacks // Capture callbacks
void MainWindow::captureCapturePrepared(capture_session *cap_session) { void MainWindow::captureCapturePrepared(capture_session *) {
#ifdef HAVE_LIBPCAP #ifdef HAVE_LIBPCAP
setTitlebarForCaptureInProgress(); setTitlebarForCaptureInProgress();
@ -429,11 +427,9 @@ void MainWindow::captureCapturePrepared(capture_session *cap_session) {
// /* Don't set up main window for a capture file. */ // /* Don't set up main window for a capture file. */
// main_set_for_capture_file(FALSE); // main_set_for_capture_file(FALSE);
main_ui_->mainStack->setCurrentWidget(&master_split_); main_ui_->mainStack->setCurrentWidget(&master_split_);
cap_file_ = (capture_file *) cap_session->cf;
#else
Q_UNUSED(cap_session)
#endif // HAVE_LIBPCAP #endif // HAVE_LIBPCAP
} }
void MainWindow::captureCaptureUpdateStarted(capture_session *cap_session) { void MainWindow::captureCaptureUpdateStarted(capture_session *cap_session) {
Q_UNUSED(cap_session); Q_UNUSED(cap_session);
#ifdef HAVE_LIBPCAP #ifdef HAVE_LIBPCAP
@ -523,42 +519,38 @@ void MainWindow::captureCaptureFailed(capture_session *cap_session) {
} }
// Callbacks from cfile.c via WiresharkApplication::captureFileCallback // Callbacks from cfile.c and file.c via CaptureFile::captureFileCallback
void MainWindow::captureFileOpened(const capture_file *cf) { void MainWindow::captureFileOpened() {
if (cf->window != this) return; if (capture_file_.window() != this) return;
cap_file_ = (capture_file *) cf;
file_set_dialog_.fileOpened(cf); file_set_dialog_.fileOpened(capture_file_.capFile());
setMenusForFileSet(true); setMenusForFileSet(true);
emit setCaptureFile(cap_file_); emit setCaptureFile(capture_file_.capFile());
} }
void MainWindow::captureFileReadStarted(const capture_file *cf) { void MainWindow::captureFileReadStarted() {
if (cf != cap_file_) return;
// tap_param_dlg_update(); // tap_param_dlg_update();
/* Set up main window for a capture file. */ /* Set up main window for a capture file. */
// main_set_for_capture_file(TRUE); // main_set_for_capture_file(TRUE);
main_ui_->statusBar->popFileStatus(); main_ui_->statusBar->popFileStatus();
QString msg = QString(tr("Loading: %1")).arg(get_basename(cf->filename)); QString msg = QString(tr("Loading: %1")).arg(get_basename(capture_file_.capFile()->filename));
main_ui_->statusBar->pushFileStatus(msg); main_ui_->statusBar->pushFileStatus(msg);
main_ui_->mainStack->setCurrentWidget(&master_split_); main_ui_->mainStack->setCurrentWidget(&master_split_);
WiresharkApplication::processEvents(); WiresharkApplication::processEvents();
} }
void MainWindow::captureFileReadFinished(const capture_file *cf) { void MainWindow::captureFileReadFinished() {
if (cf != cap_file_) return;
gchar *dir_path; gchar *dir_path;
if (!cf->is_tempfile && cf->filename) { if (!capture_file_.capFile()->is_tempfile && capture_file_.capFile()->filename) {
/* Add this filename to the list of recent files in the "Recent Files" submenu */ /* Add this filename to the list of recent files in the "Recent Files" submenu */
add_menu_recent_capture_file(cf->filename); add_menu_recent_capture_file(capture_file_.capFile()->filename);
/* Remember folder for next Open dialog and save it in recent */ /* Remember folder for next Open dialog and save it in recent */
dir_path = get_dirname(g_strdup(cf->filename)); dir_path = get_dirname(g_strdup(capture_file_.capFile()->filename));
wsApp->setLastOpenDir(dir_path); wsApp->setLastOpenDir(dir_path);
g_free(dir_path); g_free(dir_path);
} }
@ -570,14 +562,12 @@ void MainWindow::captureFileReadFinished(const capture_file *cf) {
setForCapturedPackets(true); setForCapturedPackets(true);
main_ui_->statusBar->popFileStatus(); main_ui_->statusBar->popFileStatus();
QString msg = QString().sprintf("%s", get_basename(cf->filename)); QString msg = QString().sprintf("%s", get_basename(capture_file_.capFile()->filename));
main_ui_->statusBar->pushFileStatus(msg); main_ui_->statusBar->pushFileStatus(msg);
emit setDissectedCaptureFile(cap_file_); emit setDissectedCaptureFile(capture_file_.capFile());
} }
void MainWindow::captureFileClosing(const capture_file *cf) { void MainWindow::captureFileClosing() {
if (cf != cap_file_) return;
setMenusForCaptureFile(true); setMenusForCaptureFile(true);
setForCapturedPackets(false); setForCapturedPackets(false);
setMenusForSelectedPacket(); setMenusForSelectedPacket();
@ -591,8 +581,7 @@ void MainWindow::captureFileClosing(const capture_file *cf) {
emit setDissectedCaptureFile(NULL); emit setDissectedCaptureFile(NULL);
} }
void MainWindow::captureFileClosed(const capture_file *cf) { void MainWindow::captureFileClosed() {
if (cf != cap_file_) return;
packets_bar_update(); packets_bar_update();
file_set_dialog_.fileClosed(); file_set_dialog_.fileClosed();
@ -602,7 +591,6 @@ void MainWindow::captureFileClosed(const capture_file *cf) {
main_ui_->statusBar->hideExpert(); main_ui_->statusBar->hideExpert();
main_ui_->statusBar->popFileStatus(); main_ui_->statusBar->popFileStatus();
cap_file_ = NULL;
if (df_combo_box_) if (df_combo_box_)
{ {
@ -694,7 +682,7 @@ void MainWindow::startCapture() {
this capture. */ this capture. */
collect_ifaces(&global_capture_opts); collect_ifaces(&global_capture_opts);
cfile.window = this; CaptureFile::globalCapFile()->window = this;
if (capture_start(&global_capture_opts, &cap_session_, main_window_update)) { if (capture_start(&global_capture_opts, &cap_session_, main_window_update)) {
/* The capture succeeded, which means the capture filter syntax is /* The capture succeeded, which means the capture filter syntax is
valid; add this capture filter to the recent capture filter list. */ valid; add this capture filter to the recent capture filter list. */
@ -705,7 +693,7 @@ void MainWindow::startCapture() {
} }
} }
} else { } else {
cfile.window = NULL; CaptureFile::globalCapFile()->window = NULL;
} }
#endif // HAVE_LIBPCAP #endif // HAVE_LIBPCAP
} }
@ -896,21 +884,21 @@ void MainWindow::setMenusForSelectedPacket()
time reference frame). (XXX - why check frame_selected?) */ time reference frame). (XXX - why check frame_selected?) */
gboolean another_is_time_ref = FALSE; gboolean another_is_time_ref = FALSE;
if (cap_file_) { if (capture_file_.capFile()) {
frame_selected = cap_file_->current_frame != NULL; frame_selected = capture_file_.capFile()->current_frame != NULL;
have_frames = cap_file_->count > 0; have_frames = capture_file_.capFile()->count > 0;
have_marked = frame_selected && cap_file_->marked_count > 0; have_marked = frame_selected && capture_file_.capFile()->marked_count > 0;
another_is_marked = have_marked && another_is_marked = have_marked &&
!(cap_file_->marked_count == 1 && cap_file_->current_frame->flags.marked); !(capture_file_.capFile()->marked_count == 1 && capture_file_.capFile()->current_frame->flags.marked);
have_filtered = cap_file_->displayed_count > 0 && cap_file_->displayed_count != cap_file_->count; have_filtered = capture_file_.capFile()->displayed_count > 0 && capture_file_.capFile()->displayed_count != capture_file_.capFile()->count;
have_ignored = cap_file_->ignored_count > 0; have_ignored = capture_file_.capFile()->ignored_count > 0;
have_time_ref = cap_file_->ref_time_count > 0; have_time_ref = capture_file_.capFile()->ref_time_count > 0;
another_is_time_ref = frame_selected && have_time_ref && another_is_time_ref = frame_selected && have_time_ref &&
!(cap_file_->ref_time_count == 1 && cap_file_->current_frame->flags.ref_time); !(capture_file_.capFile()->ref_time_count == 1 && capture_file_.capFile()->current_frame->flags.ref_time);
if (cap_file_->edt) if (capture_file_.capFile()->edt)
{ {
proto_get_frame_protocols(cap_file_->edt->pi.layers, NULL, &is_tcp, NULL, &is_sctp, NULL); proto_get_frame_protocols(capture_file_.capFile()->edt->pi.layers, NULL, &is_tcp, NULL, &is_sctp, NULL);
} }
} }
// if (cfile.edt && cfile.edt->tree) { // if (cfile.edt && cfile.edt->tree) {
@ -952,7 +940,7 @@ void MainWindow::setMenusForSelectedPacket()
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/EditPacket", // set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/EditPacket",
// frame_selected); // frame_selected);
//#endif /* WANT_PACKET_EDITOR */ //#endif /* WANT_PACKET_EDITOR */
main_ui_->actionEditPacketComment->setEnabled(frame_selected && wtap_dump_can_write(cap_file_->linktypes, WTAP_COMMENT_PER_PACKET)); main_ui_->actionEditPacketComment->setEnabled(frame_selected && wtap_dump_can_write(capture_file_.capFile()->linktypes, WTAP_COMMENT_PER_PACKET));
main_ui_->actionEditIgnorePacket->setEnabled(frame_selected); main_ui_->actionEditIgnorePacket->setEnabled(frame_selected);
main_ui_->actionEditIgnoreAllDisplayed->setEnabled(have_filtered); main_ui_->actionEditIgnoreAllDisplayed->setEnabled(have_filtered);
@ -1085,11 +1073,11 @@ void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
// XXX Add commented items below // XXX Add commented items below
if (cap_file_) { if (capture_file_.capFile()) {
cap_file_->finfo_selected = fi; capture_file_.capFile()->finfo_selected = fi;
} }
if (cap_file_ != NULL && fi != NULL) { if (capture_file_.capFile() != NULL && fi != NULL) {
/* /*
header_field_info *hfinfo = fi->hfinfo; header_field_info *hfinfo = fi->hfinfo;
const char *abbrev; const char *abbrev;
@ -1104,7 +1092,7 @@ void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
} }
properties = prefs_is_registered_protocol(abbrev); properties = prefs_is_registered_protocol(abbrev);
*/ */
bool can_match_selected = proto_can_match_selected(cap_file_->finfo_selected, cap_file_->edt); bool can_match_selected = proto_can_match_selected(capture_file_.capFile()->finfo_selected, capture_file_.capFile()->edt);
// set_menu_sensitivity(ui_manager_tree_view_menu, // set_menu_sensitivity(ui_manager_tree_view_menu,
// "/TreeViewPopup/GotoCorrespondingPacket", hfinfo->type == FT_FRAMENUM); // "/TreeViewPopup/GotoCorrespondingPacket", hfinfo->type == FT_FRAMENUM);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy", // set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy",
@ -1159,7 +1147,7 @@ void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
main_ui_->actionAnalyzePAFAndNotSelected->setEnabled(can_match_selected); main_ui_->actionAnalyzePAFAndNotSelected->setEnabled(can_match_selected);
main_ui_->actionAnalyzePAFOrNotSelected->setEnabled(can_match_selected); main_ui_->actionAnalyzePAFOrNotSelected->setEnabled(can_match_selected);
main_ui_->actionViewExpandSubtrees->setEnabled(cap_file_->finfo_selected->tree_type != -1); main_ui_->actionViewExpandSubtrees->setEnabled(capture_file_.capFile()->finfo_selected->tree_type != -1);
// prev_abbrev = g_object_get_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev"); // prev_abbrev = g_object_get_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev");
// if (!prev_abbrev || (strcmp (prev_abbrev, abbrev) != 0)) { // if (!prev_abbrev || (strcmp (prev_abbrev, abbrev) != 0)) {
// /* No previous protocol or protocol changed - update Protocol Preferences menu */ // /* No previous protocol or protocol changed - update Protocol Preferences menu */
@ -1239,8 +1227,8 @@ void MainWindow::startInterfaceCapture(bool valid)
void MainWindow::redissectPackets() void MainWindow::redissectPackets()
{ {
if (cap_file_) if (capture_file_.capFile())
cf_redissect_packets(cap_file_); cf_redissect_packets(capture_file_.capFile());
main_ui_->statusBar->expertUpdate(); main_ui_->statusBar->expertUpdate();
} }
@ -1248,14 +1236,14 @@ void MainWindow::recreatePacketList()
{ {
prefs.num_cols = g_list_length(prefs.col_list); prefs.num_cols = g_list_length(prefs.col_list);
col_cleanup(&cfile.cinfo); col_cleanup(&CaptureFile::globalCapFile()->cinfo);
build_column_format_array(&cfile.cinfo, prefs.num_cols, FALSE); build_column_format_array(&CaptureFile::globalCapFile()->cinfo, prefs.num_cols, FALSE);
packet_list_->redrawVisiblePackets(); packet_list_->redrawVisiblePackets();
packet_list_->hide(); packet_list_->hide();
packet_list_->show(); packet_list_->show();
cfile.columns_changed = FALSE; /* Reset value */ CaptureFile::globalCapFile()->columns_changed = FALSE; /* Reset value */
} }
void MainWindow::fieldsChanged() void MainWindow::fieldsChanged()
@ -1266,21 +1254,21 @@ void MainWindow::fieldsChanged()
// Syntax check filter // Syntax check filter
// TODO: Check if syntax filter is still valid after fields have changed // TODO: Check if syntax filter is still valid after fields have changed
// and update background color. // and update background color.
if (cfile.dfilter) { if (CaptureFile::globalCapFile()->dfilter) {
// Check if filter is still valid // Check if filter is still valid
dfilter_t *dfp = NULL; dfilter_t *dfp = NULL;
if (!dfilter_compile(cfile.dfilter, &dfp)) { if (!dfilter_compile(CaptureFile::globalCapFile()->dfilter, &dfp)) {
// TODO: Not valid, enable "Apply" button. // TODO: Not valid, enable "Apply" button.
g_free(cfile.dfilter); g_free(CaptureFile::globalCapFile()->dfilter);
cfile.dfilter = NULL; CaptureFile::globalCapFile()->dfilter = NULL;
} }
dfilter_free(dfp); dfilter_free(dfp);
} }
if (have_custom_cols(&cfile.cinfo)) { if (have_custom_cols(&CaptureFile::globalCapFile()->cinfo)) {
/* Recreate packet list according to new/changed/deleted fields */ /* Recreate packet list according to new/changed/deleted fields */
recreatePacketList(); recreatePacketList();
} else if (cfile.state != FILE_CLOSED) { } else if (CaptureFile::globalCapFile()->state != FILE_CLOSED) {
/* Redissect packets if we have any */ /* Redissect packets if we have any */
redissectPackets(); redissectPackets();
} }
@ -1374,12 +1362,12 @@ void MainWindow::on_actionFileClose_triggered() {
void MainWindow::on_actionFileSave_triggered() void MainWindow::on_actionFileSave_triggered()
{ {
saveCaptureFile(cap_file_, FALSE); saveCaptureFile(capture_file_.capFile(), FALSE);
} }
void MainWindow::on_actionFileSaveAs_triggered() void MainWindow::on_actionFileSaveAs_triggered()
{ {
saveAsCaptureFile(cap_file_, FALSE, TRUE); saveAsCaptureFile(capture_file_.capFile(), FALSE, TRUE);
} }
void MainWindow::on_actionFileSetListFiles_triggered() void MainWindow::on_actionFileSetListFiles_triggered()
@ -1441,7 +1429,7 @@ void MainWindow::on_actionFileExportPacketBytes_triggered()
{ {
QString file_name; QString file_name;
if (!cap_file_ || !cap_file_->finfo_selected) return; if (!capture_file_.capFile() || !capture_file_.capFile()->finfo_selected) return;
file_name = QFileDialog::getSaveFileName(this, file_name = QFileDialog::getSaveFileName(this,
tr("Wireshark: Export Selected Packet Bytes"), tr("Wireshark: Export Selected Packet Bytes"),
@ -1453,14 +1441,14 @@ void MainWindow::on_actionFileExportPacketBytes_triggered()
const guint8 *data_p; const guint8 *data_p;
int fd; int fd;
data_p = tvb_get_ptr(cap_file_->finfo_selected->ds_tvb, 0, -1) + data_p = tvb_get_ptr(capture_file_.capFile()->finfo_selected->ds_tvb, 0, -1) +
cap_file_->finfo_selected->start; capture_file_.capFile()->finfo_selected->start;
fd = ws_open(file_name.toUtf8().constData(), O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666); fd = ws_open(file_name.toUtf8().constData(), O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
if (fd == -1) { if (fd == -1) {
open_failure_alert_box(file_name.toUtf8().constData(), errno, TRUE); open_failure_alert_box(file_name.toUtf8().constData(), errno, TRUE);
return; return;
} }
if (write(fd, data_p, cfile.finfo_selected->length) < 0) { if (write(fd, data_p, capture_file_.capFile()->finfo_selected->length) < 0) {
write_failure_alert_box(file_name.toUtf8().constData(), errno); write_failure_alert_box(file_name.toUtf8().constData(), errno);
::close(fd); ::close(fd);
return; return;
@ -1552,27 +1540,27 @@ void MainWindow::on_actionFileExportSSLSessionKeys_triggered()
void MainWindow::on_actionFileExportObjectsDICOM_triggered() void MainWindow::on_actionFileExportObjectsDICOM_triggered()
{ {
new ExportObjectDialog(this, cap_file_, ExportObjectDialog::Dicom); new ExportObjectDialog(this, capture_file_.capFile(), ExportObjectDialog::Dicom);
} }
void MainWindow::on_actionFileExportObjectsHTTP_triggered() void MainWindow::on_actionFileExportObjectsHTTP_triggered()
{ {
new ExportObjectDialog(this, cap_file_, ExportObjectDialog::Http); new ExportObjectDialog(this, capture_file_.capFile(), ExportObjectDialog::Http);
} }
void MainWindow::on_actionFileExportObjectsSMB_triggered() void MainWindow::on_actionFileExportObjectsSMB_triggered()
{ {
new ExportObjectDialog(this, cap_file_, ExportObjectDialog::Smb); new ExportObjectDialog(this, capture_file_.capFile(), ExportObjectDialog::Smb);
} }
void MainWindow::on_actionFileExportObjectsTFTP_triggered() void MainWindow::on_actionFileExportObjectsTFTP_triggered()
{ {
new ExportObjectDialog(this, cap_file_, ExportObjectDialog::Tftp); new ExportObjectDialog(this, capture_file_.capFile(), ExportObjectDialog::Tftp);
} }
void MainWindow::on_actionFilePrint_triggered() void MainWindow::on_actionFilePrint_triggered()
{ {
PrintDialog pdlg(this, cap_file_); PrintDialog pdlg(this, capture_file_.capFile());
pdlg.exec(); pdlg.exec();
} }
@ -1585,23 +1573,23 @@ void MainWindow::actionEditCopyTriggered(MainWindow::CopySelected selection_type
char label_str[ITEM_LABEL_LENGTH]; char label_str[ITEM_LABEL_LENGTH];
QString clip; QString clip;
if (!cap_file_) return; if (!capture_file_.capFile()) return;
switch(selection_type) { switch(selection_type) {
case CopySelectedDescription: case CopySelectedDescription:
if (cap_file_->finfo_selected->rep && if (capture_file_.capFile()->finfo_selected->rep &&
strlen (cap_file_->finfo_selected->rep->representation) > 0) { strlen (capture_file_.capFile()->finfo_selected->rep->representation) > 0) {
clip.append(cap_file_->finfo_selected->rep->representation); clip.append(capture_file_.capFile()->finfo_selected->rep->representation);
} }
break; break;
case CopySelectedFieldName: case CopySelectedFieldName:
if (cap_file_->finfo_selected->hfinfo->abbrev != 0) { if (capture_file_.capFile()->finfo_selected->hfinfo->abbrev != 0) {
clip.append(cap_file_->finfo_selected->hfinfo->abbrev); clip.append(capture_file_.capFile()->finfo_selected->hfinfo->abbrev);
} }
break; break;
case CopySelectedValue: case CopySelectedValue:
if (cap_file_->edt != 0) { if (capture_file_.capFile()->edt != 0) {
gchar* field_str = get_node_field_value(cap_file_->finfo_selected, cap_file_->edt); gchar* field_str = get_node_field_value(capture_file_.capFile()->finfo_selected, capture_file_.capFile()->edt);
clip.append(field_str); clip.append(field_str);
g_free(field_str); g_free(field_str);
} }
@ -1610,7 +1598,7 @@ void MainWindow::actionEditCopyTriggered(MainWindow::CopySelected selection_type
if (clip.length() == 0) { if (clip.length() == 0) {
/* If no representation then... Try to read the value */ /* If no representation then... Try to read the value */
proto_item_fill_label(cap_file_->finfo_selected, label_str); proto_item_fill_label(capture_file_.capFile()->finfo_selected, label_str);
clip.append(label_str); clip.append(label_str);
} }
@ -1684,14 +1672,14 @@ void MainWindow::on_actionEditUnmarkAllDisplayed_triggered()
void MainWindow::on_actionEditNextMark_triggered() void MainWindow::on_actionEditNextMark_triggered()
{ {
if (cap_file_) if (capture_file_.capFile())
cf_find_packet_marked(cap_file_, SD_FORWARD); cf_find_packet_marked(capture_file_.capFile(), SD_FORWARD);
} }
void MainWindow::on_actionEditPreviousMark_triggered() void MainWindow::on_actionEditPreviousMark_triggered()
{ {
if (cap_file_) if (capture_file_.capFile())
cf_find_packet_marked(cap_file_, SD_BACKWARD); cf_find_packet_marked(capture_file_.capFile(), SD_BACKWARD);
} }
void MainWindow::on_actionEditIgnorePacket_triggered() void MainWindow::on_actionEditIgnorePacket_triggered()
@ -1721,19 +1709,19 @@ void MainWindow::on_actionEditUnsetAllTimeReferences_triggered()
void MainWindow::on_actionEditNextTimeReference_triggered() void MainWindow::on_actionEditNextTimeReference_triggered()
{ {
if (!cap_file_) return; if (!capture_file_.capFile()) return;
cf_find_packet_time_reference(cap_file_, SD_FORWARD); cf_find_packet_time_reference(capture_file_.capFile(), SD_FORWARD);
} }
void MainWindow::on_actionEditPreviousTimeReference_triggered() void MainWindow::on_actionEditPreviousTimeReference_triggered()
{ {
if (!cap_file_) return; if (!capture_file_.capFile()) return;
cf_find_packet_time_reference(cap_file_, SD_BACKWARD); cf_find_packet_time_reference(capture_file_.capFile(), SD_BACKWARD);
} }
void MainWindow::on_actionEditTimeShift_triggered() void MainWindow::on_actionEditTimeShift_triggered()
{ {
TimeShiftDialog ts_dialog(this, cap_file_); TimeShiftDialog ts_dialog(this, capture_file_.capFile());
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
&ts_dialog, SLOT(setCaptureFile(capture_file*))); &ts_dialog, SLOT(setCaptureFile(capture_file*)));
ts_dialog.exec(); ts_dialog.exec();
@ -1810,9 +1798,9 @@ void MainWindow::setTimestampFormat(QAction *action)
if (recent.gui_time_format != tsf) { if (recent.gui_time_format != tsf) {
timestamp_set_type(tsf); timestamp_set_type(tsf);
recent.gui_time_format = tsf; recent.gui_time_format = tsf;
if (cap_file_) { if (capture_file_.capFile()) {
/* This call adjusts column width */ /* This call adjusts column width */
cf_timestamp_auto_precision(cap_file_); cf_timestamp_auto_precision(capture_file_.capFile());
} }
if (packet_list_) { if (packet_list_) {
packet_list_->redrawVisiblePackets(); packet_list_->redrawVisiblePackets();
@ -1832,9 +1820,9 @@ void MainWindow::setTimestampPrecision(QAction *action)
/* the actual precision will be set in packet_list_queue_draw() below */ /* the actual precision will be set in packet_list_queue_draw() below */
timestamp_set_precision(tsp); timestamp_set_precision(tsp);
recent.gui_time_precision = tsp; recent.gui_time_precision = tsp;
if (cap_file_) { if (capture_file_.capFile()) {
/* This call adjusts column width */ /* This call adjusts column width */
cf_timestamp_auto_precision(cap_file_); cf_timestamp_auto_precision(capture_file_.capFile());
} }
if (packet_list_) { if (packet_list_) {
packet_list_->redrawVisiblePackets(); packet_list_->redrawVisiblePackets();
@ -1851,9 +1839,9 @@ void MainWindow::on_actionViewTimeDisplaySecondsWithHoursAndMinutes_triggered(bo
} }
timestamp_set_seconds_type(recent.gui_seconds_format); timestamp_set_seconds_type(recent.gui_seconds_format);
if (cap_file_) { if (capture_file_.capFile()) {
/* This call adjusts column width */ /* This call adjusts column width */
cf_timestamp_auto_precision(cap_file_); cf_timestamp_auto_precision(capture_file_.capFile());
} }
if (packet_list_) { if (packet_list_) {
packet_list_->redrawVisiblePackets(); packet_list_->redrawVisiblePackets();
@ -1932,7 +1920,7 @@ void MainWindow::on_actionViewResizeColumns_triggered()
void MainWindow::on_actionViewReload_triggered() void MainWindow::on_actionViewReload_triggered()
{ {
cf_reload(&cfile); cf_reload(CaptureFile::globalCapFile());
} }
// Expand / collapse slots in proto_tree // Expand / collapse slots in proto_tree
@ -1948,9 +1936,9 @@ void MainWindow::matchFieldFilter(FilterAction::Action action, FilterAction::Act
if (packet_list_->contextMenuActive()) { if (packet_list_->contextMenuActive()) {
field_filter = packet_list_->getFilterFromRowAndColumn(); field_filter = packet_list_->getFilterFromRowAndColumn();
} else if (cap_file_ && cap_file_->finfo_selected) { } else if (capture_file_.capFile() && capture_file_.capFile()->finfo_selected) {
field_filter = proto_construct_match_selected_string(cap_file_->finfo_selected, field_filter = proto_construct_match_selected_string(capture_file_.capFile()->finfo_selected,
cap_file_->edt); capture_file_.capFile()->edt);
} else { } else {
return; return;
} }
@ -2037,14 +2025,14 @@ void MainWindow::on_actionAnalyzeDecodeAs_triggered()
create_new = true; create_new = true;
} }
DecodeAsDialog da_dialog(this, cap_file_, create_new); DecodeAsDialog da_dialog(this, capture_file_.capFile(), create_new);
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
&da_dialog, SLOT(setCaptureFile(capture_file*))); &da_dialog, SLOT(setCaptureFile(capture_file*)));
da_dialog.exec(); da_dialog.exec();
} }
void MainWindow::openFollowStreamDialog(follow_type_t type) { void MainWindow::openFollowStreamDialog(follow_type_t type) {
FollowStreamDialog *fsd = new FollowStreamDialog(this, type, cap_file_); FollowStreamDialog *fsd = new FollowStreamDialog(this, type, capture_file_.capFile());
connect(fsd, SIGNAL(updateFilter(QString&, bool)), this, SLOT(filterPackets(QString&, bool))); connect(fsd, SIGNAL(updateFilter(QString&, bool)), this, SLOT(filterPackets(QString&, bool)));
connect(fsd, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int))); connect(fsd, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int)));
@ -2069,7 +2057,7 @@ void MainWindow::on_actionAnalyzeFollowSSLStream_triggered()
void MainWindow::openSCTPAllAssocsDialog() void MainWindow::openSCTPAllAssocsDialog()
{ {
SCTPAllAssocsDialog *sctp_dialog = new SCTPAllAssocsDialog(this, cap_file_); SCTPAllAssocsDialog *sctp_dialog = new SCTPAllAssocsDialog(this, capture_file_.capFile());
connect(sctp_dialog, SIGNAL(filterPackets(QString&,bool)), connect(sctp_dialog, SIGNAL(filterPackets(QString&,bool)),
this, SLOT(filterPackets(QString&,bool))); this, SLOT(filterPackets(QString&,bool)));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
@ -2096,7 +2084,7 @@ void MainWindow::on_actionSCTPShowAllAssociations_triggered()
void MainWindow::on_actionSCTPAnalyseThisAssociation_triggered() void MainWindow::on_actionSCTPAnalyseThisAssociation_triggered()
{ {
SCTPAssocAnalyseDialog *sctp_analyse = new SCTPAssocAnalyseDialog(this, NULL, cap_file_); SCTPAssocAnalyseDialog *sctp_analyse = new SCTPAssocAnalyseDialog(this, NULL, capture_file_.capFile());
connect(sctp_analyse, SIGNAL(filterPackets(QString&,bool)), connect(sctp_analyse, SIGNAL(filterPackets(QString&,bool)),
this, SLOT(filterPackets(QString&,bool))); this, SLOT(filterPackets(QString&,bool)));
@ -2115,7 +2103,7 @@ void MainWindow::on_actionSCTPAnalyseThisAssociation_triggered()
void MainWindow::on_actionSCTPFilterThisAssociation_triggered() void MainWindow::on_actionSCTPFilterThisAssociation_triggered()
{ {
sctp_assoc_info_t* assoc = SCTPAssocAnalyseDialog::findAssocForPacket(cap_file_); sctp_assoc_info_t* assoc = SCTPAssocAnalyseDialog::findAssocForPacket(capture_file_.capFile());
if (assoc) { if (assoc) {
QString newFilter = QString("sctp.assoc_index==%1").arg(assoc->assoc_id); QString newFilter = QString("sctp.assoc_index==%1").arg(assoc->assoc_id);
assoc = NULL; assoc = NULL;
@ -2130,7 +2118,7 @@ void MainWindow::on_actionSCTPFilterThisAssociation_triggered()
void MainWindow::on_actionStatisticsFlowGraph_triggered() void MainWindow::on_actionStatisticsFlowGraph_triggered()
{ {
SequenceDialog *sequence_dialog = new SequenceDialog(this, cap_file_); SequenceDialog *sequence_dialog = new SequenceDialog(this, capture_file_.capFile());
connect(sequence_dialog, SIGNAL(goToPacket(int)), connect(sequence_dialog, SIGNAL(goToPacket(int)),
packet_list_, SLOT(goToPacket(int))); packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
@ -2140,7 +2128,7 @@ void MainWindow::on_actionStatisticsFlowGraph_triggered()
void MainWindow::openTcpStreamDialog(int graph_type) void MainWindow::openTcpStreamDialog(int graph_type)
{ {
TCPStreamDialog *stream_dialog = new TCPStreamDialog(this, cap_file_, (tcp_graph_type)graph_type); TCPStreamDialog *stream_dialog = new TCPStreamDialog(this, capture_file_.capFile(), (tcp_graph_type)graph_type);
connect(stream_dialog, SIGNAL(goToPacket(int)), connect(stream_dialog, SIGNAL(goToPacket(int)),
packet_list_, SLOT(goToPacket(int))); packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
@ -2175,7 +2163,7 @@ void MainWindow::on_actionStatisticsTcpStreamWindowScaling_triggered()
void MainWindow::openStatisticsTreeDialog(const gchar *abbr) void MainWindow::openStatisticsTreeDialog(const gchar *abbr)
{ {
StatsTreeDialog *st_dialog = new StatsTreeDialog(this, cap_file_, abbr); StatsTreeDialog *st_dialog = new StatsTreeDialog(this, capture_file_.capFile(), abbr);
// connect(st_dialog, SIGNAL(goToPacket(int)), // connect(st_dialog, SIGNAL(goToPacket(int)),
// packet_list_, SLOT(goToPacket(int))); // packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
@ -2240,7 +2228,7 @@ void MainWindow::on_actionStatistics29WestQueues_Queries_by_Receiver_triggered()
void MainWindow::on_actionStatistics29WestUIM_Streams_triggered() void MainWindow::on_actionStatistics29WestUIM_Streams_triggered()
{ {
LBMStreamDialog *stream_dialog = new LBMStreamDialog(this, cap_file_); LBMStreamDialog *stream_dialog = new LBMStreamDialog(this, capture_file_.capFile());
// connect(stream_dialog, SIGNAL(goToPacket(int)), // connect(stream_dialog, SIGNAL(goToPacket(int)),
// packet_list_, SLOT(goToPacket(int))); // packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
@ -2250,7 +2238,7 @@ void MainWindow::on_actionStatistics29WestUIM_Streams_triggered()
void MainWindow::on_actionStatistics29WestUIM_Stream_Flow_Graph_triggered() void MainWindow::on_actionStatistics29WestUIM_Stream_Flow_Graph_triggered()
{ {
LBMUIMFlowDialog * uimflow_dialog = new LBMUIMFlowDialog(this, cap_file_); LBMUIMFlowDialog * uimflow_dialog = new LBMUIMFlowDialog(this, capture_file_.capFile());
connect(uimflow_dialog, SIGNAL(goToPacket(int)), connect(uimflow_dialog, SIGNAL(goToPacket(int)),
packet_list_, SLOT(goToPacket(int))); packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
@ -2260,7 +2248,7 @@ void MainWindow::on_actionStatistics29WestUIM_Stream_Flow_Graph_triggered()
void MainWindow::on_actionStatistics29WestLBTRM_triggered() void MainWindow::on_actionStatistics29WestLBTRM_triggered()
{ {
LBMLBTRMTransportDialog * lbtrm_dialog = new LBMLBTRMTransportDialog(this, cap_file_); LBMLBTRMTransportDialog * lbtrm_dialog = new LBMLBTRMTransportDialog(this, capture_file_.capFile());
connect(lbtrm_dialog, SIGNAL(goToPacket(int)), connect(lbtrm_dialog, SIGNAL(goToPacket(int)),
packet_list_, SLOT(goToPacket(int))); packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
@ -2269,7 +2257,7 @@ void MainWindow::on_actionStatistics29WestLBTRM_triggered()
} }
void MainWindow::on_actionStatistics29WestLBTRU_triggered() void MainWindow::on_actionStatistics29WestLBTRU_triggered()
{ {
LBMLBTRUTransportDialog * lbtru_dialog = new LBMLBTRUTransportDialog(this, cap_file_); LBMLBTRUTransportDialog * lbtru_dialog = new LBMLBTRUTransportDialog(this, capture_file_.capFile());
connect(lbtru_dialog, SIGNAL(goToPacket(int)), connect(lbtru_dialog, SIGNAL(goToPacket(int)),
packet_list_, SLOT(goToPacket(int))); packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
@ -2309,7 +2297,7 @@ void MainWindow::on_actionStatisticsCollectd_triggered()
void MainWindow::statCommandConversations(const char *arg, void *userdata) void MainWindow::statCommandConversations(const char *arg, void *userdata)
{ {
ConversationDialog *conv_dialog = new ConversationDialog(this, cap_file_, GPOINTER_TO_INT(userdata), arg); ConversationDialog *conv_dialog = new ConversationDialog(this, capture_file_.capFile(), GPOINTER_TO_INT(userdata), arg);
connect(conv_dialog, SIGNAL(filterAction(QString&,FilterAction::Action,FilterAction::ActionType)), connect(conv_dialog, SIGNAL(filterAction(QString&,FilterAction::Action,FilterAction::ActionType)),
this, SLOT(filterAction(QString&,FilterAction::Action,FilterAction::ActionType))); this, SLOT(filterAction(QString&,FilterAction::Action,FilterAction::ActionType)));
connect(conv_dialog, SIGNAL(openFollowStreamDialog(follow_type_t)), connect(conv_dialog, SIGNAL(openFollowStreamDialog(follow_type_t)),
@ -2328,7 +2316,7 @@ void MainWindow::on_actionStatisticsConversations_triggered()
void MainWindow::statCommandEndpoints(const char *arg, void *userdata) void MainWindow::statCommandEndpoints(const char *arg, void *userdata)
{ {
EndpointDialog *endp_dialog = new EndpointDialog(this, cap_file_, GPOINTER_TO_INT(userdata), arg); EndpointDialog *endp_dialog = new EndpointDialog(this, capture_file_.capFile(), GPOINTER_TO_INT(userdata), arg);
connect(endp_dialog, SIGNAL(filterAction(QString&,FilterAction::Action,FilterAction::ActionType)), connect(endp_dialog, SIGNAL(filterAction(QString&,FilterAction::Action,FilterAction::ActionType)),
this, SLOT(filterAction(QString&,FilterAction::Action,FilterAction::ActionType))); this, SLOT(filterAction(QString&,FilterAction::Action,FilterAction::ActionType)));
connect(endp_dialog, SIGNAL(openFollowStreamDialog(follow_type_t)), connect(endp_dialog, SIGNAL(openFollowStreamDialog(follow_type_t)),
@ -2374,7 +2362,7 @@ void MainWindow::statCommandIOGraph(const char *arg, void *userdata)
{ {
Q_UNUSED(arg); Q_UNUSED(arg);
Q_UNUSED(userdata); Q_UNUSED(userdata);
IOGraphDialog *iog_dialog = new IOGraphDialog(this, cap_file_); IOGraphDialog *iog_dialog = new IOGraphDialog(this, capture_file_.capFile());
connect(iog_dialog, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int))); connect(iog_dialog, SIGNAL(goToPacket(int)), packet_list_, SLOT(goToPacket(int)));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),
iog_dialog, SLOT(setCaptureFile(capture_file*))); iog_dialog, SLOT(setCaptureFile(capture_file*)));
@ -2394,7 +2382,7 @@ void MainWindow::on_actionStatisticsSametime_triggered()
void MainWindow::openVoipCallsDialog(bool all_flows) void MainWindow::openVoipCallsDialog(bool all_flows)
{ {
VoipCallsDialog *voip_calls_dialog = new VoipCallsDialog(this, cap_file_, all_flows); VoipCallsDialog *voip_calls_dialog = new VoipCallsDialog(this, capture_file_.capFile(), all_flows);
connect(voip_calls_dialog, SIGNAL(goToPacket(int)), connect(voip_calls_dialog, SIGNAL(goToPacket(int)),
packet_list_, SLOT(goToPacket(int))); packet_list_, SLOT(goToPacket(int)));
connect(voip_calls_dialog, SIGNAL(updateFilter(QString&, bool)), connect(voip_calls_dialog, SIGNAL(updateFilter(QString&, bool)),
@ -2629,7 +2617,7 @@ void MainWindow::on_actionCaptureStop_triggered()
void MainWindow::on_actionStatisticsCaptureFileProperties_triggered() void MainWindow::on_actionStatisticsCaptureFileProperties_triggered()
{ {
CaptureFilePropertiesDialog *capture_file_properties_dialog = new CaptureFilePropertiesDialog(this, cap_file_); CaptureFilePropertiesDialog *capture_file_properties_dialog = new CaptureFilePropertiesDialog(this, capture_file_.capFile());
connect(capture_file_properties_dialog, SIGNAL(captureCommentChanged()), connect(capture_file_properties_dialog, SIGNAL(captureCommentChanged()),
this, SLOT(updateForUnsavedChanges())); this, SLOT(updateForUnsavedChanges()));
connect(this, SIGNAL(setCaptureFile(capture_file*)), connect(this, SIGNAL(setCaptureFile(capture_file*)),

View File

@ -206,114 +206,6 @@ void WiresharkApplication::updateTaps()
draw_tap_listeners(FALSE); draw_tap_listeners(FALSE);
} }
void WiresharkApplication::captureCallback(int event _U_, capture_session *cap_session _U_)
{
#ifdef HAVE_LIBPCAP
switch(event) {
case(capture_cb_capture_prepared):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture prepared");
emit captureCapturePrepared(cap_session);
break;
case(capture_cb_capture_update_started):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture update started");
emit captureCaptureUpdateStarted(cap_session);
break;
case(capture_cb_capture_update_continue):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture update continue");
emit captureCaptureUpdateContinue(cap_session);
break;
case(capture_cb_capture_update_finished):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture update finished");
emit captureCaptureUpdateFinished(cap_session);
break;
case(capture_cb_capture_fixed_started):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture fixed started");
emit captureCaptureFixedStarted(cap_session);
break;
case(capture_cb_capture_fixed_continue):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture fixed continue");
break;
case(capture_cb_capture_fixed_finished):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture fixed finished");
emit captureCaptureFixedFinished(cap_session);
break;
case(capture_cb_capture_stopping):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture stopping");
/* Beware: this state won't be called, if the capture child
* closes the capturing on it's own! */
emit captureCaptureStopping(cap_session);
break;
case(capture_cb_capture_failed):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture failed");
emit captureCaptureFailed(cap_session);
break;
default:
g_warning("main_capture_callback: event %u unknown", event);
g_assert_not_reached();
}
#endif // HAVE_LIBPCAP
}
void WiresharkApplication::captureFileCallback(int event, void * data)
{
capture_file *cf = (capture_file *) data;
switch(event) {
case(cf_cb_file_opened):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Opened");
emit captureFileOpened(cf);
break;
case(cf_cb_file_closing):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Closing");
emit captureFileClosing(cf);
break;
case(cf_cb_file_closed):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Closed");
emit captureFileClosed(cf);
break;
case(cf_cb_file_read_started):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Read started");
emit captureFileReadStarted(cf);
QTimer::singleShot(TAP_UPDATE_DEFAULT_INTERVAL / 5, this, SLOT(updateTaps()));
QTimer::singleShot(TAP_UPDATE_DEFAULT_INTERVAL / 2, this, SLOT(updateTaps()));
break;
case(cf_cb_file_read_finished):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Read finished");
emit captureFileReadFinished(cf);
updateTaps();
break;
case(cf_cb_file_reload_started):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Reload started");
emit captureFileReadStarted(cf);
break;
case(cf_cb_file_reload_finished):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Reload finished");
emit captureFileReadFinished(cf);
break;
case(cf_cb_packet_selected):
case(cf_cb_packet_unselected):
case(cf_cb_field_unselected):
// Pure signals and slots
break;
// case(cf_cb_file_save_started): // data = string
// g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Save started");
// break;
// case(cf_cb_file_save_finished):
// g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Save finished");
// break;
// case(cf_cb_file_save_failed):
// g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: Save failed");
// break;
default:
g_log(NULL, G_LOG_LEVEL_DEBUG, "FIX: main_cf_callback %d %p", event, data);
// g_warning("main_cf_callback: event %u unknown", event);
// g_assert_not_reached();
}
}
QDir WiresharkApplication::lastOpenDir() { QDir WiresharkApplication::lastOpenDir() {
return QDir(last_open_dir); return QDir(last_open_dir);
} }
@ -532,6 +424,13 @@ void WiresharkApplication::clearRecentItems() {
emit updateRecentItemStatus(NULL, 0, false); emit updateRecentItemStatus(NULL, 0, false);
} }
void WiresharkApplication::captureFileReadStarted()
{
// Doesn't appear to do anything. Logic probably needs to be in file.c.
QTimer::singleShot(TAP_UPDATE_DEFAULT_INTERVAL / 5, this, SLOT(updateTaps()));
QTimer::singleShot(TAP_UPDATE_DEFAULT_INTERVAL / 2, this, SLOT(updateTaps()));
}
void WiresharkApplication::cleanup() void WiresharkApplication::cleanup()
{ {
software_update_cleanup(); software_update_cleanup();

View File

@ -82,8 +82,6 @@ public:
e_prefs * readConfigurationFiles(char **gdp_path, char **dp_path); e_prefs * readConfigurationFiles(char **gdp_path, char **dp_path);
QList<recent_item_status *> recentItems() const; QList<recent_item_status *> recentItems() const;
void addRecentItem(const QString &filename, qint64 size, bool accessible); void addRecentItem(const QString &filename, qint64 size, bool accessible);
void captureCallback(int event, capture_session * cap_session);
void captureFileCallback(int event, void * data);
QDir lastOpenDir(); QDir lastOpenDir();
void setLastOpenDir(const char *dir_name); void setLastOpenDir(const char *dir_name);
void setLastOpenDir(QString *dir_str); void setLastOpenDir(QString *dir_str);
@ -130,7 +128,7 @@ signals:
void addressResolutionChanged(); void addressResolutionChanged();
void fieldsChanged(); void fieldsChanged();
// XXX It might make more sense to move these to main.cpp or main_window.cpp or their own class. #if 0
void captureCapturePrepared(capture_session *cap_session); void captureCapturePrepared(capture_session *cap_session);
void captureCaptureUpdateStarted(capture_session *cap_session); void captureCaptureUpdateStarted(capture_session *cap_session);
void captureCaptureUpdateContinue(capture_session *cap_session); void captureCaptureUpdateContinue(capture_session *cap_session);
@ -139,17 +137,22 @@ signals:
void captureCaptureFixedFinished(capture_session *cap_session); void captureCaptureFixedFinished(capture_session *cap_session);
void captureCaptureStopping(capture_session *cap_session); void captureCaptureStopping(capture_session *cap_session);
void captureCaptureFailed(capture_session *cap_session); void captureCaptureFailed(capture_session *cap_session);
#endif
#if 0
void captureFileOpened(const capture_file *cf); void captureFileOpened(const capture_file *cf);
void captureFileReadStarted(const capture_file *cf); void captureFileReadStarted(const capture_file *cf);
void captureFileReadFinished(const capture_file *cf); void captureFileReadFinished(const capture_file *cf);
void captureFileClosing(const capture_file *cf); void captureFileClosing(const capture_file *cf);
void captureFileClosed(const capture_file *cf); void captureFileClosed(const capture_file *cf);
#endif
void openStatCommandDialog(const QString &menu_path, const char *arg, void *userdata); void openStatCommandDialog(const QString &menu_path, const char *arg, void *userdata);
public slots: public slots:
void clearRecentItems(); void clearRecentItems();
void captureFileReadStarted();
void updateTaps();
private slots: private slots:
void cleanup(); void cleanup();
@ -157,7 +160,6 @@ private slots:
void itemStatusFinished(const QString filename = "", qint64 size = 0, bool accessible = false); void itemStatusFinished(const QString filename = "", qint64 size = 0, bool accessible = false);
void refreshRecentFiles(void); void refreshRecentFiles(void);
void refreshAddressResolution(void); void refreshAddressResolution(void);
void updateTaps();
}; };
extern WiresharkApplication *wsApp; extern WiresharkApplication *wsApp;