2016-10-26 04:41:42 +00:00
|
|
|
#include "DisassemblerMetadataDialog.h"
|
|
|
|
#include "ui_DisassemblerMetadataDialog.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
|
|
|
2016-10-26 21:44:22 +00:00
|
|
|
DisassemblerMetadataDialog::DisassemblerMetadataDialog(BinaryFileMetadata *bfm, QWidget *parent) :
|
2016-10-26 04:41:42 +00:00
|
|
|
QDialog(parent),
|
|
|
|
ui(new Ui::DisassemblerMetadataDialog)
|
|
|
|
{
|
|
|
|
ui->setupUi(this);
|
2017-06-29 05:21:45 +00:00
|
|
|
ui->entryTable->verticalHeader()->show();
|
|
|
|
ui->removeEntryPointButton->setEnabled(false);
|
|
|
|
ui->removeSymbolButton->setEnabled(false);
|
2016-10-26 04:41:42 +00:00
|
|
|
|
2016-10-26 21:44:22 +00:00
|
|
|
m_bfm = bfm;
|
2016-10-26 04:41:42 +00:00
|
|
|
|
2016-10-26 21:44:22 +00:00
|
|
|
m_epmodel = new EntryPointModel(this,m_bfm->entryPoints());
|
|
|
|
m_asmodel = new AssemblerSymbolModel(this,m_bfm->assemblerSymbols());
|
2016-10-26 07:23:33 +00:00
|
|
|
|
2016-10-26 04:41:42 +00:00
|
|
|
ui->entryTable->setModel(m_epmodel);
|
2016-10-26 07:23:33 +00:00
|
|
|
ui->symbolTable->setModel(m_asmodel);
|
2016-10-26 04:41:42 +00:00
|
|
|
|
2017-06-29 05:21:45 +00:00
|
|
|
connect(ui->exitButton, &QPushButton::clicked,
|
|
|
|
this, &DisassemblerMetadataDialog::handleExitButton);
|
|
|
|
connect(ui->processButton, &QPushButton::clicked,
|
|
|
|
this, &DisassemblerMetadataDialog::handleProcessButton);
|
|
|
|
|
|
|
|
connect(ui->addEntryPointButton, &QToolButton::clicked,
|
|
|
|
this, &DisassemblerMetadataDialog::handleAddEntryPointButton);
|
|
|
|
connect(ui->addSymbolButton, &QToolButton::clicked,
|
|
|
|
this, &DisassemblerMetadataDialog::handleAddSymbolButton);
|
|
|
|
|
|
|
|
connect(ui->removeEntryPointButton, &QToolButton::clicked,
|
|
|
|
this, &DisassemblerMetadataDialog::handleRemoveEntryPointButton);
|
|
|
|
connect(ui->removeSymbolButton, &QToolButton::clicked,
|
|
|
|
this, &DisassemblerMetadataDialog::handleRemoveSymbolButton);
|
|
|
|
|
|
|
|
connect(ui->entryTable->selectionModel(), &QItemSelectionModel::selectionChanged,
|
|
|
|
this, &DisassemblerMetadataDialog::handleEntryPointSelectionChanged);
|
|
|
|
connect(ui->symbolTable->selectionModel(), &QItemSelectionModel::selectionChanged,
|
|
|
|
this, &DisassemblerMetadataDialog::handleSymbolSelectionChanged);
|
2016-10-26 04:41:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DisassemblerMetadataDialog::~DisassemblerMetadataDialog()
|
|
|
|
{
|
|
|
|
delete ui;
|
|
|
|
}
|
|
|
|
|
2016-10-31 00:00:39 +00:00
|
|
|
void DisassemblerMetadataDialog::showEvent(QShowEvent *)
|
|
|
|
{
|
2016-10-26 07:23:33 +00:00
|
|
|
ui->entryTable->resizeRowsToContents();
|
2016-10-26 07:27:58 +00:00
|
|
|
ui->symbolTable->resizeRowsToContents();
|
2016-10-26 07:23:33 +00:00
|
|
|
}
|
|
|
|
|
2016-10-26 04:41:42 +00:00
|
|
|
void DisassemblerMetadataDialog::handleExitButton()
|
|
|
|
{
|
2017-06-29 05:21:45 +00:00
|
|
|
m_bfm->requestDisassembly();
|
2016-10-26 23:16:53 +00:00
|
|
|
m_bfm->save();
|
2016-10-26 04:41:42 +00:00
|
|
|
this->close();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DisassemblerMetadataDialog::handleProcessButton()
|
|
|
|
{
|
2016-10-26 21:44:22 +00:00
|
|
|
m_bfm->requestDisassembly();
|
2016-10-26 04:41:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void DisassemblerMetadataDialog::handleAddEntryPointButton()
|
|
|
|
{
|
|
|
|
LocationInfoDialog lid(this);
|
|
|
|
lid.setWindowTitle("Add Entry Point");
|
|
|
|
if (lid.exec() == Accepted)
|
|
|
|
{
|
|
|
|
EntryPoint ep;
|
|
|
|
ep.address = lid.getAddress();
|
|
|
|
ep.note = lid.getInfo();
|
2016-10-26 21:44:22 +00:00
|
|
|
m_bfm->entryPoints()->addPoint(ep);
|
2016-10-26 07:23:33 +00:00
|
|
|
ui->entryTable->resizeRowsToContents();
|
2017-06-29 05:21:45 +00:00
|
|
|
ui->entryTable->resizeRowsToContents();
|
2016-10-26 04:41:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DisassemblerMetadataDialog::handleRemoveEntryPointButton()
|
|
|
|
{
|
2017-06-29 05:21:45 +00:00
|
|
|
QModelIndexList selection = ui->entryTable->selectionModel()->selectedRows(0);
|
|
|
|
qDebug() << "Removing" << selection.count() << "row(s)";
|
|
|
|
if (selection.count())
|
|
|
|
{
|
|
|
|
// qDebug() << "Removing row" << selection[0].row();
|
|
|
|
m_epmodel->removeRows(selection[0].row(),1);
|
|
|
|
// qDebug() << "Removed row" << selection[0].row();
|
|
|
|
}
|
2016-10-31 00:00:39 +00:00
|
|
|
}
|
2016-10-26 04:41:42 +00:00
|
|
|
|
|
|
|
void DisassemblerMetadataDialog::handleAddSymbolButton()
|
|
|
|
{
|
|
|
|
LocationInfoDialog lid(this);
|
2016-10-26 07:23:33 +00:00
|
|
|
lid.setInfoLabelString("Symbol Name");
|
2016-10-26 04:41:42 +00:00
|
|
|
lid.setWindowTitle("Add Symbol");
|
2017-06-29 05:21:45 +00:00
|
|
|
lid.showSizeWidgets(true);
|
2016-10-26 04:41:42 +00:00
|
|
|
if (lid.exec() == Accepted)
|
|
|
|
{
|
2016-10-26 07:27:58 +00:00
|
|
|
AssemblerSymbol as;
|
2016-10-26 07:23:33 +00:00
|
|
|
as.address = lid.getAddress();
|
|
|
|
as.name = lid.getInfo();
|
2017-06-29 05:21:45 +00:00
|
|
|
if (lid.getSymbolSize() == 0) // Byte
|
|
|
|
{
|
|
|
|
as.symbolsize = SizeByte;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
as.symbolsize = SizeWord;
|
|
|
|
}
|
2016-10-26 21:44:22 +00:00
|
|
|
m_bfm->assemblerSymbols()->addSymbol(as);
|
2016-10-26 07:23:33 +00:00
|
|
|
ui->symbolTable->resizeRowsToContents();
|
2016-10-26 04:41:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DisassemblerMetadataDialog::handleRemoveSymbolButton()
|
|
|
|
{
|
2017-06-29 05:21:45 +00:00
|
|
|
QModelIndexList selection = ui->symbolTable->selectionModel()->selectedRows(0);
|
|
|
|
qDebug() << "Removing" << selection.count() << "row(s)";
|
|
|
|
if (selection.count())
|
|
|
|
{
|
|
|
|
m_asmodel->removeRows(selection[0].row(),1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DisassemblerMetadataDialog::handleEntryPointSelectionChanged(QItemSelection selected, QItemSelection deselected)
|
|
|
|
{
|
|
|
|
Q_UNUSED(selected);
|
|
|
|
Q_UNUSED(deselected);
|
|
|
|
int selectedcount = ui->entryTable->selectionModel()->selectedRows().count();
|
|
|
|
ui->removeEntryPointButton->setEnabled(selectedcount);
|
|
|
|
}
|
2016-10-26 04:41:42 +00:00
|
|
|
|
2017-06-29 05:21:45 +00:00
|
|
|
void DisassemblerMetadataDialog::handleSymbolSelectionChanged(QItemSelection selected, QItemSelection deselected)
|
|
|
|
{
|
|
|
|
Q_UNUSED(selected);
|
|
|
|
Q_UNUSED(deselected);
|
|
|
|
int selectedcount = ui->symbolTable->selectionModel()->selectedRows().count();
|
|
|
|
ui->removeSymbolButton->setEnabled(selectedcount);
|
2016-10-26 04:41:42 +00:00
|
|
|
}
|