Imported Upstream version 14.42.6
[platform/upstream/libzypp.git] / zypp / CheckSum.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/CheckSum.h
10  *
11 */
12 #ifndef ZYPP_CHECKSUM_H
13 #define ZYPP_CHECKSUM_H
14
15 #include <iosfwd>
16 #include <string>
17 #include <sstream>
18
19 #include "zypp/base/Exception.h"
20 #include "zypp/Pathname.h"
21
22 ///////////////////////////////////////////////////////////////////
23 namespace zypp
24 { /////////////////////////////////////////////////////////////////
25
26   struct CheckSumException : public Exception
27   {
28     CheckSumException( const std::string & msg )
29       : Exception( msg )
30     {}
31   };
32
33   class CheckSum
34   {
35   public:
36     /** Default Ctor: empty checksum. */
37     CheckSum()
38     {}
39     /**
40      * Creates a checksum for algorithm \param type.
41      * \throws CheckSumException if the checksum is invalid and can't be constructed
42      */
43     CheckSum( const std::string & type, const std::string & checksum );
44     /**
45      * Creates a checksum auto probing the algorithm type.
46      * \throws CheckSumException if the checksum is invalid and can't be constructed
47      */
48     CheckSum( const std::string & checksum )
49       : CheckSum( std::string(), checksum )
50     {}
51
52     /**
53      * Reads the content of \param input_r and computes the checksum.
54      */
55     CheckSum( const std::string & type, std::istream & input_r );
56
57 #ifndef SWIG // Swig treats it as syntax error0
58     /** Ctor from temporary istream */
59     CheckSum( const std::string & type, std::istream && input_r )
60       : CheckSum( type, input_r )
61     {}
62 #endif
63
64   public:
65     static const std::string & md5Type();
66     static const std::string & shaType();
67     static const std::string & sha1Type();
68     static const std::string & sha224Type();
69     static const std::string & sha256Type();
70     static const std::string & sha384Type();
71     static const std::string & sha512Type();
72
73     /** \name Creates a checksum for algorithm \param type. */
74     //@{
75     static CheckSum md5( const std::string & checksum )         { return  CheckSum( md5Type(), checksum); }
76     static CheckSum sha( const std::string & checksum )         { return  CheckSum( shaType(), checksum); }
77     static CheckSum sha1( const std::string & checksum )        { return  CheckSum( sha1Type(), checksum); }
78     static CheckSum sha224( const std::string & checksum )      { return  CheckSum( sha224Type(), checksum); }
79     static CheckSum sha256( const std::string & checksum )      { return  CheckSum( sha256Type(), checksum); }
80     static CheckSum sha384( const std::string & checksum )      { return  CheckSum( sha384Type(), checksum); }
81     static CheckSum sha512( const std::string & checksum )      { return  CheckSum( sha512Type(), checksum); }
82     //@}
83
84     /** \name Reads the content of \param input_r and computes the checksum. */
85     //@{
86     static CheckSum md5( std::istream & input_r )               { return  CheckSum( md5Type(), input_r ); }
87     static CheckSum sha( std::istream & input_r )               { return  CheckSum( sha1Type(), input_r ); }
88     static CheckSum sha1( std::istream & input_r )              { return  CheckSum( sha1Type(), input_r ); }
89     static CheckSum sha224( std::istream & input_r )            { return  CheckSum( sha224Type(), input_r ); }
90     static CheckSum sha256( std::istream & input_r )            { return  CheckSum( sha256Type(), input_r ); }
91     static CheckSum sha384( std::istream & input_r )            { return  CheckSum( sha384Type(), input_r ); }
92     static CheckSum sha512( std::istream & input_r )            { return  CheckSum( sha512Type(), input_r ); }
93 #ifndef SWIG // Swig treats it as syntax error
94     static CheckSum md5( std::istream && input_r )              { return  CheckSum( md5Type(), input_r ); }
95     static CheckSum sha( std::istream && input_r )              { return  CheckSum( sha1Type(), input_r ); }
96     static CheckSum sha1( std::istream && input_r )             { return  CheckSum( sha1Type(), input_r ); }
97     static CheckSum sha224( std::istream && input_r )           { return  CheckSum( sha224Type(), input_r ); }
98     static CheckSum sha256( std::istream && input_r )           { return  CheckSum( sha256Type(), input_r ); }
99     static CheckSum sha384( std::istream && input_r )           { return  CheckSum( sha384Type(), input_r ); }
100     static CheckSum sha512( std::istream && input_r )           { return  CheckSum( sha512Type(), input_r ); }
101 #endif
102     //@}
103
104     /** \name Reads the content of \param input_r and computes the checksum. */
105     //@{
106     static CheckSum md5FromString( const std::string & input_r )        { return md5( std::stringstream( input_r ) ); }
107     static CheckSum shaFromString( const std::string & input_r )        { return sha( std::stringstream( input_r ) ); }
108     static CheckSum sha1FromString( const std::string & input_r )       { return sha1( std::stringstream( input_r ) ); }
109     static CheckSum sha224FromString( const std::string & input_r )     { return sha224( std::stringstream( input_r ) ); }
110     static CheckSum sha256FromString( const std::string & input_r )     { return sha256( std::stringstream( input_r ) ); }
111     static CheckSum sha384FromString( const std::string & input_r )     { return sha384( std::stringstream( input_r ) ); }
112     static CheckSum sha512FromString( const std::string & input_r )     { return sha512( std::stringstream( input_r ) ); }
113     //@}
114
115   public:
116     std::string type() const;
117     std::string checksum() const;
118     bool empty() const;
119
120   public:
121     std::string asString() const;
122
123   private:
124     std::string _type;
125     std::string _checksum;
126   };
127
128   /** \relates CheckSum Stream output. */
129   std::ostream & operator<<( std::ostream & str, const CheckSum & obj );
130
131   /** \relates CheckSum XML output. */
132   std::ostream & dumpAsXmlOn( std::ostream & str, const CheckSum & obj );
133
134   /** \relates CheckSum */
135   bool operator==( const CheckSum & lhs, const CheckSum & rhs );
136
137   /** \relates CheckSum */
138   bool operator!=( const CheckSum & lhs, const CheckSum & rhs );
139
140 } // namespace zypp
141 ///////////////////////////////////////////////////////////////////
142 #endif // ZYPP_CHECKSUM_H