| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- // -*- mode: cpp; mode: fold -*-
- // Description /*{{{*/
- // $Id: srcrecords.cc,v 1.3 1999/10/18 04:15:24 jgg Exp $
- /* ######################################################################
-
- Source Package Records - Allows access to source package records
-
- Parses and allows access to the list of source records and searching by
- source name on that list.
-
- ##################################################################### */
- /*}}}*/
- // Include Files /*{{{*/
- #ifdef __GNUG__
- #pragma implementation "apt-pkg/srcrecords.h"
- #endif
- #include <apt-pkg/srcrecords.h>
- #include <apt-pkg/error.h>
- #include <apt-pkg/configuration.h>
- #include <apt-pkg/strutl.h>
- #include <apt-pkg/debsrcrecords.h>
- /*}}}*/
- // SrcRecords::pkgSrcRecords - Constructor /*{{{*/
- // ---------------------------------------------------------------------
- /* Open all the source index files */
- pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0)
- {
- pkgSourceList::const_iterator I = List.begin();
-
- // Count how many items we will need
- unsigned int Count = 0;
- for (; I != List.end(); I++)
- if (I->Type == pkgSourceList::Item::DebSrc)
- Count++;
- // Doesnt work without any source index files
- if (Count == 0)
- {
- _error->Error("Sorry, you must put some 'source' uris"
- " in your sources.list");
- return;
- }
- Files = new Parser *[Count+1];
- memset(Files,0,sizeof(*Files)*(Count+1));
-
- // Create the parser objects
- Count = 0;
- string Dir = _config->FindDir("Dir::State::lists");
- for (I = List.begin(); I != List.end(); I++)
- {
- if (I->Type != pkgSourceList::Item::DebSrc)
- continue;
- // Open the file
- FileFd *FD = new FileFd(Dir + URItoFileName(I->PackagesURI()),
- FileFd::ReadOnly);
- if (_error->PendingError() == true)
- {
- delete FD;
- return;
- }
-
- Files[Count] = new debSrcRecordParser(FD,I);
- Count++;
- }
- Restart();
- }
- /*}}}*/
- // SrcRecords::~pkgSrcRecords - Destructor /*{{{*/
- // ---------------------------------------------------------------------
- /* */
- pkgSrcRecords::~pkgSrcRecords()
- {
- if (Files == 0)
- return;
- // Blow away all the parser objects
- for (unsigned int Count = 0; Files[Count] != 0; Count++)
- delete Files[Count];
- }
- /*}}}*/
- // SrcRecords::Restart - Restart the search /*{{{*/
- // ---------------------------------------------------------------------
- /* Return all of the parsers to their starting position */
- bool pkgSrcRecords::Restart()
- {
- Current = Files;
- for (Parser **I = Files; *I != 0; I++)
- (*I)->Restart();
-
- return true;
- }
- /*}}}*/
- // SrcRecords::Find - Find the first source package with the given name /*{{{*/
- // ---------------------------------------------------------------------
- /* This searches on both source package names and output binary names and
- returns the first found. A 'cursor' like system is used to allow this
- function to be called multiple times to get successive entries */
- pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly)
- {
- if (*Current == 0)
- return 0;
-
- while (true)
- {
- // Step to the next record, possibly switching files
- while ((*Current)->Step() == false)
- {
- if (_error->PendingError() == true)
- return 0;
- Current++;
- if (*Current == 0)
- return 0;
- }
-
- // IO error somehow
- if (_error->PendingError() == true)
- return 0;
- // Source name hit
- if ((*Current)->Package() == Package)
- return *Current;
-
- if (SrcOnly == true)
- continue;
-
- // Check for a binary hit
- const char **I = (*Current)->Binaries();
- for (; I != 0 && *I != 0; I++)
- if (strcmp(Package,*I) == 0)
- return *Current;
- }
- }
- /*}}}*/
|