00001
00002
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
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
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
00116
00117
00118
00119
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
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
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
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
00187 const char *Priority(unsigned char Priority);
00188
00189
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
00205 pkgVersioningSystem *VS;
00206
00207
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 };
00219
00220
00221 struct pkgCache::Header
00222 {
00228 unsigned long Signature;
00230 short MajorVersion;
00231 short MinorVersion;
00237 bool Dirty;
00238
00246 unsigned short HeaderSz;
00247 unsigned short GroupSz;
00248 unsigned short PackageSz;
00249 unsigned short PackageFileSz;
00250 unsigned short VersionSz;
00251 unsigned short DescriptionSz;
00252 unsigned short DependencySz;
00253 unsigned short ProvidesSz;
00254 unsigned short VerFileSz;
00255 unsigned short DescFileSz;
00256
00262 unsigned long GroupCount;
00263 unsigned long PackageCount;
00264 unsigned long VersionCount;
00265 unsigned long DescriptionCount;
00266 unsigned long DependsCount;
00267 unsigned long PackageFileCount;
00268 unsigned long VerFileCount;
00269 unsigned long DescFileCount;
00270 unsigned long ProvidesCount;
00271
00276 map_ptrloc FileList;
00282 map_ptrloc StringList;
00284 map_ptrloc VerSysName;
00286 map_ptrloc Architecture;
00288 unsigned long MaxVerFileSize;
00290 unsigned long MaxDescFileSize;
00291
00300 DynamicMMap::Pool Pools[9];
00301
00313 map_ptrloc PkgHashTable[2*1048];
00314 map_ptrloc GrpHashTable[2*1048];
00315
00316 bool CheckSizes(Header &Against) const;
00317 Header();
00318 };
00319
00320
00327 struct pkgCache::Group
00328 {
00330 map_ptrloc Name;
00331
00332
00334 map_ptrloc FirstPackage;
00336 map_ptrloc LastPackage;
00338 map_ptrloc Next;
00340 unsigned int ID;
00341
00342 };
00343
00344
00356 struct pkgCache::Package
00357 {
00359 map_ptrloc Name;
00361 map_ptrloc Arch;
00371 map_ptrloc VersionList;
00373 map_ptrloc CurrentVer;
00378 map_ptrloc Section;
00380 map_ptrloc Group;
00381
00382
00384 map_ptrloc NextPackage;
00386 map_ptrloc RevDepends;
00388 map_ptrloc ProvidesList;
00389
00390
00392 unsigned char SelectedState;
00398 unsigned char InstState;
00400 unsigned char CurrentState;
00401
00408 unsigned int ID;
00410 unsigned long Flags;
00411 };
00412
00413
00419 struct pkgCache::PackageFile
00420 {
00422 map_ptrloc FileName;
00427 map_ptrloc Archive;
00428 map_ptrloc Codename;
00429 map_ptrloc Component;
00430 map_ptrloc Version;
00431 map_ptrloc Origin;
00432 map_ptrloc Label;
00433 map_ptrloc Architecture;
00435 map_ptrloc Site;
00439 map_ptrloc IndexType;
00445 unsigned long Size;
00447 time_t mtime;
00448
00449
00450 unsigned long Flags;
00451
00452
00454 map_ptrloc NextFile;
00456 unsigned int ID;
00457 };
00458
00459
00464 struct pkgCache::VerFile
00465 {
00467 map_ptrloc File;
00469 map_ptrloc NextFile;
00471 map_ptrloc Offset;
00472
00473 unsigned long Size;
00474 };
00475
00476
00478 struct pkgCache::DescFile
00479 {
00481 map_ptrloc File;
00483 map_ptrloc NextFile;
00485 map_ptrloc Offset;
00486
00487 unsigned long Size;
00488 };
00489
00490
00496 struct pkgCache::Version
00497 {
00499 map_ptrloc VerStr;
00501 map_ptrloc Section;
00510 enum {None, All, Foreign, Same, Allowed} MultiArch;
00511
00518 map_ptrloc FileList;
00520 map_ptrloc NextVer;
00522 map_ptrloc DescriptionList;
00524 map_ptrloc DependsList;
00528 map_ptrloc ParentPkg;
00530 map_ptrloc ProvidesList;
00531
00535 unsigned long long Size;
00537 unsigned long long InstalledSize;
00542 unsigned short Hash;
00544 unsigned int ID;
00546 unsigned char Priority;
00547 };
00548
00549
00551 struct pkgCache::Description
00552 {
00557 map_ptrloc language_code;
00562 map_ptrloc md5sum;
00563
00564
00565 map_ptrloc FileList;
00567 map_ptrloc NextDesc;
00569 map_ptrloc ParentPkg;
00570
00572 unsigned int ID;
00573 };
00574
00575
00582 struct pkgCache::Dependency
00583 {
00585 map_ptrloc Version;
00590 map_ptrloc Package;
00592 map_ptrloc NextDepends;
00594 map_ptrloc NextRevDepends;
00596 map_ptrloc ParentVer;
00597
00599 map_ptrloc ID;
00601 unsigned char Type;
00605 unsigned char CompareOp;
00606 };
00607
00608
00617 struct pkgCache::Provides
00618 {
00620 map_ptrloc ParentPkg;
00622 map_ptrloc Version;
00628 map_ptrloc ProvideVersion;
00630 map_ptrloc NextProvides;
00632 map_ptrloc NextPkgProv;
00633 };
00634
00635
00644 struct pkgCache::StringItem
00645 {
00647 map_ptrloc String;
00649 map_ptrloc NextItem;
00650 };
00651
00652 #include <apt-pkg/cacheiterators.h>
00653
00654 inline pkgCache::GrpIterator pkgCache::GrpBegin()
00655 {return GrpIterator(*this);};
00656 inline pkgCache::GrpIterator pkgCache::GrpEnd()
00657 {return GrpIterator(*this,GrpP);};
00658 inline pkgCache::PkgIterator pkgCache::PkgBegin()
00659 {return PkgIterator(*this);};
00660 inline pkgCache::PkgIterator pkgCache::PkgEnd()
00661 {return PkgIterator(*this,PkgP);};
00662 inline pkgCache::PkgFileIterator pkgCache::FileBegin()
00663 {return PkgFileIterator(*this,PkgFileP + HeaderP->FileList);};
00664 inline pkgCache::PkgFileIterator pkgCache::FileEnd()
00665 {return PkgFileIterator(*this,PkgFileP);};
00666
00667
00668 class pkgCache::Namespace
00669 {
00670 public:
00671 typedef pkgCache::GrpIterator GrpIterator;
00672 typedef pkgCache::PkgIterator PkgIterator;
00673 typedef pkgCache::VerIterator VerIterator;
00674 typedef pkgCache::DescIterator DescIterator;
00675 typedef pkgCache::DepIterator DepIterator;
00676 typedef pkgCache::PrvIterator PrvIterator;
00677 typedef pkgCache::PkgFileIterator PkgFileIterator;
00678 typedef pkgCache::VerFileIterator VerFileIterator;
00679 typedef pkgCache::Version Version;
00680 typedef pkgCache::Description Description;
00681 typedef pkgCache::Package Package;
00682 typedef pkgCache::Header Header;
00683 typedef pkgCache::Dep Dep;
00684 typedef pkgCache::Flag Flag;
00685 };
00686
00687 #endif