#include "core/BasicBlock.hxx"
#include "core/InformationManager.hxx"
#include "core/events/RenameFunctionEvent.hxx"
+#include "core/events/NewFunctionEvent.hxx"
+
+#include "widgets/FridaDock.hxx"
+#include "widgets/LogDock.hxx"
#include "widgets/ScriptingDock.hxx"
#include "widgets/CFGScene.hxx"
#include "widgets/FunctionWidget.hxx"
Mainwindow::Mainwindow(InformationManager* mgr)
: manager(mgr)
- , logger(log4cxx::Logger::getLogger("Mainwindow")) {
+ , logger(log4cxx::Logger::getLogger("gui.Mainwindow")) {
openAction = new QAction(tr("&Open"), this);
loadAction = new QAction(tr("&Load"), this);
saveAction = new QAction(tr("&Save"), this);
QMenu* interpretermenu = menuBar()->addMenu(tr("&Interpreter"));
- interpreter["GUILE"] = new GuileInterpreter;
- scripting = new ScriptingDock(interpreter["GUILE"], tr("Scripting"), this);
- scripting->setAllowedAreas(Qt::BottomDockWidgetArea);
- addDockWidget(Qt::BottomDockWidgetArea, scripting);
+ fdock = new FridaDock(tr("Frida Dock"), this);
+
+ fdock->addTab(new LogDock(fdock), "Log");
+
+ fdock->addTab(new ScriptingDock(manager->getInterpreter("GUILE"), fdock), "guile");
+ fdock->setAllowedAreas(Qt::BottomDockWidgetArea);
+ addDockWidget(Qt::BottomDockWidgetArea, fdock);
QAction* guileLoad = new QAction(tr("&GUILE"), this);
interpretermenu->addAction(guileLoad);
connect(guileLoad, &QAction::triggered,
[&]() {
QString fileName = QFileDialog::getOpenFileName(this, tr("Open Script"), "",
- tr("Binaries") + " (*." +
- interpreter["GUILE"]->fileExtension().c_str() + ")");
- std::stringstream a, b;
- std::string c;
- interpreter["GUILE"]->loadFile(fileName.toStdString(), a, b, c);
+ tr("Scripts") + " (*." +
+ manager->getInterpreter("GUILE")->fileExtension().c_str() + ")");
+ if(! fileName.isNull()) {
+ std::stringstream a, b;
+ std::string c;
+ manager->getInterpreter("GUILE")->loadFile(fileName.toStdString(), a, b, c);
+ }
});
listWidget = new QTreeWidget();
QTreeWidgetItem * external = new QTreeWidgetItem(listWidget, QStringList("External Functions"));
external->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
external->setBackground(0, QBrush(QColor(0xff, 0xdd, 0xdd)));
- mgr->connect_new_function_signal([&] (Function* fun) {addFunction(fun);});
- mgr->connect_new_dyn_symbol_signal([=] (const std::string& name) {
- auto item = new QTreeWidgetItem(external, QStringList(name.c_str()));
- item->setBackground(0, QBrush(QColor(0xff, 0xdd, 0xdd)));
- });
- mgr->connect_rename_function_signal([&](RenameFunctionEvent* event) {
- if (objects_list_by_address.find(event->address) == objects_list_by_address.end())
- return;
- auto item = objects_list_by_address[event->address];
- if (item) item->setText(0, event->new_name.c_str());
- });
+ connect(mgr, &InformationManager::newFunctionEvent,
+ [=] (NewFunctionEvent* event) {
+ std::string name = event->function->getName();
+ if (event->function->isDynamic()) {
+ auto item = new QTreeWidgetItem(external, QStringList(name.c_str()));
+ item->setBackground(0, QBrush(QColor(0xff, 0xdd, 0xdd)));
+ } else {
+ addFunction(event->function);
+ }
+ });
+ connect(mgr, &InformationManager::renameFunctionEvent,
+ [&](RenameFunctionEvent* event) {
+ if (objects_list_by_address.find(event->address) == objects_list_by_address.end())
+ return;
+ auto item = objects_list_by_address[event->address];
+ if (item) item->setText(0, event->new_name.c_str());
+ });
setGlobalHotkeys();
}
}
void Mainwindow::open() {
- QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
- tr("Binaries (*)"));
- manager->reset(fileName.toStdString());
+ QFileDialog dialog(this, tr("Open bianry"), "", tr("Binaries (*)"));
+
+ if (dialog.exec()) {
+ QStringList files = dialog.selectedFiles();
+ if(1 != files.size()) {
+ LOG4CXX_ERROR(logger, "Needs exactly one file name")
+ } else {
+ manager->reset(files[0].toStdString());
+ }
+ }
}
void Mainwindow::load() {
- QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
- tr("Frida Archives (*.frida)"));
- manager->load(fileName.toStdString());
+ QFileDialog dialog(this, tr("Open saved FrIDa file"), "", tr("Frida Archives (*.frida)"));
+
+ if (dialog.exec()) {
+ QStringList files = dialog.selectedFiles();
+ if(1 != files.size()) {
+ LOG4CXX_ERROR(logger, "Needs exactly one file name")
+ } else {
+ manager->load(files[0].toStdString());
+ }
+ }
}
void Mainwindow::save() {