summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h4
-rw-r--r--binaryninjacore.h4
-rw-r--r--project.cpp42
-rw-r--r--python/project.py60
-rw-r--r--rust/src/project/file.rs32
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 {