1 // InStreamWithCRC.h
2 
3 #ifndef __IN_STREAM_WITH_CRC_H
4 #define __IN_STREAM_WITH_CRC_H
5 
6 #include "../../../../C/7zCrc.h"
7 
8 #include "../../../Common/MyCom.h"
9 
10 #include "../../IStream.h"
11 
12 class CSequentialInStreamWithCRC:
13   public ISequentialInStream,
14   public CMyUnknownImp
15 {
16 public:
17   MY_UNKNOWN_IMP
18 
19   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
20 private:
21   CMyComPtr<ISequentialInStream> _stream;
22   UInt64 _size;
23   UInt32 _crc;
24   bool _wasFinished;
25 public:
SetStream(ISequentialInStream * stream)26   void SetStream(ISequentialInStream *stream) { _stream = stream;  }
Init()27   void Init()
28   {
29     _size = 0;
30     _wasFinished = false;
31     _crc = CRC_INIT_VAL;
32   }
ReleaseStream()33   void ReleaseStream() { _stream.Release(); }
GetCRC()34   UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); }
GetSize()35   UInt64 GetSize() const { return _size; }
WasFinished()36   bool WasFinished() const { return _wasFinished; }
37 };
38 
39 class CInStreamWithCRC:
40   public IInStream,
41   public CMyUnknownImp
42 {
43 public:
44   MY_UNKNOWN_IMP1(IInStream)
45 
46   STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
47   STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
48 private:
49   CMyComPtr<IInStream> _stream;
50   UInt64 _size;
51   UInt32 _crc;
52   // bool _wasFinished;
53 public:
SetStream(IInStream * stream)54   void SetStream(IInStream *stream) { _stream = stream;  }
Init()55   void Init()
56   {
57     _size = 0;
58     // _wasFinished = false;
59     _crc = CRC_INIT_VAL;
60   }
ReleaseStream()61   void ReleaseStream() { _stream.Release(); }
GetCRC()62   UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); }
GetSize()63   UInt64 GetSize() const { return _size; }
64   // bool WasFinished() const { return _wasFinished; }
65 };
66 
67 #endif
68