rlm@1
|
1 // OutMemStream.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __OUTMEMSTREAM_H
|
rlm@1
|
4 #define __OUTMEMSTREAM_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "Common/MyCom.h"
|
rlm@1
|
7 #include "MemBlocks.h"
|
rlm@1
|
8
|
rlm@1
|
9 class COutMemStream:
|
rlm@1
|
10 public IOutStream,
|
rlm@1
|
11 public CMyUnknownImp
|
rlm@1
|
12 {
|
rlm@1
|
13 CMemBlockManagerMt *_memManager;
|
rlm@1
|
14 size_t _curBlockIndex;
|
rlm@1
|
15 size_t _curBlockPos;
|
rlm@1
|
16 bool _realStreamMode;
|
rlm@1
|
17
|
rlm@1
|
18 bool _unlockEventWasSent;
|
rlm@1
|
19 NWindows::NSynchronization::CAutoResetEvent StopWritingEvent;
|
rlm@1
|
20 NWindows::NSynchronization::CAutoResetEvent WriteToRealStreamEvent;
|
rlm@1
|
21 // NWindows::NSynchronization::CAutoResetEvent NoLockEvent;
|
rlm@1
|
22
|
rlm@1
|
23 HRESULT StopWriteResult;
|
rlm@1
|
24 CMemLockBlocks Blocks;
|
rlm@1
|
25
|
rlm@1
|
26 UInt64 GetPos() const { return (UInt64)_curBlockIndex * _memManager->GetBlockSize() + _curBlockPos; }
|
rlm@1
|
27
|
rlm@1
|
28 CMyComPtr<ISequentialOutStream> OutSeqStream;
|
rlm@1
|
29 CMyComPtr<IOutStream> OutStream;
|
rlm@1
|
30
|
rlm@1
|
31 public:
|
rlm@1
|
32
|
rlm@1
|
33 HRes CreateEvents()
|
rlm@1
|
34 {
|
rlm@1
|
35 RINOK(StopWritingEvent.CreateIfNotCreated());
|
rlm@1
|
36 return WriteToRealStreamEvent.CreateIfNotCreated();
|
rlm@1
|
37 }
|
rlm@1
|
38
|
rlm@1
|
39 void SetOutStream(IOutStream *outStream)
|
rlm@1
|
40 {
|
rlm@1
|
41 OutStream = outStream;
|
rlm@1
|
42 OutSeqStream = outStream;
|
rlm@1
|
43 }
|
rlm@1
|
44
|
rlm@1
|
45 void SetSeqOutStream(ISequentialOutStream *outStream)
|
rlm@1
|
46 {
|
rlm@1
|
47 OutStream = NULL;
|
rlm@1
|
48 OutSeqStream = outStream;
|
rlm@1
|
49 }
|
rlm@1
|
50
|
rlm@1
|
51 void ReleaseOutStream()
|
rlm@1
|
52 {
|
rlm@1
|
53 OutStream.Release();
|
rlm@1
|
54 OutSeqStream.Release();
|
rlm@1
|
55 }
|
rlm@1
|
56
|
rlm@1
|
57 COutMemStream(CMemBlockManagerMt *memManager): _memManager(memManager) { }
|
rlm@1
|
58
|
rlm@1
|
59 ~COutMemStream() { Free(); }
|
rlm@1
|
60 void Free();
|
rlm@1
|
61
|
rlm@1
|
62 void Init();
|
rlm@1
|
63 HRESULT WriteToRealStream();
|
rlm@1
|
64
|
rlm@1
|
65 void DetachData(CMemLockBlocks &blocks);
|
rlm@1
|
66
|
rlm@1
|
67 bool WasUnlockEventSent() const { return _unlockEventWasSent; }
|
rlm@1
|
68
|
rlm@1
|
69 void SetRealStreamMode()
|
rlm@1
|
70 {
|
rlm@1
|
71 _unlockEventWasSent = true;
|
rlm@1
|
72 WriteToRealStreamEvent.Set();
|
rlm@1
|
73 }
|
rlm@1
|
74
|
rlm@1
|
75 /*
|
rlm@1
|
76 void SetNoLockMode()
|
rlm@1
|
77 {
|
rlm@1
|
78 _unlockEventWasSent = true;
|
rlm@1
|
79 NoLockEvent.Set();
|
rlm@1
|
80 }
|
rlm@1
|
81 */
|
rlm@1
|
82
|
rlm@1
|
83 void StopWriting(HRESULT res)
|
rlm@1
|
84 {
|
rlm@1
|
85 StopWriteResult = res;
|
rlm@1
|
86 StopWritingEvent.Set();
|
rlm@1
|
87 }
|
rlm@1
|
88
|
rlm@1
|
89 MY_UNKNOWN_IMP
|
rlm@1
|
90
|
rlm@1
|
91 STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
|
rlm@1
|
92 STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);
|
rlm@1
|
93 STDMETHOD(SetSize)(Int64 newSize);
|
rlm@1
|
94 };
|
rlm@1
|
95
|
rlm@1
|
96 #endif
|