diff options
author | Gerald Combs <gerald@wireshark.org> | 2012-07-27 21:43:02 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2012-07-27 21:43:02 +0000 |
commit | 5fc656ee46d1c94e79952e97523db3e33221782b (patch) | |
tree | a10b30efbc88b06681771e27e6897a2a36eff72a /ui | |
parent | 1f6b7eb9c451188d87a3171ba4f56aa8a7d65b22 (diff) |
Add a preview to the common file dialog. Adjust the win32 file dialog
preview logic slightly.
svn path=/trunk/; revision=44080
Diffstat (limited to 'ui')
-rw-r--r-- | ui/qt/capture_file_dialog.cpp | 188 | ||||
-rw-r--r-- | ui/qt/capture_file_dialog.h | 12 | ||||
-rw-r--r-- | ui/win32/file_dlg_win32.c | 12 |
3 files changed, 200 insertions, 12 deletions
diff --git a/ui/qt/capture_file_dialog.cpp b/ui/qt/capture_file_dialog.cpp index 8e45287209..77f41aa9e1 100644 --- a/ui/qt/capture_file_dialog.cpp +++ b/ui/qt/capture_file_dialog.cpp @@ -37,13 +37,18 @@ #include "cfile.h" #include "ui/win32/file_dlg_win32.h" #else +#include <errno.h> #include "../../epan/addr_resolv.h" +#include "../../epan/prefs.h" +#include "../../epan/filesystem.h" +#include "../../epan/nstime.h" #include <QGridLayout> #include <QHBoxLayout> #include <QVBoxLayout> #include <QLabel> #include <QLineEdit> #include <QCheckBox> +#include <QFileInfo> #endif #include <QDebug> @@ -134,32 +139,71 @@ CaptureFileDialog::CaptureFileDialog(QWidget *parent, QString &fileName, QString QGridLayout *fdGrid = qobject_cast<QGridLayout*>(layout()); QHBoxLayout *hBox = new QHBoxLayout(); QVBoxLayout *controlsBox = new QVBoxLayout(); + QGridLayout *previewGrid = new QGridLayout(); + QLabel *lbl; - QLabel *dfLabel = new QLabel(tr("Display Filter:")); - fdGrid->addWidget(dfLabel, fdGrid->rowCount(), 0, 1, 1); + fdGrid->addWidget(new QLabel(tr("Display Filter:")), fdGrid->rowCount(), 0, 1, 1); m_displayFilterEdit = new DisplayFilterEdit(this, true); m_displayFilterEdit->setText(m_displayFilter); fdGrid->addWidget(m_displayFilterEdit, fdGrid->rowCount() - 1, 1, 1, 1); fdGrid->addLayout(hBox, fdGrid->rowCount(), 1, 1, -1); + + // Filter and resolution controls hBox->addLayout(controlsBox); - m_macRes.setText(tr("Enable &MAC name resolution")); + m_macRes.setText(tr("&MAC name resolution")); m_macRes.setChecked(gbl_resolv_flags.mac_name); controlsBox->addWidget(&m_macRes); - m_transportRes.setText(tr("Enable &transport name resolution")); + m_transportRes.setText(tr("&Transport name resolution")); m_transportRes.setChecked(gbl_resolv_flags.transport_name); controlsBox->addWidget(&m_transportRes); - m_networkRes.setText(tr("Enable &network name resolution")); + m_networkRes.setText(tr("&Network name resolution")); m_networkRes.setChecked(gbl_resolv_flags.network_name); controlsBox->addWidget(&m_networkRes); - m_externalRes.setText(tr("Use &external name resolver")); + m_externalRes.setText(tr("&External name resolver")); m_externalRes.setChecked(gbl_resolv_flags.use_external_net_name_resolver); controlsBox->addWidget(&m_externalRes); + + // Preview + hBox->addLayout(previewGrid); + + previewGrid->setColumnStretch(0, 0); + previewGrid->setColumnStretch(1, 10); + + lbl = new QLabel("Format:"); + previewGrid->addWidget(lbl, 0, 0); + previewGrid->addWidget(&m_previewFormat, 0, 1); + m_previewLabels << lbl << &m_previewFormat; + + lbl = new QLabel("Size:"); + previewGrid->addWidget(lbl, 1, 0); + previewGrid->addWidget(&m_previewSize, 1, 1); + m_previewLabels << lbl << &m_previewSize; + + lbl = new QLabel("Packets:"); + previewGrid->addWidget(lbl, 2, 0); + previewGrid->addWidget(&m_previewPackets, 2, 1); + m_previewLabels << lbl << &m_previewPackets; + + lbl = new QLabel("First Packet:"); + previewGrid->addWidget(lbl, 3, 0); + previewGrid->addWidget(&m_previewFirst, 3, 1); + m_previewLabels << lbl << &m_previewFirst; + + lbl = new QLabel("Elapsed Time:"); + previewGrid->addWidget(lbl, 4, 0); + previewGrid->addWidget(&m_previewElapsed, 4, 1); + m_previewLabels << lbl << &m_previewElapsed; + + connect(this, SIGNAL(currentChanged(const QString &)), this, SLOT(preview(const QString &))); + + preview(""); + #endif } @@ -257,6 +301,138 @@ QStringList CaptureFileDialog::build_file_open_type_list(void) { return filters; } + +/* do a preview run on the currently selected capture file */ +void CaptureFileDialog::preview(const QString & path) +{ + wtap *wth; + int err = 0; + gchar *err_info; + gint64 data_offset; + const struct wtap_pkthdr *phdr; + double start_time = 0; /* seconds, with nsec resolution */ + double stop_time = 0; /* seconds, with nsec resolution */ + double cur_time; + unsigned int packets = 0; + bool timed_out = FALSE; + time_t time_preview; + time_t time_current; + time_t ti_time; + struct tm *ti_tm; + unsigned int elapsed_time; + + // Follow the same steps as ui/win32/file_dlg_win32.c + + foreach (QLabel *lbl, m_previewLabels) { + lbl->setEnabled(false); + } + + m_previewFormat.setText(tr("-")); + m_previewSize.setText(tr("-")); + m_previewPackets.setText(tr("-")); + m_previewFirst.setText(tr("-")); + m_previewElapsed.setText(tr("-")); + + if (path.length() < 1) { + return; + } + + if (test_for_directory(path.toUtf8().data()) == EISDIR) { + m_previewFormat.setText(tr("directory")); + return; + } + + wth = wtap_open_offline(path.toUtf8().data(), &err, &err_info, TRUE); + if (wth == NULL) { + if(err == WTAP_ERR_FILE_UNKNOWN_FORMAT) { + m_previewFormat.setText(tr("unknown file format")); + } else { + m_previewFormat.setText(tr("error opening file")); + } + return; + } + + // Success! + foreach (QLabel *lbl, m_previewLabels) { + lbl->setEnabled(true); + } + + // Format + m_previewFormat.setText(QString::fromUtf8(wtap_file_type_string(wtap_file_type(wth)))); + + // Size + m_previewSize.setText(QString("%1 bytes").arg(wtap_file_size(wth, &err))); + + time(&time_preview); + while ( (wtap_read(wth, &err, &err_info, &data_offset)) ) { + phdr = wtap_phdr(wth); + cur_time = wtap_nstime_to_sec(&phdr->ts); + if(packets == 0) { + start_time = cur_time; + stop_time = cur_time; + } + if (cur_time < start_time) { + start_time = cur_time; + } + if (cur_time > stop_time){ + stop_time = cur_time; + } + + packets++; + if(packets%1000 == 0) { + /* do we have a timeout? */ + time(&time_current); + if(time_current-time_preview >= (time_t) prefs.gui_fileopen_preview) { + timed_out = TRUE; + break; + } + } + } + + if(err != 0) { + m_previewPackets.setText(QString("error after reading %1 packets").arg(packets)); + return; + } + + // Packet count + if(timed_out) { + m_previewPackets.setText(QString("more than %1 (preview timeout)").arg(packets)); + } else { + m_previewPackets.setText(QString("%1").arg(packets)); + } + + // First packet + ti_time = (long)start_time; + ti_tm = localtime( &ti_time ); + if(ti_tm) { + m_previewFirst.setText(QString().sprintf( + "%04d-%02d-%02d %02d:%02d:%02d", + ti_tm->tm_year + 1900, + ti_tm->tm_mon + 1, + ti_tm->tm_mday, + ti_tm->tm_hour, + ti_tm->tm_min, + ti_tm->tm_sec + )); + } else { + m_previewFirst.setText(tr("?")); + } + + // Elapsed time + elapsed_time = (unsigned int)(stop_time-start_time); + if(timed_out) { + m_previewElapsed.setText(tr("unknown")); + } else if(elapsed_time/86400) { + m_previewElapsed.setText(QString().sprintf("%02u days %02u:%02u:%02u", + elapsed_time/86400, elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60)); + } else { + m_previewElapsed.setText(QString().sprintf("%02u:%02u:%02u", + elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60)); + } + + wtap_close(wth); +} + #endif // Q_WS_WINDOWS #if 0 diff --git a/ui/qt/capture_file_dialog.h b/ui/qt/capture_file_dialog.h index 71f1a52f24..57cf87af90 100644 --- a/ui/qt/capture_file_dialog.h +++ b/ui/qt/capture_file_dialog.h @@ -71,6 +71,13 @@ private: QCheckBox m_networkRes; QCheckBox m_externalRes; + QLabel m_previewFormat; + QLabel m_previewSize; + QLabel m_previewPackets; + QLabel m_previewFirst; + QLabel m_previewElapsed; + QList<QLabel *> m_previewLabels; + DisplayFilterEdit* m_displayFilterEdit; signals: @@ -78,6 +85,11 @@ signals: public slots: int exec(); + +private slots: +#if !defined(Q_WS_WIN) + void preview(const QString & path); +#endif // Q_WS_WIN }; #endif // CAPTURE_FILE_DIALOG_H diff --git a/ui/win32/file_dlg_win32.c b/ui/win32/file_dlg_win32.c index c346ef5085..d0ea400554 100644 --- a/ui/win32/file_dlg_win32.c +++ b/ui/win32/file_dlg_win32.c @@ -1410,7 +1410,7 @@ preview_set_file_info(HWND of_hwnd, gchar *preview_file) { return FALSE; } - /* Format */ + /* Format: directory */ cur_ctrl = GetDlgItem(of_hwnd, EWFD_PTX_FORMAT); if (test_for_directory(preview_file) == EISDIR) { SetWindowText(cur_ctrl, _T("directory")); @@ -1435,16 +1435,16 @@ preview_set_file_info(HWND of_hwnd, gchar *preview_file) { } } + /* Format */ + cur_ctrl = GetDlgItem(of_hwnd, EWFD_PTX_FORMAT); + SetWindowText(cur_ctrl, utf_8to16(wtap_file_type_string(wtap_file_type(wth)))); + /* Size */ filesize = wtap_file_size(wth, &err); utf_8to16_snprintf(string_buff, PREVIEW_STR_MAX, "%" G_GINT64_FORMAT " bytes", filesize); cur_ctrl = GetDlgItem(of_hwnd, EWFD_PTX_SIZE); SetWindowText(cur_ctrl, string_buff); - /* Type */ - cur_ctrl = GetDlgItem(of_hwnd, EWFD_PTX_FORMAT); - SetWindowText(cur_ctrl, utf_8to16(wtap_file_type_string(wtap_file_type(wth)))); - time(&time_preview); while ( (wtap_read(wth, &err, &err_info, &data_offset)) ) { phdr = wtap_phdr(wth); @@ -1477,7 +1477,7 @@ preview_set_file_info(HWND of_hwnd, gchar *preview_file) { return TRUE; } - /* Packet count */ + /* Packets */ if(is_breaked) { StringCchPrintf(string_buff, PREVIEW_STR_MAX, _T("more than %u packets (preview timeout)"), packet); } else { |