Initial commit
This commit is contained in:
139
engine/core/resizeStream.cc
Executable file
139
engine/core/resizeStream.cc
Executable file
@@ -0,0 +1,139 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Torque Game Engine
|
||||
// Copyright (C) GarageGames.com, Inc.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "core/resizeStream.h"
|
||||
|
||||
ResizeFilterStream::ResizeFilterStream()
|
||||
: m_pStream(NULL),
|
||||
m_startOffset(0),
|
||||
m_streamLen(0),
|
||||
m_currOffset(0)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
ResizeFilterStream::~ResizeFilterStream()
|
||||
{
|
||||
detachStream();
|
||||
}
|
||||
|
||||
bool ResizeFilterStream::attachStream(Stream* io_pSlaveStream)
|
||||
{
|
||||
AssertFatal(io_pSlaveStream != NULL, "NULL Slave stream?");
|
||||
|
||||
m_pStream = io_pSlaveStream;
|
||||
m_startOffset = 0;
|
||||
m_streamLen = m_pStream->getStreamSize();
|
||||
m_currOffset = 0;
|
||||
setStatus(EOS);
|
||||
return true;
|
||||
}
|
||||
|
||||
void ResizeFilterStream::detachStream()
|
||||
{
|
||||
m_pStream = NULL;
|
||||
m_startOffset = 0;
|
||||
m_streamLen = 0;
|
||||
m_currOffset = 0;
|
||||
setStatus(Closed);
|
||||
}
|
||||
|
||||
Stream* ResizeFilterStream::getStream()
|
||||
{
|
||||
return m_pStream;
|
||||
}
|
||||
|
||||
bool ResizeFilterStream::setStreamOffset(const U32 in_startOffset, const U32 in_streamLen)
|
||||
{
|
||||
AssertFatal(m_pStream != NULL, "stream not attached!");
|
||||
if (m_pStream == NULL)
|
||||
return false;
|
||||
|
||||
U32 start = in_startOffset;
|
||||
U32 end = in_startOffset + in_streamLen;
|
||||
U32 actual = m_pStream->getStreamSize();
|
||||
|
||||
if (start >= actual || end > actual)
|
||||
return false;
|
||||
|
||||
m_startOffset = start;
|
||||
m_streamLen = in_streamLen;
|
||||
m_currOffset = 0;
|
||||
|
||||
if (m_streamLen != 0)
|
||||
setStatus(Ok);
|
||||
else
|
||||
setStatus(EOS);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
U32 ResizeFilterStream::getPosition() const
|
||||
{
|
||||
AssertFatal(m_pStream != NULL, "Error, stream not attached");
|
||||
if (m_pStream == NULL)
|
||||
return 0;
|
||||
|
||||
return m_currOffset;
|
||||
}
|
||||
|
||||
bool ResizeFilterStream::setPosition(const U32 in_newPosition)
|
||||
{
|
||||
AssertFatal(m_pStream != NULL, "Error, stream not attached");
|
||||
if (m_pStream == NULL)
|
||||
return false;
|
||||
|
||||
if (in_newPosition < m_streamLen) {
|
||||
m_currOffset = in_newPosition;
|
||||
return true;
|
||||
} else {
|
||||
m_currOffset = m_streamLen;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
U32 ResizeFilterStream::getStreamSize()
|
||||
{
|
||||
AssertFatal(m_pStream != NULL, "Error, stream not attached");
|
||||
|
||||
return m_streamLen;
|
||||
}
|
||||
|
||||
bool ResizeFilterStream::_read(const U32 in_numBytes, void* out_pBuffer)
|
||||
{
|
||||
AssertFatal(m_pStream != NULL, "Error, stream not attached");
|
||||
|
||||
if (in_numBytes == 0)
|
||||
return true;
|
||||
|
||||
AssertFatal(out_pBuffer != NULL, "Invalid output buffer");
|
||||
if (getStatus() == Closed) {
|
||||
AssertFatal(false, "Attempted read from closed stream");
|
||||
return false;
|
||||
}
|
||||
|
||||
U32 savePosition = m_pStream->getPosition();
|
||||
if (m_pStream->setPosition(m_startOffset + m_currOffset) == false)
|
||||
return false;
|
||||
|
||||
U32 actualSize = in_numBytes;
|
||||
U32 position = m_startOffset + m_currOffset;
|
||||
if (in_numBytes + position > m_startOffset + m_streamLen)
|
||||
actualSize = m_streamLen - (position - m_startOffset);
|
||||
|
||||
if (actualSize == 0) {
|
||||
setStatus(EOS);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool success = m_pStream->read(actualSize, out_pBuffer);
|
||||
m_currOffset += actualSize;
|
||||
|
||||
setStatus(m_pStream->getStatus());
|
||||
|
||||
m_pStream->setPosition(savePosition);
|
||||
return success;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user