]> git.siccegge.de Git - frida/frida.git/blob - src/gui/Mainwindow.cxx
790c1a306bbba59020383a311c8b59acae5dfe8d
[frida/frida.git] / src / gui / Mainwindow.cxx
1 #include "Mainwindow.hxx"
2
3 #include <iostream>
4 #include <sstream>
5
6 #include <QtGui>
7 #include <QAction>
8 #include <QMenuBar>
9 #include <QMenu>
10 #include <QDockWidget>
11 #include <QMessageBox>
12 #include <QFileDialog>
13 #include <QTableWidget>
14 #include <QHeaderView>
15 #include <QGraphicsScene>
16 #include <QGraphicsItem>
17 #include <QGraphicsView>
18
19 namespace {
20
21 }
22
23 Mainwindow::Mainwindow()
24 {
25 openAction = new QAction(tr("&Open"), this);
26 // saveAction = new QAction(tr("&Save"), this);
27 exitAction = new QAction(tr("E&xit"), this);
28
29 connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
30 // connect(saveAction, SIGNAL(triggered()), this, SLOT(save()));
31 connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
32
33 fileMenu = menuBar()->addMenu(tr("&File"));
34 fileMenu->addAction(openAction);
35 // fileMenu->addAction(saveAction);
36 fileMenu->addSeparator();
37 fileMenu->addAction(exitAction);
38
39 listWidget = new QListWidget();
40 stackedWidget = new QStackedWidget();
41 dockWidget = new QDockWidget(tr("Functions"), this);
42 dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea |
43 Qt::RightDockWidgetArea);
44 dockWidget->setWidget(listWidget);
45 addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
46 setCentralWidget(stackedWidget);
47
48 connect(listWidget, SIGNAL(currentRowChanged(int)),
49 stackedWidget, SLOT(setCurrentIndex(int)));
50
51 setWindowTitle(tr("Notepad"));
52 }
53
54 void Mainwindow::quit()
55 {
56 QMessageBox messageBox;
57 messageBox.setWindowTitle(tr("Notepad"));
58 messageBox.setText(tr("Do you really want to quit?"));
59 messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
60 messageBox.setDefaultButton(QMessageBox::No);
61 if (messageBox.exec() == QMessageBox::Yes)
62 qApp->quit();
63 }
64
65 void Mainwindow::open() {
66 QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
67 tr("Binaries (*)"));
68
69 if (fileName != "") {
70 curBin = new qtlldb::Binary(fileName.toStdString());
71
72 std::vector<std::string> symbols = curBin->getSymbols();
73 if (0 == symbols.size())
74 populateSymbolInformation(".text");
75 for (std::vector<std::string>::iterator it = symbols.begin();
76 it != symbols.end();
77 ++it) {
78 populateSymbolInformation(*it);
79 }
80 }
81 }
82
83 void Mainwindow::populateSymbolInformation(const std::string& sym) {
84 QTabWidget * w = new QTabWidget();
85
86 // Listing
87 QTableWidget * t = new QTableWidget();
88 t->setColumnCount(3);
89 t->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
90 curBin->for_each_instruction(sym, [&t](long add, std::string bytes, std::string mnemonic) {
91 int row = t->rowCount();
92 std::stringstream s;
93 t->setRowCount(t->rowCount() + 1);
94 s << std::hex << add;
95 t->setItem(row,0,new QTableWidgetItem(s.str().c_str()));
96 s.str("");
97 s << std::hex;
98 for_each(bytes.begin(), bytes.end(), [&s](char c){s << (unsigned int)((unsigned char)c) << ' ';});
99 t->setItem(row,1,new QTableWidgetItem(s.str().c_str()));
100 t->setItem(row,2,new QTableWidgetItem(mnemonic.c_str() + 1));
101 });
102 w->addTab(t, "Listing");
103
104 // CFG
105 QGraphicsScene * scene = new QGraphicsScene;
106 QGraphicsRectItem *rect = scene->addRect(QRectF(0, 0, 100, 100));
107 rect->setFlag(QGraphicsItem::ItemIsMovable);
108 QGraphicsView * view = new QGraphicsView(scene);
109 w->addTab(view, "CFG");
110
111 listWidget->addItem(sym.c_str());
112 stackedWidget->addWidget(w);
113 }