summaryrefslogtreecommitdiff
path: root/binaryview.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-02-12 14:34:50 -0500
committerRusty Wagner <rusty@vector35.com>2015-02-12 14:34:50 -0500
commit83b01dd50407731d14938ac96894c3a4d9065295 (patch)
tree2e3ded7103b51aef0d5cd22434e35f4461aeaeba /binaryview.cpp
parent6b431b32e32f00f9203ba2a4ca07cc962cdb22aa (diff)
Place API code with the associated class
Diffstat (limited to 'binaryview.cpp')
-rw-r--r--binaryview.cpp332
1 files changed, 332 insertions, 0 deletions
diff --git a/binaryview.cpp b/binaryview.cpp
new file mode 100644
index 00000000..23ff8c56
--- /dev/null
+++ b/binaryview.cpp
@@ -0,0 +1,332 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+void BinaryDataNotification::DataWrittenCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object));
+ notify->OnBinaryDataWritten(view, offset, len);
+}
+
+
+void BinaryDataNotification::DataInsertedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object));
+ notify->OnBinaryDataInserted(view, offset, len);
+}
+
+
+void BinaryDataNotification::DataRemovedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, uint64_t len)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object));
+ notify->OnBinaryDataRemoved(view, offset, len);
+}
+
+
+BinaryDataNotification::BinaryDataNotification()
+{
+ m_callbacks.context = this;
+ m_callbacks.dataWritten = DataWrittenCallback;
+ m_callbacks.dataInserted = DataInsertedCallback;
+ m_callbacks.dataRemoved = DataRemovedCallback;
+}
+
+
+BinaryView::BinaryView(FileMetadata* file)
+{
+ BNCustomBinaryView view;
+ view.context = this;
+ view.read = ReadCallback;
+ view.write = WriteCallback;
+ view.insert = InsertCallback;
+ view.remove = RemoveCallback;
+ view.getModification = GetModificationCallback;
+ view.getStart = GetStartCallback;
+ view.getLength = GetLengthCallback;
+ view.isExecutable = IsExecutableCallback;
+ view.save = SaveCallback;
+
+ m_file = file;
+ m_view = BNCreateCustomBinaryView(m_file->GetFileObject(), &view);
+}
+
+
+BinaryView::BinaryView(BNBinaryView* view)
+{
+ m_view = view;
+ m_file = new FileMetadata(BNNewFileReference(BNGetFileForView(m_view)));
+}
+
+
+BinaryView::~BinaryView()
+{
+ BNFreeBinaryView(m_view);
+}
+
+
+size_t BinaryView::ReadCallback(void* ctxt, void* dest, uint64_t offset, size_t len)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->Read(dest, offset, len);
+}
+
+
+size_t BinaryView::WriteCallback(void* ctxt, uint64_t offset, const void* src, size_t len)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->Write(offset, src, len);
+}
+
+
+size_t BinaryView::InsertCallback(void* ctxt, uint64_t offset, const void* src, size_t len)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->Insert(offset, src, len);
+}
+
+
+size_t BinaryView::RemoveCallback(void* ctxt, uint64_t offset, uint64_t len)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->Remove(offset, len);
+}
+
+
+BNModificationStatus BinaryView::GetModificationCallback(void* ctxt, uint64_t offset)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->GetModification(offset);
+}
+
+
+uint64_t BinaryView::GetStartCallback(void* ctxt)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->GetStart();
+}
+
+
+uint64_t BinaryView::GetLengthCallback(void* ctxt)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->GetLength();
+}
+
+
+bool BinaryView::IsExecutableCallback(void* ctxt)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->IsExecutable();
+}
+
+
+bool BinaryView::SaveCallback(void* ctxt, BNFileAccessor* file)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ CoreFileAccessor accessor(file);
+ return view->Save(&accessor);
+}
+
+
+bool BinaryView::IsModified() const
+{
+ return m_file->IsModified();
+}
+
+
+void BinaryView::BeginUndoActions()
+{
+ m_file->BeginUndoActions();
+}
+
+
+void BinaryView::AddUndoAction(UndoAction* action)
+{
+ m_file->AddUndoAction(action);
+}
+
+
+void BinaryView::CommitUndoActions()
+{
+ m_file->CommitUndoActions();
+}
+
+
+bool BinaryView::Undo()
+{
+ return m_file->Undo();
+}
+
+
+bool BinaryView::Redo()
+{
+ return m_file->Redo();
+}
+
+
+string BinaryView::GetCurrentView()
+{
+ return m_file->GetCurrentView();
+}
+
+
+uint64_t BinaryView::GetCurrentOffset()
+{
+ return m_file->GetCurrentOffset();
+}
+
+
+bool BinaryView::Navigate(const string& view, uint64_t offset)
+{
+ return m_file->Navigate(view, offset);
+}
+
+
+DataBuffer BinaryView::ReadBuffer(uint64_t offset, size_t len)
+{
+ BNDataBuffer* result = BNReadViewBuffer(m_view, offset, len);
+ return DataBuffer(result);
+}
+
+
+size_t BinaryView::WriteBuffer(uint64_t offset, const DataBuffer& data)
+{
+ return BNWriteViewBuffer(m_view, offset, data.GetBufferObject());
+}
+
+
+size_t BinaryView::InsertBuffer(uint64_t offset, const DataBuffer& data)
+{
+ return BNInsertViewBuffer(m_view, offset, data.GetBufferObject());
+}
+
+
+vector<BNModificationStatus> BinaryView::GetModification(uint64_t offset, size_t len)
+{
+ BNModificationStatus* mod = new BNModificationStatus[len];
+ len = BNGetModificationArray(m_view, offset, mod, len);
+
+ vector<BNModificationStatus> result;
+ for (size_t i = 0; i < len; i++)
+ result.push_back(mod[i]);
+
+ delete[] mod;
+ return result;
+}
+
+
+uint64_t BinaryView::GetEnd() const
+{
+ return BNGetEndOffset(m_view);
+}
+
+
+bool BinaryView::Save(const string& path)
+{
+ return BNSaveToFilename(m_view, path.c_str());
+}
+
+
+void BinaryView::RegisterNotification(BinaryDataNotification* notify)
+{
+ BNRegisterDataNotification(m_view, notify->GetCallbacks());
+}
+
+
+void BinaryView::UnregisterNotification(BinaryDataNotification* notify)
+{
+ BNUnregisterDataNotification(m_view, notify->GetCallbacks());
+}
+
+
+CoreBinaryView::CoreBinaryView(BNBinaryView* view): BinaryView(view)
+{
+}
+
+
+size_t CoreBinaryView::Read(void* dest, uint64_t offset, size_t len)
+{
+ return BNReadViewData(m_view, dest, offset, len);
+}
+
+
+size_t CoreBinaryView::Write(uint64_t offset, const void* data, size_t len)
+{
+ return BNWriteViewData(m_view, offset, data, len);
+}
+
+
+size_t CoreBinaryView::Insert(uint64_t offset, const void* data, size_t len)
+{
+ return BNInsertViewData(m_view, offset, data, len);
+}
+
+
+size_t CoreBinaryView::Remove(uint64_t offset, uint64_t len)
+{
+ return BNRemoveViewData(m_view, offset, len);
+}
+
+
+BNModificationStatus CoreBinaryView::GetModification(uint64_t offset)
+{
+ return BNGetModification(m_view, offset);
+}
+
+
+uint64_t CoreBinaryView::GetStart() const
+{
+ return BNGetStartOffset(m_view);
+}
+
+
+uint64_t CoreBinaryView::GetLength() const
+{
+ return BNGetViewLength(m_view);
+}
+
+
+bool CoreBinaryView::IsExecutable() const
+{
+ return BNIsExecutableView(m_view);
+}
+
+
+bool CoreBinaryView::Save(FileAccessor* file)
+{
+ return BNSaveToFile(m_view, file->GetCallbacks());
+}
+
+
+BinaryData::BinaryData(FileMetadata* file): CoreBinaryView(BNCreateBinaryDataView(file->GetFileObject()))
+{
+}
+
+
+BinaryData::BinaryData(FileMetadata* file, const DataBuffer& data):
+ CoreBinaryView(BNCreateBinaryDataViewFromBuffer(file->GetFileObject(), data.GetBufferObject()))
+{
+}
+
+
+BinaryData::BinaryData(FileMetadata* file, const void* data, size_t len):
+ CoreBinaryView(BNCreateBinaryDataViewFromData(file->GetFileObject(), data, len))
+{
+}
+
+
+BinaryData::BinaryData(FileMetadata* file, const string& path):
+ CoreBinaryView(BNCreateBinaryDataViewFromFilename(file->GetFileObject(), path.c_str()))
+{
+}
+
+
+BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor):
+ CoreBinaryView(BNCreateBinaryDataViewFromFile(file->GetFileObject(), accessor->GetCallbacks()))
+{
+}