From cabd6ad096faf2b87a1e60c2bdc374b6a11a5566 Mon Sep 17 00:00:00 2001 From: "Srivats P." Date: Tue, 11 Mar 2014 06:16:41 +0530 Subject: [PATCH] NOX: Framework to separate the protocol widgets from the protocol. Changes in client to use the new framework. Changes may not compile --- client/main.cpp | 3 ++ client/mainwindow.cpp | 13 +++-- client/ostinato.pro | 13 +++-- client/stream.cpp | 44 +++------------- client/streamconfigdialog.cpp | 76 +++++++++++++++++++++++++--- client/streamconfigdialog.h | 4 ++ common/abstractprotocol.cpp | 42 +++------------- common/abstractprotocol.h | 6 +-- common/abstractprotocolconfig.h | 83 ++++++++++++++++++++++++++++++ common/ostproto.pro | 63 +++++++---------------- common/ostprotogui.pro | 73 +++++++++++++++++++++++++++ common/ostprotolib.cpp | 2 +- common/protocolmanager.cpp | 35 +++++++------ common/protocolmanager.h | 1 + common/protocolwidgetfactory.cpp | 86 ++++++++++++++++++++++++++++++++ common/protocolwidgetfactory.h | 46 +++++++++++++++++ ost.pro | 1 + 17 files changed, 441 insertions(+), 150 deletions(-) create mode 100644 common/abstractprotocolconfig.h create mode 100644 common/ostprotogui.pro create mode 100644 common/protocolwidgetfactory.cpp create mode 100644 common/protocolwidgetfactory.h diff --git a/client/main.cpp b/client/main.cpp index b9f7ae9..f8f6e0b 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -20,6 +20,7 @@ along with this program. If not, see #include "mainwindow.h" #include "../common/ostprotolib.h" #include "../common/protocolmanager.h" +#include "../common/protocolwidgetfactory.h" #include "settings.h" #include @@ -31,6 +32,7 @@ along with this program. If not, see extern const char* version; extern const char* revision; extern ProtocolManager *OstProtocolManager; +extern ProtocolWidgetFactory *OstProtocolWidgetFactory; QSettings *appSettings; QMainWindow *mainWindow; @@ -58,6 +60,7 @@ int main(int argc, char* argv[]) app.setProperty("revision", revision); OstProtocolManager = new ProtocolManager(); + OstProtocolWidgetFactory = new ProtocolWidgetFactory(); /* (Portable Mode) If we have a .ini file in the same directory as the executable, we use that instead of the platform specific location diff --git a/client/mainwindow.cpp b/client/mainwindow.cpp index 03a16ab..79cd708 100644 --- a/client/mainwindow.cpp +++ b/client/mainwindow.cpp @@ -100,14 +100,21 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { - delete pgl; +#ifdef Q_OS_WIN32 + //! \todo - find a way to terminate cleanly + localServer_->kill(); +#else localServer_->terminate(); - localServer_->waitForFinished(); - delete localServer_; +#endif + + delete pgl; QByteArray layout = saveState(0); appSettings->setValue(kApplicationWindowLayout, layout); appSettings->setValue(kApplicationWindowGeometryKey, geometry()); + + localServer_->waitForFinished(); + delete localServer_; } void MainWindow::on_actionPreferences_triggered() diff --git a/client/ostinato.pro b/client/ostinato.pro index 0967390..d5fd459 100644 --- a/client/ostinato.pro +++ b/client/ostinato.pro @@ -7,22 +7,27 @@ QT += network script xml INCLUDEPATH += "../rpc/" "../common/" win32 { CONFIG(debug, debug|release) { - LIBS += -L"../common/debug" -lostproto + LIBS += -L"../common/debug" -lostprotogui -lostproto LIBS += -L"../rpc/debug" -lpbrpc POST_TARGETDEPS += \ + "../common/debug/libostprotogui.a" \ "../common/debug/libostproto.a" \ "../rpc/debug/libpbrpc.a" } else { - LIBS += -L"../common/release" -lostproto + LIBS += -L"../common/release" -lostprotogui -lostproto LIBS += -L"../rpc/release" -lpbrpc POST_TARGETDEPS += \ + "../common/release/libostprotogui.a" \ "../common/release/libostproto.a" \ "../rpc/release/libpbrpc.a" } } else { - LIBS += -L"../common" -lostproto + LIBS += -L"../common" -lostprotogui -lostproto LIBS += -L"../rpc" -lpbrpc - POST_TARGETDEPS += "../common/libostproto.a" "../rpc/libpbrpc.a" + POST_TARGETDEPS += \ + "../common/libostprotogui.a" \ + "../common/libostproto.a" \ + "../rpc/libpbrpc.a" } LIBS += -lprotobuf LIBS += -L"../extra/qhexedit2/$(OBJECTS_DIR)/" -lqhexedit2 diff --git a/client/stream.cpp b/client/stream.cpp index a24c971..2305930 100644 --- a/client/stream.cpp +++ b/client/stream.cpp @@ -17,11 +17,14 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ +/*! + * \todo Remove this class + */ + #include #include #include "stream.h" -//#include "../common/protocollist.h" #include "../common/protocollistiterator.h" #include "../common/abstractprotocol.h" @@ -37,43 +40,12 @@ Stream::~Stream() void Stream::loadProtocolWidgets() { -#if 0 - //protocols.loadConfigWidgets(); - foreach(AbstractProtocol* proto, *currentFrameProtocols) - { - proto->loadConfigWidget(); - } -#else - ProtocolListIterator *iter; - - iter = createProtocolListIterator(); - while (iter->hasNext()) - { - AbstractProtocol* p = iter->next(); - p->loadConfigWidget(); - } - delete iter; -#endif + qWarning("%s: DOES NOTHING", __PRETTY_FUNCTION__); + return; } void Stream::storeProtocolWidgets() { -#if 0 - //protocols.storeConfigWidgets(); - foreach(const AbstractProtocol* proto, frameProtocol()) - { - proto->storeConfigWidget(); - _iter->toFront(); - } -#else - ProtocolListIterator *iter; - - iter = createProtocolListIterator(); - while (iter->hasNext()) - { - AbstractProtocol* p = iter->next(); - p->storeConfigWidget(); - } - delete iter; -#endif + qWarning("%s: DOES NOTHING", __PRETTY_FUNCTION__); + return; } diff --git a/client/streamconfigdialog.cpp b/client/streamconfigdialog.cpp index e2fc3f0..087631d 100644 --- a/client/streamconfigdialog.cpp +++ b/client/streamconfigdialog.cpp @@ -22,13 +22,16 @@ along with this program. If not, see #include "streamconfigdialog.h" #include "stream.h" #include "abstractprotocol.h" +#include "abstractprotocolconfig.h" #include "protocollistiterator.h" #include "modeltest.h" -// FIXME(HI) - remove #include "../common/protocolmanager.h" +#include "../common/protocolwidgetfactory.h" + extern ProtocolManager *OstProtocolManager; +extern ProtocolWidgetFactory *OstProtocolWidgetFactory; QRect StreamConfigDialog::lastGeometry; int StreamConfigDialog::lastTopLevelTabIndex = 0; @@ -83,6 +86,7 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex, connect(rbL4Other, SIGNAL(toggled(bool)), rbPayloadOther, SLOT(setChecked(bool))); connect(rbL4Other, SIGNAL(toggled(bool)), gbPayloadProto, SLOT(setDisabled(bool))); +#if 1 // temp mask // Setup valid subsequent protocols for L2 to L4 protocols for (int i = ProtoL2; i <= ProtoL4; i++) { @@ -129,6 +133,7 @@ StreamConfigDialog::StreamConfigDialog(Port &port, uint streamIndex, } } } +#endif mpAvailableProtocolsModel = new QStringListModel( OstProtocolManager->protocolDatabase(), this); @@ -306,10 +311,60 @@ StreamConfigDialog::~StreamConfigDialog() for (int i = ProtoMin; i < ProtoMax; i++) delete bgProto[i]; + foreach (AbstractProtocolConfigForm* w, _protocolWidgets) { + OstProtocolWidgetFactory->deleteConfigWidget(w); + } + delete _iter; delete mpStream; } +void StreamConfigDialog::loadProtocolWidgets() +{ + ProtocolListIterator *iter; + + // NOTE: Protocol Widgets are created on demand. Once created we + // store them in _protocolWidgets indexed by the protocol + // object's address (to ensure unique widgets for multiple + // objects of the same class). Subsequently we check + // _protocolWidgets before creating a new widget + iter = mpStream->createProtocolListIterator(); + while (iter->hasNext()) + { + AbstractProtocol* p = iter->next(); + AbstractProtocolConfigForm *w = _protocolWidgets.value(p); + if (!w) { + w = OstProtocolWidgetFactory->createConfigWidget( + p->protocolNumber()); + _protocolWidgets.insert(p, w); + } + w->loadWidget(p); + } + delete iter; +} + +void StreamConfigDialog::storeProtocolWidgets() +{ + ProtocolListIterator *iter; + + // NOTE: After creating a widget, we need to call loadWidget() + // to load the protocol's default values + iter = mpStream->createProtocolListIterator(); + while (iter->hasNext()) + { + AbstractProtocol* p = iter->next(); + AbstractProtocolConfigForm *w = _protocolWidgets.value(p); + if (!w) { + w = OstProtocolWidgetFactory->createConfigWidget( + p->protocolNumber()); + w->loadWidget(p); + _protocolWidgets.insert(p, w); + } + w->storeWidget(p); + } + delete iter; +} + void StreamConfigDialog::on_cmbPktLenMode_currentIndexChanged(QString mode) { if (mode == "Fixed") @@ -565,12 +620,19 @@ void StreamConfigDialog::on_twTopLevel_currentChanged(int index) w->setParent(0); } - // Repopulate the widgets + // Repopulate the widgets - create new ones, if required _iter->toFront(); while (_iter->hasNext()) { AbstractProtocol* p = _iter->next(); - tbProtocolData->addItem(p->configWidget(), p->name()); + AbstractProtocolConfigForm *w = _protocolWidgets.value(p); + if (!w) { + w = OstProtocolWidgetFactory->createConfigWidget( + p->protocolNumber()); + w->loadWidget(p); + _protocolWidgets.insert(p, w); + } + tbProtocolData->addItem(w, p->name()); } if (lastProtocolDataIndex < tbProtocolData->count()) @@ -892,7 +954,7 @@ void StreamConfigDialog::LoadCurrentStream() updateSelectProtocolsSimpleWidget(); updateSelectProtocolsAdvancedWidget(); - mpStream->loadProtocolWidgets(); + loadProtocolWidgets(); } // Stream Control @@ -967,7 +1029,7 @@ void StreamConfigDialog::StoreCurrentStream() // Protocols { - pStream->storeProtocolWidgets(); + storeProtocolWidgets(); } // Stream Control @@ -1005,8 +1067,8 @@ void StreamConfigDialog::on_tbProtocolData_currentChanged(int /*index*/) // protocols e.g. TCP/UDP port numbers are dependent on Port/Protocol // selection in TextProtocol #if 0 // FIXME: temp mask to avoid crash till we fix it - mpStream->storeProtocolWidgets(); - mpStream->loadProtocolWidgets(); + storeProtocolWidgets(); + loadProtocolWidgets(); #endif } diff --git a/client/streamconfigdialog.h b/client/streamconfigdialog.h index a3214c3..5330414 100644 --- a/client/streamconfigdialog.h +++ b/client/streamconfigdialog.h @@ -37,6 +37,7 @@ along with this program. If not, see ** */ +class AbstractProtocolConfigForm; class StreamConfigDialog : public QDialog, public Ui::StreamConfigDialog { @@ -76,6 +77,7 @@ private: Stream *mpStream; ProtocolListIterator *_iter; + QHash _protocolWidgets; bool isUpdateInProgress; @@ -92,6 +94,8 @@ private: void setupUiExtra(); void LoadCurrentStream(); void StoreCurrentStream(); + void loadProtocolWidgets(); + void storeProtocolWidgets(); private slots: void on_cmbPktLenMode_currentIndexChanged(QString mode); diff --git a/common/abstractprotocol.cpp b/common/abstractprotocol.cpp index 77def8f..230fd81 100644 --- a/common/abstractprotocol.cpp +++ b/common/abstractprotocol.cpp @@ -17,11 +17,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see */ -#include - #include "abstractprotocol.h" -#include "streambase.h" + #include "protocollistiterator.h" +#include "streambase.h" + +#include /*! \class AbstractProtocol @@ -46,9 +47,6 @@ along with this program. If not, see - fieldFlags() - fieldData() - setFieldData() - - configWidget() [pure virtual] - - loadConfigWidget() [pure virtual] - - storeConfigWidget() [pure virtual] Depending on certain conditions, subclasses may need to reimplement the following additional methods - @@ -107,6 +105,8 @@ AbstractProtocol* AbstractProtocol::createInstance(StreamBase* /* stream */, (file: protocol.proto) Subclasses MUST implement this function + + \todo convert this to a protected data member instead of a virtual function */ quint32 AbstractProtocol::protocolNumber() const { @@ -838,36 +838,6 @@ out: return (quint16) ~sum; } -/*! - \fn virtual QWidget* AbstractProtocol::configWidget() = 0; - - Returns the configuration widget for the protocol. The protocol retains - ownership of the configuration widget - the caller should not free it. - - In the base class this is a pure virtual function. Subclasses MUST implement - this function. See the SampleProtocol for an example -*/ - -/*! - \fn virtual void AbstractProtocol::loadConfigWidget() = 0; - - Loads data from the protocol's protobuf into the configuration widget of - the protocol - - In the base class this is a pure virtual function. Subclasses MUST implement - this function. See the SampleProtocol for an example -*/ - -/*! - \fn virtual void AbstractProtocol::storeConfigWidget() = 0; - - Stores data from the configuration widget of the protocol into the protocol's - protobuf - - In the base class this is a pure virtual function. Subclasses MUST implement - this function. See the SampleProtocol for an example -*/ - // Stein's binary GCD algo - from wikipedia quint64 AbstractProtocol::gcd(quint64 u, quint64 v) { diff --git a/common/abstractprotocol.h b/common/abstractprotocol.h index ab3b7e9..5206662 100644 --- a/common/abstractprotocol.h +++ b/common/abstractprotocol.h @@ -23,9 +23,9 @@ along with this program. If not, see #include #include #include -#include #include #include +#include //#include "../rpc/pbhelper.h" #include "protocol.pb.h" @@ -155,10 +155,6 @@ public: CksumType cksumType = CksumIp, CksumScope cksumScope = CksumScopeAllProtocols) const; - virtual QWidget* configWidget() = 0; - virtual void loadConfigWidget() = 0; - virtual void storeConfigWidget() = 0; - static quint64 lcm(quint64 u, quint64 v); static quint64 gcd(quint64 u, quint64 v); }; diff --git a/common/abstractprotocolconfig.h b/common/abstractprotocolconfig.h new file mode 100644 index 0000000..e6023ec --- /dev/null +++ b/common/abstractprotocolconfig.h @@ -0,0 +1,83 @@ +/* +Copyright (C) 2013-2014 Srivats P. + +This file is part of "Ostinato" + +This 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 3 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, see +*/ +#ifndef _ABSTRACT_PROTOCOL_CONFIG_H +#define _ABSTRACT_PROTOCOL_CONFIG_H + +#include + +class AbstractProtocol; + +class AbstractProtocolConfigForm : public QWidget +{ + Q_OBJECT +public: +/*! + Constructs the widget +*/ + AbstractProtocolConfigForm(QWidget *parent = 0) + : QWidget(parent) + { + // Do nothing! + } + +/*! + Destroys the widget +*/ + virtual ~AbstractProtocolConfigForm() + { + // Do nothing! + } + +/*! + Allocates and returns a new instance of the widget. + + Caller is responsible for freeing up after use. Subclasses MUST implement + this function +*/ + static AbstractProtocolConfigForm* createInstance() + { + return NULL; + } + +/*! + Loads data from the protocol using it's fieldData() method into this + widget + + Subclasses MUST implement this function. See the SampleProtocol for + an example +*/ + virtual void loadWidget(AbstractProtocol *proto) + { + // Do nothing! + } + +/*! + Stores data from this widget into the protocol using the protocol's + setFieldData() method + + Subclasses MUST implement this function. See the SampleProtocol for + an example +*/ + virtual void storeWidget(AbstractProtocol *proto) + { + // Do nothing! + } +}; + +#endif diff --git a/common/ostproto.pro b/common/ostproto.pro index f0563fc..d20c300 100644 --- a/common/ostproto.pro +++ b/common/ostproto.pro @@ -1,32 +1,12 @@ TEMPLATE = lib CONFIG += qt staticlib -QT += network script xml -INCLUDEPATH += "../extra/qhexedit2/src" +QT -= gui +QT += network script LIBS += \ -lprotobuf -FORMS += \ - pcapfileimport.ui \ - mac.ui \ - payload.ui \ - eth2.ui \ - dot3.ui \ - llc.ui \ - snap.ui \ - vlan.ui \ - arp.ui \ - ip4.ui \ - ip6.ui \ - icmp.ui \ - gmp.ui \ - tcp.ui \ - udp.ui \ - textproto.ui \ - userscript.ui \ - hexdump.ui \ - sample.ui -PROTOS += \ + +PROTOS = \ protocol.proto \ - fileformat.proto \ mac.proto \ payload.proto \ eth2.proto \ @@ -55,24 +35,22 @@ PROTOS += \ userscript.proto \ hexdump.proto \ sample.proto -HEADERS += \ - ostprotolib.h \ + +HEADERS = \ abstractprotocol.h \ comboprotocol.h \ - abstractfileformat.h \ - fileformat.h \ - pcapfileformat.h \ - pdmlfileformat.h \ - pdmlprotocol.h \ - pdmlprotocols.h \ - pdmlreader.h \ protocolmanager.h \ protocollist.h \ protocollistiterator.h \ streambase.h \ + +HEADERS += \ mac.h \ payload.h \ eth2.h \ + ip6.h + +HEADERS1 += \ dot3.h \ llc.h \ snap.h \ @@ -83,7 +61,6 @@ HEADERS += \ vlanstack.h \ arp.h \ ip4.h \ - ip6.h \ ipv4addressdelegate.h \ ipv6addressdelegate.h \ ip6over4.h \ @@ -100,24 +77,22 @@ HEADERS += \ userscript.h \ hexdump.h \ sample.h -SOURCES += \ - ostprotolib.cpp \ + +SOURCES = \ abstractprotocol.cpp \ crc32c.cpp \ - abstractfileformat.cpp \ - fileformat.cpp \ - pcapfileformat.cpp \ - pdmlfileformat.cpp \ - pdmlprotocol.cpp \ - pdmlprotocols.cpp \ - pdmlreader.cpp \ protocolmanager.cpp \ protocollist.cpp \ protocollistiterator.cpp \ streambase.cpp \ + +SOURCES += \ mac.cpp \ payload.cpp \ eth2.cpp \ + ip6.cpp + +SOURCES1 += \ dot3.cpp \ llc.cpp \ snap.cpp \ @@ -125,7 +100,6 @@ SOURCES += \ svlan.cpp \ arp.cpp \ ip4.cpp \ - ip6.cpp \ icmp.cpp \ gmp.cpp \ igmp.cpp \ @@ -140,3 +114,4 @@ SOURCES += \ QMAKE_DISTCLEAN += object_script.* include(../protobuf.pri) + diff --git a/common/ostprotogui.pro b/common/ostprotogui.pro new file mode 100644 index 0000000..86b39a5 --- /dev/null +++ b/common/ostprotogui.pro @@ -0,0 +1,73 @@ +TEMPLATE = lib +CONFIG += qt staticlib +QT += network xml +LIBS += \ + -lprotobuf + +FORMS = \ + pcapfileimport.ui \ + +FORMS += \ + mac.ui \ + payload.ui \ + eth2.ui \ + ip6.ui \ + +FORMS1 += \ + dot3.ui \ + llc.ui \ + snap.ui \ + vlan.ui \ + arp.ui \ + ip4.ui \ + icmp.ui \ + gmp.ui \ + tcp.ui \ + udp.ui \ + textproto.ui \ + userscript.ui \ + hexdump.ui \ + sample.ui + +PROTOS = \ + fileformat.proto + +# TODO: Move fileformat related stuff into a different library +HEADERS = \ + ostprotolib.h \ + abstractfileformat.h \ + fileformat.h \ + pcapfileformat.h \ + pdmlfileformat.h \ + pdmlprotocol.h \ + pdmlprotocols.h \ + pdmlreader.h + +HEADERS += \ + abstractprotocolconfig.h \ + protocolwidgetfactory.h \ + macconfig.h \ + payloadconfig.h \ + eth2config.h \ + ip6config.h + +SOURCES += \ + ostprotolib.cpp \ + abstractfileformat.cpp \ + fileformat.cpp \ + pcapfileformat.cpp \ + pdmlfileformat.cpp \ + pdmlprotocol.cpp \ + pdmlprotocols.cpp \ + pdmlreader.cpp \ + +SOURCES += \ + protocolwidgetfactory.cpp \ + macconfig.cpp \ + payloadconfig.cpp \ + eth2config.cpp \ + ip6config.cpp + +QMAKE_DISTCLEAN += object_script.* + +include(../protobuf.pri) diff --git a/common/ostprotolib.cpp b/common/ostprotolib.cpp index e46dc8c..bd1fcc2 100644 --- a/common/ostprotolib.cpp +++ b/common/ostprotolib.cpp @@ -24,6 +24,7 @@ QString OstProtoLib::gzipPath_; QString OstProtoLib::diffPath_; QString OstProtoLib::awkPath_; +// TODO: one set method for each external app void OstProtoLib::setExternalApplicationPaths(QString tsharkPath, QString gzipPath, QString diffPath, QString awkPath) { @@ -52,4 +53,3 @@ QString OstProtoLib::awkPath() { return awkPath_; } - diff --git a/common/protocolmanager.cpp b/common/protocolmanager.cpp index e91f270..e1b0225 100644 --- a/common/protocolmanager.cpp +++ b/common/protocolmanager.cpp @@ -21,9 +21,7 @@ along with this program. If not, see #include "abstractprotocol.h" #include "protocol.pb.h" -#include "mac.h" -#include "payload.h" -#include "eth2.h" +#if 0 #include "dot3.h" #include "llc.h" #include "snap.h" @@ -33,7 +31,6 @@ along with this program. If not, see #include "vlanstack.h" #include "arp.h" #include "ip4.h" -#include "ip6.h" #include "ip6over4.h" #include "ip4over6.h" #include "ip4over4.h" @@ -47,6 +44,12 @@ along with this program. If not, see #include "userscript.h" #include "hexdump.h" #include "sample.h" +#else +#include "mac.h" +#include "payload.h" +#include "eth2.h" +#include "ip6.h" +#endif ProtocolManager *OstProtocolManager; @@ -55,11 +58,7 @@ ProtocolManager::ProtocolManager() /*! \todo (LOW) calls to registerProtocol() should be done by the protocols themselves (once this is done remove the #includes for all the protocols) */ - registerProtocol(OstProto::Protocol::kMacFieldNumber, - (void*) MacProtocol::createInstance); - - registerProtocol(OstProto::Protocol::kEth2FieldNumber, - (void*) Eth2Protocol::createInstance); +#if 0 registerProtocol(OstProto::Protocol::kDot3FieldNumber, (void*) Dot3Protocol::createInstance); registerProtocol(OstProto::Protocol::kLlcFieldNumber, @@ -82,8 +81,6 @@ ProtocolManager::ProtocolManager() (void*) ArpProtocol::createInstance); registerProtocol(OstProto::Protocol::kIp4FieldNumber, (void*) Ip4Protocol::createInstance); - registerProtocol(OstProto::Protocol::kIp6FieldNumber, - (void*) Ip6Protocol::createInstance); registerProtocol(OstProto::Protocol::kIp6over4FieldNumber, (void*) Ip6over4Protocol::createInstance); registerProtocol(OstProto::Protocol::kIp4over6FieldNumber, @@ -108,14 +105,22 @@ ProtocolManager::ProtocolManager() registerProtocol(OstProto::Protocol::kHexDumpFieldNumber, (void*) HexDumpProtocol::createInstance); - registerProtocol(OstProto::Protocol::kPayloadFieldNumber, - (void*) PayloadProtocol::createInstance); registerProtocol(OstProto::Protocol::kUserScriptFieldNumber, (void*) UserScriptProtocol::createInstance); registerProtocol(OstProto::Protocol::kSampleFieldNumber, (void*) SampleProtocol::createInstance); +#else + registerProtocol(OstProto::Protocol::kMacFieldNumber, + (void*) MacProtocol::createInstance); + registerProtocol(OstProto::Protocol::kPayloadFieldNumber, + (void*) PayloadProtocol::createInstance); + registerProtocol(OstProto::Protocol::kEth2FieldNumber, + (void*) Eth2Protocol::createInstance); + registerProtocol(OstProto::Protocol::kIp6FieldNumber, + (void*) Ip6Protocol::createInstance); +#endif populateNeighbourProtocols(); } @@ -178,7 +183,9 @@ AbstractProtocol* ProtocolManager::createProtocol(int protoNumber, pc = (AbstractProtocol* (*)(StreamBase*, AbstractProtocol*)) factory.value(protoNumber); - Q_ASSERT(pc != NULL); + Q_ASSERT_X(pc != NULL, + __FUNCTION__, + numberToNameMap.value(protoNumber).toAscii().constData()); p = (*pc)(stream, parent); diff --git a/common/protocolmanager.h b/common/protocolmanager.h index 07b0604..ff7279b 100644 --- a/common/protocolmanager.h +++ b/common/protocolmanager.h @@ -40,6 +40,7 @@ public: ProtocolManager(); ~ProtocolManager(); + // TODO: make registerProtocol static void registerProtocol(int protoNumber, void *protoInstanceCreator); bool isRegisteredProtocol(int protoNumber); diff --git a/common/protocolwidgetfactory.cpp b/common/protocolwidgetfactory.cpp new file mode 100644 index 0000000..b25c876 --- /dev/null +++ b/common/protocolwidgetfactory.cpp @@ -0,0 +1,86 @@ +/* +Copyright (C) 2014 Srivats P. + +This file is part of "Ostinato" + +This 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 3 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, see +*/ + +#include "protocolwidgetfactory.h" + +#include "macconfig.h" +#include "payloadconfig.h" +#include "eth2config.h" +#include "ip6config.h" + +ProtocolWidgetFactory *OstProtocolWidgetFactory; +QMap ProtocolWidgetFactory::configWidgetFactory; + +ProtocolWidgetFactory::ProtocolWidgetFactory() +{ + /*! + * Ideally Protocol Widgets should register themselves + * with the Factory + */ + OstProtocolWidgetFactory->registerProtocolConfigWidget( + OstProto::Protocol::kMacFieldNumber, + (void*) MacConfigForm::createInstance); + OstProtocolWidgetFactory->registerProtocolConfigWidget( + OstProto::Protocol::kPayloadFieldNumber, + (void*) PayloadConfigForm::createInstance); + + OstProtocolWidgetFactory->registerProtocolConfigWidget( + OstProto::Protocol::kEth2FieldNumber, + (void*) Eth2ConfigForm::createInstance); + OstProtocolWidgetFactory->registerProtocolConfigWidget( + OstProto::Protocol::kIp6FieldNumber, + (void*) Ip6ConfigForm::createInstance); +} + +ProtocolWidgetFactory::~ProtocolWidgetFactory() +{ + configWidgetFactory.clear(); +} + +void ProtocolWidgetFactory::registerProtocolConfigWidget(int protoNumber, + void *protoConfigWidgetInstanceCreator) +{ + Q_ASSERT(!configWidgetFactory.contains(protoNumber)); + + configWidgetFactory.insert(protoNumber, protoConfigWidgetInstanceCreator); +} + +AbstractProtocolConfigForm* ProtocolWidgetFactory::createConfigWidget( + int protoNumber) +{ + AbstractProtocolConfigForm* (*pc)(); + AbstractProtocolConfigForm* p; + + pc = (AbstractProtocolConfigForm* (*)()) + configWidgetFactory.value(protoNumber); + + Q_ASSERT_X(pc != NULL, + __FUNCTION__, + QString(protoNumber).toAscii().constData()); + + p = (*pc)(); + + return p; +} + +void ProtocolWidgetFactory::deleteConfigWidget( + AbstractProtocolConfigForm *configWidget) +{ + delete configWidget; +} diff --git a/common/protocolwidgetfactory.h b/common/protocolwidgetfactory.h new file mode 100644 index 0000000..ebb69ec --- /dev/null +++ b/common/protocolwidgetfactory.h @@ -0,0 +1,46 @@ +/* +Copyright (C) 2014 Srivats P. + +This file is part of "Ostinato" + +This 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 3 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, see +*/ + +#ifndef _PROTOCOL_WIDGET_FACTORY_H +#define _PROTOCOL_WIDGET_FACTORY_H + +#include + +class AbstractProtocolConfigForm; + +// Singleton class +class ProtocolWidgetFactory +{ + static QMap configWidgetFactory; + +public: + ProtocolWidgetFactory(); + ~ProtocolWidgetFactory(); + + // TODO: make registerProtocolConfigWidget static?? + // TODO: define a function pointer prototype instead of void* for + // protoConfigWidgetInstanceCreator + static void registerProtocolConfigWidget(int protoNumber, + void *protoConfigWidgetInstanceCreator); + + AbstractProtocolConfigForm* createConfigWidget(int protoNumber); + void deleteConfigWidget(AbstractProtocolConfigForm *configWidget); +}; + +#endif diff --git a/ost.pro b/ost.pro index 0f9d987..9e8bbea 100644 --- a/ost.pro +++ b/ost.pro @@ -4,5 +4,6 @@ SUBDIRS = \ extra \ rpc/pbrpc.pro \ common/ostproto.pro \ + common/ostprotogui.pro \ server/drone.pro \ client/ostinato.pro