summaryrefslogtreecommitdiff
path: root/filemetadata.cpp
diff options
context:
space:
mode:
authorJosh Ferrell <josh@vector35.com>2020-02-07 20:06:11 -0500
committerJosh Ferrell <josh@vector35.com>2020-03-31 13:29:35 -0400
commit95b145165e424d69554d03d4ebcf4cc13d43ec88 (patch)
tree18e40ebfbb940986d8bbc990281f317fc88f0091 /filemetadata.cpp
parentfa1de9cc465473fb00f0f47f91aba0a1792a60ee (diff)
Undobuffer merging and mergetool
Diffstat (limited to 'filemetadata.cpp')
-rw-r--r--filemetadata.cpp166
1 files changed, 59 insertions, 107 deletions
diff --git a/filemetadata.cpp b/filemetadata.cpp
index a8fb8889..e9433b15 100644
--- a/filemetadata.cpp
+++ b/filemetadata.cpp
@@ -69,113 +69,6 @@ NavigationHandler::NavigationHandler()
}
-void UndoAction::FreeCallback(void* ctxt)
-{
- UndoAction* action = (UndoAction*)ctxt;
- delete action;
-}
-
-
-void UndoAction::UndoCallback(void* ctxt, BNBinaryView* data)
-{
- UndoAction* action = (UndoAction*)ctxt;
- Ref<BinaryView> view = new BinaryView(BNNewViewReference(data));
- action->Undo(view);
-}
-
-
-void UndoAction::RedoCallback(void* ctxt, BNBinaryView* data)
-{
- UndoAction* action = (UndoAction*)ctxt;
- Ref<BinaryView> view = new BinaryView(BNNewViewReference(data));
- action->Redo(view);
-}
-
-
-char* UndoAction::SerializeCallback(void* ctxt)
-{
- try
- {
- UndoAction* action = (UndoAction*)ctxt;
- Value data = action->Serialize();
- Json::StreamWriterBuilder builder;
- builder["indentation"] = "";
- string json = Json::writeString(builder, data);
- return BNAllocString(json.c_str());
- }
- catch (exception& e)
- {
- LogError("Undo action failed to serialize: %s", e.what());
- return nullptr;
- }
-}
-
-
-UndoAction::UndoAction(const string& name, BNActionType action): m_typeName(name), m_actionType(action)
-{
-}
-
-
-BNUndoAction UndoAction::GetCallbacks()
-{
- BNUndoAction action;
- action.type = m_actionType;
- action.context = this;
- action.freeObject = FreeCallback;
- action.undo = UndoCallback;
- action.redo = RedoCallback;
- action.serialize = SerializeCallback;
- return action;
-}
-
-
-void UndoAction::Add(BNBinaryView* view)
-{
- BNUndoAction action = GetCallbacks();
- BNAddUndoAction(view, m_typeName.c_str(), &action);
-}
-
-
-bool UndoActionType::DeserializeCallback(void* ctxt, const char* data, BNUndoAction* result)
-{
- try
- {
- UndoActionType* type = (UndoActionType*)ctxt;
- unique_ptr<CharReader> reader(CharReaderBuilder().newCharReader());
- Value val;
- string errors;
- if (!reader->parse(data, data + strlen(data), &val, &errors))
- {
- LogError("Invalid JSON while deserializing undo action");
- return false;
- }
-
- UndoAction* action = type->Deserialize(val);
- if (!action)
- return false;
-
- *result = action->GetCallbacks();
- return true;
- }
- catch (exception& e)
- {
- LogError("Error while deserializing undo action: %s", e.what());
- return false;
- }
-}
-
-
-UndoActionType::UndoActionType(const string& name): m_nameForRegister(name)
-{
-}
-
-
-void UndoActionType::Register(UndoActionType* type)
-{
- BNRegisterUndoActionType(type->m_nameForRegister.c_str(), type, DeserializeCallback);
-}
-
-
FileMetadata::FileMetadata()
{
m_object = BNCreateFileMetadata();
@@ -344,6 +237,25 @@ bool FileMetadata::Rebase(BinaryView* data, uint64_t address, const function<voi
}
+MergeResult FileMetadata::MergeUserAnalysis(const std::string& name, const std::function<void(size_t, size_t)>& progress, std::vector<string> excludedHashes)
+{
+ size_t numHashes = excludedHashes.size();
+ char** tempList = new char*[numHashes];
+ for (size_t i = 0; i < numHashes; i++)
+ {
+ tempList[i] = BNAllocString(excludedHashes[i].c_str());
+ }
+
+ DatabaseProgressCallbackContext cb;
+ cb.func = progress;
+
+ BNMergeResult bnResult = BNMergeUserAnalysis(m_object, name.c_str(), &cb, DatabaseProgressCallback, tempList, numHashes);
+ //BNFreeStringList(hashList, numHashes);
+ MergeResult result(bnResult);
+ return result;
+}
+
+
void FileMetadata::BeginUndoActions()
{
BNBeginUndoActions(m_object);
@@ -367,6 +279,46 @@ bool FileMetadata::Redo()
return BNRedo(m_object);
}
+vector<Ref<User>> FileMetadata::GetUsers()
+{
+ size_t count;
+ BNUser** users = BNGetUsers(m_object, &count);
+
+ vector<Ref<User>> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new User(BNNewUserReference(users[i])));
+
+ BNFreeUserList(users, count);
+ return result;
+}
+
+
+vector<UndoEntry> FileMetadata::GetUndoEntries()
+{
+ size_t numEntries;
+ BNUndoEntry* entries = BNGetUndoEntries(m_object, &numEntries);
+
+ vector<UndoEntry> result;
+ result.reserve(numEntries);
+ for (size_t i = 0; i < numEntries; i++)
+ {
+ UndoEntry temp;
+ temp.timestamp = entries[i].timestamp;
+ temp.hash = entries[i].hash;
+ temp.user = new User(BNNewUserReference(entries[i].user));
+ size_t actionCount = entries[i].actionCount;
+ for (size_t actionIndex = 0; actionIndex < actionCount; actionIndex++)
+ {
+ temp.actions.emplace_back(entries[i].actions[actionIndex]);
+ }
+ result.push_back(temp);
+ }
+
+ //BNFreeUndoEntries(entries, count);
+ return result;
+}
+
string FileMetadata::GetCurrentView()
{