From eba9d5f6b1ac6001e932ba1d81b95dc40fa73123 Mon Sep 17 00:00:00 2001 From: wetbadger Date: Mon, 7 Jun 2021 13:42:43 -0400 Subject: [PATCH 01/14] The size now displays underneath the name of each bit container --- src/hobbits-core/bitcontainer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hobbits-core/bitcontainer.cpp b/src/hobbits-core/bitcontainer.cpp index 161ee6b1..f47b7fe8 100644 --- a/src/hobbits-core/bitcontainer.cpp +++ b/src/hobbits-core/bitcontainer.cpp @@ -85,7 +85,8 @@ qint64 BitContainer::maxFrameWidth() const QString BitContainer::name() const { - return m_name; + int size = m_bits->sizeInBits(); + return (m_name + "\n%1 bits").arg(size); } void BitContainer::setName(QString name) From 0e7d96872bff815b18af328f741e3d88ca6f02e0 Mon Sep 17 00:00:00 2001 From: wetbadger Date: Mon, 7 Jun 2021 20:27:26 -0400 Subject: [PATCH 02/14] Size of file in bits now shows beneath the name --- src/hobbits-core/bitcontainer.cpp | 7 +++++-- src/hobbits-core/bitcontainer.h | 2 ++ src/hobbits-widgets/bitcontainertreemodel.cpp | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/hobbits-core/bitcontainer.cpp b/src/hobbits-core/bitcontainer.cpp index f47b7fe8..be4d4ed0 100644 --- a/src/hobbits-core/bitcontainer.cpp +++ b/src/hobbits-core/bitcontainer.cpp @@ -85,8 +85,11 @@ qint64 BitContainer::maxFrameWidth() const QString BitContainer::name() const { - int size = m_bits->sizeInBits(); - return (m_name + "\n%1 bits").arg(size); + return m_name; +} + +qint64 BitContainer::size() const { + return m_bits->sizeInBits(); } void BitContainer::setName(QString name) diff --git a/src/hobbits-core/bitcontainer.h b/src/hobbits-core/bitcontainer.h index 4ad798bd..5ac1b1b0 100644 --- a/src/hobbits-core/bitcontainer.h +++ b/src/hobbits-core/bitcontainer.h @@ -47,6 +47,8 @@ class HOBBITSCORESHARED_EXPORT BitContainer : public QObject qint64 frameCount() const; qint64 maxFrameWidth() const; + qint64 size() const; + QString name() const; void setName(QString name); bool nameWasSet() const; diff --git a/src/hobbits-widgets/bitcontainertreemodel.cpp b/src/hobbits-widgets/bitcontainertreemodel.cpp index 7bdb9089..3f7a017c 100644 --- a/src/hobbits-widgets/bitcontainertreemodel.cpp +++ b/src/hobbits-widgets/bitcontainertreemodel.cpp @@ -18,7 +18,7 @@ QVariant BitContainerTreeModel::data(const QModelIndex &index, int role) const BitContainer *container = static_cast(index.internalPointer()); if (role == Qt::DisplayRole) { - return QVariant(container->name()); + return QVariant(QString(container->name()+"\n%1 bits").arg(container->size())); } else if (role == Qt::DecorationRole) { return QVariant(DisplayHelper::bitRasterThumbnail(container)); From d8f880fb1117c52ca9eb450d9da02527f3db1140 Mon Sep 17 00:00:00 2001 From: wetbadger Date: Mon, 14 Jun 2021 18:52:05 -0400 Subject: [PATCH 03/14] Created the core editor functionality --- src/hobbits-gui/mainwindow.cpp | 1 + src/hobbits-plugins/operators/Edit/edit.cpp | 145 ++++++++++++++++++ src/hobbits-plugins/operators/Edit/edit.h | 34 ++++ .../operators/Edit/editeditor.cpp | 71 +++++++++ .../operators/Edit/editeditor.h | 36 +++++ .../operators/Edit/editeditor.ui | 56 +++++++ 6 files changed, 343 insertions(+) create mode 100644 src/hobbits-plugins/operators/Edit/edit.cpp create mode 100644 src/hobbits-plugins/operators/Edit/edit.h create mode 100644 src/hobbits-plugins/operators/Edit/editeditor.cpp create mode 100644 src/hobbits-plugins/operators/Edit/editeditor.h create mode 100644 src/hobbits-plugins/operators/Edit/editeditor.ui diff --git a/src/hobbits-gui/mainwindow.cpp b/src/hobbits-gui/mainwindow.cpp index b8225ee0..d2dce1ef 100644 --- a/src/hobbits-gui/mainwindow.cpp +++ b/src/hobbits-gui/mainwindow.cpp @@ -543,6 +543,7 @@ void MainWindow::currBitContainerChanged() { sendBitContainerPreview(); checkOperatorInput(); + //send new data to plugins? } void MainWindow::sendBitContainerPreview() diff --git a/src/hobbits-plugins/operators/Edit/edit.cpp b/src/hobbits-plugins/operators/Edit/edit.cpp new file mode 100644 index 00000000..c6d15ee1 --- /dev/null +++ b/src/hobbits-plugins/operators/Edit/edit.cpp @@ -0,0 +1,145 @@ +#include "edit.h" +#include "editeditor.h" + +Edit::Edit() +{ + QList infos = { + // TODO: add parameters like {"myparametername", ParameterDelegate::ParameterType::Decimal} + {"start", ParameterDelegate::ParameterType::Decimal}, + {"length", ParameterDelegate::ParameterType::Decimal}, + {"new_bits_in_range", ParameterDelegate::ParameterType::String, false} + }; + + m_delegate = ParameterDelegate::create( + infos, + [this](const Parameters ¶meters) { + // TODO: use parameters to describe action better + return QString("Apply %1").arg(this->name()); + }, + [](QSharedPointer delegate, QSize size) { + Q_UNUSED(size) + return new EditEditor(delegate); + }); +} + +OperatorInterface* Edit::createDefaultOperator() +{ + return new Edit(); +} + +QString Edit::name() +{ + return "Edit"; +} + +QString Edit::description() +{ + // TODO: create actual description + return "Load Hexidecimal characters, and modify them individually."; +} + +QStringList Edit::tags() +{ + // TODO: add relevant tags + return {"Generic"}; +} + +QSharedPointer Edit::parameterDelegate() +{ + return m_delegate; +} + +int Edit::getMinInputContainers(const Parameters ¶meters) +{ + Q_UNUSED(parameters) + return 1; +} + +int Edit::getMaxInputContainers(const Parameters ¶meters) +{ + Q_UNUSED(parameters) + return 1; +} + +QSharedPointer Edit::operateOnBits( + QList > inputContainers, + const Parameters ¶meters, + QSharedPointer progress) +{ + if (inputContainers.length() != 1) { + return OperatorResult::error("Requires a single input bit container"); + } + + QStringList invalidations = m_delegate->validate(parameters); + if (!invalidations.isEmpty()) { + return OperatorResult::error(QString("Invalid parameters passed to %1:\n%2").arg(name()).arg(invalidations.join("\n"))); + } + //get values from spin boxes + qint64 start = parameters.value("start").toInt(); + qint64 length = parameters.value("length").toInt(); + + //get bits from text box + QString newBitsInRange = parameters.value("new_bits_in_range").toString(); + + //length = 8; //force for now + + //TODO: pte_bits is already filled with data from start to length + // + //auto bitContainer = inputContainers.first(); + QList> outputContainers; + + //things I can do: + // create an identical bit container + // create a bitContainer of same size with all zeros + // get bit array from inputContainer + + //things I'd like to do: + //change individual bits in BitArray + + + //bits as ? + int end = start + length; + int inputContainerSize = inputContainers.at(0)->size(); + QSharedPointer bits = inputContainers.at(0)->bits(); + int outputSize = inputContainerSize - length + newBitsInRange.length(); + auto outBits = QSharedPointer(new BitArray(outputSize)); + bits->copyBits(0, outBits.data(), 0, outputSize, BitArray::Copy); + + //do something with bits here + //ex 0000 1111 -> 1111 0000 + + int j = 0; //j represents the index of the newBitsInRange string + int i2 = 0; //the index from the input container + bool setiToEnd; + + for (int i = 0; i < outputSize; i ++) { //i represents the index of the outBits, soon to be outputContainer + if (i < start || i > start + newBitsInRange.length() - 1) { + if (setiToEnd) { + i2 = end; + setiToEnd = false; + } + if (i2 < inputContainerSize) { + outBits->set(i, inputContainers.at(0)->bits()->at(i2)); //copy bits from input container + } + i2+=1; + } else { + const QChar x = newBitsInRange.at(j); + if (x.digitValue() == 0) + outBits->set(i, false); //false is 0, true is 1 + else + outBits->set(i, true); //false is 0, true is 1 + j += 1; + setiToEnd = true; + } + } + + //for each bit in the bit container + //if bit index is less than the start index, or greater than the end index, copy the bit exactly + + auto bitContainer = BitContainer::create(outBits); + + outputContainers.append(bitContainer); + return OperatorResult::result(outputContainers, parameters); + // TODO: Perform operation and return result with OperatorResult::result + //return OperatorResult::error("Bits from start to length would be changed according to your entry, but that is not implemented yet."); +} diff --git a/src/hobbits-plugins/operators/Edit/edit.h b/src/hobbits-plugins/operators/Edit/edit.h new file mode 100644 index 00000000..13621562 --- /dev/null +++ b/src/hobbits-plugins/operators/Edit/edit.h @@ -0,0 +1,34 @@ +#pragma once + +#include "operatorinterface.h" +#include "parameterdelegate.h" + +class Edit : public QObject, OperatorInterface +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "hobbits.OperatorInterface.Edit") + Q_INTERFACES(OperatorInterface) + +public: + Edit(); + + OperatorInterface* createDefaultOperator() override; + + QString name() override; + QString description() override; + QStringList tags() override; + + QSharedPointer parameterDelegate() override; + + int getMinInputContainers(const Parameters ¶meters) override; + int getMaxInputContainers(const Parameters ¶meters) override; + + QSharedPointer operateOnBits( + QList> inputContainers, + const Parameters ¶meters, + QSharedPointer progress) override; + +private: + QSharedPointer m_delegate; +}; + diff --git a/src/hobbits-plugins/operators/Edit/editeditor.cpp b/src/hobbits-plugins/operators/Edit/editeditor.cpp new file mode 100644 index 00000000..1a6f288d --- /dev/null +++ b/src/hobbits-plugins/operators/Edit/editeditor.cpp @@ -0,0 +1,71 @@ +#include "editeditor.h" +#include "ui_editeditor.h" + +EditEditor::EditEditor(QSharedPointer delegate): + ui(new Ui::EditEditor()), + m_paramHelper(new ParameterHelper(delegate)) +{ + + + ui->setupUi(this); + + ui->sb_length->setMaximum(2147483647); //can this be set to the bitcontainer size? + ui->sb_start->setMaximum(2147483647); + + ui->sb_length->setMinimum(0); + ui->sb_start->setMinimum(0); + //On spinbox value change, change the bits shown in pte_bits + connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); + connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); + + m_paramHelper->addSpinBoxIntParameter("start", ui->sb_start); + m_paramHelper->addSpinBoxIntParameter("length", ui->sb_length); + + m_paramHelper->addTextEditStringParameter("new_bits_in_range", ui->pte_bits); + + + // TODO: Correlate parameters in given delegate to form fields + // Ex 1. + // m_paramHelper->addSpinBoxIntParameter("myparametername", ui->spinBox); + // Ex 2. + // m_paramHelper->addParameter("otherparameter", [this](QJsonValue value) { + // // set the value in the editor + // ui->spinBox->setValue(value.toInt()); + // return true; // return false if unable to set the value in the editor + // }, [this]() { + // // get the QJsonValue from the editor + // return QJsonValue(ui->spinBox->value()); + // }); +} + +EditEditor::~EditEditor() +{ + delete ui; +} + +QString EditEditor::title() +{ + // TODO: Make this more descriptive + return "Configure Edit"; +} + +Parameters EditEditor::parameters() +{ + return m_paramHelper->getParametersFromUi(); +} + +bool EditEditor::setParameters(const Parameters ¶meters) +{ + return m_paramHelper->applyParametersToUi(parameters); +} + +void EditEditor::previewBitsImpl(QSharedPointer container, + QSharedPointer progress) +{ + // TODO: (Optional) Preview the currently active BitContainer (preprocess it, enrich it, etc) +} + +void EditEditor::previewBitsUiImpl(QSharedPointer container) +{ + // TODO: (Optional) Update UI elements to account for preprocessing in previewBitsImpl and/or other metadata +} diff --git a/src/hobbits-plugins/operators/Edit/editeditor.h b/src/hobbits-plugins/operators/Edit/editeditor.h new file mode 100644 index 00000000..a6d3dfe7 --- /dev/null +++ b/src/hobbits-plugins/operators/Edit/editeditor.h @@ -0,0 +1,36 @@ +#pragma once + + + +#include "abstractparametereditor.h" +#include "parameterhelper.h" + +namespace Ui +{ +class EditEditor; +} + +class EditEditor : public AbstractParameterEditor +{ + Q_OBJECT + +public: + EditEditor(QSharedPointer delegate); + ~EditEditor() override; + + QString title() override; + + bool setParameters(const Parameters ¶meters) override; + Parameters parameters() override; + +private: + void previewBitsImpl(QSharedPointer container, + QSharedPointer progress) override; + void previewBitsUiImpl(QSharedPointer container) override; + + Ui::EditEditor *ui; + QSharedPointer m_paramHelper; +}; + + + diff --git a/src/hobbits-plugins/operators/Edit/editeditor.ui b/src/hobbits-plugins/operators/Edit/editeditor.ui new file mode 100644 index 00000000..ba1ceb47 --- /dev/null +++ b/src/hobbits-plugins/operators/Edit/editeditor.ui @@ -0,0 +1,56 @@ + + + EditEditor + + + + 0 + 0 + 604 + 147 + + + + Form + + + + + + + + Bit Start: + + + + + + + + + + + + + + Bit Length: + + + + + + + 8 + + + + + + + + + + + + + From 0247a5194b4155da6dcdf2b24b26bd751934b6b8 Mon Sep 17 00:00:00 2001 From: wetbadger Date: Fri, 18 Jun 2021 12:27:02 -0400 Subject: [PATCH 04/14] Editor is fully functional. (Fingers crossed.) --- .qt_for_python/uic/editeditor.py | 71 +++++ src/hobbits-plugins/operators/Edit/edit.cpp | 253 +++++++++++++++--- .../operators/Edit/editeditor.cpp | 27 ++ .../operators/Edit/editeditor.ui | 89 ++++-- 4 files changed, 384 insertions(+), 56 deletions(-) create mode 100644 .qt_for_python/uic/editeditor.py diff --git a/.qt_for_python/uic/editeditor.py b/.qt_for_python/uic/editeditor.py new file mode 100644 index 00000000..30806b24 --- /dev/null +++ b/.qt_for_python/uic/editeditor.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file '/home/benjamin/Desktop/Development/work/hobbits/src/hobbits-plugins/operators/Edit/editeditor.ui' +# +# Created by: PyQt5 UI code generator 5.10.1 +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore, QtGui, QtWidgets + +class Ui_EditEditor(object): + def setupUi(self, EditEditor): + EditEditor.setObjectName("EditEditor") + EditEditor.resize(604, 156) + self.verticalLayout = QtWidgets.QVBoxLayout(EditEditor) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.verticalLayout_3 = QtWidgets.QVBoxLayout() + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.rb_bit = QtWidgets.QRadioButton(EditEditor) + self.rb_bit.setChecked(True) + self.rb_bit.setObjectName("rb_bit") + self.verticalLayout_3.addWidget(self.rb_bit) + self.rb_hex = QtWidgets.QRadioButton(EditEditor) + self.rb_hex.setObjectName("rb_hex") + self.verticalLayout_3.addWidget(self.rb_hex) + self.rb_ascii = QtWidgets.QRadioButton(EditEditor) + self.rb_ascii.setObjectName("rb_ascii") + self.verticalLayout_3.addWidget(self.rb_ascii) + self.horizontalLayout_3.addLayout(self.verticalLayout_3) + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.lb_start = QtWidgets.QLabel(EditEditor) + self.lb_start.setObjectName("lb_start") + self.horizontalLayout_4.addWidget(self.lb_start) + self.sb_start = QtWidgets.QSpinBox(EditEditor) + self.sb_start.setObjectName("sb_start") + self.horizontalLayout_4.addWidget(self.sb_start) + self.verticalLayout_2.addLayout(self.horizontalLayout_4) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + self.lb_length = QtWidgets.QLabel(EditEditor) + self.lb_length.setObjectName("lb_length") + self.horizontalLayout_5.addWidget(self.lb_length) + self.sb_length = QtWidgets.QSpinBox(EditEditor) + self.sb_length.setObjectName("sb_length") + self.horizontalLayout_5.addWidget(self.sb_length) + self.verticalLayout_2.addLayout(self.horizontalLayout_5) + self.horizontalLayout_3.addLayout(self.verticalLayout_2) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem) + self.verticalLayout.addLayout(self.horizontalLayout_3) + self.pte_bits = QtWidgets.QPlainTextEdit(EditEditor) + self.pte_bits.setObjectName("pte_bits") + self.verticalLayout.addWidget(self.pte_bits) + + self.retranslateUi(EditEditor) + QtCore.QMetaObject.connectSlotsByName(EditEditor) + + def retranslateUi(self, EditEditor): + _translate = QtCore.QCoreApplication.translate + EditEditor.setWindowTitle(_translate("EditEditor", "Form")) + self.rb_bit.setText(_translate("EditEditor", "Bit")) + self.rb_hex.setText(_translate("EditEditor", "Hex")) + self.rb_ascii.setText(_translate("EditEditor", "Ascii")) + self.lb_start.setText(_translate("EditEditor", "Bit Start:")) + self.lb_length.setText(_translate("EditEditor", "Bit Length:")) + diff --git a/src/hobbits-plugins/operators/Edit/edit.cpp b/src/hobbits-plugins/operators/Edit/edit.cpp index c6d15ee1..6e239c0c 100644 --- a/src/hobbits-plugins/operators/Edit/edit.cpp +++ b/src/hobbits-plugins/operators/Edit/edit.cpp @@ -7,7 +7,8 @@ Edit::Edit() // TODO: add parameters like {"myparametername", ParameterDelegate::ParameterType::Decimal} {"start", ParameterDelegate::ParameterType::Decimal}, {"length", ParameterDelegate::ParameterType::Decimal}, - {"new_bits_in_range", ParameterDelegate::ParameterType::String, false} + {"new_bits_in_range", ParameterDelegate::ParameterType::String, false}, + {"edit_type", ParameterDelegate::ParameterType::String} }; m_delegate = ParameterDelegate::create( @@ -78,6 +79,9 @@ QSharedPointer Edit::operateOnBits( qint64 start = parameters.value("start").toInt(); qint64 length = parameters.value("length").toInt(); + //get mode: bits, hex, ascii + //int mode = 1; + //get bits from text box QString newBitsInRange = parameters.value("new_bits_in_range").toString(); @@ -87,49 +91,230 @@ QSharedPointer Edit::operateOnBits( // //auto bitContainer = inputContainers.first(); QList> outputContainers; + QSharedPointer outBits; - //things I can do: - // create an identical bit container - // create a bitContainer of same size with all zeros - // get bit array from inputContainer - - //things I'd like to do: - //change individual bits in BitArray - //bits as ? + //do something with bits here + //ex 0000 1111 -> 1111 0000 + int end = start + length; int inputContainerSize = inputContainers.at(0)->size(); QSharedPointer bits = inputContainers.at(0)->bits(); - int outputSize = inputContainerSize - length + newBitsInRange.length(); - auto outBits = QSharedPointer(new BitArray(outputSize)); - bits->copyBits(0, outBits.data(), 0, outputSize, BitArray::Copy); + int newBitsInRangeLength = newBitsInRange.length(); + - //do something with bits here - //ex 0000 1111 -> 1111 0000 + if (parameters.value("edit_type").toString() == "bit") { //bits + + int outputSize = inputContainerSize - length + newBitsInRangeLength; + outBits = QSharedPointer(new BitArray(outputSize)); + bits->copyBits(0, outBits.data(), 0, outputSize, BitArray::Copy); + + - int j = 0; //j represents the index of the newBitsInRange string - int i2 = 0; //the index from the input container - bool setiToEnd; - - for (int i = 0; i < outputSize; i ++) { //i represents the index of the outBits, soon to be outputContainer - if (i < start || i > start + newBitsInRange.length() - 1) { - if (setiToEnd) { - i2 = end; - setiToEnd = false; + int j = 0; //j represents the index of the newBitsInRange string + int i2 = 0; //the index from the input container + bool setiToEnd = false; + bool checkSeti = true; + + for (int i = 0; i < outputSize; i ++) { //i represents the index of the outBits, soon to be outputContainer + if (i < start || i > start + newBitsInRangeLength - 1) { + if (newBitsInRangeLength == 0 && i >= start && checkSeti) { //if input is empty set index from input container to ending index + setiToEnd = true; + checkSeti = false; + } + if (setiToEnd) { + i2 = end; + setiToEnd = false; + } + if (i2 < inputContainerSize) { + outBits->set(i, inputContainers.at(0)->bits()->at(i2)); //copy bits from input container + } + i2++; + } else { + const QChar x = newBitsInRange.at(j); + if (x.digitValue() == 0) + outBits->set(i, false); //false is 0, true is 1 + else if (x.digitValue() == 1) + outBits->set(i, true); //false is 0, true is 1 + else + return OperatorResult::error("You can only use 0 or 1 in bit mode."); + j++; + setiToEnd = true; } - if (i2 < inputContainerSize) { - outBits->set(i, inputContainers.at(0)->bits()->at(i2)); //copy bits from input container + } + } else if (parameters.value("edit_type").toString() == "hex") { //hex + + int outputSize = inputContainerSize - (length * 4) + (newBitsInRangeLength * 4); + outBits = QSharedPointer(new BitArray(outputSize)); + bits->copyBits(0, outBits.data(), 0, outputSize, BitArray::Copy); + + int i2 = 0; + int j = 0; + int ji = 0; //increment 4 times before incrementing j + bool setiToEnd = false; + bool checkSeti = true; + for (int i = 0; i < outputSize; i++) { + if (i < start * 4 || i > (start * 4) + ((newBitsInRangeLength * 4)-1)) { + + if (newBitsInRangeLength == 0 && i >= start && checkSeti) { //if input is empty set index from input container to ending index + setiToEnd = true; + checkSeti = false; + } + if (setiToEnd) { + i2 = end * 4; + setiToEnd = false; + } + if (i2 < inputContainerSize) { + outBits->set(i, inputContainers.at(0)->bits()->at(i2)); //copy bits from input container + } + + } else { + + const QChar x = newBitsInRange.at(j); + + if (x == '0') { + outBits->set(i, false); //false is 0, true is 1 + } else + if (x == '1') { + if (ji < 3) { + outBits->set(i, false); //false is 0, true is 1 + } else { + outBits->set(i, true); //false is 0, true is 1 + } + } else + if (x == '2') { + if (ji < 2 || ji > 2) { + outBits->set(i, false); //false is 0, true is 1 + } else { + outBits->set(i, true); //false is 0, true is 1 + } + } else + if (x == '3') { + if (ji == 2 || ji == 3) { + outBits->set(i, true); //false is 0, true is 1 + } else { + outBits->set(i, false); //false is 0, true is 1 + } + } else + + + if (x == '4') { + if (ji == 1) { + outBits->set(i, true); //false is 0, true is 1 + } else { + outBits->set(i, false); //false is 0, true is 1 + } + } else + if (x == '5') { + if (ji == 1 || ji == 3) { + outBits->set(i, true); //false is 0, true is 1 + } else { + outBits->set(i, false); //false is 0, true is 1 + } + } else + if (x == '6') { + if (ji == 1 || ji == 2) { + outBits->set(i, true); //false is 0, true is 1 + } else { + outBits->set(i, false); //false is 0, true is 1 + } + } else + if (x == '7') { + if (ji > 0) { + outBits->set(i, true); //false is 0, true is 1 + } else { + outBits->set(i, false); //false is 0, true is 1 + } + } else + + + if (x == '8') { + if (ji == 0) { + outBits->set(i, true); + } else { + outBits->set(i, false); //false is 0, true is 1 + } + } else + if (x == '9') { + if (ji == 0 || ji > 2) { + outBits->set(i, true); + } else { + outBits->set(i, false); //false is 0, true is 1 + } + } else + if (x == 'a') { + if (ji == 0 || ji == 2) { + outBits->set(i, true); + } else { + outBits->set(i, false); //false is 0, true is 1 + } + } else + if (x == 'b') { + if (ji == 1) { + outBits->set(i, false); //false is 0, true is 1 + } else { + outBits->set(i, true); //false is 0, true is 1 + } + } else + + + if (x == 'c') { + if (ji < 2) { + outBits->set(i, true); //false is 0, true is 1 + } else { + outBits->set(i, false); //false is 0, true is 1 + } + } else + if (x == 'd') { + if (ji == 2) { + outBits->set(i, false); //false is 0, true is 1 + } else { + outBits->set(i, true); //false is 0, true is 1 + } + } else + if (x == 'e') { + if (ji == 3) { + outBits->set(i, false); //false is 0, true is 1 + } else { + outBits->set(i, true); //false is 0, true is 1 + } + } else + if (x == 'f') { + outBits->set(i, true); //false is 0, true is 1 + } else { + QString str = " is an invalid character."; + return OperatorResult::error(x + str); + } + ji+=1; //increment 4 times before incrementing j + if (ji >= 4) { + j++; + ji = 0; + } + + setiToEnd = true; } - i2+=1; + i2++; + } + + } else if (parameters.value("edit_type").toString() == "ascii") { //ascii + + int outputSize = inputContainerSize - (length * 8) + (newBitsInRangeLength * 8); + outBits = QSharedPointer(new BitArray(outputSize)); + bits->copyBits(0, outBits.data(), 0, outputSize, BitArray::Copy); + + QByteArray nair = newBitsInRange.toLocal8Bit(); + const char * newAsciiInRange = nair.data(); + + if (newBitsInRangeLength == length) { + outBits->setBytes(start, newAsciiInRange, 0, newBitsInRangeLength); } else { - const QChar x = newBitsInRange.at(j); - if (x.digitValue() == 0) - outBits->set(i, false); //false is 0, true is 1 - else - outBits->set(i, true); //false is 0, true is 1 - j += 1; - setiToEnd = true; + QSharedPointer postBits = QSharedPointer(new BitArray(outputSize - start + length )); + QByteArray byteArray = bits->readBytes(start + length, outputSize - 1); + int endLength = byteArray.length(); + const char* data = byteArray.data(); + outBits->setBytes(start+newBitsInRangeLength, data, 0, endLength); + outBits->setBytes(start, newAsciiInRange, 0, newBitsInRangeLength); } } @@ -142,4 +327,4 @@ QSharedPointer Edit::operateOnBits( return OperatorResult::result(outputContainers, parameters); // TODO: Perform operation and return result with OperatorResult::result //return OperatorResult::error("Bits from start to length would be changed according to your entry, but that is not implemented yet."); -} +} \ No newline at end of file diff --git a/src/hobbits-plugins/operators/Edit/editeditor.cpp b/src/hobbits-plugins/operators/Edit/editeditor.cpp index 1a6f288d..b8d802c3 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.cpp +++ b/src/hobbits-plugins/operators/Edit/editeditor.cpp @@ -18,11 +18,38 @@ EditEditor::EditEditor(QSharedPointer delegate): connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); + //On radio button value change + connect(ui->rb_bit, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); + connect(ui->rb_hex, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); + connect(ui->rb_ascii, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); + + m_paramHelper->addSpinBoxIntParameter("start", ui->sb_start); m_paramHelper->addSpinBoxIntParameter("length", ui->sb_length); m_paramHelper->addTextEditStringParameter("new_bits_in_range", ui->pte_bits); + m_paramHelper->addParameter("edit_type", [this](QJsonValue value) { + if (value.toString() == "bit") { + ui->rb_bit->setChecked(true); + } + else if (value.toString() == "hex") { + ui->rb_hex->setChecked(true); + } else { + ui->rb_ascii->setChecked(true); + } + return true; + }, [this]() { + if (ui->rb_bit->isChecked()) { + return QJsonValue("bit"); + } + else if (ui->rb_hex->isChecked()) { + return QJsonValue("hex"); + } else { + return QJsonValue("ascii"); + } + }); + // TODO: Correlate parameters in given delegate to form fields // Ex 1. diff --git a/src/hobbits-plugins/operators/Edit/editeditor.ui b/src/hobbits-plugins/operators/Edit/editeditor.ui index ba1ceb47..3166b1fe 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.ui +++ b/src/hobbits-plugins/operators/Edit/editeditor.ui @@ -7,7 +7,7 @@ 0 0 604 - 147 + 156 @@ -15,34 +15,79 @@ - + - - - Bit Start: - - + + + + + Bit + + + true + + + + + + + Hex + + + + + + + Ascii + + + + - + + + + + + + Bit Start: + + + + + + + + + + + + + + Bit Length: + + + + + + + + + - - - - - - - Bit Length: + + + Qt::Horizontal - - - - - - 8 + + + 40 + 20 + - + From a8b0f6f7ca630db9caa8a6769e0dd291295e723b Mon Sep 17 00:00:00 2001 From: wetbadger Date: Tue, 22 Jun 2021 14:55:49 -0400 Subject: [PATCH 05/14] Change text of spin box labels to match data sizes. --- src/hobbits-plugins/operators/Edit/edit.cpp | 8 ++---- .../operators/Edit/editeditor.cpp | 28 +++++++++++++++++-- .../operators/Edit/editeditor.h | 6 ++++ .../operators/Edit/editeditor.ui | 23 +++++++++++++-- 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/src/hobbits-plugins/operators/Edit/edit.cpp b/src/hobbits-plugins/operators/Edit/edit.cpp index 6e239c0c..2f5ef2c2 100644 --- a/src/hobbits-plugins/operators/Edit/edit.cpp +++ b/src/hobbits-plugins/operators/Edit/edit.cpp @@ -36,7 +36,7 @@ QString Edit::name() QString Edit::description() { // TODO: create actual description - return "Load Hexidecimal characters, and modify them individually."; + return "Load bits, and modify them individually."; } QStringList Edit::tags() @@ -67,6 +67,7 @@ QSharedPointer Edit::operateOnBits( const Parameters ¶meters, QSharedPointer progress) { + if (inputContainers.length() != 1) { return OperatorResult::error("Requires a single input bit container"); } @@ -79,14 +80,10 @@ QSharedPointer Edit::operateOnBits( qint64 start = parameters.value("start").toInt(); qint64 length = parameters.value("length").toInt(); - //get mode: bits, hex, ascii - //int mode = 1; //get bits from text box QString newBitsInRange = parameters.value("new_bits_in_range").toString(); - //length = 8; //force for now - //TODO: pte_bits is already filled with data from start to length // //auto bitContainer = inputContainers.first(); @@ -324,6 +321,7 @@ QSharedPointer Edit::operateOnBits( auto bitContainer = BitContainer::create(outBits); outputContainers.append(bitContainer); + //return OperatorResult::error("Hej"); return OperatorResult::result(outputContainers, parameters); // TODO: Perform operation and return result with OperatorResult::result //return OperatorResult::error("Bits from start to length would be changed according to your entry, but that is not implemented yet."); diff --git a/src/hobbits-plugins/operators/Edit/editeditor.cpp b/src/hobbits-plugins/operators/Edit/editeditor.cpp index b8d802c3..74309970 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.cpp +++ b/src/hobbits-plugins/operators/Edit/editeditor.cpp @@ -14,19 +14,27 @@ EditEditor::EditEditor(QSharedPointer delegate): ui->sb_length->setMinimum(0); ui->sb_start->setMinimum(0); + + //On spinbox value change, change the bits shown in pte_bits connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); //On radio button value change - connect(ui->rb_bit, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); - connect(ui->rb_hex, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); - connect(ui->rb_ascii, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); + + connect(ui->rb_bit, SIGNAL(toggled(bool)), this, SLOT(labelSetText())); + connect(ui->rb_hex, SIGNAL(toggled(bool)), this, SLOT(labelSetText())); + connect(ui->rb_ascii, SIGNAL(toggled(bool)), this, SLOT(labelSetText())); + + m_paramHelper->addSpinBoxIntParameter("start", ui->sb_start); m_paramHelper->addSpinBoxIntParameter("length", ui->sb_length); + //m_paramHelper->addLabelParameter("start_label", ui->lb_start); + //m_paramHelper->addLabelParameter("length_label", ui->lb_length); + m_paramHelper->addTextEditStringParameter("new_bits_in_range", ui->pte_bits); m_paramHelper->addParameter("edit_type", [this](QJsonValue value) { @@ -65,6 +73,20 @@ EditEditor::EditEditor(QSharedPointer delegate): // }); } +void EditEditor::labelSetText() { + if (ui->rb_bit->isChecked()) { + ui->lb_start->setText("Bit Start"); + ui->lb_length->setText("Bit Length"); + } else if (ui->rb_hex->isChecked()) { + ui->lb_start->setText("Nibble Start"); + ui->lb_length->setText("Nibble Length"); + } else { + ui->lb_start->setText("Byte Start"); + ui->lb_length->setText("Byte Length"); + } + +} + EditEditor::~EditEditor() { delete ui; diff --git a/src/hobbits-plugins/operators/Edit/editeditor.h b/src/hobbits-plugins/operators/Edit/editeditor.h index a6d3dfe7..f0867a72 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.h +++ b/src/hobbits-plugins/operators/Edit/editeditor.h @@ -30,6 +30,12 @@ class EditEditor : public AbstractParameterEditor Ui::EditEditor *ui; QSharedPointer m_paramHelper; + +signals: +public slots: + //void labelSetText(QString str1, QString str2); + void labelSetText(); + }; diff --git a/src/hobbits-plugins/operators/Edit/editeditor.ui b/src/hobbits-plugins/operators/Edit/editeditor.ui index 3166b1fe..20891e8c 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.ui +++ b/src/hobbits-plugins/operators/Edit/editeditor.ui @@ -7,7 +7,7 @@ 0 0 604 - 156 + 179 @@ -56,7 +56,14 @@ - + + + 0 + + + 0 + + @@ -70,7 +77,17 @@ - + + + 0 + + + 2147483647 + + + 8 + + From 275e8b1208499583fbbff885896e8a54635ce094 Mon Sep 17 00:00:00 2001 From: wetbadger Date: Tue, 22 Jun 2021 17:09:33 -0400 Subject: [PATCH 06/14] Improved on labels and spinboxes changin according to bit/hex/ascii --- .qt_for_python/uic/editeditor.py | 71 ------------------- .../operators/Edit/editeditor.cpp | 37 ++++++++-- .../operators/Edit/editeditor.h | 4 +- 3 files changed, 35 insertions(+), 77 deletions(-) delete mode 100644 .qt_for_python/uic/editeditor.py diff --git a/.qt_for_python/uic/editeditor.py b/.qt_for_python/uic/editeditor.py deleted file mode 100644 index 30806b24..00000000 --- a/.qt_for_python/uic/editeditor.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file '/home/benjamin/Desktop/Development/work/hobbits/src/hobbits-plugins/operators/Edit/editeditor.ui' -# -# Created by: PyQt5 UI code generator 5.10.1 -# -# WARNING! All changes made in this file will be lost! - -from PyQt5 import QtCore, QtGui, QtWidgets - -class Ui_EditEditor(object): - def setupUi(self, EditEditor): - EditEditor.setObjectName("EditEditor") - EditEditor.resize(604, 156) - self.verticalLayout = QtWidgets.QVBoxLayout(EditEditor) - self.verticalLayout.setObjectName("verticalLayout") - self.horizontalLayout_3 = QtWidgets.QHBoxLayout() - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.verticalLayout_3 = QtWidgets.QVBoxLayout() - self.verticalLayout_3.setObjectName("verticalLayout_3") - self.rb_bit = QtWidgets.QRadioButton(EditEditor) - self.rb_bit.setChecked(True) - self.rb_bit.setObjectName("rb_bit") - self.verticalLayout_3.addWidget(self.rb_bit) - self.rb_hex = QtWidgets.QRadioButton(EditEditor) - self.rb_hex.setObjectName("rb_hex") - self.verticalLayout_3.addWidget(self.rb_hex) - self.rb_ascii = QtWidgets.QRadioButton(EditEditor) - self.rb_ascii.setObjectName("rb_ascii") - self.verticalLayout_3.addWidget(self.rb_ascii) - self.horizontalLayout_3.addLayout(self.verticalLayout_3) - self.verticalLayout_2 = QtWidgets.QVBoxLayout() - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.horizontalLayout_4 = QtWidgets.QHBoxLayout() - self.horizontalLayout_4.setObjectName("horizontalLayout_4") - self.lb_start = QtWidgets.QLabel(EditEditor) - self.lb_start.setObjectName("lb_start") - self.horizontalLayout_4.addWidget(self.lb_start) - self.sb_start = QtWidgets.QSpinBox(EditEditor) - self.sb_start.setObjectName("sb_start") - self.horizontalLayout_4.addWidget(self.sb_start) - self.verticalLayout_2.addLayout(self.horizontalLayout_4) - self.horizontalLayout_5 = QtWidgets.QHBoxLayout() - self.horizontalLayout_5.setObjectName("horizontalLayout_5") - self.lb_length = QtWidgets.QLabel(EditEditor) - self.lb_length.setObjectName("lb_length") - self.horizontalLayout_5.addWidget(self.lb_length) - self.sb_length = QtWidgets.QSpinBox(EditEditor) - self.sb_length.setObjectName("sb_length") - self.horizontalLayout_5.addWidget(self.sb_length) - self.verticalLayout_2.addLayout(self.horizontalLayout_5) - self.horizontalLayout_3.addLayout(self.verticalLayout_2) - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_3.addItem(spacerItem) - self.verticalLayout.addLayout(self.horizontalLayout_3) - self.pte_bits = QtWidgets.QPlainTextEdit(EditEditor) - self.pte_bits.setObjectName("pte_bits") - self.verticalLayout.addWidget(self.pte_bits) - - self.retranslateUi(EditEditor) - QtCore.QMetaObject.connectSlotsByName(EditEditor) - - def retranslateUi(self, EditEditor): - _translate = QtCore.QCoreApplication.translate - EditEditor.setWindowTitle(_translate("EditEditor", "Form")) - self.rb_bit.setText(_translate("EditEditor", "Bit")) - self.rb_hex.setText(_translate("EditEditor", "Hex")) - self.rb_ascii.setText(_translate("EditEditor", "Ascii")) - self.lb_start.setText(_translate("EditEditor", "Bit Start:")) - self.lb_length.setText(_translate("EditEditor", "Bit Length:")) - diff --git a/src/hobbits-plugins/operators/Edit/editeditor.cpp b/src/hobbits-plugins/operators/Edit/editeditor.cpp index 74309970..16353813 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.cpp +++ b/src/hobbits-plugins/operators/Edit/editeditor.cpp @@ -1,10 +1,13 @@ #include "editeditor.h" #include "ui_editeditor.h" +char* lastType = "bit"; + EditEditor::EditEditor(QSharedPointer delegate): ui(new Ui::EditEditor()), m_paramHelper(new ParameterHelper(delegate)) { + ui->setupUi(this); @@ -22,9 +25,9 @@ EditEditor::EditEditor(QSharedPointer delegate): //On radio button value change - connect(ui->rb_bit, SIGNAL(toggled(bool)), this, SLOT(labelSetText())); - connect(ui->rb_hex, SIGNAL(toggled(bool)), this, SLOT(labelSetText())); - connect(ui->rb_ascii, SIGNAL(toggled(bool)), this, SLOT(labelSetText())); + connect(ui->rb_bit, SIGNAL(toggled(bool)), this, SLOT(setLabelText())); + connect(ui->rb_hex, SIGNAL(toggled(bool)), this, SLOT(setLabelText())); + connect(ui->rb_ascii, SIGNAL(toggled(bool)), this, SLOT(setLabelText())); @@ -73,16 +76,42 @@ EditEditor::EditEditor(QSharedPointer delegate): // }); } -void EditEditor::labelSetText() { +void EditEditor::setLabelText() { + int start = ui->sb_start->value(); + int length = ui->sb_length->value(); if (ui->rb_bit->isChecked()) { ui->lb_start->setText("Bit Start"); ui->lb_length->setText("Bit Length"); + if (lastType == "byte") { + ui->sb_start->setValue(start*8); + ui->sb_length->setValue(length*8); + } else if (lastType == "hex") { + ui->sb_start->setValue(start*4); + ui->sb_length->setValue(length*4); + } + lastType = "bit"; } else if (ui->rb_hex->isChecked()) { ui->lb_start->setText("Nibble Start"); ui->lb_length->setText("Nibble Length"); + if (lastType == "bit") { + ui->sb_start->setValue(start/4); + ui->sb_length->setValue(length/4); + } else if (lastType == "byte") { + ui->sb_start->setValue(start*2); + ui->sb_length->setValue(length*2); + } + lastType = "hex"; } else { ui->lb_start->setText("Byte Start"); ui->lb_length->setText("Byte Length"); + if (lastType == "bit") { + ui->sb_start->setValue(start/8); + ui->sb_length->setValue(length/8); + } else if (lastType == "hex") { + ui->sb_start->setValue(start/2); + ui->sb_length->setValue(length/2); + } + lastType = "byte"; } } diff --git a/src/hobbits-plugins/operators/Edit/editeditor.h b/src/hobbits-plugins/operators/Edit/editeditor.h index f0867a72..ebfc978d 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.h +++ b/src/hobbits-plugins/operators/Edit/editeditor.h @@ -33,8 +33,8 @@ class EditEditor : public AbstractParameterEditor signals: public slots: - //void labelSetText(QString str1, QString str2); - void labelSetText(); + + void setLabelText(); }; From 9211e334933289093e4c1d54d7e23177fd183695 Mon Sep 17 00:00:00 2001 From: wetbadger Date: Fri, 2 Jul 2021 14:03:13 -0400 Subject: [PATCH 07/14] Text box is now filled with data represented as bits, hex, or ascii --- src/hobbits-core/bitarray.cpp | 132 +++++++++++++ src/hobbits-core/bitarray.h | 10 + src/hobbits-core/bitcontainer.cpp | 2 + src/hobbits-core/bitcontainer.h | 2 + src/hobbits-plugins/operators/Edit/edit.cpp | 16 +- .../operators/Edit/editeditor.cpp | 187 ++++++++++++++++-- .../operators/Edit/editeditor.h | 6 + .../operators/Edit/editeditor.ui | 39 +++- src/hobbits-widgets/bitcontainertreemodel.cpp | 26 ++- 9 files changed, 393 insertions(+), 27 deletions(-) diff --git a/src/hobbits-core/bitarray.cpp b/src/hobbits-core/bitarray.cpp index a8527edd..0b0f3f58 100644 --- a/src/hobbits-core/bitarray.cpp +++ b/src/hobbits-core/bitarray.cpp @@ -771,6 +771,138 @@ QSharedPointer BitArray::fromString(QString bitArraySpec, QStringList } } +const char* BitArray::hexTable(QString nibble) const { + const char* str = ""; + if (nibble == "0000") { + str = "0"; + } else if (nibble == "0001") { + str = "1"; + } else if (nibble == "0010") { + str = "2"; + } else if (nibble == "0011") { + str = "3"; + } else if (nibble == "0100") { + str = "4"; + } else if (nibble == "0101") { + str = "5"; + } else if (nibble == "0110") { + str = "6"; + } else if (nibble == "0111") { + str = "7"; + } else if (nibble == "1000") { + str = "8"; + } else if (nibble == "1001") { + str = "9"; + } else if (nibble == "1010") { + str = "a"; + } else if (nibble == "1011") { + str = "b"; + } else if (nibble == "1100") { + str = "c"; + } else if (nibble == "1101") { + str = "d"; + } else if (nibble == "1110") { + str = "e"; + } else if (nibble == "1111") { + str = "f"; + } + return str; +} + +QString BitArray::toBin() const { + QString str = ""; + + for (int i = 0; i < this->sizeInBits(); i ++) { + if (i < this->sizeInBits()) { + if (this->at(i) == false) { + str+="0"; + } else { + str+="1"; + } + } + } + return str; +} + +QString BitArray::toBin(int start, int length) const { + QString str = ""; + + for (int i = start; i < start + length; i ++) { + if (i < this->sizeInBits()) { + if (this->at(i) == false) { + str+="0"; + } else { + str+="1"; + } + } + } + return str; +} + +QString BitArray::toHex() const { + QString str = ""; + QString nibble = ""; + int n = 0; + for (int i = 0; i < this->sizeInBits(); i ++) { + if (i < this->sizeInBits()) { + if (this->at(i) == false) { + nibble+="0"; + } else { + nibble+="1"; + } + } + n++; + if (n == 4) { + n = 0; + str += hexTable(nibble); + nibble = ""; + } + } + return str; +} + +QString BitArray::toHex(int start, int length) const { + QString str = ""; + QString nibble = ""; + int n = 0; + for (int i = start*4; i < start*4+length*4; i ++) { + if (i < this->sizeInBits()) { + if (this->at(i) == false) { + nibble+="0"; + } else { + nibble+="1"; + } + } + n++; + if (n == 4) { + n = 0; + str += hexTable(nibble); + nibble = ""; + } + } + return str; +} + +QString BitArray::toAscii() const { + int size = this->sizeInBits()/8; + QByteArray arr = readBytes(0, size); + + std::string text(arr.constData(), arr.length()); + QString qtext = QString::fromStdString(text); + + return qtext; +} + +QString BitArray::toAscii(int start, int length) const { + int size = this->sizeInBits()/8; + QByteArray arr = readBytes(start, length); + + std::string text(arr.constData(), arr.length()); + QString qtext = QString::fromStdString(text); + + return qtext; +} + BitArray::CacheLoadLocker::CacheLoadLocker(qint64 bitIndex, const BitArray *bitArray) : m_locker(&bitArray->m_cacheMutex) { qint64 srcCacheIdx = bitIndex / CACHE_CHUNK_BIT_SIZE; diff --git a/src/hobbits-core/bitarray.h b/src/hobbits-core/bitarray.h index 69c7e3f3..f86deace 100644 --- a/src/hobbits-core/bitarray.h +++ b/src/hobbits-core/bitarray.h @@ -70,6 +70,12 @@ class HOBBITSCORESHARED_EXPORT BitArray void serialize(QDataStream &stream) const; static QSharedPointer fromString(QString bitArraySpec, QStringList *parseErrors = nullptr); + QString toBin() const; + QString toBin(int start, int length) const; + QString toHex() const; + QString toHex(int start, int length) const; + QString toAscii() const; //could also call this toString + QString toAscii(int start, int length) const; private: void writeToStream(QDataStream &dataStream) const; // private for use by serializer and writeTo @@ -91,6 +97,8 @@ class HOBBITSCORESHARED_EXPORT BitArray void loadCacheAt(qint64 bitIndex) const; void syncCacheToFile() const; + const char* hexTable(QString nibble) const; + mutable QTemporaryFile m_dataFile; qint64 m_size; @@ -101,6 +109,8 @@ class HOBBITSCORESHARED_EXPORT BitArray QMutex m_mutex; mutable QMutex m_cacheMutex; mutable QMutex m_dataFileMutex; + + }; #endif // BITARRAY_H diff --git a/src/hobbits-core/bitcontainer.cpp b/src/hobbits-core/bitcontainer.cpp index be4d4ed0..6d16ac3e 100644 --- a/src/hobbits-core/bitcontainer.cpp +++ b/src/hobbits-core/bitcontainer.cpp @@ -200,3 +200,5 @@ void BitContainer::serialize(QDataStream &stream) const m_bits->serialize(stream); m_info->serialize(stream); } + + diff --git a/src/hobbits-core/bitcontainer.h b/src/hobbits-core/bitcontainer.h index 5ac1b1b0..575aa683 100644 --- a/src/hobbits-core/bitcontainer.h +++ b/src/hobbits-core/bitcontainer.h @@ -69,6 +69,8 @@ class HOBBITSCORESHARED_EXPORT BitContainer : public QObject static QSharedPointer deserialize(QDataStream &stream); void serialize(QDataStream &stream) const; + + private: explicit BitContainer(); diff --git a/src/hobbits-plugins/operators/Edit/edit.cpp b/src/hobbits-plugins/operators/Edit/edit.cpp index 2f5ef2c2..be4aa7dd 100644 --- a/src/hobbits-plugins/operators/Edit/edit.cpp +++ b/src/hobbits-plugins/operators/Edit/edit.cpp @@ -67,9 +67,21 @@ QSharedPointer Edit::operateOnBits( const Parameters ¶meters, QSharedPointer progress) { - - if (inputContainers.length() != 1) { + if (inputContainers.length() == 0) { + QList> outputContainers; + int outputSize = 10; + QSharedPointer outBits; + outBits = QSharedPointer(new BitArray(outputSize)); + + auto bitContainer = BitContainer::create(outBits); + + outputContainers.append(bitContainer); + return OperatorResult::result(outputContainers, parameters); + } + + if (inputContainers.length() > 1) { return OperatorResult::error("Requires a single input bit container"); + } QStringList invalidations = m_delegate->validate(parameters); diff --git a/src/hobbits-plugins/operators/Edit/editeditor.cpp b/src/hobbits-plugins/operators/Edit/editeditor.cpp index 16353813..acfecf38 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.cpp +++ b/src/hobbits-plugins/operators/Edit/editeditor.cpp @@ -1,7 +1,10 @@ #include "editeditor.h" #include "ui_editeditor.h" -char* lastType = "bit"; + +enum data { bit, hexa, byte }; //compiler doesn't like the name 'hex' for some reason +data lastType = bit; +QSharedPointer bits; EditEditor::EditEditor(QSharedPointer delegate): ui(new Ui::EditEditor()), @@ -12,16 +15,29 @@ EditEditor::EditEditor(QSharedPointer delegate): ui->setupUi(this); - ui->sb_length->setMaximum(2147483647); //can this be set to the bitcontainer size? - ui->sb_start->setMaximum(2147483647); + ui->sb_length->setMinimum(0); ui->sb_start->setMinimum(0); + //ui->hs_length->setMaximum(2147483647); //can this be set to the bitcontainer size? + //ui->hs_start->setMaximum(2147483647); + + ui->hs_length->setMinimum(0); + ui->hs_start->setMinimum(0); + + ui->hs_length->setValue(8); + //On spinbox value change, change the bits shown in pte_bits - connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); - connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); + connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SLOT(changeSliderStart())); + connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(changeSliderLength())); + connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SLOT(changeTextBox())); + connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(changeTextBox())); + + //On slider value change, change the bits shown in pte_bits + connect(ui->hs_start, SIGNAL(valueChanged(int)), this, SLOT(changeSpinBoxStart())); + connect(ui->hs_length, SIGNAL(valueChanged(int)), this, SLOT(changeSpinBoxLength())); //On radio button value change @@ -29,6 +45,8 @@ EditEditor::EditEditor(QSharedPointer delegate): connect(ui->rb_hex, SIGNAL(toggled(bool)), this, SLOT(setLabelText())); connect(ui->rb_ascii, SIGNAL(toggled(bool)), this, SLOT(setLabelText())); + //on insert mode change + connect(ui->cb_insert, SIGNAL(toggled(bool)), this, SLOT(toggleInsert())); @@ -76,46 +94,158 @@ EditEditor::EditEditor(QSharedPointer delegate): // }); } +void EditEditor::changeSliderStart() { + int start = ui->sb_start->value(); + ui->hs_start->setValue(start); +} + +void EditEditor::changeSliderLength() { + int length = ui->sb_length->value(); + ui->hs_length->setValue(length); +} + +void EditEditor::changeSpinBoxStart() { + int start = ui->hs_start->value(); + ui->sb_start->setValue(start); +} + +void EditEditor::changeSpinBoxLength() { + int length = ui->hs_length->value(); + ui->sb_length->setValue(length); +} + +void EditEditor::changeTextBox() { + QString str; + if (! bits.isNull()) { + qint64 size = bits->sizeInBits(); + + int start = ui->sb_start->value(); + int length = ui->sb_length->value(); + + if (ui->rb_bit->isChecked()) { + if (start+length > size) { + length = size - start; + } + str = bits->toBin(start, length); + } else if (ui->rb_hex->isChecked()) { + if (start+length > size / 4) { + length = size / 4 - start; + } + str = bits->toHex(start, length); + } else { + if (start+length > size / 8) { + length = size / 8 - start; + } + str = bits->toAscii(start, length); + } + + if (ui->rb_hex->isChecked()) { + size/=4; + } else if (ui->rb_ascii->isChecked()) { + size/=8; + } + + ui->pte_bits->document()->setPlainText(str); + } +} + + void EditEditor::setLabelText() { int start = ui->sb_start->value(); int length = ui->sb_length->value(); if (ui->rb_bit->isChecked()) { ui->lb_start->setText("Bit Start"); ui->lb_length->setText("Bit Length"); - if (lastType == "byte") { + if (lastType == byte) { + + if (! bits.isNull()) { + qint64 size = bits->sizeInBits() / 8; + ui->sb_length->setMaximum(size*8); + ui->sb_start->setMaximum(size*8); + ui->hs_length->setMaximum(size*8); + ui->hs_start->setMaximum(size*8); + } ui->sb_start->setValue(start*8); ui->sb_length->setValue(length*8); - } else if (lastType == "hex") { + } else if (lastType == hexa) { + + if (! bits.isNull()) { + qint64 size = bits->sizeInBits() / 4; + ui->sb_length->setMaximum(size*4); + ui->sb_start->setMaximum(size*4); + ui->hs_length->setMaximum(size*4); + ui->hs_start->setMaximum(size*4); + } ui->sb_start->setValue(start*4); ui->sb_length->setValue(length*4); } - lastType = "bit"; + lastType = bit; } else if (ui->rb_hex->isChecked()) { ui->lb_start->setText("Nibble Start"); ui->lb_length->setText("Nibble Length"); - if (lastType == "bit") { + if (lastType == bit) { + + if (! bits.isNull()) { + qint64 size = bits->sizeInBits(); + ui->sb_length->setMaximum(size/4); + ui->sb_start->setMaximum(size/4); + ui->hs_length->setMaximum(size/4); + ui->hs_start->setMaximum(size/4); + } ui->sb_start->setValue(start/4); ui->sb_length->setValue(length/4); - } else if (lastType == "byte") { + } else if (lastType == byte) { + + if (! bits.isNull()) { + qint64 size = bits->sizeInBits() / 8; + ui->sb_length->setMaximum(size*2); + ui->sb_start->setMaximum(size*2); + ui->hs_length->setMaximum(size*2); + ui->hs_start->setMaximum(size*2); + } ui->sb_start->setValue(start*2); ui->sb_length->setValue(length*2); } - lastType = "hex"; + lastType = hexa; } else { ui->lb_start->setText("Byte Start"); ui->lb_length->setText("Byte Length"); - if (lastType == "bit") { + if (lastType == bit) { + + if (! bits.isNull()) { + qint64 size = bits->sizeInBits(); + ui->sb_length->setMaximum(size/8); + ui->sb_start->setMaximum(size/8); + ui->hs_length->setMaximum(size/8); + ui->hs_start->setMaximum(size/8); + } ui->sb_start->setValue(start/8); ui->sb_length->setValue(length/8); - } else if (lastType == "hex") { + } else if (lastType == hexa) { + + if (! bits.isNull()) { + qint64 size = bits->sizeInBits() / 4; + ui->sb_length->setMaximum(size/2); + ui->sb_start->setMaximum(size/2); + ui->hs_length->setMaximum(size/2); + ui->hs_start->setMaximum(size/2); + } ui->sb_start->setValue(start/2); ui->sb_length->setValue(length/2); } - lastType = "byte"; + lastType = byte; } } +void EditEditor::toggleInsert() { + if (ui->cb_insert->isChecked()) { + ui->pte_bits->setOverwriteMode(true); + } else { + ui->pte_bits->setOverwriteMode(false); + } +} + EditEditor::~EditEditor() { delete ui; @@ -145,5 +275,34 @@ void EditEditor::previewBitsImpl(QSharedPointer container, void EditEditor::previewBitsUiImpl(QSharedPointer container) { + if (! container.isNull()) { + QString str; + bits = container->bits(); + qint64 size = bits->sizeInBits(); + + if (ui->rb_hex->isChecked()) { + size/=4; + } else if (ui->rb_ascii->isChecked()) { + size/=8; + } + + ui->sb_length->setMaximum(size); + ui->sb_start->setMaximum(size); + ui->hs_length->setMaximum(size); + ui->hs_start->setMaximum(size); + + int start = ui->sb_start->value(); + int length = ui->sb_length->value(); + + if (ui->rb_bit->isChecked()) { + str = bits->toBin(start, length); + } else if (ui->rb_hex->isChecked()) { + str = bits->toHex(start, length); + } else { + str = bits->toAscii(start, length); + } + + ui->pte_bits->document()->setPlainText(str); + } // TODO: (Optional) Update UI elements to account for preprocessing in previewBitsImpl and/or other metadata } diff --git a/src/hobbits-plugins/operators/Edit/editeditor.h b/src/hobbits-plugins/operators/Edit/editeditor.h index ebfc978d..8a8f049d 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.h +++ b/src/hobbits-plugins/operators/Edit/editeditor.h @@ -35,6 +35,12 @@ class EditEditor : public AbstractParameterEditor public slots: void setLabelText(); + void changeSliderStart(); + void changeSliderLength(); + void changeSpinBoxStart(); + void changeSpinBoxLength(); + void changeTextBox(); + void toggleInsert(); }; diff --git a/src/hobbits-plugins/operators/Edit/editeditor.ui b/src/hobbits-plugins/operators/Edit/editeditor.ui index 20891e8c..595b6784 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.ui +++ b/src/hobbits-plugins/operators/Edit/editeditor.ui @@ -94,22 +94,41 @@ - - - Qt::Horizontal + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + + + + + + Insert - - - 40 - 20 - + + true - + - + + + true + + diff --git a/src/hobbits-widgets/bitcontainertreemodel.cpp b/src/hobbits-widgets/bitcontainertreemodel.cpp index 3f7a017c..c3102f11 100644 --- a/src/hobbits-widgets/bitcontainertreemodel.cpp +++ b/src/hobbits-widgets/bitcontainertreemodel.cpp @@ -18,7 +18,31 @@ QVariant BitContainerTreeModel::data(const QModelIndex &index, int role) const BitContainer *container = static_cast(index.internalPointer()); if (role == Qt::DisplayRole) { - return QVariant(QString(container->name()+"\n%1 bits").arg(container->size())); + qint64 size = container->size(); + float f_size; + QString unit = "bits"; + if (size < 1000) { + + f_size = size; + //QString unit = "bits"; + } else if (size >= 1000 && size < 8000) { + + unit = "bytes"; + f_size=size/8.0; + } else if (size >= 8000 && size < 8000000) { + + unit = "kB"; + f_size=size/8000.0; + } else if (size >= 8000000 && size < 8000000000) { + + unit = "MB"; + f_size=size/8000000.0; + } else { + + unit = "GB"; + f_size=size/8000000000.0; + } + return QVariant(QString(container->name()+"\n%1 "+unit).arg(f_size)); } else if (role == Qt::DecorationRole) { return QVariant(DisplayHelper::bitRasterThumbnail(container)); From de81e61eb68a087547f71b16dce7f6487909430e Mon Sep 17 00:00:00 2001 From: wetbadger Date: Mon, 5 Jul 2021 17:06:00 -0400 Subject: [PATCH 08/14] Added range highlights --- package-lock.json | 2 +- .../operators/Edit/editeditor.cpp | 35 +++++++++++++++++++ .../operators/Edit/editeditor.h | 1 + 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 308e0309..03510401 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "hobbits", - "version": "0.21.0", + "version": "0.50.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/hobbits-plugins/operators/Edit/editeditor.cpp b/src/hobbits-plugins/operators/Edit/editeditor.cpp index acfecf38..b194c62a 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.cpp +++ b/src/hobbits-plugins/operators/Edit/editeditor.cpp @@ -5,6 +5,7 @@ enum data { bit, hexa, byte }; //compiler doesn't like the name 'hex' for some reason data lastType = bit; QSharedPointer bits; +QSharedPointer bitContainer; EditEditor::EditEditor(QSharedPointer delegate): ui(new Ui::EditEditor()), @@ -34,6 +35,8 @@ EditEditor::EditEditor(QSharedPointer delegate): connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(changeSliderLength())); connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SLOT(changeTextBox())); connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(changeTextBox())); + connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SLOT(setHighlight())); + connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(setHighlight())); //On slider value change, change the bits shown in pte_bits connect(ui->hs_start, SIGNAL(valueChanged(int)), this, SLOT(changeSpinBoxStart())); @@ -94,6 +97,29 @@ EditEditor::EditEditor(QSharedPointer delegate): // }); } +void EditEditor::setHighlight() { + int start = ui->sb_start->value(); + int length = ui->sb_length->value(); + if (ui->rb_hex->isChecked()) { + start*=4; + length*=4; + } else if (ui->rb_ascii->isChecked()) { + start*=8; + length*=8; + } + quint32 color = 0x553498db; + Range range(start, start + length - 1); + if (! bitContainer.isNull()) { + //clear current highlights + bitContainer->clearHighlightCategory("edit_highlights"); + bitContainer->addHighlight(RangeHighlight("edit_highlights", + QString("%1 to %2").arg(range.start()).arg(range.end()), + range, + color)); + } + +} + void EditEditor::changeSliderStart() { int start = ui->sb_start->value(); ui->hs_start->setValue(start); @@ -275,9 +301,12 @@ void EditEditor::previewBitsImpl(QSharedPointer container, void EditEditor::previewBitsUiImpl(QSharedPointer container) { + bitContainer = container; + if (! container.isNull()) { QString str; bits = container->bits(); + qint64 size = bits->sizeInBits(); if (ui->rb_hex->isChecked()) { @@ -301,8 +330,14 @@ void EditEditor::previewBitsUiImpl(QSharedPointer container } else { str = bits->toAscii(start, length); } + + //setHighlight(); + ui->pte_bits->document()->setPlainText(str); + } else { + //clear pte_bits + ui->pte_bits->document()->setPlainText(""); } // TODO: (Optional) Update UI elements to account for preprocessing in previewBitsImpl and/or other metadata } diff --git a/src/hobbits-plugins/operators/Edit/editeditor.h b/src/hobbits-plugins/operators/Edit/editeditor.h index 8a8f049d..d95ced8b 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.h +++ b/src/hobbits-plugins/operators/Edit/editeditor.h @@ -41,6 +41,7 @@ public slots: void changeSpinBoxLength(); void changeTextBox(); void toggleInsert(); + void setHighlight(); }; From 3fdf0060a39a38428b9aa4d6635c579c9cc79edc Mon Sep 17 00:00:00 2001 From: wetbadger Date: Mon, 12 Jul 2021 11:21:03 -0400 Subject: [PATCH 09/14] Edit from Here function added --- package-lock.json | 200 ------------------ package.json | 1 - .../displays/Binary/binary.cpp | 4 + src/hobbits-plugins/displays/Binary/binary.h | 4 +- src/hobbits-plugins/operators/Edit/edit.cpp | 3 +- .../operators/Edit/editeditor.cpp | 27 +++ .../operators/Edit/editeditor.h | 1 + src/hobbits-widgets/displayhandle.cpp | 2 +- src/hobbits-widgets/displayhelper.cpp | 1 + src/hobbits-widgets/displaywidget.cpp | 18 ++ 10 files changed, 57 insertions(+), 204 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03510401..f8448d36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1522,12 +1522,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1939,12 +1933,6 @@ "dot-prop": "^3.0.0" } }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -3894,107 +3882,6 @@ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, - "husky": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.4.tgz", - "integrity": "sha512-aLUw3YxdljMuu57SQvSGW33/Dbsztis7UZRAx1WHC13O4Lv0wa9oHaeobSMOBI/nGiVRbCJBGj263WUxaw2p2Q==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.5.1", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -8674,12 +8561,6 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, - "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", - "dev": true - }, "os-name": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", @@ -8855,75 +8736,6 @@ "load-json-file": "^4.0.0" } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -9464,12 +9276,6 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true - }, "semver-diff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", @@ -10286,12 +10092,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true - }, "windows-release": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.0.tgz", diff --git a/package.json b/package.json index ab0a12aa..8333396f 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "del": "^5.1.0", "filecompare": "^1.0.4", "glob": "^7.1.6", - "husky": "^4.2.4", "node-7z": "^2.1.1", "semantic-release": "^17.0.4", "yargs": "^15.3.1" diff --git a/src/hobbits-plugins/displays/Binary/binary.cpp b/src/hobbits-plugins/displays/Binary/binary.cpp index 35d7c2c4..cd6c773a 100644 --- a/src/hobbits-plugins/displays/Binary/binary.cpp +++ b/src/hobbits-plugins/displays/Binary/binary.cpp @@ -6,6 +6,7 @@ #include Binary::Binary() : + m_renderConfig(new DisplayRenderConfig()) { m_renderConfig->setFullRedrawTriggers(DisplayRenderConfig::NewBitOffset | DisplayRenderConfig::NewFrameOffset); @@ -138,3 +139,6 @@ QPoint Binary::headerOffset(const Parameters ¶meters) DisplayHelper::textSize(font, container->frameCount()).width() + margin, DisplayHelper::textSize(font, container->maxFrameWidth()).width() + margin); } + + + diff --git a/src/hobbits-plugins/displays/Binary/binary.h b/src/hobbits-plugins/displays/Binary/binary.h index 798cbe1c..ebeae6c5 100644 --- a/src/hobbits-plugins/displays/Binary/binary.h +++ b/src/hobbits-plugins/displays/Binary/binary.h @@ -10,8 +10,9 @@ class Binary : public QObject, DisplayInterface Q_INTERFACES(DisplayInterface) public: - Binary(); + Binary(); + DisplayInterface* createDefaultDisplay() override; QString name() override; @@ -19,6 +20,7 @@ class Binary : public QObject, DisplayInterface QStringList tags() override; QSharedPointer renderConfig() override; + void setDisplayHandle(QSharedPointer displayHandle) override; QSharedPointer parameterDelegate() override; diff --git a/src/hobbits-plugins/operators/Edit/edit.cpp b/src/hobbits-plugins/operators/Edit/edit.cpp index be4aa7dd..c08d9b08 100644 --- a/src/hobbits-plugins/operators/Edit/edit.cpp +++ b/src/hobbits-plugins/operators/Edit/edit.cpp @@ -337,4 +337,5 @@ QSharedPointer Edit::operateOnBits( return OperatorResult::result(outputContainers, parameters); // TODO: Perform operation and return result with OperatorResult::result //return OperatorResult::error("Bits from start to length would be changed according to your entry, but that is not implemented yet."); -} \ No newline at end of file +} + diff --git a/src/hobbits-plugins/operators/Edit/editeditor.cpp b/src/hobbits-plugins/operators/Edit/editeditor.cpp index b194c62a..0a8838ae 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.cpp +++ b/src/hobbits-plugins/operators/Edit/editeditor.cpp @@ -332,6 +332,33 @@ void EditEditor::previewBitsUiImpl(QSharedPointer container } //setHighlight(); + //if rangeHighlight in edit_highlights length == -1 + RangeHighlight highlight; + QList highlights = container->info()->highlights("edit_highlights"); + for (RangeHighlight h : highlights) { + highlight = h; + } + if (highlight.range().end() == -1) { + int start2; + if (ui->rb_hex->isChecked()) { + start2 = highlight.range().start() / 4; + } else if (ui->rb_ascii->isChecked()) { + start2 = highlight.range().start() / 8; + } else { + start2 = highlight.range().start(); + } + //set spinbox start to highlight start + ui->sb_start->setValue(start2); + //highlight length will set to spinbox length automatically + } + //always set edit highlight + else if (highlight.range().isNull()) { + //getto way of setting range highlight + ui->sb_start->setValue(start+1); + ui->sb_start->setValue(start); + } + + ui->pte_bits->document()->setPlainText(str); diff --git a/src/hobbits-plugins/operators/Edit/editeditor.h b/src/hobbits-plugins/operators/Edit/editeditor.h index d95ced8b..20d21d09 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.h +++ b/src/hobbits-plugins/operators/Edit/editeditor.h @@ -15,6 +15,7 @@ class EditEditor : public AbstractParameterEditor Q_OBJECT public: + EditEditor(QSharedPointer delegate); ~EditEditor() override; diff --git a/src/hobbits-widgets/displayhandle.cpp b/src/hobbits-widgets/displayhandle.cpp index f467dea4..7ef4860d 100644 --- a/src/hobbits-widgets/displayhandle.cpp +++ b/src/hobbits-widgets/displayhandle.cpp @@ -307,4 +307,4 @@ qint64 DisplayHandle::bitOffsetHover() const qint64 DisplayHandle::frameOffsetHover() const { return m_frameOffsetHover; -} +} \ No newline at end of file diff --git a/src/hobbits-widgets/displayhelper.cpp b/src/hobbits-widgets/displayhelper.cpp index 8b9f50ae..c72a681d 100644 --- a/src/hobbits-widgets/displayhelper.cpp +++ b/src/hobbits-widgets/displayhelper.cpp @@ -653,3 +653,4 @@ void DisplayHelper::sendHoverUpdate(QSharedPointer handle, QPoint handle->setBitHover(true, diff.x(), diff.y()); } + diff --git a/src/hobbits-widgets/displaywidget.cpp b/src/hobbits-widgets/displaywidget.cpp index 59b01e3b..6e39b6aa 100644 --- a/src/hobbits-widgets/displaywidget.cpp +++ b/src/hobbits-widgets/displaywidget.cpp @@ -233,6 +233,7 @@ void DisplayWidget::showContextMenu(const QPoint &point) .arg(frame.size())); labelAction->setEnabled(false); + QMenu gotoMenu("Go to Location"); gotoMenu.addAction( tr("End of Frame"), @@ -333,6 +334,7 @@ void DisplayWidget::showContextMenu(const QPoint &point) } }); + menu.addMenu(&gotoMenu); menu.addSeparator(); @@ -438,6 +440,22 @@ void DisplayWidget::showContextMenu(const QPoint &point) container->info()->clearHighlightCategory("manual_highlights"); }); + menu.addSeparator(); + + menu.addAction( + tr("Edit from Here"), + [this, frame, bitOffsetHover]() { + quint32 color = 0x553498db; + qint64 start = frame.start()+bitOffsetHover; + Range range(start, -1); //if length is -1 set length in editeditor.cpp + auto container = m_handle->currentContainer(); + container->info()->clearHighlightCategory("edit_highlights"); + container->info()->addHighlight(RangeHighlight("edit_highlights", + QString("%1 to %2").arg(range.start()).arg(range.end()), + range, + color)); + }); + menu.exec(this->mapToGlobal(point)); } From fb92fde848309fc0a09e1a3ba3592b7eb1b9016d Mon Sep 17 00:00:00 2001 From: wetbadger Date: Thu, 5 Aug 2021 13:05:49 -0400 Subject: [PATCH 10/14] Refactored edit.cpp and editeditor.cpp. Added "edit from here" functionality. Improved ability to handle large files. (Still limited by QSpinBox using int.) And more... --- src/hobbits-core/bitarray.cpp | 136 +++---- src/hobbits-core/bitarray.h | 8 +- src/hobbits-plugins/operators/Edit/edit.cpp | 313 +++++---------- src/hobbits-plugins/operators/Edit/edit.h | 6 + .../operators/Edit/editeditor.cpp | 377 +++++++++--------- .../operators/Edit/editeditor.h | 19 +- src/hobbits-widgets/displaywidget.cpp | 19 +- src/hobbits-widgets/spinbox64.cpp | 6 + src/hobbits-widgets/spinbox64.h | 16 + 9 files changed, 410 insertions(+), 490 deletions(-) create mode 100644 src/hobbits-widgets/spinbox64.cpp create mode 100644 src/hobbits-widgets/spinbox64.h diff --git a/src/hobbits-core/bitarray.cpp b/src/hobbits-core/bitarray.cpp index 0b0f3f58..9b4885d3 100644 --- a/src/hobbits-core/bitarray.cpp +++ b/src/hobbits-core/bitarray.cpp @@ -771,49 +771,51 @@ QSharedPointer BitArray::fromString(QString bitArraySpec, QStringList } } -const char* BitArray::hexTable(QString nibble) const { - const char* str = ""; - if (nibble == "0000") { - str = "0"; - } else if (nibble == "0001") { - str = "1"; - } else if (nibble == "0010") { - str = "2"; - } else if (nibble == "0011") { - str = "3"; - } else if (nibble == "0100") { - str = "4"; - } else if (nibble == "0101") { - str = "5"; - } else if (nibble == "0110") { - str = "6"; - } else if (nibble == "0111") { - str = "7"; - } else if (nibble == "1000") { - str = "8"; - } else if (nibble == "1001") { - str = "9"; - } else if (nibble == "1010") { - str = "a"; - } else if (nibble == "1011") { - str = "b"; - } else if (nibble == "1100") { - str = "c"; - } else if (nibble == "1101") { - str = "d"; - } else if (nibble == "1110") { - str = "e"; - } else if (nibble == "1111") { - str = "f"; - } - return str; +char BitArray::hexTable(qint64 nibble) const { + char chr; + if (nibble == 0) { + chr = '0'; + } else if (nibble == 1) { + chr = '1'; + } else if (nibble == 2) { + chr = '2'; + } else if (nibble == 3) { + chr = '3'; + } else if (nibble == 4) { + chr = '4'; + } else if (nibble == 5) { + chr = '5'; + } else if (nibble == 6) { + chr = '6'; + } else if (nibble == 7) { + chr = '7'; + } else if (nibble == 8) { + chr = '8'; + } else if (nibble == 9) { + chr = '9'; + } else if (nibble == 10) { + chr = 'a'; + } else if (nibble == 11) { + chr = 'b'; + } else if (nibble == 12) { + chr = 'c'; + } else if (nibble == 13) { + chr = 'd'; + } else if (nibble == 14) { + chr = 'e'; + } else if (nibble == 15) { + chr = 'f'; + } else { + chr = 'o'; + } + return chr; } QString BitArray::toBin() const { QString str = ""; - for (int i = 0; i < this->sizeInBits(); i ++) { - if (i < this->sizeInBits()) { + for (quint64 i = 0; i < this->sizeInBits(); i ++) { + if (i < this->sizeInBits() && i >= 0) { if (this->at(i) == false) { str+="0"; } else { @@ -824,11 +826,11 @@ QString BitArray::toBin() const { return str; } -QString BitArray::toBin(int start, int length) const { +QString BitArray::toBin(qint64 start, int length) const { QString str = ""; - for (int i = start; i < start + length; i ++) { - if (i < this->sizeInBits()) { + for (quint64 i = start; i < start + length; i ++) { + if (i < this->sizeInBits() && i >= 0) { if (this->at(i) == false) { str+="0"; } else { @@ -841,50 +843,32 @@ QString BitArray::toBin(int start, int length) const { QString BitArray::toHex() const { QString str = ""; - QString nibble = ""; - int n = 0; - for (int i = 0; i < this->sizeInBits(); i ++) { - if (i < this->sizeInBits()) { - if (this->at(i) == false) { - nibble+="0"; - } else { - nibble+="1"; - } - } - n++; - if (n == 4) { - n = 0; - str += hexTable(nibble); - nibble = ""; + quint64 nib = 0; + + for (quint64 i = 0; i < this->sizeInBits(); i ++) { + if (i < this->sizeInBits() && i >= 0) { + nib = this->parseUIntValue(i, 4); } + str += hexTable(nib); } return str; } -QString BitArray::toHex(int start, int length) const { +QString BitArray::toHex(qint64 start, int length) const { QString str = ""; - QString nibble = ""; - int n = 0; - for (int i = start*4; i < start*4+length*4; i ++) { - if (i < this->sizeInBits()) { - if (this->at(i) == false) { - nibble+="0"; - } else { - nibble+="1"; - } - } - n++; - if (n == 4) { - n = 0; - str += hexTable(nibble); - nibble = ""; - } + quint64 nib = 0; + + for (quint64 i = start*4; i < start*4+length*4; i += 4) { + if (i < this->sizeInBits() && i >= 0) { + nib = this->parseUIntValue(i, 4); + str += hexTable(nib); + } } return str; } QString BitArray::toAscii() const { - int size = this->sizeInBits()/8; + quint64 size = this->sizeInBits()/8; QByteArray arr = readBytes(0, size); std::string text(arr.constData(), arr.length()); @@ -893,8 +877,8 @@ QString BitArray::toAscii() const { return qtext; } -QString BitArray::toAscii(int start, int length) const { - int size = this->sizeInBits()/8; +QString BitArray::toAscii(qint64 start, int length) const { + quint64 size = this->sizeInBits()/8; QByteArray arr = readBytes(start, length); std::string text(arr.constData(), arr.length()); diff --git a/src/hobbits-core/bitarray.h b/src/hobbits-core/bitarray.h index f86deace..e40d2233 100644 --- a/src/hobbits-core/bitarray.h +++ b/src/hobbits-core/bitarray.h @@ -71,11 +71,11 @@ class HOBBITSCORESHARED_EXPORT BitArray static QSharedPointer fromString(QString bitArraySpec, QStringList *parseErrors = nullptr); QString toBin() const; - QString toBin(int start, int length) const; + QString toBin(qint64 start, int length) const; QString toHex() const; - QString toHex(int start, int length) const; + QString toHex(qint64 start, int length) const; QString toAscii() const; //could also call this toString - QString toAscii(int start, int length) const; + QString toAscii(qint64 start, int length) const; private: void writeToStream(QDataStream &dataStream) const; // private for use by serializer and writeTo @@ -97,7 +97,7 @@ class HOBBITSCORESHARED_EXPORT BitArray void loadCacheAt(qint64 bitIndex) const; void syncCacheToFile() const; - const char* hexTable(QString nibble) const; + char hexTable(qint64 nibble) const; mutable QTemporaryFile m_dataFile; qint64 m_size; diff --git a/src/hobbits-plugins/operators/Edit/edit.cpp b/src/hobbits-plugins/operators/Edit/edit.cpp index c08d9b08..6b73e22a 100644 --- a/src/hobbits-plugins/operators/Edit/edit.cpp +++ b/src/hobbits-plugins/operators/Edit/edit.cpp @@ -1,5 +1,6 @@ #include "edit.h" #include "editeditor.h" +#include "bitarray.h" Edit::Edit() { @@ -62,6 +63,69 @@ int Edit::getMaxInputContainers(const Parameters ¶meters) return 1; } +int Edit::getUnitSize(Parameters parameters) { + if (parameters.value("edit_type").toString() == "hex") { + return 4; + } + else if (parameters.value("edit_type").toString() == "ascii") { + return 8; + } + else { + return 1; + } +} + +QSharedPointer Edit::parseBits(QString newBitsInRange) +{ + QStringList parseErrors = QStringList(); + QSharedPointer newBitArray; + QString bitArraySpec = "0b"+newBitsInRange; + QSharedPointer newBits = newBitArray->fromString(bitArraySpec, &parseErrors); + return newBits; +} + +QSharedPointer Edit::parseHex(QString newBitsInRange) +{ + QStringList parseErrors = QStringList(); + QSharedPointer newBitArray; + QString bitArraySpec = "0x"+newBitsInRange; + QSharedPointer newBits = newBitArray->fromString(bitArraySpec, &parseErrors); + return newBits; +} + +QSharedPointer Edit::parseAscii(QString newBitsInRange) { + QStringList parseErrors = QStringList(); + QSharedPointer newBitArray; + QString bitArraySpec = newBitsInRange; + QSharedPointer newBits = newBitArray->fromString(bitArraySpec, &parseErrors); + return newBits; + + /* + + QByteArray nair = newBitsInRange.toLocal8Bit(); + const char * newAsciiInRange = nair.data(); + + int newBitsInRangeLength = newBitsInRange.length(); + qint64 outputSize = inputContainerSize - (length * 8) + (newBitsInRangeLength * 8); + + QSharedPointer bits = inputContainers.at(0)->bits(); + + if (newBitsInRangeLength == length) { + m_outBits->setBytes(start, newAsciiInRange, 0, newBitsInRangeLength); + } else { + QSharedPointer postBits = QSharedPointer(new BitArray(outputSize - start + length )); + QByteArray byteArray = bits->readBytes(start + length, outputSize - 1); + int endLength = byteArray.length(); + const char* data = byteArray.data(); + m_outBits->setBytes(start+newBitsInRangeLength, data, 0, endLength); + m_outBits->setBytes(start, newAsciiInRange, 0, newBitsInRangeLength); + + } + + */ + +} + QSharedPointer Edit::operateOnBits( QList > inputContainers, const Parameters ¶meters, @@ -69,7 +133,7 @@ QSharedPointer Edit::operateOnBits( { if (inputContainers.length() == 0) { QList> outputContainers; - int outputSize = 10; + qint64 outputSize = 10; QSharedPointer outBits; outBits = QSharedPointer(new BitArray(outputSize)); @@ -88,6 +152,11 @@ QSharedPointer Edit::operateOnBits( if (!invalidations.isEmpty()) { return OperatorResult::error(QString("Invalid parameters passed to %1:\n%2").arg(name()).arg(invalidations.join("\n"))); } + + int progressInt = 15; + + progress->setProgressPercent(progressInt); + //get values from spin boxes qint64 start = parameters.value("start").toInt(); qint64 length = parameters.value("length").toInt(); @@ -96,11 +165,12 @@ QSharedPointer Edit::operateOnBits( //get bits from text box QString newBitsInRange = parameters.value("new_bits_in_range").toString(); - //TODO: pte_bits is already filled with data from start to length + //pte_bits is already filled with data from start to length // //auto bitContainer = inputContainers.first(); QList> outputContainers; - QSharedPointer outBits; + + @@ -108,225 +178,50 @@ QSharedPointer Edit::operateOnBits( //ex 0000 1111 -> 1111 0000 int end = start + length; - int inputContainerSize = inputContainers.at(0)->size(); + qint64 inputContainerSize = inputContainers.at(0)->size(); QSharedPointer bits = inputContainers.at(0)->bits(); + + progressInt+=15; progress->setProgressPercent(progressInt); + int newBitsInRangeLength = newBitsInRange.length(); + + int unitSize = getUnitSize(parameters); + + qint64 outputSize = inputContainerSize - (length * unitSize) + (newBitsInRangeLength * unitSize); + QSharedPointer outBits = QSharedPointer(new BitArray(outputSize)); - if (parameters.value("edit_type").toString() == "bit") { //bits + bits->copyBits(0, outBits.data(), 0, start * unitSize, BitArray::Copy); - int outputSize = inputContainerSize - length + newBitsInRangeLength; - outBits = QSharedPointer(new BitArray(outputSize)); - bits->copyBits(0, outBits.data(), 0, outputSize, BitArray::Copy); + bits->copyBits((qint64) end * unitSize, outBits.data(), (qint64)((qint64)end + newBitsInRangeLength - length)*unitSize, + outputSize, BitArray::Copy); + progressInt+=45; progress->setProgressPercent(progressInt); + + QSharedPointer newBits; + + if (parameters.value("edit_type").toString() == "bit" ) { //bits + QRegExp re("^[0-1]*$"); + if (!re.exactMatch(newBitsInRange)) + return OperatorResult::error("You can only use 0 or 1 in bit mode."); + newBits = parseBits( newBitsInRange); - - int j = 0; //j represents the index of the newBitsInRange string - int i2 = 0; //the index from the input container - bool setiToEnd = false; - bool checkSeti = true; - - for (int i = 0; i < outputSize; i ++) { //i represents the index of the outBits, soon to be outputContainer - if (i < start || i > start + newBitsInRangeLength - 1) { - if (newBitsInRangeLength == 0 && i >= start && checkSeti) { //if input is empty set index from input container to ending index - setiToEnd = true; - checkSeti = false; - } - if (setiToEnd) { - i2 = end; - setiToEnd = false; - } - if (i2 < inputContainerSize) { - outBits->set(i, inputContainers.at(0)->bits()->at(i2)); //copy bits from input container - } - i2++; - } else { - const QChar x = newBitsInRange.at(j); - if (x.digitValue() == 0) - outBits->set(i, false); //false is 0, true is 1 - else if (x.digitValue() == 1) - outBits->set(i, true); //false is 0, true is 1 - else - return OperatorResult::error("You can only use 0 or 1 in bit mode."); - j++; - setiToEnd = true; - } - } } else if (parameters.value("edit_type").toString() == "hex") { //hex - - int outputSize = inputContainerSize - (length * 4) + (newBitsInRangeLength * 4); - outBits = QSharedPointer(new BitArray(outputSize)); - bits->copyBits(0, outBits.data(), 0, outputSize, BitArray::Copy); - - int i2 = 0; - int j = 0; - int ji = 0; //increment 4 times before incrementing j - bool setiToEnd = false; - bool checkSeti = true; - for (int i = 0; i < outputSize; i++) { - if (i < start * 4 || i > (start * 4) + ((newBitsInRangeLength * 4)-1)) { - - if (newBitsInRangeLength == 0 && i >= start && checkSeti) { //if input is empty set index from input container to ending index - setiToEnd = true; - checkSeti = false; - } - if (setiToEnd) { - i2 = end * 4; - setiToEnd = false; - } - if (i2 < inputContainerSize) { - outBits->set(i, inputContainers.at(0)->bits()->at(i2)); //copy bits from input container - } - - } else { - - const QChar x = newBitsInRange.at(j); - - if (x == '0') { - outBits->set(i, false); //false is 0, true is 1 - } else - if (x == '1') { - if (ji < 3) { - outBits->set(i, false); //false is 0, true is 1 - } else { - outBits->set(i, true); //false is 0, true is 1 - } - } else - if (x == '2') { - if (ji < 2 || ji > 2) { - outBits->set(i, false); //false is 0, true is 1 - } else { - outBits->set(i, true); //false is 0, true is 1 - } - } else - if (x == '3') { - if (ji == 2 || ji == 3) { - outBits->set(i, true); //false is 0, true is 1 - } else { - outBits->set(i, false); //false is 0, true is 1 - } - } else - - - if (x == '4') { - if (ji == 1) { - outBits->set(i, true); //false is 0, true is 1 - } else { - outBits->set(i, false); //false is 0, true is 1 - } - } else - if (x == '5') { - if (ji == 1 || ji == 3) { - outBits->set(i, true); //false is 0, true is 1 - } else { - outBits->set(i, false); //false is 0, true is 1 - } - } else - if (x == '6') { - if (ji == 1 || ji == 2) { - outBits->set(i, true); //false is 0, true is 1 - } else { - outBits->set(i, false); //false is 0, true is 1 - } - } else - if (x == '7') { - if (ji > 0) { - outBits->set(i, true); //false is 0, true is 1 - } else { - outBits->set(i, false); //false is 0, true is 1 - } - } else - - - if (x == '8') { - if (ji == 0) { - outBits->set(i, true); - } else { - outBits->set(i, false); //false is 0, true is 1 - } - } else - if (x == '9') { - if (ji == 0 || ji > 2) { - outBits->set(i, true); - } else { - outBits->set(i, false); //false is 0, true is 1 - } - } else - if (x == 'a') { - if (ji == 0 || ji == 2) { - outBits->set(i, true); - } else { - outBits->set(i, false); //false is 0, true is 1 - } - } else - if (x == 'b') { - if (ji == 1) { - outBits->set(i, false); //false is 0, true is 1 - } else { - outBits->set(i, true); //false is 0, true is 1 - } - } else - - - if (x == 'c') { - if (ji < 2) { - outBits->set(i, true); //false is 0, true is 1 - } else { - outBits->set(i, false); //false is 0, true is 1 - } - } else - if (x == 'd') { - if (ji == 2) { - outBits->set(i, false); //false is 0, true is 1 - } else { - outBits->set(i, true); //false is 0, true is 1 - } - } else - if (x == 'e') { - if (ji == 3) { - outBits->set(i, false); //false is 0, true is 1 - } else { - outBits->set(i, true); //false is 0, true is 1 - } - } else - if (x == 'f') { - outBits->set(i, true); //false is 0, true is 1 - } else { - QString str = " is an invalid character."; - return OperatorResult::error(x + str); - } - ji+=1; //increment 4 times before incrementing j - if (ji >= 4) { - j++; - ji = 0; - } - - setiToEnd = true; - } - i2++; - } + QRegExp re("^[a-f 0-9]*$"); + if (!re.exactMatch(newBitsInRange)) + return OperatorResult::error("Invalid hex character."); + newBits = parseHex( newBitsInRange); + } else if (parameters.value("edit_type").toString() == "ascii") { //ascii - int outputSize = inputContainerSize - (length * 8) + (newBitsInRangeLength * 8); - outBits = QSharedPointer(new BitArray(outputSize)); - bits->copyBits(0, outBits.data(), 0, outputSize, BitArray::Copy); - - QByteArray nair = newBitsInRange.toLocal8Bit(); - const char * newAsciiInRange = nair.data(); - - if (newBitsInRangeLength == length) { - outBits->setBytes(start, newAsciiInRange, 0, newBitsInRangeLength); - } else { - QSharedPointer postBits = QSharedPointer(new BitArray(outputSize - start + length )); - QByteArray byteArray = bits->readBytes(start + length, outputSize - 1); - int endLength = byteArray.length(); - const char* data = byteArray.data(); - outBits->setBytes(start+newBitsInRangeLength, data, 0, endLength); - outBits->setBytes(start, newAsciiInRange, 0, newBitsInRangeLength); - } + newBits = parseAscii( newBitsInRange); + } + newBits->copyBits(0, outBits.data(), start*unitSize, newBits->sizeInBits()*unitSize, BitArray::Copy); + progressInt+=15; progress->setProgressPercent(progressInt); + //for each bit in the bit container //if bit index is less than the start index, or greater than the end index, copy the bit exactly diff --git a/src/hobbits-plugins/operators/Edit/edit.h b/src/hobbits-plugins/operators/Edit/edit.h index 13621562..3868c974 100644 --- a/src/hobbits-plugins/operators/Edit/edit.h +++ b/src/hobbits-plugins/operators/Edit/edit.h @@ -29,6 +29,12 @@ class Edit : public QObject, OperatorInterface QSharedPointer progress) override; private: + int getUnitSize(Parameters parameters); + QSharedPointer parseBits(QString newBitsInRange); + QSharedPointer parseHex(QString newBitsInRange); + QSharedPointer parseAscii(QString newBitsInRange); + QSharedPointer m_delegate; + }; diff --git a/src/hobbits-plugins/operators/Edit/editeditor.cpp b/src/hobbits-plugins/operators/Edit/editeditor.cpp index 0a8838ae..3a29b337 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.cpp +++ b/src/hobbits-plugins/operators/Edit/editeditor.cpp @@ -1,19 +1,20 @@ #include "editeditor.h" #include "ui_editeditor.h" +const qint64 START_MAX = 2147483647; +const qint64 LENGTH_MAX = 1024; + + -enum data { bit, hexa, byte }; //compiler doesn't like the name 'hex' for some reason -data lastType = bit; -QSharedPointer bits; -QSharedPointer bitContainer; EditEditor::EditEditor(QSharedPointer delegate): ui(new Ui::EditEditor()), m_paramHelper(new ParameterHelper(delegate)) { - + m_bitStart = 0; + m_bitLength = 8; + m_changeBits = true; //when false the spinBox values can change without affecting m_bitStart, m_bitLength - ui->setupUi(this); @@ -21,22 +22,25 @@ EditEditor::EditEditor(QSharedPointer delegate): ui->sb_length->setMinimum(0); ui->sb_start->setMinimum(0); - //ui->hs_length->setMaximum(2147483647); //can this be set to the bitcontainer size? - //ui->hs_start->setMaximum(2147483647); - ui->hs_length->setMinimum(0); ui->hs_start->setMinimum(0); + ui->sb_length->setMaximum(LENGTH_MAX); + ui->sb_start->setMaximum(START_MAX); + + ui->hs_length->setMaximum(LENGTH_MAX); + ui->hs_start->setMaximum(START_MAX); + + ui->sb_start->setValue(0); + ui->sb_length->setValue(8); + ui->hs_start->setValue(0); ui->hs_length->setValue(8); //On spinbox value change, change the bits shown in pte_bits - connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SLOT(changeSliderStart())); - connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(changeSliderLength())); - connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SLOT(changeTextBox())); - connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(changeTextBox())); - connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SLOT(setHighlight())); - connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(setHighlight())); + connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SLOT(spinBoxChange())); + connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(spinBoxChange())); + //On slider value change, change the bits shown in pte_bits connect(ui->hs_start, SIGNAL(valueChanged(int)), this, SLOT(changeSpinBoxStart())); @@ -44,9 +48,9 @@ EditEditor::EditEditor(QSharedPointer delegate): //On radio button value change - connect(ui->rb_bit, SIGNAL(toggled(bool)), this, SLOT(setLabelText())); - connect(ui->rb_hex, SIGNAL(toggled(bool)), this, SLOT(setLabelText())); - connect(ui->rb_ascii, SIGNAL(toggled(bool)), this, SLOT(setLabelText())); + connect(ui->rb_bit, SIGNAL(clicked()), this, SLOT(adjustToUnit())); + connect(ui->rb_hex, SIGNAL(clicked()), this, SLOT(adjustToUnit())); + connect(ui->rb_ascii, SIGNAL(clicked()), this, SLOT(adjustToUnit())); //on insert mode change connect(ui->cb_insert, SIGNAL(toggled(bool)), this, SLOT(toggleInsert())); @@ -82,41 +86,59 @@ EditEditor::EditEditor(QSharedPointer delegate): } }); - - // TODO: Correlate parameters in given delegate to form fields - // Ex 1. - // m_paramHelper->addSpinBoxIntParameter("myparametername", ui->spinBox); - // Ex 2. - // m_paramHelper->addParameter("otherparameter", [this](QJsonValue value) { - // // set the value in the editor - // ui->spinBox->setValue(value.toInt()); - // return true; // return false if unable to set the value in the editor - // }, [this]() { - // // get the QJsonValue from the editor - // return QJsonValue(ui->spinBox->value()); - // }); } void EditEditor::setHighlight() { - int start = ui->sb_start->value(); - int length = ui->sb_length->value(); - if (ui->rb_hex->isChecked()) { - start*=4; - length*=4; - } else if (ui->rb_ascii->isChecked()) { - start*=8; - length*=8; - } + quint32 color = 0x553498db; - Range range(start, start + length - 1); - if (! bitContainer.isNull()) { + Range range(m_bitStart, m_bitStart + m_bitLength - 1); + if (! m_bitContainer.isNull()) { //clear current highlights - bitContainer->clearHighlightCategory("edit_highlights"); - bitContainer->addHighlight(RangeHighlight("edit_highlights", + m_bitContainer->clearHighlightCategory("edit_highlights"); + m_bitContainer->addHighlight(RangeHighlight("edit_highlights", QString("%1 to %2").arg(range.start()).arg(range.end()), range, color)); } +} + +void EditEditor::editFromHere(RangeHighlight highlight) { + + qint64 start2; + + start2 = highlight.range().start() / getUnitSize(); + + //set spinbox start to highlight start + if (start2 != m_bitStart / getUnitSize()) { + ui->sb_start->setValue(start2); + //highlight length will set to spinbox length automatically + } else { + setHighlight(); + } +} + +void EditEditor::spinBoxChange() { + if (m_changeBits) { + m_bitStart = (qint64) ui->sb_start->value() * getUnitSize(); + int l = ui->sb_length->value() * getUnitSize(); + + //if (m_bitStart + l <= START_MAX) { + m_bitLength = l; + /* + } else { + ui->sb_length->setValue(m_bitLength); + return; + } + */ + + + } + changeSliderStart(); + changeSliderLength(); + changeTextBox(); + if (!m_bitContainer.isNull()) { + setHighlight(); + } } @@ -142,27 +164,32 @@ void EditEditor::changeSpinBoxLength() { void EditEditor::changeTextBox() { QString str; - if (! bits.isNull()) { - qint64 size = bits->sizeInBits(); + if (! m_bits.isNull()) { + qint64 size = m_bits->sizeInBits(); - int start = ui->sb_start->value(); - int length = ui->sb_length->value(); + int unitSize = getUnitSize(); + + overflow(); + + qint64 start = m_bitStart / unitSize; + qint64 length = m_bitLength / unitSize; - if (ui->rb_bit->isChecked()) { - if (start+length > size) { - length = size - start; - } - str = bits->toBin(start, length); - } else if (ui->rb_hex->isChecked()) { - if (start+length > size / 4) { - length = size / 4 - start; - } - str = bits->toHex(start, length); + /* + if (start + length > START_MAX) { + length = start + length - START_MAX; + } + */ + + if (start+length > size / unitSize) { + length = size / unitSize - start; + } + + if (ui->rb_bit->isChecked()) { + str = m_bits->toBin(start, length); + } else if (ui->rb_hex->isChecked()) { + str = m_bits->toHex(start, length); } else { - if (start+length > size / 8) { - length = size / 8 - start; - } - str = bits->toAscii(start, length); + str = m_bits->toAscii(start, length); } if (ui->rb_hex->isChecked()) { @@ -175,92 +202,87 @@ void EditEditor::changeTextBox() { } } +int EditEditor::getUnitSize() { + if (ui->rb_bit->isChecked()) { + return 1; + } else if (ui->rb_hex->isChecked()) { + return 4; + } else { + return 8; + } +} + +void EditEditor::adjustMax() { -void EditEditor::setLabelText() { - int start = ui->sb_start->value(); - int length = ui->sb_length->value(); + qint64 containerBits = m_bits->sizeInBits(); + qint64 max64 = containerBits / getUnitSize(); + m_startMax = (int) qMin(max64, START_MAX); + m_lengthMax = (int) qMin(max64, LENGTH_MAX); + + ui->sb_start->setMaximum(m_startMax); + ui->hs_start->setMaximum(m_startMax); + + ui->hs_length->setMaximum(m_lengthMax); + ui->sb_length->setMaximum(m_lengthMax); +} + +void EditEditor::overflow() { + int unitSize = getUnitSize(); + if (m_bitStart + m_lengthMax > m_startMax + && m_startMax - m_bitStart / unitSize >= 0) { + m_lengthMax = m_startMax-m_bitStart/unitSize; + ui->sb_length->setMaximum(m_lengthMax); + } else { + adjustMax(); + } +} + +void EditEditor::adjust() { + m_bits = m_bitContainer->bits(); + adjustMax(); + changeTextBox(); + setHighlight(); +} + +void EditEditor::adjustToUnit() { + + if (m_bits.isNull()) { + return; + } + + m_changeBits = false; //don't trigger bitContainer change + + adjustMax(); + + int unitSize = getUnitSize(); + + qint64 unitStart = m_bitStart / unitSize; + m_bitStart = unitStart * unitSize; + + ui->sb_start->setValue(unitStart); + + qint64 unitLength = m_bitLength / unitSize; + m_bitLength = unitLength * unitSize; + + ui->sb_length->setValue(unitLength); + m_changeBits = true; + if (ui->rb_bit->isChecked()) { ui->lb_start->setText("Bit Start"); ui->lb_length->setText("Bit Length"); - if (lastType == byte) { - - if (! bits.isNull()) { - qint64 size = bits->sizeInBits() / 8; - ui->sb_length->setMaximum(size*8); - ui->sb_start->setMaximum(size*8); - ui->hs_length->setMaximum(size*8); - ui->hs_start->setMaximum(size*8); - } - ui->sb_start->setValue(start*8); - ui->sb_length->setValue(length*8); - } else if (lastType == hexa) { - - if (! bits.isNull()) { - qint64 size = bits->sizeInBits() / 4; - ui->sb_length->setMaximum(size*4); - ui->sb_start->setMaximum(size*4); - ui->hs_length->setMaximum(size*4); - ui->hs_start->setMaximum(size*4); - } - ui->sb_start->setValue(start*4); - ui->sb_length->setValue(length*4); - } - lastType = bit; } else if (ui->rb_hex->isChecked()) { ui->lb_start->setText("Nibble Start"); ui->lb_length->setText("Nibble Length"); - if (lastType == bit) { - - if (! bits.isNull()) { - qint64 size = bits->sizeInBits(); - ui->sb_length->setMaximum(size/4); - ui->sb_start->setMaximum(size/4); - ui->hs_length->setMaximum(size/4); - ui->hs_start->setMaximum(size/4); - } - ui->sb_start->setValue(start/4); - ui->sb_length->setValue(length/4); - } else if (lastType == byte) { - - if (! bits.isNull()) { - qint64 size = bits->sizeInBits() / 8; - ui->sb_length->setMaximum(size*2); - ui->sb_start->setMaximum(size*2); - ui->hs_length->setMaximum(size*2); - ui->hs_start->setMaximum(size*2); - } - ui->sb_start->setValue(start*2); - ui->sb_length->setValue(length*2); - } - lastType = hexa; } else { ui->lb_start->setText("Byte Start"); ui->lb_length->setText("Byte Length"); - if (lastType == bit) { - - if (! bits.isNull()) { - qint64 size = bits->sizeInBits(); - ui->sb_length->setMaximum(size/8); - ui->sb_start->setMaximum(size/8); - ui->hs_length->setMaximum(size/8); - ui->hs_start->setMaximum(size/8); - } - ui->sb_start->setValue(start/8); - ui->sb_length->setValue(length/8); - } else if (lastType == hexa) { - - if (! bits.isNull()) { - qint64 size = bits->sizeInBits() / 4; - ui->sb_length->setMaximum(size/2); - ui->sb_start->setMaximum(size/2); - ui->hs_length->setMaximum(size/2); - ui->hs_start->setMaximum(size/2); - } - ui->sb_start->setValue(start/2); - ui->sb_length->setValue(length/2); - } - lastType = byte; } + + if (m_lengthMax == LENGTH_MAX) { + adjust(); + } + + } @@ -301,70 +323,39 @@ void EditEditor::previewBitsImpl(QSharedPointer container, void EditEditor::previewBitsUiImpl(QSharedPointer container) { - bitContainer = container; - + //QSharedPointer oldContainer = m_bitContainer; + m_bitContainer = container; + if (! container.isNull()) { - QString str; - bits = container->bits(); - - qint64 size = bits->sizeInBits(); - - if (ui->rb_hex->isChecked()) { - size/=4; - } else if (ui->rb_ascii->isChecked()) { - size/=8; - } - - ui->sb_length->setMaximum(size); - ui->sb_start->setMaximum(size); - ui->hs_length->setMaximum(size); - ui->hs_start->setMaximum(size); - int start = ui->sb_start->value(); - int length = ui->sb_length->value(); + if (m_bitContainer->info()->containsHighlightCategory("edit_highlights")) { + QList highlights = m_bitContainer->info()->highlights("edit_highlights"); + for (RangeHighlight highlight : highlights) { + qint64 a = highlight.range().end(); + if (highlight.range().end() == -2) { + editFromHere(highlight); + break; + } + //does this if consume too much pp + if (m_bits != m_bitContainer->bits()) { + adjust(); + } + } + + - if (ui->rb_bit->isChecked()) { - str = bits->toBin(start, length); - } else if (ui->rb_hex->isChecked()) { - str = bits->toHex(start, length); } else { - str = bits->toAscii(start, length); - } - - //setHighlight(); - //if rangeHighlight in edit_highlights length == -1 - RangeHighlight highlight; - QList highlights = container->info()->highlights("edit_highlights"); - for (RangeHighlight h : highlights) { - highlight = h; - } - if (highlight.range().end() == -1) { - int start2; - if (ui->rb_hex->isChecked()) { - start2 = highlight.range().start() / 4; - } else if (ui->rb_ascii->isChecked()) { - start2 = highlight.range().start() / 8; - } else { - start2 = highlight.range().start(); - } - //set spinbox start to highlight start - ui->sb_start->setValue(start2); - //highlight length will set to spinbox length automatically - } - //always set edit highlight - else if (highlight.range().isNull()) { - //getto way of setting range highlight - ui->sb_start->setValue(start+1); - ui->sb_start->setValue(start); + adjust(); } - - - - - ui->pte_bits->document()->setPlainText(str); } else { //clear pte_bits ui->pte_bits->document()->setPlainText(""); + m_bits = QSharedPointer(); } + + + + + // TODO: (Optional) Update UI elements to account for preprocessing in previewBitsImpl and/or other metadata } diff --git a/src/hobbits-plugins/operators/Edit/editeditor.h b/src/hobbits-plugins/operators/Edit/editeditor.h index 20d21d09..b879cc98 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.h +++ b/src/hobbits-plugins/operators/Edit/editeditor.h @@ -29,13 +29,28 @@ class EditEditor : public AbstractParameterEditor QSharedPointer progress) override; void previewBitsUiImpl(QSharedPointer container) override; + void adjustMax(); + int getUnitSize(); + void editFromHere(RangeHighlight highlight); + void overflow(); + void adjust(); + + Ui::EditEditor *ui; QSharedPointer m_paramHelper; + qint64 m_bitStart; + qint64 m_bitLength; + int m_lengthMax; + int m_startMax; + QSharedPointer m_bits; + QSharedPointer m_bitContainer; + bool m_changeBits; + signals: public slots: - void setLabelText(); + void adjustToUnit(); void changeSliderStart(); void changeSliderLength(); void changeSpinBoxStart(); @@ -44,6 +59,8 @@ public slots: void toggleInsert(); void setHighlight(); + void spinBoxChange(); + }; diff --git a/src/hobbits-widgets/displaywidget.cpp b/src/hobbits-widgets/displaywidget.cpp index 6e39b6aa..d2c5eb9f 100644 --- a/src/hobbits-widgets/displaywidget.cpp +++ b/src/hobbits-widgets/displaywidget.cpp @@ -447,13 +447,18 @@ void DisplayWidget::showContextMenu(const QPoint &point) [this, frame, bitOffsetHover]() { quint32 color = 0x553498db; qint64 start = frame.start()+bitOffsetHover; - Range range(start, -1); //if length is -1 set length in editeditor.cpp - auto container = m_handle->currentContainer(); - container->info()->clearHighlightCategory("edit_highlights"); - container->info()->addHighlight(RangeHighlight("edit_highlights", - QString("%1 to %2").arg(range.start()).arg(range.end()), - range, - color)); + if (start >= 0) { + Range range(start, -2); //if length is -2 set length in editeditor.cpp + auto container = m_handle->currentContainer(); + container->info()->clearHighlightCategory("edit_highlights"); + container->info()->addHighlight(RangeHighlight("edit_highlights", + QString("%1 to %2").arg(range.start()).arg(range.end()), + range, + color)); + } else { + //error int overflow + } + }); menu.exec(this->mapToGlobal(point)); diff --git a/src/hobbits-widgets/spinbox64.cpp b/src/hobbits-widgets/spinbox64.cpp new file mode 100644 index 00000000..eecbe364 --- /dev/null +++ b/src/hobbits-widgets/spinbox64.cpp @@ -0,0 +1,6 @@ +#include "spinbox64.h" + +spinbox64::spinbox64(QWidget *parent) : QWidget(parent) +{ + +} diff --git a/src/hobbits-widgets/spinbox64.h b/src/hobbits-widgets/spinbox64.h new file mode 100644 index 00000000..445694dd --- /dev/null +++ b/src/hobbits-widgets/spinbox64.h @@ -0,0 +1,16 @@ +#ifndef SPINBOX64_H +#define SPINBOX64_H + +#include + +class spinbox64 : public QWidget +{ + Q_OBJECT +public: + explicit spinbox64(QWidget *parent = nullptr); + +signals: + +}; + +#endif // SPINBOX64_H From b8b50743128819f341797a5283e3c4dfd47f159a Mon Sep 17 00:00:00 2001 From: Badger Date: Wed, 6 Jul 2022 11:01:04 -0400 Subject: [PATCH 11/14] addressing comments 1 and 2 --- .gitignore | 1 + src/hobbits-core/bitarray.cpp | 51 ++++------------------------------- src/hobbits-core/bitarray.h | 4 +-- 3 files changed, 7 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index 5dc6299f..8ae4088e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ CMakeLists.txt.user *.pro.user *.autosave /build* +/build-debug /src/build .vscode *.so diff --git a/src/hobbits-core/bitarray.cpp b/src/hobbits-core/bitarray.cpp index 9b4885d3..ede837cd 100644 --- a/src/hobbits-core/bitarray.cpp +++ b/src/hobbits-core/bitarray.cpp @@ -811,26 +811,10 @@ char BitArray::hexTable(qint64 nibble) const { return chr; } -QString BitArray::toBin() const { - QString str = ""; - - for (quint64 i = 0; i < this->sizeInBits(); i ++) { - if (i < this->sizeInBits() && i >= 0) { - if (this->at(i) == false) { - str+="0"; - } else { - str+="1"; - } - } - } - return str; -} - QString BitArray::toBin(qint64 start, int length) const { QString str = ""; - - for (quint64 i = start; i < start + length; i ++) { - if (i < this->sizeInBits() && i >= 0) { + if (start + length <= this->sizeInBits()) { + for (quint64 i = start; i < start + length; i ++) { if (this->at(i) == false) { str+="0"; } else { @@ -841,44 +825,19 @@ QString BitArray::toBin(qint64 start, int length) const { return str; } -QString BitArray::toHex() const { - QString str = ""; - quint64 nib = 0; - - for (quint64 i = 0; i < this->sizeInBits(); i ++) { - if (i < this->sizeInBits() && i >= 0) { - nib = this->parseUIntValue(i, 4); - } - str += hexTable(nib); - } - return str; -} - QString BitArray::toHex(qint64 start, int length) const { QString str = ""; quint64 nib = 0; - - for (quint64 i = start*4; i < start*4+length*4; i += 4) { - if (i < this->sizeInBits() && i >= 0) { + if (start + length <= this->sizeInBits()/4) { + for (quint64 i = start*4; i < start*4+length*4; i += 4) { nib = this->parseUIntValue(i, 4); str += hexTable(nib); - } + } } return str; } -QString BitArray::toAscii() const { - quint64 size = this->sizeInBits()/8; - QByteArray arr = readBytes(0, size); - - std::string text(arr.constData(), arr.length()); - QString qtext = QString::fromStdString(text); - - return qtext; -} - QString BitArray::toAscii(qint64 start, int length) const { - quint64 size = this->sizeInBits()/8; QByteArray arr = readBytes(start, length); std::string text(arr.constData(), arr.length()); diff --git a/src/hobbits-core/bitarray.h b/src/hobbits-core/bitarray.h index a1711c4b..9ba22020 100644 --- a/src/hobbits-core/bitarray.h +++ b/src/hobbits-core/bitarray.h @@ -71,11 +71,9 @@ class HOBBITSCORESHARED_EXPORT BitArray static QSharedPointer fromString(QString bitArraySpec, QStringList *parseErrors = nullptr); - QString toBin() const; + QString toBin(qint64 start, int length) const; - QString toHex() const; QString toHex(qint64 start, int length) const; - QString toAscii() const; //could also call this toString QString toAscii(qint64 start, int length) const; private: From bdc57f147a61980f5cbe6966e32e04ecdff1c402 Mon Sep 17 00:00:00 2001 From: Badger Date: Wed, 28 Dec 2022 18:40:30 -0500 Subject: [PATCH 12/14] fixed utf-8 stuff --- src/hobbits-core/bitarray.cpp | 94 +++++++++++-------- src/hobbits-core/bitcontainer.cpp | 4 - src/hobbits-gui/mainwindow.cpp | 1 - .../displays/Binary/binary.cpp | 5 +- src/hobbits-plugins/operators/Edit/edit.cpp | 49 +--------- src/hobbits-widgets/bitcontainertreemodel.cpp | 1 - src/hobbits-widgets/spinbox64.cpp | 6 -- src/hobbits-widgets/spinbox64.h | 16 ---- 8 files changed, 59 insertions(+), 117 deletions(-) delete mode 100644 src/hobbits-widgets/spinbox64.cpp delete mode 100644 src/hobbits-widgets/spinbox64.h diff --git a/src/hobbits-core/bitarray.cpp b/src/hobbits-core/bitarray.cpp index ede837cd..ae8ea082 100644 --- a/src/hobbits-core/bitarray.cpp +++ b/src/hobbits-core/bitarray.cpp @@ -773,40 +773,57 @@ QSharedPointer BitArray::fromString(QString bitArraySpec, QStringList char BitArray::hexTable(qint64 nibble) const { char chr; - if (nibble == 0) { - chr = '0'; - } else if (nibble == 1) { - chr = '1'; - } else if (nibble == 2) { - chr = '2'; - } else if (nibble == 3) { - chr = '3'; - } else if (nibble == 4) { - chr = '4'; - } else if (nibble == 5) { - chr = '5'; - } else if (nibble == 6) { - chr = '6'; - } else if (nibble == 7) { - chr = '7'; - } else if (nibble == 8) { - chr = '8'; - } else if (nibble == 9) { - chr = '9'; - } else if (nibble == 10) { - chr = 'a'; - } else if (nibble == 11) { - chr = 'b'; - } else if (nibble == 12) { - chr = 'c'; - } else if (nibble == 13) { - chr = 'd'; - } else if (nibble == 14) { - chr = 'e'; - } else if (nibble == 15) { - chr = 'f'; - } else { - chr = 'o'; + switch (nibble) { + case 0: + chr = '0'; + break; + case 1: + chr = '1'; + break; + case 2: + chr = '2'; + break; + case 3: + chr = '3'; + break; + case 4: + chr = '4'; + break; + case 5: + chr = '5'; + break; + case 6: + chr = '6'; + break; + case 7: + chr = '7'; + break; + case 8: + chr = '8'; + break; + case 9: + chr = '9'; + break; + case 10: + chr = 'a'; + break; + case 11: + chr = 'b'; + break; + case 12: + chr = 'c'; + break; + case 13: + chr = 'd'; + break; + case 14: + chr = 'e'; + break; + case 15: + chr = 'f'; + break; + default: + chr = 'o'; } return chr; } @@ -839,9 +856,12 @@ QString BitArray::toHex(qint64 start, int length) const { QString BitArray::toAscii(qint64 start, int length) const { QByteArray arr = readBytes(start, length); - - std::string text(arr.constData(), arr.length()); - QString qtext = QString::fromStdString(text); + for (int i = 0; i < length; i++) { + if (arr[i] < 32) { + arr[i] = '.'; + } + } + QString qtext = QString::fromLatin1(arr); return qtext; } diff --git a/src/hobbits-core/bitcontainer.cpp b/src/hobbits-core/bitcontainer.cpp index 6d16ac3e..ba335938 100644 --- a/src/hobbits-core/bitcontainer.cpp +++ b/src/hobbits-core/bitcontainer.cpp @@ -88,10 +88,6 @@ QString BitContainer::name() const return m_name; } -qint64 BitContainer::size() const { - return m_bits->sizeInBits(); -} - void BitContainer::setName(QString name) { m_mutex.lock(); diff --git a/src/hobbits-gui/mainwindow.cpp b/src/hobbits-gui/mainwindow.cpp index d2dce1ef..b8225ee0 100644 --- a/src/hobbits-gui/mainwindow.cpp +++ b/src/hobbits-gui/mainwindow.cpp @@ -543,7 +543,6 @@ void MainWindow::currBitContainerChanged() { sendBitContainerPreview(); checkOperatorInput(); - //send new data to plugins? } void MainWindow::sendBitContainerPreview() diff --git a/src/hobbits-plugins/displays/Binary/binary.cpp b/src/hobbits-plugins/displays/Binary/binary.cpp index cd6c773a..caa0183f 100644 --- a/src/hobbits-plugins/displays/Binary/binary.cpp +++ b/src/hobbits-plugins/displays/Binary/binary.cpp @@ -138,7 +138,4 @@ QPoint Binary::headerOffset(const Parameters ¶meters) return QPoint( DisplayHelper::textSize(font, container->frameCount()).width() + margin, DisplayHelper::textSize(font, container->maxFrameWidth()).width() + margin); -} - - - +} \ No newline at end of file diff --git a/src/hobbits-plugins/operators/Edit/edit.cpp b/src/hobbits-plugins/operators/Edit/edit.cpp index 6b73e22a..5de26a9a 100644 --- a/src/hobbits-plugins/operators/Edit/edit.cpp +++ b/src/hobbits-plugins/operators/Edit/edit.cpp @@ -5,7 +5,6 @@ Edit::Edit() { QList infos = { - // TODO: add parameters like {"myparametername", ParameterDelegate::ParameterType::Decimal} {"start", ParameterDelegate::ParameterType::Decimal}, {"length", ParameterDelegate::ParameterType::Decimal}, {"new_bits_in_range", ParameterDelegate::ParameterType::String, false}, @@ -15,7 +14,6 @@ Edit::Edit() m_delegate = ParameterDelegate::create( infos, [this](const Parameters ¶meters) { - // TODO: use parameters to describe action better return QString("Apply %1").arg(this->name()); }, [](QSharedPointer delegate, QSize size) { @@ -36,13 +34,11 @@ QString Edit::name() QString Edit::description() { - // TODO: create actual description - return "Load bits, and modify them individually."; + return "Directly replace or insert into segments of a bit container"; } QStringList Edit::tags() { - // TODO: add relevant tags return {"Generic"}; } @@ -99,31 +95,6 @@ QSharedPointer Edit::parseAscii(QString newBitsInRange) { QString bitArraySpec = newBitsInRange; QSharedPointer newBits = newBitArray->fromString(bitArraySpec, &parseErrors); return newBits; - - /* - - QByteArray nair = newBitsInRange.toLocal8Bit(); - const char * newAsciiInRange = nair.data(); - - int newBitsInRangeLength = newBitsInRange.length(); - qint64 outputSize = inputContainerSize - (length * 8) + (newBitsInRangeLength * 8); - - QSharedPointer bits = inputContainers.at(0)->bits(); - - if (newBitsInRangeLength == length) { - m_outBits->setBytes(start, newAsciiInRange, 0, newBitsInRangeLength); - } else { - QSharedPointer postBits = QSharedPointer(new BitArray(outputSize - start + length )); - QByteArray byteArray = bits->readBytes(start + length, outputSize - 1); - int endLength = byteArray.length(); - const char* data = byteArray.data(); - m_outBits->setBytes(start+newBitsInRangeLength, data, 0, endLength); - m_outBits->setBytes(start, newAsciiInRange, 0, newBitsInRangeLength); - - } - - */ - } QSharedPointer Edit::operateOnBits( @@ -161,22 +132,10 @@ QSharedPointer Edit::operateOnBits( qint64 start = parameters.value("start").toInt(); qint64 length = parameters.value("length").toInt(); - //get bits from text box QString newBitsInRange = parameters.value("new_bits_in_range").toString(); - - //pte_bits is already filled with data from start to length - // - //auto bitContainer = inputContainers.first(); QList> outputContainers; - - - - - //do something with bits here - //ex 0000 1111 -> 1111 0000 - int end = start + length; qint64 inputContainerSize = inputContainers.at(0)->size(); QSharedPointer bits = inputContainers.at(0)->bits(); @@ -222,15 +181,9 @@ QSharedPointer Edit::operateOnBits( newBits->copyBits(0, outBits.data(), start*unitSize, newBits->sizeInBits()*unitSize, BitArray::Copy); progressInt+=15; progress->setProgressPercent(progressInt); - //for each bit in the bit container - //if bit index is less than the start index, or greater than the end index, copy the bit exactly - auto bitContainer = BitContainer::create(outBits); outputContainers.append(bitContainer); - //return OperatorResult::error("Hej"); return OperatorResult::result(outputContainers, parameters); - // TODO: Perform operation and return result with OperatorResult::result - //return OperatorResult::error("Bits from start to length would be changed according to your entry, but that is not implemented yet."); } diff --git a/src/hobbits-widgets/bitcontainertreemodel.cpp b/src/hobbits-widgets/bitcontainertreemodel.cpp index c3102f11..9f22f8eb 100644 --- a/src/hobbits-widgets/bitcontainertreemodel.cpp +++ b/src/hobbits-widgets/bitcontainertreemodel.cpp @@ -24,7 +24,6 @@ QVariant BitContainerTreeModel::data(const QModelIndex &index, int role) const if (size < 1000) { f_size = size; - //QString unit = "bits"; } else if (size >= 1000 && size < 8000) { unit = "bytes"; diff --git a/src/hobbits-widgets/spinbox64.cpp b/src/hobbits-widgets/spinbox64.cpp deleted file mode 100644 index eecbe364..00000000 --- a/src/hobbits-widgets/spinbox64.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "spinbox64.h" - -spinbox64::spinbox64(QWidget *parent) : QWidget(parent) -{ - -} diff --git a/src/hobbits-widgets/spinbox64.h b/src/hobbits-widgets/spinbox64.h deleted file mode 100644 index 445694dd..00000000 --- a/src/hobbits-widgets/spinbox64.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef SPINBOX64_H -#define SPINBOX64_H - -#include - -class spinbox64 : public QWidget -{ - Q_OBJECT -public: - explicit spinbox64(QWidget *parent = nullptr); - -signals: - -}; - -#endif // SPINBOX64_H From d27bb7ac138a69daaea84ac1485d38aacd189b99 Mon Sep 17 00:00:00 2001 From: Badger Date: Wed, 28 Dec 2022 18:47:02 -0500 Subject: [PATCH 13/14] readded size() function --- src/hobbits-core/bitcontainer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hobbits-core/bitcontainer.cpp b/src/hobbits-core/bitcontainer.cpp index ba335938..6d16ac3e 100644 --- a/src/hobbits-core/bitcontainer.cpp +++ b/src/hobbits-core/bitcontainer.cpp @@ -88,6 +88,10 @@ QString BitContainer::name() const return m_name; } +qint64 BitContainer::size() const { + return m_bits->sizeInBits(); +} + void BitContainer::setName(QString name) { m_mutex.lock(); From d5dd8a6a00067f127643550724a9c7a95a700511 Mon Sep 17 00:00:00 2001 From: Badger Date: Wed, 28 Dec 2022 19:10:36 -0500 Subject: [PATCH 14/14] cleaned --- .../operators/Edit/editeditor.cpp | 37 ++----------------- 1 file changed, 3 insertions(+), 34 deletions(-) diff --git a/src/hobbits-plugins/operators/Edit/editeditor.cpp b/src/hobbits-plugins/operators/Edit/editeditor.cpp index 3a29b337..b967b3be 100644 --- a/src/hobbits-plugins/operators/Edit/editeditor.cpp +++ b/src/hobbits-plugins/operators/Edit/editeditor.cpp @@ -13,12 +13,10 @@ EditEditor::EditEditor(QSharedPointer delegate): { m_bitStart = 0; m_bitLength = 8; - m_changeBits = true; //when false the spinBox values can change without affecting m_bitStart, m_bitLength + m_changeBits = true; ui->setupUi(this); - - ui->sb_length->setMinimum(0); ui->sb_start->setMinimum(0); @@ -41,13 +39,11 @@ EditEditor::EditEditor(QSharedPointer delegate): connect(ui->sb_start, SIGNAL(valueChanged(int)), this, SLOT(spinBoxChange())); connect(ui->sb_length, SIGNAL(valueChanged(int)), this, SLOT(spinBoxChange())); - //On slider value change, change the bits shown in pte_bits connect(ui->hs_start, SIGNAL(valueChanged(int)), this, SLOT(changeSpinBoxStart())); connect(ui->hs_length, SIGNAL(valueChanged(int)), this, SLOT(changeSpinBoxLength())); //On radio button value change - connect(ui->rb_bit, SIGNAL(clicked()), this, SLOT(adjustToUnit())); connect(ui->rb_hex, SIGNAL(clicked()), this, SLOT(adjustToUnit())); connect(ui->rb_ascii, SIGNAL(clicked()), this, SLOT(adjustToUnit())); @@ -55,14 +51,9 @@ EditEditor::EditEditor(QSharedPointer delegate): //on insert mode change connect(ui->cb_insert, SIGNAL(toggled(bool)), this, SLOT(toggleInsert())); - - m_paramHelper->addSpinBoxIntParameter("start", ui->sb_start); m_paramHelper->addSpinBoxIntParameter("length", ui->sb_length); - //m_paramHelper->addLabelParameter("start_label", ui->lb_start); - //m_paramHelper->addLabelParameter("length_label", ui->lb_length); - m_paramHelper->addTextEditStringParameter("new_bits_in_range", ui->pte_bits); m_paramHelper->addParameter("edit_type", [this](QJsonValue value) { @@ -108,10 +99,8 @@ void EditEditor::editFromHere(RangeHighlight highlight) { start2 = highlight.range().start() / getUnitSize(); - //set spinbox start to highlight start if (start2 != m_bitStart / getUnitSize()) { ui->sb_start->setValue(start2); - //highlight length will set to spinbox length automatically } else { setHighlight(); } @@ -121,17 +110,7 @@ void EditEditor::spinBoxChange() { if (m_changeBits) { m_bitStart = (qint64) ui->sb_start->value() * getUnitSize(); int l = ui->sb_length->value() * getUnitSize(); - - //if (m_bitStart + l <= START_MAX) { m_bitLength = l; - /* - } else { - ui->sb_length->setValue(m_bitLength); - return; - } - */ - - } changeSliderStart(); changeSliderLength(); @@ -173,12 +152,6 @@ void EditEditor::changeTextBox() { qint64 start = m_bitStart / unitSize; qint64 length = m_bitLength / unitSize; - - /* - if (start + length > START_MAX) { - length = start + length - START_MAX; - } - */ if (start+length > size / unitSize) { length = size / unitSize - start; @@ -250,7 +223,7 @@ void EditEditor::adjustToUnit() { return; } - m_changeBits = false; //don't trigger bitContainer change + m_changeBits = false; adjustMax(); @@ -301,8 +274,7 @@ EditEditor::~EditEditor() QString EditEditor::title() { - // TODO: Make this more descriptive - return "Configure Edit"; + return "Select Section to Edit"; } Parameters EditEditor::parameters() @@ -323,7 +295,6 @@ void EditEditor::previewBitsImpl(QSharedPointer container, void EditEditor::previewBitsUiImpl(QSharedPointer container) { - //QSharedPointer oldContainer = m_bitContainer; m_bitContainer = container; if (! container.isNull()) { @@ -336,7 +307,6 @@ void EditEditor::previewBitsUiImpl(QSharedPointer container editFromHere(highlight); break; } - //does this if consume too much pp if (m_bits != m_bitContainer->bits()) { adjust(); } @@ -348,7 +318,6 @@ void EditEditor::previewBitsUiImpl(QSharedPointer container adjust(); } } else { - //clear pte_bits ui->pte_bits->document()->setPlainText(""); m_bits = QSharedPointer(); }