9c846632d051fe5cabe2244e8888d937d7294041
[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    virtual unsigned short VersionHash();
104
105    virtual bool HasFile(const char *File);
106
107
108    RPMHandler() : iOffset(0), iSize(0), HeaderP(0) {};
109    virtual ~RPMHandler() {};
110 };
111
112
113 class RPMFileHandler : public RPMHandler
114 {   
115    protected:
116
117    FD_t FD;
118
119    public:
120
121    virtual bool Skip();
122    virtual bool Jump(unsigned int Offset);
123    virtual void Rewind();
124    virtual inline bool IsDatabase() {return false;};
125
126    virtual string FileName();
127    virtual string Directory();
128    virtual unsigned long FileSize();
129    virtual string MD5Sum();
130
131    RPMFileHandler(FileFd *File);
132    RPMFileHandler(string File);
133    virtual ~RPMFileHandler();
134 };
135
136 class RPMSingleFileHandler : public RPMFileHandler
137 {   
138    protected:
139
140    string sFilePath;
141
142    public:
143
144    virtual bool Skip();
145    virtual bool Jump(unsigned int Offset);
146    virtual void Rewind();
147
148    virtual string FileName() {return sFilePath;};
149    virtual string Directory() {return "";};
150    virtual unsigned long FileSize();
151    virtual string MD5Sum();
152    virtual bool ProvideFileName() {return true;};
153
154    RPMSingleFileHandler(string File) : RPMFileHandler(File), sFilePath(File) {};
155    virtual ~RPMSingleFileHandler() {};
156 };
157
158
159
160 class RPMDBHandler : public RPMHandler
161 {
162    protected:
163
164 #if RPM_VERSION >= 0x040100
165    rpmts Handler;
166 #else
167    rpmdb Handler;
168 #endif
169 #if RPM_VERSION >= 0x040000
170    rpmdbMatchIterator RpmIter;
171 #endif
172    bool WriteLock;
173
174    time_t DbFileMtime;
175
176    public:
177
178    static string DataPath(bool DirectoryOnly=true);
179    virtual bool Skip();
180    virtual bool Jump(unsigned Offset);
181    virtual void Rewind();
182    virtual inline bool IsDatabase() {return true;};
183    virtual bool HasWriteLock() {return WriteLock;};
184    virtual time_t Mtime() {return DbFileMtime;}
185    virtual bool OrderedOffset() {return false;};
186
187    RPMDBHandler(bool WriteLock=false);
188    virtual ~RPMDBHandler();
189 };
190
191 class RPMDirHandler : public RPMHandler
192 {   
193    protected:
194
195    DIR *Dir;
196    string sDirName;
197    string sFileName;
198    string sFilePath;
199
200 #if RPM_VERSION >= 0x040100
201    rpmts TS;
202 #endif
203
204    const char *nextFileName();
205
206    public:
207
208    virtual bool Skip();
209    virtual bool Jump(unsigned int Offset);
210    virtual void Rewind();
211    virtual inline bool IsDatabase() {return false;};
212
213    virtual string FileName() {return (Dir == NULL)?"":sFileName;};
214    virtual unsigned long FileSize();
215    virtual string MD5Sum();
216
217    RPMDirHandler(string DirName);
218    virtual ~RPMDirHandler();
219 };
220
221 class RPMRepomdHandler : public RPMHandler
222 {
223
224    xmlDocPtr Primary;
225    xmlTextReaderPtr Filelist;
226    xmlNode *Root;
227    xmlNode *NodeP;
228
229    vector<xmlNode *> Pkgs;
230
231    bool WithFilelist;
232    string PrimaryFile, FilelistFile;
233
234    xmlNode *FindNode(const string Name);
235    xmlNode *FindNode(xmlNode *Node, const string Name);
236
237    string FindTag(xmlNode *Node, const string Tag);
238    string GetProp(xmlNode *Node, char *Prop);
239
240    public:
241
242
243    virtual bool Skip();
244    virtual bool Jump(unsigned int Offset);
245    virtual void Rewind();
246    virtual inline bool IsDatabase() {return false;};
247
248    virtual string FileName();
249    virtual string Directory();
250    virtual unsigned long FileSize();
251    virtual unsigned long InstalledSize();
252    virtual string MD5Sum();
253    virtual string SHA1Sum();
254
255    virtual string Name() {return FindTag(NodeP, "name");};
256    virtual string Arch() {return FindTag(NodeP, "arch");};
257    virtual string Epoch();
258    virtual string Version();
259    virtual string Release();
260
261    virtual string Group();
262    virtual string Packager() {return FindTag(NodeP, "packager");};
263    virtual string Vendor();
264    virtual string Summary() {return FindTag(NodeP, "summary");};
265    virtual string Description() {return FindTag(NodeP, "description");};
266
267    virtual bool HasFile(const char *File);
268    virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps);
269    virtual bool Provides(vector<Dependency*> &Provs);
270    virtual bool FileProvides(vector<string> &FileProvs);
271    virtual unsigned short VersionHash();
272
273    RPMRepomdHandler(string File, bool useFilelist);
274    virtual ~RPMRepomdHandler();
275 };
276
277 #endif