diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-02-12 14:34:50 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-02-12 14:34:50 -0500 |
| commit | 83b01dd50407731d14938ac96894c3a4d9065295 (patch) | |
| tree | 2e3ded7103b51aef0d5cd22434e35f4461aeaeba /binaryviewtype.cpp | |
| parent | 6b431b32e32f00f9203ba2a4ca07cc962cdb22aa (diff) | |
Place API code with the associated class
Diffstat (limited to 'binaryviewtype.cpp')
| -rw-r--r-- | binaryviewtype.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/binaryviewtype.cpp b/binaryviewtype.cpp new file mode 100644 index 00000000..636a8856 --- /dev/null +++ b/binaryviewtype.cpp @@ -0,0 +1,112 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +BNBinaryView* BinaryViewType::CreateCallback(void* ctxt, BNBinaryView* data) +{ + BinaryViewType* type = (BinaryViewType*)ctxt; + Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data)); + Ref<BinaryView> result = type->Create(view); + return BNNewViewReference(result->GetViewObject()); +} + + +bool BinaryViewType::IsValidCallback(void* ctxt, BNBinaryView* data) +{ + BinaryViewType* type = (BinaryViewType*)ctxt; + Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data)); + return type->IsTypeValidForData(view); +} + + +BinaryViewType::BinaryViewType(BNBinaryViewType* type): m_type(type) +{ +} + + +BinaryViewType::BinaryViewType(const string& name, const string& longName): + m_type(nullptr), m_nameForRegister(name), m_longNameForRegister(longName) +{ +} + + +BinaryViewType::~BinaryViewType() +{ + BNFreeBinaryViewType(m_type); +} + + +void BinaryViewType::Register(BinaryViewType* type) +{ + BNCustomBinaryViewType callbacks; + callbacks.context = type; + callbacks.create = CreateCallback; + callbacks.isValidForData = IsValidCallback; + + type->m_type = BNRegisterBinaryViewType(type->m_nameForRegister.c_str(), + type->m_longNameForRegister.c_str(), &callbacks); +} + + +Ref<BinaryViewType> BinaryViewType::GetByName(const string& name) +{ + BNBinaryViewType* type = BNGetBinaryViewTypeByName(name.c_str()); + if (!type) + return nullptr; + return new CoreBinaryViewType(type); +} + + +vector<Ref<BinaryViewType>> BinaryViewType::GetViewTypesForData(BinaryView* data) +{ + BNBinaryViewType** types; + size_t count; + types = BNGetBinaryViewTypesForData(data->GetViewObject(), &count); + + vector<Ref<BinaryViewType>> result; + for (size_t i = 0; i < count; i++) + result.push_back(new CoreBinaryViewType(BNNewViewTypeReference(types[i]))); + + BNFreeBinaryViewTypeList(types, count); + return result; +} + + +string BinaryViewType::GetName() +{ + char* contents = BNGetBinaryViewTypeName(m_type); + string result = contents; + BNFreeString(contents); + return result; +} + + +string BinaryViewType::GetLongName() +{ + char* contents = BNGetBinaryViewTypeLongName(m_type); + string result = contents; + BNFreeString(contents); + return result; +} + + +CoreBinaryViewType::CoreBinaryViewType(BNBinaryViewType* type): BinaryViewType(type) +{ +} + + +BinaryView* CoreBinaryViewType::Create(BinaryView* data) +{ + BNBinaryView* view = BNCreateBinaryViewOfType(m_type, data->GetViewObject()); + if (!view) + return nullptr; + return new CoreBinaryView(view); +} + + +bool CoreBinaryViewType::IsTypeValidForData(BinaryView* data) +{ + return BNIsBinaryViewTypeValidForData(m_type, data->GetViewObject()); +} |
