diff --git a/headers/os/package/solver/Solver.h b/headers/os/package/solver/Solver.h index 2f1160b871..5403baa88e 100644 --- a/headers/os/package/solver/Solver.h +++ b/headers/os/package/solver/Solver.h @@ -6,12 +6,14 @@ #define _PACKAGE__SOLVER_H_ +#include #include namespace BPackageKit { +class BSolverPackage; class BSolverPackageSpecifierList; class BSolverProblem; class BSolverRepository; @@ -19,6 +21,14 @@ class BSolverResult; class BSolver { +public: + // FindPackages() flags + enum { + B_FIND_CASE_INSENSITIVE = 0x01, + B_FIND_IN_SUMMARY = 0x02, + B_FIND_IN_DESCRIPTION = 0x04 + }; + public: virtual ~BSolver(); @@ -29,6 +39,10 @@ public: virtual status_t AddRepository( BSolverRepository* repository) = 0; + virtual status_t FindPackages(const char* searchString, + uint32 flags, + BObjectList& _packages) = 0; + virtual status_t Install( const BSolverPackageSpecifierList& packages) = 0; diff --git a/src/kits/package/solver/LibsolvSolver.cpp b/src/kits/package/solver/LibsolvSolver.cpp index 2a2926f859..a1ab43ca0b 100644 --- a/src/kits/package/solver/LibsolvSolver.cpp +++ b/src/kits/package/solver/LibsolvSolver.cpp @@ -57,6 +57,20 @@ struct LibsolvSolver::SolvQueue : Queue { }; +struct LibsolvSolver::SolvDataIterator : Dataiterator { + SolvDataIterator(Pool* pool, Repo* repo, Id solvableId, Id keyname, + const char* match, int flags) + { + dataiterator_init(this, pool, repo, solvableId, keyname, match, flags); + } + + ~SolvDataIterator() + { + dataiterator_free(this); + } +}; + + struct LibsolvSolver::RepositoryInfo { RepositoryInfo(BSolverRepository* repository) : @@ -197,6 +211,66 @@ LibsolvSolver::AddRepository(BSolverRepository* repository) } +status_t +LibsolvSolver::FindPackages(const char* searchString, uint32 flags, + BObjectList& _packages) +{ + // add repositories to pool + status_t error = _AddRepositories(); + if (error != B_OK) + return error; + + // create data iterator + int iteratorFlags = SEARCH_SUBSTRING; + if ((flags & B_FIND_CASE_INSENSITIVE) != 0) + iteratorFlags |= SEARCH_NOCASE; + + SolvDataIterator iterator(fPool, 0, 0, 0, searchString, iteratorFlags); + + // search package names + dataiterator_set_keyname(&iterator, SOLVABLE_NAME); + dataiterator_set_search(&iterator, 0, 0); + + SolvQueue selection; + while (dataiterator_step(&iterator)) + queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid); + + // search package summaries + if ((flags & B_FIND_IN_SUMMARY) != 0) { + dataiterator_set_keyname(&iterator, SOLVABLE_SUMMARY); + dataiterator_set_search(&iterator, 0, 0); + + while (dataiterator_step(&iterator)) + queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid); + } + + // search package description + if ((flags & B_FIND_IN_DESCRIPTION) != 0) { + dataiterator_set_keyname(&iterator, SOLVABLE_DESCRIPTION); + dataiterator_set_search(&iterator, 0, 0); + + while (dataiterator_step(&iterator)) + queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid); + } + + // get solvables + SolvQueue solvables; + selection_solvables(fPool, &selection, &solvables); + + // get packages + for (int i = 0; i < solvables.count; i++) { + BSolverPackage* package = _GetPackage(solvables.elements[i]); + if (package == NULL) + return B_ERROR; + + if (!_packages.AddItem(package)) + return B_NO_MEMORY; + } + + return B_OK; +} + + status_t LibsolvSolver::Install(const BSolverPackageSpecifierList& packages) { diff --git a/src/kits/package/solver/LibsolvSolver.h b/src/kits/package/solver/LibsolvSolver.h index 5ae160264c..eaecd8fdc5 100644 --- a/src/kits/package/solver/LibsolvSolver.h +++ b/src/kits/package/solver/LibsolvSolver.h @@ -34,6 +34,10 @@ public: virtual status_t AddRepository(BSolverRepository* repository); + virtual status_t FindPackages(const char* searchString, + uint32 flags, + BObjectList& _packages); + virtual status_t Install( const BSolverPackageSpecifierList& packages); @@ -46,6 +50,7 @@ public: private: struct SolvQueue; + struct SolvDataIterator; struct RepositoryInfo; struct Problem; struct Solution;