]> git.saurik.com Git - apt.git/blame - apt-pkg/pkgcachegen.h
proof-of-concept for fixing debian #731102
[apt.git] / apt-pkg / pkgcachegen.h
CommitLineData
578bfd0a
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
45415543 3// $Id: pkgcachegen.h,v 1.19 2002/07/08 03:13:30 jgg Exp $
578bfd0a
AL
4/* ######################################################################
5
6 Package Cache Generator - Generator for the cache structure.
7
8 This builds the cache structure from the abstract package list parser.
6fc33863
AL
9 Each archive source has it's own list parser that is instantiated by
10 the caller to provide data for the generator.
11
12 Parts of the cache are created by this generator class while other
13 parts are created by the list parser. The list parser is responsible
14 for creating version, depends and provides structures, and some of
15 their contents
578bfd0a
AL
16
17 ##################################################################### */
18 /*}}}*/
578bfd0a
AL
19#ifndef PKGLIB_PKGCACHEGEN_H
20#define PKGLIB_PKGCACHEGEN_H
21
6c139d6e 22
094a497d 23#include <apt-pkg/pkgcache.h>
a52f938b 24#include <apt-pkg/md5.h>
5a8e963b 25#include <apt-pkg/macros.h>
b35d2f5f 26
7635093c 27#include <vector>
a9fe5928 28
b35d2f5f
AL
29class pkgSourceList;
30class OpProgress;
2d11135a 31class MMap;
b2e465d6 32class pkgIndexFile;
578bfd0a 33
92fcbfc1 34class pkgCacheGenerator /*{{{*/
578bfd0a 35{
f9eec0e7 36 private:
7e58ab0c 37
f9eec0e7 38 pkgCache::StringItem *UniqHash[26];
a9fe5928
DK
39 map_ptrloc WriteStringInMap(std::string const &String) { return WriteStringInMap(String.c_str()); };
40 map_ptrloc WriteStringInMap(const char *String);
41 map_ptrloc WriteStringInMap(const char *String, const unsigned long &Len);
42 map_ptrloc AllocateInMap(const unsigned long &size);
7e58ab0c 43
578bfd0a
AL
44 public:
45
46 class ListParser;
b2e465d6 47 friend class ListParser;
a9fe5928
DK
48
49 template<typename Iter> class Dynamic {
a9fe5928 50 public:
7635093c
DK
51 static std::vector<Iter*> toReMap;
52 Dynamic(Iter &I) {
53 toReMap.push_back(&I);
a9fe5928
DK
54 }
55
56 ~Dynamic() {
7635093c 57 toReMap.pop_back();
a9fe5928
DK
58 }
59 };
60
578bfd0a 61 protected:
a9fe5928 62
578bfd0a
AL
63 DynamicMMap &Map;
64 pkgCache Cache;
ddc1d8d0 65 OpProgress *Progress;
404ec98e 66
8f3ba4e8 67 std::string PkgFileName;
578bfd0a 68 pkgCache::PackageFile *CurrentFile;
45415543
AL
69
70 // Flag file dependencies
71 bool FoundFileDeps;
578bfd0a 72
8f3ba4e8
DK
73 bool NewGroup(pkgCache::GrpIterator &Grp,const std::string &Name);
74 bool NewPackage(pkgCache::PkgIterator &Pkg,const std::string &Name, const std::string &Arch);
f55a958f 75 bool NewFileVer(pkgCache::VerIterator &Ver,ListParser &List);
a52f938b 76 bool NewFileDesc(pkgCache::DescIterator &Desc,ListParser &List);
25396fb0 77 bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
8f3ba4e8 78 std::string const &Version, unsigned int const &Op,
64dda04b 79 unsigned int const &Type, map_ptrloc* &OldDepLast);
9c44383f
DK
80 bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
81 map_ptrloc const Version, unsigned int const &Op,
82 unsigned int const &Type, map_ptrloc* &OldDepLast);
885594fc
DK
83 __deprecated unsigned long NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,unsigned long Next)
84 { return NewVersion(Ver, VerStr, 0, 0, Next); }
85 unsigned long NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,
86 map_ptrloc const ParentPkg, unsigned long const Hash,
87 unsigned long Next);
8f3ba4e8 88 map_ptrloc NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang,const MD5SumValue &md5sum,map_ptrloc Next);
578bfd0a 89
b2e465d6
AL
90 public:
91
f55a958f 92 unsigned long WriteUniqString(const char *S,unsigned int Size);
8f3ba4e8 93 inline unsigned long WriteUniqString(const std::string &S) {return WriteUniqString(S.c_str(),S.length());};
813c8eea 94
ddc1d8d0 95 void DropProgress() {Progress = 0;};
8f3ba4e8 96 bool SelectFile(const std::string &File,const std::string &Site,pkgIndexFile const &Index,
b2e465d6 97 unsigned long Flags = 0);
ddc1d8d0 98 bool MergeList(ListParser &List,pkgCache::VerIterator *Ver = 0);
ad00ae81 99 inline pkgCache &GetCache() {return Cache;};
b0b4efb9
AL
100 inline pkgCache::PkgFileIterator GetCurFile()
101 {return pkgCache::PkgFileIterator(Cache,CurrentFile);};
45415543
AL
102
103 bool HasFileDeps() {return FoundFileDeps;};
104 bool MergeFileProvides(ListParser &List);
5a8e963b 105 __deprecated bool FinishCache(OpProgress *Progress);
2e5f4e45
DK
106
107 static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress,
108 MMap **OutMap = 0,bool AllowMem = false);
109 static bool MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap);
dcdf1ef1 110 static DynamicMMap* CreateDynamicMMap(FileFd *CacheF, unsigned long Flags = 0);
25396fb0 111
a9fe5928
DK
112 void ReMap(void const * const oldMap, void const * const newMap);
113
b2e465d6 114 pkgCacheGenerator(DynamicMMap *Map,OpProgress *Progress);
578bfd0a 115 ~pkgCacheGenerator();
99a2ea5a
DK
116
117 private:
118 bool MergeListGroup(ListParser &List, std::string const &GrpName);
119 bool MergeListPackage(ListParser &List, pkgCache::PkgIterator &Pkg);
120 bool MergeListVersion(ListParser &List, pkgCache::PkgIterator &Pkg,
121 std::string const &Version, pkgCache::VerIterator* &OutVer);
5a8e963b
DK
122
123 bool AddImplicitDepends(pkgCache::GrpIterator &G, pkgCache::PkgIterator &P,
124 pkgCache::VerIterator &V);
125 bool AddImplicitDepends(pkgCache::VerIterator &V, pkgCache::PkgIterator &D);
578bfd0a 126};
92fcbfc1
DK
127 /*}}}*/
128// This is the abstract package list parser class. /*{{{*/
f55ece0e
AL
129class pkgCacheGenerator::ListParser
130{
131 pkgCacheGenerator *Owner;
b2e465d6 132 friend class pkgCacheGenerator;
f55ece0e 133
f9eec0e7
AL
134 // Some cache items
135 pkgCache::VerIterator OldDepVer;
349cd3b8 136 map_ptrloc *OldDepLast;
45415543
AL
137
138 // Flag file dependencies
139 bool FoundFileDeps;
f9eec0e7 140
f55ece0e 141 protected:
813c8eea 142
8f3ba4e8 143 inline unsigned long WriteUniqString(std::string S) {return Owner->WriteUniqString(S);};
f55ece0e 144 inline unsigned long WriteUniqString(const char *S,unsigned int Size) {return Owner->WriteUniqString(S,Size);};
8f3ba4e8 145 inline unsigned long WriteString(const std::string &S) {return Owner->WriteStringInMap(S);};
7e58ab0c 146 inline unsigned long WriteString(const char *S,unsigned int Size) {return Owner->WriteStringInMap(S,Size);};
8f3ba4e8
DK
147 bool NewDepends(pkgCache::VerIterator &Ver,const std::string &Package, const std::string &Arch,
148 const std::string &Version,unsigned int Op,
f55ece0e 149 unsigned int Type);
8f3ba4e8
DK
150 bool NewProvides(pkgCache::VerIterator &Ver,const std::string &PkgName,
151 const std::string &PkgArch, const std::string &Version);
f55ece0e
AL
152
153 public:
154
155 // These all operate against the current section
8f3ba4e8
DK
156 virtual std::string Package() = 0;
157 virtual std::string Architecture() = 0;
857e9c13 158 virtual bool ArchitectureAll() = 0;
8f3ba4e8 159 virtual std::string Version() = 0;
32b9a14c 160 virtual bool NewVersion(pkgCache::VerIterator &Ver) = 0;
8f3ba4e8
DK
161 virtual std::string Description() = 0;
162 virtual std::string DescriptionLanguage() = 0;
a52f938b 163 virtual MD5SumValue Description_md5() = 0;
204fbdcc 164 virtual unsigned short VersionHash() = 0;
32b9a14c
DK
165 virtual bool UsePackage(pkgCache::PkgIterator &Pkg,
166 pkgCache::VerIterator &Ver) = 0;
f55ece0e
AL
167 virtual unsigned long Offset() = 0;
168 virtual unsigned long Size() = 0;
169
170 virtual bool Step() = 0;
171
45415543
AL
172 inline bool HasFileDeps() {return FoundFileDeps;};
173 virtual bool CollectFileProvides(pkgCache &Cache,
32b9a14c 174 pkgCache::VerIterator &Ver) {return true;};
45415543
AL
175
176 ListParser() : FoundFileDeps(false) {};
f55ece0e
AL
177 virtual ~ListParser() {};
178};
92fcbfc1 179 /*}}}*/
2e5f4e45 180
b2e465d6
AL
181bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress,
182 MMap **OutMap = 0,bool AllowMem = false);
183bool pkgMakeOnlyStatusCache(OpProgress &Progress,DynamicMMap **OutMap);
184
578bfd0a 185#endif