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);
        }