]> git.saurik.com Git - apt.git/blame - apt-pkg/pkgcachegen.h
Replace compare() == 0 checks with this == other checks
[apt.git] / apt-pkg / pkgcachegen.h
CommitLineData
578bfd0a
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
578bfd0a
AL
3/* ######################################################################
4
5 Package Cache Generator - Generator for the cache structure.
6
7 This builds the cache structure from the abstract package list parser.
6fc33863
AL
8 Each archive source has it's own list parser that is instantiated by
9 the caller to provide data for the generator.
10
11 Parts of the cache are created by this generator class while other
12 parts are created by the list parser. The list parser is responsible
13 for creating version, depends and provides structures, and some of
14 their contents
578bfd0a
AL
15
16 ##################################################################### */
17 /*}}}*/
578bfd0a
AL
18#ifndef PKGLIB_PKGCACHEGEN_H
19#define PKGLIB_PKGCACHEGEN_H
20
a52f938b 21#include <apt-pkg/md5.h>
453b82a3
DK
22#include <apt-pkg/mmap.h>
23#include <apt-pkg/pkgcache.h>
24#include <apt-pkg/cacheiterators.h>
5a8e963b 25#include <apt-pkg/macros.h>
b35d2f5f 26
7635093c 27#include <vector>
453b82a3 28#include <string>
2837a718 29#if __cplusplus >= 201103L
e9185eca 30#include <unordered_map>
2837a718 31#endif
eff0c22e
JAK
32#ifdef APT_PKG_EXPOSE_STRING_VIEW
33#include <apt-pkg/string_view.h>
34#endif
a9fe5928 35
453b82a3 36class FileFd;
b35d2f5f
AL
37class pkgSourceList;
38class OpProgress;
b2e465d6 39class pkgIndexFile;
c9443c01 40class pkgCacheListParser;
578bfd0a 41
dce45dbe 42class APT_HIDDEN pkgCacheGenerator /*{{{*/
578bfd0a 43{
4ad8619b
DK
44 APT_HIDDEN map_stringitem_t WriteStringInMap(std::string const &String) { return WriteStringInMap(String.c_str()); };
45 APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String);
46 APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String, const unsigned long &Len);
47 APT_HIDDEN map_pointer_t AllocateInMap(const unsigned long &size);
7e58ab0c 48
2837a718
JAK
49 // Dirty hack for public users that do not use C++11 yet
50#if __cplusplus >= 201103L
e9185eca
JAK
51 std::unordered_map<std::string,map_stringitem_t> strMixed;
52 std::unordered_map<std::string,map_stringitem_t> strSections;
53 std::unordered_map<std::string,map_stringitem_t> strPkgNames;
54 std::unordered_map<std::string,map_stringitem_t> strVersions;
2837a718 55#endif
78a5476f 56
c9443c01
DK
57 friend class pkgCacheListParser;
58 typedef pkgCacheListParser ListParser;
59
578bfd0a 60 public:
a9fe5928
DK
61
62 template<typename Iter> class Dynamic {
a9fe5928 63 public:
7635093c 64 static std::vector<Iter*> toReMap;
e8afd168 65 explicit Dynamic(Iter &I) {
7635093c 66 toReMap.push_back(&I);
a9fe5928
DK
67 }
68
69 ~Dynamic() {
7635093c 70 toReMap.pop_back();
a9fe5928
DK
71 }
72 };
73
578bfd0a 74 protected:
a9fe5928 75
578bfd0a
AL
76 DynamicMMap &Map;
77 pkgCache Cache;
ddc1d8d0 78 OpProgress *Progress;
b07aeb1a
DK
79
80 std::string RlsFileName;
81 pkgCache::ReleaseFile *CurrentRlsFile;
8f3ba4e8 82 std::string PkgFileName;
578bfd0a 83 pkgCache::PackageFile *CurrentFile;
45415543 84
eff0c22e
JAK
85#ifdef APT_PKG_EXPOSE_STRING_VIEW
86 bool NewGroup(pkgCache::GrpIterator &Grp, APT::StringView Name);
87 bool NewPackage(pkgCache::PkgIterator &Pkg, APT::StringView Name, APT::StringView Arch);
88#endif
f55a958f 89 bool NewFileVer(pkgCache::VerIterator &Ver,ListParser &List);
a52f938b 90 bool NewFileDesc(pkgCache::DescIterator &Desc,ListParser &List);
9c44383f 91 bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
8c7af4d4
DK
92 map_pointer_t const Version, uint8_t const Op,
93 uint8_t const Type, map_pointer_t* &OldDepLast);
4ad8619b 94 map_pointer_t NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,map_pointer_t const Next) APT_DEPRECATED
885594fc 95 { return NewVersion(Ver, VerStr, 0, 0, Next); }
4ad8619b
DK
96 map_pointer_t NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,
97 map_pointer_t const ParentPkg, unsigned short const Hash,
98 map_pointer_t const Next);
99 map_pointer_t NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang,const MD5SumValue &md5sum,map_stringitem_t const idxmd5str);
ecc138f8
DK
100 bool NewProvides(pkgCache::VerIterator &Ver, pkgCache::PkgIterator &Pkg,
101 map_stringitem_t const ProvidesVersion, uint8_t const Flags);
578bfd0a 102
b2e465d6
AL
103 public:
104
30b45652
DK
105 enum StringType { MIXED, PKGNAME, VERSIONNUMBER, SECTION };
106 map_stringitem_t StoreString(StringType const type, const char * S, unsigned int const Size);
dd592790
JAK
107
108#ifdef APT_PKG_EXPOSE_STRING_VIEW
109 inline map_stringitem_t StoreString(enum StringType const type, APT::StringView S) {return StoreString(type, S.data(),S.length());};
110#endif
813c8eea 111
ddc1d8d0 112 void DropProgress() {Progress = 0;};
e185d8b3 113 bool SelectFile(const std::string &File,pkgIndexFile const &Index, std::string const &Architecture, std::string const &Component, unsigned long Flags = 0);
b07aeb1a 114 bool SelectReleaseFile(const std::string &File, const std::string &Site, unsigned long Flags = 0);
ddc1d8d0 115 bool MergeList(ListParser &List,pkgCache::VerIterator *Ver = 0);
ad00ae81 116 inline pkgCache &GetCache() {return Cache;};
1d3eea5c 117 inline pkgCache::PkgFileIterator GetCurFile()
b0b4efb9 118 {return pkgCache::PkgFileIterator(Cache,CurrentFile);};
1d3eea5c 119 inline pkgCache::RlsFileIterator GetCurRlsFile()
b07aeb1a 120 {return pkgCache::RlsFileIterator(Cache,CurrentRlsFile);};
45415543 121
dce45dbe 122 APT_PUBLIC static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress,
2e5f4e45 123 MMap **OutMap = 0,bool AllowMem = false);
f1616039
JAK
124 APT_HIDDEN static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress,
125 MMap **OutMap,pkgCache **OutCache, bool AllowMem = false);
dce45dbe 126 APT_PUBLIC static bool MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap);
25396fb0 127
a9fe5928
DK
128 void ReMap(void const * const oldMap, void const * const newMap);
129
b2e465d6 130 pkgCacheGenerator(DynamicMMap *Map,OpProgress *Progress);
c8a4ce6c 131 virtual ~pkgCacheGenerator();
99a2ea5a
DK
132
133 private:
6c55f07a 134 void * const d;
ce62f1de
DK
135 APT_HIDDEN bool MergeListGroup(ListParser &List, std::string const &GrpName);
136 APT_HIDDEN bool MergeListPackage(ListParser &List, pkgCache::PkgIterator &Pkg);
137 APT_HIDDEN bool MergeListVersion(ListParser &List, pkgCache::PkgIterator &Pkg,
99a2ea5a 138 std::string const &Version, pkgCache::VerIterator* &OutVer);
5a8e963b 139
ce62f1de 140 APT_HIDDEN bool AddImplicitDepends(pkgCache::GrpIterator &G, pkgCache::PkgIterator &P,
5a8e963b 141 pkgCache::VerIterator &V);
ce62f1de 142 APT_HIDDEN bool AddImplicitDepends(pkgCache::VerIterator &V, pkgCache::PkgIterator &D);
ffe3c68e
DK
143
144 APT_HIDDEN bool AddNewDescription(ListParser &List, pkgCache::VerIterator &Ver,
4ad8619b 145 std::string const &lang, MD5SumValue const &CurMd5, map_stringitem_t &md5idx);
578bfd0a 146};
92fcbfc1
DK
147 /*}}}*/
148// This is the abstract package list parser class. /*{{{*/
c9443c01 149class APT_HIDDEN pkgCacheListParser
f55ece0e
AL
150{
151 pkgCacheGenerator *Owner;
b2e465d6 152 friend class pkgCacheGenerator;
c9443c01 153
f9eec0e7
AL
154 // Some cache items
155 pkgCache::VerIterator OldDepVer;
4ad8619b 156 map_pointer_t *OldDepLast;
45415543 157
6c55f07a 158 void * const d;
c8a4ce6c 159
f55ece0e 160 protected:
813c8eea 161
78a5476f 162 inline map_stringitem_t StoreString(pkgCacheGenerator::StringType const type, const char *S,unsigned int Size) {return Owner->StoreString(type, S, Size);};
dd592790
JAK
163#ifdef APT_PKG_EXPOSE_STRING_VIEW
164 inline map_stringitem_t StoreString(pkgCacheGenerator::StringType const type, APT::StringView S) {return Owner->StoreString(type, S);};
165#endif
78a5476f 166
4ad8619b
DK
167 inline map_stringitem_t WriteString(const std::string &S) {return Owner->WriteStringInMap(S);};
168 inline map_stringitem_t WriteString(const char *S,unsigned int Size) {return Owner->WriteStringInMap(S,Size);};
eff0c22e
JAK
169#ifdef APT_PKG_EXPOSE_STRING_VIEW
170 bool NewDepends(pkgCache::VerIterator &Ver,APT::StringView Package, APT::StringView Arch,
171 APT::StringView Version,uint8_t const Op,
8c7af4d4 172 uint8_t const Type);
eff0c22e
JAK
173 bool NewProvides(pkgCache::VerIterator &Ver,APT::StringView PkgName,
174 APT::StringView PkgArch, APT::StringView Version,
8c7af4d4 175 uint8_t const Flags);
eff0c22e
JAK
176 bool NewProvidesAllArch(pkgCache::VerIterator &Ver, APT::StringView Package,
177 APT::StringView Version, uint8_t const Flags);
178#endif
f55ece0e
AL
179 public:
180
181 // These all operate against the current section
8f3ba4e8
DK
182 virtual std::string Package() = 0;
183 virtual std::string Architecture() = 0;
857e9c13 184 virtual bool ArchitectureAll() = 0;
8f3ba4e8 185 virtual std::string Version() = 0;
32b9a14c 186 virtual bool NewVersion(pkgCache::VerIterator &Ver) = 0;
ffe3c68e
DK
187 virtual std::string Description(std::string const &lang) = 0;
188 virtual std::vector<std::string> AvailableDescriptionLanguages() = 0;
a52f938b 189 virtual MD5SumValue Description_md5() = 0;
204fbdcc 190 virtual unsigned short VersionHash() = 0;
68134bda
DK
191 /** compare currently parsed version with given version
192 *
193 * \param Hash of the currently parsed version
194 * \param Ver to compare with
195 */
c8a4ce6c 196 virtual bool SameVersion(unsigned short const Hash, pkgCache::VerIterator const &Ver);
32b9a14c
DK
197 virtual bool UsePackage(pkgCache::PkgIterator &Pkg,
198 pkgCache::VerIterator &Ver) = 0;
4ad8619b
DK
199 virtual map_filesize_t Offset() = 0;
200 virtual map_filesize_t Size() = 0;
f55ece0e
AL
201
202 virtual bool Step() = 0;
203
65512241
DK
204 virtual bool CollectFileProvides(pkgCache &/*Cache*/,
205 pkgCache::VerIterator &/*Ver*/) {return true;};
45415543 206
c9443c01
DK
207 pkgCacheListParser();
208 virtual ~pkgCacheListParser();
f55ece0e 209};
92fcbfc1 210 /*}}}*/
2e5f4e45 211
5dd00edb 212APT_DEPRECATED_MSG("Use pkgCacheGenerator::MakeStatusCache instead") bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress,
b2e465d6 213 MMap **OutMap = 0,bool AllowMem = false);
5dd00edb 214APT_DEPRECATED_MSG("Use pkgCacheGenerator::MakeOnlyStatusCache instead") bool pkgMakeOnlyStatusCache(OpProgress &Progress,DynamicMMap **OutMap);
b2e465d6 215
578bfd0a 216#endif