Skip to content

Commit ae1dbe7

Browse files
negasorafuzyll
authored andcommitted
Add project file dependencies
1 parent 21324fa commit ae1dbe7

File tree

5 files changed

+135
-7
lines changed

5 files changed

+135
-7
lines changed

binaryninjaapi.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3633,6 +3633,10 @@ namespace BinaryNinja {
36333633
bool SetFolder(Ref<ProjectFolder> folder);
36343634
bool Export(const std::string& destination) const;
36353635
int64_t GetCreationTimestamp() const;
3636+
bool AddDependency(Ref<ProjectFile> file);
3637+
bool RemoveDependency(Ref<ProjectFile> file);
3638+
std::vector<Ref<ProjectFile>> GetDependencies() const;
3639+
std::vector<Ref<ProjectFile>> GetRequiredBy() const;
36363640
};
36373641

36383642

binaryninjacore.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4215,6 +4215,10 @@ extern "C"
42154215
BINARYNINJACOREAPI BNProject* BNProjectFileGetProject(BNProjectFile* file);
42164216
BINARYNINJACOREAPI bool BNProjectFileExport(BNProjectFile* file, const char* destination);
42174217
BINARYNINJACOREAPI int64_t BNProjectFileGetCreationTimestamp(BNProjectFile* file);
4218+
BINARYNINJACOREAPI bool BNProjectFileAddDependency(BNProjectFile* file, BNProjectFile* dep);
4219+
BINARYNINJACOREAPI bool BNProjectFileRemoveDependency(BNProjectFile* file, BNProjectFile* dep);
4220+
BINARYNINJACOREAPI BNProjectFile** BNProjectFileGetDependencies(BNProjectFile* file, size_t* count);
4221+
BINARYNINJACOREAPI BNProjectFile** BNProjectFileGetRequiredBy(BNProjectFile* file, size_t* count);
42184222

42194223

42204224
// ProjectFolder object

project.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,48 @@ int64_t ProjectFile::GetCreationTimestamp() const
661661
}
662662

663663

