summaryrefslogtreecommitdiff
path: root/examples/triage/files.cpp
blob: e2f86e0f286f5f498458b73cbb4bc8b44490b2f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QMessageBox>
#include <QtCore/QSettings>
#include "files.h"


TriageFilePicker::TriageFilePicker(UIContext* context): m_contextMenuManager(this)
{
	m_context = context;
	m_actionHandler.setupActionHandler(this);

	QVBoxLayout* layout = new QVBoxLayout();
	layout->setContentsMargins(0, 0, 0, 0);

	m_model = new QFileSystemModel();
	m_model->setRootPath("");
	m_tree = new QTreeView(this);
	m_tree->setModel(m_model);
	m_tree->setSelectionMode(QAbstractItemView::ExtendedSelection);
	m_tree->setColumnWidth(0, 500);
	layout->addWidget(m_tree, 1);

	setLayout(layout);

	connect(m_tree, &QTreeView::doubleClicked, this, &TriageFilePicker::onDoubleClick);

	QString recentFile = QSettings().value("triage/recentFile", QDir::homePath()).toString();
	while (recentFile.size() > 0)
	{
		QModelIndex f = m_model->index(recentFile);
		if (f.isValid())
		{
			m_tree->scrollTo(f);
			m_tree->setExpanded(f, true);
			break;
		}
		QString parentDir = QFileInfo(recentFile).path();
		if (parentDir == recentFile)
			break;
		recentFile = parentDir;
	}

	m_actionHandler.bindAction("Open Selected Files", UIAction(
		[=]() { openSelectedFiles(); },
		[=]() { return areFilesSelected(); }));
	m_contextMenu.addAction("Open Selected Files", "Open");
}


void TriageFilePicker::contextMenuEvent(QContextMenuEvent*)
{
	m_contextMenuManager.show(&m_contextMenu, &m_actionHandler);
}


void TriageFilePicker::onDoubleClick(const QModelIndex&)
{
	openSelectedFiles();
}


void TriageFilePicker::openSelectedFiles()
{
	std::vector<QString> failedToOpen;
	std::set<QString> files;
	SettingsRef settings = BinaryNinja::Settings::Instance();

	for (auto& index: m_tree->selectionModel()->selectedIndexes())
		if (m_model->fileInfo(index).isFile())
			files.insert(m_model->fileInfo(index).absoluteFilePath());

	for (auto& filename: files)
	{
		QSettings().setValue("triage/recentFile", filename);

		FileContext* f = FileContext::openFilename(filename);
		if (!f)
		{
			failedToOpen.push_back(filename);
			continue;
		}

		for (auto data: f->getAllDataViews())
		{
			settings->Set("analysis.mode", settings->Get<std::string>("triage.analysisMode"), data);
			settings->Set("triage.preferSummaryView", true, data);
			if (data->GetTypeName() != "Raw")
			{
				std::string linearSweepMode = settings->Get<std::string>("triage.linearSweep");
				if (linearSweepMode == "none")
				{
					settings->Set("analysis.linearSweep.autorun", false, data);
				}
				else if (linearSweepMode == "partial")
				{
					settings->Set("analysis.linearSweep.autorun", true, data);
					settings->Set("analysis.linearSweep.controlFlowGraph", false, data);
				}
				else if (linearSweepMode == "full")
				{
					settings->Set("analysis.linearSweep.autorun", true, data);
					settings->Set("analysis.linearSweep.controlFlowGraph", true, data);
				}
			}
		}

		m_context->openFileContext(f);
	}

	if (failedToOpen.size() > 0)
	{
		QString message = "Unable to open:\n";
		for (auto& name: failedToOpen)
			message += name + "\n";
		QMessageBox::critical(this, "Error", message);
	}
}


bool TriageFilePicker::areFilesSelected()
{
	return m_tree->selectionModel()->hasSelection();
}