public override long Seek(long offset, SeekOrigin origin) { if (stream == null) { throw new ObjectDisposedException("GMimeStream", "The backing stream has been closed."); } if (stream is StreamFilter) { if (offset != 0 || origin != SeekOrigin.Begin) { throw new NotSupportedException(); } // offset = 0 is a special case and means reset the streamfilter ((StreamFilter)stream).Reset(); return(0); } long ret = -1; switch (origin) { case SeekOrigin.Begin: if (offset < 0) { throw new ArgumentOutOfRangeException(); } ret = stream.Seek(offset, GMime.SeekWhence.Set); break; case SeekOrigin.Current: ret = stream.Seek(offset, GMime.SeekWhence.Cur); break; case SeekOrigin.End: if (offset > 0) { throw new ArgumentOutOfRangeException(); } ret = stream.Seek(offset, GMime.SeekWhence.End); break; } if (ret == -1) { throw new IOException(); } return(ret); }