openRange will open the source Object with the current chunk range If the current open reader implements RangeSeeker, it is tried first. When RangeSeek fails, o.Open with a RangeOption is used. A length <= 0 will request till the end of the file
()
| 177 | // |
| 178 | // A length <= 0 will request till the end of the file |
| 179 | func (cr *sequential) openRange() error { |
| 180 | offset, length := cr.chunkOffset, cr.chunkSize |
| 181 | fs.Debugf(cr.o, "ChunkedReader.openRange at %d length %d", offset, length) |
| 182 | |
| 183 | if cr.closed { |
| 184 | return ErrorFileClosed |
| 185 | } |
| 186 | |
| 187 | if rs, ok := cr.rc.(fs.RangeSeeker); ok { |
| 188 | n, err := rs.RangeSeek(cr.ctx, offset, io.SeekStart, length) |
| 189 | if err == nil && n == offset { |
| 190 | cr.offset = offset |
| 191 | return nil |
| 192 | } |
| 193 | if err != nil { |
| 194 | fs.Debugf(cr.o, "ChunkedReader.openRange seek failed (%s). Trying Open", err) |
| 195 | } else { |
| 196 | fs.Debugf(cr.o, "ChunkedReader.openRange seeked to wrong offset. Wanted %d, got %d. Trying Open", offset, n) |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | var rc io.ReadCloser |
| 201 | var err error |
| 202 | if length <= 0 { |
| 203 | if offset == 0 { |
| 204 | rc, err = cr.o.Open(cr.ctx, &fs.HashesOption{Hashes: hash.Set(hash.None)}) |
| 205 | } else { |
| 206 | rc, err = cr.o.Open(cr.ctx, &fs.HashesOption{Hashes: hash.Set(hash.None)}, &fs.RangeOption{Start: offset, End: -1}) |
| 207 | } |
| 208 | } else { |
| 209 | rc, err = cr.o.Open(cr.ctx, &fs.HashesOption{Hashes: hash.Set(hash.None)}, &fs.RangeOption{Start: offset, End: offset + length - 1}) |
| 210 | } |
| 211 | if err != nil { |
| 212 | return err |
| 213 | } |
| 214 | return cr.resetReader(rc, offset) |
| 215 | } |
| 216 | |
| 217 | // resetReader switches the current reader to the given reader. |
| 218 | // The old reader will be Close'd before setting the new reader. |