diff options
| author | Josh Ferrell <josh@vector35.com> | 2020-02-07 20:06:11 -0500 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2020-03-31 13:29:35 -0400 |
| commit | 95b145165e424d69554d03d4ebcf4cc13d43ec88 (patch) | |
| tree | 18e40ebfbb940986d8bbc990281f317fc88f0091 /filemetadata.cpp | |
| parent | fa1de9cc465473fb00f0f47f91aba0a1792a60ee (diff) | |
Undobuffer merging and mergetool
Diffstat (limited to 'filemetadata.cpp')
| -rw-r--r-- | filemetadata.cpp | 166 |
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() { |
