- implement filelists.xml processing for file dependencies
[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
17 #include <rpm/rpmlib.h>
18 #include <rpm/rpmmacro.h>
19
20 #include <config.h>
21
22 #include <vector>
23
24 // Our Extra RPM tags. These should not be accessed directly. Use
25 // the methods in RPMHandler instead.
26 #define CRPMTAG_FILENAME          (rpmTag)1000000
27 #define CRPMTAG_FILESIZE          (rpmTag)1000001
28 #define CRPMTAG_MD5               (rpmTag)1000005
29 #define CRPMTAG_SHA1              (rpmTag)1000006
30
31 #define CRPMTAG_DIRECTORY         (rpmTag)1000010
32 #define CRPMTAG_BINARY            (rpmTag)1000011
33
34 #define CRPMTAG_UPDATE_SUMMARY    (rpmTag)1000020
35 #define CRPMTAG_UPDATE_IMPORTANCE (rpmTag)1000021
36 #define CRPMTAG_UPDATE_DATE       (rpmTag)1000022
37 #define CRPMTAG_UPDATE_URL        (rpmTag)1000023
38
39 using namespace std;
40
41 struct Dependency
42 {
43    string Name;
44    string Version;
45    unsigned int Op;
46    unsigned int Type;
47 };
48
49
50 class RPMHandler
51 {
52    protected:
53
54    unsigned int iOffset;
55    unsigned int iSize;
56    Header HeaderP;
57    string ID;
58
59    string GetSTag(rpmTag Tag);
60    unsigned long GetITag(rpmTag Tag);
61
62
63    public:
64
65    // Return a unique ID for that handler. Actually, implemented used
66    // the file/dir name.
67    virtual string GetID() { return ID; };
68
69    virtual bool Skip() = 0;
70    virtual bool Jump(unsigned int Offset) = 0;
71    virtual void Rewind() = 0;
72    inline unsigned Offset() {return iOffset;};
73    virtual bool OrderedOffset() {return true;};
74    inline unsigned Size() {return iSize;};
75    virtual bool IsDatabase() = 0;
76
77    virtual string FileName() {return "";};
78    virtual string Directory() {return "";};
79    virtual unsigned long FileSize() {return 1;};
80    virtual string MD5Sum() {return "";};
81    virtual string SHA1Sum() {return "";};
82    virtual bool ProvideFileName() {return false;};
83
84    virtual string Name() {return GetSTag(RPMTAG_NAME);};
85    virtual string Arch() {return GetSTag(RPMTAG_ARCH);};
86    //virtual string Epoch() {return GetSTag(RPMTAG_EPOCH);};
87    virtual string Epoch();
88    virtual string Version() {return GetSTag(RPMTAG_VERSION);};
89    virtual string Release() {return GetSTag(RPMTAG_RELEASE);};
90    virtual string Group() {return GetSTag(RPMTAG_GROUP);};
91    virtual string Packager() {return GetSTag(RPMTAG_PACKAGER);};
92    virtual string Vendor() {return GetSTag(RPMTAG_VENDOR);};
93    virtual string Summary() {return GetSTag(RPMTAG_SUMMARY);};
94    virtual string Description() {return GetSTag(RPMTAG_DESCRIPTION);};
95    virtual unsigned long InstalledSize() {return GetITag(RPMTAG_SIZE);};
96
97    bool InternalDep(const char *name, const char *ver, int_32 flag);
98    virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps);
99    virtual bool Provides(vector<Dependency*> &Provs);
100    virtual bool FileProvides(vector<string> &FileProvs);
101    virtual unsigned short VersionHash();
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    RPMDBHandler(bool WriteLock=false);
186    virtual ~RPMDBHandler();
187 };
188
189 class RPMDirHandler : public RPMHandler
190 {   
191    protected:
192
193    DIR *Dir;
194    string sDirName;
195    string sFileName;
196    string sFilePath;
197
198 #if RPM_VERSION >= 0x040100
199    rpmts TS;
200 #endif
201
202    const char *nextFileName();
203
204    public:
205
206    virtual bool Skip();
207    virtual bool Jump(unsigned int Offset);
208    virtual void Rewind();
209    virtual inline bool IsDatabase() {return false;};
210
211    virtual string FileName() {return (Dir == NULL)?"":sFileName;};
212    virtual unsigned long FileSize();
213    virtual string MD5Sum();
214
215    RPMDirHandler(string DirName);
216    virtual ~RPMDirHandler();
217 };
218
219 class RPMRepomdHandler : public RPMHandler
220 {
221
222    xmlDocPtr Primary, Filelist;
223    xmlNode *Root;
224    xmlNode *NodeP;
225    xmlNode *FlRoot;
226    xmlNode *FlNodeP;
227
228    xmlNode *FindNode(const string Name);
229    xmlNode *FindNode(xmlNode *Node, const string Name);
230
231    string FindTag(xmlNode *Node, const string Tag);
232    string GetContent(xmlNode *Node, string Tag);
233    string GetProp(xmlNode *Node, char *Prop);
234
235    public:
236
237
238    virtual bool Skip();
239    virtual bool Jump(unsigned int Offset);
240    virtual void Rewind();
241    virtual inline bool IsDatabase() {return false;};
242
243    virtual string FileName();
244    virtual string Directory();
245    virtual unsigned long FileSize();
246    virtual unsigned long InstalledSize();
247    virtual string MD5Sum();
248    virtual string SHA1Sum();
249
250    virtual string Name() {return FindTag(NodeP, "name");};
251    virtual string Arch() {return FindTag(NodeP, "arch");};
252    virtual string Epoch();
253    virtual string Version();
254    virtual string Release();
255
256    virtual string Group();
257    virtual string Packager() {return FindTag(NodeP, "packager");};
258    virtual string Vendor();
259    virtual string Summary() {return FindTag(NodeP, "summary");};
260    virtual string Description() {return FindTag(NodeP, "description");};
261
262    virtual bool HasFile(const char *File);
263    virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps);
264    virtual bool Provides(vector<Dependency*> &Provs);
265    virtual bool FileProvides(vector<string> &FileProvs);
266    virtual unsigned short VersionHash();
267
268    RPMRepomdHandler(string File);
269    virtual ~RPMRepomdHandler();
270 };
271
272 #endif