enderalse/source/fs.dll/common/ISegmentStream.cpp

77 lines
1.7 KiB
C++

#include "common/ISegmentStream.h"
ISegmentStream::ISegmentStream()
{
streamLength = 0;
}
ISegmentStream::~ISegmentStream()
{
}
void ISegmentStream::AttachStream(IDataStream * inStream)
{
parent = inStream;
streamLength = 0;
streamOffset = 0;
}
void ISegmentStream::AddSegment(UInt64 offset, UInt64 length, UInt64 parentOffset)
{
segmentInfo.push_back(SegmentInfo(offset, length, parentOffset));
if(streamLength < (parentOffset + length))
streamLength = parentOffset + length;
}
void ISegmentStream::ReadBuf(void * buf, UInt32 inLength)
{
UInt32 remain = inLength;
UInt8 * out = (UInt8 *)buf;
while(remain > 0)
{
SegmentInfo * info = LookupInfo(streamOffset);
ASSERT(info);
UInt64 segmentOffset = streamOffset - info->offset;
UInt64 transferLength = info->length - segmentOffset;
if(transferLength > remain)
transferLength = remain;
parent->SetOffset(info->parentOffset + segmentOffset);
parent->ReadBuf(out, transferLength);
streamOffset += transferLength;
remain -= transferLength;
}
}
void ISegmentStream::WriteBuf(const void * buf, UInt32 inLength)
{
HALT("ISegmentStream::WriteBuf: writing unsupported");
}
void ISegmentStream::SetOffset(SInt64 inOffset)
{
SegmentInfo * info = LookupInfo(inOffset);
ASSERT(info);
UInt64 segmentOffset = inOffset - info->offset;
parent->SetOffset(info->parentOffset + segmentOffset);
streamOffset = inOffset;
}
ISegmentStream::SegmentInfo * ISegmentStream::LookupInfo(UInt64 offset)
{
for(SegmentInfoListType::iterator iter = segmentInfo.begin(); iter != segmentInfo.end(); iter++)
if((offset >= (*iter).offset) && (offset < (*iter).offset + (*iter).length))
return &(*iter);
return NULL;
}