Skip to content

Commit

Permalink
Merge pull request #30 from Mahlet-Inc/develop
Browse files Browse the repository at this point in the history
merge in TCP stream import/export plugin
  • Loading branch information
hello-adam authored Apr 10, 2020
2 parents ab9f94f + 384e9a8 commit 113446c
Show file tree
Hide file tree
Showing 14 changed files with 748 additions and 6 deletions.
80 changes: 77 additions & 3 deletions src/hobbits-gui/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ MainWindow::MainWindow(QString extraPluginPath, QString configFilePath, QWidget

// Import menu initialization
populateRecentImportsMenu();
populateRecentExportsMenu();

// create an initial state
checkOperatorInput();
Expand Down Expand Up @@ -720,7 +721,7 @@ void MainWindow::requestImportRun(QString pluginName, QJsonObject pluginState)
if (result.isNull()) {
return;
}
if (!result->getPluginState().isEmpty()) {
if (!result->getPluginState().isEmpty() && !result->getPluginState().contains("error")) {
this->populateRecentImportsMenu({plugin->getName(), result->getPluginState()});
}
if (!result->getContainer().isNull()) {
Expand All @@ -737,7 +738,10 @@ void MainWindow::requestExportRun(QString pluginName, QJsonObject pluginState)
warningMessage("Cannot export without a selected bit container");
}
QSharedPointer<ImportExportInterface> plugin = m_pluginManager->getImporterExporter(pluginName);
plugin->exportBits(currContainer(), pluginState, this);
auto result = plugin->exportBits(currContainer(), pluginState, this);
if (!result->getPluginState().isEmpty() && !result->getPluginState().contains("error")) {
this->populateRecentExportsMenu({plugin->getName(), result->getPluginState()});
}
}

void MainWindow::on_pb_analyze_clicked()
Expand Down Expand Up @@ -1116,6 +1120,7 @@ void MainWindow::populateRecentImportsMenu(QPair<QString, QJsonObject> addition,

SettingsManager::getInstance().setPrivateSetting(key, recentlyImported);

int invalidStateCount = 0;
ui->menuImport_Recent->clear();
for (QString importString : recentlyImported) {
QStringList importParts = importString.split(separator);
Expand All @@ -1133,6 +1138,7 @@ void MainWindow::populateRecentImportsMenu(QPair<QString, QJsonObject> addition,

QString menuLabel = plugin->getImportLabelForState(pluginState);
if (menuLabel.isEmpty()) {
invalidStateCount++;
continue;
}
ui->menuImport_Recent->addAction(
Expand All @@ -1142,7 +1148,75 @@ void MainWindow::populateRecentImportsMenu(QPair<QString, QJsonObject> addition,
});
}

ui->menuImport_Recent->setEnabled(recentlyImported.length() > 0);
ui->menuImport_Recent->setEnabled(recentlyImported.length() - invalidStateCount > 0);
}

void MainWindow::populateRecentExportsMenu(QPair<QString, QJsonObject> addition, QPair<QString, QJsonObject> removal)
{
QString key = "recently_exported";
QString separator = "/[]\"[]/";

QString additionString;
if (!addition.first.isEmpty() && !addition.second.isEmpty()) {
QJsonDocument doc(addition.second);
QString additionJson(doc.toJson(QJsonDocument::Compact));
additionString = QString("%1%2%3").arg(addition.first).arg(separator).arg(additionJson);
}
QString removalString;
if (!removal.first.isEmpty() && !removal.second.isEmpty()) {
QJsonDocument doc(removal.second);
QString removalJson(doc.toJson(QJsonDocument::Compact));
removalString = QString("%1%2%3").arg(removal.first).arg(separator).arg(removalJson);
}

QStringList recentlyExported;
QVariant currentSetting = SettingsManager::getInstance().getPrivateSetting(key);
if (!currentSetting.isNull() && currentSetting.canConvert<QStringList>()) {
recentlyExported = currentSetting.toStringList();
}

if (!removalString.isEmpty()) {
recentlyExported.removeAll(removalString);
}

if (!additionString.isEmpty()) {
recentlyExported.removeAll(additionString);
recentlyExported.insert(0, additionString);
}

recentlyExported = recentlyExported.mid(0, 10);

SettingsManager::getInstance().setPrivateSetting(key, recentlyExported);

int invalidStateCount = 0;
ui->menuExport_Recent->clear();
for (QString importString : recentlyExported) {
QStringList importParts = importString.split(separator);
if (importParts.size() != 2) {
continue;
}
QString pluginName = importParts.at(0);
QSharedPointer<ImportExportInterface> plugin = m_pluginManager->getImporterExporter(pluginName);
if (plugin.isNull()) {
continue;
}

QByteArray pluginStateString = importParts.at(1).toUtf8();
QJsonObject pluginState = QJsonDocument::fromJson(pluginStateString).object();

QString menuLabel = plugin->getExportLabelForState(pluginState);
if (menuLabel.isEmpty()) {
invalidStateCount++;
continue;
}
ui->menuExport_Recent->addAction(
menuLabel,
[this, pluginName, pluginState]() {
this->requestExportRun(pluginName, pluginState);
});
}

ui->menuExport_Recent->setEnabled(recentlyExported.length() - invalidStateCount > 0);
}

void MainWindow::on_tb_scrollReset_clicked()
Expand Down
1 change: 1 addition & 0 deletions src/hobbits-gui/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ private slots:
void removeDisplayGroup(int idx);
void initializeImporterExporters();

void populateRecentExportsMenu(QPair<QString, QJsonObject> addition = QPair<QString, QJsonObject>(), QPair<QString, QJsonObject> removal = QPair<QString, QJsonObject>());
void populateRecentImportsMenu(QPair<QString, QJsonObject> addition = QPair<QString, QJsonObject>(), QPair<QString, QJsonObject> removal = QPair<QString, QJsonObject>());
void populateRecentTemplatesMenu(QString addition = QString(), QString removal = QString());

Expand Down
16 changes: 15 additions & 1 deletion src/hobbits-gui/mainwindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@
<x>0</x>
<y>0</y>
<width>1286</width>
<height>27</height>
<height>29</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
Expand Down Expand Up @@ -323,11 +323,20 @@
<string>Import Recent</string>
</property>
</widget>
<widget class="QMenu" name="menuExport_Recent">
<property name="enabled">
<bool>false</bool>
</property>
<property name="title">
<string>Export Recent</string>
</property>
</widget>
<addaction name="action_Save_Current_Container"/>
<addaction name="actionOpen_Container"/>
<addaction name="separator"/>
<addaction name="menuImport_Recent"/>
<addaction name="menu_Import_Bits_From"/>
<addaction name="menuExport_Recent"/>
<addaction name="menu_Export_Bits_To"/>
<addaction name="separator"/>
<addaction name="menuApply_Recent_Template"/>
Expand Down Expand Up @@ -441,6 +450,11 @@
<string>a</string>
</property>
</action>
<action name="actiona_2">
<property name="text">
<string>a</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<tabstops>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ HttpTransceiver::HttpTransceiver(QWidget *parent) :
QDialog(parent),
ui(new Ui::HttpTransceiver),
m_netManager(new QNetworkAccessManager(this)),
m_downloadFile(new QTemporaryFile),
m_downloadFile(new QTemporaryFile(this)),
m_reply(nullptr)
{
ui->setupUi(this);
Expand Down
56 changes: 56 additions & 0 deletions src/hobbits-plugins/importerexporters/TcpData/TcpData.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#-------------------------------------------------
#
# Project created by QtCreator 2020-04-10T16:34:57.900Z
#
#-------------------------------------------------

QT += widgets network

QT -= gui

TARGET = TcpData
TEMPLATE = lib

DEFINES += TCPDATA_LIBRARY

CONFIG += c++11 plugin
CONFIG -= debug_and_release_target

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += tcpdata.cpp \
tcpreceiver.cpp \
tcpsender.cpp

HEADERS += tcpdata.h \
tcpreceiver.h \
tcpsender.h


LIBS += -L$$OUT_PWD/../../../hobbits-core/ -lhobbits-core

INCLUDEPATH += $$PWD/../../../hobbits-core
DEPENDPATH += $$PWD/../../../hobbits-core

unix:{
QMAKE_LFLAGS_RPATH=
QMAKE_LFLAGS += "-Wl,-rpath,'$$ORIGIN/../../lib:$$ORIGIN'"
}

unix {
target.path = target.path = $$(HOME)/.local/share/hobbits/plugins/analyzers
INSTALLS += target
}

FORMS += \
tcpreceiver.ui \
tcpsender.ui
94 changes: 94 additions & 0 deletions src/hobbits-plugins/importerexporters/TcpData/tcpdata.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#include "tcpdata.h"
#include "tcpreceiver.h"
#include "tcpsender.h"

TcpData::TcpData()
{

}

TcpData::~TcpData()
{
}

ImportExportInterface* TcpData::createDefaultImporterExporter()
{
return new TcpData();
}

QString TcpData::getName()
{
return "TCP Data";
}

bool TcpData::canExport()
{
return true;
}

bool TcpData::canImport()
{
return true;
}

QString TcpData::getImportLabelForState(QJsonObject pluginState)
{
if (pluginState.contains("port") && pluginState.value("port").isDouble()) {
return QString("TCP Listen on port %1").arg(pluginState.value("port").toInt());
}
return "";
}

QString TcpData::getExportLabelForState(QJsonObject pluginState)
{
if (pluginState.contains("port") && pluginState.value("port").isDouble()
&& pluginState.contains("host") && pluginState.value("host").isString()) {
return QString("TCP Export to %1 on port %2").arg(pluginState.value("host").toString()).arg(pluginState.value("port").toInt());
}
return "";
}

QSharedPointer<ImportExportResult> TcpData::importBits(QJsonObject pluginState, QWidget *parent)
{
QSharedPointer<TcpReceiver> receiver = QSharedPointer<TcpReceiver>(new TcpReceiver(parent));
if (pluginState.contains("port") && pluginState.value("port").isDouble()) {
receiver->setPort(pluginState.value("port").toInt());
receiver->startListening();
}

if (receiver->exec()) {
QSharedPointer<BitContainer> container = QSharedPointer<BitContainer>(new BitContainer());
container->setBits(receiver->getDownloadedData());
container->setName("TCP Import");
QJsonObject state;
state.insert("port", receiver->getPort());
return ImportExportResult::create(container, state);
}
else {
return ImportExportResult::error(receiver->getError());
}
}

QSharedPointer<ImportExportResult> TcpData::exportBits(
QSharedPointer<const BitContainer> container,
QJsonObject pluginState,
QWidget *parent)
{
QSharedPointer<TcpSender> sender = QSharedPointer<TcpSender>(new TcpSender(container->bits(), parent));
if (pluginState.contains("port") && pluginState.value("port").isDouble()
&& pluginState.contains("host") && pluginState.value("host").isString()) {
sender->setPort(pluginState.value("port").toInt());
sender->setHost(pluginState.value("host").toString());
sender->sendData();
}

if (sender->exec()) {
QJsonObject state;
state.insert("port", sender->getPort());
state.insert("host", sender->getHost());
return ImportExportResult::create(state);
}
else {
return ImportExportResult::error("Failed to export bits over TCP");
}
}
35 changes: 35 additions & 0 deletions src/hobbits-plugins/importerexporters/TcpData/tcpdata.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#ifndef TCPDATA_H
#define TCPDATA_H

#include "importexportinterface.h"

class TcpData : public QObject, ImportExportInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "hobbits.ImportExportInterface.TcpData")
Q_INTERFACES(ImportExportInterface)

public:
TcpData();
~TcpData();

ImportExportInterface* createDefaultImporterExporter() override;

QString getName() override;

bool canExport() override;
bool canImport() override;

QString getImportLabelForState(QJsonObject pluginState) override;
QString getExportLabelForState(QJsonObject pluginState) override;

QSharedPointer<ImportExportResult> importBits(QJsonObject pluginState, QWidget *parent) override;
QSharedPointer<ImportExportResult> exportBits(
QSharedPointer<const BitContainer> container,
QJsonObject pluginState,
QWidget *parent) override;

private:
};

#endif // TCPDATA_H
Loading

0 comments on commit 113446c

Please sign in to comment.