aboutsummaryrefslogtreecommitdiff
path: root/CPP/7zip/Common/OutBuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/Common/OutBuffer.h')
-rw-r--r--CPP/7zip/Common/OutBuffer.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/CPP/7zip/Common/OutBuffer.h b/CPP/7zip/Common/OutBuffer.h
new file mode 100644
index 0000000..d7ca9f6
--- /dev/null
+++ b/CPP/7zip/Common/OutBuffer.h
@@ -0,0 +1,66 @@
1// OutBuffer.h
2
3#ifndef __OUT_BUFFER_H
4#define __OUT_BUFFER_H
5
6#include "../IStream.h"
7#include "../../Common/MyCom.h"
8#include "../../Common/MyException.h"
9
10#ifndef _NO_EXCEPTIONS
11struct COutBufferException: public CSystemException
12{
13 COutBufferException(HRESULT errorCode): CSystemException(errorCode) {}
14};
15#endif
16
17class COutBuffer
18{
19protected:
20 Byte *_buf;
21 UInt32 _pos;
22 UInt32 _limitPos;
23 UInt32 _streamPos;
24 UInt32 _bufSize;
25 ISequentialOutStream *_stream;
26 UInt64 _processedSize;
27 Byte *_buf2;
28 bool _overDict;
29
30 HRESULT FlushPart() throw();
31public:
32 #ifdef _NO_EXCEPTIONS
33 HRESULT ErrorCode;
34 #endif
35
36 COutBuffer(): _buf(0), _pos(0), _stream(0), _buf2(0) {}
37 ~COutBuffer() { Free(); }
38
39 bool Create(UInt32 bufSize) throw();
40 void Free() throw();
41
42 void SetMemStream(Byte *buf) { _buf2 = buf; }
43 void SetStream(ISequentialOutStream *stream) { _stream = stream; }
44 void Init() throw();
45 HRESULT Flush() throw();
46 void FlushWithCheck();
47
48 void WriteByte(Byte b)
49 {
50 UInt32 pos = _pos;
51 _buf[pos] = b;
52 pos++;
53 _pos = pos;
54 if (pos == _limitPos)
55 FlushWithCheck();
56 }
57 void WriteBytes(const void *data, size_t size)
58 {
59 for (size_t i = 0; i < size; i++)
60 WriteByte(((const Byte *)data)[i]);
61 }
62
63 UInt64 GetProcessedSize() const throw();
64};
65
66#endif