X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fgui%2FMainwindow.cxx;h=8a62ef8d2257386cf17b6df7074d48b82a414c29;hp=5643beb23731e7017f0b39b6066297fc05cdac92;hb=e483d95e6b01bc5c6b97bb596409db0b35e213f7;hpb=119d1aff7df9c3235177c3bf55bd618feb3c1519 diff --git a/src/gui/Mainwindow.cxx b/src/gui/Mainwindow.cxx index 5643beb..8a62ef8 100644 --- a/src/gui/Mainwindow.cxx +++ b/src/gui/Mainwindow.cxx @@ -3,12 +3,9 @@ #include "disassembler/llvm/LLVMDisassembler.hxx" #include "widgets/CFGScene.hxx" +#include "dialogs/NewFunctionDialog.hxx" -#include #include -#include - -#include namespace { BasicBlockWidget * @@ -18,7 +15,8 @@ namespace { } Mainwindow::Mainwindow(InformationManager* mgr) - : manager(mgr) { + : manager(mgr) + , logger(log4cxx::Logger::getLogger("Mainwindow")) { openAction = new QAction(tr("&Open"), this); // saveAction = new QAction(tr("&Save"), this); exitAction = new QAction(tr("E&xit"), this); @@ -40,6 +38,10 @@ Mainwindow::Mainwindow(InformationManager* mgr) addDockWidget(Qt::BottomDockWidgetArea, scripting); listWidget = new QListWidget(); + listWidget->setContextMenuPolicy(Qt::CustomContextMenu); + connect(listWidget, SIGNAL(customContextMenuRequested(const QPoint&)), + this, SLOT(showListContextMenu(const QPoint&))); + stackedWidget = new QStackedWidget(); dockWidget = new QDockWidget(tr("Functions"), this); dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | @@ -49,17 +51,21 @@ Mainwindow::Mainwindow(InformationManager* mgr) setCentralWidget(stackedWidget); connect(listWidget, SIGNAL(currentRowChanged(int)), - stackedWidget, SLOT(setCurrentIndex(int))); + this, SLOT(switchMainPlane(int))); setWindowTitle(tr("FRIDA")); mgr->connect_new_function_signal([&] (Function* fun) {addFunction(fun);}); + mgr->connect_new_dyn_symbol_signal([&] (const std::string& name) { + auto item = new QListWidgetItem(name.c_str(), listWidget); + item->setBackground(QBrush(QColor(0xff, 0xdd, 0xdd))); + }); } void Mainwindow::quit() { QMessageBox messageBox; - messageBox.setWindowTitle(tr("Notepad")); + messageBox.setWindowTitle(tr("Frida")); messageBox.setText(tr("Do you really want to quit?")); messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); messageBox.setDefaultButton(QMessageBox::No); @@ -74,6 +80,34 @@ void Mainwindow::open() { manager->reset(fileName.toStdString()); } +void Mainwindow::switchMainPlane(int index) { + stackedWidget->setCurrentWidget(objects_list[listWidget->currentItem()]); +} + +void Mainwindow::showListContextMenu(const QPoint& point) { + QListWidgetItem * item = listWidget->itemAt(point); + if (item) { + LOG4CXX_DEBUG(logger, "WOHO " << item->text().toStdString()); + } else { + QMenu menu(this); + QAction * act = menu.addAction("AddFunction"); + connect(act, SIGNAL(triggered()), this, SLOT(requestNewFunction())); + + menu.exec(listWidget->mapToGlobal(point)); + } +} + +void Mainwindow::requestNewFunction() { + NewFunctionDialog dialog; + int result = dialog.exec(); + if (QDialog::Accepted == result) { + LOG4CXX_DEBUG(logger, "requesting Function at " << std::hex << dialog.result()); + manager->getDisassembler()->disassembleFunctionAt(dialog.result()); + } else { + LOG4CXX_DEBUG(logger, "requestNewFunction aborted"); + } +} + void Mainwindow::addFunction(Function* fun) { if (functions.find(fun) != functions.end()) return; @@ -88,8 +122,14 @@ void Mainwindow::addFunction(Function* fun) { Disassembler * dis = manager->getDisassembler(); BasicBlock * block = dis->getBasicBlock(fun->getStartAddress()); + uint64_t start_address(std::numeric_limits::max()); + for (auto b : fun->blocks()) { + if (b.first < start_address) + start_address = b.first; + } + local__add_basic_block(block, manager->getDisassembler(), blocks, scene, - block->getStartAddress(), 100); + start_address, 100); QGraphicsView * view = new QGraphicsView(scene); w->addTab(view, "CFG"); @@ -101,8 +141,9 @@ void Mainwindow::addFunction(Function* fun) { w->addTab(t, "Listing"); - listWidget->addItem(fun->getName().c_str()); + QListWidgetItem * item = new QListWidgetItem(fun->getName().c_str(), listWidget); stackedWidget->addWidget(w); + objects_list.insert(std::make_pair(item, w)); } namespace { @@ -130,8 +171,11 @@ namespace { block->getEndAddress(), [&](uint8_t* bytes, size_t byte_count, - const std::string& line) { - widget->addItem(bytes, byte_count, line.c_str() + 1); + const std::string& line, + const std::string& ref) { + widget->addItem(bytes, byte_count, + line.c_str() + 1, // remove \t + ref.c_str()); }); BasicBlockWidget *tmp, *nextl(NULL), *nextr(NULL);