- initial import of revision 374 from cnc
[apt.git] / apt-pkg / pkgcachegen.h
1 // -*- mode: cpp; mode: fold -*-
2 // Description                                                          /*{{{*/
3 // $Id: pkgcachegen.h,v 1.3 2002/07/25 18:07:18 niemeyer Exp $
4 /* ######################################################################
5    
6    Package Cache Generator - Generator for the cache structure.
7    
8    This builds the cache structure from the abstract package list parser. 
9    Each archive source has it's own list parser that is instantiated by
10    the caller to provide data for the generator. 
11    
12    Parts of the cache are created by this generator class while other
13    parts are created by the list parser. The list parser is responsible
14    for creating version, depends and provides structures, and some of
15    their contents
16    
17    ##################################################################### */
18                                                                         /*}}}*/
19 #ifndef PKGLIB_PKGCACHEGEN_H
20 #define PKGLIB_PKGCACHEGEN_H
21
22 #ifdef __GNUG__
23 #pragma interface "apt-pkg/pkgcachegen.h"
24 #endif 
25
26 #include <apt-pkg/pkgcache.h>
27
28 class pkgSourceList;
29 class OpProgress;
30 class MMap;
31 class pkgIndexFile;
32
33 class pkgCacheGenerator
34 {
35    private:
36    
37    pkgCache::StringItem *UniqHash[26];
38    
39    public:
40    
41    class ListParser;
42    friend class ListParser;
43    
44    protected:
45    
46    DynamicMMap &Map;
47    pkgCache Cache;
48    OpProgress *Progress;
49    
50    string PkgFileName;
51    pkgCache::PackageFile *CurrentFile;
52
53    // Flag file dependencies
54    bool FoundFileDeps;
55    
56    bool NewFileVer(pkgCache::VerIterator &Ver,ListParser &List);
57    unsigned long NewVersion(pkgCache::VerIterator &Ver,string VerStr,unsigned long Next);
58
59    public:
60
61    // CNC:2003-02-27 - We need this in rpmListParser.
62    bool NewPackage(pkgCache::PkgIterator &Pkg,string Pkg);
63
64    unsigned long WriteUniqString(const char *S,unsigned int Size);
65    inline unsigned long WriteUniqString(string S) {return WriteUniqString(S.c_str(),S.length());};
66
67    void DropProgress() {Progress = 0;};
68    bool SelectFile(string File,string Site,pkgIndexFile const &Index,
69                    unsigned long Flags = 0);
70    bool MergeList(ListParser &List,pkgCache::VerIterator *Ver = 0);
71    inline pkgCache &GetCache() {return Cache;};
72    inline pkgCache::PkgFileIterator GetCurFile() 
73          {return pkgCache::PkgFileIterator(Cache,CurrentFile);};
74
75    bool HasFileDeps() {return FoundFileDeps;};
76    bool MergeFileProvides(ListParser &List);
77
78    // CNC:2003-03-18
79    inline void ResetFileDeps() {FoundFileDeps = false;};
80       
81    pkgCacheGenerator(DynamicMMap *Map,OpProgress *Progress);
82    ~pkgCacheGenerator();
83 };
84
85 // This is the abstract package list parser class.
86 class pkgCacheGenerator::ListParser
87 {
88    // Some cache items
89    pkgCache::VerIterator OldDepVer;
90    map_ptrloc *OldDepLast;
91
92    // Flag file dependencies
93    bool FoundFileDeps;
94       
95    protected:
96
97    // CNC:2003-02-27 - We need Owner in rpmListParser.
98    pkgCacheGenerator *Owner;
99    friend class pkgCacheGenerator;
100
101    inline unsigned long WriteUniqString(string S) {return Owner->WriteUniqString(S);};
102    inline unsigned long WriteUniqString(const char *S,unsigned int Size) {return Owner->WriteUniqString(S,Size);};
103    inline unsigned long WriteString(string S) {return Owner->Map.WriteString(S);};
104    inline unsigned long WriteString(const char *S,unsigned int Size) {return Owner->Map.WriteString(S,Size);};
105    bool NewDepends(pkgCache::VerIterator Ver,string Package,
106                    string Version,unsigned int Op,
107                    unsigned int Type);
108    bool NewProvides(pkgCache::VerIterator Ver,string Package,string Version);
109    
110    public:
111    
112    // These all operate against the current section
113    virtual string Package() = 0;
114    virtual string Version() = 0;
115    // CNC:2002-07-09
116    virtual string Architecture() {return string();};
117    virtual bool NewVersion(pkgCache::VerIterator Ver) = 0;
118    virtual unsigned short VersionHash() = 0;
119    virtual bool UsePackage(pkgCache::PkgIterator Pkg,
120                            pkgCache::VerIterator Ver) = 0;
121    virtual unsigned long Offset() = 0;
122    virtual unsigned long Size() = 0;
123
124    // CNC:2003-02-16 - If this is false, the Size of the pkgIndexFile must
125    //                  provide the number of elements, since a sequential
126    //                  counter will be used to verify progress.
127    virtual bool OrderedOffset() {return true;};
128
129    // CNC:2003-02-20 - This method will help on package ordering tasks,
130    //                  ensuring that if a package with the same version
131    //                  is installed, it won't be unexpectedly downloaded,
132    //                  even if with a "better" architecture or different
133    //                  dependencies.
134    virtual bool IsDatabase() {return false;};
135    
136    virtual bool Step() = 0;
137    
138    inline bool HasFileDeps() {return FoundFileDeps;};
139    virtual bool CollectFileProvides(pkgCache &Cache,
140                                     pkgCache::VerIterator Ver) {return true;};
141
142    ListParser() : FoundFileDeps(false) {};
143    virtual ~ListParser() {};
144 };
145
146 bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress,
147                         MMap **OutMap = 0,bool AllowMem = false);
148 bool pkgMakeOnlyStatusCache(OpProgress &Progress,DynamicMMap **OutMap);
149
150 #ifdef APT_COMPATIBILITY
151 #if APT_COMPATIBILITY != 986
152 #warning "Using APT_COMPATIBILITY"
153 #endif
154 MMap *pkgMakeStatusCacheMem(pkgSourceList &List,OpProgress &Progress)
155 {
156    MMap *Map = 0;
157    if (pkgMakeStatusCache(List,Progress,&Map,true) == false)
158       return 0;
159    return Map;
160 }
161 #endif
162
163 #endif