diff options
author | Gerald Combs <gerald@wireshark.org> | 2012-09-17 23:40:53 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2012-09-17 23:40:53 +0000 |
commit | 3069f22bd1b84b56225e959a6e2ccbb09c53bdbe (patch) | |
tree | e418e2d77571601bd6ae0d685793095b3a41f82c /ui | |
parent | 06499e6dd0043609acff788fffba8eb9d6f744d9 (diff) | |
download | wireshark-3069f22bd1b84b56225e959a6e2ccbb09c53bdbe.tar.gz wireshark-3069f22bd1b84b56225e959a6e2ccbb09c53bdbe.tar.bz2 wireshark-3069f22bd1b84b56225e959a6e2ccbb09c53bdbe.zip |
Add a text import dialog. Use libui.
svn path=/trunk/; revision=44956
Diffstat (limited to 'ui')
-rw-r--r-- | ui/qt/QtShark.pro | 16 | ||||
-rw-r--r-- | ui/qt/import_text_dialog.cpp | 446 | ||||
-rw-r--r-- | ui/qt/import_text_dialog.h | 90 | ||||
-rw-r--r-- | ui/qt/import_text_dialog.ui | 461 | ||||
-rw-r--r-- | ui/qt/main.cpp | 34 | ||||
-rw-r--r-- | ui/qt/main_window.cpp | 29 | ||||
-rw-r--r-- | ui/qt/main_window.h | 3 | ||||
-rw-r--r-- | ui/qt/qt_ui_utils.h | 1 | ||||
-rw-r--r-- | ui/qt/wireshark_application.cpp | 67 | ||||
-rw-r--r-- | ui/qt/wireshark_application.h | 3 | ||||
-rw-r--r-- | ui/text_import.h | 19 | ||||
-rw-r--r-- | ui/text_import_scanner.h | 14 |
12 files changed, 1127 insertions, 56 deletions
diff --git a/ui/qt/QtShark.pro b/ui/qt/QtShark.pro index a9b8a6c959..8e58514e75 100644 --- a/ui/qt/QtShark.pro +++ b/ui/qt/QtShark.pro @@ -134,9 +134,6 @@ win32:INCLUDEPATH += \ # We have to manually trigger relinking each time one of these is modified. # Is there any way to do this automatically? SOURCES_WS_C = \ - ../alert_box.c \ - ../iface_lists.c \ - ../util.c \ ../../airpcap_loader.c \ ../../capture-pcap-util.c \ ../../capture.c \ @@ -239,7 +236,8 @@ HEADERS_QT_CPP = \ wireshark_application.h FORMS += main_window.ui \ - main_welcome.ui + main_welcome.ui \ + import_text_dialog.ui win32 { ## These should be in config.pri ?? !isEmpty(PORTAUDIO_DIR) { @@ -285,7 +283,7 @@ macx:QMAKE_LFLAGS += \ -framework CoreServices \ -framework ApplicationServices -framework CoreFoundation -framework CoreServices -unix:LIBS += -L../../lib -Wl,-rpath ../../lib -lwireshark -lwiretap -lwsutil \ +unix:LIBS += -L../../lib -Wl,-rpath ../../lib -lwireshark -lwiretap -lwsutil -lui \ -lpcap macx:LIBS += -Wl,-macosx_version_min,10.5 -liconv @@ -318,6 +316,7 @@ win32 { LIBS += \ wsock32.lib user32.lib shell32.lib comctl32.lib comdlg32.lib \ -L../../epan -llibwireshark -L../../wsutil -llibwsutil -L../../wiretap -lwiretap-$${WTAP_VERSION} \ + -L.. -llibui \ -L$${GLIB_DIR}/lib -lglib-2.0 -lgmodule-2.0 !isEmpty(MSVCR_DLL) { @@ -366,7 +365,6 @@ win32 { #QMAKE_POST_LINK +=$$quote(cd $$replace(PLUGINS_IN_PWD, /, \\)\\..\\..\\plugins$$escape_expand(\\n\\t)) #QMAKE_POST_LINK +=$$quote(nmake -f Makefile.nmake INSTALL_DIR=$$replace(PLUGINS_OUT_PWD, /, \\)\\$(DESTDIR)$$escape_expand(\\n\\t)) #QMAKE_POST_LINK +=$$quote(cd $$replace(PLUGINS_IN_PWD, /, \\)$$escape_expand(\\n\\t)) - } RESOURCES += \ @@ -385,3 +383,9 @@ ICON = ../../packaging/macosx/Resources/Wireshark.icns RC_FILE = qtshark.rc win32: QMAKE_CLEAN += *.pdb + +HEADERS += \ + import_text_dialog.h + +SOURCES += \ + import_text_dialog.cpp diff --git a/ui/qt/import_text_dialog.cpp b/ui/qt/import_text_dialog.cpp new file mode 100644 index 0000000000..3436c094c7 --- /dev/null +++ b/ui/qt/import_text_dialog.cpp @@ -0,0 +1,446 @@ +/* import_text_dialog.cpp + * + * $Id: capture_file_dialog.cpp 44864 2012-09-10 23:03:22Z gerald $ + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <time.h> + +#include <import_text_dialog.h> + +#include "wiretap/wtap.h" +#include "wiretap/pcap-encap.h" + +#include <epan/prefs.h> + +#include "ui/text_import_scanner.h" +#include "ui/last_open_dir.h" +#include "ui/alert_box.h" + +#include "file.h" +#include "wsutil/file_util.h" +#include "tempfile.h" + +#include <ui_import_text_dialog.h> +#include <wireshark_application.h> + +#include <QFileDialog> +#include <QDebug> +#include <QFile> +#include <QMessageBox> + +ImportTextDialog::ImportTextDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::ImportTextDialog), + import_info_() +{ + int encap; + int i; + + ui->setupUi(this); + memset(&import_info_, 0, sizeof(import_info_)); + + ok_button_ = 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); +#endif + + on_dateTimeLineEdit_textChanged(ui->dateTimeLineEdit->text()); + + for (i = 0; i < ui->headerGridLayout->count(); i++) { + QRadioButton *rb = qobject_cast<QRadioButton *>(ui->headerGridLayout->itemAt(i)->widget()); + + if (rb) encap_buttons_.append(rb); + } + + /* Scan all Wiretap encapsulation types */ + import_info_.encapsulation = WTAP_ENCAP_ETHERNET; + for (encap = import_info_.encapsulation; encap < wtap_get_num_encap_types(); encap++) + { + /* Check if we can write to a PCAP file + * + * Exclude wtap encapsulations that require a pseudo header, + * because we won't setup one from the text we import and + * wiretap doesn't allow us to write 'raw' frames + */ + if ((wtap_wtap_encap_to_pcap_encap(encap) > 0) && !wtap_encap_requires_phdr(encap)) { + const char *name; + /* If it has got a name */ + if ((name = wtap_encap_string(encap))) + { + ui->encapComboBox->addItem(name, QVariant(encap)); + } + } + } +} + +ImportTextDialog::~ImportTextDialog() +{ + delete ui; +} + +QString &ImportTextDialog::capfileName() { + return capfile_name_; +} + +void ImportTextDialog::convertTextFile() { + int import_file_fd; + char *tmpname; + int err; + + capfile_name_.clear(); + /* Choose a random name for the temporary import buffer */ + import_file_fd = create_tempfile(&tmpname, "import"); + capfile_name_.append(tmpname); + + import_info_.wdh = wtap_dump_fdopen(import_file_fd, WTAP_FILE_PCAP, import_info_.encapsulation, import_info_.max_frame_length, FALSE, &err); + qDebug() << capfile_name_ << ":" << import_info_.wdh << import_info_.encapsulation << import_info_.max_frame_length; + if (import_info_.wdh == NULL) { + open_failure_alert_box(capfile_name_.toUtf8().constData(), err, TRUE); + fclose(import_info_.import_text_file); + setResult(QDialog::Rejected); + return; + } + + text_import_setup(&import_info_); + + text_importin = import_info_.import_text_file; + + text_importlex(); + + text_import_cleanup(); + + if (fclose(import_info_.import_text_file)) + { + read_failure_alert_box(import_info_.import_text_filename, errno); + } + + if (!wtap_dump_close(import_info_.wdh, &err)) + { + write_failure_alert_box(capfile_name_.toUtf8().constData(), err); + } +} + + +void ImportTextDialog::enableHeaderWidgets(bool enable_buttons) { + bool ethertype = false; + bool ipv4_proto = false; + bool port = false; + bool sctp_tag = false; + bool sctp_ppi = false; + + if (enable_buttons) { + if (ui->ethernetButton->isChecked()) { + ethertype = true; + on_ethertypeLineEdit_textChanged(ui->ethertypeLabel->text()); + } else if (ui->ipv4Button->isChecked()) { + ipv4_proto = true; + on_protocolLineEdit_textChanged(ui->protocolLineEdit->text()); + } else if (ui->udpButton->isChecked() || ui->tcpButton->isChecked()) { + port = true; + on_sourcePortLineEdit_textChanged(ui->sourcePortLineEdit->text()); + on_destinationPortLineEdit_textChanged(ui->destinationPortLineEdit->text()); + } else if (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()); + } + if (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()); + } + } + + foreach (QRadioButton *rb, encap_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); +} + +void ImportTextDialog::exec() { + QVariant encap_val; + + QDialog::exec(); + + if (result() != QDialog::Accepted) { + return; + } + + import_info_.import_text_filename = 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); + setResult(QDialog::Rejected); + return; + } + + import_info_.offset_type = + ui->hexOffsetButton->isChecked() ? OFFSET_HEX : + ui->decimalOffsetButton->isChecked() ? OFFSET_DEC : + 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(); + + encap_val = ui->encapComboBox->itemData(ui->encapComboBox->currentIndex()); + import_info_.dummy_header_type = HEADER_NONE; + if (encap_val.isValid() && encap_val.toUInt() == WTAP_ENCAP_ETHERNET && !ui->noDummyButton->isChecked()) { + // Inputs were validated in the on_xxx_textChanged slots. + if (ui->ethernetButton->isChecked()) { + import_info_.dummy_header_type = HEADER_ETH; + } else if (ui->ipv4Button->isChecked()) { + import_info_.dummy_header_type = HEADER_IPV4; + } else if(ui->udpButton->isChecked()) { + import_info_.dummy_header_type = HEADER_UDP; + } else if(ui->tcpButton->isChecked()) { + import_info_.dummy_header_type = HEADER_TCP; + } else if(ui->sctpButton->isChecked()) { + import_info_.dummy_header_type = HEADER_SCTP; + } else if(ui->sctpDataButton->isChecked()) { + import_info_.dummy_header_type = HEADER_SCTP_DATA; + } + } + if (import_info_.max_frame_length == 0) { + import_info_.max_frame_length = IMPORT_MAX_PACKET; + } + + convertTextFile(); +} + +void ImportTextDialog::on_textFileBrowseButton_clicked() +{ + char *open_dir = NULL; + + 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() */ + open_dir = get_last_open_dir(); + 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') + open_dir = prefs.gui_fileopen_dir; + break; + } + + QString file_name = QFileDialog::getOpenFileName(this, "Wireshark: Import text file", open_dir); + ui->textFileLineEdit->setText(file_name); +} + +void ImportTextDialog::on_textFileLineEdit_textChanged(const QString &file_name) +{ + QFile *text_file; + + text_file = new QFile(file_name); + if (text_file->open(QIODevice::ReadOnly)) { + ok_button_->setEnabled(true); + text_file->close(); + } else { + ok_button_->setEnabled(false); + } +} + +void ImportTextDialog::on_encapComboBox_currentIndexChanged(int index) +{ + QVariant val = ui->encapComboBox->itemData(index); + bool enabled = false; + + if (val != QVariant::Invalid) { + import_info_.encapsulation = val.toUInt(); + + if (import_info_.encapsulation == WTAP_ENCAP_ETHERNET) enabled = true; + } + + enableHeaderWidgets(enabled); +} + +void ImportTextDialog::on_dateTimeLineEdit_textChanged(const QString &time_format) +{ + if (time_format.length() > 0) { + time_t cur_time; + struct tm *cur_tm; + char time_str[100]; + + time(&cur_time); + cur_tm = localtime(&cur_time); + strftime(time_str, 100, ui->dateTimeLineEdit->text().toUtf8().constData(), cur_tm); + ui->timestampExampleLabel->setText(QString("Example: %1").arg(time_str)); + } else { + ui->timestampExampleLabel->setText("<i>(No format will be applied)</i>"); + } +} + +void ImportTextDialog::on_noDummyButton_toggled(bool checked) +{ + if (checked) enableHeaderWidgets(); +} + +void ImportTextDialog::on_ethernetButton_toggled(bool checked) +{ + on_noDummyButton_toggled(checked); +} + +void ImportTextDialog::on_ipv4Button_toggled(bool checked) +{ + on_noDummyButton_toggled(checked); +} + +void ImportTextDialog::on_udpButton_toggled(bool checked) +{ + on_noDummyButton_toggled(checked); +} + +void ImportTextDialog::on_tcpButton_toggled(bool checked) +{ + on_noDummyButton_toggled(checked); +} + +void ImportTextDialog::on_sctpButton_toggled(bool checked) +{ + on_noDummyButton_toggled(checked); +} + +void ImportTextDialog::on_sctpDataButton_toggled(bool checked) +{ + on_noDummyButton_toggled(checked); +} + +void ImportTextDialog::on_ethertypeLineEdit_textChanged(const QString ðertype_str) +{ + bool conv_ok; + + import_info_.pid = ethertype_str.toUShort(&conv_ok, 16); + if (conv_ok && import_info_.pid <= 0xffff) { + ok_button_->setEnabled(true); + } else { + ok_button_->setEnabled(false); + } +} + +void ImportTextDialog::on_protocolLineEdit_textChanged(const QString &protocol_str) +{ + bool conv_ok; + + 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_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); + } +} + +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); + } +} + +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); + } +} + +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); + } +} + +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); + } +} diff --git a/ui/qt/import_text_dialog.h b/ui/qt/import_text_dialog.h new file mode 100644 index 0000000000..d67cf392af --- /dev/null +++ b/ui/qt/import_text_dialog.h @@ -0,0 +1,90 @@ +/* import_text_dialog.h + * + * $Id: capture_file_dialog.cpp 44864 2012-09-10 23:03:22Z gerald $ + * + * 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 IMPORT_TEXT_DIALOG_H +#define IMPORT_TEXT_DIALOG_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stdio.h> + +#include <glib.h> + +#include "ui/text_import.h" + +#include <QDialog> +#include <QPushButton> +#include <QRadioButton> + +namespace Ui { +class ImportTextDialog; +} + +class ImportTextDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ImportTextDialog(QWidget *parent = 0); + ~ImportTextDialog(); + QString &capfileName(); + +private: + void convertTextFile(); + void enableHeaderWidgets(bool enable_buttons = true); + + Ui::ImportTextDialog *ui; + + QPushButton *ok_button_; + QList<QRadioButton *>encap_buttons_; + text_import_info_t import_info_; + QString capfile_name_; + +public slots: + void exec(); + +private slots: + void on_textFileBrowseButton_clicked(); + void on_textFileLineEdit_textChanged(const QString &arg1); + void on_encapComboBox_currentIndexChanged(int index); + void on_dateTimeLineEdit_textChanged(const QString &arg1); + void on_noDummyButton_toggled(bool checked); + void on_ethernetButton_toggled(bool checked); + void on_ipv4Button_toggled(bool checked); + void on_udpButton_toggled(bool checked); + void on_tcpButton_toggled(bool checked); + void on_sctpButton_toggled(bool checked); + void on_sctpDataButton_toggled(bool checked); + void on_ethertypeLineEdit_textChanged(const QString ðertype_str); + void on_protocolLineEdit_textChanged(const QString &protocol_str); + void on_sourcePortLineEdit_textChanged(const QString &source_port_str); + void on_destinationPortLineEdit_textChanged(const QString &destination_port_str); + void on_tagLineEdit_textChanged(const QString &tag_str); + void on_ppiLineEdit_textChanged(const QString &ppi_str); + void on_maxLengthLineEdit_textChanged(const QString &max_frame_len_str); +}; + + +#endif // IMPORT_TEXT_DIALOG_H diff --git a/ui/qt/import_text_dialog.ui b/ui/qt/import_text_dialog.ui new file mode 100644 index 0000000000..bde3b5845f --- /dev/null +++ b/ui/qt/import_text_dialog.ui @@ -0,0 +1,461 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ImportTextDialog</class> + <widget class="QDialog" name="ImportTextDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>472</width> + <height>600</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>Wireshark: Import from Text</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <property name="modal"> + <bool>true</bool> + </property> + <layout class="QFormLayout" name="formLayout_3"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::FieldsStayAtSizeHint</enum> + </property> + <item row="0" column="0" colspan="2"> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Import From</string> + </property> + <layout class="QFormLayout" name="formLayout_2"> + <item row="1" column="0" colspan="2"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>File:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="textFileLineEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Set name of text file to import</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="textFileBrowseButton"> + <property name="toolTip"> + <string>Browse for text file to import</string> + </property> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="0" colspan="2"> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="2" column="1"> + <widget class="QRadioButton" name="octalOffsetButton"> + <property name="toolTip"> + <string>Offsets in the text file are in octal notation</string> + </property> + <property name="text"> + <string>Octal</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Offsets:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QRadioButton" name="hexOffsetButton"> + <property name="toolTip"> + <string>Offsets in the text file are in hexadecimal notation</string> + </property> + <property name="text"> + <string>Hexadecimal</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QRadioButton" name="decimalOffsetButton"> + <property name="toolTip"> + <string>Offsets in the text file are in decimal notation</string> + </property> + <property name="text"> + <string>Decimal</string> + </property> + </widget> + </item> + <item row="0" column="2" rowspan="3"> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="4" column="0" colspan="2"> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLabel" name="label_3"> + <property name="toolTip"> + <string>The format in which to parse timestamps in the text file (eg. %H:%M:%S.). Format specifiers are based on strptime(3)</string> + </property> + <property name="text"> + <string>Timestamp format:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="dateTimeLineEdit"> + <property name="toolTip"> + <string>The format in which to parse timestamps in the text file (eg. %H:%M:%S.). Format specifiers are based on strptime(3)</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="timestampExampleLabel"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Encapsulation</string> + </property> + <layout class="QFormLayout" name="formLayout"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::FieldsStayAtSizeHint</enum> + </property> + <item row="0" column="0" colspan="2"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Encapsulation Type:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="encapComboBox"> + <property name="toolTip"> + <string>Encapsulation type of the frames in the import capture file</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="1" column="0" colspan="2"> + <layout class="QGridLayout" name="headerGridLayout"> + <item row="3" column="2"> + <widget class="QLineEdit" 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"> + <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"> + <property name="toolTip"> + <string>The UDP, TCP or SCTP destination port for each frame</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QRadioButton" name="ethernetButton"> + <property name="toolTip"> + <string>Prefix each frame with an Ethernet header</string> + </property> + <property name="text"> + <string>Ethernet</string> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QRadioButton" name="sctpButton"> + <property name="toolTip"> + <string>Prefix each frame with an Ethernet, IPv4 and SCTP header</string> + </property> + <property name="text"> + <string>SCTP</string> + </property> + </widget> + </item> + <item row="6" column="1"> + <widget class="QLabel" name="ppiLabel"> + <property name="text"> + <string>PPI:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="protocolLabel"> + <property name="text"> + <string>Protocol (dec):</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="3"> + <widget class="QRadioButton" name="noDummyButton"> + <property name="toolTip"> + <string>Leave frames unchanged</string> + </property> + <property name="text"> + <string>No dummy header</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="0" column="3" rowspan="7"> + <spacer name="horizontalSpacer_4"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="5" column="1"> + <widget class="QLabel" name="tagLabel"> + <property name="text"> + <string>Tag:</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QRadioButton" name="udpButton"> + <property name="toolTip"> + <string>Prefix each frame with an Ethernet, IPv4 and UDP header</string> + </property> + <property name="text"> + <string>UDP</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="sourcePortLabel"> + <property name="text"> + <string>Source port:</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLineEdit" name="ethertypeLineEdit"> + <property name="toolTip"> + <string>The Ethertype value of each frame</string> + </property> + <property name="cursorPosition"> + <number>0</number> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QRadioButton" name="tcpButton"> + <property name="toolTip"> + <string>Prefix each frame with an Ethernet, IPv4 and TCP header</string> + </property> + <property name="text"> + <string>TCP</string> + </property> + </widget> + </item> + <item row="5" column="2"> + <widget class="QLineEdit" name="tagLineEdit"> + <property name="toolTip"> + <string>The SCTP verification tag for each frame</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLabel" name="destinationPortLabel"> + <property name="text"> + <string>Destination port:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="ethertypeLabel"> + <property name="text"> + <string>Ethertype (hex):</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLineEdit" name="protocolLineEdit"> + <property name="toolTip"> + <string>The IPv4 protocol ID for each frame</string> + </property> + </widget> + </item> + <item row="6" column="0"> + <widget class="QRadioButton" name="sctpDataButton"> + <property name="toolTip"> + <string>Prefix each frame with an Ethernet, IPv4 and SCTP (DATA) header</string> + </property> + <property name="text"> + <string>SCTP (Data)</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QRadioButton" name="ipv4Button"> + <property name="toolTip"> + <string>Prefix each frame with an Ethernet and IPv4 header</string> + </property> + <property name="text"> + <string>IPv4</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + <item row="2" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Maximum frame length:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" 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> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>ImportTextDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ImportTextDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/ui/qt/main.cpp b/ui/qt/main.cpp index 9b51baea11..c73935062a 100644 --- a/ui/qt/main.cpp +++ b/ui/qt/main.cpp @@ -760,13 +760,12 @@ int main(int argc, char *argv[]) /* Read the profile independent recent file. We have to do this here so we can */ /* set the profile before it can be set from the command line parameterts */ - // xxx qtshark - //recent_read_static(&rf_path, &rf_open_errno); - //if (rf_path != NULL && rf_open_errno != 0) { - // simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, - // "Could not open common recent file\n\"%s\": %s.", - // rf_path, strerror(rf_open_errno)); - //} + recent_read_static(&rf_path, &rf_open_errno); + if (rf_path != NULL && rf_open_errno != 0) { + simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, + "Could not open common recent file\n\"%s\": %s.", + rf_path, strerror(rf_open_errno)); + } /* "pre-scan" the command line parameters, if we have "console only" parameters. We do this so we don't start GTK+ if we're only showing @@ -849,6 +848,27 @@ int main(int argc, char *argv[]) } } + /* Init the "Open file" dialog directory */ + /* (do this after the path settings are processed) */ + + /* Read the profile dependent (static part) of the recent file. */ + /* Only the static part of it will be read, as we don't have the gui now to fill the */ + /* recent lists which is done in the dynamic part. */ + /* We have to do this already here, so command line parameters can overwrite these values. */ + recent_read_profile_static(&rf_path, &rf_open_errno); + if (rf_path != NULL && rf_open_errno != 0) { + simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, + "Could not open recent file\n\"%s\": %s.", + rf_path, g_strerror(rf_open_errno)); + } + + if (recent.gui_fileopen_remembered_dir && + test_for_directory(recent.gui_fileopen_remembered_dir) == EISDIR) { + wsApp->setLastOpenDir(recent.gui_fileopen_remembered_dir); + } else { + wsApp->setLastOpenDir(get_persdatafile_dir()); + } + #ifdef HAVE_LIBPCAP capture_callback_add(main_capture_callback, NULL); #endif diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp index 71db69ed82..0c7dfc234b 100644 --- a/ui/qt/main_window.cpp +++ b/ui/qt/main_window.cpp @@ -51,6 +51,7 @@ #include "byte_view_tab.h" #include "capture_file_dialog.h" #include "display_filter_edit.h" +#include "import_text_dialog.h" #include "qt_ui_utils.h" @@ -407,7 +408,7 @@ void MainWindow::openCaptureFile(QString &cf_path) break; } // get_dirname overwrites its path. Hopefully this isn't a problem. - set_last_open_dir(get_dirname(cf_path.toUtf8().data())); + wsApp->setLastOpenDir(get_dirname(cf_path.toUtf8().data())); df_combo_box_->setEditText(display_filter); main_ui_->statusBar->showExpert(); @@ -576,7 +577,7 @@ void MainWindow::mergeCaptureFile() /* Save the name of the containing directory specified in the path name, if any; we can write over cf_merged_name, which is a good thing, given that "get_dirname()" does write over its argument. */ - set_last_open_dir(get_dirname(tmpname)); + wsApp->setLastOpenDir(get_dirname(tmpname)); g_free(tmpname); df_combo_box_->setEditText(display_filter); main_ui_->statusBar->showExpert(); @@ -585,6 +586,21 @@ void MainWindow::mergeCaptureFile() } +void MainWindow::importCaptureFile() { + ImportTextDialog import_dlg; + + if (!testCaptureFileClose(cap_file_, FALSE, *new QString(" before importing a new capture"))) + return; + + import_dlg.exec(); + + if (import_dlg.result() != QDialog::Accepted) { + return; + } + + openCaptureFile(import_dlg.capfileName()); +} + void MainWindow::saveCapture(capture_file *cf, bool close_capture) { Q_UNUSED(cf); Q_UNUSED(close_capture); @@ -594,7 +610,7 @@ void MainWindow::saveCapture(capture_file *cf, bool close_capture) { bool MainWindow::testCaptureFileClose(capture_file *cf, bool from_quit, QString &before_what) { bool capture_in_progress = FALSE; - if (cf->state == FILE_CLOSED) + if (!cf || cf->state == FILE_CLOSED) return true; /* Already closed, nothing to do */ #ifdef HAVE_LIBPCAP @@ -964,7 +980,7 @@ void MainWindow::captureFileReadFinished(const capture_file *cf) { // /* Remember folder for next Open dialog and save it in recent */ // dir_path = get_dirname(g_strdup(cf->filename)); -// set_last_open_dir(dir_path); +// wsApp->setLastOpenDir(dir_path); // g_free(dir_path); // } // set_display_filename(cf); @@ -1208,6 +1224,11 @@ void MainWindow::on_actionFileMerge_triggered() mergeCaptureFile(); } +void MainWindow::on_actionFileImport_triggered() +{ + importCaptureFile(); +} + void MainWindow::on_actionFileClose_triggered() { testCaptureFileClose(&cfile); diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h index da2a829605..c162377211 100644 --- a/ui/qt/main_window.h +++ b/ui/qt/main_window.h @@ -96,6 +96,7 @@ private: void openCaptureFile(QString& cf_path = *new QString()); void mergeCaptureFile(); + void importCaptureFile(); void saveCapture(capture_file *cf, bool close_capture); bool testCaptureFileClose(capture_file *cf, bool from_quit = false, QString& before_what = *new QString()); void captureStop(capture_file *cf); @@ -140,7 +141,9 @@ private slots: void on_actionFileOpen_triggered(); void on_actionFileMerge_triggered(); + void on_actionFileImport_triggered(); void on_actionFileClose_triggered(); + void on_actionGoGoToPacket_triggered(); void resetPreviousFocus(); diff --git a/ui/qt/qt_ui_utils.h b/ui/qt/qt_ui_utils.h index 5b2edd8e46..4be2cf41be 100644 --- a/ui/qt/qt_ui_utils.h +++ b/ui/qt/qt_ui_utils.h @@ -66,7 +66,6 @@ struct remote_host_t { }; // Referenced from ui/win32/file_dlg_win32.c and implemented in wireshark_application.cpp -extern void set_last_open_dir(const char *dirname); extern gboolean main_do_quit(void); #ifdef __cplusplus diff --git a/ui/qt/wireshark_application.cpp b/ui/qt/wireshark_application.cpp index 6ca01caf73..b5cddbdfb7 100644 --- a/ui/qt/wireshark_application.cpp +++ b/ui/qt/wireshark_application.cpp @@ -48,36 +48,6 @@ static char *last_open_dir = NULL; static bool updated_last_open_dir = FALSE; static QList<recent_item_status *> recent_items; -void -set_last_open_dir(const char *dirname) -{ - qint64 len; - gchar *new_last_open_dir; - - if (dirname) { - len = strlen(dirname); - if (dirname[len-1] == G_DIR_SEPARATOR) { - new_last_open_dir = g_strconcat(dirname, NULL); - } - else { - new_last_open_dir = g_strconcat(dirname, - G_DIR_SEPARATOR_S, NULL); - } - - if (last_open_dir == NULL || - strcmp(last_open_dir, new_last_open_dir) != 0) - updated_last_open_dir = TRUE; - } - else { - new_last_open_dir = NULL; - if (last_open_dir != NULL) - updated_last_open_dir = TRUE; - } - - g_free(last_open_dir); - last_open_dir = new_last_open_dir; -} - extern "C" char * get_last_open_dir(void) { @@ -282,6 +252,43 @@ void WiresharkApplication::captureFileCallback(int event, void * data) } } +QDir WiresharkApplication::lastOpenDir() { + return QDir(last_open_dir); +} + +void WiresharkApplication::setLastOpenDir(QString *dir_str) { + setLastOpenDir(dir_str->toUtf8().constData()); +} + +void WiresharkApplication::setLastOpenDir(const char *dir_name) +{ + qint64 len; + gchar *new_last_open_dir; + + if (dir_name) { + len = strlen(dir_name); + if (dir_name[len-1] == G_DIR_SEPARATOR) { + new_last_open_dir = g_strconcat(dir_name, NULL); + } + else { + new_last_open_dir = g_strconcat(dir_name, + G_DIR_SEPARATOR_S, NULL); + } + + if (last_open_dir == NULL || + strcmp(last_open_dir, new_last_open_dir) != 0) + updated_last_open_dir = TRUE; + } + else { + new_last_open_dir = NULL; + if (last_open_dir != NULL) + updated_last_open_dir = TRUE; + } + + g_free(last_open_dir); + last_open_dir = new_last_open_dir; +} + void WiresharkApplication::clearRecentItems() { recent_item_status *ri; diff --git a/ui/qt/wireshark_application.h b/ui/qt/wireshark_application.h index e7f0c44188..879ce1e95f 100644 --- a/ui/qt/wireshark_application.h +++ b/ui/qt/wireshark_application.h @@ -60,6 +60,9 @@ public: void captureCallback(int event, capture_options * capture_opts); #endif void captureFileCallback(int event, void * data); + QDir lastOpenDir(); + void setLastOpenDir(const char *dir_name); + void setLastOpenDir(QString *dir_str); private: QTimer *recent_timer_; diff --git a/ui/text_import.h b/ui/text_import.h index 5ece3dadb7..fc69db9c3c 100644 --- a/ui/text_import.h +++ b/ui/text_import.h @@ -28,18 +28,23 @@ *******************************************************************************/ -#ifndef TEXT_IMPORT_H -#define TEXT_IMPORT_H +#ifndef __TEXT_IMPORT_H__ +#define __TEXT_IMPORT_H__ #include <glib.h> #include "wtap.h" +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + #define IMPORT_MAX_PACKET 64000 /* The parameter interface */ enum offset_type { + OFFSET_NONE = 0, OFFSET_HEX, OFFSET_OCT, OFFSET_DEC @@ -59,11 +64,11 @@ enum dummy_header_type typedef struct { /* Input info */ - guchar *import_text_filename; + char *import_text_filename; FILE *import_text_file; enum offset_type offset_type; gboolean date_timestamp; - guchar *date_timestamp_format; + char *date_timestamp_format; /* Import info */ guint encapsulation; @@ -84,4 +89,8 @@ typedef struct void text_import_setup(text_import_info_t *info); void text_import_cleanup(void); -#endif +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __TEXT_IMPORT_H__ */ diff --git a/ui/text_import_scanner.h b/ui/text_import_scanner.h index a587bb5554..5bd9c1e5cb 100644 --- a/ui/text_import_scanner.h +++ b/ui/text_import_scanner.h @@ -28,8 +28,12 @@ *******************************************************************************/ -#ifndef TEXT_IMPORT_SCANNER_H -#define TEXT_IMPORT_SCANNER_H +#ifndef __TEXT_IMPORT_SCANNER_H__ +#define __TEXT_IMPORT_SCANNER_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ typedef enum { T_BYTE = 1, @@ -47,4 +51,8 @@ extern FILE *text_importin; int text_importlex(void); -#endif +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __TEXT_IMPORT_SCANNER_H__ */ |