]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/pkgrecords.cc
* make sure that the pkgRecords D'tor does not segfault
[apt.git] / apt-pkg / pkgrecords.cc
index 5d112a5c10e4eec55532985af55f8f6f381aa077..1d71d3e2fb67af1085ea441ae64e2d75d8d3d39a 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: pkgrecords.cc,v 1.5 1999/02/22 03:30:06 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
 /* ######################################################################
    
    Package Records - Allows access to complete package description records
 #pragma implementation "apt-pkg/pkgrecords.h"
 #endif
 #include <apt-pkg/pkgrecords.h>
 #pragma implementation "apt-pkg/pkgrecords.h"
 #endif
 #include <apt-pkg/pkgrecords.h>
-#include <apt-pkg/debrecords.h>
+#include <apt-pkg/indexfile.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/configuration.h>
+    
+#include <apti18n.h>   
                                                                        /*}}}*/
 
 // Records::pkgRecords - Constructor                                   /*{{{*/
                                                                        /*}}}*/
 
 // Records::pkgRecords - Constructor                                   /*{{{*/
 /* This will create the necessary structures to access the status files */
 pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0)
 {
 /* This will create the necessary structures to access the status files */
 pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0)
 {
-   Files = new PkgFile[Cache.HeaderP->PackageFileCount];
+   Files = new Parser *[Cache.HeaderP->PackageFileCount];
+   memset(Files,0,sizeof(*Files)*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());
+        _error->Error(_("Index file type '%s' is not supported"),I.IndexType());
         return;
       }
         return;
       }
-   
-      // Create the file
-      Files[I->ID].File = new FileFd(I.FileName(),FileFd::ReadOnly);
-      if (_error->PendingError() == true)
-        return;
-      
-      // Create the parser
-      Files[I->ID].Parse = new debRecordParser(*Files[I->ID].File,Cache);
-      if (_error->PendingError() == true)
+
+      Files[I->ID] = Type->CreatePkgParser(I);
+      if (Files[I->ID] == 0)
         return;
    }   
         return;
    }   
+   // We store that to make sure that the destructor won't segfault,
+   // even if the Cache object was destructed before this instance.
+   PackageFileCount = Cache.HeaderP->PackageFileCount;
 }
                                                                        /*}}}*/
 // Records::~pkgRecords - Destructor                                   /*{{{*/
 }
                                                                        /*}}}*/
 // Records::~pkgRecords - Destructor                                   /*{{{*/
@@ -51,6 +52,8 @@ pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0)
 /* */
 pkgRecords::~pkgRecords()
 {
 /* */
 pkgRecords::~pkgRecords()
 {
+   for (unsigned I = 0; I != PackageFileCount; I++)
+      delete Files[I];
    delete [] Files;
 }
                                                                        /*}}}*/
    delete [] Files;
 }
                                                                        /*}}}*/
@@ -59,18 +62,7 @@ pkgRecords::~pkgRecords()
 /* */
 pkgRecords::Parser &pkgRecords::Lookup(pkgCache::VerFileIterator const &Ver)
 {
 /* */
 pkgRecords::Parser &pkgRecords::Lookup(pkgCache::VerFileIterator const &Ver)
 {
-   PkgFile &File = Files[Ver.File()->ID];
-   File.Parse->Jump(Ver);
-
-   return *File.Parse;
-}
-                                                                       /*}}}*/
-// Records::Pkgfile::~PkgFile - Destructor                             /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-pkgRecords::PkgFile::~PkgFile()
-{
-   delete Parse;
-   delete File;
+   Files[Ver.File()->ID]->Jump(Ver);
+   return *Files[Ver.File()->ID];
 }
                                                                        /*}}}*/
 }
                                                                        /*}}}*/