// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: srcrecords.cc,v 1.2 1999/04/07 05:30:18 jgg Exp $
+// $Id: srcrecords.cc,v 1.7.2.2 2003/12/26 16:27:34 mdz Exp $
/* ######################################################################
Source Package Records - Allows access to source package records
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/srcrecords.h"
-#endif
+#include<config.h>
#include <apt-pkg/srcrecords.h>
#include <apt-pkg/error.h>
-#include <apt-pkg/configuration.h>
+#include <apt-pkg/sourcelist.h>
#include <apt-pkg/strutl.h>
-#include <apt-pkg/debsrcrecords.h>
+#include <apt-pkg/metaindex.h>
+
+#include <apti18n.h>
/*}}}*/
// SrcRecords::pkgSrcRecords - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* Open all the source index files */
-pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0)
+pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : d(NULL), 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)
+ for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); ++I)
{
- _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)
+ std::vector<pkgIndexFile *> *Indexes = (*I)->GetIndexFiles();
+ for (std::vector<pkgIndexFile *>::const_iterator J = Indexes->begin();
+ J != Indexes->end(); ++J)
{
- delete FD;
- return;
+ Parser* P = (*J)->CreateSrcParser();
+ if (_error->PendingError() == true)
+ return;
+ if (P != 0)
+ Files.push_back(P);
}
-
- Files[Count] = new debSrcRecordParser(FD,I);
- Count++;
}
+ // Doesn't work without any source index files
+ if (Files.empty() == true)
+ {
+ _error->Error(_("You must put some 'source' URIs"
+ " in your sources.list"));
+ return;
+ }
+
Restart();
}
/*}}}*/
/* */
pkgSrcRecords::~pkgSrcRecords()
{
- if (Files == 0)
- return;
-
// Blow away all the parser objects
- for (unsigned int Count = 0; Files[Count] != 0; Count++)
- delete Files[Count];
+ for(std::vector<Parser*>::iterator I = Files.begin(); I != Files.end(); ++I)
+ delete *I;
}
/*}}}*/
// 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++)
- if ((*I)->Restart() == false)
- return false;
+ Current = Files.begin();
+ for (std::vector<Parser*>::iterator I = Files.begin();
+ I != Files.end(); ++I)
+ (*I)->Restart();
+
return true;
}
/*}}}*/
/* 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)
+pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool const &SrcOnly)
{
- if (*Current == 0)
+ if (Current == Files.end())
return 0;
while (true)
{
if (_error->PendingError() == true)
return 0;
- Current++;
- if (*Current == 0)
+ ++Current;
+ if (Current == Files.end())
return 0;
}
// Check for a binary hit
const char **I = (*Current)->Binaries();
- for (; I != 0 && *I != 0; I++)
+ for (; I != 0 && *I != 0; ++I)
if (strcmp(Package,*I) == 0)
return *Current;
}
}
/*}}}*/
+// Parser::BuildDepType - Convert a build dep to a string /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+const char *pkgSrcRecords::Parser::BuildDepType(unsigned char const &Type)
+{
+ const char *fields[] = {"Build-Depends",
+ "Build-Depends-Indep",
+ "Build-Conflicts",
+ "Build-Conflicts-Indep"};
+ if (unlikely(Type >= sizeof(fields)/sizeof(fields[0])))
+ return "";
+ return fields[Type];
+}
+ /*}}}*/
+