summaryrefslogtreecommitdiffstats
path: root/hostTools/lzma/compress/WindowOut.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hostTools/lzma/compress/WindowOut.cpp')
-rw-r--r--hostTools/lzma/compress/WindowOut.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/hostTools/lzma/compress/WindowOut.cpp b/hostTools/lzma/compress/WindowOut.cpp
new file mode 100644
index 0000000..aad4af6
--- /dev/null
+++ b/hostTools/lzma/compress/WindowOut.cpp
@@ -0,0 +1,71 @@
+#include "WindowOut.h"
+
+namespace NStream {
+namespace NWindow {
+
+void COut::Create(UINT32 aKeepSizeBefore, UINT32 aKeepSizeAfter, UINT32 aKeepSizeReserv)
+{
+ m_Pos = 0;
+ m_PosLimit = aKeepSizeReserv + aKeepSizeBefore;
+ m_KeepSizeBefore = aKeepSizeBefore;
+ m_KeepSizeAfter = aKeepSizeAfter;
+ m_KeepSizeReserv = aKeepSizeReserv;
+ m_StreamPos = 0;
+ m_MoveFrom = m_KeepSizeReserv;
+ m_WindowSize = aKeepSizeBefore;
+ UINT32 aBlockSize = m_KeepSizeBefore + m_KeepSizeAfter + m_KeepSizeReserv;
+ delete []m_Buffer;
+ m_Buffer = new BYTE[aBlockSize];
+}
+
+COut::~COut()
+{
+ delete []m_Buffer;
+}
+
+void COut::SetWindowSize(UINT32 aWindowSize)
+{
+ m_WindowSize = aWindowSize;
+ m_MoveFrom = m_KeepSizeReserv + m_KeepSizeBefore - aWindowSize;
+}
+
+void COut::Init(ISequentialOutStream *aStream, bool aSolid)
+{
+ m_Stream = aStream;
+
+ if(aSolid)
+ m_StreamPos = m_Pos;
+ else
+ {
+ m_Pos = 0;
+ m_PosLimit = m_KeepSizeReserv + m_KeepSizeBefore;
+ m_StreamPos = 0;
+ }
+}
+
+HRESULT COut::Flush()
+{
+ UINT32 aSize = m_Pos - m_StreamPos;
+ if(aSize == 0)
+ return S_OK;
+ UINT32 aProcessedSize;
+ HRESULT aResult = m_Stream->Write(m_Buffer + m_StreamPos, aSize, &aProcessedSize);
+ if (aResult != S_OK)
+ return aResult;
+ if (aSize != aProcessedSize)
+ return E_FAIL;
+ m_StreamPos = m_Pos;
+ return S_OK;
+}
+
+void COut::MoveBlockBackward()
+{
+ HRESULT aResult = Flush();
+ if (aResult != S_OK)
+ throw aResult;
+ memmove(m_Buffer, m_Buffer + m_MoveFrom, m_WindowSize + m_KeepSizeAfter);
+ m_Pos -= m_MoveFrom;
+ m_StreamPos -= m_MoveFrom;
+}
+
+}}