public override long Seek(long offset, SeekOrigin origin) {
switch (origin) {
case SeekOrigin.Begin:
offset += m_Offset;
if (offset > m_Offset+m_Size) {
offset = m_Offset+m_Size;
}
if (offset < m_Offset) {
offset = m_Offset;
}
break;
case SeekOrigin.End:
offset -= (m_Offset+m_Size);
if (offset > 0) {
offset = 0;
}
if (offset < -m_Size) {
offset = -m_Size;
}
break;
default:
if (m_Position+offset > m_Offset+m_Size) {
offset = (m_Offset+m_Size) - m_Position;
}
if (m_Position+offset < m_Offset) {
offset = m_Offset-m_Position;
}
break;
}
m_Position=m_ParentStream.Seek(offset, origin);
return m_Position-m_Offset;
}