apt @VERSION@
|
00001 // -*- mode: cpp; mode: fold -*- 00002 // Description /*{{{*/ 00073 /*}}}*/ 00074 #ifndef PKGLIB_PKGCACHE_H 00075 #define PKGLIB_PKGCACHE_H 00076 00077 00078 #include <string> 00079 #include <time.h> 00080 #include <apt-pkg/mmap.h> 00081 00082 using std::string; 00083 00084 class pkgVersioningSystem; 00085 class pkgCache /*{{{*/ 00086 { 00087 public: 00088 // Cache element predeclarations 00089 struct Header; 00090 struct Group; 00091 struct Package; 00092 struct PackageFile; 00093 struct Version; 00094 struct Description; 00095 struct Provides; 00096 struct Dependency; 00097 struct StringItem; 00098 struct VerFile; 00099 struct DescFile; 00100 00101 // Iterators 00102 template<typename Str, typename Itr> class Iterator; 00103 class GrpIterator; 00104 class PkgIterator; 00105 class VerIterator; 00106 class DescIterator; 00107 class DepIterator; 00108 class PrvIterator; 00109 class PkgFileIterator; 00110 class VerFileIterator; 00111 class DescFileIterator; 00112 00113 class Namespace; 00114 00115 // These are all the constants used in the cache structures 00116 00117 // WARNING - if you change these lists you must also edit 00118 // the stringification in pkgcache.cc and also consider whether 00119 // the cache file will become incompatible. 00120 struct Dep 00121 { 00122 enum DepType {Depends=1,PreDepends=2,Suggests=3,Recommends=4, 00123 Conflicts=5,Replaces=6,Obsoletes=7,DpkgBreaks=8,Enhances=9}; 00129 enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3, 00130 Greater=0x4,Equals=0x5,NotEquals=0x6}; 00131 }; 00132 00133 struct State 00134 { 00138 enum VerPriority {Important=1,Required=2,Standard=3,Optional=4,Extra=5}; 00139 enum PkgSelectedState {Unknown=0,Install=1,Hold=2,DeInstall=3,Purge=4}; 00140 enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3}; 00141 enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2, 00142 HalfInstalled=4,ConfigFiles=5,Installed=6, 00143 TriggersAwaited=7,TriggersPending=8}; 00144 }; 00145 00146 struct Flag 00147 { 00148 enum PkgFlags {Auto=(1<<0),Essential=(1<<3),Important=(1<<4)}; 00149 enum PkgFFlags {NotSource=(1<<0),NotAutomatic=(1<<1),ButAutomaticUpgrades=(1<<2)}; 00150 }; 00151 00152 protected: 00153 00154 // Memory mapped cache file 00155 string CacheFile; 00156 MMap ⤅ 00157 00158 unsigned long sHash(const string &S) const; 00159 unsigned long sHash(const char *S) const; 00160 00161 public: 00162 00163 // Pointers to the arrays of items 00164 Header *HeaderP; 00165 Group *GrpP; 00166 Package *PkgP; 00167 VerFile *VerFileP; 00168 DescFile *DescFileP; 00169 PackageFile *PkgFileP; 00170 Version *VerP; 00171 Description *DescP; 00172 Provides *ProvideP; 00173 Dependency *DepP; 00174 StringItem *StringItemP; 00175 char *StrP; 00176 00177 virtual bool ReMap(bool const &Errorchecks = true); 00178 inline bool Sync() {return Map.Sync();}; 00179 inline MMap &GetMap() {return Map;}; 00180 inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();}; 00181 00182 // String hashing function (512 range) 00183 inline unsigned long Hash(const string &S) const {return sHash(S);}; 00184 inline unsigned long Hash(const char *S) const {return sHash(S);}; 00185 00186 // Useful transformation things 00187 const char *Priority(unsigned char Priority); 00188 00189 // Accessors 00190 GrpIterator FindGrp(const string &Name); 00191 PkgIterator FindPkg(const string &Name); 00192 PkgIterator FindPkg(const string &Name, const string &Arch); 00193 00194 Header &Head() {return *HeaderP;}; 00195 inline GrpIterator GrpBegin(); 00196 inline GrpIterator GrpEnd(); 00197 inline PkgIterator PkgBegin(); 00198 inline PkgIterator PkgEnd(); 00199 inline PkgFileIterator FileBegin(); 00200 inline PkgFileIterator FileEnd(); 00201 00202 inline bool MultiArchCache() const { return MultiArchEnabled; }; 00203 00204 // Make me a function 00205 pkgVersioningSystem *VS; 00206 00207 // Converters 00208 static const char *CompTypeDeb(unsigned char Comp); 00209 static const char *CompType(unsigned char Comp); 00210 static const char *DepType(unsigned char Dep); 00211 00212 pkgCache(MMap *Map,bool DoMap = true); 00213 virtual ~pkgCache() {}; 00214 00215 private: 00216 bool MultiArchEnabled; 00217 PkgIterator SingleArchFindPkg(const string &Name); 00218 inline char const * const NativeArch() const; 00219 }; 00220 /*}}}*/ 00221 // Header structure /*{{{*/ 00222 struct pkgCache::Header 00223 { 00229 unsigned long Signature; 00231 short MajorVersion; 00232 short MinorVersion; 00238 bool Dirty; 00239 00247 unsigned short HeaderSz; 00248 unsigned short GroupSz; 00249 unsigned short PackageSz; 00250 unsigned short PackageFileSz; 00251 unsigned short VersionSz; 00252 unsigned short DescriptionSz; 00253 unsigned short DependencySz; 00254 unsigned short ProvidesSz; 00255 unsigned short VerFileSz; 00256 unsigned short DescFileSz; 00257 00263 unsigned long GroupCount; 00264 unsigned long PackageCount; 00265 unsigned long VersionCount; 00266 unsigned long DescriptionCount; 00267 unsigned long DependsCount; 00268 unsigned long PackageFileCount; 00269 unsigned long VerFileCount; 00270 unsigned long DescFileCount; 00271 unsigned long ProvidesCount; 00272 00277 map_ptrloc FileList; 00283 map_ptrloc StringList; 00285 map_ptrloc VerSysName; 00287 map_ptrloc Architecture; 00289 unsigned long MaxVerFileSize; 00291 unsigned long MaxDescFileSize; 00292 00301 DynamicMMap::Pool Pools[9]; 00302 00314 map_ptrloc PkgHashTable[2*1048]; 00315 map_ptrloc GrpHashTable[2*1048]; 00316 00317 bool CheckSizes(Header &Against) const; 00318 Header(); 00319 }; 00320 /*}}}*/ 00321 // Group structure /*{{{*/ 00328 struct pkgCache::Group 00329 { 00331 map_ptrloc Name; // StringItem 00332 00333 // Linked List 00335 map_ptrloc FirstPackage; // Package 00337 map_ptrloc LastPackage; // Package 00339 map_ptrloc Next; // Group 00341 unsigned int ID; 00342 00343 }; 00344 /*}}}*/ 00345 // Package structure /*{{{*/ 00357 struct pkgCache::Package 00358 { 00360 map_ptrloc Name; // StringItem 00362 map_ptrloc Arch; // StringItem 00372 map_ptrloc VersionList; // Version 00374 map_ptrloc CurrentVer; // Version 00379 map_ptrloc Section; // StringItem 00381 map_ptrloc Group; // Group the Package belongs to 00382 00383 // Linked list 00385 map_ptrloc NextPackage; // Package 00387 map_ptrloc RevDepends; // Dependency 00389 map_ptrloc ProvidesList; // Provides 00390 00391 // Install/Remove/Purge etc 00393 unsigned char SelectedState; // What 00399 unsigned char InstState; // Flags 00401 unsigned char CurrentState; // State 00402 00409 unsigned int ID; 00411 unsigned long Flags; 00412 }; 00413 /*}}}*/ 00414 // Package File structure /*{{{*/ 00420 struct pkgCache::PackageFile 00421 { 00423 map_ptrloc FileName; // StringItem 00428 map_ptrloc Archive; // StringItem 00429 map_ptrloc Codename; // StringItem 00430 map_ptrloc Component; // StringItem 00431 map_ptrloc Version; // StringItem 00432 map_ptrloc Origin; // StringItem 00433 map_ptrloc Label; // StringItem 00434 map_ptrloc Architecture; // StringItem 00436 map_ptrloc Site; // StringItem 00440 map_ptrloc IndexType; // StringItem 00446 unsigned long Size; 00448 time_t mtime; 00449 00450 /* @TODO document PackageFile::Flags */ 00451 unsigned long Flags; 00452 00453 // Linked list 00455 map_ptrloc NextFile; // PackageFile 00457 unsigned int ID; 00458 }; 00459 /*}}}*/ 00460 // VerFile structure /*{{{*/ 00465 struct pkgCache::VerFile 00466 { 00468 map_ptrloc File; // PackageFile 00470 map_ptrloc NextFile; // PkgVerFile 00472 map_ptrloc Offset; // File offset 00473 /* @TODO document pkgCache::VerFile::Size */ 00474 unsigned long Size; 00475 }; 00476 /*}}}*/ 00477 // DescFile structure /*{{{*/ 00479 struct pkgCache::DescFile 00480 { 00482 map_ptrloc File; // PackageFile 00484 map_ptrloc NextFile; // PkgVerFile 00486 map_ptrloc Offset; // File offset 00487 /* @TODO document pkgCache::DescFile::Size */ 00488 unsigned long Size; 00489 }; 00490 /*}}}*/ 00491 // Version structure /*{{{*/ 00497 struct pkgCache::Version 00498 { 00500 map_ptrloc VerStr; // StringItem 00502 map_ptrloc Section; // StringItem 00510 /* FIXME: A bitflag would be better with the next abibreak… */ 00511 enum {None, All, Foreign, Same, Allowed, AllForeign, AllAllowed} MultiArch; 00512 00519 map_ptrloc FileList; // VerFile 00521 map_ptrloc NextVer; // Version 00523 map_ptrloc DescriptionList; // Description 00525 map_ptrloc DependsList; // Dependency 00529 map_ptrloc ParentPkg; // Package 00531 map_ptrloc ProvidesList; // Provides 00532 00536 unsigned long long Size; // These are the .deb size 00538 unsigned long long InstalledSize; 00543 unsigned short Hash; 00545 unsigned int ID; 00547 unsigned char Priority; 00548 }; 00549 /*}}}*/ 00550 // Description structure /*{{{*/ 00552 struct pkgCache::Description 00553 { 00558 map_ptrloc language_code; // StringItem 00563 map_ptrloc md5sum; // StringItem 00564 00565 /* @TODO document pkgCache::Description::FileList */ 00566 map_ptrloc FileList; // DescFile 00568 map_ptrloc NextDesc; // Description 00570 map_ptrloc ParentPkg; // Package 00571 00573 unsigned int ID; 00574 }; 00575 /*}}}*/ 00576 // Dependency structure /*{{{*/ 00583 struct pkgCache::Dependency 00584 { 00586 map_ptrloc Version; // StringItem 00591 map_ptrloc Package; // Package 00593 map_ptrloc NextDepends; // Dependency 00595 map_ptrloc NextRevDepends; // Dependency 00597 map_ptrloc ParentVer; // Version 00598 00600 map_ptrloc ID; 00602 unsigned char Type; 00606 unsigned char CompareOp; 00607 }; 00608 /*}}}*/ 00609 // Provides structure /*{{{*/ 00618 struct pkgCache::Provides 00619 { 00621 map_ptrloc ParentPkg; // Package 00623 map_ptrloc Version; // Version 00629 map_ptrloc ProvideVersion; // StringItem 00631 map_ptrloc NextProvides; // Provides 00633 map_ptrloc NextPkgProv; // Provides 00634 }; 00635 /*}}}*/ 00636 // StringItem structure /*{{{*/ 00645 struct pkgCache::StringItem 00646 { 00648 map_ptrloc String; // StringItem 00650 map_ptrloc NextItem; // StringItem 00651 }; 00652 /*}}}*/ 00653 00654 00655 inline char const * const pkgCache::NativeArch() const 00656 { return StrP + HeaderP->Architecture; }; 00657 00658 #include <apt-pkg/cacheiterators.h> 00659 00660 inline pkgCache::GrpIterator pkgCache::GrpBegin() 00661 {return GrpIterator(*this);}; 00662 inline pkgCache::GrpIterator pkgCache::GrpEnd() 00663 {return GrpIterator(*this,GrpP);}; 00664 inline pkgCache::PkgIterator pkgCache::PkgBegin() 00665 {return PkgIterator(*this);}; 00666 inline pkgCache::PkgIterator pkgCache::PkgEnd() 00667 {return PkgIterator(*this,PkgP);}; 00668 inline pkgCache::PkgFileIterator pkgCache::FileBegin() 00669 {return PkgFileIterator(*this,PkgFileP + HeaderP->FileList);}; 00670 inline pkgCache::PkgFileIterator pkgCache::FileEnd() 00671 {return PkgFileIterator(*this,PkgFileP);}; 00672 00673 // Oh I wish for Real Name Space Support 00674 class pkgCache::Namespace /*{{{*/ 00675 { 00676 public: 00677 typedef pkgCache::GrpIterator GrpIterator; 00678 typedef pkgCache::PkgIterator PkgIterator; 00679 typedef pkgCache::VerIterator VerIterator; 00680 typedef pkgCache::DescIterator DescIterator; 00681 typedef pkgCache::DepIterator DepIterator; 00682 typedef pkgCache::PrvIterator PrvIterator; 00683 typedef pkgCache::PkgFileIterator PkgFileIterator; 00684 typedef pkgCache::VerFileIterator VerFileIterator; 00685 typedef pkgCache::Version Version; 00686 typedef pkgCache::Description Description; 00687 typedef pkgCache::Package Package; 00688 typedef pkgCache::Header Header; 00689 typedef pkgCache::Dep Dep; 00690 typedef pkgCache::Flag Flag; 00691 }; 00692 /*}}}*/ 00693 #endif