664+
bool ProjectFile::AddDependency(Ref<ProjectFile> file)
665+
{
666+
return BNProjectFileAddDependency(m_object, file->m_object);
667+
}
668+
669+
670+
bool ProjectFile::RemoveDependency(Ref<ProjectFile> file)
671+
{
672+
return BNProjectFileRemoveDependency(m_object, file->m_object);
673+
}
674+
675+
676+
std::vector<Ref<ProjectFile>> ProjectFile::GetDependencies() const
677+
{
678+
size_t count = 0;
679+
BNProjectFile** deps = BNProjectFileGetDependencies(m_object, &count);
680+
std::vector<Ref<ProjectFile>> out;
681+
out.reserve(count);
682+
for (size_t i = 0; i < count; i++)
683+
{
684+
out.push_back(new ProjectFile(BNNewProjectFileReference(deps[i])));
685+
}
686+
BNFreeProjectFileList(deps, count);
687+
return out;
688+
}
689+
690+
691+
std::vector<Ref<ProjectFile>> ProjectFile::GetRequiredBy() const
692+
{
693+
size_t count = 0;
694+
BNProjectFile** reqBy = BNProjectFileGetRequiredBy(m_object, &count);
695+
std::vector<Ref<ProjectFile>> out;
696+
out.reserve(count);
697+
for (size_t i = 0; i < count; i++)
698+
{
699+
out.push_back(new ProjectFile(BNNewProjectFileReference(reqBy[i])));
700+
}
701+
BNFreeProjectFileList(reqBy, count);
702+
return out;
703+
}
704+
705+
664706
ProjectFolder::ProjectFolder(BNProjectFolder* folder)
665707
{
666708
m_object = folder;

python/project.py

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,68 @@ def get_path_in_project(self) -> Optional[str]:
202202
"""
203203
Get this file's path in its parent project
204204
205-
:return: The path on disk of the file or None
205+
:return: The path in the project or None
206206
"""
207207
return core.BNProjectFileGetPathInProject(self._handle)
208208

209+
def add_dependency(self, file: 'ProjectFile') -> bool:
210+
"""
211+
Add a ProjectFile as a dependency of this file
212+
213+
:return: True on success, False otherwise
214+
"""
215+
return core.BNProjectFileAddDependency(self._handle, file._handle)
216+
217+
def remove_dependency(self, file: 'ProjectFile') -> bool:
218+
"""
219+
Remove a ProjectFile as a dependency of this file
220+
221+
:return: True on success, False otherwise
222+
"""
223+
return core.BNProjectFileRemoveDependency(self._handle, file._handle)
224+
225+
def get_dependencies(self) -> List['ProjectFile']:
226+
"""
227+
Get the list of files that this file depends on
228+
229+
:return: List of ProjectFiles that this file depends on
230+
"""
231+
count = ctypes.c_size_t()
232+
value = core.BNProjectFileGetDependencies(self._handle, count)
233+
if value is None:
234+
raise ProjectException("Failed to get list of project file dependencies")
235+
result = []
236+
try:
237+
for i in range(count.value):
238+
file_handle = core.BNNewProjectFileReference(value[i])
239+
if file_handle is None:
240+
raise ProjectException("core.BNNewProjectFileReference returned None")
241+
result.append(ProjectFile(file_handle))
242+
return result
243+
finally:
244+
core.BNFreeProjectFileList(value, count.value)
245+
246+
def get_required_by(self) -> List['ProjectFile']:
247+
"""
248+
Get the list of files that depend on this file
249+
250+
:return: List of ProjectFiles that depend on this file
251+
"""
252+
count = ctypes.c_size_t()
253+
value = core.BNProjectFileGetRequiredBy(self._handle, count)
254+
if value is None:
255+
raise ProjectException("Failed to get list of project files that depend on file")
256+
result = []
257+
try:
258+
for i in range(count.value):
259+
file_handle = core.BNNewProjectFileReference(value[i])
260+
if file_handle is None:
261+
raise ProjectException("core.BNNewProjectFileReference returned None")
262+
result.append(ProjectFile(file_handle))
263+
return result
264+
finally:
265+
core.BNFreeProjectFileList(value, count.value)
266+
209267

210268
class ProjectFolder:
211269
"""

rust/src/project/file.rs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
use crate::project::{systime_from_bntime, Project, ProjectFolder};
2-
use crate::rc::{CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, RefCountable};
2+
use crate::rc::{Array, CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, RefCountable};
33
use crate::string::{BnString, IntoCStr};
44
use binaryninjacore_sys::{
5-
BNFreeProjectFile, BNFreeProjectFileList, BNNewProjectFileReference, BNProjectFile,
6-
BNProjectFileExistsOnDisk, BNProjectFileExport, BNProjectFileGetCreationTimestamp,
7-
BNProjectFileGetDescription, BNProjectFileGetFolder, BNProjectFileGetId, BNProjectFileGetName,
8-
BNProjectFileGetPathInProject, BNProjectFileGetPathOnDisk, BNProjectFileGetProject,
9-
BNProjectFileSetDescription, BNProjectFileSetFolder, BNProjectFileSetName,
5+
BNFreeProjectFile, BNFreeProjectFileList, BNNewProjectFileReference, BNProjectFile, BNProjectFileAddDependency, BNProjectFileExistsOnDisk, BNProjectFileExport, BNProjectFileGetCreationTimestamp, BNProjectFileGetDependencies, BNProjectFileGetDescription, BNProjectFileGetFolder, BNProjectFileGetId, BNProjectFileGetName, BNProjectFileGetPathInProject, BNProjectFileGetPathOnDisk, BNProjectFileGetProject, BNProjectFileGetRequiredBy, BNProjectFileRemoveDependency, BNProjectFileSetDescription, BNProjectFileSetFolder, BNProjectFileSetName
106
};
117
use std::fmt::Debug;
128
use std::path::{Path, PathBuf};
@@ -110,6 +106,30 @@ impl ProjectFile {
110106
let dest_raw = dest.to_cstr();
111107
unsafe { BNProjectFileExport(self.handle.as_ptr(), dest_raw.as_ptr()) }
112108
}
109+
110+
/// Add a ProjectFile as a dependency of this file
111+
pub fn add_dependency(&self, file: Ref<ProjectFile>) -> bool {
112+
unsafe { BNProjectFileAddDependency(self.handle.as_ptr(), file.handle.as_ptr()) }
113+
}
114+
115+
/// Remove a ProjectFile as a dependency of this file
116+
pub fn remove_dependency(&self, file: Ref<ProjectFile>) -> bool {
117+
unsafe { BNProjectFileRemoveDependency(self.handle.as_ptr(), file.handle.as_ptr()) }
118+
}
119+
120+
/// Get the ProjectFiles that this file depends on
121+
pub fn get_dependencies(&self) -> Array<ProjectFile> {
122+
let mut count = 0;
123+
let result = unsafe { BNProjectFileGetDependencies(self.handle.as_ptr(), &mut count) };
124+
unsafe { Array::new(result, count, ()) }
125+
}
126+
127+
/// Get the ProjectFiles that depend on this file
128+
pub fn get_required_by(&self) -> Array<ProjectFile> {
129+
let mut count = 0;
130+
let result = unsafe { BNProjectFileGetRequiredBy(self.handle.as_ptr(), &mut count) };
131+
unsafe { Array::new(result, count, ()) }
132+
}
113133
}
114134

115135
impl Debug for ProjectFile {

0 commit comments

Comments
 (0)