xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/OutBuffer.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // OutBuffer.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_OUT_BUFFER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_OUT_BUFFER_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../IStream.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyException.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_EXCEPTIONS
11*f6dc9357SAndroid Build Coastguard Worker struct COutBufferException: public CSystemException
12*f6dc9357SAndroid Build Coastguard Worker {
COutBufferExceptionCOutBufferException13*f6dc9357SAndroid Build Coastguard Worker   COutBufferException(HRESULT errorCode): CSystemException(errorCode) {}
14*f6dc9357SAndroid Build Coastguard Worker };
15*f6dc9357SAndroid Build Coastguard Worker #endif
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker class COutBuffer
18*f6dc9357SAndroid Build Coastguard Worker {
19*f6dc9357SAndroid Build Coastguard Worker protected:
20*f6dc9357SAndroid Build Coastguard Worker   Byte *_buf;
21*f6dc9357SAndroid Build Coastguard Worker   UInt32 _pos;
22*f6dc9357SAndroid Build Coastguard Worker   UInt32 _limitPos;
23*f6dc9357SAndroid Build Coastguard Worker   UInt32 _streamPos;
24*f6dc9357SAndroid Build Coastguard Worker   UInt32 _bufSize;
25*f6dc9357SAndroid Build Coastguard Worker   ISequentialOutStream *_stream;
26*f6dc9357SAndroid Build Coastguard Worker   UInt64 _processedSize;
27*f6dc9357SAndroid Build Coastguard Worker   Byte  *_buf2;
28*f6dc9357SAndroid Build Coastguard Worker   bool _overDict;
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker   HRESULT FlushPart() throw();
31*f6dc9357SAndroid Build Coastguard Worker public:
32*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_NO_EXCEPTIONS
33*f6dc9357SAndroid Build Coastguard Worker   HRESULT ErrorCode;
34*f6dc9357SAndroid Build Coastguard Worker   #endif
35*f6dc9357SAndroid Build Coastguard Worker 
COutBuffer()36*f6dc9357SAndroid Build Coastguard Worker   COutBuffer(): _buf(NULL), _pos(0), _stream(NULL), _buf2(NULL) {}
~COutBuffer()37*f6dc9357SAndroid Build Coastguard Worker   ~COutBuffer() { Free(); }
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker   bool Create(UInt32 bufSize) throw();
40*f6dc9357SAndroid Build Coastguard Worker   void Free() throw();
41*f6dc9357SAndroid Build Coastguard Worker 
SetMemStream(Byte * buf)42*f6dc9357SAndroid Build Coastguard Worker   void SetMemStream(Byte *buf) { _buf2 = buf; }
SetStream(ISequentialOutStream * stream)43*f6dc9357SAndroid Build Coastguard Worker   void SetStream(ISequentialOutStream *stream) { _stream = stream; }
44*f6dc9357SAndroid Build Coastguard Worker   void Init() throw();
45*f6dc9357SAndroid Build Coastguard Worker   HRESULT Flush() throw();
46*f6dc9357SAndroid Build Coastguard Worker   void FlushWithCheck();
47*f6dc9357SAndroid Build Coastguard Worker 
WriteByte(Byte b)48*f6dc9357SAndroid Build Coastguard Worker   void WriteByte(Byte b)
49*f6dc9357SAndroid Build Coastguard Worker   {
50*f6dc9357SAndroid Build Coastguard Worker     UInt32 pos = _pos;
51*f6dc9357SAndroid Build Coastguard Worker     _buf[pos] = b;
52*f6dc9357SAndroid Build Coastguard Worker     pos++;
53*f6dc9357SAndroid Build Coastguard Worker     _pos = pos;
54*f6dc9357SAndroid Build Coastguard Worker     if (pos == _limitPos)
55*f6dc9357SAndroid Build Coastguard Worker       FlushWithCheck();
56*f6dc9357SAndroid Build Coastguard Worker   }
WriteBytes(const void * data,size_t size)57*f6dc9357SAndroid Build Coastguard Worker   void WriteBytes(const void *data, size_t size)
58*f6dc9357SAndroid Build Coastguard Worker   {
59*f6dc9357SAndroid Build Coastguard Worker     for (size_t i = 0; i < size; i++)
60*f6dc9357SAndroid Build Coastguard Worker       WriteByte(((const Byte *)data)[i]);
61*f6dc9357SAndroid Build Coastguard Worker   }
62*f6dc9357SAndroid Build Coastguard Worker 
GetOutBuffer(size_t & avail)63*f6dc9357SAndroid Build Coastguard Worker   Byte *GetOutBuffer(size_t &avail)
64*f6dc9357SAndroid Build Coastguard Worker   {
65*f6dc9357SAndroid Build Coastguard Worker     const UInt32 pos = _pos;
66*f6dc9357SAndroid Build Coastguard Worker     avail = (size_t)(_limitPos - pos);
67*f6dc9357SAndroid Build Coastguard Worker     return _buf + pos;
68*f6dc9357SAndroid Build Coastguard Worker   }
69*f6dc9357SAndroid Build Coastguard Worker 
SkipWrittenBytes(size_t num)70*f6dc9357SAndroid Build Coastguard Worker   void SkipWrittenBytes(size_t num)
71*f6dc9357SAndroid Build Coastguard Worker   {
72*f6dc9357SAndroid Build Coastguard Worker     const UInt32 pos = _pos;
73*f6dc9357SAndroid Build Coastguard Worker     const UInt32 rem = _limitPos - pos;
74*f6dc9357SAndroid Build Coastguard Worker     if (rem > num)
75*f6dc9357SAndroid Build Coastguard Worker     {
76*f6dc9357SAndroid Build Coastguard Worker       _pos = pos + (UInt32)num;
77*f6dc9357SAndroid Build Coastguard Worker       return;
78*f6dc9357SAndroid Build Coastguard Worker     }
79*f6dc9357SAndroid Build Coastguard Worker     // (rem <= num)
80*f6dc9357SAndroid Build Coastguard Worker     // the caller must not call it with (rem < num)
81*f6dc9357SAndroid Build Coastguard Worker     // so (rem == num)
82*f6dc9357SAndroid Build Coastguard Worker     _pos = _limitPos;
83*f6dc9357SAndroid Build Coastguard Worker     FlushWithCheck();
84*f6dc9357SAndroid Build Coastguard Worker   }
85*f6dc9357SAndroid Build Coastguard Worker   /*
86*f6dc9357SAndroid Build Coastguard Worker   void WriteBytesBig(const void *data, size_t size)
87*f6dc9357SAndroid Build Coastguard Worker   {
88*f6dc9357SAndroid Build Coastguard Worker     while (size)
89*f6dc9357SAndroid Build Coastguard Worker     {
90*f6dc9357SAndroid Build Coastguard Worker       UInt32 pos = _pos;
91*f6dc9357SAndroid Build Coastguard Worker       UInt32 rem = _limitPos - pos;
92*f6dc9357SAndroid Build Coastguard Worker       if (rem > size)
93*f6dc9357SAndroid Build Coastguard Worker       {
94*f6dc9357SAndroid Build Coastguard Worker         _pos = pos + size;
95*f6dc9357SAndroid Build Coastguard Worker         memcpy(_buf + pos, data, size);
96*f6dc9357SAndroid Build Coastguard Worker         return;
97*f6dc9357SAndroid Build Coastguard Worker       }
98*f6dc9357SAndroid Build Coastguard Worker       memcpy(_buf + pos, data, rem);
99*f6dc9357SAndroid Build Coastguard Worker       _pos = pos + rem;
100*f6dc9357SAndroid Build Coastguard Worker       FlushWithCheck();
101*f6dc9357SAndroid Build Coastguard Worker     }
102*f6dc9357SAndroid Build Coastguard Worker   }
103*f6dc9357SAndroid Build Coastguard Worker   */
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetProcessedSize() const throw();
106*f6dc9357SAndroid Build Coastguard Worker };
107*f6dc9357SAndroid Build Coastguard Worker 
108*f6dc9357SAndroid Build Coastguard Worker #endif
109