5173eca64b0620d04fc059e64aaaa88a5f704c4c
[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 <vector>
22
23 // Our Extra RPM tags. These should not be accessed directly. Use
24 // the methods in RPMHandler instead.
25 #define CRPMTAG_FILENAME          (rpmTag)1000000
26 #define CRPMTAG_FILESIZE          (rpmTag)1000001
27 #define CRPMTAG_MD5               (rpmTag)1000005
28 #define CRPMTAG_SHA1              (rpmTag)1000006
29
30 #define CRPMTAG_DIRECTORY         (rpmTag)1000010
31 #define CRPMTAG_BINARY            (rpmTag)1000011
32
33 #define CRPMTAG_UPDATE_SUMMARY    (rpmTag)1000020
34 #define CRPMTAG_UPDATE_IMPORTANCE (rpmTag)1000021
35 #define CRPMTAG_UPDATE_DATE       (rpmTag)1000022
36 #define CRPMTAG_UPDATE_URL        (rpmTag)1000023
37
38 using namespace std;
39
40 struct Dependency
41 {
42    string Name;
43    string Version;
44    unsigned int Op;
45    unsigned int Type;
46 };
47
48
49 class RPMHandler
50 {
51    protected:
52
53    unsigned int iOffset;
54    unsigned int iSize;
55    Header HeaderP;
56    string ID;
57
58    string GetSTag(rpmTag Tag);
59    unsigned long GetITag(rpmTag Tag);
60
61
62    public:
63
64    // Return a unique ID for that handler. Actually, implemented used
65    // the file/dir name.
66    virtual string GetID() { return ID; };
67
68    virtual bool Skip() = 0;
69    virtual bool Jump(unsigned int Offset) = 0;
70    virtual void Rewind() = 0;
71    inline unsigned Offset() {return iOffset;};
72    virtual bool OrderedOffset() {return true;};
73    inline unsigned Size() {return iSize;};
74    virtual bool IsDatabase() = 0;
75
76    virtual string FileName() {return "";};
77    virtual string Directory() {return "";};
78    virtual unsigned long FileSize() {return 1;};
79    virtual string MD5Sum() {return "";};
80    virtual string SHA1Sum() {return "";};
81    virtual bool ProvideFileName() {return false;};
82
83    virtual string Name() {return GetSTag(RPMTAG_NAME);};
84    virtual string Arch() {return GetSTag(RPMTAG_ARCH);};
85    //virtual string Epoch() {return GetSTag(RPMTAG_EPOCH);};
86    virtual string Epoch();
87    virtual string Version() {return GetSTag(RPMTAG_VERSION);};
88    virtual string Release() {return GetSTag(RPMTAG_RELEASE);};
89    virtual string EVR();
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
102    virtual bool HasFile(const char *File);
103
104
105    RPMHandler() : iOffset(0), iSize(0), HeaderP(0) {};
106    virtual ~RPMHandler() {};
107 };
108
109
110 class RPMFileHandler : public RPMHandler
111 {   
112    protected:
113
114    FD_t FD;
115
116    public:
117
118    virtual bool Skip();
119    virtual bool Jump(unsigned int Offset);
120    virtual void Rewind();
121    virtual inline bool IsDatabase() {return false;};
122
123    virtual string FileName();
124    virtual string Directory();
125    virtual unsigned long FileSize();
126    virtual string MD5Sum();
127
128    RPMFileHandler(FileFd *File);
129    RPMFileHandler(string File);
130    virtual ~RPMFileHandler();
131 };
132
133 class RPMSingleFileHandler : public RPMFileHandler
134 {   
135    protected:
136
137    string sFilePath;
138
139    public:
140
141    virtual bool Skip();
142    virtual bool Jump(unsigned int Offset);
143    virtual void Rewind();
144
145    virtual string FileName() {return sFilePath;};
146    virtual string Directory() {return "";};
147    virtual unsigned long FileSize();
148    virtual string MD5Sum();
149    virtual bool ProvideFileName() {return true;};
150
151    RPMSingleFileHandler(string File) : RPMFileHandler(File), sFilePath(File) {};
152    virtual ~RPMSingleFileHandler() {};
153 };
154
155
156
157 class RPMDBHandler : public RPMHandler
158 {
159    protected:
160
161 #if RPM_VERSION >= 0x040100
162    rpmts Handler;
163 #else
164    rpmdb Handler;
165 #endif
166 #if RPM_VERSION >= 0x040000
167    rpmdbMatchIterator RpmIter;
168 #endif
169    bool WriteLock;
170
171    time_t DbFileMtime;
172
173    public:
174
175    static string DataPath(bool DirectoryOnly=true);
176    virtual bool Skip();
177    virtual bool Jump(unsigned Offset);
178    virtual void Rewind();
179    virtual inline bool IsDatabase() {return true;};
180    virtual bool HasWriteLock() {return WriteLock;};
181    virtual time_t Mtime() {return DbFileMtime;}
182    virtual bool OrderedOffset() {return false;};
183
184    // used by rpmSystem::DistroVer()
185    bool JumpByName(string PkgName);
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
272    RPMRepomdHandler(string File, bool useFilelist);
273    virtual ~RPMRepomdHandler();
274 };
275
276 #endif