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