From bb78afbca7141461f47136949d4a96360c7f2d2d Mon Sep 17 00:00:00 2001 From: "Srivats P." Date: Sat, 19 Mar 2011 11:48:58 +0530 Subject: [PATCH] Implemented "Import Options" for PCAP file format --- client/port.cpp | 12 ++++++++++++ common/abstractfileformat.cpp | 10 ++++++++++ common/abstractfileformat.h | 9 +++++++-- common/ostproto.pro | 1 + common/pcapfileformat.cpp | 34 +++++++++++++++++++++++++++++++--- common/pcapfileformat.h | 19 +++++++++++++++++++ 6 files changed, 80 insertions(+), 5 deletions(-) diff --git a/client/port.cpp b/client/port.cpp index 3130432..8068c41 100644 --- a/client/port.cpp +++ b/client/port.cpp @@ -230,6 +230,7 @@ void Port::updateStats(OstProto::PortStats *portStats) bool Port::openStreams(QString fileName, bool append, QString &error) { bool ret = false; + QDialog *optDialog; QProgressDialog progress("Opening Streams", "Cancel", 0, 0, mainWindow); OstProto::StreamConfigList streams; AbstractFileFormat *fmt = AbstractFileFormat::fileFormatFromFile(fileName); @@ -237,6 +238,16 @@ bool Port::openStreams(QString fileName, bool append, QString &error) if (fmt == NULL) goto _fail; + if (optDialog = fmt->openOptionsDialog()) + { + int ret; + optDialog->setParent(mainWindow, Qt::Dialog); + ret = optDialog->exec(); + optDialog->setParent(0, Qt::Dialog); + if (ret == QDialog::Rejected) + goto _user_opt_cancel; + } + progress.setAutoReset(false); progress.setAutoClose(false); progress.setMinimumDuration(0); @@ -295,6 +306,7 @@ bool Port::openStreams(QString fileName, bool append, QString &error) _user_cancel: emit streamListChanged(mPortGroupId, mPortId); +_user_opt_cancel: ret = true; _fail: diff --git a/common/abstractfileformat.cpp b/common/abstractfileformat.cpp index f748447..15271d7 100644 --- a/common/abstractfileformat.cpp +++ b/common/abstractfileformat.cpp @@ -34,6 +34,16 @@ AbstractFileFormat::~AbstractFileFormat() { } +QDialog* AbstractFileFormat::openOptionsDialog() +{ + return NULL; +} + +QDialog* AbstractFileFormat::saveOptionsDialog() +{ + return NULL; +} + QStringList AbstractFileFormat::supportedFileTypes() { return QStringList() diff --git a/common/abstractfileformat.h b/common/abstractfileformat.h index 031e4e1..1f8447d 100644 --- a/common/abstractfileformat.h +++ b/common/abstractfileformat.h @@ -25,6 +25,8 @@ along with this program. If not, see #include #include +class QDialog; + class AbstractFileFormat : public QThread { Q_OBJECT @@ -37,6 +39,9 @@ public: virtual bool saveStreams(const OstProto::StreamConfigList streams, const QString fileName, QString &error) = 0; + virtual QDialog* openOptionsDialog(); + virtual QDialog* saveOptionsDialog(); + void openStreamsOffline(const QString fileName, OstProto::StreamConfigList &streams, QString &error); void saveStreamsOffline(const OstProto::StreamConfigList streams, @@ -44,11 +49,11 @@ public: bool result(); + static QStringList supportedFileTypes(); + static AbstractFileFormat* fileFormatFromFile(const QString fileName); static AbstractFileFormat* fileFormatFromType(const QString fileType); - static QStringList supportedFileTypes(); - #if 0 bool isMyFileFormat(const QString fileName) = 0; bool isMyFileType(const QString fileType) = 0; diff --git a/common/ostproto.pro b/common/ostproto.pro index 3283090..7e3c80a 100644 --- a/common/ostproto.pro +++ b/common/ostproto.pro @@ -5,6 +5,7 @@ INCLUDEPATH += "../extra/qhexedit2/src" LIBS += \ -lprotobuf FORMS += \ + pcapfileimport.ui \ mac.ui \ payload.ui \ eth2.ui \ diff --git a/common/pcapfileformat.cpp b/common/pcapfileformat.cpp index 04ace99..4d8a46a 100644 --- a/common/pcapfileformat.cpp +++ b/common/pcapfileformat.cpp @@ -53,19 +53,39 @@ const quint32 kDltEthernet = 1; PcapFileFormat pcapFileFormat; +PcapImportOptionsDialog::PcapImportOptionsDialog(QVariantMap *options) + : QDialog(NULL) +{ + setupUi(this); + options_ = options; + connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); +} + +PcapImportOptionsDialog::~PcapImportOptionsDialog() +{ +} + +void PcapImportOptionsDialog::accept() +{ + options_->insert("ViaPdml", viaPdml->isChecked()); + options_->insert("DoDiff", doDiff->isChecked()); + + QDialog::accept(); +} + PcapFileFormat::PcapFileFormat() { + importDialog_ = NULL; } PcapFileFormat::~PcapFileFormat() { + delete importDialog_; } bool PcapFileFormat::openStreams(const QString fileName, OstProto::StreamConfigList &streams, QString &error) { - bool viaPdml = false; // TODO: shd be a param to function - bool isOk = false; QFile file(fileName); QTemporaryFile file2; @@ -170,7 +190,7 @@ bool PcapFileFormat::openStreams(const QString fileName, pktBuf.resize(fileHdr.snapLen); - if (viaPdml) + if (importOptions_.value("ViaPdml").toBool()) { QTemporaryFile pdmlFile; PdmlReader reader(&streams); @@ -424,6 +444,14 @@ _exit: return isOk; } +QDialog* PcapFileFormat::openOptionsDialog() +{ + if (!importDialog_) + importDialog_ = new PcapImportOptionsDialog(&importOptions_); + + return importDialog_; +} + bool PcapFileFormat::isMyFileFormat(const QString fileName) { // TODO diff --git a/common/pcapfileformat.h b/common/pcapfileformat.h index 4f7ab7a..064aaf1 100644 --- a/common/pcapfileformat.h +++ b/common/pcapfileformat.h @@ -20,8 +20,23 @@ along with this program. If not, see #define _PCAP_FILE_FORMAT_H #include "abstractfileformat.h" +#include "ui_pcapfileimport.h" #include +#include + +class PcapImportOptionsDialog: public QDialog, public Ui::PcapFileImport +{ +public: + PcapImportOptionsDialog(QVariantMap *options); + ~PcapImportOptionsDialog(); + +private slots: + void accept(); + +private: + QVariantMap *options_; +}; class PdmlReader; class PcapFileFormat : public AbstractFileFormat @@ -37,6 +52,8 @@ public: bool saveStreams(const OstProto::StreamConfigList streams, const QString fileName, QString &error); + virtual QDialog* openOptionsDialog(); + bool isMyFileFormat(const QString fileName); bool isMyFileType(const QString fileType); @@ -61,6 +78,8 @@ private: bool readPacket(PcapPacketHeader &pktHdr, QByteArray &pktBuf); QDataStream fd_; + QVariantMap importOptions_; + PcapImportOptionsDialog *importDialog_; }; extern PcapFileFormat pcapFileFormat;