annotate src/win32/7zip/7z/CPP/7zip/Common/OutMemStream.h @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
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