summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2017-07-12 22:47:12 -0400
committerPeter LaFosse <peter@vector35.com>2017-07-12 22:47:12 -0400
commit0e6019edc8c5949de4989ef9577c07913946135b (patch)
treecb3a8dbcbd1f2473f32a6797bced0b4a4b59256f
parentc05fbe9e3cffc727536a6df6893116af1570327c (diff)
Adding remove_metadata API to BinaryView. Add remove APIs to Metadata
-rw-r--r--binaryninjaapi.h6
-rw-r--r--binaryninjacore.h6
-rw-r--r--binaryview.cpp5
-rw-r--r--metadata.cpp12
-rw-r--r--python/binaryview.py15
-rw-r--r--python/metadata.py12
6 files changed, 49 insertions, 7 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 83f6b582..01e5f986 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -1130,6 +1130,7 @@ namespace BinaryNinja
void StoreMetadata(const std::string& key, Ref<Metadata> value);
Ref<Metadata> QueryMetadata(const std::string& key);
+ void RemoveMetadata(const std::string& key);
std::string GetStringMetadata(const std::string& key);
std::vector<uint8_t> GetRawMetadata(const std::string& key);
uint64_t GetUIntMetadata(const std::string& key);
@@ -2956,11 +2957,12 @@ namespace BinaryNinja
//For key-value data only
Ref<Metadata> Get(const std::string& key);
bool SetValueForKey(const std::string& key, Ref<Metadata> data);
+ void RemoveKey(const std::string& key);
//For array data only
- Ref<Metadata> Get(size_t idx);
+ Ref<Metadata> Get(size_t index);
bool Append(Ref<Metadata> data);
-
+ void RemoveIndex(size_t index);
size_t Size() const;
bool IsBoolean() const;
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 54691360..3a8b63df 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -2939,8 +2939,10 @@ extern "C"
BINARYNINJACOREAPI bool BNMetadataSetValueForKey(BNMetadata* data, const char* key, BNMetadata* md);
BINARYNINJACOREAPI BNMetadata* BNMetadataGetForKey(BNMetadata* data, const char* key);
BINARYNINJACOREAPI bool BNMetadataArrayAppend(BNMetadata* data, BNMetadata* md);
+ BINARYNINJACOREAPI void BNMetadataRemoveKey(BNMetadata* data, const char* key);
BINARYNINJACOREAPI size_t BNMetadataSize(BNMetadata* data);
- BINARYNINJACOREAPI BNMetadata* BNMetadataGetForIdx(BNMetadata* data, size_t idx);
+ BINARYNINJACOREAPI BNMetadata* BNMetadataGetForIndex(BNMetadata* data, size_t index);
+ BINARYNINJACOREAPI void BNMetadataRemoveIndex(BNMetadata* data, size_t index);
BINARYNINJACOREAPI void BNFreeMetadataArray(BNMetadata** data);
BINARYNINJACOREAPI void BNFreeMetadataValueStore(BNMetadataValueStore* data);
@@ -2970,6 +2972,8 @@ extern "C"
// Store/Query structured data to/from a BinaryView
BINARYNINJACOREAPI void BNBinaryViewStoreMetadata(BNBinaryView* view, const char* key, BNMetadata* value);
BINARYNINJACOREAPI BNMetadata* BNBinaryViewQueryMetadata(BNBinaryView* view, const char* key);
+ BINARYNINJACOREAPI void BNBinaryViewRemoveMetadata(BNBinaryView* view, const char* key);
+
#ifdef __cplusplus
}
#endif
diff --git a/binaryview.cpp b/binaryview.cpp
index 3f1196d0..1f6820ff 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -1842,6 +1842,11 @@ Ref<Metadata> BinaryView::QueryMetadata(const std::string& key)
return new Metadata(value);
}
+void BinaryView::RemoveMetadata(const std::string& key)
+{
+ BNBinaryViewRemoveMetadata(m_object, key.c_str());
+}
+
string BinaryView::GetStringMetadata(const string& key)
{
auto data = QueryMetadata(key);
diff --git a/metadata.cpp b/metadata.cpp
index 18d3500b..f9c48b04 100644
--- a/metadata.cpp
+++ b/metadata.cpp
@@ -87,7 +87,7 @@ Ref<Metadata> Metadata::operator[](const std::string& key)
Ref<Metadata> Metadata::operator[](size_t idx)
{
- return new Metadata(BNMetadataGetForIdx(m_object, idx));
+ return new Metadata(BNMetadataGetForIndex(m_object, idx));
}
bool Metadata::SetValueForKey(const string& key, Ref<Metadata> data)
@@ -95,6 +95,11 @@ bool Metadata::SetValueForKey(const string& key, Ref<Metadata> data)
return BNMetadataSetValueForKey(m_object, key.c_str(), data->m_object);
}
+void Metadata::RemoveKey(const string& key)
+{
+ return BNMetadataRemoveKey(m_object, key.c_str());
+}
+
MetadataType Metadata::GetType() const
{
return BNMetadataGetType(m_object);
@@ -160,6 +165,11 @@ bool Metadata::Append(Ref<Metadata> data)
return BNMetadataArrayAppend(m_object, data->m_object);
}
+void Metadata::RemoveIndex(size_t index)
+{
+ BNMetadataRemoveIndex(m_object, index);
+}
+
size_t Metadata::Size() const
{
return BNMetadataSize(m_object);
diff --git a/python/binaryview.py b/python/binaryview.py
index d04dca86..ee019dcb 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -27,7 +27,7 @@ import threading
# Binary Ninja components
import _binaryninjacore as core
from enums import (AnalysisState, SymbolType, InstructionTextTokenType,
- Endianness, ModificationStatus, StringType, SegmentFlag, MetadataType)
+ Endianness, ModificationStatus, StringType, SegmentFlag)
import function
import startup
import architecture
@@ -3312,6 +3312,19 @@ class BinaryView(object):
raise ValueError("metadata argument must be of type Metadata")
core.BNBinaryViewStoreMetadata(self.handle, key, md.handle)
+ def remove_metadata(self, key):
+ """
+ `remove_metadata` removes the Metadata object associated with key from the current BinaryView
+
+ :param string key: key to remove from the BinaryView
+ :rtype: None
+ :Example:
+
+ >>> bv.store_metadata("integer", Metadata(1337))
+ >>> bv.remove_metadata("integer")
+ """
+ core.BNBinaryViewRemoveMetadata(self.handle, key)
+
def __setattr__(self, name, value):
try:
object.__setattr__(self, name, value)
diff --git a/python/metadata.py b/python/metadata.py
index f0e7764d..2817d777 100644
--- a/python/metadata.py
+++ b/python/metadata.py
@@ -114,6 +114,14 @@ class Metadata(object):
def is_dict(self):
return core.BNMetadataIsKeyValueStore(self.handle)
+ def remove(self, key_or_index):
+ if isinstance(key_or_index, str) and self.is_dict:
+ core.BNMetadataRemoveKey(self.handle, key_or_index)
+ elif isinstance(key_or_index, int) and self.is_array:
+ core.BNMetadataRemoveIndex(self.handle, key_or_index)
+ else:
+ raise TypeError("remove only valid for dict and array objects")
+
def __len__(self):
if self.is_array or self.is_dict or self.is_string or self.is_raw:
return core.BNMetadataSize(self.handle)
@@ -122,7 +130,7 @@ class Metadata(object):
def __iter__(self):
if self.is_array:
for i in xrange(core.BNMetadataSize(self.handle)):
- yield Metadata(handle=core.BNMetadataGetForIdx(self.handle, i))
+ yield Metadata(handle=core.BNMetadataGetForIndex(self.handle, i))
elif self.is_dict:
result = core.BNMetadataGetValueStore(self.handle)
try:
@@ -139,7 +147,7 @@ class Metadata(object):
raise ValueError("Metadata object only supports integers for indexing")
if value >= len(self):
raise IndexError("Index value out of range")
- return Metadata(handle=core.BNMetadataGetForIdx(self.handle, value))
+ return Metadata(handle=core.BNMetadataGetForIndex(self.handle, value))
if self.is_dict:
if not isinstance(value, str):
raise ValueError("Metadata object only supports strings for indexing")