3 #ifndef __OUTMEMSTREAM_H
\r
4 #define __OUTMEMSTREAM_H
\r
6 #include "Common/MyCom.h"
\r
7 #include "MemBlocks.h"
\r
11 public CMyUnknownImp
\r
13 CMemBlockManagerMt *_memManager;
\r
14 size_t _curBlockIndex;
\r
15 size_t _curBlockPos;
\r
16 bool _realStreamMode;
\r
18 bool _unlockEventWasSent;
\r
19 NWindows::NSynchronization::CAutoResetEvent StopWritingEvent;
\r
20 NWindows::NSynchronization::CAutoResetEvent WriteToRealStreamEvent;
\r
21 // NWindows::NSynchronization::CAutoResetEvent NoLockEvent;
\r
23 HRESULT StopWriteResult;
\r
24 CMemLockBlocks Blocks;
\r
26 UInt64 GetPos() const { return (UInt64)_curBlockIndex * _memManager->GetBlockSize() + _curBlockPos; }
\r
28 CMyComPtr<ISequentialOutStream> OutSeqStream;
\r
29 CMyComPtr<IOutStream> OutStream;
\r
35 RINOK(StopWritingEvent.CreateIfNotCreated());
\r
36 return WriteToRealStreamEvent.CreateIfNotCreated();
\r
39 void SetOutStream(IOutStream *outStream)
\r
41 OutStream = outStream;
\r
42 OutSeqStream = outStream;
\r
45 void SetSeqOutStream(ISequentialOutStream *outStream)
\r
48 OutSeqStream = outStream;
\r
51 void ReleaseOutStream()
\r
53 OutStream.Release();
\r
54 OutSeqStream.Release();
\r
57 COutMemStream(CMemBlockManagerMt *memManager): _memManager(memManager) { }
\r
59 ~COutMemStream() { Free(); }
\r
63 HRESULT WriteToRealStream();
\r
65 void DetachData(CMemLockBlocks &blocks);
\r
67 bool WasUnlockEventSent() const { return _unlockEventWasSent; }
\r
69 void SetRealStreamMode()
\r
71 _unlockEventWasSent = true;
\r
72 WriteToRealStreamEvent.Set();
\r
76 void SetNoLockMode()
\r
78 _unlockEventWasSent = true;
\r
83 void StopWriting(HRESULT res)
\r
85 StopWriteResult = res;
\r
86 StopWritingEvent.Set();
\r
91 STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
\r
92 STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
\r
93 STDMETHOD(SetSize)(UInt64 newSize);
\r