2a781b005e13c1104bd56f684fab6919f7637030
[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 class RPMHandler
52 {
53    protected:
54
55    off_t iOffset;
56    off_t iSize;
57    Header HeaderP;
58    string ID;
59
60    string GetSTag(rpmTag Tag);
61    unsigned long GetITag(rpmTag Tag);
62    unsigned int DepOp(int_32 rpmflags);
63    bool InternalDep(const char *name, const char *ver, int_32 flag);
64    bool PutDep(const char *name, const char *ver, int_32 flags,
65                unsigned int type, vector<Dependency*> &Deps);
66
67    public:
68
69    // Return a unique ID for that handler. Actually, implemented used
70    // the file/dir name.
71    virtual string GetID() { return ID; };
72
73    virtual bool Skip() = 0;
74    virtual bool Jump(off_t Offset) = 0;
75    virtual void Rewind() = 0;
76    inline unsigned Offset() {return iOffset;};
77    virtual bool OrderedOffset() {return true;};
78    inline unsigned Size() {return iSize;};
79    virtual bool IsDatabase() = 0;
80
81    virtual string FileName() {return "";};
82    virtual string Directory() {return "";};
83    virtual unsigned long FileSize() {return 1;};
84    virtual string MD5Sum() {return "";};
85    virtual string SHA1Sum() {return "";};
86    virtual bool ProvideFileName() {return false;};
87
88    virtual string Name() {return GetSTag(RPMTAG_NAME);};
89    virtual string Arch() {return GetSTag(RPMTAG_ARCH);};
90    virtual string Epoch();
91    virtual string Version() {return GetSTag(RPMTAG_VERSION);};
92    virtual string Release() {return GetSTag(RPMTAG_RELEASE);};
93    virtual string EVR();
94    virtual string Group() {return GetSTag(RPMTAG_GROUP);};
95    virtual string Packager() {return GetSTag(RPMTAG_PACKAGER);};
96    virtual string Vendor() {return GetSTag(RPMTAG_VENDOR);};
97    virtual string Summary() {return GetSTag(RPMTAG_SUMMARY);};
98    virtual string Description() {return GetSTag(RPMTAG_DESCRIPTION);};
99    virtual unsigned long InstalledSize() {return GetITag(RPMTAG_SIZE);};
100    virtual string SourceRpm() {return GetSTag(RPMTAG_SOURCERPM);};
101    virtual bool IsSourceRpm() {return SourceRpm().empty();}
102
103    virtual bool PRCO(unsigned int Type, vector<Dependency*> &Deps);
104    virtual bool FileList(vector<string> &FileList);
105
106    virtual bool HasFile(const char *File);
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(off_t Offset);
123    virtual void Rewind();
124    virtual inline bool IsDatabase() {return false;};
125    virtual bool OrderedOffset() {return true;};
126
127    virtual string FileName();
128    virtual string Directory();
129    virtual unsigned long FileSize();
130    virtual string MD5Sum();
131
132    RPMFileHandler(FileFd *File);
133    RPMFileHandler(string File);
134    virtual ~RPMFileHandler();
135 };
136
137 class RPMSingleFileHandler : public RPMFileHandler
138 {   
139    protected:
140
141    string sFilePath;
142
143    public:
144
145    virtual bool Skip();
146    virtual bool Jump(off_t Offset);
147    virtual void Rewind();
148
149    virtual string FileName() {return sFilePath;};
150    virtual string Directory() {return "";};
151    virtual unsigned long FileSize();
152    virtual string MD5Sum();
153    virtual bool ProvideFileName() {return true;};
154
155    RPMSingleFileHandler(string File) : RPMFileHandler(File), sFilePath(File) {};
156    virtual ~RPMSingleFileHandler() {};
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(off_t 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    // used by rpmSystem::DistroVer()
187    bool JumpByName(string PkgName);
188
189    RPMDBHandler(bool WriteLock=false);
190    virtual ~RPMDBHandler();
191 };
192
193 class RPMDirHandler : public RPMHandler
194 {   
195    protected:
196
197    DIR *Dir;
198    string sDirName;
199    string sFileName;
200    string sFilePath;
201
202 #if RPM_VERSION >= 0x040100
203    rpmts TS;
204 #endif
205
206    const char *nextFileName();
207
208    public:
209
210    virtual bool Skip();
211    virtual bool Jump(off_t Offset);
212    virtual void Rewind();
213    virtual inline bool IsDatabase() {return false;};
214
215    virtual string FileName() {return (Dir == NULL)?"":sFileName;};
216    virtual unsigned long FileSize();
217    virtual string MD5Sum();
218
219    RPMDirHandler(string DirName);
220    virtual ~RPMDirHandler();
221 };
222
223 #ifdef WITH_REPOMD
224 class RPMRepomdHandler : public RPMHandler
225 {
226
227    xmlDocPtr Primary;
228    xmlNode *Root;
229    xmlNode *NodeP;
230
231    vector<xmlNode *> Pkgs;
232    vector<xmlNode *>::iterator PkgIter;
233
234    string PrimaryFile;
235
236    xmlNode *FindNode(const string Name);
237    xmlNode *FindNode(xmlNode *Node, const string Name);
238
239    string FindTag(xmlNode *Node, const string Tag);
240    string GetProp(xmlNode *Node, char *Prop);
241
242    public:
243
244
245    virtual bool Skip();
246    virtual bool Jump(off_t Offset);
247    virtual void Rewind();
248    virtual inline bool IsDatabase() {return false;};
249
250    virtual string FileName();
251    virtual string Directory();
252    virtual unsigned long FileSize();
253    virtual unsigned long InstalledSize();
254    virtual string MD5Sum();
255    virtual string SHA1Sum();
256
257    virtual string Name() {return FindTag(NodeP, "name");};
258    virtual string Arch() {return FindTag(NodeP, "arch");};
259    virtual string Epoch();
260    virtual string Version();
261    virtual string Release();
262
263    virtual string Group();
264    virtual string Packager() {return FindTag(NodeP, "packager");};
265    virtual string Vendor();
266    virtual string Summary() {return FindTag(NodeP, "summary");};
267    virtual string Description() {return FindTag(NodeP, "description");};
268    virtual string SourceRpm();
269
270    virtual bool PRCO(unsigned int Type, vector<Dependency*> &Deps);
271    virtual bool FileList(vector<string> &FileList);
272
273    RPMRepomdHandler(string File);
274    virtual ~RPMRepomdHandler();
275 };
276
277 class RPMRepomdFLHandler : public RPMHandler
278 {
279    protected:
280    xmlTextReaderPtr Filelist;
281    string FilelistFile;
282    xmlNode *NodeP;
283
284    string FindTag(char *Tag);
285
286    public:
287    virtual bool Skip();
288    virtual bool Jump(off_t Offset);
289    virtual void Rewind();
290    virtual bool IsDatabase() {return false;};
291
292    virtual string FileName() {return FilelistFile;};
293    virtual string Directory() {return "";};
294    virtual unsigned long FileSize() {return 0;};
295    virtual unsigned long InstalledSize() {return 0;};
296    virtual string MD5Sum() {return "";};
297    virtual string SHA1Sum() {return "";};
298
299    virtual string Name() {return FindTag("name");};
300    virtual string Arch() {return FindTag("arch");};
301    virtual string Epoch() {return FindTag("epoch");};
302    virtual string Version() {return FindTag("version");};
303    virtual string Release() {return FindTag("release");};
304    virtual bool PRCO(unsigned int Type, vector<Dependency*> &Deps)
305        {return true;};
306
307    virtual bool FileList(vector<string> &FileList);
308    RPMRepomdFLHandler(string File);
309    virtual ~RPMRepomdFLHandler();
310 };
311 #endif /* WITH_REPOMD */
312
313 #endif