apt  @VERSION@
pkgcache.h
Go to the documentation of this file.
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 &Map;
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