|
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 class pkgVersioningSystem; 00083 class pkgCache /*{{{*/ 00084 { 00085 public: 00086 // Cache element predeclarations 00087 struct Header; 00088 struct Group; 00089 struct Package; 00090 struct PackageFile; 00091 struct Version; 00092 struct Description; 00093 struct Provides; 00094 struct Dependency; 00095 struct StringItem; 00096 struct VerFile; 00097 struct DescFile; 00098 00099 // Iterators 00100 template<typename Str, typename Itr> class Iterator; 00101 class GrpIterator; 00102 class PkgIterator; 00103 class VerIterator; 00104 class DescIterator; 00105 class DepIterator; 00106 class PrvIterator; 00107 class PkgFileIterator; 00108 class VerFileIterator; 00109 class DescFileIterator; 00110 00111 class Namespace; 00112 00113 // These are all the constants used in the cache structures 00114 00115 // WARNING - if you change these lists you must also edit 00116 // the stringification in pkgcache.cc and also consider whether 00117 // the cache file will become incompatible. 00118 struct Dep 00119 { 00120 enum DepType {Depends=1,PreDepends=2,Suggests=3,Recommends=4, 00121 Conflicts=5,Replaces=6,Obsoletes=7,DpkgBreaks=8,Enhances=9}; 00127 enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3, 00128 Greater=0x4,Equals=0x5,NotEquals=0x6}; 00129 }; 00130 00131 struct State 00132 { 00136 enum VerPriority {Important=1,Required=2,Standard=3,Optional=4,Extra=5}; 00137 enum PkgSelectedState {Unknown=0,Install=1,Hold=2,DeInstall=3,Purge=4}; 00138 enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3}; 00139 enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2, 00140 HalfInstalled=4,ConfigFiles=5,Installed=6, 00141 TriggersAwaited=7,TriggersPending=8}; 00142 }; 00143 00144 struct Flag 00145 { 00146 enum PkgFlags {Auto=(1<<0),Essential=(1<<3),Important=(1<<4)}; 00147 enum PkgFFlags {NotSource=(1<<0),NotAutomatic=(1<<1),ButAutomaticUpgrades=(1<<2)}; 00148 }; 00149 00150 protected: 00151 00152 // Memory mapped cache file 00153 std::string CacheFile; 00154 MMap ⤅ 00155 00156 unsigned long sHash(const std::string &S) const; 00157 unsigned long sHash(const char *S) const; 00158 00159 public: 00160 00161 // Pointers to the arrays of items 00162 Header *HeaderP; 00163 Group *GrpP; 00164 Package *PkgP; 00165 VerFile *VerFileP; 00166 DescFile *DescFileP; 00167 PackageFile *PkgFileP; 00168 Version *VerP; 00169 Description *DescP; 00170 Provides *ProvideP; 00171 Dependency *DepP; 00172 StringItem *StringItemP; 00173 char *StrP; 00174 00175 virtual bool ReMap(bool const &Errorchecks = true); 00176 inline bool Sync() {return Map.Sync();}; 00177 inline MMap &GetMap() {return Map;}; 00178 inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();}; 00179 00180 // String hashing function (512 range) 00181 inline unsigned long Hash(const std::string &S) const {return sHash(S);}; 00182 inline unsigned long Hash(const char *S) const {return sHash(S);}; 00183 00184 // Useful transformation things 00185 const char *Priority(unsigned char Priority); 00186 00187 // Accessors 00188 GrpIterator FindGrp(const std::string &Name); 00189 PkgIterator FindPkg(const std::string &Name); 00190 PkgIterator FindPkg(const std::string &Name, const std::string &Arch); 00191 00192 Header &Head() {return *HeaderP;}; 00193 inline GrpIterator GrpBegin(); 00194 inline GrpIterator GrpEnd(); 00195 inline PkgIterator PkgBegin(); 00196 inline PkgIterator PkgEnd(); 00197 inline PkgFileIterator FileBegin(); 00198 inline PkgFileIterator FileEnd(); 00199 00200 inline bool MultiArchCache() const { return MultiArchEnabled; }; 00201 00202 // Make me a function 00203 pkgVersioningSystem *VS; 00204 00205 // Converters 00206 static const char *CompTypeDeb(unsigned char Comp); 00207 static const char *CompType(unsigned char Comp); 00208 static const char *DepType(unsigned char Dep); 00209 00210 pkgCache(MMap *Map,bool DoMap = true); 00211 virtual ~pkgCache() {}; 00212 00213 private: 00214 bool MultiArchEnabled; 00215 PkgIterator SingleArchFindPkg(const std::string &Name); 00216 inline char const * const NativeArch() const; 00217 }; 00218 /*}}}*/ 00219 // Header structure /*{{{*/ 00220 struct pkgCache::Header 00221 { 00227 unsigned long Signature; 00229 short MajorVersion; 00230 short MinorVersion; 00236 bool Dirty; 00237 00245 unsigned short HeaderSz; 00246 unsigned short GroupSz; 00247 unsigned short PackageSz; 00248 unsigned short PackageFileSz; 00249 unsigned short VersionSz; 00250 unsigned short DescriptionSz; 00251 unsigned short DependencySz; 00252 unsigned short ProvidesSz; 00253 unsigned short VerFileSz; 00254 unsigned short DescFileSz; 00255 00261 unsigned long GroupCount; 00262 unsigned long PackageCount; 00263 unsigned long VersionCount; 00264 unsigned long DescriptionCount; 00265 unsigned long DependsCount; 00266 unsigned long PackageFileCount; 00267 unsigned long VerFileCount; 00268 unsigned long DescFileCount; 00269 unsigned long ProvidesCount; 00270 00275 map_ptrloc FileList; 00281 map_ptrloc StringList; 00283 map_ptrloc VerSysName; 00285 map_ptrloc Architecture; 00287 unsigned long MaxVerFileSize; 00289 unsigned long MaxDescFileSize; 00290 00299 DynamicMMap::Pool Pools[9]; 00300 00312 map_ptrloc PkgHashTable[2*1048]; 00313 map_ptrloc GrpHashTable[2*1048]; 00314 00316 unsigned long CacheFileSize; 00317 00318 bool CheckSizes(Header &Against) const; 00319 Header(); 00320 }; 00321 /*}}}*/ 00322 // Group structure /*{{{*/ 00329 struct pkgCache::Group 00330 { 00332 map_ptrloc Name; // StringItem 00333 00334 // Linked List 00336 map_ptrloc FirstPackage; // Package 00338 map_ptrloc LastPackage; // Package 00340 map_ptrloc Next; // Group 00342 unsigned int ID; 00343 00344 }; 00345 /*}}}*/ 00346 // Package structure /*{{{*/ 00358 struct pkgCache::Package 00359 { 00361 map_ptrloc Name; // StringItem 00363 map_ptrloc Arch; // StringItem 00373 map_ptrloc VersionList; // Version 00375 map_ptrloc CurrentVer; // Version 00380 map_ptrloc Section; // StringItem 00382 map_ptrloc Group; // Group the Package belongs to 00383 00384 // Linked list 00386 map_ptrloc NextPackage; // Package 00388 map_ptrloc RevDepends; // Dependency 00390 map_ptrloc ProvidesList; // Provides 00391 00392 // Install/Remove/Purge etc 00394 unsigned char SelectedState; // What 00400 unsigned char InstState; // Flags 00402 unsigned char CurrentState; // State 00403 00410 unsigned int ID; 00412 unsigned long Flags; 00413 }; 00414 /*}}}*/ 00415 // Package File structure /*{{{*/ 00421 struct pkgCache::PackageFile 00422 { 00424 map_ptrloc FileName; // StringItem 00429 map_ptrloc Archive; // StringItem 00430 map_ptrloc Codename; // StringItem 00431 map_ptrloc Component; // StringItem 00432 map_ptrloc Version; // StringItem 00433 map_ptrloc Origin; // StringItem 00434 map_ptrloc Label; // StringItem 00435 map_ptrloc Architecture; // StringItem 00437 map_ptrloc Site; // StringItem 00441 map_ptrloc IndexType; // StringItem 00447 unsigned long Size; 00449 time_t mtime; 00450 00451 /* @TODO document PackageFile::Flags */ 00452 unsigned long Flags; 00453 00454 // Linked list 00456 map_ptrloc NextFile; // PackageFile 00458 unsigned int ID; 00459 }; 00460 /*}}}*/ 00461 // VerFile structure /*{{{*/ 00466 struct pkgCache::VerFile 00467 { 00469 map_ptrloc File; // PackageFile 00471 map_ptrloc NextFile; // PkgVerFile 00473 map_ptrloc Offset; // File offset 00474 /* @TODO document pkgCache::VerFile::Size */ 00475 unsigned long Size; 00476 }; 00477 /*}}}*/ 00478 // DescFile structure /*{{{*/ 00480 struct pkgCache::DescFile 00481 { 00483 map_ptrloc File; // PackageFile 00485 map_ptrloc NextFile; // PkgVerFile 00487 map_ptrloc Offset; // File offset 00488 /* @TODO document pkgCache::DescFile::Size */ 00489 unsigned long Size; 00490 }; 00491 /*}}}*/ 00492 // Version structure /*{{{*/ 00498 struct pkgCache::Version 00499 { 00501 map_ptrloc VerStr; // StringItem 00503 map_ptrloc Section; // StringItem 00504 00506 enum VerMultiArch { None = 0, 00507 All = (1<<0), 00508 Foreign = (1<<1), 00509 Same = (1<<2), 00510 Allowed = (1<<3), 00511 AllForeign = All | Foreign, 00512 AllAllowed = All | Allowed }; 00517 unsigned char MultiArch; 00518 00525 map_ptrloc FileList; // VerFile 00527 map_ptrloc NextVer; // Version 00529 map_ptrloc DescriptionList; // Description 00531 map_ptrloc DependsList; // Dependency 00535 map_ptrloc ParentPkg; // Package 00537 map_ptrloc ProvidesList; // Provides 00538 00542 unsigned long long Size; // These are the .deb size 00544 unsigned long long InstalledSize; 00549 unsigned short Hash; 00551 unsigned int ID; 00553 unsigned char Priority; 00554 }; 00555 /*}}}*/ 00556 // Description structure /*{{{*/ 00558 struct pkgCache::Description 00559 { 00564 map_ptrloc language_code; // StringItem 00569 map_ptrloc md5sum; // StringItem 00570 00571 /* @TODO document pkgCache::Description::FileList */ 00572 map_ptrloc FileList; // DescFile 00574 map_ptrloc NextDesc; // Description 00576 map_ptrloc ParentPkg; // Package 00577 00579 unsigned int ID; 00580 }; 00581 /*}}}*/ 00582 // Dependency structure /*{{{*/ 00589 struct pkgCache::Dependency 00590 { 00592 map_ptrloc Version; // StringItem 00597 map_ptrloc Package; // Package 00599 map_ptrloc NextDepends; // Dependency 00601 map_ptrloc NextRevDepends; // Dependency 00603 map_ptrloc ParentVer; // Version 00604 00606 map_ptrloc ID; 00608 unsigned char Type; 00612 unsigned char CompareOp; 00613 }; 00614 /*}}}*/ 00615 // Provides structure /*{{{*/ 00624 struct pkgCache::Provides 00625 { 00627 map_ptrloc ParentPkg; // Package 00629 map_ptrloc Version; // Version 00635 map_ptrloc ProvideVersion; // StringItem 00637 map_ptrloc NextProvides; // Provides 00639 map_ptrloc NextPkgProv; // Provides 00640 }; 00641 /*}}}*/ 00642 // StringItem structure /*{{{*/ 00651 struct pkgCache::StringItem 00652 { 00654 map_ptrloc String; // StringItem 00656 map_ptrloc NextItem; // StringItem 00657 }; 00658 /*}}}*/ 00659 00660 00661 inline char const * const pkgCache::NativeArch() const 00662 { return StrP + HeaderP->Architecture; }; 00663 00664 #include <apt-pkg/cacheiterators.h> 00665 00666 inline pkgCache::GrpIterator pkgCache::GrpBegin() 00667 {return GrpIterator(*this);}; 00668 inline pkgCache::GrpIterator pkgCache::GrpEnd() 00669 {return GrpIterator(*this,GrpP);}; 00670 inline pkgCache::PkgIterator pkgCache::PkgBegin() 00671 {return PkgIterator(*this);}; 00672 inline pkgCache::PkgIterator pkgCache::PkgEnd() 00673 {return PkgIterator(*this,PkgP);}; 00674 inline pkgCache::PkgFileIterator pkgCache::FileBegin() 00675 {return PkgFileIterator(*this,PkgFileP + HeaderP->FileList);}; 00676 inline pkgCache::PkgFileIterator pkgCache::FileEnd() 00677 {return PkgFileIterator(*this,PkgFileP);}; 00678 00679 // Oh I wish for Real Name Space Support 00680 class pkgCache::Namespace /*{{{*/ 00681 { 00682 public: 00683 typedef pkgCache::GrpIterator GrpIterator; 00684 typedef pkgCache::PkgIterator PkgIterator; 00685 typedef pkgCache::VerIterator VerIterator; 00686 typedef pkgCache::DescIterator DescIterator; 00687 typedef pkgCache::DepIterator DepIterator; 00688 typedef pkgCache::PrvIterator PrvIterator; 00689 typedef pkgCache::PkgFileIterator PkgFileIterator; 00690 typedef pkgCache::VerFileIterator VerFileIterator; 00691 typedef pkgCache::Version Version; 00692 typedef pkgCache::Description Description; 00693 typedef pkgCache::Package Package; 00694 typedef pkgCache::Header Header; 00695 typedef pkgCache::Dep Dep; 00696 typedef pkgCache::Flag Flag; 00697 }; 00698 /*}}}*/ 00699 #endif
1.7.4