From 07b93dcf8084bcae92fa1f33652723ca9c990db2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 22 May 2014 10:10:16 +0200 Subject: InputStream: make Seek() always absolute Remove the "whence" parameter that is not actually necessary, and only complicates the InputStream implementations. --- src/input/InputStream.cxx | 19 +++---------------- src/input/InputStream.hxx | 16 ++++++++++------ src/input/ProxyInputStream.cxx | 4 ++-- src/input/ProxyInputStream.hxx | 2 +- src/input/plugins/CdioParanoiaInputPlugin.cxx | 17 ++--------------- src/input/plugins/CurlInputPlugin.cxx | 27 +++------------------------ src/input/plugins/FfmpegInputPlugin.cxx | 6 +++--- src/input/plugins/FileInputPlugin.cxx | 8 +++----- src/input/plugins/NfsInputPlugin.cxx | 6 +++--- src/input/plugins/RewindInputPlugin.cxx | 9 ++++----- src/input/plugins/SmbclientInputPlugin.cxx | 7 +++---- 11 files changed, 37 insertions(+), 84 deletions(-) (limited to 'src/input') diff --git a/src/input/InputStream.cxx b/src/input/InputStream.cxx index e7307540d..657b9df09 100644 --- a/src/input/InputStream.cxx +++ b/src/input/InputStream.cxx @@ -23,7 +23,6 @@ #include "util/UriUtil.hxx" #include -#include /* 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 * diff --git a/src/input/InputStream.hxx b/src/input/InputStream.hxx index 5f754940b..25e99de3d 100644 --- a/src/input/InputStream.hxx +++ b/src/input/InputStream.hxx @@ -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. diff --git a/src/input/ProxyInputStream.cxx b/src/input/ProxyInputStream.cxx index 7b6e9f937..d65fb5df1 100644 --- a/src/input/ProxyInputStream.cxx +++ b/src/input/ProxyInputStream.cxx @@ -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; } diff --git a/src/input/ProxyInputStream.hxx b/src/input/ProxyInputStream.hxx index b2049fbc0..727ae5917 100644 --- a/src/input/ProxyInputStream.hxx +++ b/src/input/ProxyInputStream.hxx @@ -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; diff --git a/src/input/plugins/CdioParanoiaInputPlugin.cxx b/src/input/plugins/CdioParanoiaInputPlugin.cxx index 534084e0d..6f1ea976a 100644 --- a/src/input/plugins/CdioParanoiaInputPlugin.cxx +++ b/src/input/plugins/CdioParanoiaInputPlugin.cxx @@ -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); diff --git a/src/input/plugins/CurlInputPlugin.cxx b/src/input/plugins/CurlInputPlugin.cxx index dc26e0aa2..e464a3ce0 100644 --- a/src/input/plugins/CurlInputPlugin.cxx +++ b/src/input/plugins/CurlInputPlugin.cxx @@ -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; diff --git a/src/input/plugins/FfmpegInputPlugin.cxx b/src/input/plugins/FfmpegInputPlugin.cxx index 9ae07dbef..6e0260aee 100644 --- a/src/input/plugins/FfmpegInputPlugin.cxx +++ b/src/input/plugins/FfmpegInputPlugin.cxx @@ -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; diff --git a/src/input/plugins/FileInputPlugin.cxx b/src/input/plugins/FileInputPlugin.cxx index 1035973b6..60c316567 100644 --- a/src/input/plugins/FileInputPlugin.cxx +++ b/src/input/plugins/FileInputPlugin.cxx @@ -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; diff --git a/src/input/plugins/NfsInputPlugin.cxx b/src/input/plugins/NfsInputPlugin.cxx index b73389662..c90f00257 100644 --- a/src/input/plugins/NfsInputPlugin.cxx +++ b/src/input/plugins/NfsInputPlugin.cxx @@ -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"); diff --git a/src/input/plugins/RewindInputPlugin.cxx b/src/input/plugins/RewindInputPlugin.cxx index c18799c64..95f604044 100644 --- a/src/input/plugins/RewindInputPlugin.cxx +++ b/src/input/plugins/RewindInputPlugin.cxx @@ -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); } } diff --git a/src/input/plugins/SmbclientInputPlugin.cxx b/src/input/plugins/SmbclientInputPlugin.cxx index aa1ba0381..79987180f 100644 --- a/src/input/plugins/SmbclientInputPlugin.cxx +++ b/src/input/plugins/SmbclientInputPlugin.cxx @@ -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"); -- cgit v1.2.3