diff options
-rw-r--r-- | ui/gtk/range_utils.c | 14 | ||||
-rw-r--r-- | ui/qt/CMakeLists.txt | 4 | ||||
-rw-r--r-- | ui/qt/Makefile.common | 8 | ||||
-rw-r--r-- | ui/qt/QtShark.pro | 135 | ||||
-rw-r--r-- | ui/qt/capture_file_dialog.cpp | 119 | ||||
-rw-r--r-- | ui/qt/capture_file_dialog.h | 23 | ||||
-rw-r--r-- | ui/qt/display_filter_edit.cpp | 55 | ||||
-rw-r--r-- | ui/qt/display_filter_edit.h | 11 | ||||
-rw-r--r-- | ui/qt/import_text_dialog.cpp | 208 | ||||
-rw-r--r-- | ui/qt/import_text_dialog.h | 5 | ||||
-rw-r--r-- | ui/qt/import_text_dialog.ui | 24 | ||||
-rw-r--r-- | ui/qt/main_welcome.cpp | 2 | ||||
-rw-r--r-- | ui/qt/main_window.cpp | 250 | ||||
-rw-r--r-- | ui/qt/main_window.h | 4 | ||||
-rw-r--r-- | ui/qt/main_window_slots.cpp | 7 | ||||
-rw-r--r-- | ui/qt/packet_range_group_box.cpp | 331 | ||||
-rw-r--r-- | ui/qt/packet_range_group_box.h | 78 | ||||
-rw-r--r-- | ui/qt/packet_range_group_box.ui | 261 | ||||
-rw-r--r-- | ui/qt/syntax_line_edit.cpp | 49 | ||||
-rw-r--r-- | ui/qt/syntax_line_edit.h | 30 | ||||
-rw-r--r-- | ui/qt/tango_colors.h | 72 | ||||
-rw-r--r-- | ui/win32/file_dlg_win32.c | 2 |
22 files changed, 1333 insertions, 359 deletions
diff --git a/ui/gtk/range_utils.c b/ui/gtk/range_utils.c index 2ee1ccdab0..47e993fc3d 100644 --- a/ui/gtk/range_utils.c +++ b/ui/gtk/range_utils.c @@ -86,6 +86,7 @@ range_check_validity(packet_range_t *range) } } +#include <stdio.h> gboolean range_check_validity_modal(GtkWidget *parent, packet_range_t *range) { @@ -153,6 +154,7 @@ range_update_dynamics(gpointer data) gtk_widget_set_sensitive(range_displayed_bt, FALSE); } + /* All / Captured */ gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_C_KEY), !filtered_active); if (range->remove_ignored) { g_snprintf(label_text, sizeof(label_text), "%u", cfile.count - range->ignored_cnt); @@ -160,6 +162,8 @@ range_update_dynamics(gpointer data) g_snprintf(label_text, sizeof(label_text), "%u", cfile.count); } gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_C_KEY)), label_text); + + /* All / Displayed */ gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_D_KEY), filtered_active); if (range->include_dependents) displayed_cnt = range->displayed_plus_dependents_cnt; @@ -172,6 +176,7 @@ range_update_dynamics(gpointer data) } gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_ALL_D_KEY)), label_text); + /* Selected / Captured + Displayed */ /* Enable saving the currently-selected packet only if there *is* a currently-selected packet. */ selected_num = (cfile.current_frame) ? cfile.current_frame->num : 0; @@ -206,6 +211,7 @@ range_update_dynamics(gpointer data) } gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_CURR_D_KEY)), label_text); + /* Marked / Captured + Displayed */ /* Enable the buttons for saving marked packets only if there *are* marked packets. */ if (filtered_active) @@ -240,6 +246,8 @@ range_update_dynamics(gpointer data) } gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_D_KEY)), label_text); + /* First to last marked / Captured + Displayed */ + /* Enable the buttons for saving the range of marked packets only if there *is* a range of marked packets. */ if (filtered_active) @@ -275,6 +283,8 @@ range_update_dynamics(gpointer data) } gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_MARKED_RANGE_D_KEY)), label_text); + /* User specified / Captured + Displayed */ + gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_KEY), TRUE); gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_C_KEY), !filtered_active); gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_D_KEY), filtered_active); @@ -291,6 +301,7 @@ range_update_dynamics(gpointer data) } gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_SELECT_USER_D_KEY)), label_text); + /* Ignored */ switch(range->process) { case(range_process_all): ignored_cnt = range->ignored_cnt; @@ -332,7 +343,8 @@ range_update_dynamics(gpointer data) } g_snprintf(label_text, sizeof(label_text), "%u", ignored_cnt); - gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_IGNORED_C_KEY)), label_text); g_snprintf(label_text, sizeof(label_text), "%u", displayed_ignored_cnt); + gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_IGNORED_C_KEY)), label_text); + g_snprintf(label_text, sizeof(label_text), "%u", displayed_ignored_cnt); gtk_label_set_text(GTK_LABEL(g_object_get_data(G_OBJECT(data), RANGE_IGNORED_D_KEY)), label_text); } diff --git a/ui/qt/CMakeLists.txt b/ui/qt/CMakeLists.txt index a943a8bf65..9594538611 100644 --- a/ui/qt/CMakeLists.txt +++ b/ui/qt/CMakeLists.txt @@ -43,6 +43,7 @@ set(QTSHARK_H_SRC monospace_font.h packet_list.h packet_list_model.h + packet_range_group_box.h progress_bar.h proto_tree.h recent_file_status.h @@ -77,12 +78,14 @@ set(QTSHARK_CPP_SRC packet_list.cpp packet_list_model.cpp packet_list_record.cpp + packet_range_group_box.cpp progress_bar.cpp proto_tree.cpp qt_ui_utils.cpp recent_file_status.cpp simple_dialog_qt.cpp sparkline_delegate.cpp + syntax_line_edit.cpp wireshark_application.cpp ) @@ -95,6 +98,7 @@ set(QTSHARK_UI import_text_dialog.ui main_welcome.ui main_window.ui + packet_range_group_box.ui ) set(QTSHARK_QRC diff --git a/ui/qt/Makefile.common b/ui/qt/Makefile.common index 77d0d61ff7..428871a9b5 100644 --- a/ui/qt/Makefile.common +++ b/ui/qt/Makefile.common @@ -31,8 +31,10 @@ GENERATED_HEADER_FILES = # Generated header files that we don't want in the distribution. GENERATED_NODIST_HEADER_FILES = \ + ui_file_set_dialog.h \ ui_main_welcome.h \ - ui_main_window.h + ui_main_window.h \ + ui_packet_range_group_box.h # Generated C source files that we want in the distribution. GENERATED_C_FILES = @@ -85,11 +87,13 @@ MOC_HDRS = \ monospace_font.h \ packet_list.h \ packet_list_model.h \ + packet_range_group_box.h \ progress_bar.h \ proto_tree.h \ recent_file_status.h \ simple_dialog_qt.h \ sparkline_delegate.h \ + syntax_line_edit.h \ wireshark_application.h # @@ -140,12 +144,14 @@ WIRESHARK_QT_SRC = \ packet_list.cpp \ packet_list_model.cpp \ packet_list_record.cpp \ + packet_range_group_box.cpp \ progress_bar.cpp \ proto_tree.cpp \ qt_ui_utils.cpp \ recent_file_status.cpp \ simple_dialog_qt.cpp \ sparkline_delegate.cpp \ + syntax_line_edit.cpp \ wireshark_application.cpp noinst_HEADERS = \ diff --git a/ui/qt/QtShark.pro b/ui/qt/QtShark.pro index 38a23c0c70..42301d4f97 100644 --- a/ui/qt/QtShark.pro +++ b/ui/qt/QtShark.pro @@ -172,74 +172,14 @@ win32:SOURCES_WS_C += \ ../../capture_wpcap_packet.c \ ../../ui/win32/file_dlg_win32.c - -SOURCES_QT_CPP = \ - byte_view_tab.cpp \ - byte_view_text.cpp \ - capture_file_dialog.cpp \ - capture_info_dialog.cpp \ - capture_interface_dialog.cpp \ - color_dialog.cpp \ - color_utils.cpp \ - display_filter_combo.cpp \ - display_filter_edit.cpp \ - file_set_dialog.cpp \ - interface_tree.cpp \ - label_stack.cpp \ - main.cpp \ - main_status_bar.cpp \ - main_welcome.cpp \ - main_window.cpp \ - main_window_slots.cpp \ - monospace_font.cpp \ - packet_list.cpp \ - packet_list_model.cpp \ - packet_list_record.cpp \ - progress_bar.cpp \ - proto_tree.cpp \ - qt_ui_utils.cpp \ - recent_file_status.cpp \ - simple_dialog_qt.cpp \ - sparkline_delegate.cpp \ - wireshark_application.cpp - - HEADERS_WS_C = \ ../../wsutil/privileges.h -HEADERS_QT_CPP = \ - byte_view_tab.h \ - byte_view_text.h \ - capture_file_dialog.h \ - capture_info_dialog.h \ - capture_interface_dialog.h \ - color_dialog.h \ - color_utils.h \ - display_filter_combo.h \ - display_filter_edit.h \ - file_set_dialog.h \ - interface_tree.h \ - label_stack.h \ - main_status_bar.h \ - main_welcome.h \ - main_window.h \ - monospace_font.h \ - packet_list.h \ - packet_list_model.h \ - packet_list_record.h \ - progress_bar.h \ - proto_tree.h \ - qt_ui_utils.h \ - qt_ui_utils.h \ - recent_file_status.h \ - simple_dialog_qt.h \ - sparkline_delegate.h \ - wireshark_application.h - FORMS += main_window.ui \ main_welcome.ui \ import_text_dialog.ui \ - file_set_dialog.ui + file_set_dialog.ui \ + packet_range_group_box.ui win32 { ## These should be in config.pri ?? !isEmpty(PORTAUDIO_DIR) { @@ -262,10 +202,9 @@ win32 { ## These should be in config.pri ?? } } +HEADERS += $$HEADERS_WS_C + win32 { - SOURCES += $$SOURCES_QT_CPP - HEADERS += $$HEADERS_WS_C - HEADERS += $$HEADERS_QT_CPP OBJECTS_WS_C = $$SOURCES_WS_C OBJECTS_WS_C ~= s/[.]c/.obj/g OBJECTS_WS_C ~= s,/,\\,g @@ -273,9 +212,6 @@ win32 { } else { ## XXX: Shouldn't need to (re)compile WS_C sources ?? SOURCES += $$SOURCES_WS_C - SOURCES += $$SOURCES_QT_CPP - HEADERS += $$HEADERS_WS_C - HEADERS += $$HEADERS_QT_CPP } DEFINES += INET6 REENTRANT @@ -409,7 +345,66 @@ RC_FILE = qtshark.rc win32: QMAKE_CLEAN += *.pdb HEADERS += \ - import_text_dialog.h + byte_view_tab.h \ + byte_view_text.h \ + capture_file_dialog.h \ + capture_info_dialog.h \ + capture_interface_dialog.h \ + color_dialog.h \ + color_utils.h \ + display_filter_combo.h \ + display_filter_edit.h \ + file_set_dialog.h \ + import_text_dialog.h \ + interface_tree.h \ + label_stack.h \ + main_status_bar.h \ + main_welcome.h \ + main_window.h \ + monospace_font.h \ + packet_list.h \ + packet_list_model.h \ + packet_list_record.h \ + packet_range_group_box.h \ + progress_bar.h \ + proto_tree.h \ + qt_ui_utils.h \ + qt_ui_utils.h \ + recent_file_status.h \ + simple_dialog_qt.h \ + sparkline_delegate.h \ + syntax_line_edit.h \ + wireshark_application.h SOURCES += \ - import_text_dialog.cpp + byte_view_tab.cpp \ + byte_view_text.cpp \ + capture_file_dialog.cpp \ + capture_info_dialog.cpp \ + capture_interface_dialog.cpp \ + color_dialog.cpp \ + color_utils.cpp \ + display_filter_combo.cpp \ + display_filter_edit.cpp \ + file_set_dialog.cpp \ + import_text_dialog.cpp \ + interface_tree.cpp \ + label_stack.cpp \ + main.cpp \ + main_status_bar.cpp \ + main_welcome.cpp \ + main_window.cpp \ + main_window_slots.cpp \ + monospace_font.cpp \ + packet_list.cpp \ + packet_list_model.cpp \ + packet_list_record.cpp \ + packet_range_group_box.cpp \ + progress_bar.cpp \ + proto_tree.cpp \ + qt_ui_utils.cpp \ + recent_file_status.cpp \ + simple_dialog_qt.cpp \ + sparkline_delegate.cpp \ + syntax_line_edit.cpp \ + wireshark_application.cpp diff --git a/ui/qt/capture_file_dialog.cpp b/ui/qt/capture_file_dialog.cpp index 1bd67cc298..5378830128 100644 --- a/ui/qt/capture_file_dialog.cpp +++ b/ui/qt/capture_file_dialog.cpp @@ -21,12 +21,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "config.h" - -#include <glib.h> - #include <wiretap/wtap.h> +#include "packet_range_group_box.h" #include "capture_file_dialog.h" #ifdef Q_WS_WIN @@ -49,6 +46,7 @@ #include <QCheckBox> #include <QFileInfo> #include <QMessageBox> +#include <QSpacerItem> #include <QDebug> @@ -120,12 +118,15 @@ extern void topic_cb(gpointer *widget, int topic) { // End stub routines #endif // Q_WS_WIN -CaptureFileDialog::CaptureFileDialog(QWidget *parent, QString &display_filter) : - QFileDialog(parent), display_filter_(display_filter) +CaptureFileDialog::CaptureFileDialog(QWidget *parent, capture_file *cf, QString &display_filter) : + QFileDialog(parent), + display_filter_(display_filter), + cap_file_(cf), #if !defined(Q_WS_WIN) - , default_ft_(-1) + default_ft_(-1), + save_bt_(NULL) #else - , file_type_(-1) + file_type_(-1) #endif { #if !defined(Q_WS_WIN) @@ -135,15 +136,15 @@ CaptureFileDialog::CaptureFileDialog(QWidget *parent, QString &display_filter) : QGridLayout *fd_grid = qobject_cast<QGridLayout*>(layout()); QHBoxLayout *h_box = new QHBoxLayout(); - df_row_ = fd_grid->rowCount(); + last_row_ = fd_grid->rowCount(); - fd_grid->addLayout(h_box, fd_grid->rowCount(), 1, 1, -1); + fd_grid->addItem(new QSpacerItem(1, 1), last_row_, 0); + fd_grid->addLayout(h_box, last_row_, 1); + last_row_++; // Left and right boxes for controls and preview h_box->addLayout(&left_v_box_); h_box->addLayout(&right_v_box_); - - #else // Q_WS_WIN merge_type_ = 0; #endif // Q_WS_WIN @@ -157,7 +158,7 @@ check_savability_t CaptureFileDialog::checkSaveAsWithComments(QWidget * #if defined(Q_WS_WIN) if (!parent || !cf) return CANCELLED; - return win32_check_save_as_with_comments(parent->effectiveWinId(), cf, file_type); + return win32_check_save_as_with_comments(parent->effectiveWinId(), cap_file_, file_type); #else // Q_WS_WIN QMessageBox msg_dialog; int response; @@ -385,17 +386,33 @@ int CaptureFileDialog::open(QString &file_name) { return (int) wof_status; } -check_savability_t CaptureFileDialog::saveAs(capture_file *cf, QString &file_name, bool must_support_comments) { +check_savability_t CaptureFileDialog::saveAs(QString &file_name, bool must_support_comments) { GString *fname = g_string_new(file_name.toUtf8().constData()); gboolean wsf_status; - wsf_status = win32_save_as_file(parentWidget()->effectiveWinId(), cf, fname, &file_type_, &compressed_, must_support_comments); + wsf_status = win32_save_as_file(parentWidget()->effectiveWinId(), cap_file_, fname, &file_type_, &compressed_, must_support_comments); file_name = fname->str; g_string_free(fname, TRUE); if (wsf_status) { - return win32_check_save_as_with_comments(parentWidget()->effectiveWinId(), cf, file_type_); + return win32_check_save_as_with_comments(parentWidget()->effectiveWinId(), cap_file_, file_type_); + } + + return CANCELLED; +} + +check_savability_t CaptureFileDialog::exportSelectedPackets(QString &file_name) { + GString *fname = g_string_new(file_name.toUtf8().constData()); + gboolean wespf_status; + + wespf_status = win32_export_specified_packets_file(parentWidget()->effectiveWinId(), fname, &file_type_, &compressed_, &range_); + file_name = fname->str; + + g_string_free(fname, TRUE); + + if (wespf_status) { + return win32_check_save_as_with_comments(parentWidget()->effectiveWinId(), cap_file_, file_type_); } return CANCELLED; @@ -432,12 +449,12 @@ bool CaptureFileDialog::isCompressed() { void CaptureFileDialog::addDisplayFilterEdit() { QGridLayout *fd_grid = qobject_cast<QGridLayout*>(layout()); - fd_grid->addWidget(new QLabel(tr("Display Filter:")), df_row_, 0, 1, 1); + fd_grid->addWidget(new QLabel(tr("Display Filter:")), last_row_, 0); display_filter_edit_ = new DisplayFilterEdit(this, true); display_filter_edit_->setText(display_filter_); - fd_grid->addWidget(display_filter_edit_, df_row_, 1, 1, 1); - + fd_grid->addWidget(display_filter_edit_, last_row_, 1); + last_row_++; } void CaptureFileDialog::addResolutionControls(QVBoxLayout &v_box) { @@ -458,9 +475,9 @@ void CaptureFileDialog::addResolutionControls(QVBoxLayout &v_box) { v_box.addWidget(&external_res_); } -void CaptureFileDialog::addGzipControls(QVBoxLayout &v_box, capture_file *cf) { +void CaptureFileDialog::addGzipControls(QVBoxLayout &v_box) { compress_.setText(tr("Compress with g&zip")); - if (cf->iscompressed && wtap_dump_can_compress(default_ft_)) { + if (cap_file_->iscompressed && wtap_dump_can_compress(default_ft_)) { compress_.setChecked(true); } else { compress_.setChecked(false); @@ -469,6 +486,15 @@ void CaptureFileDialog::addGzipControls(QVBoxLayout &v_box, capture_file *cf) { } +void CaptureFileDialog::addRangeControls(packet_range_t *range) { + QGridLayout *fd_grid = qobject_cast<QGridLayout*>(layout()); + + packet_range_group_box_.initRange(range); + + fd_grid->addWidget(&packet_range_group_box_, last_row_, 1, 1, -1); + last_row_++; +} + int CaptureFileDialog::open(QString &file_name) { setWindowTitle(tr("Wireshark: Open Capture File")); setNameFilters(buildFileOpenTypeList()); @@ -502,16 +528,16 @@ int CaptureFileDialog::open(QString &file_name) { } } -check_savability_t CaptureFileDialog::saveAs(capture_file *cf, QString &file_name, bool must_support_comments) { +check_savability_t CaptureFileDialog::saveAs(QString &file_name, bool must_support_comments) { setWindowTitle(tr("Wireshark: Save Capture File As")); // 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. - setNameFilters(buildFileSaveAsTypeList(cf, must_support_comments)); + setNameFilters(buildFileSaveAsTypeList(must_support_comments)); setAcceptMode(QFileDialog::AcceptSave); setLabelText(FileType, "Save as:"); - addGzipControls(left_v_box_, cf); + addGzipControls(left_v_box_); // Grow the dialog to account for the extra widgets. resize(width(), height() + left_v_box_.minimumSize().height()); @@ -522,7 +548,40 @@ check_savability_t CaptureFileDialog::saveAs(capture_file *cf, QString &file_nam if (QFileDialog::exec() && selectedFiles().length() > 0) { file_name = selectedFiles()[0]; - return checkSaveAsWithComments(this, cf, selectedFileType()); + return checkSaveAsWithComments(this, cap_file_, selectedFileType()); + } + return CANCELLED; +} + +check_savability_t CaptureFileDialog::exportSelectedPackets(QString &file_name, packet_range_t *range) { + QDialogButtonBox *button_box = findChild<QDialogButtonBox *>(); + + setWindowTitle(tr("Wireshark: Export Specified Packets")); + // XXX See comment in ::saveAs regarding setNameFilters + setNameFilters(buildFileSaveAsTypeList(false)); + setAcceptMode(QFileDialog::AcceptSave); + setLabelText(FileType, "Export as:"); + + addGzipControls(left_v_box_); + addRangeControls(range); + + if (button_box) { + save_bt_ = button_box->button(QDialogButtonBox::Save); + } + + connect(&packet_range_group_box_, SIGNAL(validityChanged(bool)), + this, SLOT(rangeValidityChanged(bool))); + + // Grow the dialog to account for the extra widgets. + resize(width(), height() + (packet_range_group_box_.height() * 2 / 3) + left_v_box_.minimumSize().height()); + + if (!file_name.isEmpty()) { + selectFile(file_name); + } + + if (QFileDialog::exec() && selectedFiles().length() > 0) { + file_name = selectedFiles()[0]; + return checkSaveAsWithComments(this, cap_file_, selectedFileType()); } return CANCELLED; } @@ -552,14 +611,14 @@ int CaptureFileDialog::merge(QString &file_name) { } } -QStringList CaptureFileDialog::buildFileSaveAsTypeList(capture_file *cf, bool must_support_comments) { +QStringList CaptureFileDialog::buildFileSaveAsTypeList(bool must_support_comments) { QStringList filters; GArray *savable_file_types; guint i; int ft; type_hash_.clear(); - savable_file_types = wtap_get_savable_file_types(cf->cd_t, cf->linktypes); + savable_file_types = wtap_get_savable_file_types(cap_file_->cd_t, cap_file_->linktypes); if (savable_file_types != NULL) { QString file_type; @@ -594,6 +653,12 @@ int CaptureFileDialog::mergeType() { } #endif // Q_WS_WINDOWS +// Slots + +void CaptureFileDialog::rangeValidityChanged(bool is_valid) { + if (save_bt_) save_bt_->setEnabled(is_valid); +} + /* do a preview run on the currently selected capture file */ void CaptureFileDialog::preview(const QString & path) diff --git a/ui/qt/capture_file_dialog.h b/ui/qt/capture_file_dialog.h index 7f9db56b31..0b228162bc 100644 --- a/ui/qt/capture_file_dialog.h +++ b/ui/qt/capture_file_dialog.h @@ -25,6 +25,7 @@ #define CAPTURE_FILE_DIALOG_H #include "display_filter_edit.h" +#include "packet_range_group_box.h" #include "packet_list_record.h" #include "cfile.h" @@ -61,11 +62,11 @@ class CaptureFileDialog : public QFileDialog Q_OBJECT public: - explicit CaptureFileDialog(QWidget *parent = NULL, QString &display_filter = *new QString()); + explicit CaptureFileDialog(QWidget *parent = NULL, capture_file *cf = NULL, QString &display_filter = *new QString()); static check_savability_t checkSaveAsWithComments(QWidget * #if defined(Q_WS_WIN) parent -#endif +#endif // Q_WS_WIN , capture_file *cf, int file_type); int mergeType(); @@ -83,8 +84,9 @@ private: QVBoxLayout right_v_box_; QString &display_filter_; + capture_file *cap_file_; DisplayFilterEdit* display_filter_edit_; - int df_row_; + int last_row_; QLabel preview_format_; QLabel preview_size_; @@ -101,9 +103,10 @@ private: #if !defined(Q_WS_WIN) void addResolutionControls(QVBoxLayout &v_box); - void addGzipControls(QVBoxLayout &v_box, capture_file *cf); + void addGzipControls(QVBoxLayout &v_box); + void addRangeControls(packet_range_t *range); - QStringList buildFileSaveAsTypeList(capture_file *cf, bool must_support_comments); + QStringList buildFileSaveAsTypeList(bool must_support_comments); int default_ft_; @@ -113,6 +116,10 @@ private: QCheckBox external_res_; QCheckBox compress_; + + PacketRangeGroupBox packet_range_group_box_; + QPushButton *save_bt_; + #else // Q_WS_WIN int file_type_; int merge_type_; @@ -125,8 +132,12 @@ public slots: int exec(); int open(QString &file_name); - check_savability_t saveAs(capture_file *cf, QString &file_name, bool must_support_comments); + check_savability_t saveAs(QString &file_name, bool must_support_comments); + check_savability_t exportSelectedPackets(QString &file_name, packet_range_t *range); int merge(QString &file_name); +#if !defined(Q_WS_WIN) + void rangeValidityChanged(bool is_valid); +#endif // Q_WS_WIN private slots: void preview(const QString & path); diff --git a/ui/qt/display_filter_edit.cpp b/ui/qt/display_filter_edit.cpp index c5fb90834d..6dd6072152 100644 --- a/ui/qt/display_filter_edit.cpp +++ b/ui/qt/display_filter_edit.cpp @@ -30,7 +30,7 @@ #include <epan/proto.h> #include "display_filter_edit.h" -#include "tango_colors.h" +#include "syntax_line_edit.h" #include "ui/utf8_entities.h" @@ -83,11 +83,10 @@ UIMiniCancelButton::UIMiniCancelButton(QWidget *pParent /* = 0 */) // XXX - We need simplified (button- and dropdown-free) versions for use in dialogs and field-only checking. DisplayFilterEdit::DisplayFilterEdit(QWidget *parent, bool plain) : - QLineEdit(parent), plain_(plain) + SyntaxLineEdit(parent), + plain_(plain), + field_name_only_(false) { - field_name_only_ = false; - syntax_state_ = Empty; - setAccessibleName(tr("Display filter entry")); if (plain_) { @@ -189,46 +188,21 @@ DisplayFilterEdit::DisplayFilterEdit(QWidget *parent, bool plain) : } else { apsz.setHeight(0); apsz.setWidth(0); } - syntax_style_sheet_ = QString( + setStyleSheet(QString( "DisplayFilterEdit {" " padding-left: %1px;" " margin-left: %2px;" " margin-right: %3px;" -// " background: transparent;" - "}" - - // Should the backgrounds fade away on the right? - "DisplayFilterEdit[syntaxState=\"%4\"] {" - " color: white;" - " background-color: #%7;" - "}" - - "DisplayFilterEdit[syntaxState=\"%5\"] {" - " color: #%8;" - " background-color: #%9;" - "}" - - "DisplayFilterEdit[syntaxState=\"%6\"] {" - " color: #%8;" - " background-color: #%10;" "}" ) .arg(frameWidth + 1) .arg(bksz.width()) .arg(cbsz.width() + apsz.width() + frameWidth + 1) - .arg(Invalid) - .arg(Deprecated) - .arg(Valid) - .arg(tango_scarlet_red_1, 6, 16, QChar('0')) // Invalid - .arg(tango_aluminium_6, 6, 16, QChar('0')) // Deprecated/valid foreground - .arg(tango_butter_1, 6, 16, QChar('0')) // Deprecated - .arg(tango_chameleon_1, 6, 16, QChar('0')) // Valid - ; - setStyleSheet(syntax_style_sheet_); + ); } void DisplayFilterEdit::paintEvent(QPaintEvent *evt) { - QLineEdit::paintEvent(evt); + SyntaxLineEdit::paintEvent(evt); // http://wiki.forum.nokia.com/index.php/Custom_QLineEdit if (text().isEmpty() && ! this->hasFocus()) { @@ -282,17 +256,17 @@ void DisplayFilterEdit::checkFilter(const QString& text) popFilterSyntaxStatus(); if (field_name_only_ && (c = proto_check_field_name(text.toUtf8().constData()))) { - syntax_state_ = Invalid; + setSyntaxState(Invalid); emit pushFilterSyntaxStatus(QString().sprintf("Illegal character in field name: '%c'", c)); } else if (dfilter_compile(text.toUtf8().constData(), &dfp)) { if (dfp != NULL) { depr = dfilter_deprecated_tokens(dfp); } if (text.length() < 1) { - syntax_state_ = Empty; + setSyntaxState(Empty); } else if (depr) { /* You keep using that word. I do not think it means what you think it means. */ - syntax_state_ = Deprecated; + setSyntaxState(Deprecated); /* * We're being lazy and only printing the first "problem" token. * Would it be better to print all of them? @@ -300,11 +274,11 @@ void DisplayFilterEdit::checkFilter(const QString& text) emit pushFilterSyntaxWarning(QString().sprintf("\"%s\" may have unexpected results (see the User's Guide)", (const char *) g_ptr_array_index(depr, 0))); } else { - syntax_state_ = Valid; + setSyntaxState(Valid); } dfilter_free(dfp); } else { - syntax_state_ = Invalid; + setSyntaxState(Invalid); QString invalidMsg(tr("Invalid filter")); if (dfilter_error_msg) { invalidMsg.append(QString().sprintf(": %s", dfilter_error_msg)); @@ -312,9 +286,8 @@ void DisplayFilterEdit::checkFilter(const QString& text) emit pushFilterSyntaxStatus(invalidMsg); } - setStyleSheet(syntax_style_sheet_); if (apply_button_) { - apply_button_->setEnabled(syntax_state_ == Empty || syntax_state_ == Valid); + apply_button_->setEnabled(SyntaxState() == Empty || syntaxState() == Valid); } } @@ -329,7 +302,7 @@ void DisplayFilterEdit::applyDisplayFilter() gchar *dftext = NULL; cf_status_t cf_status; - if (syntax_state_ != Valid && syntax_state_ != Empty) { + if (syntaxState() != Valid && syntaxState() != Empty) { return; } diff --git a/ui/qt/display_filter_edit.h b/ui/qt/display_filter_edit.h index 41204c8ad5..caa5e498cd 100644 --- a/ui/qt/display_filter_edit.h +++ b/ui/qt/display_filter_edit.h @@ -25,18 +25,13 @@ #define DISPLAYFILTEREDIT_H #include <QtGui> +#include "syntax_line_edit.h" -class DisplayFilterEdit : public QLineEdit +class DisplayFilterEdit : public SyntaxLineEdit { Q_OBJECT - Q_PROPERTY(SyntaxState syntaxState READ syntaxState) - Q_ENUMS(SyntaxState) public: explicit DisplayFilterEdit(QWidget *parent = 0, bool plain = false); - enum SyntaxState { Empty, Invalid, Deprecated, Valid }; - SyntaxState syntaxState() const - { return syntax_state_; } - protected: void paintEvent(QPaintEvent *evt); @@ -52,9 +47,7 @@ private slots: private: bool plain_; bool field_name_only_; - SyntaxState syntax_state_; QString empty_filter_message_; - QString syntax_style_sheet_; QToolButton *bookmark_button_; QToolButton *clear_button_; QToolButton *apply_button_; diff --git a/ui/qt/import_text_dialog.cpp b/ui/qt/import_text_dialog.cpp index 21e0c94ac1..1acbcb1558 100644 --- a/ui/qt/import_text_dialog.cpp +++ b/ui/qt/import_text_dialog.cpp @@ -52,33 +52,33 @@ ImportTextDialog::ImportTextDialog(QWidget *parent) : QDialog(parent), - ui(new Ui::ImportTextDialog), + ti_ui_(new Ui::ImportTextDialog), import_info_() { int encap; int i; - ui->setupUi(this); + ti_ui_->setupUi(this); memset(&import_info_, 0, sizeof(import_info_)); - ok_button_ = ui->buttonBox->button(QDialogButtonBox::Ok); + ok_button_ = ti_ui_->buttonBox->button(QDialogButtonBox::Ok); ok_button_->setEnabled(false); #ifdef Q_WS_MAC // The grid layout squishes each line edit otherwise. - int le_height = ui->textFileLineEdit->sizeHint().height(); - ui->ethertypeLineEdit->setMinimumHeight(le_height); - ui->protocolLineEdit->setMinimumHeight(le_height); - ui->sourcePortLineEdit->setMinimumHeight(le_height); - ui->destinationPortLineEdit->setMinimumHeight(le_height); - ui->tagLineEdit->setMinimumHeight(le_height); - ui->ppiLineEdit->setMinimumHeight(le_height); + int le_height = ti_ui_->textFileLineEdit->sizeHint().height(); + ti_ui_->ethertypeLineEdit->setMinimumHeight(le_height); + ti_ui_->protocolLineEdit->setMinimumHeight(le_height); + ti_ui_->sourcePortLineEdit->setMinimumHeight(le_height); + ti_ui_->destinationPortLineEdit->setMinimumHeight(le_height); + ti_ui_->tagLineEdit->setMinimumHeight(le_height); + ti_ui_->ppiLineEdit->setMinimumHeight(le_height); #endif - on_dateTimeLineEdit_textChanged(ui->dateTimeLineEdit->text()); + on_dateTimeLineEdit_textChanged(ti_ui_->dateTimeLineEdit->text()); - for (i = 0; i < ui->headerGridLayout->count(); i++) { - QRadioButton *rb = qobject_cast<QRadioButton *>(ui->headerGridLayout->itemAt(i)->widget()); + for (i = 0; i < ti_ui_->headerGridLayout->count(); i++) { + QRadioButton *rb = qobject_cast<QRadioButton *>(ti_ui_->headerGridLayout->itemAt(i)->widget()); if (rb) encap_buttons_.append(rb); } @@ -98,7 +98,7 @@ ImportTextDialog::ImportTextDialog(QWidget *parent) : /* If it has got a name */ if ((name = wtap_encap_string(encap))) { - ui->encapComboBox->addItem(name, QVariant(encap)); + ti_ui_->encapComboBox->addItem(name, QVariant(encap)); } } } @@ -106,7 +106,7 @@ ImportTextDialog::ImportTextDialog(QWidget *parent) : ImportTextDialog::~ImportTextDialog() { - delete ui; + delete ti_ui_; } QString &ImportTextDialog::capfileName() { @@ -160,29 +160,29 @@ void ImportTextDialog::enableHeaderWidgets(bool enable_buttons) { bool sctp_ppi = false; if (enable_buttons) { - if (ui->ethernetButton->isChecked()) { + if (ti_ui_->ethernetButton->isChecked()) { ethertype = true; - on_ethertypeLineEdit_textChanged(ui->ethertypeLabel->text()); - } else if (ui->ipv4Button->isChecked()) { + on_ethertypeLineEdit_textChanged(ti_ui_->ethertypeLineEdit->text()); + } else if (ti_ui_->ipv4Button->isChecked()) { ipv4_proto = true; - on_protocolLineEdit_textChanged(ui->protocolLineEdit->text()); - } else if (ui->udpButton->isChecked() || ui->tcpButton->isChecked()) { + on_protocolLineEdit_textChanged(ti_ui_->protocolLineEdit->text()); + } else if (ti_ui_->udpButton->isChecked() || ti_ui_->tcpButton->isChecked()) { port = true; - on_sourcePortLineEdit_textChanged(ui->sourcePortLineEdit->text()); - on_destinationPortLineEdit_textChanged(ui->destinationPortLineEdit->text()); - } else if (ui->sctpButton->isChecked()) { + on_sourcePortLineEdit_textChanged(ti_ui_->sourcePortLineEdit->text()); + on_destinationPortLineEdit_textChanged(ti_ui_->destinationPortLineEdit->text()); + } else if (ti_ui_->sctpButton->isChecked()) { port = true; sctp_tag = true; - on_sourcePortLineEdit_textChanged(ui->sourcePortLineEdit->text()); - on_destinationPortLineEdit_textChanged(ui->destinationPortLineEdit->text()); - on_tagLineEdit_textChanged(ui->tagLineEdit->text()); + on_sourcePortLineEdit_textChanged(ti_ui_->sourcePortLineEdit->text()); + on_destinationPortLineEdit_textChanged(ti_ui_->destinationPortLineEdit->text()); + on_tagLineEdit_textChanged(ti_ui_->tagLineEdit->text()); } - if (ui->sctpDataButton->isChecked()) { + if (ti_ui_->sctpDataButton->isChecked()) { port = true; sctp_ppi = true; - on_sourcePortLineEdit_textChanged(ui->sourcePortLineEdit->text()); - on_destinationPortLineEdit_textChanged(ui->destinationPortLineEdit->text()); - on_ppiLineEdit_textChanged(ui->ppiLineEdit->text()); + on_sourcePortLineEdit_textChanged(ti_ui_->sourcePortLineEdit->text()); + on_destinationPortLineEdit_textChanged(ti_ui_->destinationPortLineEdit->text()); + on_ppiLineEdit_textChanged(ti_ui_->ppiLineEdit->text()); } } @@ -190,18 +190,18 @@ void ImportTextDialog::enableHeaderWidgets(bool enable_buttons) { rb->setEnabled(enable_buttons); } - ui->ethertypeLabel->setEnabled(ethertype); - ui->ethertypeLineEdit->setEnabled(ethertype); - ui->protocolLabel->setEnabled(ipv4_proto); - ui->protocolLineEdit->setEnabled(ipv4_proto); - ui->sourcePortLabel->setEnabled(port); - ui->sourcePortLineEdit->setEnabled(port); - ui->destinationPortLabel->setEnabled(port); - ui->destinationPortLineEdit->setEnabled(port); - ui->tagLabel->setEnabled(sctp_tag); - ui->tagLineEdit->setEnabled(sctp_tag); - ui->ppiLabel->setEnabled(sctp_ppi); - ui->ppiLineEdit->setEnabled(sctp_ppi); + ti_ui_->ethertypeLabel->setEnabled(ethertype); + ti_ui_->ethertypeLineEdit->setEnabled(ethertype); + ti_ui_->protocolLabel->setEnabled(ipv4_proto); + ti_ui_->protocolLineEdit->setEnabled(ipv4_proto); + ti_ui_->sourcePortLabel->setEnabled(port); + ti_ui_->sourcePortLineEdit->setEnabled(port); + ti_ui_->destinationPortLabel->setEnabled(port); + ti_ui_->destinationPortLineEdit->setEnabled(port); + ti_ui_->tagLabel->setEnabled(sctp_tag); + ti_ui_->tagLineEdit->setEnabled(sctp_tag); + ti_ui_->ppiLabel->setEnabled(sctp_ppi); + ti_ui_->ppiLineEdit->setEnabled(sctp_ppi); } void ImportTextDialog::exec() { @@ -213,7 +213,7 @@ void ImportTextDialog::exec() { return; } - import_info_.import_text_filename = ui->textFileLineEdit->text().toUtf8().data(); + import_info_.import_text_filename = ti_ui_->textFileLineEdit->text().toUtf8().data(); import_info_.import_text_file = ws_fopen(import_info_.import_text_filename, "rb"); if (!import_info_.import_text_file) { open_failure_alert_box(import_info_.import_text_filename, errno, FALSE); @@ -222,28 +222,28 @@ void ImportTextDialog::exec() { } import_info_.offset_type = - ui->hexOffsetButton->isChecked() ? OFFSET_HEX : - ui->decimalOffsetButton->isChecked() ? OFFSET_DEC : - ui->octalOffsetButton->isChecked() ? OFFSET_OCT : + ti_ui_->hexOffsetButton->isChecked() ? OFFSET_HEX : + ti_ui_->decimalOffsetButton->isChecked() ? OFFSET_DEC : + ti_ui_->octalOffsetButton->isChecked() ? OFFSET_OCT : OFFSET_NONE; - import_info_.date_timestamp = ui->dateTimeLineEdit->text().length() > 0; - import_info_.date_timestamp_format = ui->dateTimeLineEdit->text().toUtf8().data(); + import_info_.date_timestamp = ti_ui_->dateTimeLineEdit->text().length() > 0; + import_info_.date_timestamp_format = ti_ui_->dateTimeLineEdit->text().toUtf8().data(); - encap_val = ui->encapComboBox->itemData(ui->encapComboBox->currentIndex()); + encap_val = ti_ui_->encapComboBox->itemData(ti_ui_->encapComboBox->currentIndex()); import_info_.dummy_header_type = HEADER_NONE; - if (encap_val.isValid() && encap_val.toUInt() == WTAP_ENCAP_ETHERNET && !ui->noDummyButton->isChecked()) { + if (encap_val.isValid() && encap_val.toUInt() == WTAP_ENCAP_ETHERNET && !ti_ui_->noDummyButton->isChecked()) { // Inputs were validated in the on_xxx_textChanged slots. - if (ui->ethernetButton->isChecked()) { + if (ti_ui_->ethernetButton->isChecked()) { import_info_.dummy_header_type = HEADER_ETH; - } else if (ui->ipv4Button->isChecked()) { + } else if (ti_ui_->ipv4Button->isChecked()) { import_info_.dummy_header_type = HEADER_IPV4; - } else if(ui->udpButton->isChecked()) { + } else if(ti_ui_->udpButton->isChecked()) { import_info_.dummy_header_type = HEADER_UDP; - } else if(ui->tcpButton->isChecked()) { + } else if(ti_ui_->tcpButton->isChecked()) { import_info_.dummy_header_type = HEADER_TCP; - } else if(ui->sctpButton->isChecked()) { + } else if(ti_ui_->sctpButton->isChecked()) { import_info_.dummy_header_type = HEADER_SCTP; - } else if(ui->sctpDataButton->isChecked()) { + } else if(ti_ui_->sctpDataButton->isChecked()) { import_info_.dummy_header_type = HEADER_SCTP_DATA; } } @@ -280,7 +280,7 @@ void ImportTextDialog::on_textFileBrowseButton_clicked() } QString file_name = QFileDialog::getOpenFileName(this, tr("Wireshark: Import text file"), open_dir); - ui->textFileLineEdit->setText(file_name); + ti_ui_->textFileLineEdit->setText(file_name); } void ImportTextDialog::on_textFileLineEdit_textChanged(const QString &file_name) @@ -298,7 +298,7 @@ void ImportTextDialog::on_textFileLineEdit_textChanged(const QString &file_name) void ImportTextDialog::on_encapComboBox_currentIndexChanged(int index) { - QVariant val = ui->encapComboBox->itemData(index); + QVariant val = ti_ui_->encapComboBox->itemData(index); bool enabled = false; if (val != QVariant::Invalid) { @@ -319,10 +319,10 @@ void ImportTextDialog::on_dateTimeLineEdit_textChanged(const QString &time_forma time(&cur_time); cur_tm = localtime(&cur_time); - strftime(time_str, 100, ui->dateTimeLineEdit->text().toUtf8().constData(), cur_tm); - ui->timestampExampleLabel->setText(QString(tr("Example: %1")).arg(time_str)); + strftime(time_str, 100, ti_ui_->dateTimeLineEdit->text().toUtf8().constData(), cur_tm); + ti_ui_->timestampExampleLabel->setText(QString(tr("Example: %1")).arg(time_str)); } else { - ui->timestampExampleLabel->setText(tr("<i>(No format will be applied)</i>")); + ti_ui_->timestampExampleLabel->setText(tr("<i>(No format will be applied)</i>")); } } @@ -361,88 +361,66 @@ void ImportTextDialog::on_sctpDataButton_toggled(bool checked) on_noDummyButton_toggled(checked); } -void ImportTextDialog::on_ethertypeLineEdit_textChanged(const QString ðertype_str) -{ +void ImportTextDialog::check_line_edit(SyntaxLineEdit *le, const QString &num_str, int base, guint max_val, bool is_short, guint *val_ptr) { bool conv_ok; + SyntaxLineEdit::SyntaxState syntax_state = SyntaxLineEdit::Empty; + bool ok_enabled = true; - import_info_.pid = ethertype_str.toUShort(&conv_ok, 16); - if (conv_ok && import_info_.pid <= 0xffff) { - ok_button_->setEnabled(true); + if (!le || !val_ptr) + return; + + if (num_str.length() < 1) { + *val_ptr = 0; } else { - ok_button_->setEnabled(false); + if (is_short) { + *val_ptr = num_str.toUShort(&conv_ok, base); + } else { + *val_ptr = num_str.toULong(&conv_ok, base); + } + if (conv_ok && *val_ptr <= max_val) { + syntax_state = SyntaxLineEdit::Valid; + } else { + syntax_state = SyntaxLineEdit::Invalid; + ok_enabled = false; + } } + le->setSyntaxState(syntax_state); + ok_button_->setEnabled(ok_enabled); } -void ImportTextDialog::on_protocolLineEdit_textChanged(const QString &protocol_str) +void ImportTextDialog::on_ethertypeLineEdit_textChanged(const QString ðertype_str) { - bool conv_ok; + check_line_edit(ti_ui_->ethertypeLineEdit, ethertype_str, 16, 0xffff, true, &import_info_.pid); +} - import_info_.protocol = protocol_str.toUShort(&conv_ok, 10); - if (conv_ok && import_info_.protocol <= 0xff) { - ok_button_->setEnabled(true); - } else { - ok_button_->setEnabled(false); - } +void ImportTextDialog::on_protocolLineEdit_textChanged(const QString &protocol_str) +{ + check_line_edit(ti_ui_->protocolLineEdit, protocol_str, 10, 0xff, true, &import_info_.protocol); } void ImportTextDialog::on_sourcePortLineEdit_textChanged(const QString &source_port_str) { - bool conv_ok; - - import_info_.src_port = source_port_str.toUShort(&conv_ok, 10); - if (conv_ok && import_info_.src_port <= 0xffff) { - ok_button_->setEnabled(true); - } else { - ok_button_->setEnabled(false); - } + check_line_edit(ti_ui_->sourcePortLineEdit, source_port_str, 10, 0xffff, true, &import_info_.src_port); } void ImportTextDialog::on_destinationPortLineEdit_textChanged(const QString &destination_port_str) { - bool conv_ok; - - import_info_.dst_port = destination_port_str.toUShort(&conv_ok, 10); - if (conv_ok && import_info_.dst_port <= 0xffff) { - ok_button_->setEnabled(true); - } else { - ok_button_->setEnabled(false); - } + check_line_edit(ti_ui_->destinationPortLineEdit, destination_port_str, 10, 0xffff, true, &import_info_.dst_port); } void ImportTextDialog::on_tagLineEdit_textChanged(const QString &tag_str) { - bool conv_ok; - - import_info_.tag = tag_str.toULong(&conv_ok, 10); - if (conv_ok && import_info_.tag <= 0xffffffff) { - ok_button_->setEnabled(true); - } else { - ok_button_->setEnabled(false); - } + check_line_edit(ti_ui_->tagLineEdit, tag_str, 10, 0xffffffff, false, &import_info_.tag); } void ImportTextDialog::on_ppiLineEdit_textChanged(const QString &ppi_str) { - bool conv_ok; - - import_info_.ppi = ppi_str.toULong(&conv_ok, 10); - if (conv_ok && import_info_.ppi <= 0xffffffff) { - ok_button_->setEnabled(true); - } else { - ok_button_->setEnabled(false); - } + check_line_edit(ti_ui_->ppiLineEdit, ppi_str, 10, 0xffffffff, false, &import_info_.ppi); } void ImportTextDialog::on_maxLengthLineEdit_textChanged(const QString &max_frame_len_str) { - bool conv_ok; - - import_info_.max_frame_length = max_frame_len_str.toUShort(&conv_ok, 10); - if (conv_ok && import_info_.max_frame_length <= IMPORT_MAX_PACKET) { - ok_button_->setEnabled(true); - } else { - ok_button_->setEnabled(false); - } + check_line_edit(ti_ui_->maxLengthLineEdit, max_frame_len_str, 10, IMPORT_MAX_PACKET, true, &import_info_.max_frame_length); } void ImportTextDialog::on_buttonBox_helpRequested() diff --git a/ui/qt/import_text_dialog.h b/ui/qt/import_text_dialog.h index a7869ee444..d9f41167e3 100644 --- a/ui/qt/import_text_dialog.h +++ b/ui/qt/import_text_dialog.h @@ -32,6 +32,8 @@ #include "ui/text_import.h" +#include <syntax_line_edit.h> + #include <QDialog> #include <QPushButton> #include <QRadioButton> @@ -52,8 +54,9 @@ public: private: void convertTextFile(); void enableHeaderWidgets(bool enable_buttons = true); + void check_line_edit(SyntaxLineEdit *le, const QString &num_str, int base, guint max_val, bool is_short, guint *val_ptr); - Ui::ImportTextDialog *ui; + Ui::ImportTextDialog *ti_ui_; QPushButton *ok_button_; QList<QRadioButton *>encap_buttons_; diff --git a/ui/qt/import_text_dialog.ui b/ui/qt/import_text_dialog.ui index f65bf06531..823b522600 100644 --- a/ui/qt/import_text_dialog.ui +++ b/ui/qt/import_text_dialog.ui @@ -186,13 +186,10 @@ </widget> </item> <item> - <widget class="QLineEdit" name="maxLengthLineEdit"> + <widget class="SyntaxLineEdit" name="maxLengthLineEdit"> <property name="toolTip"> <string>The maximum size of the frames to write to the import capture file (max 64000)</string> </property> - <property name="inputMask"> - <string>90000; </string> - </property> </widget> </item> </layout> @@ -250,21 +247,21 @@ <item row="1" column="0" colspan="2"> <layout class="QGridLayout" name="headerGridLayout"> <item row="3" column="2"> - <widget class="QLineEdit" name="sourcePortLineEdit"> + <widget class="SyntaxLineEdit" name="sourcePortLineEdit"> <property name="toolTip"> <string>The UDP, TCP or SCTP source port for each frame</string> </property> </widget> </item> <item row="6" column="2"> - <widget class="QLineEdit" name="ppiLineEdit"> + <widget class="SyntaxLineEdit" name="ppiLineEdit"> <property name="toolTip"> <string>The SCTP DATA payload protocol identifier for each frame</string> </property> </widget> </item> <item row="4" column="2"> - <widget class="QLineEdit" name="destinationPortLineEdit"> + <widget class="SyntaxLineEdit" name="destinationPortLineEdit"> <property name="toolTip"> <string>The UDP, TCP or SCTP destination port for each frame</string> </property> @@ -355,7 +352,7 @@ </widget> </item> <item row="1" column="2"> - <widget class="QLineEdit" name="ethertypeLineEdit"> + <widget class="SyntaxLineEdit" name="ethertypeLineEdit"> <property name="toolTip"> <string>The Ethertype value of each frame</string> </property> @@ -375,7 +372,7 @@ </widget> </item> <item row="5" column="2"> - <widget class="QLineEdit" name="tagLineEdit"> + <widget class="SyntaxLineEdit" name="tagLineEdit"> <property name="toolTip"> <string>The SCTP verification tag for each frame</string> </property> @@ -396,7 +393,7 @@ </widget> </item> <item row="2" column="2"> - <widget class="QLineEdit" name="protocolLineEdit"> + <widget class="SyntaxLineEdit" name="protocolLineEdit"> <property name="toolTip"> <string>The IPv4 protocol ID for each frame</string> </property> @@ -429,6 +426,13 @@ </item> </layout> </widget> + <customwidgets> + <customwidget> + <class>SyntaxLineEdit</class> + <extends>QLineEdit</extends> + <header>syntax_line_edit.h</header> + </customwidget> + </customwidgets> <resources/> <connections> <connection> diff --git a/ui/qt/main_welcome.cpp b/ui/qt/main_welcome.cpp index 2879ab47d8..19f526a007 100644 --- a/ui/qt/main_welcome.cpp +++ b/ui/qt/main_welcome.cpp @@ -119,7 +119,7 @@ MainWelcome::MainWelcome(QWidget *parent) : // "}" ) .arg(tango_aluminium_6, 6, 16, QChar('0')) // Text color - .arg(tango_sky_blue_2, 6, 16, QChar('0')) // Selected background + .arg(tango_sky_blue_4, 6, 16, QChar('0')) // Selected background .arg(tango_aluminium_2, 6, 16, QChar('0')) // Hover background .arg(tango_aluminium_6, 6, 16, QChar('0')) // Hover foreground ); diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp index 8f5dbd5e09..c639042c3a 100644 --- a/ui/qt/main_window.cpp +++ b/ui/qt/main_window.cpp @@ -363,7 +363,7 @@ void MainWindow::mergeCaptureFile() } for (;;) { - CaptureFileDialog merge_dlg(this, display_filter); + CaptureFileDialog merge_dlg(this, cap_file_, display_filter); int file_type; cf_status_t merge_status; char *in_filenames[2]; @@ -593,10 +593,6 @@ void MainWindow::saveAsCaptureFile(capture_file *cf, bool must_support_comments, int file_type; gboolean compressed; cf_write_status_t status; - QString file_name_lower; - QString file_suffix; - GSList *extensions_list, *extension; - gboolean add_extension; gchar *dirname; gboolean discard_comments = FALSE; @@ -605,7 +601,7 @@ void MainWindow::saveAsCaptureFile(capture_file *cf, bool must_support_comments, } for (;;) { - CaptureFileDialog save_as_dlg(this); + CaptureFileDialog save_as_dlg(this, cf); switch (prefs.gui_fileopen_style) { @@ -630,7 +626,7 @@ void MainWindow::saveAsCaptureFile(capture_file *cf, bool must_support_comments, /* If the file has comments, does the format the user selected support them? If not, ask the user whether they want to discard the comments or choose a different format. */ - switch(save_as_dlg.saveAs(cf, file_name, must_support_comments)) { + switch(save_as_dlg.saveAs(file_name, must_support_comments)) { case SAVE: /* The file can be saved in the specified format as is; @@ -665,53 +661,146 @@ void MainWindow::saveAsCaptureFile(capture_file *cf, bool must_support_comments, file_type = save_as_dlg.selectedFileType(); compressed = save_as_dlg.isCompressed(); + fileAddExtension(file_name, file_type, compressed); + +//#ifndef _WIN32 +// /* If the file exists and it's user-immutable or not writable, +// ask the user whether they want to override that. */ +// if (!file_target_unwritable_ui(top_level, file_name.toUtf8().constData())) { +// /* They don't. Let them try another file name or cancel. */ +// continue; +// } +//#endif + + /* Attempt to save the file */ + status = cf_save_packets(cf, file_name.toUtf8().constData(), file_type, compressed, + discard_comments, stay_closed); + switch (status) { + + case CF_WRITE_OK: + /* The save succeeded; we're done. */ + /* Save the directory name for future file dialogs. */ + dirname = get_dirname(file_name.toUtf8().data()); /* Overwrites cf_name */ + set_last_open_dir(dirname); + /* If we discarded comments, redraw the packet list to reflect + any packets that no longer have comments. */ + if (discard_comments) + packet_list_queue_draw(); + return; + + case CF_WRITE_ERROR: + /* The save failed; let the user try again. */ + continue; + + case CF_WRITE_ABORTED: + /* The user aborted the save; just return. */ + return; + } + } + return; +} + +void MainWindow::exportSelectedPackets() { + QString file_name = ""; + int file_type; + gboolean compressed; + packet_range_t range; + cf_write_status_t status; + gchar *dirname; + gboolean discard_comments = FALSE; + + if (!cap_file_) + return; + + /* init the packet range */ + packet_range_init(&range, cap_file_); + range.process_filtered = TRUE; + range.include_dependents = TRUE; + + for (;;) { + CaptureFileDialog esp_dlg(this, cap_file_); + + 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. */ + /* This is now the default behaviour in file_selection_new() */ + 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') + esp_dlg.setDirectory(prefs.gui_fileopen_dir); + break; + } + + /* If the file has comments, does the format the user selected + support them? If not, ask the user whether they want to + discard the comments or choose a different format. */ + switch(esp_dlg.exportSelectedPackets(file_name, &range)) { + + case SAVE: + /* The file can be saved in the specified format as is; + just drive on and save in the format they selected. */ + discard_comments = FALSE; + break; + + case SAVE_WITHOUT_COMMENTS: + /* The file can't be saved in the specified format as is, + but it can be saved without the comments, and the user + said "OK, discard the comments", so save it in the + format they specified without the comments. */ + discard_comments = TRUE; + break; + + case SAVE_IN_ANOTHER_FORMAT: + /* There are file formats in which we can save this that + support comments, and the user said not to delete the + comments. The combo box of file formats has had the + formats that don't support comments trimmed from it, + so run the dialog again, to let the user decide + whether to save in one of those formats or give up. */ + discard_comments = FALSE; + continue; + + case CANCELLED: + /* The user said "forget it". Just get rid of the dialog box + and return. */ + return; + } + /* - * Append the default file extension if there's none given by - * the user or if they gave one that's not one of the valid - * extensions for the file type. + * Check that we're not going to save on top of the current + * capture file. + * We do it here so we catch all cases ... + * Unfortunately, the file requester gives us an absolute file + * name and the read file name may be relative (if supplied on + * the command line). From Joerg Mayer. */ - file_name_lower = file_name.toLower(); - extensions_list = wtap_get_file_extensions_list(file_type, FALSE); - if (extensions_list != NULL) { - /* We have one or more extensions for this file type. - Start out assuming we need to add the default one. */ - add_extension = TRUE; - - /* OK, see if the file has one of those extensions. */ - for (extension = extensions_list; extension != NULL; - extension = g_slist_next(extension)) { - file_suffix += tr(".") + (char *)extension->data; - if (file_name_lower.endsWith(file_suffix)) { - /* - * The file name has one of the extensions for - * this file type. - */ - add_extension = FALSE; - break; - } - file_suffix += ".gz"; - if (file_name_lower.endsWith(file_suffix)) { - /* - * The file name has one of the extensions for - * this file type. - */ - add_extension = FALSE; - break; - } - } - } else { - /* We have no extensions for this file type. Don't add one. */ - add_extension = FALSE; - } - if (add_extension) { - if (wtap_default_file_extension(file_type) != NULL) { - file_name += tr(".") + wtap_default_file_extension(file_type); - if (compressed) { - file_name += ".gz"; - } - } + if (files_identical(cap_file_->filename, file_name.toUtf8().constData())) { + QMessageBox msg_box; + gchar *display_basename = g_filename_display_basename(file_name.toUtf8().constData()); + + msg_box.setIcon(QMessageBox::Critical); + msg_box.setText(QString(tr("Unable to export to \"%1\".").arg(display_basename))); + msg_box.setInformativeText(tr("You cannot export packets to the current capture file.")); + msg_box.setStandardButtons(QMessageBox::Ok); + msg_box.setDefaultButton(QMessageBox::Ok); + msg_box.exec(); + g_free(display_basename); + continue; } + file_type = esp_dlg.selectedFileType(); + compressed = esp_dlg.isCompressed(); + fileAddExtension(file_name, file_type, compressed); + //#ifndef _WIN32 // /* If the file exists and it's user-immutable or not writable, // ask the user whether they want to override that. */ @@ -722,8 +811,7 @@ void MainWindow::saveAsCaptureFile(capture_file *cf, bool must_support_comments, //#endif /* Attempt to save the file */ - status = cf_save_packets(cf, file_name.toUtf8().constData(), file_type, compressed, - discard_comments, stay_closed); + status = cf_export_specified_packets(cap_file_, file_name.toUtf8().constData(), &range, file_type, compressed); switch (status) { case CF_WRITE_OK: @@ -749,6 +837,60 @@ void MainWindow::saveAsCaptureFile(capture_file *cf, bool must_support_comments, return; } +void MainWindow::fileAddExtension(QString &file_name, int file_type, bool compressed) { + QString file_name_lower; + QString file_suffix; + GSList *extensions_list, *extension; + gboolean add_extension; + + /* + * Append the default file extension if there's none given by + * the user or if they gave one that's not one of the valid + * extensions for the file type. + */ + file_name_lower = file_name.toLower(); + extensions_list = wtap_get_file_extensions_list(file_type, FALSE); + if (extensions_list != NULL) { + /* We have one or more extensions for this file type. + Start out assuming we need to add the default one. */ + add_extension = TRUE; + + /* OK, see if the file has one of those extensions. */ + for (extension = extensions_list; extension != NULL; + extension = g_slist_next(extension)) { + file_suffix += tr(".") + (char *)extension->data; + if (file_name_lower.endsWith(file_suffix)) { + /* + * The file name has one of the extensions for + * this file type. + */ + add_extension = FALSE; + break; + } + file_suffix += ".gz"; + if (file_name_lower.endsWith(file_suffix)) { + /* + * The file name has one of the extensions for + * this file type. + */ + add_extension = FALSE; + break; + } + } + } else { + /* We have no extensions for this file type. Don't add one. */ + add_extension = FALSE; + } + if (add_extension) { + if (wtap_default_file_extension(file_type) != NULL) { + file_name += tr(".") + wtap_default_file_extension(file_type); + if (compressed) { + file_name += ".gz"; + } + } + } +} + bool MainWindow::testCaptureFileClose(bool from_quit, QString &before_what) { bool capture_in_progress = FALSE; @@ -955,8 +1097,7 @@ void MainWindow::setMenusForCaptureFile(bool force_disable) * "Export Specified Packets..." should be available only if * we can write the file out in at least one format. */ -// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/FileMenu/ExportSpecifiedPackets", -// cf_can_write_with_wiretap(cf)); + main_ui_->actionFileExportPackets->setEnabled(cf_can_write_with_wiretap(cap_file_)); main_ui_->actionFileExportPacketDissections->setEnabled(true); main_ui_->actionFileExportPacketBytes->setEnabled(true); main_ui_->actionFileExportSSLSessionKeys->setEnabled(true); @@ -978,6 +1119,7 @@ void MainWindow::setMenusForCaptureInProgress(bool capture_in_progress) { main_ui_->menuFileSet->setEnabled(!capture_in_progress); main_ui_->actionFileQuit->setEnabled(true); + qDebug() << "FIX: packet list heading menu sensitivity"; // set_menu_sensitivity(ui_manager_packet_list_heading, "/PacketListHeadingPopup/SortAscending", // !capture_in_progress); // set_menu_sensitivity(ui_manager_packet_list_heading, "/PacketListHeadingPopup/SortDescending", diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h index a7afdfa769..7f69ed98e6 100644 --- a/ui/qt/main_window.h +++ b/ui/qt/main_window.h @@ -100,6 +100,9 @@ private: void importCaptureFile(); void saveCaptureFile(capture_file *cf, bool stay_closed); void saveAsCaptureFile(capture_file *cf, bool must_support_comments, bool stay_closed); + void exportSelectedPackets(); + + void fileAddExtension(QString &file_name, int file_type, bool compressed); bool testCaptureFileClose(bool from_quit = false, QString& before_what = *new QString()); void captureStop(); @@ -155,6 +158,7 @@ private slots: void on_actionFileSetListFiles_triggered(); void on_actionFileSetNextFile_triggered(); void on_actionFileSetPreviousFile_triggered(); + void on_actionFileExportPackets_triggered(); void on_actionGoGoToPacket_triggered(); void resetPreviousFocus(); diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp index 528905db52..f6e00f0ad3 100644 --- a/ui/qt/main_window_slots.cpp +++ b/ui/qt/main_window_slots.cpp @@ -78,7 +78,7 @@ void MainWindow::openCaptureFile(QString &cf_path) for (;;) { if (cf_path.isEmpty()) { - CaptureFileDialog open_dlg(this, display_filter); + CaptureFileDialog open_dlg(this, cap_file_, display_filter); switch (prefs.gui_fileopen_style) { @@ -537,6 +537,11 @@ void MainWindow::on_actionFileSaveAs_triggered() saveAsCaptureFile(cap_file_, FALSE, TRUE); } +void MainWindow::on_actionFileExportPackets_triggered() +{ + exportSelectedPackets(); +} + void MainWindow::on_actionFileSetListFiles_triggered() { file_set_dialog_.exec(); diff --git a/ui/qt/packet_range_group_box.cpp b/ui/qt/packet_range_group_box.cpp new file mode 100644 index 0000000000..9d8198eaee --- /dev/null +++ b/ui/qt/packet_range_group_box.cpp @@ -0,0 +1,331 @@ +/* packet_range_group_box.cpp + * + * $Id: capture_file_dialog.h 45164 2012-09-27 02:43:09Z eapache $ + * + * 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 "packet_range_group_box.h" +#include "ui_packet_range_group_box.h" + +#include <QDebug> +PacketRangeGroupBox::PacketRangeGroupBox(QWidget *parent) : + QGroupBox(parent), + pr_ui_(new Ui::PacketRangeGroupBox), + range_(NULL), + syntax_state_(SyntaxLineEdit::Empty) +{ + pr_ui_->setupUi(this); + + pr_ui_->displayedButton->setChecked(true); + pr_ui_->allButton->setChecked(true); +} + +PacketRangeGroupBox::~PacketRangeGroupBox() +{ + delete pr_ui_; +} + +void PacketRangeGroupBox::initRange(packet_range_t *range) { + if (!range) return; + + range_ = range; + + if (range_->process_filtered) { + pr_ui_->displayedButton->setChecked(true); + } else { + pr_ui_->capturedButton->setChecked(true); + } + + if (range_->user_range) { + pr_ui_->rangeLineEdit->setText(range_convert_range(range_->user_range)); + } + updateCounts(); +} + +bool PacketRangeGroupBox::isValid() { + if (pr_ui_->rangeButton->isChecked() && syntax_state_ != SyntaxLineEdit::Empty) { + return false; + } + return true; +} + +void PacketRangeGroupBox::updateCounts() { + SyntaxLineEdit::SyntaxState orig_ss = syntax_state_; + bool displayed_checked = pr_ui_->displayedButton->isChecked(); + int selected_num; + bool can_select; + bool selected_packets; + int ignored_cnt = 0, displayed_ignored_cnt = 0; + int label_count; + + if (!range_ || !range_->cf) return; + + if (range_->displayed_cnt != 0) { + pr_ui_->displayedButton->setEnabled(true); + } else { + displayed_checked = false; + pr_ui_->capturedButton->setChecked(true); + pr_ui_->displayedButton->setEnabled(false); + } + + // All / Captured + pr_ui_->allCapturedLabel->setEnabled(!displayed_checked); + label_count = range_->cf->count; + if (range_->remove_ignored) { + label_count -= range_->ignored_cnt; + } + pr_ui_->allCapturedLabel->setText(QString("%1").arg(label_count)); + + // All / Displayed + pr_ui_->allDisplayedLabel->setEnabled(displayed_checked); + if (range_->include_dependents) { + label_count = range_->displayed_plus_dependents_cnt; + } else { + label_count = range_->displayed_cnt; + } + if (range_->remove_ignored) { + label_count -= range_->displayed_ignored_cnt; + } + pr_ui_->allDisplayedLabel->setText(QString("%1").arg(label_count)); + + // Selected / Captured + Displayed + selected_num = (range_->cf->current_frame) ? range_->cf->current_frame->num : 0; + can_select = (selected_num != 0); + if (can_select) { + pr_ui_->selectedButton->setEnabled(true); + pr_ui_->selectedCapturedLabel->setEnabled(!displayed_checked); + pr_ui_->selectedDisplayedLabel->setEnabled(displayed_checked); + } else { + if (range_->process == range_process_selected) { + pr_ui_->allButton->setChecked(true); + } + pr_ui_->selectedButton->setEnabled(false); + pr_ui_->selectedCapturedLabel->setEnabled(false); + pr_ui_->selectedDisplayedLabel->setEnabled(false); + } + if ((range_->remove_ignored && can_select && range_->cf->current_frame->flags.ignored) || selected_num < 1) { + pr_ui_->selectedCapturedLabel->setText("0"); + pr_ui_->selectedDisplayedLabel->setText("0"); + } else { + pr_ui_->selectedCapturedLabel->setText("1"); + pr_ui_->selectedDisplayedLabel->setText("1"); + } + + // Marked / Captured + Displayed + if (displayed_checked) { + selected_packets = (range_->displayed_marked_cnt != 0); + } else { + selected_packets = (range_->cf->marked_count > 0); + } + if (selected_packets) { + pr_ui_->markedButton->setEnabled(true); + pr_ui_->markedCapturedLabel->setEnabled(!displayed_checked); + pr_ui_->markedDisplayedLabel->setEnabled(displayed_checked); + } else { + if (range_->process == range_process_marked) { + pr_ui_->allButton->setChecked(true); + } + pr_ui_->markedButton->setEnabled(false); + pr_ui_->markedCapturedLabel->setEnabled(false); + pr_ui_->markedDisplayedLabel->setEnabled(false); + } + label_count = range_->cf->marked_count; + if (range_->remove_ignored) { + label_count -= range_->ignored_marked_cnt; + } + pr_ui_->markedCapturedLabel->setText(QString("%1").arg(label_count)); + label_count = range_->cf->marked_count; + if (range_->remove_ignored) { + label_count -= range_->displayed_ignored_marked_cnt; + } + pr_ui_->markedDisplayedLabel->setText(QString("%1").arg(label_count)); + + // First to last marked / Captured + Displayed + if (displayed_checked) { + selected_packets = (range_->displayed_mark_range_cnt != 0); + } else { + selected_packets = (range_->mark_range_cnt != 0); + } + if (selected_packets) { + pr_ui_->ftlMarkedButton->setEnabled(true); + pr_ui_->ftlCapturedLabel->setEnabled(!displayed_checked); + pr_ui_->ftlDisplayedLabel->setEnabled(displayed_checked); + } else { + if (range_->process == range_process_marked_range) { + pr_ui_->allButton->setChecked(true); + } + pr_ui_->ftlMarkedButton->setEnabled(false); + pr_ui_->ftlCapturedLabel->setEnabled(false); + pr_ui_->ftlDisplayedLabel->setEnabled(false); + } + label_count = range_->mark_range_cnt; + if (range_->remove_ignored) { + label_count -= range_->ignored_mark_range_cnt; + } + pr_ui_->ftlCapturedLabel->setText(QString("%1").arg(label_count)); + label_count = range_->displayed_mark_range_cnt; + if (range_->remove_ignored) { + label_count -= range_->displayed_ignored_mark_range_cnt; + } + pr_ui_->ftlDisplayedLabel->setText(QString("%1").arg(label_count)); + + // User specified / Captured + Displayed + + pr_ui_->rangeButton->setEnabled(true); + pr_ui_->rangeCapturedLabel->setEnabled(!displayed_checked); + pr_ui_->rangeDisplayedLabel->setEnabled(displayed_checked); + + packet_range_convert_str(range_, pr_ui_->rangeLineEdit->text().toUtf8().constData()); + + switch (packet_range_check(range_)) { + + case CVT_NO_ERROR: + label_count = range_->user_range_cnt; + if (range_->remove_ignored) { + label_count -= range_->ignored_user_range_cnt; + } + pr_ui_->rangeCapturedLabel->setText(QString("%1").arg(label_count)); + label_count = range_->displayed_user_range_cnt; + if (range_->remove_ignored) { + label_count -= range_->displayed_ignored_user_range_cnt; + } + pr_ui_->rangeDisplayedLabel->setText(QString("%1").arg(label_count)); + syntax_state_ = SyntaxLineEdit::Empty; + break; + + case CVT_SYNTAX_ERROR: + pr_ui_->rangeCapturedLabel->setText("<small><i>Bad range</i></small>"); + pr_ui_->rangeDisplayedLabel->setText("-"); + syntax_state_ = SyntaxLineEdit::Invalid; + break; + + case CVT_NUMBER_TOO_BIG: + pr_ui_->rangeCapturedLabel->setText("<small><i>Number too large</i></small>"); + pr_ui_->rangeDisplayedLabel->setText("-"); + syntax_state_ = SyntaxLineEdit::Invalid; + break; + + default: + g_assert_not_reached(); + return; + } + + // Ignored + switch(range_->process) { + case(range_process_all): + ignored_cnt = range_->ignored_cnt; + displayed_ignored_cnt = range_->displayed_ignored_cnt; + break; + case(range_process_selected): + ignored_cnt = (can_select && range_->cf->current_frame->flags.ignored) ? 1 : 0; + displayed_ignored_cnt = ignored_cnt; + break; + case(range_process_marked): + ignored_cnt = range_->ignored_marked_cnt; + displayed_ignored_cnt = range_->displayed_ignored_marked_cnt; + break; + case(range_process_marked_range): + ignored_cnt = range_->ignored_mark_range_cnt; + displayed_ignored_cnt = range_->displayed_ignored_mark_range_cnt; + break; + case(range_process_user_range): + ignored_cnt = range_->ignored_user_range_cnt; + displayed_ignored_cnt = range_->displayed_ignored_user_range_cnt; + break; + default: + g_assert_not_reached(); + } + + if (displayed_checked) + selected_packets = (displayed_ignored_cnt != 0); + else + selected_packets = (ignored_cnt != 0); + + if (selected_packets) { + pr_ui_->ignoredCheckBox->setEnabled(true); + pr_ui_->ignoredCapturedLabel->setEnabled(!displayed_checked); + pr_ui_->ignoredDisplayedLabel->setEnabled(displayed_checked); + } else { + pr_ui_->ignoredCheckBox->setEnabled(false); + pr_ui_->ignoredCapturedLabel->setEnabled(false); + pr_ui_->ignoredDisplayedLabel->setEnabled(false); + } + pr_ui_->ignoredCapturedLabel->setText(QString("%1").arg(ignored_cnt)); + pr_ui_->ignoredDisplayedLabel->setText(QString("%1").arg(displayed_ignored_cnt)); + + if (orig_ss != syntax_state_) { + pr_ui_->rangeLineEdit->setSyntaxState(syntax_state_); + emit validityChanged(isValid()); + } +} + +// Slots + +void PacketRangeGroupBox::on_rangeLineEdit_textChanged(const QString &range_str) +{ + Q_UNUSED(range_str) + if (!pr_ui_->rangeButton->isChecked()) { + pr_ui_->rangeButton->setChecked(true); + } else { + updateCounts(); + } +} + +void PacketRangeGroupBox::processButtonToggled(bool checked, packet_range_e process) { + if (checked && range_) { + range_->process = process; + } + updateCounts(); +} + +void PacketRangeGroupBox::on_allButton_toggled(bool checked) +{ + processButtonToggled(checked, range_process_all); +} + +void PacketRangeGroupBox::on_selectedButton_toggled(bool checked) +{ + processButtonToggled(checked, range_process_selected); +} + +void PacketRangeGroupBox::on_markedButton_toggled(bool checked) +{ + processButtonToggled(checked, range_process_marked); +} + +void PacketRangeGroupBox::on_ftlMarkedButton_toggled(bool checked) +{ + processButtonToggled(checked, range_process_marked_range); +} + +void PacketRangeGroupBox::on_rangeButton_toggled(bool checked) +{ + processButtonToggled(checked, range_process_user_range); +} + +void PacketRangeGroupBox::on_capturedButton_toggled(bool checked) +{ + if (checked) updateCounts(); +} + +void PacketRangeGroupBox::on_displayedButton_toggled(bool checked) +{ + if (checked) updateCounts(); +} diff --git a/ui/qt/packet_range_group_box.h b/ui/qt/packet_range_group_box.h new file mode 100644 index 0000000000..863ccf6053 --- /dev/null +++ b/ui/qt/packet_range_group_box.h @@ -0,0 +1,78 @@ +/* packet_range_group_box.h + * + * $Id: capture_file_dialog.h 45164 2012-09-27 02:43:09Z eapache $ + * + * 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 PACKET_RANGE_GROUP_BOX_H +#define PACKET_RANGE_GROUP_BOX_H + +#include "config.h" + +#include <glib.h> + +#include "packet-range.h" + +#include "syntax_line_edit.h" +#include <QGroupBox> + +namespace Ui { +class PacketRangeGroupBox; +} + +class PacketRangeGroupBox : public QGroupBox +{ + Q_OBJECT + +public: + explicit PacketRangeGroupBox(QWidget *parent = 0); + ~PacketRangeGroupBox(); + void initRange(packet_range_t *range); + bool isValid(); + +signals: + void validityChanged(bool is_valid); + +private: + void updateCounts(); + void processButtonToggled(bool checked, packet_range_e process); + + Ui::PacketRangeGroupBox *pr_ui_; + packet_range_t *range_; + SyntaxLineEdit::SyntaxState syntax_state_; + +private slots: + void on_rangeLineEdit_textChanged(const QString &range_str); + + void on_allButton_toggled(bool checked); + + void on_selectedButton_toggled(bool checked); + + void on_markedButton_toggled(bool checked); + + void on_ftlMarkedButton_toggled(bool checked); + + void on_rangeButton_toggled(bool checked); + + void on_capturedButton_toggled(bool checked); + void on_displayedButton_toggled(bool checked); +}; + +#endif // PACKET_RANGE_GROUP_BOX_H diff --git a/ui/qt/packet_range_group_box.ui b/ui/qt/packet_range_group_box.ui new file mode 100644 index 0000000000..b1b10aa5b9 --- /dev/null +++ b/ui/qt/packet_range_group_box.ui @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PacketRangeGroupBox</class> + <widget class="QGroupBox" name="PacketRangeGroupBox"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>454</width> + <height>241</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <property name="title"> + <string>Packet Range</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="2" column="3"> + <widget class="QLabel" name="selectedDisplayedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QRadioButton" name="displayedButton"> + <property name="text"> + <string>Displayed</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <attribute name="buttonGroup"> + <string notr="true">capturedDisplayedButtonGroup</string> + </attribute> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="allCapturedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <widget class="QRadioButton" name="markedButton"> + <property name="text"> + <string>&Marked packets only</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">packetSelectionButtonGroup</string> + </attribute> + </widget> + </item> + <item row="5" column="0"> + <widget class="QRadioButton" name="rangeButton"> + <property name="text"> + <string>&Range:</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">packetSelectionButtonGroup</string> + </attribute> + </widget> + </item> + <item row="5" column="3"> + <widget class="QLabel" name="rangeDisplayedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="7" column="0" colspan="2"> + <widget class="QCheckBox" name="ignoredCheckBox"> + <property name="text"> + <string>Remove &ignored packets</string> + </property> + </widget> + </item> + <item row="3" column="3"> + <widget class="QLabel" name="markedDisplayedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="4" column="0" colspan="2"> + <widget class="QRadioButton" name="ftlMarkedButton"> + <property name="text"> + <string>First &to last marked</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">packetSelectionButtonGroup</string> + </attribute> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="selectedCapturedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QRadioButton" name="allButton"> + <property name="text"> + <string>&All packets</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">packetSelectionButtonGroup</string> + </attribute> + </widget> + </item> + <item row="4" column="2"> + <widget class="QLabel" name="ftlCapturedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QLabel" name="allDisplayedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="5" column="2"> + <widget class="QLabel" name="rangeCapturedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QRadioButton" name="selectedButton"> + <property name="text"> + <string>&Selected packets only</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">packetSelectionButtonGroup</string> + </attribute> + </widget> + </item> + <item row="0" column="2"> + <widget class="QRadioButton" name="capturedButton"> + <property name="text"> + <string>Captured</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <attribute name="buttonGroup"> + <string notr="true">capturedDisplayedButtonGroup</string> + </attribute> + </widget> + </item> + <item row="3" column="2"> + <widget class="QLabel" name="markedCapturedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="0"> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>63</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="5" column="1"> + <widget class="SyntaxLineEdit" name="rangeLineEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="4" column="3"> + <widget class="QLabel" name="ftlDisplayedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="7" column="2"> + <widget class="QLabel" name="ignoredCapturedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="7" column="3"> + <widget class="QLabel" name="ignoredDisplayedLabel"> + <property name="text"> + <string>-</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>SyntaxLineEdit</class> + <extends>QLineEdit</extends> + <header>syntax_line_edit.h</header> + </customwidget> + </customwidgets> + <resources/> + <connections/> + <buttongroups> + <buttongroup name="packetSelectionButtonGroup"/> + <buttongroup name="capturedDisplayedButtonGroup"/> + </buttongroups> +</ui> diff --git a/ui/qt/syntax_line_edit.cpp b/ui/qt/syntax_line_edit.cpp new file mode 100644 index 0000000000..24e59ff617 --- /dev/null +++ b/ui/qt/syntax_line_edit.cpp @@ -0,0 +1,49 @@ +#include "syntax_line_edit.h" + +#include "tango_colors.h" +#include <QDebug> + +SyntaxLineEdit::SyntaxLineEdit(QWidget *parent) : + QLineEdit(parent) +{ + state_style_sheet_ = QString( + "SyntaxLineEdit[syntaxState=\"%1\"] {" + " color: #%4;" + " background-color: #%5;" + "}" + + "SyntaxLineEdit[syntaxState=\"%2\"] {" + " color: #%4;" + " background-color: #%6;" + "}" + + "SyntaxLineEdit[syntaxState=\"%3\"] {" + " color: #%4;" + " background-color: #%7;" + "}" + ) + .arg(Invalid) + .arg(Deprecated) + .arg(Valid) + .arg(tango_aluminium_6, 6, 16, QChar('0')) // Foreground + .arg(tango_scarlet_red_1, 6, 16, QChar('0')) // Invalid + .arg(tango_butter_1, 6, 16, QChar('0')) // Deprecated + .arg(tango_chameleon_1, 6, 16, QChar('0')) // Valid + ; + setStyleSheet(tr("")); + setSyntaxState(); +} + +void SyntaxLineEdit::setSyntaxState(SyntaxState state) { + syntax_state_ = state; + setStyleSheet(style_sheet_); +} + +QString SyntaxLineEdit::styleSheet() const { + return style_sheet_; +} + +void SyntaxLineEdit::setStyleSheet(const QString &style_sheet) { + style_sheet_ = style_sheet; + QLineEdit::setStyleSheet(style_sheet_ + state_style_sheet_); +} diff --git a/ui/qt/syntax_line_edit.h b/ui/qt/syntax_line_edit.h new file mode 100644 index 0000000000..d41164ef0f --- /dev/null +++ b/ui/qt/syntax_line_edit.h @@ -0,0 +1,30 @@ +#ifndef SYNTAX_LINE_EDIT_H +#define SYNTAX_LINE_EDIT_H + +#include <QLineEdit> + +class SyntaxLineEdit : public QLineEdit +{ + Q_OBJECT + Q_PROPERTY(SyntaxState syntaxState READ syntaxState) + Q_ENUMS(SyntaxState) +public: + explicit SyntaxLineEdit(QWidget *parent = 0); + enum SyntaxState { Empty, Invalid, Deprecated, Valid }; + + SyntaxState syntaxState() const { return syntax_state_; } + void setSyntaxState(SyntaxState state = Empty); + QString styleSheet() const; + +private: + SyntaxState syntax_state_; + QString style_sheet_; + QString state_style_sheet_; + +signals: + +public slots: + void setStyleSheet(const QString &style_sheet); +}; + +#endif // SYNTAX_LINE_EDIT_H diff --git a/ui/qt/tango_colors.h b/ui/qt/tango_colors.h index df57fd3a4e..da2cf1bf41 100644 --- a/ui/qt/tango_colors.h +++ b/ui/qt/tango_colors.h @@ -26,28 +26,9 @@ #define __TANGO_COLORS_H__ // http://tango.freedesktop.org/Tango_Icon_Theme_Guidelines +// with added hues from http://emilis.info/other/extended_tango/ +// (all colors except aluminium) -const QRgb tango_butter_1 = 0xfce94f; -const QRgb tango_butter_2 = 0xedd400; -const QRgb tango_butter_3 = 0xc4a000; -const QRgb tango_chameleon_1 = 0x8ae234; -const QRgb tango_chameleon_2 = 0x73d216; -const QRgb tango_chameleon_3 = 0x4e9a06; -const QRgb tango_orange_1 = 0xfcaf3e; -const QRgb tango_orange_2 = 0xf57900; -const QRgb tango_orange_3 = 0xce5c00; -const QRgb tango_sky_blue_1 = 0x729fcf; -const QRgb tango_sky_blue_2 = 0x3465a4; -const QRgb tango_sky_blue_3 = 0x204a87; -const QRgb tango_plum_1 = 0xad7fa8; -const QRgb tango_plum_2 = 0x75507b; -const QRgb tango_plum_3 = 0x5c3566; -const QRgb tango_chocolate_1 = 0xe9b96e; -const QRgb tango_chocolate_2 = 0xc17d11; -const QRgb tango_chocolate_3 = 0x8f5902; -const QRgb tango_scarlet_red_1 = 0xef2929; -const QRgb tango_scarlet_red_2 = 0xcc0000; -const QRgb tango_scarlet_red_3 = 0xa40000; const QRgb tango_aluminium_1 = 0xeeeeec; const QRgb tango_aluminium_2 = 0xd3d7cf; const QRgb tango_aluminium_3 = 0xbabdb6; @@ -55,4 +36,53 @@ const QRgb tango_aluminium_4 = 0x888a85; const QRgb tango_aluminium_5 = 0x555753; const QRgb tango_aluminium_6 = 0x2e3436; +const QRgb tango_butter_1 = 0xfeffd0; +const QRgb tango_butter_2 = 0xfffc9c; +const QRgb tango_butter_3 = 0xfce94f; +const QRgb tango_butter_4 = 0xedd400; +const QRgb tango_butter_5 = 0xc4a000; +const QRgb tango_butter_6 = 0x725000; + +const QRgb tango_chameleon_1 = 0xe4ffc7; +const QRgb tango_chameleon_2 = 0xb7f774; +const QRgb tango_chameleon_3 = 0x8ae234; +const QRgb tango_chameleon_4 = 0x73d216; +const QRgb tango_chameleon_5 = 0x4e9a06; +const QRgb tango_chameleon_6 = 0x2a5703; + +const QRgb tango_chocolate_1 = 0xfaf0d7; +const QRgb tango_chocolate_2 = 0xefd0a7; +const QRgb tango_chocolate_3 = 0xe9b96e; +const QRgb tango_chocolate_4 = 0xc17d11; +const QRgb tango_chocolate_5 = 0x8f5902; +const QRgb tango_chocolate_6 = 0x503000; + +const QRgb tango_orange_1 = 0xfff0d7; +const QRgb tango_orange_2 = 0xffd797; +const QRgb tango_orange_3 = 0xfcaf3e; +const QRgb tango_orange_4 = 0xf57900; +const QRgb tango_orange_5 = 0xce5c00; +const QRgb tango_orange_6 = 0x8c3700; + +const QRgb tango_plum_1 = 0xfce0ff; +const QRgb tango_plum_2 = 0xe0c0e4; +const QRgb tango_plum_3 = 0xad7fa8; +const QRgb tango_plum_4 = 0x75507b; +const QRgb tango_plum_5 = 0x5c3566; +const QRgb tango_plum_6 = 0x371740; + +const QRgb tango_scarlet_red_1 = 0xffcccc; +const QRgb tango_scarlet_red_2 = 0xf78787; +const QRgb tango_scarlet_red_3 = 0xef2929; +const QRgb tango_scarlet_red_4 = 0xcc0000; +const QRgb tango_scarlet_red_5 = 0xa40000; +const QRgb tango_scarlet_red_6 = 0x600000; + +const QRgb tango_sky_blue_1 = 0xdaeeff; +const QRgb tango_sky_blue_2 = 0x97c4f0; +const QRgb tango_sky_blue_3 = 0x729fcf; +const QRgb tango_sky_blue_4 = 0x3465a4; +const QRgb tango_sky_blue_5 = 0x204a87; +const QRgb tango_sky_blue_6 = 0x0a3050; + #endif // __TANGO_COLORS_H__ diff --git a/ui/win32/file_dlg_win32.c b/ui/win32/file_dlg_win32.c index 2afbd86b1e..a553bea00f 100644 --- a/ui/win32/file_dlg_win32.c +++ b/ui/win32/file_dlg_win32.c @@ -1795,7 +1795,7 @@ export_specified_packets_file_hook_proc(HWND sf_hwnd, UINT msg, WPARAM w_param, if (files_identical(cfile.filename, file_name8_selected)) { /* XXX: Is MessageBox the best way to pop up an error ? How to make text bold ? */ gchar *str = g_strdup_printf( - "Capture File \"%s\" identical to loaded file !!\n\n" + "Capture File \"%s\" identical to loaded file.\n\n" "Please choose a different filename.", file_name8_selected); MessageBox( parent, utf_8to16(str), _T("Error"), MB_ICONERROR | MB_APPLMODAL | MB_OK); |