From bd79cde9742b0fa7b5f38f7b820180f57ba2f55e Mon Sep 17 00:00:00 2001 From: Josh F Date: Thu, 21 Jul 2022 16:30:49 -0400 Subject: Add FileMetadata::GetLast{Undo,Redo}Entry, add valid field to BNUndoEntry --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 3 +++ filemetadata.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 1c33f70b..692c6901 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1079,6 +1079,8 @@ namespace BinaryNinja { std::vector> GetUsers(); std::vector GetUndoEntries(); std::vector GetRedoEntries(); + std::optional GetLastUndoEntry(); + std::optional GetLastRedoEntry(); void ClearUndoEntries(); bool OpenProject(); diff --git a/binaryninjacore.h b/binaryninjacore.h index be051b50..6c830729 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -1940,6 +1940,7 @@ extern "C" struct BNUndoEntry { + bool valid; BNUser* user; char* hash; BNUndoAction* actions; @@ -3164,6 +3165,8 @@ extern "C" BINARYNINJACOREAPI BNUndoEntry* BNGetUndoEntries(BNFileMetadata* file, size_t* count); BINARYNINJACOREAPI BNUndoEntry* BNGetRedoEntries(BNFileMetadata* file, size_t* count); + BINARYNINJACOREAPI BNUndoEntry BNGetLastUndoEntry(BNFileMetadata* file); + BINARYNINJACOREAPI BNUndoEntry BNGetLastRedoEntry(BNFileMetadata* file); BINARYNINJACOREAPI void BNFreeUndoEntries(BNUndoEntry* entries, size_t count); BINARYNINJACOREAPI void BNClearUndoEntries(BNFileMetadata* file); diff --git a/filemetadata.cpp b/filemetadata.cpp index 9d9b2a3a..5d01c3b0 100644 --- a/filemetadata.cpp +++ b/filemetadata.cpp @@ -364,6 +364,8 @@ vector FileMetadata::GetUndoEntries() result.reserve(numEntries); for (size_t i = 0; i < numEntries; i++) { + if (!entries[i].valid) + continue; UndoEntry temp; temp.timestamp = entries[i].timestamp; temp.hash = entries[i].hash; @@ -390,6 +392,8 @@ vector FileMetadata::GetRedoEntries() result.reserve(numEntries); for (size_t i = 0; i < numEntries; i++) { + if (!entries[i].valid) + continue; UndoEntry temp; temp.timestamp = entries[i].timestamp; temp.hash = entries[i].hash; @@ -407,6 +411,48 @@ vector FileMetadata::GetRedoEntries() } +std::optional FileMetadata::GetLastUndoEntry() +{ + BNUndoEntry bnEntry = BNGetLastUndoEntry(m_object); + + if (!bnEntry.valid) + return {}; + + UndoEntry entry; + entry.timestamp = bnEntry.timestamp; + entry.hash = bnEntry.hash; + entry.user = new User(BNNewUserReference(bnEntry.user)); + size_t actionCount = bnEntry.actionCount; + for (size_t actionIndex = 0; actionIndex < actionCount; actionIndex++) + { + entry.actions.emplace_back(bnEntry.actions[actionIndex]); + } + + return entry; +} + + +std::optional FileMetadata::GetLastRedoEntry() +{ + BNUndoEntry bnEntry = BNGetLastRedoEntry(m_object); + + if (!bnEntry.valid) + return {}; + + UndoEntry entry; + entry.timestamp = bnEntry.timestamp; + entry.hash = bnEntry.hash; + entry.user = new User(BNNewUserReference(bnEntry.user)); + size_t actionCount = bnEntry.actionCount; + for (size_t actionIndex = 0; actionIndex < actionCount; actionIndex++) + { + entry.actions.emplace_back(bnEntry.actions[actionIndex]); + } + + return entry; +} + + void FileMetadata::ClearUndoEntries() { BNClearUndoEntries(m_object); -- cgit v1.3.1