diff options
| -rw-r--r-- | binaryninjaapi.h | 4 | ||||
| -rw-r--r-- | binaryninjacore.h | 4 | ||||
| -rw-r--r-- | project.cpp | 42 | ||||
| -rw-r--r-- | python/project.py | 60 | ||||
| -rw-r--r-- | rust/src/project/file.rs | 32 |
5 files changed, 135 insertions, 7 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index d3de5874..5460046b 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -3633,6 +3633,10 @@ namespace BinaryNinja { bool SetFolder(Ref<ProjectFolder> folder); bool Export(const std::string& destination) const; int64_t GetCreationTimestamp() const; + bool AddDependency(Ref<ProjectFile> file); + bool RemoveDependency(Ref<ProjectFile> file); + std::vector<Ref<ProjectFile>> GetDependencies() const; + std::vector<Ref<ProjectFile>> GetRequiredBy() const; }; diff --git a/binaryninjacore.h b/binaryninjacore.h index 305fc713..9dd9c80e 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -4215,6 +4215,10 @@ extern "C" BINARYNINJACOREAPI BNProject* BNProjectFileGetProject(BNProjectFile* file); BINARYNINJACOREAPI bool BNProjectFileExport(BNProjectFile* file, const char* destination); BINARYNINJACOREAPI int64_t BNProjectFileGetCreationTimestamp(BNProjectFile* file); + BINARYNINJACOREAPI bool BNProjectFileAddDependency(BNProjectFile* file, BNProjectFile* dep); + BINARYNINJACOREAPI bool BNProjectFileRemoveDependency(BNProjectFile* file, BNProjectFile* dep); + BINARYNINJACOREAPI BNProjectFile** BNProjectFileGetDependencies(BNProjectFile* file, size_t* count); + BINARYNINJACOREAPI BNProjectFile** BNProjectFileGetRequiredBy(BNProjectFile* file, size_t* count); // ProjectFolder object diff --git a/project.cpp b/project.cpp index 673927e5..a11cbdf6 100644 --- a/project.cpp +++ b/project.cpp @@ -661,6 +661,48 @@ int64_t ProjectFile::GetCreationTimestamp() const } +bool ProjectFile::AddDependency(Ref<ProjectFile> file) +{ + return BNProjectFileAddDependency(m_object, file->m_object); +} + + +bool ProjectFile::RemoveDependency(Ref<ProjectFile> file) +{ + return BNProjectFileRemoveDependency(m_object, file->m_object); +} + + +std::vector<Ref<ProjectFile>> ProjectFile::GetDependencies() const +{ + size_t count = 0; + BNProjectFile** deps = BNProjectFileGetDependencies(m_object, &count); + std::vector<Ref<ProjectFile>> out; + out.reserve(count); + for (size_t i = 0; i < count; i++) + { + out.push_back(new ProjectFile(BNNewProjectFileReference(deps[i]))); + } + BNFreeProjectFileList(deps, count); + return out; +} + + +std::vector<Ref<ProjectFile>> ProjectFile::GetRequiredBy() const +{ + size_t count = 0; + BNProjectFile** reqBy = BNProjectFileGetRequiredBy(m_object, &count); + std::vector<Ref<ProjectFile>> out; + out.reserve(count); + for (size_t i = 0; i < count; i++) + { + out.push_back(new ProjectFile(BNNewProjectFileReference(reqBy[i]))); + } + BNFreeProjectFileList(reqBy, count); + return out; +} + + ProjectFolder::ProjectFolder(BNProjectFolder* folder) { m_object = folder; diff --git a/python/project.py b/python/project.py index e8ab5198..7df3d2b5 100644 --- a/python/project.py +++ b/python/project.py @@ -202,10 +202,68 @@ class ProjectFile: """ Get this file's path in its parent project - :return: The path on disk of the file or None + :return: The path in the project or None """ return core.BNProjectFileGetPathInProject(self._handle) + def add_dependency(self, file: 'ProjectFile') -> bool: + """ + Add a ProjectFile as a dependency of this file + + :return: True on success, False otherwise + """ + return core.BNProjectFileAddDependency(self._handle, file._handle) + + def remove_dependency(self, file: 'ProjectFile') -> bool: + """ + Remove a ProjectFile as a dependency of this file + + :return: True on success, False otherwise + """ + return core.BNProjectFileRemoveDependency(self._handle, file._handle) + + def get_dependencies(self) -> List['ProjectFile']: + """ + Get the list of files that this file depends on + + :return: List of ProjectFiles that this file depends on + """ + count = ctypes.c_size_t() + value = core.BNProjectFileGetDependencies(self._handle, count) + if value is None: + raise ProjectException("Failed to get list of project file dependencies") + result = [] + try: + for i in range(count.value): + file_handle = core.BNNewProjectFileReference(value[i]) + if file_handle is None: + raise ProjectException("core.BNNewProjectFileReference returned None") + result.append(ProjectFile(file_handle)) + return result + finally: + core.BNFreeProjectFileList(value, count.value) + + def get_required_by(self) -> List['ProjectFile']: + """ + Get the list of files that depend on this file + + :return: List of ProjectFiles that depend on this file + """ + count = ctypes.c_size_t() + value = core.BNProjectFileGetRequiredBy(self._handle, count) + if value is None: + raise ProjectException("Failed to get list of project files that depend on file") + result = [] + try: + for i in range(count.value): + file_handle = core.BNNewProjectFileReference(value[i]) + if file_handle is None: + raise ProjectException("core.BNNewProjectFileReference returned None") + result.append(ProjectFile(file_handle)) + return result + finally: + core.BNFreeProjectFileList(value, count.value) + class ProjectFolder: """ diff --git a/rust/src/project/file.rs b/rust/src/project/file.rs index 178a9a65..6950766c 100644 --- a/rust/src/project/file.rs +++ b/rust/src/project/file.rs @@ -1,12 +1,8 @@ use crate::project::{systime_from_bntime, Project, ProjectFolder}; -use crate::rc::{CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, RefCountable}; +use crate::rc::{Array, CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, RefCountable}; use crate::string::{BnString, IntoCStr}; use binaryninjacore_sys::{ - BNFreeProjectFile, BNFreeProjectFileList, BNNewProjectFileReference, BNProjectFile, - BNProjectFileExistsOnDisk, BNProjectFileExport, BNProjectFileGetCreationTimestamp, - BNProjectFileGetDescription, BNProjectFileGetFolder, BNProjectFileGetId, BNProjectFileGetName, - BNProjectFileGetPathInProject, BNProjectFileGetPathOnDisk, BNProjectFileGetProject, - BNProjectFileSetDescription, BNProjectFileSetFolder, BNProjectFileSetName, + BNFreeProjectFile, BNFreeProjectFileList, BNNewProjectFileReference, BNProjectFile, BNProjectFileAddDependency, BNProjectFileExistsOnDisk, BNProjectFileExport, BNProjectFileGetCreationTimestamp, BNProjectFileGetDependencies, BNProjectFileGetDescription, BNProjectFileGetFolder, BNProjectFileGetId, BNProjectFileGetName, BNProjectFileGetPathInProject, BNProjectFileGetPathOnDisk, BNProjectFileGetProject, BNProjectFileGetRequiredBy, BNProjectFileRemoveDependency, BNProjectFileSetDescription, BNProjectFileSetFolder, BNProjectFileSetName }; use std::fmt::Debug; use std::path::{Path, PathBuf}; @@ -110,6 +106,30 @@ impl ProjectFile { let dest_raw = dest.to_cstr(); unsafe { BNProjectFileExport(self.handle.as_ptr(), dest_raw.as_ptr()) } } + + /// Add a ProjectFile as a dependency of this file + pub fn add_dependency(&self, file: Ref<ProjectFile>) -> bool { + unsafe { BNProjectFileAddDependency(self.handle.as_ptr(), file.handle.as_ptr()) } + } + + /// Remove a ProjectFile as a dependency of this file + pub fn remove_dependency(&self, file: Ref<ProjectFile>) -> bool { + unsafe { BNProjectFileRemoveDependency(self.handle.as_ptr(), file.handle.as_ptr()) } + } + + /// Get the ProjectFiles that this file depends on + pub fn get_dependencies(&self) -> Array<ProjectFile> { + let mut count = 0; + let result = unsafe { BNProjectFileGetDependencies(self.handle.as_ptr(), &mut count) }; + unsafe { Array::new(result, count, ()) } + } + + /// Get the ProjectFiles that depend on this file + pub fn get_required_by(&self) -> Array<ProjectFile> { + let mut count = 0; + let result = unsafe { BNProjectFileGetRequiredBy(self.handle.as_ptr(), &mut count) }; + unsafe { Array::new(result, count, ()) } + } } impl Debug for ProjectFile { |
