diff options
| -rw-r--r-- | binaryninjaapi.h | 3 | ||||
| -rw-r--r-- | binaryninjacore.h | 2 | ||||
| -rw-r--r-- | project.cpp | 37 | ||||
| -rw-r--r-- | python/project.py | 46 | ||||
| -rw-r--r-- | rust/src/project.rs | 9 | ||||
| -rw-r--r-- | rust/src/project/folder.rs | 17 |
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 { |
