hashsum_template.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. template<int N>
  15. class HashSumValue
  16. {
  17. unsigned char Sum[N/8];
  18. public:
  19. // Accessors
  20. bool operator ==(const HashSumValue &rhs) const
  21. {
  22. return memcmp(Sum,rhs.Sum,sizeof(Sum)) == 0;
  23. };
  24. bool operator !=(const HashSumValue &rhs) const
  25. {
  26. return memcmp(Sum,rhs.Sum,sizeof(Sum)) != 0;
  27. };
  28. std::string Value() const
  29. {
  30. char Conv[16] =
  31. { '0','1','2','3','4','5','6','7','8','9','a','b',
  32. 'c','d','e','f'
  33. };
  34. char Result[((N/8)*2)+1];
  35. Result[(N/8)*2] = 0;
  36. // Convert each char into two letters
  37. int J = 0;
  38. int I = 0;
  39. for (; I != (N/8)*2; J++,I += 2)
  40. {
  41. Result[I] = Conv[Sum[J] >> 4];
  42. Result[I + 1] = Conv[Sum[J] & 0xF];
  43. }
  44. return std::string(Result);
  45. };
  46. inline void Value(unsigned char S[N/8])
  47. {
  48. for (int I = 0; I != sizeof(Sum); I++)
  49. S[I] = Sum[I];
  50. };
  51. inline operator std::string() const
  52. {
  53. return Value();
  54. };
  55. bool Set(std::string Str)
  56. {
  57. return Hex2Num(Str,Sum,sizeof(Sum));
  58. };
  59. inline void Set(unsigned char S[N/8])
  60. {
  61. for (int I = 0; I != sizeof(Sum); I++)
  62. Sum[I] = S[I];
  63. };
  64. HashSumValue(std::string Str)
  65. {
  66. memset(Sum,0,sizeof(Sum));
  67. Set(Str);
  68. }
  69. HashSumValue()
  70. {
  71. memset(Sum,0,sizeof(Sum));
  72. }
  73. };
  74. class SummationImplementation
  75. {
  76. public:
  77. virtual bool Add(const unsigned char *inbuf, unsigned long long inlen) = 0;
  78. inline bool Add(const char *inbuf, unsigned long long const inlen)
  79. { return Add((unsigned char *)inbuf, inlen); };
  80. inline bool Add(const unsigned char *Data)
  81. { return Add(Data, strlen((const char *)Data)); };
  82. inline bool Add(const char *Data)
  83. { return Add((const unsigned char *)Data, strlen((const char *)Data)); };
  84. inline bool Add(const unsigned char *Beg, const unsigned char *End)
  85. { return Add(Beg, End - Beg); };
  86. inline bool Add(const char *Beg, const char *End)
  87. { return Add((const unsigned char *)Beg, End - Beg); };
  88. bool AddFD(int Fd, unsigned long long Size = 0);
  89. };
  90. #endif