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:
Max Kellermann
2014-05-22 10:10:16 +02:00
parent 374c6a27db
commit 07b93dcf80
28 changed files with 184 additions and 127 deletions

View File

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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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,
&current_offset);
if (result < 0) {
error.SetErrno(-result, "smbc_lseek() failed");

View File

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

View File

@@ -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");