summaryrefslogtreecommitdiff
path: root/transform.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'transform.cpp')
-rw-r--r--transform.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/transform.cpp b/transform.cpp
index 468cc0f2..735fb1b9 100644
--- a/transform.cpp
+++ b/transform.cpp
@@ -107,6 +107,18 @@ bool Transform::EncodeCallback(
}
+bool Transform::DecodeWithContextCallback(void* ctxt, BNTransformContext* context, BNTransformParameter* params, size_t paramCount)
+{
+ map<string, DataBuffer> paramMap;
+ for (size_t i = 0; i < paramCount; i++)
+ paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value));
+
+ CallbackRef<Transform> xform(ctxt);
+ Ref<TransformContext> contextRef = new TransformContext(BNNewTransformContextReference(context));
+ return xform->DecodeWithContext(contextRef, paramMap);
+}
+
+
bool Transform::CanDecodeCallback(void* ctxt, BNBinaryView* input)
{
CallbackRef<Transform> xform(ctxt);
@@ -150,6 +162,7 @@ void Transform::Register(Transform* xform)
callbacks.freeParameters = FreeParametersCallback;
callbacks.decode = DecodeCallback;
callbacks.encode = EncodeCallback;
+ callbacks.decodeWithContext = DecodeWithContextCallback;
callbacks.canDecode = CanDecodeCallback;
xform->AddRefForRegistration();
xform->m_object = BNRegisterTransformTypeWithCapabilities(xform->m_typeForRegister, xform->m_capabilitiesForRegister,
@@ -199,6 +212,12 @@ bool Transform::SupportsDetection() const
}
+bool Transform::SupportsContext() const
+{
+ return BNTransformSupportsContext(m_object);
+}
+
+
string Transform::GetName() const
{
char* name = BNGetTransformName(m_object);
@@ -246,6 +265,12 @@ bool Transform::Encode(const DataBuffer&, DataBuffer&, const map<string, DataBuf
}
+bool Transform::DecodeWithContext(Ref<TransformContext>, const map<string, DataBuffer>&)
+{
+ return false;
+}
+
+
bool Transform::CanDecode(Ref<BinaryView> input) const
{
return false;
@@ -310,6 +335,23 @@ bool CoreTransform::Encode(const DataBuffer& input, DataBuffer& output, const ma
}
+bool CoreTransform::DecodeWithContext(Ref<TransformContext> context, const map<string, DataBuffer>& params)
+{
+ BNTransformParameter* list = new BNTransformParameter[params.size()];
+ size_t idx = 0;
+ for (auto& i : params)
+ {
+ list[idx].name = i.first.c_str();
+ list[idx++].value = i.second.GetBufferObject();
+ }
+
+ bool result = BNDecodeWithContext(m_object, context->GetObject(), list, idx);
+
+ delete[] list;
+ return result;
+}
+
+
bool CoreTransform::CanDecode(Ref<BinaryView> input) const
{
return BNCanDecode(m_object, input->GetObject());