X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fgui%2Fwidgets%2FBasicBlockWidget.cxx;h=efa7ec34394ec6d2416933c99d452d1b054032fa;hp=f66a575167b83fb25d1cc12b4fd06d5975b583a0;hb=3a4fade0292b9b8776c6195467b70a8f25a3b1c7;hpb=440c4598343d9e46d8963f7753c122b121826334 diff --git a/src/gui/widgets/BasicBlockWidget.cxx b/src/gui/widgets/BasicBlockWidget.cxx index f66a575..efa7ec3 100644 --- a/src/gui/widgets/BasicBlockWidget.cxx +++ b/src/gui/widgets/BasicBlockWidget.cxx @@ -3,9 +3,12 @@ #include "gui/dialogs/SimpleStringDialog.hxx" #include "core/BasicBlock.hxx" #include "core/Function.hxx" +#include "core/Comment.hxx" +#include "disassembler/Instruction.hxx" #include "core/InformationManager.hxx" #include "core/events/RenameFunctionEvent.hxx" -#include +#include "core/events/ChangeCommentEvent.hxx" +#include class CustomQGraphicsTextItem : public QObject, public QGraphicsTextItem { public: @@ -13,18 +16,26 @@ public: : QGraphicsTextItem(text, parent), parent(parent) {} void contextMenuEvent(QGraphicsSceneContextMenuEvent*); private: - void addComment(QTextTableCell cell, const QString& title); + void addComment(int row, bool global); BasicBlockWidget* parent; }; -void CustomQGraphicsTextItem::addComment(QTextTableCell cell, const QString& title) { - SimpleStringDialog dialog(title); +void CustomQGraphicsTextItem::addComment(int row, bool global) { + SimpleStringDialog dialog(global ? "Global comment" : "Local comment"); int result = dialog.exec(); + uint64_t address = parent->instructions[row].getAddress(); if (QDialog::Accepted == result) { - LOG4CXX_DEBUG(parent->logger, "adding comment " << dialog.result().toStdString() - << " at row " << cell.row()); - cell.firstCursorPosition().insertHtml(QString(";; ") + dialog.result()); + Comment* comment; + if (global) { + comment = parent->block->getManager()->newGlobalComment(address); + } else { + comment = parent->block->getManager()->newLocalComment(address, (Function*)0x23); + } + comment->setText(dialog.result().toStdString()); + parent->block->getManager()->finishComment(comment); + +// cell.firstCursorPosition().insertHtml(QString(";; ") + dialog.result()); } else { LOG4CXX_DEBUG(parent->logger, "addComment aborted"); } @@ -47,14 +58,13 @@ void CustomQGraphicsTextItem::contextMenuEvent(QGraphicsSceneContextMenuEvent* e QTextTable* table = c.currentTable(); if (NULL != table) { int row = table->cellAt(c).row(); - QTextTableCell cell = table->cellAt(row, 2); QAction* globalComment = menu.addAction("Add global Comment"); QAction* localComment = menu.addAction("Add local Comment"); QObject::connect(globalComment, &QAction::triggered, - [=]() { addComment(cell, "Global comment"); }); + [=]() { addComment(row, true); }); QObject::connect(localComment, &QAction::triggered, - [=]() { addComment(cell, "Local comment"); }); + [=]() { addComment(row, false); }); } menu.exec(event->screenPos()); @@ -65,10 +75,10 @@ BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block, : width(270), height(45), name(name) , _table(NULL) , block(block), mainwindow(mainwindow) - , logger(log4cxx::Logger::getLogger(name.toStdString() + " BasicBlockWidget")) { + , logger(log4cxx::Logger::getLogger("gui.BasicBlockWidget." + name.toStdString())) { next[0] = NULL; next[1] = NULL; - block->getManager()->connect_rename_function_signal([=](RenameFunctionEvent* event) {updateFunctionName(event);}); + block->getManager()->registerRenameFunctionEvent([=](RenameFunctionEvent* event) {updateFunctionName(event);}); _widget.reset(new CustomQGraphicsTextItem("", this)); _widget->setPos(5, 20); @@ -84,6 +94,9 @@ BasicBlockWidget::BasicBlockWidget(const QString& name, BasicBlock * block, mainwindow->switchMainPlaneToAddress(address.toInt(NULL, 16)); } }); + instructions = block->getInstructions(); + populateWidget(); + block->getManager()->registerChangeCommentEvent([=](ChangeCommentEvent* e) {changeCommentHandler(e);}); } void BasicBlockWidget::updateFunctionName(RenameFunctionEvent *event) { @@ -111,51 +124,85 @@ void BasicBlockWidget::updateFunctionName(RenameFunctionEvent *event) { } } -void BasicBlockWidget::addItem(uint8_t* bytes, size_t num_bytes, - QString line, const QString& href) { - QString bytestring; - int row; - - if (_table) { - row = _table->rows(); - _table->appendRows(1); - } else { - row = 0; - QTextTableFormat format; - format.setBorderStyle(QTextFrameFormat::BorderStyle_None); - format.setBorder(0); - _table = _widget->textCursor().insertTable(1, 3, format); - } - - for (size_t i(0); i < num_bytes; ++i) { - const char * hexdigits = "0123456789ABCDEF"; - bytestring += hexdigits[(bytes[i] >> 4) & 0xF]; - bytestring += hexdigits[bytes[i] & 0xF]; - bytestring += ' '; +void BasicBlockWidget::changeCommentHandler(ChangeCommentEvent* event) { + auto inst_it = std::find_if(instructions.begin(), instructions.end(), + [=](Instruction& inst) { + return inst.getAddress() == event->address; + }); + if (inst_it != instructions.end()) { + if (std::find(inst_it->comments().begin(), + inst_it->comments().begin(), + event->comment) == inst_it->comments().end()) { + LOG4CXX_DEBUG(logger, "Change Comment Event -- New Comment!"); + inst_it->comments().push_back(event->comment); + } + int row = inst_it - instructions.begin(); + LOG4CXX_DEBUG(logger, "Inserting comment for instruction at row " << std::hex << row); + QTextCursor cursor = _table->cellAt(row, 2).lastCursorPosition(); + while (cursor != _table->cellAt(row, 2).firstCursorPosition()) { + cursor.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor, 1); + } + cursor.removeSelectedText(); + cursor.insertHtml(formatComments(&*inst_it)); } +} - _table->cellAt(row, 0).firstCursorPosition().insertText(bytestring); - - line = line.replace('\t', ' ').toHtmlEscaped(); - if (href != "") { - QStringList list = href.split(":"); - if (list[0] == "function") { - uint64_t address = href.split(":")[1].toLongLong(NULL, 16); - Function* fun = block->getManager()->getFunction(address); - - if (fun) { - line = line.split(" ")[0] + " " + fun->getName().c_str(); - LOG4CXX_DEBUG(logger, "Naming function at " << address << " " << fun->getName()); +void BasicBlockWidget::populateWidget() { + int row; + QTextTableFormat format; + format.setBorderStyle(QTextFrameFormat::BorderStyle_None); + format.setBorder(0); + + for (Instruction& inst : instructions) { + if (_table) { + row = _table->rows(); + _table->appendRows(1); + } else { + row = 0; + _table = _widget->textCursor().insertTable(1, 3, format); + } + QString bytestring; + for (uint8_t byte : inst.getBytes()) { + const char * hexdigits = "0123456789ABCDEF"; + bytestring += hexdigits[(byte >> 4) & 0xF]; + bytestring += hexdigits[byte & 0xF]; + bytestring += ' '; + } + _table->cellAt(row, 0).firstCursorPosition().insertText(bytestring); + + QString line = inst.getText().c_str(); + line = line.replace('\t', ' ').toHtmlEscaped(); + if (inst.getReference() != "") { + QString href = inst.getReference().c_str(); + QStringList list = href.split(":"); + if (list[0] == "function") { + uint64_t address = href.split(":")[1].toLongLong(NULL, 16); + Function* fun = block->getManager()->getFunction(address); + + if (fun) { + line = line.split(" ")[0] + " " + QString(fun->getName().c_str()).toHtmlEscaped(); + LOG4CXX_DEBUG(logger, "Naming function at " << address << " " << fun->getName()); + } } + line = "" + line + ""; } - line = "" + line + ""; + _table->cellAt(row, 1).firstCursorPosition().insertHtml(line); + _table->cellAt(row, 2).firstCursorPosition().insertHtml(formatComments(&inst)); } +} - _table->cellAt(row, 1).firstCursorPosition().insertHtml(line); +QString BasicBlockWidget::formatComments(Instruction* inst) { + QString comments; + for (Comment* c: inst->comments()) { + comments += "
"; + comments += QString(c->getText().c_str()).toHtmlEscaped(); + } + return (comments == "" ? "" : ";; ") + comments.trimmed(); } -void BasicBlockWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, - QWidget *widget) { +void BasicBlockWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem*, + QWidget*) { + _widget->adjustSize(); width = 10 + _widget->boundingRect().width(); height = 25 + _widget->boundingRect().height(); if (width < 250) width = 250;