hashsum_template.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // -*- mode: cpp; mode: fold -*-
  2. // Description /*{{{*/
  3. // $Id: hashsum_template.h,v 1.3 2001/05/07 05:05:47 jgg Exp $
  4. /* ######################################################################
  5. HashSumValueTemplate - Generic Storage for a hash value
  6. ##################################################################### */
  7. /*}}}*/
  8. #ifndef APTPKG_HASHSUM_TEMPLATE_H
  9. #define APTPKG_HASHSUM_TEMPLATE_H
  10. #include <string>
  11. #include <cstring>
  12. #include <algorithm>
  13. #include <stdint.h>
  14. #ifndef APT_8_CLEANER_HEADERS
  15. using std::string;
  16. using std::min;
  17. #endif
  18. template<int N>
  19. class HashSumValue
  20. {
  21. unsigned char Sum[N/8];
  22. public:
  23. // Accessors
  24. bool operator ==(const HashSumValue &rhs) const
  25. {
  26. return memcmp(Sum,rhs.Sum,sizeof(Sum)) == 0;
  27. };
  28. bool operator !=(const HashSumValue &rhs) const
  29. {
  30. return memcmp(Sum,rhs.Sum,sizeof(Sum)) != 0;
  31. };
  32. std::string Value() const
  33. {
  34. char Conv[16] =
  35. { '0','1','2','3','4','5','6','7','8','9','a','b',
  36. 'c','d','e','f'
  37. };
  38. char Result[((N/8)*2)+1];
  39. Result[(N/8)*2] = 0;
  40. // Convert each char into two letters
  41. int J = 0;
  42. int I = 0;
  43. for (; I != (N/8)*2; J++,I += 2)
  44. {
  45. Result[I] = Conv[Sum[J] >> 4];
  46. Result[I + 1] = Conv[Sum[J] & 0xF];
  47. }
  48. return std::string(Result);
  49. };
  50. inline void Value(unsigned char S[N/8])
  51. {
  52. for (int I = 0; I != sizeof(Sum); I++)
  53. S[I] = Sum[I];
  54. };
  55. inline operator std::string() const
  56. {
  57. return Value();
  58. };
  59. bool Set(std::string Str)
  60. {
  61. return Hex2Num(Str,Sum,sizeof(Sum));
  62. };
  63. inline void Set(unsigned char S[N/8])
  64. {
  65. for (int I = 0; I != sizeof(Sum); I++)
  66. Sum[I] = S[I];
  67. };
  68. HashSumValue(std::string Str)
  69. {
  70. memset(Sum,0,sizeof(Sum));
  71. Set(Str);
  72. }
  73. HashSumValue()
  74. {
  75. memset(Sum,0,sizeof(Sum));
  76. }
  77. };
  78. class SummationImplementation
  79. {
  80. public:
  81. virtual bool Add(const unsigned char *inbuf, unsigned long long inlen) = 0;
  82. inline bool Add(const char *inbuf, unsigned long long const inlen)
  83. { return Add((unsigned char *)inbuf, inlen); };
  84. inline bool Add(const unsigned char *Data)
  85. { return Add(Data, strlen((const char *)Data)); };
  86. inline bool Add(const char *Data)
  87. { return Add((const unsigned char *)Data, strlen((const char *)Data)); };
  88. inline bool Add(const unsigned char *Beg, const unsigned char *End)
  89. { return Add(Beg, End - Beg); };
  90. inline bool Add(const char *Beg, const char *End)
  91. { return Add((const unsigned char *)Beg, End - Beg); };
  92. bool AddFD(int Fd, unsigned long long Size = 0);
  93. };
  94. #endif