MediaBlockList.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #ifndef ZYPP_MEDIA_MEDIABLOCKLIST_H
00013 #define ZYPP_MEDIA_MEDIABLOCKLIST_H
00014
00015 #include <sys/types.h>
00016 #include <vector>
00017
00018 #include "zypp/Digest.h"
00019
00020 namespace zypp {
00021 namespace media {
00022
00026 struct MediaBlock {
00027 MediaBlock( off_t off_r, size_t size_r )
00028 : off( off_r )
00029 , size( size_r )
00030 {}
00031 off_t off;
00032 size_t size;
00033 };
00034
00035 class MediaBlockList {
00036 public:
00037 MediaBlockList(off_t filesize=off_t(-1));
00038
00043 inline bool haveBlocks() const {
00044 return haveblocks;
00045 }
00051 size_t addBlock(off_t off, size_t size);
00052
00056 inline MediaBlock getBlock(size_t blkno) const {
00057 return blocks[blkno];
00058 }
00062 inline size_t numBlocks() const {
00063 return blocks.size();
00064 }
00065
00069 inline void setFilesize(off_t newfilesize=off_t(-1)) {
00070 filesize = newfilesize;
00071 }
00072 inline off_t getFilesize() const {
00073 return filesize;
00074 }
00075 inline bool haveFilesize() const {
00076 return filesize != off_t(-1);
00077 }
00078
00082 void setFileChecksum(std::string ctype, int cl, unsigned char *c);
00083 bool createFileDigest(Digest &digest) const;
00084 bool verifyFileDigest(Digest &digest) const;
00085 inline bool haveFileChecksum() const {
00086 return !fsumtype.empty() && fsum.size();
00087 }
00088
00092 void setChecksum(size_t blkno, std::string cstype, int csl, unsigned char *cs, size_t cspad=0);
00093 bool checkChecksum(size_t blkno, const unsigned char *buf, size_t bufl) const;
00094 bool createDigest(Digest &digest) const;
00095 bool verifyDigest(size_t blkno, Digest &digest) const;
00096 inline bool haveChecksum(size_t blkno) const {
00097 return chksumlen && chksums.size() >= chksumlen * (blkno + 1);
00098 }
00099
00103 void setRsum(size_t blkno, int rsl, unsigned int rs, size_t rspad=0);
00104 bool checkRsum(size_t blkno, const unsigned char *buf, size_t bufl) const;
00105 unsigned int updateRsum(unsigned int rs, const char *bytes, size_t len) const;
00106 bool verifyRsum(size_t blkno, unsigned int rs) const;
00107 inline bool haveRsum(size_t blkno) const {
00108 return rsumlen && rsums.size() >= blkno + 1;
00109 }
00110
00115 void reuseBlocks(FILE *wfp, std::string filename);
00116
00120 std::string asString() const;
00121
00122 private:
00123 void writeBlock(size_t blkno, FILE *fp, const unsigned char *buf, size_t bufl, size_t start, std::vector<bool> &found) const;
00124 bool checkChecksumRotated(size_t blkno, const unsigned char *buf, size_t bufl, size_t start) const;
00125
00126 off_t filesize;
00127 std::string fsumtype;
00128 std::vector<unsigned char> fsum;
00129
00130 bool haveblocks;
00131 std::vector<MediaBlock> blocks;
00132
00133 std::string chksumtype;
00134 int chksumlen;
00135 size_t chksumpad;
00136 std::vector<unsigned char> chksums;
00137
00138 std::string rsumtype;
00139 int rsumlen;
00140 size_t rsumpad;
00141 std::vector<unsigned int> rsums;
00142 };
00143
00144 inline std::ostream & operator<<(std::ostream &str, const MediaBlockList &bl)
00145 { return str << bl.asString(); }
00146
00147 }
00148 }
00149
00150 #endif // ZYPP_MEDIA_MEDIABLOCKLIST_H
00151