summaryrefslogtreecommitdiff
path: root/apt-pkg/contrib/hashsum_template.h
blob: f11fc2f1c7c5a63440bb53e7e8cdd59d2c98f5dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// -*- mode: cpp; mode: fold -*-
// Description                                                          /*{{{*/
/* ######################################################################

   HashSumValueTemplate - Generic Storage for a hash value
   
   ##################################################################### */
                                                                        /*}}}*/
#ifndef APTPKG_HASHSUM_TEMPLATE_H
#define APTPKG_HASHSUM_TEMPLATE_H

#include <cstring>
#include <string>
#ifdef APT_PKG_EXPOSE_STRING_VIEW
#include <apt-pkg/string_view.h>
#endif

#include <apt-pkg/strutl.h>

#ifndef APT_10_CLEANER_HEADERS
#include <apt-pkg/fileutl.h>
#include <algorithm>
#include <stdint.h>
#endif
#ifndef APT_8_CLEANER_HEADERS
using std::string;
using std::min;
#endif

class FileFd;

template<int N>
class HashSumValue
{
   unsigned char Sum[N/8];

   public:

   // Accessors
   bool operator ==(const HashSumValue &rhs) const
   {
      return memcmp(Sum,rhs.Sum,sizeof(Sum)) == 0;
   }
   bool operator !=(const HashSumValue &rhs) const
   {
      return memcmp(Sum,rhs.Sum,sizeof(Sum)) != 0;
   }

   std::string Value() const
   {
      char Conv[16] =
      { '0','1','2','3','4','5','6','7','8','9','a','b',
        'c','d','e','f'
      };
      char Result[((N/8)*2)+1];
      Result[(N/8)*2] = 0;

      // Convert each char into two letters
      int J = 0;
      int I = 0;
      for (; I != (N/8)*2; J++,I += 2)
      {
         Result[I] = Conv[Sum[J] >> 4];
         Result[I + 1] = Conv[Sum[J] & 0xF];
      }
      return std::string(Result);
   }

   inline void Value(unsigned char S[N/8])
   {
      for (int I = 0; I != sizeof(Sum); ++I)
         S[I] = Sum[I];
   }

   inline operator std::string() const
   {
      return Value();
   }

#ifdef APT_PKG_EXPOSE_STRING_VIEW
   APT_HIDDEN bool Set(APT::StringView Str)
   {
      return Hex2Num(Str,Sum,sizeof(Sum));
   }
#else
   bool Set(std::string Str)
   {
      return Hex2Num(Str,Sum,sizeof(Sum));
   }
#endif
   inline void Set(unsigned char S[N/8])
   {
      for (int I = 0; I != sizeof(Sum); ++I)
         Sum[I] = S[I];
   }

   explicit HashSumValue(std::string const &Str)
   {
         memset(Sum,0,sizeof(Sum));
         Set(Str);
   }
#ifdef APT_PKG_EXPOSE_STRING_VIEW
   APT_HIDDEN explicit HashSumValue(APT::StringView const &Str)
   {
         memset(Sum,0,sizeof(Sum));
         Set(Str);
   }
   APT_HIDDEN explicit HashSumValue(const char *Str)
   {
         memset(Sum,0,sizeof(Sum));
         Set(Str);
   }
#endif
   HashSumValue()
   {
      memset(Sum,0,sizeof(Sum));
   }
};

class SummationImplementation
{
   public:
   virtual bool Add(const unsigned char *inbuf, unsigned long long inlen) APT_NONNULL(2) = 0;
   inline bool Add(const char *inbuf, unsigned long long const inlen) APT_NONNULL(2)
   { return Add(reinterpret_cast<const unsigned char *>(inbuf), inlen); }

   inline bool Add(const unsigned char *Data) APT_NONNULL(2)
   { return Add(Data, strlen(reinterpret_cast<const char *>(Data))); }
   inline bool Add(const char *Data) APT_NONNULL(2)
   { return Add(reinterpret_cast<const unsigned char *>(Data), strlen(Data)); }

   inline bool Add(const unsigned char *Beg, const unsigned char *End) APT_NONNULL(2,3)
   { return Add(Beg, End - Beg); }
   inline bool Add(const char *Beg, const char *End) APT_NONNULL(2,3)
   { return Add(reinterpret_cast<const unsigned char *>(Beg), End - Beg); }

   bool AddFD(int Fd, unsigned long long Size = 0);
   bool AddFD(FileFd &Fd, unsigned long long Size = 0);
};

#endif