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