X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/3164dff98e933252249afc0de9e8469b9696fd42..8d3489abd90a64715b92976a7c60b42a386a4c5c:/apt-pkg/pkgrecords.cc diff --git a/apt-pkg/pkgrecords.cc b/apt-pkg/pkgrecords.cc index bb8b05759..e506de73a 100644 --- a/apt-pkg/pkgrecords.cc +++ b/apt-pkg/pkgrecords.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: pkgrecords.cc,v 1.2 1998/08/19 06:16:10 jgg Exp $ +// $Id: pkgrecords.cc,v 1.8 2003/09/02 04:52:16 mdz Exp $ /* ###################################################################### Package Records - Allows access to complete package description records @@ -9,43 +9,34 @@ ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ -#ifdef __GNUG__ -#pragma implementation "apt-pkg/pkgrecords.h" -#endif #include -#include +#include #include #include + +#include /*}}}*/ // Records::pkgRecords - Constructor /*{{{*/ // --------------------------------------------------------------------- /* This will create the necessary structures to access the status files */ -pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0) +pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), + Files(Cache.HeaderP->PackageFileCount) { - string ListDir = _config->FindDir("Dir::State::lists"); - - Files = new PkgFile[Cache.HeaderP->PackageFileCount]; - for (pkgCache::PkgFileIterator I = Cache.FileBegin(); - I.end() == false; I++) + for (pkgCache::PkgFileIterator I = Cache.FileBegin(); + I.end() == false; I++) { - // We can not initialize if the cache is out of sync. - if (I.IsOk() == false) + const pkgIndexFile::Type *Type = pkgIndexFile::Type::GetType(I.IndexType()); + if (Type == 0) { - _error->Error("Package file %s is out of sync.",I.FileName()); - return; + _error->Error(_("Index file type '%s' is not supported"),I.IndexType()); + return; } - - // Create the file - Files[I->ID].File = new FileFd(ListDir + I.FileName(),FileFd::ReadOnly); - if (_error->PendingError() == true) - return; - - // Create the parser - Files[I->ID].Parse = new debRecordParser(*Files[I->ID].File); - if (_error->PendingError() == true) - return; - } + + Files[I->ID] = Type->CreatePkgParser(I); + if (Files[I->ID] == 0) + return; + } } /*}}}*/ // Records::~pkgRecords - Destructor /*{{{*/ @@ -53,26 +44,29 @@ pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0) /* */ pkgRecords::~pkgRecords() { - delete [] Files; + for ( vector::iterator it = Files.begin(); + it != Files.end(); + ++it) + { + delete *it; + } } /*}}}*/ // Records::Lookup - Get a parser for the package version file /*{{{*/ // --------------------------------------------------------------------- /* */ -pkgRecords::Parser &pkgRecords::Lookup(pkgCache::VerFileIterator &Ver) -{ - PkgFile &File = Files[Ver.File()->ID]; - File.Parse->Jump(Ver); - - return *File.Parse; +pkgRecords::Parser &pkgRecords::Lookup(pkgCache::VerFileIterator const &Ver) +{ + Files[Ver.File()->ID]->Jump(Ver); + return *Files[Ver.File()->ID]; } /*}}}*/ -// Records::Pkgfile::~PkgFile - Destructor /*{{{*/ +// Records::Lookup - Get a parser for the package description file /*{{{*/ // --------------------------------------------------------------------- /* */ -pkgRecords::PkgFile::~PkgFile() +pkgRecords::Parser &pkgRecords::Lookup(pkgCache::DescFileIterator const &Desc) { - delete Parse; - delete File; + Files[Desc.File()->ID]->Jump(Desc); + return *Files[Desc.File()->ID]; } /*}}}*/