00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef PKGLIB_PKGCACHEGEN_H
00020 #define PKGLIB_PKGCACHEGEN_H
00021
00022
00023 #include <apt-pkg/pkgcache.h>
00024 #include <apt-pkg/md5.h>
00025
00026 #include <vector>
00027
00028 class pkgSourceList;
00029 class OpProgress;
00030 class MMap;
00031 class pkgIndexFile;
00032
00033 class pkgCacheGenerator
00034 {
00035 private:
00036
00037 pkgCache::StringItem *UniqHash[26];
00038 map_ptrloc WriteStringInMap(std::string const &String) { return WriteStringInMap(String.c_str()); };
00039 map_ptrloc WriteStringInMap(const char *String);
00040 map_ptrloc WriteStringInMap(const char *String, const unsigned long &Len);
00041 map_ptrloc AllocateInMap(const unsigned long &size);
00042
00043 public:
00044
00045 class ListParser;
00046 friend class ListParser;
00047
00048 template<typename Iter> class Dynamic {
00049 public:
00050 static std::vector<Iter*> toReMap;
00051 Dynamic(Iter &I) {
00052 toReMap.push_back(&I);
00053 }
00054
00055 ~Dynamic() {
00056 toReMap.pop_back();
00057 }
00058 };
00059
00060 protected:
00061
00062 DynamicMMap ⤅
00063 pkgCache Cache;
00064 OpProgress *Progress;
00065
00066 string PkgFileName;
00067 pkgCache::PackageFile *CurrentFile;
00068
00069
00070 bool FoundFileDeps;
00071
00072 bool NewGroup(pkgCache::GrpIterator &Grp,const string &Name);
00073 bool NewPackage(pkgCache::PkgIterator &Pkg,const string &Name, const string &Arch);
00074 bool NewFileVer(pkgCache::VerIterator &Ver,ListParser &List);
00075 bool NewFileDesc(pkgCache::DescIterator &Desc,ListParser &List);
00076 bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
00077 string const &Version, unsigned int const &Op,
00078 unsigned int const &Type, map_ptrloc *OldDepLast);
00079 unsigned long NewVersion(pkgCache::VerIterator &Ver,const string &VerStr,unsigned long Next);
00080 map_ptrloc NewDescription(pkgCache::DescIterator &Desc,const string &Lang,const MD5SumValue &md5sum,map_ptrloc Next);
00081
00082 public:
00083
00084 unsigned long WriteUniqString(const char *S,unsigned int Size);
00085 inline unsigned long WriteUniqString(const string &S) {return WriteUniqString(S.c_str(),S.length());};
00086
00087 void DropProgress() {Progress = 0;};
00088 bool SelectFile(const string &File,const string &Site,pkgIndexFile const &Index,
00089 unsigned long Flags = 0);
00090 bool MergeList(ListParser &List,pkgCache::VerIterator *Ver = 0);
00091 inline pkgCache &GetCache() {return Cache;};
00092 inline pkgCache::PkgFileIterator GetCurFile()
00093 {return pkgCache::PkgFileIterator(Cache,CurrentFile);};
00094
00095 bool HasFileDeps() {return FoundFileDeps;};
00096 bool MergeFileProvides(ListParser &List);
00097 bool FinishCache(OpProgress *Progress);
00098
00099 static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress,
00100 MMap **OutMap = 0,bool AllowMem = false);
00101 static bool MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap);
00102 static DynamicMMap* CreateDynamicMMap(FileFd *CacheF, unsigned long Flags = 0);
00103
00104 void ReMap(void const * const oldMap, void const * const newMap);
00105
00106 pkgCacheGenerator(DynamicMMap *Map,OpProgress *Progress);
00107 ~pkgCacheGenerator();
00108 };
00109
00110
00111 class pkgCacheGenerator::ListParser
00112 {
00113 pkgCacheGenerator *Owner;
00114 friend class pkgCacheGenerator;
00115
00116
00117 pkgCache::VerIterator OldDepVer;
00118 map_ptrloc *OldDepLast;
00119
00120
00121 bool FoundFileDeps;
00122
00123 protected:
00124
00125 inline unsigned long WriteUniqString(string S) {return Owner->WriteUniqString(S);};
00126 inline unsigned long WriteUniqString(const char *S,unsigned int Size) {return Owner->WriteUniqString(S,Size);};
00127 inline unsigned long WriteString(const string &S) {return Owner->WriteStringInMap(S);};
00128 inline unsigned long WriteString(const char *S,unsigned int Size) {return Owner->WriteStringInMap(S,Size);};
00129 bool NewDepends(pkgCache::VerIterator &Ver,const string &Package, const string &Arch,
00130 const string &Version,unsigned int Op,
00131 unsigned int Type);
00132 bool NewProvides(pkgCache::VerIterator &Ver,const string &PkgName,
00133 const string &PkgArch, const string &Version);
00134
00135 public:
00136
00137
00138 virtual string Package() = 0;
00139 virtual string Architecture() = 0;
00140 virtual bool ArchitectureAll() = 0;
00141 virtual string Version() = 0;
00142 virtual bool NewVersion(pkgCache::VerIterator &Ver) = 0;
00143 virtual string Description() = 0;
00144 virtual string DescriptionLanguage() = 0;
00145 virtual MD5SumValue Description_md5() = 0;
00146 virtual unsigned short VersionHash() = 0;
00147 virtual bool UsePackage(pkgCache::PkgIterator &Pkg,
00148 pkgCache::VerIterator &Ver) = 0;
00149 virtual unsigned long Offset() = 0;
00150 virtual unsigned long Size() = 0;
00151
00152 virtual bool Step() = 0;
00153
00154 inline bool HasFileDeps() {return FoundFileDeps;};
00155 virtual bool CollectFileProvides(pkgCache &Cache,
00156 pkgCache::VerIterator &Ver) {return true;};
00157
00158 ListParser() : FoundFileDeps(false) {};
00159 virtual ~ListParser() {};
00160 };
00161
00162
00163 bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress,
00164 MMap **OutMap = 0,bool AllowMem = false);
00165 bool pkgMakeOnlyStatusCache(OpProgress &Progress,DynamicMMap **OutMap);
00166
00167
00168 #ifdef APT_COMPATIBILITY
00169 #if APT_COMPATIBILITY != 986
00170 #warning "Using APT_COMPATIBILITY"
00171 #endif
00172 MMap *pkgMakeStatusCacheMem(pkgSourceList &List,OpProgress &Progress)
00173 {
00174 MMap *Map = 0;
00175 if (pkgCacheGenerator::MakeStatusCache(List,&Progress,&Map,true) == false)
00176 return 0;
00177 return Map;
00178 }
00179 #endif
00180
00181 #endif