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