InputStream: make Seek() always absolute
Remove the "whence" parameter that is not actually necessary, and only complicates the InputStream implementations.
This commit is contained in:
@@ -23,7 +23,6 @@
|
||||
#include "util/UriUtil.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h> /* for SEEK_SET */
|
||||
|
||||
InputStream::~InputStream()
|
||||
{
|
||||
@@ -75,29 +74,17 @@ InputStream::CheapSeeking() const
|
||||
}
|
||||
|
||||
bool
|
||||
InputStream::Seek(gcc_unused offset_type new_offset, gcc_unused int whence,
|
||||
InputStream::Seek(gcc_unused offset_type new_offset,
|
||||
gcc_unused Error &error)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
InputStream::LockSeek(offset_type _offset, int whence, Error &error)
|
||||
InputStream::LockSeek(offset_type _offset, Error &error)
|
||||
{
|
||||
const ScopeLock protect(mutex);
|
||||
return Seek(_offset, whence, error);
|
||||
}
|
||||
|
||||
bool
|
||||
InputStream::Rewind(Error &error)
|
||||
{
|
||||
return Seek(0, SEEK_SET, error);
|
||||
}
|
||||
|
||||
bool
|
||||
InputStream::LockRewind(Error &error)
|
||||
{
|
||||
return LockSeek(0, SEEK_SET, error);
|
||||
return Seek(_offset, error);
|
||||
}
|
||||
|
||||
Tag *
|
||||
|
@@ -275,22 +275,26 @@ public:
|
||||
* The caller must lock the mutex.
|
||||
*
|
||||
* @param offset the relative offset
|
||||
* @param whence the base of the seek, one of SEEK_SET, SEEK_CUR, SEEK_END
|
||||
*/
|
||||
virtual bool Seek(offset_type offset, int whence, Error &error);
|
||||
virtual bool Seek(offset_type offset, Error &error);
|
||||
|
||||
/**
|
||||
* Wrapper for Seek() which locks and unlocks the mutex; the
|
||||
* caller must not be holding it already.
|
||||
*/
|
||||
bool LockSeek(offset_type offset, int whence, Error &error);
|
||||
bool LockSeek(offset_type offset, Error &error);
|
||||
|
||||
/**
|
||||
* Rewind to the beginning of the stream. This is a wrapper
|
||||
* for Seek(0, SEEK_SET, error).
|
||||
* for Seek(0, error).
|
||||
*/
|
||||
bool Rewind(Error &error);
|
||||
bool LockRewind(Error &error);
|
||||
bool Rewind(Error &error) {
|
||||
return Seek(0, error);
|
||||
}
|
||||
|
||||
bool LockRewind(Error &error) {
|
||||
return LockSeek(0, error);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the stream has reached end-of-file.
|
||||
|
@@ -63,9 +63,9 @@ ProxyInputStream::Update()
|
||||
}
|
||||
|
||||
bool
|
||||
ProxyInputStream::Seek(offset_type new_offset, int whence, Error &error)
|
||||
ProxyInputStream::Seek(offset_type new_offset, Error &error)
|
||||
{
|
||||
bool success = input.Seek(new_offset, whence, error);
|
||||
bool success = input.Seek(new_offset, error);
|
||||
CopyAttributes();
|
||||
return success;
|
||||
}
|
||||
|
@@ -45,7 +45,7 @@ public:
|
||||
/* virtual methods from InputStream */
|
||||
bool Check(Error &error) override;
|
||||
void Update() override;
|
||||
bool Seek(offset_type new_offset, int whence, Error &error) override;
|
||||
bool Seek(offset_type new_offset, Error &error) override;
|
||||
bool IsEOF() override;
|
||||
Tag *ReadTag() override;
|
||||
bool IsAvailable() override;
|
||||
|
@@ -99,7 +99,7 @@ class CdioParanoiaInputStream final : public InputStream {
|
||||
/* virtual methods from InputStream */
|
||||
bool IsEOF() override;
|
||||
size_t Read(void *ptr, size_t size, Error &error) override;
|
||||
bool Seek(offset_type offset, int whence, Error &error) override;
|
||||
bool Seek(offset_type offset, Error &error) override;
|
||||
};
|
||||
|
||||
static constexpr Domain cdio_domain("cdio");
|
||||
@@ -272,21 +272,8 @@ input_cdio_open(const char *uri,
|
||||
}
|
||||
|
||||
bool
|
||||
CdioParanoiaInputStream::Seek(InputPlugin::offset_type new_offset,
|
||||
int whence, Error &error)
|
||||
CdioParanoiaInputStream::Seek(offset_type new_offset, Error &error)
|
||||
{
|
||||
/* calculate absolute offset */
|
||||
switch (whence) {
|
||||
case SEEK_SET:
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
new_offset += offset;
|
||||
break;
|
||||
case SEEK_END:
|
||||
new_offset += size;
|
||||
break;
|
||||
}
|
||||
|
||||
if (new_offset < 0 || new_offset > size) {
|
||||
error.Format(cdio_domain, "Invalid offset to seek %ld (%ld)",
|
||||
(long int)new_offset, (long int)size);
|
||||
|
@@ -175,7 +175,7 @@ struct CurlInputStream final : public InputStream {
|
||||
}
|
||||
|
||||
size_t Read(void *ptr, size_t size, Error &error) override;
|
||||
bool Seek(offset_type offset, int whence, Error &error) override;
|
||||
bool Seek(offset_type offset, Error &error) override;
|
||||
};
|
||||
|
||||
class CurlMulti;
|
||||
@@ -887,12 +887,11 @@ CurlInputStream::InitEasy(Error &error)
|
||||
}
|
||||
|
||||
inline bool
|
||||
CurlInputStream::Seek(InputPlugin::offset_type new_offset, int whence,
|
||||
Error &error)
|
||||
CurlInputStream::Seek(offset_type new_offset, Error &error)
|
||||
{
|
||||
assert(IsReady());
|
||||
|
||||
if (whence == SEEK_SET && new_offset == offset)
|
||||
if (new_offset == offset)
|
||||
/* no-op */
|
||||
return true;
|
||||
|
||||
@@ -901,26 +900,6 @@ CurlInputStream::Seek(InputPlugin::offset_type new_offset, int whence,
|
||||
|
||||
/* calculate the absolute offset */
|
||||
|
||||
switch (whence) {
|
||||
case SEEK_SET:
|
||||
break;
|
||||
|
||||
case SEEK_CUR:
|
||||
new_offset += offset;
|
||||
break;
|
||||
|
||||
case SEEK_END:
|
||||
if (size < 0)
|
||||
/* stream size is not known */
|
||||
return false;
|
||||
|
||||
new_offset += size;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (new_offset < 0)
|
||||
return false;
|
||||
|
||||
|
@@ -60,7 +60,7 @@ struct FfmpegInputStream final : public InputStream {
|
||||
/* virtual methods from InputStream */
|
||||
bool IsEOF() override;
|
||||
size_t Read(void *ptr, size_t size, Error &error) override;
|
||||
bool Seek(offset_type offset, int whence, Error &error) override;
|
||||
bool Seek(offset_type offset, Error &error) override;
|
||||
};
|
||||
|
||||
static constexpr Domain ffmpeg_domain("ffmpeg");
|
||||
@@ -134,9 +134,9 @@ FfmpegInputStream::IsEOF()
|
||||
}
|
||||
|
||||
bool
|
||||
FfmpegInputStream::Seek(offset_type new_offset, int whence, Error &error)
|
||||
FfmpegInputStream::Seek(offset_type new_offset, Error &error)
|
||||
{
|
||||
int64_t ret = avio_seek(h, new_offset, whence);
|
||||
int64_t ret = avio_seek(h, new_offset, SEEK_SET);
|
||||
|
||||
if (ret >= 0) {
|
||||
eof = false;
|
||||
|
@@ -56,7 +56,7 @@ struct FileInputStream final : public InputStream {
|
||||
}
|
||||
|
||||
size_t Read(void *ptr, size_t size, Error &error) override;
|
||||
bool Seek(offset_type offset, int whence, Error &error) override;
|
||||
bool Seek(offset_type offset, Error &error) override;
|
||||
};
|
||||
|
||||
static InputStream *
|
||||
@@ -99,11 +99,9 @@ input_file_open(const char *filename,
|
||||
}
|
||||
|
||||
bool
|
||||
FileInputStream::Seek(InputPlugin::offset_type new_offset, int whence,
|
||||
Error &error)
|
||||
FileInputStream::Seek(offset_type new_offset, Error &error)
|
||||
{
|
||||
new_offset = (InputPlugin::offset_type)lseek(fd, (off_t)new_offset,
|
||||
whence);
|
||||
new_offset = (offset_type)lseek(fd, (off_t)new_offset, SEEK_SET);
|
||||
if (new_offset < 0) {
|
||||
error.SetErrno("Failed to seek");
|
||||
return false;
|
||||
|
@@ -61,7 +61,7 @@ public:
|
||||
}
|
||||
|
||||
size_t Read(void *ptr, size_t size, Error &error) override;
|
||||
bool Seek(offset_type offset, int whence, Error &error) override;
|
||||
bool Seek(offset_type offset, Error &error) override;
|
||||
};
|
||||
|
||||
size_t
|
||||
@@ -77,10 +77,10 @@ NfsInputStream::Read(void *ptr, size_t read_size, Error &error)
|
||||
}
|
||||
|
||||
bool
|
||||
NfsInputStream::Seek(offset_type new_offset, int whence, Error &error)
|
||||
NfsInputStream::Seek(offset_type new_offset, Error &error)
|
||||
{
|
||||
uint64_t current_offset;
|
||||
int result = nfs_lseek(ctx, fh, new_offset, whence,
|
||||
int result = nfs_lseek(ctx, fh, new_offset, SEEK_SET,
|
||||
¤t_offset);
|
||||
if (result < 0) {
|
||||
error.SetErrno(-result, "smbc_lseek() failed");
|
||||
|
@@ -64,7 +64,7 @@ public:
|
||||
}
|
||||
|
||||
size_t Read(void *ptr, size_t size, Error &error) override;
|
||||
bool Seek(offset_type offset, int whence, Error &error) override;
|
||||
bool Seek(offset_type offset, Error &error) override;
|
||||
|
||||
private:
|
||||
/**
|
||||
@@ -117,13 +117,12 @@ RewindInputStream::Read(void *ptr, size_t read_size, Error &error)
|
||||
}
|
||||
|
||||
bool
|
||||
RewindInputStream::Seek(offset_type new_offset, int whence,
|
||||
RewindInputStream::Seek(offset_type new_offset,
|
||||
Error &error)
|
||||
{
|
||||
assert(IsReady());
|
||||
|
||||
if (whence == SEEK_SET && tail > 0 &&
|
||||
new_offset <= (offset_type)tail) {
|
||||
if (tail > 0 && new_offset <= (offset_type)tail) {
|
||||
/* buffered seek */
|
||||
|
||||
assert(!ReadingFromBuffer() ||
|
||||
@@ -139,7 +138,7 @@ RewindInputStream::Seek(offset_type new_offset, int whence,
|
||||
buffered range now */
|
||||
tail = 0;
|
||||
|
||||
return ProxyInputStream::Seek(new_offset, whence, error);
|
||||
return ProxyInputStream::Seek(new_offset, error);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -57,7 +57,7 @@ public:
|
||||
}
|
||||
|
||||
size_t Read(void *ptr, size_t size, Error &error) override;
|
||||
bool Seek(offset_type offset, int whence, Error &error) override;
|
||||
bool Seek(offset_type offset, Error &error) override;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -136,11 +136,10 @@ SmbclientInputStream::Read(void *ptr, size_t read_size, Error &error)
|
||||
}
|
||||
|
||||
bool
|
||||
SmbclientInputStream::Seek(InputStream::offset_type new_offset,
|
||||
int whence, Error &error)
|
||||
SmbclientInputStream::Seek(offset_type new_offset, Error &error)
|
||||
{
|
||||
smbclient_mutex.lock();
|
||||
off_t result = smbc_lseek(fd, new_offset, whence);
|
||||
off_t result = smbc_lseek(fd, new_offset, SEEK_SET);
|
||||
smbclient_mutex.unlock();
|
||||
if (result < 0) {
|
||||
error.SetErrno("smbc_lseek() failed");
|
||||
|
Reference in New Issue
Block a user