summaryrefslogtreecommitdiff
path: root/transformsession.cpp
blob: 2165039c9ac236731e2985c52fbe3a1bf1ae5833 (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
124
125
126
127
#include "binaryninjaapi.h"

using namespace BinaryNinja;
using namespace std;


TransformSession::TransformSession(const string& filename, const string& options)
{
	m_object = BNCreateTransformSession(filename.c_str(), options.c_str());
}


TransformSession::TransformSession(const string& filename, BNTransformSessionMode mode, const string& options)
{
	m_object = BNCreateTransformSessionWithMode(filename.c_str(), mode, options.c_str());
}


TransformSession::TransformSession(Ref<BinaryView> initialView, const string& options)
{
	m_object = BNCreateTransformSessionFromBinaryView(initialView->GetObject(), options.c_str());
}


TransformSession::TransformSession(Ref<BinaryView> initialView, BNTransformSessionMode mode, const string& options)
{
	m_object = BNCreateTransformSessionFromBinaryViewWithMode(initialView->GetObject(), mode, options.c_str());
}


TransformSession::TransformSession(Ref<TransformContext> context, BNTransformSessionMode mode, const string& options)
{
	m_object = BNCreateTransformSessionFromTransformContextWithMode(context->GetObject(), mode, options.c_str());
}


TransformSession::TransformSession(BNTransformSession* session)
{
	m_object = session;
}


TransformSession::~TransformSession()
{
}


void TransformSession::SetInteractive(bool interactive)
{
	BNTransformSessionSetInteractive(m_object, interactive);
}


Ref<BinaryView> TransformSession::GetCurrentView() const
{
	BNBinaryView* view = BNTransformSessionGetCurrentView(m_object);
	if (!view)
		return nullptr;
	return new BinaryView(view);
}


Ref<TransformContext> TransformSession::GetRootContext() const
{
	BNTransformContext* context = BNTransformSessionGetRootContext(m_object);
	if (!context)
		return nullptr;
	return new TransformContext(context);
}


Ref<TransformContext> TransformSession::GetCurrentContext() const
{
	BNTransformContext* context = BNTransformSessionGetCurrentContext(m_object);
	if (!context)
		return nullptr;
	return new TransformContext(context);
}


bool TransformSession::ProcessFrom(Ref<TransformContext> context)
{
	return BNTransformSessionProcessFrom(m_object, context->GetObject());
}


bool TransformSession::Process()
{
	return BNTransformSessionProcess(m_object);
}


bool TransformSession::HasAnyStages() const
{
	return BNTransformSessionHasAnyStages(m_object);
}


bool TransformSession::HasSinglePath() const
{
	return BNTransformSessionHasSinglePath(m_object);
}


vector<Ref<TransformContext>> TransformSession::GetSelectedContexts() const
{
	size_t count;
	BNTransformContext** contexts = BNTransformSessionGetSelectedContexts(m_object, &count);
	vector<Ref<TransformContext>> result;
	result.reserve(count);
	for (size_t i = 0; i < count; i++)
		result.push_back(new TransformContext(BNNewTransformContextReference(contexts[i])));

	BNFreeTransformContextList(contexts, count);
	return result;
}


void TransformSession::SetSelectedContexts(const vector<Ref<TransformContext>>& contexts)
{
	BNTransformContext** cContexts = new BNTransformContext*[contexts.size()];
	for (size_t i = 0; i < contexts.size(); i++)
		cContexts[i] = contexts[i]->GetObject();

	BNTransformSessionSetSelectedContexts(m_object, cContexts, contexts.size());
	delete[] cContexts;
}