1 // InOutTempBuffer.cpp
\r
5 #include "../../../C/7zCrc.h"
\r
7 #include "InOutTempBuffer.h"
\r
8 #include "StreamUtils.h"
\r
10 using namespace NWindows;
\r
11 using namespace NFile;
\r
12 using namespace NDirectory;
\r
14 static const UInt32 kTempBufSize = (1 << 20);
\r
16 static LPCTSTR kTempFilePrefixString = TEXT("7zt");
\r
18 CInOutTempBuffer::CInOutTempBuffer(): _buf(NULL) { }
\r
20 void CInOutTempBuffer::Create()
\r
23 _buf = new Byte[kTempBufSize];
\r
26 CInOutTempBuffer::~CInOutTempBuffer()
\r
31 void CInOutTempBuffer::InitWriting()
\r
34 _tempFileCreated = false;
\r
36 _crc = CRC_INIT_VAL;
\r
39 bool CInOutTempBuffer::WriteToFile(const void *data, UInt32 size)
\r
43 if (!_tempFileCreated)
\r
45 CSysString tempDirPath;
\r
46 if (!MyGetTempPath(tempDirPath))
\r
48 if (_tempFile.Create(tempDirPath, kTempFilePrefixString, _tempFileName) == 0)
\r
50 if (!_outFile.Create(_tempFileName, true))
\r
52 _tempFileCreated = true;
\r
55 if (!_outFile.Write(data, size, processed))
\r
57 _crc = CrcUpdate(_crc, data, processed);
\r
59 return (processed == size);
\r
62 bool CInOutTempBuffer::Write(const void *data, UInt32 size)
\r
64 if (_bufPos < kTempBufSize)
\r
66 UInt32 cur = MyMin(kTempBufSize - _bufPos, size);
\r
67 memcpy(_buf + _bufPos, data, cur);
\r
68 _crc = CrcUpdate(_crc, data, cur);
\r
71 data = ((const Byte *)data) + cur;
\r
74 return WriteToFile(data, size);
\r
77 HRESULT CInOutTempBuffer::WriteToStream(ISequentialOutStream *stream)
\r
79 if (!_outFile.Close())
\r
83 UInt32 crc = CRC_INIT_VAL;
\r
87 RINOK(WriteStream(stream, _buf, _bufPos));
\r
88 crc = CrcUpdate(crc, _buf, _bufPos);
\r
91 if (_tempFileCreated)
\r
93 NIO::CInFile inFile;
\r
94 if (!inFile.Open(_tempFileName))
\r
96 while (size < _size)
\r
99 if (!inFile.ReadPart(_buf, kTempBufSize, processed))
\r
101 if (processed == 0)
\r
103 RINOK(WriteStream(stream, _buf, processed));
\r
104 crc = CrcUpdate(crc, _buf, processed);
\r
108 return (_crc == crc && size == _size) ? S_OK : E_FAIL;
\r
111 STDMETHODIMP CSequentialOutTempBufferImp::Write(const void *data, UInt32 size, UInt32 *processed)
\r
113 if (!_buf->Write(data, size))
\r
115 if (processed != NULL)
\r
119 if (processed != NULL)
\r