00001
00002
00003 #ifndef __ARC_CHECKSUM_H__
00004 #define __ARC_CHECKSUM_H__
00005
00006 #include <cstring>
00007 #include <cstdio>
00008 #include <string>
00009
00010 #include <inttypes.h>
00011 #include <sys/types.h>
00012 #include <zlib.h>
00013
00014 namespace Arc {
00015
00017
00025 class CheckSum {
00026 public:
00028 CheckSum(void) {}
00029 virtual ~CheckSum(void) {}
00030
00032
00036 virtual void start(void) = 0;
00037
00039
00046 virtual void add(void *buf, unsigned long long int len) = 0;
00047
00049
00053 virtual void end(void) = 0;
00054
00056 virtual void result(unsigned char*& res, unsigned int& len) const = 0;
00057
00059
00070 virtual int print(char *buf, int len) const {
00071 if (len > 0)
00072 buf[0] = 0;
00073 return 0;
00074 }
00075
00077
00085 virtual void scan(const char *buf) = 0;
00086
00088 virtual operator bool(void) const {
00089 return false;
00090 }
00091
00093 virtual bool operator!(void) const {
00094 return true;
00095 }
00096 };
00097
00099
00103 class CRC32Sum
00104 : public CheckSum {
00105 private:
00106 uint32_t r;
00107 unsigned long long count;
00108 bool computed;
00109 public:
00110 CRC32Sum(void);
00111 virtual ~CRC32Sum(void) {}
00112 virtual void start(void);
00113 virtual void add(void *buf, unsigned long long int len);
00114 virtual void end(void);
00115 virtual void result(unsigned char*& res, unsigned int& len) const {
00116 res = (unsigned char*)&r;
00117 len = 4;
00118 }
00119 virtual int print(char *buf, int len) const;
00120 virtual void scan(const char *buf);
00121 virtual operator bool(void) const {
00122 return computed;
00123 }
00124 virtual bool operator!(void) const {
00125 return !computed;
00126 }
00127 uint32_t crc(void) const {
00128 return r;
00129 }
00130 };
00131
00133
00138 class MD5Sum
00139 : public CheckSum {
00140 private:
00141 bool computed;
00142 uint32_t A;
00143 uint32_t B;
00144 uint32_t C;
00145 uint32_t D;
00146 uint64_t count;
00147 uint32_t X[16];
00148 unsigned int Xlen;
00149
00150 public:
00151 MD5Sum(void);
00152 virtual void start(void);
00153 virtual void add(void *buf, unsigned long long int len);
00154 virtual void end(void);
00155 virtual void result(unsigned char*& res, unsigned int& len) const {
00156 res = (unsigned char*)&A;
00157 len = 16;
00158 }
00159 virtual int print(char *buf, int len) const;
00160 virtual void scan(const char *buf);
00161 virtual operator bool(void) const {
00162 return computed;
00163 }
00164 virtual bool operator!(void) const {
00165 return !computed;
00166 }
00167 };
00168
00170
00174 class Adler32Sum
00175 : public CheckSum {
00176 private:
00177 uLong adler;
00178 bool computed;
00179 public:
00180 Adler32Sum(void) : computed(false) {
00181 start();
00182 }
00183 virtual void start(void) {
00184 adler = adler32(0L, Z_NULL, 0);
00185 }
00186 virtual void add(void* buf,unsigned long long int len) {
00187 adler = adler32(adler, (const Bytef *)buf, len);
00188 }
00189 virtual void end(void) {
00190 computed = true;
00191 }
00192 virtual void result(unsigned char*& res,unsigned int& len) const {
00193 res=(unsigned char*)&adler;
00194 len=4;
00195 }
00196 virtual int print(char* buf,int len) const {
00197 if(!computed) {
00198 if(len>0) {
00199 buf[0]=0;
00200 return 0;
00201 }
00202 }
00203 return snprintf(buf,len,"adler32:%08lx",adler);
00204 };
00205 virtual void scan(const char* ) { };
00206 virtual operator bool(void) const {
00207 return computed;
00208 }
00209 virtual bool operator!(void) const {
00210 return !computed;
00211 }
00212 };
00213
00215
00219 class CheckSumAny
00220 : public CheckSum {
00221 public:
00222 typedef enum {
00223 none,
00224 unknown,
00225 undefined,
00226 cksum,
00227 md5,
00228 adler32
00229 } type;
00230 private:
00231 CheckSum *cs;
00232 type tp;
00233 public:
00234 CheckSumAny(CheckSum *c = NULL)
00235 : cs(c),
00236 tp(none) {}
00237 CheckSumAny(type type);
00238 CheckSumAny(const char *type);
00239 virtual ~CheckSumAny(void) {
00240 if (cs)
00241 delete cs;
00242 }
00243 virtual void start(void) {
00244 if (cs)
00245 cs->start();
00246 }
00247 virtual void add(void *buf, unsigned long long int len) {
00248 if (cs)
00249 cs->add(buf, len);
00250 }
00251 virtual void end(void) {
00252 if (cs)
00253 cs->end();
00254 }
00255 virtual void result(unsigned char*& res, unsigned int& len) const {
00256 if (cs) {
00257 cs->result(res, len);
00258 return;
00259 }
00260 len = 0;
00261 }
00262 virtual int print(char *buf, int len) const {
00263 if (cs)
00264 return cs->print(buf, len);
00265 if (len > 0)
00266 buf[0] = 0;
00267 return 0;
00268 }
00269 virtual void scan(const char *buf) {
00270 if (cs)
00271 cs->scan(buf);
00272 }
00273 virtual operator bool(void) const {
00274 if (!cs)
00275 return false;
00276 return *cs;
00277 }
00278 virtual bool operator!(void) const {
00279 if (!cs)
00280 return true;
00281 return !(*cs);
00282 }
00283 bool active(void) {
00284 return (cs != NULL);
00285 }
00286 static type Type(const char *crc);
00287 type Type(void) const {
00288 return tp;
00289 }
00290 void operator=(const char *type);
00291 bool operator==(const char *s);
00292 bool operator==(const CheckSumAny& ck);
00293
00295
00306 static std::string FileChecksum(const std::string& filepath, type tp = md5, bool decimalbase = false);
00307 };
00308
00309 }
00310
00311 #endif // __ARC_CHECKSUM_H__