apt
@VERSION@
|
00001 // -*- mode: cpp; mode: fold -*- 00002 // Description /*{{{*/ 00073 /*}}}*/ 00074 #ifndef PKGLIB_PKGCACHE_H 00075 #define PKGLIB_PKGCACHE_H 00076 00077 #include <string> 00078 #include <time.h> 00079 #include <apt-pkg/mmap.h> 00080 00081 #ifndef APT_8_CLEANER_HEADERS 00082 using std::string; 00083 #endif 00084 00085 class pkgVersioningSystem; 00086 class pkgCache /*{{{*/ 00087 { 00088 public: 00089 // Cache element predeclarations 00090 struct Header; 00091 struct Group; 00092 struct Package; 00093 struct PackageFile; 00094 struct Version; 00095 struct Description; 00096 struct Provides; 00097 struct Dependency; 00098 struct StringItem; 00099 struct VerFile; 00100 struct DescFile; 00101 00102 // Iterators 00103 template<typename Str, typename Itr> class Iterator; 00104 class GrpIterator; 00105 class PkgIterator; 00106 class VerIterator; 00107 class DescIterator; 00108 class DepIterator; 00109 class PrvIterator; 00110 class PkgFileIterator; 00111 class VerFileIterator; 00112 class DescFileIterator; 00113 00114 class Namespace; 00115 00116 // These are all the constants used in the cache structures 00117 00118 // WARNING - if you change these lists you must also edit 00119 // the stringification in pkgcache.cc and also consider whether 00120 // the cache file will become incompatible. 00121 struct Dep 00122 { 00123 enum DepType {Depends=1,PreDepends=2,Suggests=3,Recommends=4, 00124 Conflicts=5,Replaces=6,Obsoletes=7,DpkgBreaks=8,Enhances=9}; 00130 enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3, 00131 Greater=0x4,Equals=0x5,NotEquals=0x6}; 00132 }; 00133 00134 struct State 00135 { 00139 enum VerPriority {Important=1,Required=2,Standard=3,Optional=4,Extra=5}; 00140 enum PkgSelectedState {Unknown=0,Install=1,Hold=2,DeInstall=3,Purge=4}; 00141 enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3}; 00142 enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2, 00143 HalfInstalled=4,ConfigFiles=5,Installed=6, 00144 TriggersAwaited=7,TriggersPending=8}; 00145 }; 00146 00147 struct Flag 00148 { 00149 enum PkgFlags {Auto=(1<<0),Essential=(1<<3),Important=(1<<4)}; 00150 enum PkgFFlags {NotSource=(1<<0),NotAutomatic=(1<<1),ButAutomaticUpgrades=(1<<2)}; 00151 }; 00152 00153 protected: 00154 00155 // Memory mapped cache file 00156 std::string CacheFile; 00157 MMap ⤅ 00158 00159 unsigned long sHash(const std::string &S) const; 00160 unsigned long sHash(const char *S) const; 00161 00162 public: 00163 00164 // Pointers to the arrays of items 00165 Header *HeaderP; 00166 Group *GrpP; 00167 Package *PkgP; 00168 VerFile *VerFileP; 00169 DescFile *DescFileP; 00170 PackageFile *PkgFileP; 00171 Version *VerP; 00172 Description *DescP; 00173 Provides *ProvideP; 00174 Dependency *DepP; 00175 StringItem *StringItemP; 00176 char *StrP; 00177 00178 virtual bool ReMap(bool const &Errorchecks = true); 00179 inline bool Sync() {return Map.Sync();}; 00180 inline MMap &GetMap() {return Map;}; 00181 inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();}; 00182 00183 // String hashing function (512 range) 00184 inline unsigned long Hash(const std::string &S) const {return sHash(S);}; 00185 inline unsigned long Hash(const char *S) const {return sHash(S);}; 00186 00187 // Useful transformation things 00188 const char *Priority(unsigned char Priority); 00189 00190 // Accessors 00191 GrpIterator FindGrp(const std::string &Name); 00192 PkgIterator FindPkg(const std::string &Name); 00193 PkgIterator FindPkg(const std::string &Name, const std::string &Arch); 00194 00195 Header &Head() {return *HeaderP;}; 00196 inline GrpIterator GrpBegin(); 00197 inline GrpIterator GrpEnd(); 00198 inline PkgIterator PkgBegin(); 00199 inline PkgIterator PkgEnd(); 00200 inline PkgFileIterator FileBegin(); 00201 inline PkgFileIterator FileEnd(); 00202 00203 inline bool MultiArchCache() const { return MultiArchEnabled; }; 00204 inline char const * const NativeArch() const; 00205 00206 // Make me a function 00207 pkgVersioningSystem *VS; 00208 00209 // Converters 00210 static const char *CompTypeDeb(unsigned char Comp); 00211 static const char *CompType(unsigned char Comp); 00212 static const char *DepType(unsigned char Dep); 00213 00214 pkgCache(MMap *Map,bool DoMap = true); 00215 virtual ~pkgCache() {}; 00216 00217 private: 00218 bool MultiArchEnabled; 00219 PkgIterator SingleArchFindPkg(const std::string &Name); 00220 }; 00221 /*}}}*/ 00222 // Header structure /*{{{*/ 00223 struct pkgCache::Header 00224 { 00230 unsigned long Signature; 00232 short MajorVersion; 00233 short MinorVersion; 00239 bool Dirty; 00240 00248 unsigned short HeaderSz; 00249 unsigned short GroupSz; 00250 unsigned short PackageSz; 00251 unsigned short PackageFileSz; 00252 unsigned short VersionSz; 00253 unsigned short DescriptionSz; 00254 unsigned short DependencySz; 00255 unsigned short ProvidesSz; 00256 unsigned short VerFileSz; 00257 unsigned short DescFileSz; 00258 00264 unsigned long GroupCount; 00265 unsigned long PackageCount; 00266 unsigned long VersionCount; 00267 unsigned long DescriptionCount; 00268 unsigned long DependsCount; 00269 unsigned long PackageFileCount; 00270 unsigned long VerFileCount; 00271 unsigned long DescFileCount; 00272 unsigned long ProvidesCount; 00273 00278 map_ptrloc FileList; 00284 map_ptrloc StringList; 00286 map_ptrloc VerSysName; 00288 map_ptrloc Architecture; 00290 unsigned long MaxVerFileSize; 00292 unsigned long MaxDescFileSize; 00293 00302 DynamicMMap::Pool Pools[9]; 00303 00315 map_ptrloc PkgHashTable[2*1048]; 00316 map_ptrloc GrpHashTable[2*1048]; 00317 00319 unsigned long CacheFileSize; 00320 00321 bool CheckSizes(Header &Against) const; 00322 Header(); 00323 }; 00324 /*}}}*/ 00325 // Group structure /*{{{*/ 00332 struct pkgCache::Group 00333 { 00335 map_ptrloc Name; // StringItem 00336 00337 // Linked List 00339 map_ptrloc FirstPackage; // Package 00341 map_ptrloc LastPackage; // Package 00343 map_ptrloc Next; // Group 00345 unsigned int ID; 00346 00347 }; 00348 /*}}}*/ 00349 // Package structure /*{{{*/ 00361 struct pkgCache::Package 00362 { 00364 map_ptrloc Name; // StringItem 00366 map_ptrloc Arch; // StringItem 00376 map_ptrloc VersionList; // Version 00378 map_ptrloc CurrentVer; // Version 00383 map_ptrloc Section; // StringItem 00385 map_ptrloc Group; // Group the Package belongs to 00386 00387 // Linked list 00389 map_ptrloc NextPackage; // Package 00391 map_ptrloc RevDepends; // Dependency 00393 map_ptrloc ProvidesList; // Provides 00394 00395 // Install/Remove/Purge etc 00397 unsigned char SelectedState; // What 00403 unsigned char InstState; // Flags 00405 unsigned char CurrentState; // State 00406 00413 unsigned int ID; 00415 unsigned long Flags; 00416 }; 00417 /*}}}*/ 00418 // Package File structure /*{{{*/ 00424 struct pkgCache::PackageFile 00425 { 00427 map_ptrloc FileName; // StringItem 00432 map_ptrloc Archive; // StringItem 00433 map_ptrloc Codename; // StringItem 00434 map_ptrloc Component; // StringItem 00435 map_ptrloc Version; // StringItem 00436 map_ptrloc Origin; // StringItem 00437 map_ptrloc Label; // StringItem 00438 map_ptrloc Architecture; // StringItem 00440 map_ptrloc Site; // StringItem 00444 map_ptrloc IndexType; // StringItem 00450 unsigned long Size; 00452 time_t mtime; 00453 00454 /* @TODO document PackageFile::Flags */ 00455 unsigned long Flags; 00456 00457 // Linked list 00459 map_ptrloc NextFile; // PackageFile 00461 unsigned int ID; 00462 }; 00463 /*}}}*/ 00464 // VerFile structure /*{{{*/ 00469 struct pkgCache::VerFile 00470 { 00472 map_ptrloc File; // PackageFile 00474 map_ptrloc NextFile; // PkgVerFile 00476 map_ptrloc Offset; // File offset 00477 /* @TODO document pkgCache::VerFile::Size */ 00478 unsigned long Size; 00479 }; 00480 /*}}}*/ 00481 // DescFile structure /*{{{*/ 00483 struct pkgCache::DescFile 00484 { 00486 map_ptrloc File; // PackageFile 00488 map_ptrloc NextFile; // PkgVerFile 00490 map_ptrloc Offset; // File offset 00491 /* @TODO document pkgCache::DescFile::Size */ 00492 unsigned long Size; 00493 }; 00494 /*}}}*/ 00495 // Version structure /*{{{*/ 00501 struct pkgCache::Version 00502 { 00504 map_ptrloc VerStr; // StringItem 00506 map_ptrloc Section; // StringItem 00507 00509 enum VerMultiArch { None = 0, 00510 All = (1<<0), 00511 Foreign = (1<<1), 00512 Same = (1<<2), 00513 Allowed = (1<<3), 00514 AllForeign = All | Foreign, 00515 AllAllowed = All | Allowed }; 00520 unsigned char MultiArch; 00521 00528 map_ptrloc FileList; // VerFile 00530 map_ptrloc NextVer; // Version 00532 map_ptrloc DescriptionList; // Description 00534 map_ptrloc DependsList; // Dependency 00538 map_ptrloc ParentPkg; // Package 00540 map_ptrloc ProvidesList; // Provides 00541 00545 unsigned long long Size; // These are the .deb size 00547 unsigned long long InstalledSize; 00552 unsigned short Hash; 00554 unsigned int ID; 00556 unsigned char Priority; 00557 }; 00558 /*}}}*/ 00559 // Description structure /*{{{*/ 00561 struct pkgCache::Description 00562 { 00567 map_ptrloc language_code; // StringItem 00572 map_ptrloc md5sum; // StringItem 00573 00574 /* @TODO document pkgCache::Description::FileList */ 00575 map_ptrloc FileList; // DescFile 00577 map_ptrloc NextDesc; // Description 00579 map_ptrloc ParentPkg; // Package 00580 00582 unsigned int ID; 00583 }; 00584 /*}}}*/ 00585 // Dependency structure /*{{{*/ 00592 struct pkgCache::Dependency 00593 { 00595 map_ptrloc Version; // StringItem 00600 map_ptrloc Package; // Package 00602 map_ptrloc NextDepends; // Dependency 00604 map_ptrloc NextRevDepends; // Dependency 00606 map_ptrloc ParentVer; // Version 00607 00609 map_ptrloc ID; 00611 unsigned char Type; 00615 unsigned char CompareOp; 00616 }; 00617 /*}}}*/ 00618 // Provides structure /*{{{*/ 00627 struct pkgCache::Provides 00628 { 00630 map_ptrloc ParentPkg; // Package 00632 map_ptrloc Version; // Version 00638 map_ptrloc ProvideVersion; // StringItem 00640 map_ptrloc NextProvides; // Provides 00642 map_ptrloc NextPkgProv; // Provides 00643 }; 00644 /*}}}*/ 00645 // StringItem structure /*{{{*/ 00654 struct pkgCache::StringItem 00655 { 00657 map_ptrloc String; // StringItem 00659 map_ptrloc NextItem; // StringItem 00660 }; 00661 /*}}}*/ 00662 00663 00664 inline char const * const pkgCache::NativeArch() const 00665 { return StrP + HeaderP->Architecture; }; 00666 00667 #include <apt-pkg/cacheiterators.h> 00668 00669 inline pkgCache::GrpIterator pkgCache::GrpBegin() 00670 {return GrpIterator(*this);}; 00671 inline pkgCache::GrpIterator pkgCache::GrpEnd() 00672 {return GrpIterator(*this,GrpP);}; 00673 inline pkgCache::PkgIterator pkgCache::PkgBegin() 00674 {return PkgIterator(*this);}; 00675 inline pkgCache::PkgIterator pkgCache::PkgEnd() 00676 {return PkgIterator(*this,PkgP);}; 00677 inline pkgCache::PkgFileIterator pkgCache::FileBegin() 00678 {return PkgFileIterator(*this,PkgFileP + HeaderP->FileList);}; 00679 inline pkgCache::PkgFileIterator pkgCache::FileEnd() 00680 {return PkgFileIterator(*this,PkgFileP);}; 00681 00682 // Oh I wish for Real Name Space Support 00683 class pkgCache::Namespace /*{{{*/ 00684 { 00685 public: 00686 typedef pkgCache::GrpIterator GrpIterator; 00687 typedef pkgCache::PkgIterator PkgIterator; 00688 typedef pkgCache::VerIterator VerIterator; 00689 typedef pkgCache::DescIterator DescIterator; 00690 typedef pkgCache::DepIterator DepIterator; 00691 typedef pkgCache::PrvIterator PrvIterator; 00692 typedef pkgCache::PkgFileIterator PkgFileIterator; 00693 typedef pkgCache::VerFileIterator VerFileIterator; 00694 typedef pkgCache::Version Version; 00695 typedef pkgCache::Description Description; 00696 typedef pkgCache::Package Package; 00697 typedef pkgCache::Header Header; 00698 typedef pkgCache::Dep Dep; 00699 typedef pkgCache::Flag Flag; 00700 }; 00701 /*}}}*/ 00702 #endif