1 //
2 // DigestStream.h
3 //
4 // Library: Foundation
5 // Package: Crypt
6 // Module:  DigestStream
7 //
8 // Definition of classes DigestInputStream and DigestOutputStream.
9 //
10 // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
11 // and Contributors.
12 //
13 // SPDX-License-Identifier:	BSL-1.0
14 //
15 
16 
17 #ifndef Foundation_DigestStream_INCLUDED
18 #define Foundation_DigestStream_INCLUDED
19 
20 
21 #include "Poco/Foundation.h"
22 #include "Poco/BufferedStreamBuf.h"
23 #include "Poco/DigestEngine.h"
24 #include <istream>
25 #include <ostream>
26 
27 
28 namespace Poco {
29 
30 
31 class Foundation_API DigestBuf: public BufferedStreamBuf
32 	/// This streambuf computes a digest of all data going
33 	/// through it.
34 {
35 public:
36 	DigestBuf(DigestEngine& eng);
37 	DigestBuf(DigestEngine& eng, std::istream& istr);
38 	DigestBuf(DigestEngine& eng, std::ostream& ostr);
39 	~DigestBuf();
40 	int readFromDevice(char* buffer, std::streamsize length);
41 	int writeToDevice(const char* buffer, std::streamsize length);
42 	void close();
43 
44 private:
45 	DigestEngine& _eng;
46 	std::istream* _pIstr;
47 	std::ostream* _pOstr;
48 	static const int BUFFER_SIZE;
49 };
50 
51 
52 class Foundation_API DigestIOS: public virtual std::ios
53 	/// The base class for DigestInputStream and DigestOutputStream.
54 	///
55 	/// This class is needed to ensure the correct initialization
56 	/// order of the stream buffer and base classes.
57 {
58 public:
59 	DigestIOS(DigestEngine& eng);
60 	DigestIOS(DigestEngine& eng, std::istream& istr);
61 	DigestIOS(DigestEngine& eng, std::ostream& ostr);
62 	~DigestIOS();
63 	DigestBuf* rdbuf();
64 
65 protected:
66 	DigestBuf _buf;
67 };
68 
69 
70 class Foundation_API DigestInputStream: public DigestIOS, public std::istream
71 	/// This istream computes a digest of
72 	/// all the data passing through it,
73 	/// using a DigestEngine.
74 {
75 public:
76 	DigestInputStream(DigestEngine& eng, std::istream& istr);
77 	~DigestInputStream();
78 };
79 
80 
81 class Foundation_API DigestOutputStream: public DigestIOS, public std::ostream
82 	/// This ostream computes a digest of
83 	/// all the data passing through it,
84 	/// using a DigestEngine.
85 	/// To ensure that all data has been incorporated
86 	/// into the digest, call close() or flush() before
87 	/// you obtain the digest from the digest engine.
88 {
89 public:
90 	DigestOutputStream(DigestEngine& eng);
91 	DigestOutputStream(DigestEngine& eng, std::ostream& ostr);
92 	~DigestOutputStream();
93 	void close();
94 };
95 
96 
97 } // namespace Poco
98 
99 
100 #endif // Foundation_DigestStream_INCLUDED
101