28eeb6b8035c3a47f28e53217417ca340f3b3f94
[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 #include <rpm/rpmlib.h>
16 #include <rpm/rpmmacro.h>
17
18 #include <config.h>
19
20 class RPMHandler
21 {
22    protected:
23
24    unsigned int iOffset;
25    unsigned int iSize;
26    Header HeaderP;
27    string ID;
28
29    public:
30
31    // Return a unique ID for that handler. Actually, implemented used
32    // the file/dir name.
33    virtual string GetID() { return ID; };
34
35    virtual bool Skip() = 0;
36    virtual bool Jump(unsigned int Offset) = 0;
37    virtual void Rewind() = 0;
38    inline unsigned Offset() {return iOffset;};
39    virtual bool OrderedOffset() {return true;};
40    inline unsigned Size() {return iSize;};
41    inline Header GetHeader() {return HeaderP;};
42    virtual bool IsDatabase() = 0;
43
44    virtual string FileName() {return "";};
45    virtual string Directory() {return "";};
46    virtual unsigned long FileSize() {return 1;};
47    virtual string MD5Sum() {return "";};
48    virtual bool ProvideFileName() {return false;};
49
50    RPMHandler() : iOffset(0), iSize(0), HeaderP(0) {};
51    virtual ~RPMHandler() {};
52 };
53
54
55 class RPMFileHandler : public RPMHandler
56 {   
57    protected:
58
59    FD_t FD;
60
61    public:
62
63    virtual bool Skip();
64    virtual bool Jump(unsigned int Offset);
65    virtual void Rewind();
66    virtual inline bool IsDatabase() {return false;};
67
68    virtual string FileName();
69    virtual string Directory();
70    virtual unsigned long FileSize();
71    virtual string MD5Sum();
72
73    RPMFileHandler(FileFd *File);
74    RPMFileHandler(string File);
75    virtual ~RPMFileHandler();
76 };
77
78 class RPMSingleFileHandler : public RPMFileHandler
79 {   
80    protected:
81
82    string sFilePath;
83
84    public:
85
86    virtual bool Skip();
87    virtual bool Jump(unsigned int Offset);
88    virtual void Rewind();
89
90    virtual string FileName() {return sFilePath;};
91    virtual string Directory() {return "";};
92    virtual unsigned long FileSize();
93    virtual string MD5Sum();
94    virtual bool ProvideFileName() {return true;};
95
96    RPMSingleFileHandler(string File) : RPMFileHandler(File), sFilePath(File) {};
97    virtual ~RPMSingleFileHandler() {};
98 };
99
100
101
102 class RPMDBHandler : public RPMHandler
103 {
104    protected:
105
106 #if RPM_VERSION >= 0x040100
107    rpmts Handler;
108 #else
109    rpmdb Handler;
110 #endif
111 #if RPM_VERSION >= 0x040000
112    rpmdbMatchIterator RpmIter;
113 #endif
114    bool WriteLock;
115
116    time_t DbFileMtime;
117
118    public:
119
120    static string DataPath(bool DirectoryOnly=true);
121    virtual bool Skip();
122    virtual bool Jump(unsigned Offset);
123    virtual void Rewind();
124    virtual inline bool IsDatabase() {return true;};
125    virtual bool HasWriteLock() {return WriteLock;};
126    virtual time_t Mtime() {return DbFileMtime;}
127    virtual bool OrderedOffset() {return false;};
128
129    RPMDBHandler(bool WriteLock=false);
130    virtual ~RPMDBHandler();
131 };
132
133 class RPMDirHandler : public RPMHandler
134 {   
135    protected:
136
137    DIR *Dir;
138    string sDirName;
139    string sFileName;
140    string sFilePath;
141
142 #if RPM_VERSION >= 0x040100
143    rpmts TS;
144 #endif
145
146    const char *nextFileName();
147
148    public:
149
150    virtual bool Skip();
151    virtual bool Jump(unsigned int Offset);
152    virtual void Rewind();
153    virtual inline bool IsDatabase() {return false;};
154
155    virtual string FileName() {return (Dir == NULL)?"":sFileName;};
156    virtual unsigned long FileSize();
157    virtual string MD5Sum();
158
159    RPMDirHandler(string DirName);
160    virtual ~RPMDirHandler();
161 };
162
163
164 // Our Extra RPM tags. These should not be accessed directly. Use
165 // the methods in RPMHandler instead.
166 #define CRPMTAG_FILENAME          1000000
167 #define CRPMTAG_FILESIZE          1000001
168 #define CRPMTAG_MD5               1000005
169 #define CRPMTAG_SHA1              1000006
170
171 #define CRPMTAG_DIRECTORY         1000010
172 #define CRPMTAG_BINARY            1000011
173
174 #define CRPMTAG_UPDATE_SUMMARY    1000020
175 #define CRPMTAG_UPDATE_IMPORTANCE 1000021
176 #define CRPMTAG_UPDATE_DATE       1000022
177 #define CRPMTAG_UPDATE_URL        1000023
178
179 #endif