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