77 lines
1.7 KiB
C++
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;
|
||
|
}
|