summaryrefslogtreecommitdiff
path: root/ui/createstructdialog.h
blob: b27313a9e08c07b406dc7a31dd07fca0ef6ede85 (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
#pragma once

#include <QtCore/QThread>
#include <QtCore/QStringListModel>
#include <QtWidgets/QDialog>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QTableWidget>
#include <QtWidgets/QComboBox>
#include "binaryninjaapi.h"
#include "uicontext.h"
#include "expandablegroup.h"

/*!

    \defgroup createstructdialog CreateStructDialog
    \ingroup uiapi
*/

/*!

    \ingroup createstructdialog
*/
class BINARYNINJAUIAPI GetStructuresListThread : public QThread
{
	Q_OBJECT

	QStringList m_allTypes;
	std::function<void()> m_completeFunc;
	std::mutex m_mutex;
	bool m_done;
	BinaryNinja::TypeContainer m_container;

protected:
	virtual void run() override;

public:
	GetStructuresListThread(BinaryNinja::TypeContainer container, const std::function<void()>& completeFunc);
	void cancel();

	const QStringList& getTypes() const { return m_allTypes; }
};

/*!

    \ingroup createstructdialog
*/
class BINARYNINJAUIAPI BaseStructuresTableWidget : public QTableWidget
{
	Q_OBJECT

public:
	BaseStructuresTableWidget();

protected:
	virtual void contextMenuEvent(QContextMenuEvent* event) override;

Q_SIGNALS:
	void removeBaseStructure(int idx);

private Q_SLOTS:
	void remove();
};

/*!

    \ingroup createstructdialog
*/
class BINARYNINJAUIAPI CreateStructDialog : public QDialog
{
	Q_OBJECT

	QLineEdit* m_name;
	QLineEdit* m_size;
	BaseStructuresTableWidget* m_baseTable;
	QComboBox* m_combo;
	QLineEdit* m_baseOffset;
	QPushButton* m_addBase;
	QCheckBox* m_propagateDataVarRefs;
	QCheckBox* m_pointer;
	ExpandableGroup* m_baseStructGroup;

	std::optional<BinaryNinja::TypeContainer> m_typeContainer;
	BinaryNinja::QualifiedName m_resultName;
	uint64_t m_resultSize;
	bool m_resultDataVarRefs;
	bool m_resultPointer;
	bool m_askForPointer;
	QStringList m_historyEntries;
	int m_historySize;
	GetStructuresListThread* m_updateThread;
	QStringListModel* m_model;

	std::vector<BinaryNinja::BaseStructure> m_bases;

	void saveSettings();
	virtual void customEvent(QEvent* event) override;

public:
	CreateStructDialog(QWidget* parent, std::optional<BinaryNinja::TypeContainer> typeContainer, const std::string& name, bool askForPointer = false,
		  bool defaultToPointer = false);
	~CreateStructDialog();

	BinaryNinja::QualifiedName getName() const { return m_resultName; }
	uint64_t getSize() const { return m_resultSize; }
	bool getPropagateDataVarRefs() const { return m_resultDataVarRefs; }
	bool getCreatePointer() const { return m_resultPointer; }
	const std::vector<BinaryNinja::BaseStructure> getBaseStructures() const { return m_bases; }

private Q_SLOTS:
	void createStruct();
	void addBase();
	void removeBaseStructure(int idx);

protected:
	virtual void showEvent(QShowEvent* e) override;
	virtual void keyPressEvent(QKeyEvent* e) override;
};