- When stepping through source records skip binaries
[apt.git] / apt-pkg / rpm / rpmhandler.h
1
2 /* ######################################################################
3   
4    RPM database and hdlist related handling
5
6    ######################################################################
7  */
8
9
10 #ifndef PKGLIB_RPMHANDLER_H
11 #define PKGLIB_RPMHANDLER_H
12
13 #include <apt-pkg/fileutl.h>
14 #include <libxml/parser.h>
15 #include <libxml/tree.h>
16 #include <libxml/xmlreader.h>
17
18 #include <rpm/rpmlib.h>
19 #include <rpm/rpmmacro.h>
20
21 #include <vector>
22
23 // Our Extra RPM tags. These should not be accessed directly. Use
24 // the methods in RPMHandler instead.
25 #define CRPMTAG_FILENAME          (rpmTag)1000000
26 #define CRPMTAG_FILESIZE          (rpmTag)1000001
27 #define CRPMTAG_MD5               (rpmTag)1000005
28 #define CRPMTAG_SHA1              (rpmTag)1000006
29
30 #define CRPMTAG_DIRECTORY         (rpmTag)1000010
31 #define CRPMTAG_BINARY            (rpmTag)1000011
32
33 #define CRPMTAG_UPDATE_SUMMARY    (rpmTag)1000020
34 #define CRPMTAG_UPDATE_IMPORTANCE (rpmTag)1000021
35 #define CRPMTAG_UPDATE_DATE       (rpmTag)1000022
36 #define CRPMTAG_UPDATE_URL        (rpmTag)1000023
37
38 using namespace std;
39
40 struct Dependency
41 {
42    string Name;
43    string Version;
44    unsigned int Op;
45    unsigned int Type;
46 };
47
48
49 class RPMHandler
50 {
51    protected:
52
53    unsigned int iOffset;
54    unsigned int iSize;
55    Header HeaderP;
56    string ID;
57
58    string GetSTag(rpmTag Tag);
59    unsigned long GetITag(rpmTag Tag);
60
61
62    public:
63
64    // Return a unique ID for that handler. Actually, implemented used
65    // the file/dir name.
66    virtual string GetID() { return ID; };
67
68    virtual bool Skip() = 0;
69    virtual bool Jump(unsigned int Offset) = 0;
70    virtual void Rewind() = 0;
71    inline unsigned Offset() {return iOffset;};
72    virtual bool OrderedOffset() {return true;};
73    inline unsigned Size() {return iSize;};
74    virtual bool IsDatabase() = 0;
75
76    virtual string FileName() {return "";};
77    virtual string Directory() {return "";};
78    virtual unsigned long FileSize() {return 1;};
79    virtual string MD5Sum() {return "";};
80    virtual string SHA1Sum() {return "";};
81    virtual bool ProvideFileName() {return false;};
82
83    virtual string Name() {return GetSTag(RPMTAG_NAME);};
84    virtual string Arch() {return GetSTag(RPMTAG_ARCH);};
85    virtual string Epoch();
86    virtual string Version() {return GetSTag(RPMTAG_VERSION);};
87    virtual string Release() {return GetSTag(RPMTAG_RELEASE);};
88    virtual string EVR();
89    virtual string Group() {return GetSTag(RPMTAG_GROUP);};
90    virtual string Packager() {return GetSTag(RPMTAG_PACKAGER);};
91    virtual string Vendor() {return GetSTag(RPMTAG_VENDOR);};
92    virtual string Summary() {return GetSTag(RPMTAG_SUMMARY);};
93    virtual string Description() {return GetSTag(RPMTAG_DESCRIPTION);};
94    virtual unsigned long InstalledSize() {return GetITag(RPMTAG_SIZE);};
95    virtual string SourceRpm() {return GetSTag(RPMTAG_SOURCERPM);};
96    virtual bool IsSourceRpm() {return SourceRpm().empty();}
97
98    bool InternalDep(const char *name, const char *ver, int_32 flag);
99    virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps);
100    virtual bool Provides(vector<Dependency*> &Provs);
101    virtual bool FileProvides(vector<string> &FileProvs);
102
103    virtual bool HasFile(const char *File);
104
105
106    RPMHandler() : iOffset(0), iSize(0), HeaderP(0) {};
107    virtual ~RPMHandler() {};
108 };
109
110
111 class RPMFileHandler : public RPMHandler
112 {   
113    protected:
114
115    FD_t FD;
116
117    public:
118
119    virtual bool Skip();
120    virtual bool Jump(unsigned int Offset);
121    virtual void Rewind();
122    virtual inline bool IsDatabase() {return false;};
123
124    virtual string FileName();
125    virtual string Directory();
126    virtual unsigned long FileSize();
127    virtual string MD5Sum();
128
129    RPMFileHandler(FileFd *File);
130    RPMFileHandler(string File);
131    virtual ~RPMFileHandler();
132 };
133
134 class RPMSingleFileHandler : public RPMFileHandler
135 {   
136    protected:
137
138    string sFilePath;
139
140    public:
141
142    virtual bool Skip();
143    virtual bool Jump(unsigned int Offset);
144    virtual void Rewind();
145
146    virtual string FileName() {return sFilePath;};
147    virtual string Directory() {return "";};
148    virtual unsigned long FileSize();
149    virtual string MD5Sum();
150    virtual bool ProvideFileName() {return true;};
151
152    RPMSingleFileHandler(string File) : RPMFileHandler(File), sFilePath(File) {};
153    virtual ~RPMSingleFileHandler() {};
154 };
155
156
157
158 class RPMDBHandler : public RPMHandler
159 {
160    protected:
161
162 #if RPM_VERSION >= 0x040100
163    rpmts Handler;
164 #else
165    rpmdb Handler;
166 #endif
167 #if RPM_VERSION >= 0x040000
168    rpmdbMatchIterator RpmIter;
169 #endif
170    bool WriteLock;
171
172    time_t DbFileMtime;
173
174    public:
175
176    static string DataPath(bool DirectoryOnly=true);
177    virtual bool Skip();
178    virtual bool Jump(unsigned Offset);
179    virtual void Rewind();
180    virtual inline bool IsDatabase() {return true;};
181    virtual bool HasWriteLock() {return WriteLock;};
182    virtual time_t Mtime() {return DbFileMtime;}
183    virtual bool OrderedOffset() {return false;};
184
185    // used by rpmSystem::DistroVer()
186    bool JumpByName(string PkgName);
187
188    RPMDBHandler(bool WriteLock=false);
189    virtual ~RPMDBHandler();
190 };
191
192 class RPMDirHandler : public RPMHandler
193 {   
194    protected:
195
196    DIR *Dir;
197    string sDirName;
198    string sFileName;
199    string sFilePath;
200
201 #if RPM_VERSION >= 0x040100
202    rpmts TS;
203 #endif
204
205    const char *nextFileName();
206
207    public:
208
209    virtual bool Skip();
210    virtual bool Jump(unsigned int Offset);
211    virtual void Rewind();
212    virtual inline bool IsDatabase() {return false;};
213
214    virtual string FileName() {return (Dir == NULL)?"":sFileName;};
215    virtual unsigned long FileSize();
216    virtual string MD5Sum();
217
218    RPMDirHandler(string DirName);
219    virtual ~RPMDirHandler();
220 };
221
222 class RPMRepomdHandler : public RPMHandler
223 {
224
225    xmlDocPtr Primary;
226    xmlTextReaderPtr Filelist;
227    xmlNode *Root;
228    xmlNode *NodeP;
229
230    vector<xmlNode *> Pkgs;
231
232    bool WithFilelist;
233    string PrimaryFile, FilelistFile;
234
235    xmlNode *FindNode(const string Name);
236    xmlNode *FindNode(xmlNode *Node, const string Name);
237
238    string FindTag(xmlNode *Node, const string Tag);
239    string GetProp(xmlNode *Node, char *Prop);
240
241    public:
242
243
244    virtual bool Skip();
245    virtual bool Jump(unsigned int Offset);
246    virtual void Rewind();
247    virtual inline bool IsDatabase() {return false;};
248
249    virtual string FileName();
250    virtual string Directory();
251    virtual unsigned long FileSize();
252    virtual unsigned long InstalledSize();
253    virtual string MD5Sum();
254    virtual string SHA1Sum();
255
256    virtual string Name() {return FindTag(NodeP, "name");};
257    virtual string Arch() {return FindTag(NodeP, "arch");};
258    virtual string Epoch();
259    virtual string Version();
260    virtual string Release();
261
262    virtual string Group();
263    virtual string Packager() {return FindTag(NodeP, "packager");};
264    virtual string Vendor();
265    virtual string Summary() {return FindTag(NodeP, "summary");};
266    virtual string Description() {return FindTag(NodeP, "description");};
267    virtual string SourceRpm();
268
269    virtual bool HasFile(const char *File);
270    virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps);
271    virtual bool Provides(vector<Dependency*> &Provs);
272    virtual bool FileProvides(vector<string> &FileProvs);
273
274    RPMRepomdHandler(string File, bool useFilelist);
275    virtual ~RPMRepomdHandler();
276 };
277
278 #endif