summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h3
-rw-r--r--binaryninjacore.h2
-rw-r--r--project.cpp37
-rw-r--r--python/project.py46
-rw-r--r--rust/src/project.rs9
-rw-r--r--rust/src/project/folder.rs17
6 files changed, 110 insertions, 4 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 6f84250c..e29f4084 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -3608,6 +3608,7 @@ namespace BinaryNinja {
Ref<ProjectFolder> GetParent() const;
bool SetParent(Ref<ProjectFolder> parent);
bool Export(const std::string& destination, const ProgressFunction& progressCallback = {}) const;
+ std::vector<Ref<ProjectFile>> GetFiles() const;
};
/*!
@@ -3688,6 +3689,8 @@ namespace BinaryNinja {
Ref<ProjectFile> GetFileById(const std::string& id) const;
Ref<ProjectFile> GetFileByPathOnDisk(const std::string& path) const;
std::vector<Ref<ProjectFile>> GetFilesByPathInProject(const std::string& path) const;
+ std::vector<Ref<ProjectFile>> GetFilesInFolder(Ref<ProjectFolder> folder) const;
+
bool PushFile(Ref<ProjectFile> file);
bool DeleteFile_(Ref<ProjectFile> file);
diff --git a/binaryninjacore.h b/binaryninjacore.h
index a86fd5d3..2b057d1e 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -4179,6 +4179,7 @@ extern "C"
BINARYNINJACOREAPI BNProjectFile* BNProjectGetFileById(BNProject* project, const char* id);
BINARYNINJACOREAPI BNProjectFile* BNProjectGetFileByPathOnDisk(BNProject* project, const char* path);
BINARYNINJACOREAPI BNProjectFile** BNProjectGetFilesByPathInProject(BNProject* project, const char* path, size_t* count);
+ BINARYNINJACOREAPI BNProjectFile** BNProjectGetFilesInFolder(BNProject* project, BNProjectFolder* folder, size_t* count);
BINARYNINJACOREAPI bool BNProjectPushFile(BNProject* project, BNProjectFile* file);
BINARYNINJACOREAPI bool BNProjectDeleteFile(BNProject* project, BNProjectFile* file);
@@ -4235,6 +4236,7 @@ extern "C"
BINARYNINJACOREAPI BNProject* BNProjectFolderGetProject(BNProjectFolder* folder);
BINARYNINJACOREAPI bool BNProjectFolderExport(BNProjectFolder* folder, const char* destination, void* ctxt,
BNProgressFunction progress);
+ BINARYNINJACOREAPI BNProjectFile** BNProjectFolderGetFiles(BNProjectFolder* folder, size_t* count);
// ExternalLibrary object
BINARYNINJACOREAPI BNExternalLibrary* BNNewExternalLibraryReference(BNExternalLibrary* lib);
diff --git a/project.cpp b/project.cpp
index a11cbdf6..134e9ff5 100644
--- a/project.cpp
+++ b/project.cpp
@@ -514,6 +514,25 @@ std::vector<Ref<ProjectFile>> Project::GetFilesByPathInProject(
}
+std::vector<Ref<ProjectFile>> Project::GetFilesInFolder(Ref<ProjectFolder> folder) const
+{
+ size_t count;
+ BNProjectFile** files = BNProjectGetFilesInFolder(m_object, folder ? folder->m_object : nullptr, &count);
+ if (!files)
+ return {};
+
+ std::vector<Ref<ProjectFile>> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ result.emplace_back(new ProjectFile(BNNewProjectFileReference(files[i])));
+ }
+
+ BNFreeProjectFileList(files, count);
+ return result;
+}
+
+
bool Project::PushFile(Ref<ProjectFile> file)
{
return BNProjectPushFile(m_object, file->m_object);
@@ -775,3 +794,21 @@ bool ProjectFolder::Export(const std::string& destination, const ProgressFunctio
cb.callback = progressCallback;
return BNProjectFolderExport(m_object, destination.c_str(), &cb, ProgressCallback);
}
+
+
+std::vector<Ref<ProjectFile>> ProjectFolder::GetFiles() const
+{
+ size_t count = 0;
+ BNProjectFile** files = BNProjectFolderGetFiles(m_object, &count);
+ if (!files)
+ return {};
+
+ std::vector<Ref<ProjectFile>> out;
+ out.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ out.push_back(new ProjectFile(BNNewProjectFileReference(files[i])));
+ }
+ BNFreeProjectFileList(files, count);
+ return out;
+}
diff --git a/python/project.py b/python/project.py
index 7df3d2b5..a7985af1 100644
--- a/python/project.py
+++ b/python/project.py
@@ -383,6 +383,29 @@ class ProjectFolder:
"""
return core.BNProjectFolderExport(self._handle, str(dest), None, _wrap_progress(progress_func))
+ @property
+ def files(self) -> List['ProjectFile']:
+ """
+ Get the list of files in this folder
+
+ :return: List of files contained in the folder
+ """
+
+ count = ctypes.c_size_t()
+ value = core.BNProjectFolderGetFiles(self._handle, count)
+ if value is None:
+ raise ProjectException("Failed to get list of project files in folder")
+ 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 Project:
"""
@@ -788,3 +811,26 @@ class Project:
core.BNProjectBeginBulkOperation(self._handle)
yield
core.BNProjectEndBulkOperation(self._handle)
+
+ def get_files_in_folder(self, folder: Optional['ProjectFolder']) -> List['ProjectFile']:
+ """
+ Get the list of files in a folder
+
+ :return: List of files contained in the folder
+ """
+
+ count = ctypes.c_size_t()
+ folder_handle = None if folder is None else folder._handle
+ value = core.BNProjectGetFilesInFolder(self._handle, folder_handle, count)
+ if value is None:
+ raise ProjectException("Failed to get list of project files in folder")
+ 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)
diff --git a/rust/src/project.rs b/rust/src/project.rs
index 6c0366c0..f2743e80 100644
--- a/rust/src/project.rs
+++ b/rust/src/project.rs
@@ -587,6 +587,15 @@ impl Project {
unsafe { Array::new(result, count, ()) }
}
+ /// Retrieve a list of files in the project in a given folder.
+ pub fn files_in_folder(&self, folder: Option<&ProjectFolder>) -> Array<ProjectFile> {
+ let folder_ptr = folder.map(|f| f.handle.as_ptr()).unwrap_or(null_mut());
+ let mut count = 0;
+ let result =
+ unsafe { BNProjectGetFilesInFolder(self.handle.as_ptr(), folder_ptr, &mut count) };
+ unsafe { Array::new(result, count, ()) }
+ }
+
/// Delete a file from the project
pub fn delete_file(&self, file: &ProjectFile) -> bool {
unsafe { BNProjectDeleteFile(self.handle.as_ptr(), file.handle.as_ptr()) }
diff --git a/rust/src/project/folder.rs b/rust/src/project/folder.rs
index 1ab33bc8..e14b84a8 100644
--- a/rust/src/project/folder.rs
+++ b/rust/src/project/folder.rs
@@ -1,12 +1,14 @@
use crate::progress::{NoProgressCallback, ProgressCallback};
+use crate::project::file::ProjectFile;
use crate::project::Project;
-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::{
BNFreeProjectFolder, BNFreeProjectFolderList, BNNewProjectFolderReference, BNProjectFolder,
- BNProjectFolderExport, BNProjectFolderGetDescription, BNProjectFolderGetId,
- BNProjectFolderGetName, BNProjectFolderGetParent, BNProjectFolderGetProject,
- BNProjectFolderSetDescription, BNProjectFolderSetName, BNProjectFolderSetParent,
+ BNProjectFolderExport, BNProjectFolderGetDescription, BNProjectFolderGetFiles,
+ BNProjectFolderGetId, BNProjectFolderGetName, BNProjectFolderGetParent,
+ BNProjectFolderGetProject, BNProjectFolderSetDescription, BNProjectFolderSetName,
+ BNProjectFolderSetParent,
};
use std::ffi::c_void;
use std::fmt::Debug;
@@ -100,6 +102,13 @@ impl ProjectFolder {
)
}
}
+
+ /// Get the files contained in this folder
+ pub fn files(&self) -> Array<ProjectFile> {
+ let mut count = 0;
+ let result = unsafe { BNProjectFolderGetFiles(self.handle.as_ptr(), &mut count) };
+ unsafe { Array::new(result, count, ()) }
+ }
}
impl PartialEq for ProjectFolder {