2012-01-04 22:13:01 +00:00
|
|
|
/* capture_file_dialog.cpp
|
|
|
|
*
|
|
|
|
* Wireshark - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@wireshark.org>
|
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2012-06-28 22:56:06 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2012-01-04 22:13:01 +00:00
|
|
|
*/
|
|
|
|
|
2012-07-19 23:07:17 +00:00
|
|
|
#include <wiretap/wtap.h>
|
|
|
|
|
2012-10-08 20:01:59 +00:00
|
|
|
#include "packet_range_group_box.h"
|
2012-01-04 22:13:01 +00:00
|
|
|
#include "capture_file_dialog.h"
|
|
|
|
|
2013-04-24 11:07:25 +00:00
|
|
|
#ifdef Q_OS_WIN
|
2012-07-12 00:04:53 +00:00
|
|
|
#include <windows.h>
|
2013-07-12 00:41:22 +00:00
|
|
|
#include "epan/packet-range.h"
|
2012-07-12 00:04:53 +00:00
|
|
|
#include "ui/win32/file_dlg_win32.h"
|
2013-04-24 11:07:25 +00:00
|
|
|
#else // Q_OS_WIN
|
2012-09-06 23:41:34 +00:00
|
|
|
|
2012-07-27 21:43:02 +00:00
|
|
|
#include <errno.h>
|
2012-09-26 19:52:53 +00:00
|
|
|
#include "file.h"
|
2016-03-22 01:39:17 +00:00
|
|
|
#include "wsutil/filesystem.h"
|
|
|
|
#include "wsutil/nstime.h"
|
2016-09-08 21:31:03 +00:00
|
|
|
#include "wsutil/str_util.h"
|
|
|
|
#include "wsutil/utf8_entities.h"
|
|
|
|
|
2016-02-29 21:29:19 +00:00
|
|
|
#include "ui/all_files_wildcard.h"
|
2012-10-16 19:47:43 +00:00
|
|
|
|
2016-09-13 19:47:22 +00:00
|
|
|
#include <QCheckBox>
|
|
|
|
#include <QFileInfo>
|
2012-07-21 01:21:41 +00:00
|
|
|
#include <QGridLayout>
|
|
|
|
#include <QHBoxLayout>
|
|
|
|
#include <QLabel>
|
|
|
|
#include <QLineEdit>
|
2012-09-26 19:52:53 +00:00
|
|
|
#include <QMessageBox>
|
2016-09-13 19:47:22 +00:00
|
|
|
#include <QSortFilterProxyModel>
|
2012-10-08 20:01:59 +00:00
|
|
|
#include <QSpacerItem>
|
2016-09-13 19:47:22 +00:00
|
|
|
#include <QVBoxLayout>
|
|
|
|
#endif // ! Q_OS_WIN
|
2012-07-12 00:04:53 +00:00
|
|
|
|
2012-12-05 20:33:40 +00:00
|
|
|
#include <QPushButton>
|
2016-03-22 01:39:17 +00:00
|
|
|
#include "epan/prefs.h"
|
2016-09-11 20:19:31 +00:00
|
|
|
#include "qt_ui_utils.h"
|
2016-03-22 01:39:17 +00:00
|
|
|
#include <wireshark_application.h>
|
2012-12-05 20:33:40 +00:00
|
|
|
|
2012-10-08 20:01:59 +00:00
|
|
|
CaptureFileDialog::CaptureFileDialog(QWidget *parent, capture_file *cf, QString &display_filter) :
|
|
|
|
QFileDialog(parent),
|
|
|
|
cap_file_(cf),
|
2012-10-13 00:21:25 +00:00
|
|
|
display_filter_(display_filter),
|
2013-04-24 11:07:25 +00:00
|
|
|
#if !defined(Q_OS_WIN)
|
2016-07-03 20:50:47 +00:00
|
|
|
display_filter_edit_(NULL),
|
2012-10-08 20:01:59 +00:00
|
|
|
default_ft_(-1),
|
2012-10-15 18:32:51 +00:00
|
|
|
save_bt_(NULL),
|
|
|
|
help_topic_(TOPIC_ACTION_NONE)
|
2012-09-26 19:52:53 +00:00
|
|
|
#else
|
2012-10-08 20:01:59 +00:00
|
|
|
file_type_(-1)
|
2012-09-26 19:52:53 +00:00
|
|
|
#endif
|
2012-01-04 22:13:01 +00:00
|
|
|
{
|
2016-03-22 01:39:17 +00:00
|
|
|
switch (prefs.gui_fileopen_style) {
|
|
|
|
case FO_STYLE_LAST_OPENED:
|
|
|
|
/* The user has specified that we should start out in the last directory
|
|
|
|
* we looked in. If we've already opened a file, use its containing
|
|
|
|
* directory, if we could determine it, as the directory, otherwise
|
|
|
|
* use the "last opened" directory saved in the preferences file if
|
|
|
|
* there was one.
|
|
|
|
*/
|
|
|
|
setDirectory(wsApp->lastOpenDir());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case FO_STYLE_SPECIFIED:
|
|
|
|
/* The user has specified that we should always start out in a
|
|
|
|
* specified directory; if they've specified that directory,
|
|
|
|
* start out by showing the files in that dir.
|
|
|
|
*/
|
|
|
|
if (prefs.gui_fileopen_dir[0] != '\0')
|
|
|
|
setDirectory(prefs.gui_fileopen_dir);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2013-04-24 11:07:25 +00:00
|
|
|
#if !defined(Q_OS_WIN)
|
2012-07-21 01:21:41 +00:00
|
|
|
// Add extra widgets
|
2015-05-15 18:08:18 +00:00
|
|
|
// https://wiki.qt.io/Qt_project_org_faq#How_can_I_add_widgets_to_my_QFileDialog_instance.3F
|
2012-07-21 01:21:41 +00:00
|
|
|
setOption(QFileDialog::DontUseNativeDialog, true);
|
2016-09-13 19:47:22 +00:00
|
|
|
setOption(QFileDialog::HideNameFilterDetails, true);
|
2012-09-06 22:58:39 +00:00
|
|
|
QGridLayout *fd_grid = qobject_cast<QGridLayout*>(layout());
|
|
|
|
QHBoxLayout *h_box = new QHBoxLayout();
|
2012-07-21 01:21:41 +00:00
|
|
|
|
2012-10-08 20:01:59 +00:00
|
|
|
last_row_ = fd_grid->rowCount();
|
2012-07-21 01:21:41 +00:00
|
|
|
|
2012-10-08 20:01:59 +00:00
|
|
|
fd_grid->addItem(new QSpacerItem(1, 1), last_row_, 0);
|
2016-09-08 21:31:03 +00:00
|
|
|
fd_grid->addLayout(h_box, last_row_, 0, 1, 2);
|
2012-10-08 20:01:59 +00:00
|
|
|
last_row_++;
|
2012-07-21 01:21:41 +00:00
|
|
|
|
2012-09-06 22:58:39 +00:00
|
|
|
// Left and right boxes for controls and preview
|
|
|
|
h_box->addLayout(&left_v_box_);
|
|
|
|
h_box->addLayout(&right_v_box_);
|
2012-10-12 23:40:29 +00:00
|
|
|
|
2013-04-24 11:07:25 +00:00
|
|
|
#else // Q_OS_WIN
|
2012-09-10 23:03:22 +00:00
|
|
|
merge_type_ = 0;
|
2013-04-24 11:07:25 +00:00
|
|
|
#endif // Q_OS_WIN
|
2012-09-06 22:58:39 +00:00
|
|
|
}
|
2012-07-30 21:22:53 +00:00
|
|
|
|
2012-09-27 02:43:09 +00:00
|
|
|
check_savability_t CaptureFileDialog::checkSaveAsWithComments(QWidget *
|
2013-04-24 11:07:25 +00:00
|
|
|
#if defined(Q_OS_WIN)
|
2012-09-27 02:43:09 +00:00
|
|
|
parent
|
|
|
|
#endif
|
|
|
|
, capture_file *cf, int file_type) {
|
2013-04-24 11:07:25 +00:00
|
|
|
#if defined(Q_OS_WIN)
|
2012-09-26 21:16:59 +00:00
|
|
|
if (!parent || !cf)
|
|
|
|
return CANCELLED;
|
2013-08-29 22:15:40 +00:00
|
|
|
return win32_check_save_as_with_comments((HWND)parent->effectiveWinId(), cf, file_type);
|
2013-04-24 11:07:25 +00:00
|
|
|
#else // Q_OS_WIN
|
2013-04-01 20:36:42 +00:00
|
|
|
guint32 comment_types;
|
2012-09-26 19:52:53 +00:00
|
|
|
|
2013-04-01 20:36:42 +00:00
|
|
|
/* What types of comments do we have? */
|
|
|
|
comment_types = cf_comment_types(cf);
|
2012-09-26 19:52:53 +00:00
|
|
|
|
2013-04-01 20:36:42 +00:00
|
|
|
/* Does the file's format support all the comments we have? */
|
|
|
|
if (wtap_dump_supports_comment_types(file_type, comment_types)) {
|
|
|
|
/* Yes. Let the save happen; we can save all the comments, so
|
|
|
|
there's no need to delete them. */
|
2012-09-26 19:52:53 +00:00
|
|
|
return SAVE;
|
|
|
|
}
|
2013-04-01 20:36:42 +00:00
|
|
|
|
2016-01-25 10:26:57 +00:00
|
|
|
QMessageBox msg_dialog;
|
|
|
|
QPushButton *save_button;
|
|
|
|
QPushButton *discard_button;
|
|
|
|
|
|
|
|
msg_dialog.setIcon(QMessageBox::Question);
|
|
|
|
msg_dialog.setText(tr("This capture file contains comments."));
|
|
|
|
msg_dialog.setStandardButtons(QMessageBox::Cancel);
|
|
|
|
|
2013-04-01 20:36:42 +00:00
|
|
|
/* No. Are there formats in which we can write this file that
|
|
|
|
supports all the comments in this file? */
|
2013-04-01 21:17:50 +00:00
|
|
|
if (wtap_dump_can_write(cf->linktypes, comment_types)) {
|
2012-09-26 19:52:53 +00:00
|
|
|
/* Yes. Offer the user a choice of "Save in a format that
|
|
|
|
supports comments", "Discard comments and save in the
|
|
|
|
format you selected", or "Cancel", meaning "don't bother
|
|
|
|
saving the file at all". */
|
2012-10-24 15:51:50 +00:00
|
|
|
msg_dialog.setInformativeText(tr("The file format you chose doesn't support comments. "
|
2016-01-25 10:26:57 +00:00
|
|
|
"Do you want to save the capture in a format that supports comments "
|
|
|
|
"or discard the comments and save in the format you chose?"));
|
2012-09-26 19:52:53 +00:00
|
|
|
// The predefined roles don't really match the tasks at hand...
|
2016-01-25 10:26:57 +00:00
|
|
|
discard_button = msg_dialog.addButton(tr("Discard comments and save"), QMessageBox::DestructiveRole);
|
|
|
|
save_button = msg_dialog.addButton(tr("Save in another format"), QMessageBox::AcceptRole);
|
|
|
|
msg_dialog.setDefaultButton(save_button);
|
2012-09-26 19:52:53 +00:00
|
|
|
} else {
|
|
|
|
/* No. Offer the user a choice of "Discard comments and
|
|
|
|
save in the format you selected" or "Cancel". */
|
2012-10-24 15:51:50 +00:00
|
|
|
msg_dialog.setInformativeText(tr("No file format in which it can be saved supports comments. "
|
2016-01-25 10:26:57 +00:00
|
|
|
"Do you want to discard the comments and save in the format you chose?"));
|
|
|
|
save_button = NULL;
|
|
|
|
discard_button = msg_dialog.addButton(tr("Discard comments and save"), QMessageBox::DestructiveRole);
|
2012-09-26 19:52:53 +00:00
|
|
|
msg_dialog.setDefaultButton(QMessageBox::Cancel);
|
|
|
|
}
|
|
|
|
|
2016-01-25 10:26:57 +00:00
|
|
|
msg_dialog.exec();
|
|
|
|
/* According to the Qt doc:
|
|
|
|
* when using QMessageBox with custom buttons, exec() function returns an opaque value.
|
|
|
|
*
|
|
|
|
* Therefore we should use clickedButton() to determine which button was clicked. */
|
2012-09-26 19:52:53 +00:00
|
|
|
|
2016-01-25 10:26:57 +00:00
|
|
|
if (msg_dialog.clickedButton() == save_button) {
|
2012-09-26 19:52:53 +00:00
|
|
|
/* OK, the only other format we support is pcap-ng. Make that
|
|
|
|
the one and only format in the combo box, and return to
|
|
|
|
let the user continue with the dialog.
|
|
|
|
|
|
|
|
XXX - removing all the formats from the combo box will clear
|
|
|
|
the compressed checkbox; get the current value and restore
|
|
|
|
it.
|
|
|
|
|
|
|
|
XXX - we know pcap-ng can be compressed; if we ever end up
|
|
|
|
supporting saving comments in a format that *can't* be
|
|
|
|
compressed, such as NetMon format, we must check this. */
|
|
|
|
/* XXX - need a compressed checkbox here! */
|
|
|
|
return SAVE_IN_ANOTHER_FORMAT;
|
|
|
|
|
2016-01-25 10:26:57 +00:00
|
|
|
} else if (msg_dialog.clickedButton() == discard_button) {
|
2012-09-26 19:52:53 +00:00
|
|
|
/* Save without the comments and, if that succeeds, delete the
|
|
|
|
comments. */
|
|
|
|
return SAVE_WITHOUT_COMMENTS;
|
|
|
|
}
|
2016-01-25 10:26:57 +00:00
|
|
|
|
|
|
|
/* Just give up. */
|
2012-09-26 19:52:53 +00:00
|
|
|
return CANCELLED;
|
2013-04-24 11:07:25 +00:00
|
|
|
#endif // Q_OS_WIN
|
2012-09-26 21:16:59 +00:00
|
|
|
}
|
2012-09-26 19:52:53 +00:00
|
|
|
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
// You have to use open, merge, saveAs, or exportPackets. We should
|
|
|
|
// probably just make each type a subclass.
|
|
|
|
int CaptureFileDialog::exec() {
|
|
|
|
return QDialog::Rejected;
|
|
|
|
}
|
2012-09-06 22:58:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
// Windows
|
2016-02-29 02:14:01 +00:00
|
|
|
// We use native file dialogs here, rather than the Qt dialog
|
2013-04-24 11:07:25 +00:00
|
|
|
#ifdef Q_OS_WIN
|
2012-10-13 00:18:46 +00:00
|
|
|
int CaptureFileDialog::selectedFileType() {
|
|
|
|
return file_type_;
|
|
|
|
}
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
bool CaptureFileDialog::isCompressed() {
|
|
|
|
return compressed_;
|
|
|
|
}
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2014-01-18 14:20:02 +00:00
|
|
|
int CaptureFileDialog::open(QString &file_name, unsigned int &type) {
|
2012-10-13 00:18:46 +00:00
|
|
|
GString *fname = g_string_new(file_name.toUtf8().constData());
|
|
|
|
GString *dfilter = g_string_new(display_filter_.toUtf8().constData());
|
|
|
|
gboolean wof_status;
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2013-08-29 22:15:40 +00:00
|
|
|
// XXX Add a widget->HWND routine to qt_ui_utils and use it instead.
|
2014-02-26 15:27:20 +00:00
|
|
|
wof_status = win32_open_file((HWND)parentWidget()->effectiveWinId(), fname, &type, dfilter);
|
2012-10-13 00:18:46 +00:00
|
|
|
file_name = fname->str;
|
|
|
|
display_filter_ = dfilter->str;
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
g_string_free(fname, TRUE);
|
|
|
|
g_string_free(dfilter, TRUE);
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
return (int) wof_status;
|
2012-09-06 22:58:39 +00:00
|
|
|
}
|
|
|
|
|
2013-04-01 20:36:42 +00:00
|
|
|
check_savability_t CaptureFileDialog::saveAs(QString &file_name, bool must_support_all_comments) {
|
2012-10-13 00:18:46 +00:00
|
|
|
GString *fname = g_string_new(file_name.toUtf8().constData());
|
|
|
|
gboolean wsf_status;
|
2012-09-06 23:41:34 +00:00
|
|
|
|
2013-08-29 22:15:40 +00:00
|
|
|
wsf_status = win32_save_as_file((HWND)parentWidget()->effectiveWinId(), cap_file_, fname, &file_type_, &compressed_, must_support_all_comments);
|
2012-10-13 00:18:46 +00:00
|
|
|
file_name = fname->str;
|
2012-09-06 23:41:34 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
g_string_free(fname, TRUE);
|
2012-09-06 23:41:34 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
if (wsf_status) {
|
2013-08-29 22:15:40 +00:00
|
|
|
return win32_check_save_as_with_comments((HWND)parentWidget()->effectiveWinId(), cap_file_, file_type_);
|
2012-10-13 00:18:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return CANCELLED;
|
2012-09-06 23:41:34 +00:00
|
|
|
}
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
check_savability_t CaptureFileDialog::exportSelectedPackets(QString &file_name, packet_range_t *range) {
|
|
|
|
GString *fname = g_string_new(file_name.toUtf8().constData());
|
|
|
|
gboolean wespf_status;
|
|
|
|
|
2013-10-11 17:20:50 +00:00
|
|
|
wespf_status = win32_export_specified_packets_file((HWND)parentWidget()->effectiveWinId(), cap_file_, fname, &file_type_, &compressed_, range);
|
2012-10-13 00:18:46 +00:00
|
|
|
file_name = fname->str;
|
|
|
|
|
|
|
|
g_string_free(fname, TRUE);
|
|
|
|
|
|
|
|
if (wespf_status) {
|
2013-08-29 22:15:40 +00:00
|
|
|
return win32_check_save_as_with_comments((HWND)parentWidget()->effectiveWinId(), cap_file_, file_type_);
|
2012-10-13 00:18:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return CANCELLED;
|
2012-09-06 22:58:39 +00:00
|
|
|
}
|
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
int CaptureFileDialog::merge(QString &file_name) {
|
|
|
|
GString *fname = g_string_new(file_name.toUtf8().constData());
|
|
|
|
GString *dfilter = g_string_new(display_filter_.toUtf8().constData());
|
|
|
|
gboolean wmf_status;
|
|
|
|
|
2013-08-29 22:15:40 +00:00
|
|
|
wmf_status = win32_merge_file((HWND)parentWidget()->effectiveWinId(), fname, dfilter, &merge_type_);
|
2012-10-13 00:18:46 +00:00
|
|
|
file_name = fname->str;
|
|
|
|
display_filter_ = dfilter->str;
|
|
|
|
|
|
|
|
g_string_free(fname, TRUE);
|
|
|
|
g_string_free(dfilter, TRUE);
|
|
|
|
|
|
|
|
return (int) wmf_status;
|
|
|
|
}
|
|
|
|
|
|
|
|
int CaptureFileDialog::mergeType() {
|
|
|
|
return merge_type_;
|
|
|
|
}
|
|
|
|
|
2013-04-24 11:07:25 +00:00
|
|
|
#else // not Q_OS_WINDOWS
|
2016-02-29 02:14:01 +00:00
|
|
|
// Not Windows
|
|
|
|
// We use the Qt dialogs here
|
2013-11-08 01:08:42 +00:00
|
|
|
QString CaptureFileDialog::fileExtensionType(int et, bool extension_globs)
|
|
|
|
{
|
2016-09-13 19:47:22 +00:00
|
|
|
QString extension_type_name;
|
|
|
|
QStringList all_wildcards;
|
|
|
|
QStringList nogz_wildcards;
|
2013-11-08 01:08:42 +00:00
|
|
|
GSList *extensions_list;
|
|
|
|
GSList *extension;
|
|
|
|
|
2016-09-13 19:47:22 +00:00
|
|
|
extension_type_name = wtap_get_file_extension_type_name(et);
|
2013-11-08 01:08:42 +00:00
|
|
|
|
|
|
|
if (!extension_globs) {
|
2016-09-13 19:47:22 +00:00
|
|
|
return extension_type_name;
|
2013-11-08 01:08:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
extensions_list = wtap_get_file_extension_type_extensions(et);
|
|
|
|
|
|
|
|
/* Construct the list of patterns. */
|
|
|
|
for (extension = extensions_list; extension != NULL;
|
|
|
|
extension = g_slist_next(extension)) {
|
2016-09-13 19:47:22 +00:00
|
|
|
QString bare_wc = QString("*.%1").arg((char *)extension->data);
|
|
|
|
all_wildcards << bare_wc;
|
|
|
|
if (!bare_wc.endsWith(".gz")) {
|
|
|
|
nogz_wildcards << bare_wc;
|
|
|
|
}
|
2013-11-08 01:08:42 +00:00
|
|
|
}
|
|
|
|
wtap_free_extensions_list(extensions_list);
|
2016-09-13 19:47:22 +00:00
|
|
|
|
|
|
|
// We set HideNameFilterDetails so that "All Files" and "All Capture
|
|
|
|
// Files" don't show a wildcard list. We want to show the associated
|
|
|
|
// wildcards for individual file types so we add them twice.
|
|
|
|
return QString("%1 (%2) (%3)")
|
|
|
|
.arg(extension_type_name)
|
|
|
|
.arg(nogz_wildcards.join(" "))
|
|
|
|
.arg(all_wildcards.join(" "));
|
2013-11-08 01:08:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-06 22:58:39 +00:00
|
|
|
QString CaptureFileDialog::fileType(int ft, bool extension_globs)
|
2012-07-19 23:07:17 +00:00
|
|
|
{
|
|
|
|
QString filter;
|
2012-10-13 01:29:29 +00:00
|
|
|
GSList *extensions_list;
|
2012-07-19 23:07:17 +00:00
|
|
|
|
2013-11-08 09:53:01 +00:00
|
|
|
filter = wtap_file_type_subtype_string(ft);
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2012-09-26 19:52:53 +00:00
|
|
|
if (!extension_globs) {
|
2012-09-06 22:58:39 +00:00
|
|
|
return filter;
|
2012-09-26 19:52:53 +00:00
|
|
|
}
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2012-07-19 23:07:17 +00:00
|
|
|
filter += " (";
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2012-07-19 23:07:17 +00:00
|
|
|
extensions_list = wtap_get_file_extensions_list(ft, TRUE);
|
|
|
|
if (extensions_list == NULL) {
|
|
|
|
/* This file type doesn't have any particular extension
|
2016-02-29 21:29:19 +00:00
|
|
|
conventionally used for it, so we'll just use a
|
|
|
|
wildcard that matches all file names - even those
|
|
|
|
with no extension, so we don't need to worry about
|
|
|
|
compressed file extensions. */
|
|
|
|
filter += ALL_FILES_WILDCARD;
|
2012-07-19 23:07:17 +00:00
|
|
|
} else {
|
2012-10-13 01:29:29 +00:00
|
|
|
GSList *extension;
|
2012-07-19 23:07:17 +00:00
|
|
|
/* Construct the list of patterns. */
|
|
|
|
for (extension = extensions_list; extension != NULL;
|
|
|
|
extension = g_slist_next(extension)) {
|
2012-09-06 22:58:39 +00:00
|
|
|
if (!filter.endsWith('('))
|
|
|
|
filter += ' ';
|
2012-07-19 23:07:17 +00:00
|
|
|
filter += "*.";
|
|
|
|
filter += (char *)extension->data;
|
|
|
|
}
|
2013-11-08 01:08:42 +00:00
|
|
|
wtap_free_extensions_list(extensions_list);
|
2012-07-19 23:07:17 +00:00
|
|
|
}
|
|
|
|
filter += ')';
|
2012-09-06 22:58:39 +00:00
|
|
|
return filter;
|
2012-07-19 23:07:17 +00:00
|
|
|
/* XXX - does QStringList's destructor destroy the strings in the list? */
|
|
|
|
}
|
|
|
|
|
2012-09-06 22:58:39 +00:00
|
|
|
QStringList CaptureFileDialog::buildFileOpenTypeList() {
|
|
|
|
QStringList filters;
|
2013-11-08 01:08:42 +00:00
|
|
|
QString filter, sep;
|
|
|
|
GSList *extensions_list;
|
|
|
|
GSList *extension;
|
|
|
|
int et;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Microsoft's UI guidelines say, of the file filters in open and
|
|
|
|
* save dialogs:
|
|
|
|
*
|
|
|
|
* For meta-filters, remove the file extension list to eliminate
|
|
|
|
* clutter. Examples: "All files," "All pictures," "All music,"
|
|
|
|
* and "All videos."
|
|
|
|
*
|
|
|
|
* On both Windows XP and Windows 7, Wordpad doesn't do that, but
|
|
|
|
* Paint does.
|
|
|
|
*
|
|
|
|
* XXX - on Windows, does Qt do that here? For "All Capture Files",
|
|
|
|
* the filter will be a bit long, so it *really* shouldn't be shown.
|
|
|
|
* What about other platforms?
|
|
|
|
*/
|
2016-02-29 21:29:19 +00:00
|
|
|
filters << QString(tr("All Files (" ALL_FILES_WILDCARD ")"));
|
2012-07-19 23:07:17 +00:00
|
|
|
|
2013-11-08 01:08:42 +00:00
|
|
|
/*
|
2016-09-10 06:44:25 +00:00
|
|
|
* Add an "All Capture Files" entry, with all the capture file
|
|
|
|
* extensions we know about.
|
2013-11-08 01:08:42 +00:00
|
|
|
*/
|
2015-10-05 15:03:30 +00:00
|
|
|
filter = tr("All Capture Files");
|
2013-11-08 01:08:42 +00:00
|
|
|
|
|
|
|
/*
|
2016-09-10 06:44:25 +00:00
|
|
|
* Construct its list of patterns.
|
2013-11-08 01:08:42 +00:00
|
|
|
*/
|
2016-09-10 06:44:25 +00:00
|
|
|
extensions_list = wtap_get_all_capture_file_extensions_list();
|
2013-11-08 01:08:42 +00:00
|
|
|
sep = " (";
|
|
|
|
for (extension = extensions_list; extension != NULL;
|
|
|
|
extension = g_slist_next(extension)) {
|
|
|
|
filter += sep;
|
|
|
|
filter += "*.";
|
|
|
|
filter += (char *)extension->data;
|
|
|
|
sep = " ";
|
|
|
|
}
|
2016-09-11 20:19:31 +00:00
|
|
|
wtap_free_extensions_list(extensions_list);
|
2013-11-08 01:08:42 +00:00
|
|
|
filter += ")";
|
|
|
|
filters << filter;
|
2012-07-19 23:07:17 +00:00
|
|
|
|
2013-11-08 01:08:42 +00:00
|
|
|
/* Include all the file types Wireshark supports. */
|
|
|
|
for (et = 0; et < wtap_get_num_file_type_extensions(); et++) {
|
|
|
|
filters << fileExtensionType(et);
|
2012-09-06 22:58:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return filters;
|
|
|
|
}
|
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
void CaptureFileDialog::addPreview(QVBoxLayout &v_box) {
|
|
|
|
QGridLayout *preview_grid = new QGridLayout();
|
|
|
|
QLabel *lbl;
|
2012-09-06 23:41:34 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
preview_labels_.clear();
|
|
|
|
v_box.addLayout(preview_grid);
|
2012-09-26 19:52:53 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
preview_grid->setColumnStretch(0, 0);
|
|
|
|
preview_grid->setColumnStretch(1, 10);
|
2012-09-26 19:52:53 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
lbl = new QLabel(tr("Format:"));
|
|
|
|
preview_grid->addWidget(lbl, 0, 0);
|
|
|
|
preview_grid->addWidget(&preview_format_, 0, 1);
|
|
|
|
preview_labels_ << lbl << &preview_format_;
|
2012-10-08 20:01:59 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
lbl = new QLabel(tr("Size:"));
|
|
|
|
preview_grid->addWidget(lbl, 1, 0);
|
|
|
|
preview_grid->addWidget(&preview_size_, 1, 1);
|
|
|
|
preview_labels_ << lbl << &preview_size_;
|
2012-10-08 20:01:59 +00:00
|
|
|
|
2016-09-08 21:31:03 +00:00
|
|
|
lbl = new QLabel(tr("Start / elapsed:"));
|
2012-10-13 00:18:46 +00:00
|
|
|
preview_grid->addWidget(lbl, 3, 0);
|
2016-09-08 21:31:03 +00:00
|
|
|
preview_grid->addWidget(&preview_first_elapsed_, 3, 1);
|
|
|
|
preview_labels_ << lbl << &preview_first_elapsed_;
|
2012-10-08 20:01:59 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
connect(this, SIGNAL(currentChanged(const QString &)), this, SLOT(preview(const QString &)));
|
2012-09-26 19:52:53 +00:00
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
preview("");
|
2012-09-26 19:52:53 +00:00
|
|
|
}
|
|
|
|
|
2012-10-13 00:18:46 +00:00
|
|
|
void CaptureFileDialog::addMergeControls(QVBoxLayout &v_box) {
|
2012-09-10 23:03:22 +00:00
|
|
|
|
2012-10-24 15:51:50 +00:00
|
|
|
merge_prepend_.setText(tr("Prepend packets"));
|
|
|
|
merge_prepend_.setToolTip(tr("Insert packets from the selected file before the current file. Packet timestamps will be ignored."));
|
2012-10-13 00:18:46 +00:00
|
|
|
v_box.addWidget(&merge_prepend_, 0, Qt::AlignTop);
|
2012-09-10 23:03:22 +00:00
|
|
|
|
2012-10-24 15:51:50 +00:00
|
|
|
merge_chrono_.setText(tr("Merge chronologically"));
|
|
|
|
merge_chrono_.setToolTip(tr("Insert packets in chronological order."));
|
2012-10-13 00:18:46 +00:00
|
|
|
merge_chrono_.setChecked(true);
|
|
|
|
v_box.addWidget(&merge_chrono_, 0, Qt::AlignTop);
|
2012-09-10 23:03:22 +00:00
|
|
|
|
2012-10-24 15:51:50 +00:00
|
|
|
merge_append_.setText(tr("Append packets"));
|
|
|
|
merge_append_.setToolTip(tr("Insert packets from the selected file after the current file. Packet timestamps will be ignored."));
|
2012-10-13 00:18:46 +00:00
|
|
|
v_box.addWidget(&merge_append_, 0, Qt::AlignTop);
|
2012-09-10 23:03:22 +00:00
|
|
|
}
|
|
|
|
|
2012-09-06 23:41:34 +00:00
|
|
|
int CaptureFileDialog::selectedFileType() {
|
|
|
|
return type_hash_.value(selectedNameFilter(), -1);
|
|
|
|
}
|
|
|
|
|
2012-09-26 19:52:53 +00:00
|
|
|
bool CaptureFileDialog::isCompressed() {
|
|
|
|
return compress_.isChecked();
|
|
|
|
}
|
|
|
|
|
2012-09-06 23:41:34 +00:00
|
|
|
void CaptureFileDialog::addDisplayFilterEdit() {
|
2012-09-26 19:52:53 +00:00
|
|
|
QGridLayout *fd_grid = qobject_cast<QGridLayout*>(layout());
|
|
|
|
|
2015-11-16 19:00:32 +00:00
|
|
|
fd_grid->addWidget(new QLabel(tr("Read filter:")), last_row_, 0);
|
2012-09-26 19:52:53 +00:00
|
|
|
|
2015-11-16 19:00:32 +00:00
|
|
|
display_filter_edit_ = new DisplayFilterEdit(this, ReadFilterToApply);
|
2012-09-26 19:52:53 +00:00
|
|
|
display_filter_edit_->setText(display_filter_);
|
2012-10-08 20:01:59 +00:00
|
|
|
fd_grid->addWidget(display_filter_edit_, last_row_, 1);
|
|
|
|
last_row_++;
|
2012-09-06 23:41:34 +00:00
|
|
|
}
|
|
|
|
|
2014-01-18 14:20:02 +00:00
|
|
|
void CaptureFileDialog::addFormatTypeSelector(QVBoxLayout &v_box) {
|
2016-09-08 21:31:03 +00:00
|
|
|
format_type_.addItem(tr("Automatically detect file type"));
|
2014-01-18 14:20:02 +00:00
|
|
|
for (int i = 0; open_routines[i].name != NULL; i += 1) {
|
|
|
|
format_type_.addItem(open_routines[i].name);
|
|
|
|
}
|
|
|
|
|
|
|
|
v_box.addWidget(&format_type_, 0, Qt::AlignTop);
|
|
|
|
}
|
|
|
|
|
2012-10-08 20:01:59 +00:00
|
|
|
void CaptureFileDialog::addGzipControls(QVBoxLayout &v_box) {
|
2012-09-26 19:52:53 +00:00
|
|
|
compress_.setText(tr("Compress with g&zip"));
|
2012-10-08 20:01:59 +00:00
|
|
|
if (cap_file_->iscompressed && wtap_dump_can_compress(default_ft_)) {
|
2012-09-26 19:52:53 +00:00
|
|
|
compress_.setChecked(true);
|
|
|
|
} else {
|
|
|
|
compress_.setChecked(false);
|
|
|
|
}
|
2012-10-12 23:40:29 +00:00
|
|
|
v_box.addWidget(&compress_, 0, Qt::AlignTop);
|
2012-09-26 19:52:53 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2012-10-12 23:40:29 +00:00
|
|
|
void CaptureFileDialog::addRangeControls(QVBoxLayout &v_box, packet_range_t *range) {
|
2012-10-08 20:01:59 +00:00
|
|
|
packet_range_group_box_.initRange(range);
|
2012-10-12 23:40:29 +00:00
|
|
|
v_box.addWidget(&packet_range_group_box_, 0, Qt::AlignTop);
|
2012-10-08 20:01:59 +00:00
|
|
|
}
|
|
|
|
|
2012-10-15 18:32:51 +00:00
|
|
|
QDialogButtonBox *CaptureFileDialog::addHelpButton(topic_action_e help_topic)
|
|
|
|
{
|
|
|
|
// This doesn't appear to be documented anywhere but it seems pretty obvious
|
|
|
|
// and it works.
|
|
|
|
QDialogButtonBox *button_box = findChild<QDialogButtonBox *>();
|
|
|
|
|
|
|
|
help_topic_ = help_topic;
|
|
|
|
|
|
|
|
if (button_box) {
|
|
|
|
button_box->addButton(QDialogButtonBox::Help);
|
|
|
|
connect(button_box, SIGNAL(helpRequested()), this, SLOT(on_buttonBox_helpRequested()));
|
|
|
|
}
|
|
|
|
return button_box;
|
|
|
|
}
|
|
|
|
|
2014-01-18 14:20:02 +00:00
|
|
|
int CaptureFileDialog::open(QString &file_name, unsigned int &type) {
|
2014-12-29 23:15:59 +00:00
|
|
|
setWindowTitle(wsApp->windowTitleString(tr("Open Capture File")));
|
2012-09-06 23:41:34 +00:00
|
|
|
setNameFilters(buildFileOpenTypeList());
|
|
|
|
setFileMode(QFileDialog::ExistingFile);
|
|
|
|
|
2014-01-18 14:20:02 +00:00
|
|
|
addFormatTypeSelector(left_v_box_);
|
2012-09-26 19:52:53 +00:00
|
|
|
addDisplayFilterEdit();
|
2012-09-06 23:41:34 +00:00
|
|
|
addPreview(right_v_box_);
|
2012-10-15 18:32:51 +00:00
|
|
|
addHelpButton(HELP_OPEN_DIALOG);
|
2012-09-06 23:41:34 +00:00
|
|
|
|
|
|
|
// Grow the dialog to account for the extra widgets.
|
|
|
|
resize(width(), height() + left_v_box_.minimumSize().height() + display_filter_edit_->minimumSize().height());
|
|
|
|
|
2012-09-26 19:52:53 +00:00
|
|
|
display_filter_.clear();
|
|
|
|
|
2012-09-06 23:41:34 +00:00
|
|
|
if (!file_name.isEmpty()) {
|
|
|
|
selectFile(file_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (QFileDialog::exec() && selectedFiles().length() > 0) {
|
2012-09-26 19:52:53 +00:00
|
|
|
file_name = selectedFiles()[0];
|
2014-01-18 14:20:02 +00:00
|
|
|
type = format_type_.currentIndex();
|
2012-09-06 23:41:34 +00:00
|
|
|
display_filter_.append(display_filter_edit_->text());
|
|
|
|
|
|
|
|
return QDialog::Accepted;
|
|
|
|
} else {
|
|
|
|
return QDialog::Rejected;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-01 20:36:42 +00:00
|
|
|
check_savability_t CaptureFileDialog::saveAs(QString &file_name, bool must_support_all_comments) {
|
2014-12-29 23:15:59 +00:00
|
|
|
setWindowTitle(wsApp->windowTitleString(tr("Save Capture File As")));
|
2012-09-26 19:52:53 +00:00
|
|
|
// XXX There doesn't appear to be a way to use setNameFilters without restricting
|
|
|
|
// what the user can select. We might want to use our own combobox instead and
|
|
|
|
// let the user select anything.
|
2013-04-01 20:36:42 +00:00
|
|
|
setNameFilters(buildFileSaveAsTypeList(must_support_all_comments));
|
2012-09-26 19:52:53 +00:00
|
|
|
setAcceptMode(QFileDialog::AcceptSave);
|
2012-10-24 15:51:50 +00:00
|
|
|
setLabelText(FileType, tr("Save as:"));
|
2012-09-26 19:52:53 +00:00
|
|
|
|
2012-10-08 20:01:59 +00:00
|
|
|
addGzipControls(left_v_box_);
|
2012-10-15 18:32:51 +00:00
|
|
|
addHelpButton(HELP_SAVE_DIALOG);
|
2012-09-26 19:52:53 +00:00
|
|
|
|
|
|
|
// Grow the dialog to account for the extra widgets.
|
|
|
|
resize(width(), height() + left_v_box_.minimumSize().height());
|
|
|
|
|
|
|
|
if (!file_name.isEmpty()) {
|
|
|
|
selectFile(file_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (QFileDialog::exec() && selectedFiles().length() > 0) {
|
|
|
|
file_name = selectedFiles()[0];
|
2012-10-08 20:01:59 +00:00
|
|
|
return checkSaveAsWithComments(this, cap_file_, selectedFileType());
|
|
|
|
}
|
|
|
|
return CANCELLED;
|
|
|
|
}
|
|
|
|
|
|
|
|
check_savability_t CaptureFileDialog::exportSelectedPackets(QString &file_name, packet_range_t *range) {
|
2012-10-15 18:32:51 +00:00
|
|
|
QDialogButtonBox *button_box;
|
2012-10-08 20:01:59 +00:00
|
|
|
|
2014-12-29 23:15:59 +00:00
|
|
|
setWindowTitle(wsApp->windowTitleString(tr("Export Specified Packets")));
|
2012-10-08 20:01:59 +00:00
|
|
|
// XXX See comment in ::saveAs regarding setNameFilters
|
|
|
|
setNameFilters(buildFileSaveAsTypeList(false));
|
|
|
|
setAcceptMode(QFileDialog::AcceptSave);
|
2012-10-11 21:45:05 +00:00
|
|
|
setLabelText(FileType, tr("Export as:"));
|
2012-10-08 20:01:59 +00:00
|
|
|
|
2012-10-12 23:40:29 +00:00
|
|
|
addRangeControls(left_v_box_, range);
|
|
|
|
addGzipControls(right_v_box_);
|
2012-10-15 18:32:51 +00:00
|
|
|
button_box = addHelpButton(HELP_EXPORT_FILE_DIALOG);
|
2012-10-08 20:01:59 +00:00
|
|
|
|
|
|
|
if (button_box) {
|
|
|
|
save_bt_ = button_box->button(QDialogButtonBox::Save);
|
2012-10-12 23:40:29 +00:00
|
|
|
if (save_bt_) {
|
|
|
|
connect(&packet_range_group_box_, SIGNAL(validityChanged(bool)),
|
|
|
|
save_bt_, SLOT(setEnabled(bool)));
|
|
|
|
}
|
2012-10-08 20:01:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Grow the dialog to account for the extra widgets.
|
2012-10-12 23:40:29 +00:00
|
|
|
resize(width(), height() + (packet_range_group_box_.height() * 2 / 3));
|
2012-10-08 20:01:59 +00:00
|
|
|
|
|
|
|
if (!file_name.isEmpty()) {
|
|
|
|
selectFile(file_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (QFileDialog::exec() && selectedFiles().length() > 0) {
|
|
|
|
file_name = selectedFiles()[0];
|
|
|
|
return checkSaveAsWithComments(this, cap_file_, selectedFileType());
|
2012-09-26 19:52:53 +00:00
|
|
|
}
|
|
|
|
return CANCELLED;
|
|
|
|
}
|
|
|
|
|
2012-09-10 23:03:22 +00:00
|
|
|
int CaptureFileDialog::merge(QString &file_name) {
|
2014-12-29 23:15:59 +00:00
|
|
|
setWindowTitle(wsApp->windowTitleString(tr("Merge Capture File")));
|
2012-09-10 23:03:22 +00:00
|
|
|
setNameFilters(buildFileOpenTypeList());
|
|
|
|
setFileMode(QFileDialog::ExistingFile);
|
|
|
|
|
2012-09-26 19:52:53 +00:00
|
|
|
addDisplayFilterEdit();
|
2012-09-10 23:03:22 +00:00
|
|
|
addMergeControls(left_v_box_);
|
|
|
|
addPreview(right_v_box_);
|
2012-10-15 18:32:51 +00:00
|
|
|
addHelpButton(HELP_MERGE_DIALOG);
|
2012-09-10 23:03:22 +00:00
|
|
|
|
2012-09-26 19:52:53 +00:00
|
|
|
file_name.clear();
|
|
|
|
display_filter_.clear();
|
|
|
|
|
2012-09-10 23:03:22 +00:00
|
|
|
// Grow the dialog to account for the extra widgets.
|
|
|
|
resize(width(), height() + right_v_box_.minimumSize().height() + display_filter_edit_->minimumSize().height());
|
|
|
|
|
|
|
|
if (QFileDialog::exec() && selectedFiles().length() > 0) {
|
|
|
|
file_name.append(selectedFiles()[0]);
|
|
|
|
display_filter_.append(display_filter_edit_->text());
|
|
|
|
|
|
|
|
return QDialog::Accepted;
|
|
|
|
} else {
|
|
|
|
return QDialog::Rejected;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-01 20:36:42 +00:00
|
|
|
QStringList CaptureFileDialog::buildFileSaveAsTypeList(bool must_support_all_comments) {
|
2012-09-06 22:58:39 +00:00
|
|
|
QStringList filters;
|
2013-04-01 20:36:42 +00:00
|
|
|
guint32 required_comment_types;
|
2013-11-08 09:53:01 +00:00
|
|
|
GArray *savable_file_types_subtypes;
|
2012-09-06 22:58:39 +00:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
type_hash_.clear();
|
2013-04-01 20:36:42 +00:00
|
|
|
|
|
|
|
/* What types of comments do we have to support? */
|
|
|
|
if (must_support_all_comments)
|
|
|
|
required_comment_types = cf_comment_types(cap_file_); /* all the ones the file has */
|
|
|
|
else
|
|
|
|
required_comment_types = 0; /* none of them */
|
|
|
|
|
|
|
|
/* What types of file can we save this file as? */
|
2013-11-08 09:53:01 +00:00
|
|
|
savable_file_types_subtypes = wtap_get_savable_file_types_subtypes(cap_file_->cd_t,
|
|
|
|
cap_file_->linktypes,
|
|
|
|
required_comment_types);
|
2012-09-06 22:58:39 +00:00
|
|
|
|
2013-11-08 09:53:01 +00:00
|
|
|
if (savable_file_types_subtypes != NULL) {
|
2012-09-06 22:58:39 +00:00
|
|
|
QString file_type;
|
2016-09-18 19:33:44 +00:00
|
|
|
QString hash_file_type;
|
2012-10-13 01:29:29 +00:00
|
|
|
int ft;
|
2012-09-06 22:58:39 +00:00
|
|
|
/* OK, we have at least one file type we can save this file as.
|
|
|
|
(If we didn't, we shouldn't have gotten here in the first
|
|
|
|
place.) Add them all to the combo box. */
|
2013-11-08 09:53:01 +00:00
|
|
|
for (i = 0; i < savable_file_types_subtypes->len; i++) {
|
|
|
|
ft = g_array_index(savable_file_types_subtypes, int, i);
|
2012-09-26 19:52:53 +00:00
|
|
|
if (default_ft_ < 1)
|
|
|
|
default_ft_ = ft; /* first file type is the default */
|
|
|
|
file_type = fileType(ft);
|
2016-09-18 19:33:44 +00:00
|
|
|
hash_file_type = fileType(ft, false);
|
2012-09-06 22:58:39 +00:00
|
|
|
filters << file_type;
|
2016-09-18 19:33:44 +00:00
|
|
|
type_hash_[hash_file_type] = ft;
|
2012-09-06 22:58:39 +00:00
|
|
|
}
|
2013-11-08 09:53:01 +00:00
|
|
|
g_array_free(savable_file_types_subtypes, TRUE);
|
2012-07-19 23:07:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return filters;
|
|
|
|
}
|
2012-07-27 21:43:02 +00:00
|
|
|
|
2012-09-07 00:29:32 +00:00
|
|
|
int CaptureFileDialog::mergeType() {
|
|
|
|
if (merge_prepend_.isChecked())
|
|
|
|
return -1;
|
|
|
|
else if (merge_append_.isChecked())
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2012-10-08 20:01:59 +00:00
|
|
|
|
2012-10-09 15:34:40 +00:00
|
|
|
// Slots
|
|
|
|
|
2012-10-08 20:01:59 +00:00
|
|
|
|
2012-09-07 00:29:32 +00:00
|
|
|
|
2012-07-27 21:43:02 +00:00
|
|
|
/* do a preview run on the currently selected capture file */
|
|
|
|
void CaptureFileDialog::preview(const QString & path)
|
|
|
|
{
|
|
|
|
wtap *wth;
|
|
|
|
int err = 0;
|
|
|
|
gchar *err_info;
|
|
|
|
gint64 data_offset;
|
|
|
|
const struct wtap_pkthdr *phdr;
|
|
|
|
double start_time = 0; /* seconds, with nsec resolution */
|
|
|
|
double stop_time = 0; /* seconds, with nsec resolution */
|
|
|
|
double cur_time;
|
|
|
|
unsigned int packets = 0;
|
|
|
|
bool timed_out = FALSE;
|
|
|
|
time_t time_preview;
|
|
|
|
time_t time_current;
|
|
|
|
time_t ti_time;
|
|
|
|
struct tm *ti_tm;
|
|
|
|
unsigned int elapsed_time;
|
|
|
|
|
|
|
|
// Follow the same steps as ui/win32/file_dlg_win32.c
|
|
|
|
|
2012-09-06 22:58:39 +00:00
|
|
|
foreach (QLabel *lbl, preview_labels_) {
|
2012-07-27 21:43:02 +00:00
|
|
|
lbl->setEnabled(false);
|
|
|
|
}
|
|
|
|
|
2016-09-08 21:31:03 +00:00
|
|
|
preview_format_.setText(tr(UTF8_EM_DASH));
|
|
|
|
preview_size_.setText(tr(UTF8_EM_DASH));
|
|
|
|
preview_first_elapsed_.setText(tr(UTF8_EM_DASH));
|
2012-07-27 21:43:02 +00:00
|
|
|
|
|
|
|
if (path.length() < 1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (test_for_directory(path.toUtf8().data()) == EISDIR) {
|
2012-09-06 22:58:39 +00:00
|
|
|
preview_format_.setText(tr("directory"));
|
2012-07-27 21:43:02 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-01-18 14:20:02 +00:00
|
|
|
wth = wtap_open_offline(path.toUtf8().data(), WTAP_TYPE_AUTO, &err, &err_info, TRUE);
|
2012-07-27 21:43:02 +00:00
|
|
|
if (wth == NULL) {
|
|
|
|
if(err == WTAP_ERR_FILE_UNKNOWN_FORMAT) {
|
2012-09-06 22:58:39 +00:00
|
|
|
preview_format_.setText(tr("unknown file format"));
|
2012-07-27 21:43:02 +00:00
|
|
|
} else {
|
2012-09-06 22:58:39 +00:00
|
|
|
preview_format_.setText(tr("error opening file"));
|
2012-07-27 21:43:02 +00:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Success!
|
2012-09-06 22:58:39 +00:00
|
|
|
foreach (QLabel *lbl, preview_labels_) {
|
2012-07-27 21:43:02 +00:00
|
|
|
lbl->setEnabled(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Format
|
2014-05-09 05:18:49 +00:00
|
|
|
preview_format_.setText(QString::fromUtf8(wtap_file_type_subtype_string(wtap_file_type_subtype(wth))));
|
2012-07-27 21:43:02 +00:00
|
|
|
|
|
|
|
// Size
|
2016-09-08 21:31:03 +00:00
|
|
|
gint64 filesize = wtap_file_size(wth, &err);
|
|
|
|
// Finder and Windows Explorer use IEC. What do the various Linux file managers use?
|
2016-09-11 20:19:31 +00:00
|
|
|
QString size_str(gchar_free_to_qstring(format_size(filesize, format_size_unit_bytes|format_size_prefix_iec)));
|
2012-07-27 21:43:02 +00:00
|
|
|
|
|
|
|
time(&time_preview);
|
2016-01-23 12:18:30 +00:00
|
|
|
while ((wtap_read(wth, &err, &err_info, &data_offset))) {
|
2014-05-23 10:50:02 +00:00
|
|
|
phdr = wtap_phdr(wth);
|
|
|
|
cur_time = nstime_to_sec(&phdr->ts);
|
|
|
|
if(packets == 0) {
|
|
|
|
start_time = cur_time;
|
|
|
|
stop_time = cur_time;
|
2014-05-23 03:01:31 +00:00
|
|
|
}
|
2014-05-23 10:50:02 +00:00
|
|
|
if (cur_time < start_time) {
|
|
|
|
start_time = cur_time;
|
|
|
|
}
|
|
|
|
if (cur_time > stop_time){
|
|
|
|
stop_time = cur_time;
|
|
|
|
}
|
|
|
|
|
|
|
|
packets++;
|
|
|
|
if(packets%1000 == 0) {
|
2012-07-27 21:43:02 +00:00
|
|
|
/* do we have a timeout? */
|
|
|
|
time(&time_current);
|
|
|
|
if(time_current-time_preview >= (time_t) prefs.gui_fileopen_preview) {
|
|
|
|
timed_out = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(err != 0) {
|
2016-09-08 21:31:03 +00:00
|
|
|
preview_size_.setText(QString(tr("%1, error after %2 packets"))
|
|
|
|
.arg(size_str).arg(packets));
|
2012-07-27 21:43:02 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Packet count
|
|
|
|
if(timed_out) {
|
2016-09-08 21:31:03 +00:00
|
|
|
preview_size_.setText(QString(tr("%1, timed out at %2 packets"))
|
|
|
|
.arg(size_str).arg(packets));
|
2012-07-27 21:43:02 +00:00
|
|
|
} else {
|
2016-09-08 21:31:03 +00:00
|
|
|
preview_size_.setText(QString("%1, %2 packets")
|
|
|
|
.arg(size_str).arg(packets));
|
2012-07-27 21:43:02 +00:00
|
|
|
}
|
|
|
|
|
2016-09-08 21:31:03 +00:00
|
|
|
// First packet + elapsed time
|
2012-07-27 21:43:02 +00:00
|
|
|
ti_time = (long)start_time;
|
2016-01-23 12:18:30 +00:00
|
|
|
ti_tm = localtime(&ti_time);
|
2016-09-08 21:31:03 +00:00
|
|
|
QString first_elapsed = "?";
|
2012-07-27 21:43:02 +00:00
|
|
|
if(ti_tm) {
|
2016-09-08 21:31:03 +00:00
|
|
|
first_elapsed = QString().sprintf(
|
2012-07-27 21:43:02 +00:00
|
|
|
"%04d-%02d-%02d %02d:%02d:%02d",
|
|
|
|
ti_tm->tm_year + 1900,
|
|
|
|
ti_tm->tm_mon + 1,
|
|
|
|
ti_tm->tm_mday,
|
|
|
|
ti_tm->tm_hour,
|
|
|
|
ti_tm->tm_min,
|
|
|
|
ti_tm->tm_sec
|
2016-09-08 21:31:03 +00:00
|
|
|
);
|
2012-07-27 21:43:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Elapsed time
|
2016-09-08 21:31:03 +00:00
|
|
|
first_elapsed += " / ";
|
2012-07-27 21:43:02 +00:00
|
|
|
elapsed_time = (unsigned int)(stop_time-start_time);
|
|
|
|
if(timed_out) {
|
2016-09-08 21:31:03 +00:00
|
|
|
first_elapsed += tr("unknown");
|
2012-07-27 21:43:02 +00:00
|
|
|
} else if(elapsed_time/86400) {
|
2016-09-08 21:31:03 +00:00
|
|
|
first_elapsed += QString().sprintf("%02u days %02u:%02u:%02u",
|
|
|
|
elapsed_time/86400, elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60);
|
2012-07-27 21:43:02 +00:00
|
|
|
} else {
|
2016-09-08 21:31:03 +00:00
|
|
|
first_elapsed += QString().sprintf("%02u:%02u:%02u",
|
|
|
|
elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60);
|
2012-07-27 21:43:02 +00:00
|
|
|
}
|
2016-09-08 21:31:03 +00:00
|
|
|
preview_first_elapsed_.setText(first_elapsed);
|
2012-07-27 21:43:02 +00:00
|
|
|
|
|
|
|
wtap_close(wth);
|
|
|
|
}
|
|
|
|
|
2012-10-15 18:32:51 +00:00
|
|
|
void CaptureFileDialog::on_buttonBox_helpRequested()
|
|
|
|
{
|
2012-10-16 19:47:43 +00:00
|
|
|
if (help_topic_ != TOPIC_ACTION_NONE) wsApp->helpTopicAction(help_topic_);
|
2012-10-15 18:32:51 +00:00
|
|
|
}
|
|
|
|
|
2013-04-24 11:07:25 +00:00
|
|
|
#endif // Q_OS_WINDOWS
|
2012-10-12 23:40:29 +00:00
|
|
|
|
2012-09-04 08:18:31 +00:00
|
|
|
/*
|
|
|
|
* Editor modelines
|
|
|
|
*
|
|
|
|
* Local Variables:
|
|
|
|
* c-basic-offset: 4
|
|
|
|
* tab-width: 8
|
|
|
|
* indent-tabs-mode: nil
|
|
|
|
* End:
|
|
|
|
*
|
|
|
|
* ex: set shiftwidth=4 tabstop=8 expandtab:
|
|
|
|
* :indentSize=4:tabSize=8:noTabs=true:
|
|
|
|
*/
|