xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/OutMemStream.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // OutMemStream.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_OUT_MEM_STREAM_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_OUT_MEM_STREAM_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "MemBlocks.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_1(
11*f6dc9357SAndroid Build Coastguard Worker   COutMemStream
12*f6dc9357SAndroid Build Coastguard Worker   , IOutStream
13*f6dc9357SAndroid Build Coastguard Worker )
14*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ISequentialOutStream)
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker   CMemBlockManagerMt *_memManager;
17*f6dc9357SAndroid Build Coastguard Worker   size_t _curBlockPos;
18*f6dc9357SAndroid Build Coastguard Worker   unsigned _curBlockIndex;
19*f6dc9357SAndroid Build Coastguard Worker   bool _realStreamMode;
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker   bool _unlockEventWasSent;
22*f6dc9357SAndroid Build Coastguard Worker   NWindows::NSynchronization::CAutoResetEvent_WFMO StopWritingEvent;
23*f6dc9357SAndroid Build Coastguard Worker   NWindows::NSynchronization::CAutoResetEvent_WFMO WriteToRealStreamEvent;
24*f6dc9357SAndroid Build Coastguard Worker   // NWindows::NSynchronization::CAutoResetEvent NoLockEvent;
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker   HRESULT StopWriteResult;
27*f6dc9357SAndroid Build Coastguard Worker   CMemLockBlocks Blocks;
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialOutStream> OutSeqStream;
30*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IOutStream> OutStream;
31*f6dc9357SAndroid Build Coastguard Worker 
GetPos()32*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetPos() const { return (UInt64)_curBlockIndex * _memManager->GetBlockSize() + _curBlockPos; }
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker public:
35*f6dc9357SAndroid Build Coastguard Worker 
CreateEvents(SYNC_PARAM_DECL (synchro))36*f6dc9357SAndroid Build Coastguard Worker   HRESULT CreateEvents(SYNC_PARAM_DECL(synchro))
37*f6dc9357SAndroid Build Coastguard Worker   {
38*f6dc9357SAndroid Build Coastguard Worker     WRes wres = StopWritingEvent.CreateIfNotCreated_Reset(SYNC_WFMO(synchro));
39*f6dc9357SAndroid Build Coastguard Worker     if (wres == 0)
40*f6dc9357SAndroid Build Coastguard Worker       wres = WriteToRealStreamEvent.CreateIfNotCreated_Reset(SYNC_WFMO(synchro));
41*f6dc9357SAndroid Build Coastguard Worker     return HRESULT_FROM_WIN32(wres);
42*f6dc9357SAndroid Build Coastguard Worker   }
43*f6dc9357SAndroid Build Coastguard Worker 
SetOutStream(IOutStream * outStream)44*f6dc9357SAndroid Build Coastguard Worker   void SetOutStream(IOutStream *outStream)
45*f6dc9357SAndroid Build Coastguard Worker   {
46*f6dc9357SAndroid Build Coastguard Worker     OutStream = outStream;
47*f6dc9357SAndroid Build Coastguard Worker     OutSeqStream = outStream;
48*f6dc9357SAndroid Build Coastguard Worker   }
49*f6dc9357SAndroid Build Coastguard Worker 
SetSeqOutStream(ISequentialOutStream * outStream)50*f6dc9357SAndroid Build Coastguard Worker   void SetSeqOutStream(ISequentialOutStream *outStream)
51*f6dc9357SAndroid Build Coastguard Worker   {
52*f6dc9357SAndroid Build Coastguard Worker     OutStream = NULL;
53*f6dc9357SAndroid Build Coastguard Worker     OutSeqStream = outStream;
54*f6dc9357SAndroid Build Coastguard Worker   }
55*f6dc9357SAndroid Build Coastguard Worker 
ReleaseOutStream()56*f6dc9357SAndroid Build Coastguard Worker   void ReleaseOutStream()
57*f6dc9357SAndroid Build Coastguard Worker   {
58*f6dc9357SAndroid Build Coastguard Worker     OutStream.Release();
59*f6dc9357SAndroid Build Coastguard Worker     OutSeqStream.Release();
60*f6dc9357SAndroid Build Coastguard Worker   }
61*f6dc9357SAndroid Build Coastguard Worker 
COutMemStream(CMemBlockManagerMt * memManager)62*f6dc9357SAndroid Build Coastguard Worker   COutMemStream(CMemBlockManagerMt *memManager):
63*f6dc9357SAndroid Build Coastguard Worker       _memManager(memManager)
64*f6dc9357SAndroid Build Coastguard Worker   {
65*f6dc9357SAndroid Build Coastguard Worker     /*
66*f6dc9357SAndroid Build Coastguard Worker     #ifndef _WIN32
67*f6dc9357SAndroid Build Coastguard Worker     StopWritingEvent._sync       =
68*f6dc9357SAndroid Build Coastguard Worker     WriteToRealStreamEvent._sync =  &memManager->Synchro;
69*f6dc9357SAndroid Build Coastguard Worker     #endif
70*f6dc9357SAndroid Build Coastguard Worker     */
71*f6dc9357SAndroid Build Coastguard Worker   }
72*f6dc9357SAndroid Build Coastguard Worker 
~COutMemStream()73*f6dc9357SAndroid Build Coastguard Worker   ~COutMemStream() { Free(); }
74*f6dc9357SAndroid Build Coastguard Worker   void Free();
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker   void Init();
77*f6dc9357SAndroid Build Coastguard Worker   HRESULT WriteToRealStream();
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker   void DetachData(CMemLockBlocks &blocks);
80*f6dc9357SAndroid Build Coastguard Worker 
WasUnlockEventSent()81*f6dc9357SAndroid Build Coastguard Worker   bool WasUnlockEventSent() const { return _unlockEventWasSent; }
82*f6dc9357SAndroid Build Coastguard Worker 
SetRealStreamMode()83*f6dc9357SAndroid Build Coastguard Worker   void SetRealStreamMode()
84*f6dc9357SAndroid Build Coastguard Worker   {
85*f6dc9357SAndroid Build Coastguard Worker     _unlockEventWasSent = true;
86*f6dc9357SAndroid Build Coastguard Worker     WriteToRealStreamEvent.Set();
87*f6dc9357SAndroid Build Coastguard Worker   }
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   /*
90*f6dc9357SAndroid Build Coastguard Worker   void SetNoLockMode()
91*f6dc9357SAndroid Build Coastguard Worker   {
92*f6dc9357SAndroid Build Coastguard Worker     _unlockEventWasSent = true;
93*f6dc9357SAndroid Build Coastguard Worker     NoLockEvent.Set();
94*f6dc9357SAndroid Build Coastguard Worker   }
95*f6dc9357SAndroid Build Coastguard Worker   */
96*f6dc9357SAndroid Build Coastguard Worker 
StopWriting(HRESULT res)97*f6dc9357SAndroid Build Coastguard Worker   void StopWriting(HRESULT res)
98*f6dc9357SAndroid Build Coastguard Worker   {
99*f6dc9357SAndroid Build Coastguard Worker     StopWriteResult = res;
100*f6dc9357SAndroid Build Coastguard Worker     StopWritingEvent.Set();
101*f6dc9357SAndroid Build Coastguard Worker   }
102*f6dc9357SAndroid Build Coastguard Worker };
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker #endif
105