From f1d07002521a4a98acf130127cf42aef20a5e258 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 11 May 2014 16:02:57 +0200 Subject: input/plugins: make InputStream the base class Prepare for adding virtual methods. --- src/input/plugins/AlsaInputPlugin.cxx | 57 ++++++--------- src/input/plugins/CdioParanoiaInputPlugin.cxx | 36 +++++----- src/input/plugins/CurlInputPlugin.cxx | 100 +++++++++++++------------- src/input/plugins/DespotifyInputPlugin.cxx | 23 +++--- src/input/plugins/FfmpegInputPlugin.cxx | 19 +++-- src/input/plugins/FileInputPlugin.cxx | 20 +++--- src/input/plugins/MmsInputPlugin.cxx | 8 +-- src/input/plugins/NfsInputPlugin.cxx | 38 +++++----- src/input/plugins/RewindInputPlugin.cxx | 66 ++++++++--------- src/input/plugins/SmbclientInputPlugin.cxx | 35 ++++----- 10 files changed, 178 insertions(+), 224 deletions(-) (limited to 'src/input/plugins') diff --git a/src/input/plugins/AlsaInputPlugin.cxx b/src/input/plugins/AlsaInputPlugin.cxx index 129219c01..c1ff41d55 100644 --- a/src/input/plugins/AlsaInputPlugin.cxx +++ b/src/input/plugins/AlsaInputPlugin.cxx @@ -32,7 +32,7 @@ #include "util/Error.hxx" #include "util/StringUtil.hxx" #include "util/ReusableArray.hxx" -#include "util/Cast.hxx" + #include "Log.hxx" #include "event/MultiSocketMonitor.hxx" #include "event/DeferredMonitor.hxx" @@ -64,8 +64,9 @@ static constexpr unsigned int default_rate = 44100; // cd quality */ static constexpr size_t read_buffer_size = 4096; -class AlsaInputStream final : MultiSocketMonitor, DeferredMonitor { - InputStream base; +class AlsaInputStream final + : public InputStream, + MultiSocketMonitor, DeferredMonitor { snd_pcm_t *capture_handle; size_t frame_size; int frames_to_read; @@ -81,23 +82,23 @@ class AlsaInputStream final : MultiSocketMonitor, DeferredMonitor { public: AlsaInputStream(EventLoop &loop, - const char *uri, Mutex &mutex, Cond &cond, + const char *_uri, Mutex &_mutex, Cond &_cond, snd_pcm_t *_handle, int _frame_size) - :MultiSocketMonitor(loop), + :InputStream(input_plugin_alsa, _uri, _mutex, _cond), + MultiSocketMonitor(loop), DeferredMonitor(loop), - base(input_plugin_alsa, uri, mutex, cond), capture_handle(_handle), frame_size(_frame_size), eof(false) { - assert(uri != nullptr); + assert(_uri != nullptr); assert(_handle != nullptr); /* this mime type forces use of the PcmDecoderPlugin. Needs to be generalised when/if that decoder is updated to support other audio formats */ - base.SetMimeType("audio/x-mpd-cdda-pcm"); - base.SetReady(); + SetMimeType("audio/x-mpd-cdda-pcm"); + InputStream::SetReady(); frames_to_read = read_buffer_size / frame_size; @@ -115,19 +116,6 @@ public: static InputStream *Create(const char *uri, Mutex &mutex, Cond &cond, Error &error); -#if GCC_CHECK_VERSION(4,6) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Winvalid-offsetof" -#endif - - static constexpr AlsaInputStream *Cast(InputStream *is) { - return ContainerCast(is, AlsaInputStream, base); - } - -#if GCC_CHECK_VERSION(4,6) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - bool Available() { if (snd_pcm_avail(capture_handle) > frames_to_read) return true; @@ -188,18 +176,17 @@ AlsaInputStream::Create(const char *uri, Mutex &mutex, Cond &cond, return nullptr; int frame_size = snd_pcm_format_width(format) / 8 * channels; - AlsaInputStream *stream = new AlsaInputStream(io_thread_get(), - uri, mutex, cond, - handle, frame_size); - return &stream->base; + return new AlsaInputStream(io_thread_get(), + uri, mutex, cond, + handle, frame_size); } inline size_t -AlsaInputStream::Read(void *ptr, size_t size, Error &error) +AlsaInputStream::Read(void *ptr, size_t read_size, Error &error) { assert(ptr != nullptr); - int num_frames = size / frame_size; + int num_frames = read_size / frame_size; int ret; while ((ret = snd_pcm_readi(capture_handle, ptr, num_frames)) < 0) { if (Recover(ret) < 0) { @@ -211,7 +198,7 @@ AlsaInputStream::Read(void *ptr, size_t size, Error &error) } size_t nbytes = ret * frame_size; - base.offset += nbytes; + offset += nbytes; return nbytes; } @@ -244,9 +231,9 @@ AlsaInputStream::DispatchSockets() { waiting = false; - const ScopeLock protect(base.mutex); + const ScopeLock protect(mutex); /* wake up the thread that is waiting for more data */ - base.cond.broadcast(); + cond.broadcast(); } inline int @@ -389,28 +376,28 @@ alsa_input_open(const char *uri, Mutex &mutex, Cond &cond, Error &error) static void alsa_input_close(InputStream *is) { - AlsaInputStream *ais = AlsaInputStream::Cast(is); + AlsaInputStream *ais = (AlsaInputStream *)is; delete ais; } static bool alsa_input_available(InputStream *is) { - AlsaInputStream *ais = AlsaInputStream::Cast(is); + AlsaInputStream *ais = (AlsaInputStream *)is; return ais->Available(); } static size_t alsa_input_read(InputStream *is, void *ptr, size_t size, Error &error) { - AlsaInputStream *ais = AlsaInputStream::Cast(is); + AlsaInputStream *ais = (AlsaInputStream *)is; return ais->Read(ptr, size, error); } static bool alsa_input_eof(gcc_unused InputStream *is) { - AlsaInputStream *ais = AlsaInputStream::Cast(is); + AlsaInputStream *ais = (AlsaInputStream *)is; return ais->IsEOF(); } diff --git a/src/input/plugins/CdioParanoiaInputPlugin.cxx b/src/input/plugins/CdioParanoiaInputPlugin.cxx index 5b4ce2ec6..8e1762427 100644 --- a/src/input/plugins/CdioParanoiaInputPlugin.cxx +++ b/src/input/plugins/CdioParanoiaInputPlugin.cxx @@ -50,9 +50,7 @@ #include -struct CdioParanoiaInputStream { - InputStream base; - +struct CdioParanoiaInputStream final : public InputStream { cdrom_drive_t *drv; CdIo_t *cdio; cdrom_paranoia_t *para; @@ -65,9 +63,9 @@ struct CdioParanoiaInputStream { char buffer[CDIO_CD_FRAMESIZE_RAW]; int buffer_lsn; - CdioParanoiaInputStream(const char *uri, Mutex &mutex, Cond &cond, + CdioParanoiaInputStream(const char *_uri, Mutex &_mutex, Cond &_cond, int _trackno) - :base(input_plugin_cdio_paranoia, uri, mutex, cond), + :InputStream(input_plugin_cdio_paranoia, _uri, _mutex, _cond), drv(nullptr), cdio(nullptr), para(nullptr), trackno(_trackno) { @@ -264,16 +262,16 @@ input_cdio_open(const char *uri, /* seek to beginning of the track */ cdio_paranoia_seek(i->para, i->lsn_from, SEEK_SET); - i->base.ready = true; - i->base.seekable = true; - i->base.size = (i->lsn_to - i->lsn_from + 1) * CDIO_CD_FRAMESIZE_RAW; + i->seekable = true; + i->size = (i->lsn_to - i->lsn_from + 1) * CDIO_CD_FRAMESIZE_RAW; /* hack to make MPD select the "pcm" decoder plugin */ - i->base.SetMimeType(reverse_endian + i->SetMimeType(reverse_endian ? "audio/x-mpd-cdda-pcm-reverse" : "audio/x-mpd-cdda-pcm"); + i->SetReady(); - return &i->base; + return i; } static bool @@ -287,26 +285,26 @@ input_cdio_seek(InputStream *is, case SEEK_SET: break; case SEEK_CUR: - offset += cis->base.offset; + offset += cis->offset; break; case SEEK_END: - offset += cis->base.size; + offset += cis->size; break; } - if (offset < 0 || offset > cis->base.size) { + if (offset < 0 || offset > cis->size) { error.Format(cdio_domain, "Invalid offset to seek %ld (%ld)", - (long int)offset, (long int)cis->base.size); + (long int)offset, (long int)cis->size); return false; } /* simple case */ - if (offset == cis->base.offset) + if (offset == cis->offset) return true; /* calculate current LSN */ cis->lsn_relofs = offset / CDIO_CD_FRAMESIZE_RAW; - cis->base.offset = offset; + cis->offset = offset; cdio_paranoia_seek(cis->para, cis->lsn_from + cis->lsn_relofs, SEEK_SET); @@ -360,7 +358,7 @@ input_cdio_read(InputStream *is, void *ptr, size_t length, } //correct offset - diff = cis->base.offset - cis->lsn_relofs * CDIO_CD_FRAMESIZE_RAW; + diff = cis->offset - cis->lsn_relofs * CDIO_CD_FRAMESIZE_RAW; assert(diff >= 0 && diff < CDIO_CD_FRAMESIZE_RAW); @@ -374,8 +372,8 @@ input_cdio_read(InputStream *is, void *ptr, size_t length, nbytes += len; //update offset - cis->base.offset += len; - cis->lsn_relofs = cis->base.offset / CDIO_CD_FRAMESIZE_RAW; + cis->offset += len; + cis->lsn_relofs = cis->offset / CDIO_CD_FRAMESIZE_RAW; //update length length -= len; } diff --git a/src/input/plugins/CurlInputPlugin.cxx b/src/input/plugins/CurlInputPlugin.cxx index 5f8b9150a..63fb84190 100644 --- a/src/input/plugins/CurlInputPlugin.cxx +++ b/src/input/plugins/CurlInputPlugin.cxx @@ -67,9 +67,7 @@ static const size_t CURL_MAX_BUFFERED = 512 * 1024; */ static const size_t CURL_RESUME_AT = 384 * 1024; -struct CurlInputStream { - InputStream base; - +struct CurlInputStream final : public InputStream { /* some buffers which were passed to libcurl, which we have too free */ char range[32]; @@ -106,9 +104,9 @@ struct CurlInputStream { Error postponed_error; - CurlInputStream(const char *url, Mutex &mutex, Cond &cond, + CurlInputStream(const char *_url, Mutex &_mutex, Cond &_cond, void *_buffer) - :base(input_plugin_curl, url, mutex, cond), + :InputStream(input_plugin_curl, _url, _mutex, _cond), request_headers(nullptr), buffer((uint8_t *)_buffer, CURL_MAX_BUFFERED), paused(false), @@ -486,7 +484,7 @@ CurlInputStream::RequestDone(CURLcode result, long status) FreeEasy(); - const ScopeLock protect(base.mutex); + const ScopeLock protect(mutex); if (result != CURLE_OK) { postponed_error.Format(curl_domain, result, @@ -497,7 +495,7 @@ CurlInputStream::RequestDone(CURLcode result, long status) status); } - base.SetReady(); + SetReady(); } static void @@ -688,7 +686,7 @@ inline bool CurlInputStream::FillBuffer(Error &error) { while (easy != nullptr && buffer.IsEmpty()) - base.cond.wait(base.mutex); + cond.wait(mutex); if (postponed_error.IsDefined()) { error = std::move(postponed_error); @@ -768,7 +766,7 @@ input_curl_available(InputStream *is) } inline size_t -CurlInputStream::Read(void *ptr, size_t size, Error &error) +CurlInputStream::Read(void *ptr, size_t read_size, Error &error) { size_t nbytes; @@ -778,22 +776,22 @@ CurlInputStream::Read(void *ptr, size_t size, Error &error) if (!FillBuffer(error)) return 0; - nbytes = read_from_buffer(icy, buffer, ptr, size); + nbytes = read_from_buffer(icy, buffer, ptr, read_size); } while (nbytes == 0); if (icy.IsDefined()) CopyIcyTag(); - base.offset += (InputPlugin::offset_type)nbytes; + offset += (InputPlugin::offset_type)nbytes; if (paused && GetTotalBufferSize() < CURL_RESUME_AT) { - base.mutex.unlock(); + mutex.unlock(); BlockingCall(io_thread_get(), [this](){ Resume(); }); - base.mutex.lock(); + mutex.lock(); } return nbytes; @@ -828,11 +826,11 @@ CurlInputStream::HeaderReceived(const char *name, std::string &&value) if (StringEqualsCaseASCII(name, "accept-ranges")) { /* a stream with icy-metadata is not seekable */ if (!icy.IsDefined()) - base.seekable = true; + seekable = true; } else if (StringEqualsCaseASCII(name, "content-length")) { - base.size = base.offset + ParseUint64(value.c_str()); + size = offset + ParseUint64(value.c_str()); } else if (StringEqualsCaseASCII(name, "content-type")) { - base.SetMimeType(std::move(value)); + SetMimeType(std::move(value)); } else if (StringEqualsCaseASCII(name, "icy-name") || StringEqualsCaseASCII(name, "ice-name") || StringEqualsCaseASCII(name, "x-audiocast-name")) { @@ -856,7 +854,7 @@ CurlInputStream::HeaderReceived(const char *name, std::string &&value) /* a stream with icy-metadata is not seekable */ - base.seekable = false; + seekable = false; } } } @@ -898,13 +896,13 @@ input_curl_headerfunction(void *ptr, size_t size, size_t nmemb, void *stream) } inline size_t -CurlInputStream::DataReceived(const void *ptr, size_t size) +CurlInputStream::DataReceived(const void *ptr, size_t received_size) { - assert(size > 0); + assert(received_size > 0); - const ScopeLock protect(base.mutex); + const ScopeLock protect(mutex); - if (size > buffer.GetSpace()) { + if (received_size > buffer.GetSpace()) { paused = true; return CURL_WRITEFUNC_PAUSE; } @@ -912,23 +910,23 @@ CurlInputStream::DataReceived(const void *ptr, size_t size) auto w = buffer.Write(); assert(!w.IsEmpty()); - size_t nbytes = std::min(w.size, size); + size_t nbytes = std::min(w.size, received_size); memcpy(w.data, ptr, nbytes); buffer.Append(nbytes); - const size_t remaining = size - nbytes; + const size_t remaining = received_size - nbytes; if (remaining > 0) { w = buffer.Write(); assert(!w.IsEmpty()); assert(w.size >= remaining); memcpy(w.data, (const uint8_t *)ptr + nbytes, remaining); - buffer.Append(size); + buffer.Append(received_size); } - base.ready = true; - base.cond.broadcast(); - return size; + ready = true; + cond.broadcast(); + return received_size; } /** called by curl when new data is available */ @@ -986,7 +984,7 @@ CurlInputStream::InitEasy(Error &error) curl_easy_setopt(easy, CURLOPT_PROXYUSERPWD, proxy_auth_str); } - CURLcode code = curl_easy_setopt(easy, CURLOPT_URL, base.GetURI()); + CURLcode code = curl_easy_setopt(easy, CURLOPT_URL, GetURI()); if (code != CURLE_OK) { error.Format(curl_domain, code, "curl_easy_setopt() failed: %s", @@ -1003,16 +1001,16 @@ CurlInputStream::InitEasy(Error &error) } inline bool -CurlInputStream::Seek(InputPlugin::offset_type offset, int whence, +CurlInputStream::Seek(InputPlugin::offset_type new_offset, int whence, Error &error) { - assert(base.ready); + assert(IsReady()); - if (whence == SEEK_SET && offset == base.offset) + if (whence == SEEK_SET && new_offset == offset) /* no-op */ return true; - if (!base.seekable) + if (!IsSeekable()) return false; /* calculate the absolute offset */ @@ -1022,52 +1020,52 @@ CurlInputStream::Seek(InputPlugin::offset_type offset, int whence, break; case SEEK_CUR: - offset += base.offset; + new_offset += offset; break; case SEEK_END: - if (base.size < 0) + if (size < 0) /* stream size is not known */ return false; - offset += base.size; + new_offset += size; break; default: return false; } - if (offset < 0) + if (new_offset < 0) return false; /* check if we can fast-forward the buffer */ - while (offset > base.offset) { + while (new_offset > offset) { auto r = buffer.Read(); if (r.IsEmpty()) break; const size_t nbytes = - offset - base.offset < (InputPlugin::offset_type)r.size - ? offset - base.offset - : r.size; + new_offset - offset < (InputPlugin::offset_type)r.size + ? new_offset - offset + : r.size; buffer.Consume(nbytes); - base.offset += nbytes; + offset += nbytes; } - if (offset == base.offset) + if (new_offset == offset) return true; /* close the old connection and open a new one */ - base.mutex.unlock(); + mutex.unlock(); FreeEasyIndirect(); buffer.Clear(); - base.offset = offset; - if (base.offset == base.size) { + offset = new_offset; + if (offset == size) { /* seek to EOF: simulate empty result; avoid triggering a "416 Requested Range Not Satisfiable" response */ @@ -1079,18 +1077,18 @@ CurlInputStream::Seek(InputPlugin::offset_type offset, int whence, /* send the "Range" header */ - if (base.offset > 0) { - sprintf(range, "%lld-", (long long)base.offset); + if (offset > 0) { + sprintf(range, "%lld-", (long long)offset); curl_easy_setopt(easy, CURLOPT_RANGE, range); } - base.ready = false; + ready = false; if (!input_curl_easy_add_indirect(this, error)) return false; - base.mutex.lock(); - base.WaitReady(); + mutex.lock(); + WaitReady(); if (postponed_error.IsDefined()) { error = std::move(postponed_error); @@ -1127,7 +1125,7 @@ CurlInputStream::Open(const char *url, Mutex &mutex, Cond &cond, return nullptr; } - return &c->base; + return c; } static InputStream * diff --git a/src/input/plugins/DespotifyInputPlugin.cxx b/src/input/plugins/DespotifyInputPlugin.cxx index 702ebc132..16ef07f0d 100644 --- a/src/input/plugins/DespotifyInputPlugin.cxx +++ b/src/input/plugins/DespotifyInputPlugin.cxx @@ -36,9 +36,7 @@ extern "C" { #include -class DespotifyInputStream { - InputStream base; - +class DespotifyInputStream final : public InputStream { struct despotify_session *session; struct ds_track *track; Tag tag; @@ -46,11 +44,11 @@ class DespotifyInputStream { size_t len_available; bool eof; - DespotifyInputStream(const char *uri, - Mutex &mutex, Cond &cond, + DespotifyInputStream(const char *_uri, + Mutex &_mutex, Cond &_cond, despotify_session *_session, ds_track *_track) - :base(input_plugin_despotify, uri, mutex, cond), + :InputStream(input_plugin_despotify, _uri, _mutex, _cond), session(_session), track(_track), tag(mpd_despotify_tag_from_track(*track)), len_available(0), eof(false) { @@ -58,8 +56,8 @@ class DespotifyInputStream { memset(&pcm, 0, sizeof(pcm)); /* Despotify outputs pcm data */ - base.SetMimeType("audio/x-mpd-cdda-pcm"); - base.SetReady(); + SetMimeType("audio/x-mpd-cdda-pcm"); + SetReady(); } public: @@ -190,7 +188,7 @@ DespotifyInputStream::Open(const char *url, return nullptr; } - return &ctx->base; + return ctx; } static InputStream * @@ -200,16 +198,17 @@ input_despotify_open(const char *url, Mutex &mutex, Cond &cond, Error &error) } inline size_t -DespotifyInputStream::Read(void *ptr, size_t size, gcc_unused Error &error) +DespotifyInputStream::Read(void *ptr, size_t read_size, + gcc_unused Error &error) { if (len_available == 0) FillBuffer(); - size_t to_cpy = std::min(size, len_available); + size_t to_cpy = std::min(read_size, len_available); memcpy(ptr, pcm.buf, to_cpy); len_available -= to_cpy; - base.offset += to_cpy; + offset += to_cpy; return to_cpy; } diff --git a/src/input/plugins/FfmpegInputPlugin.cxx b/src/input/plugins/FfmpegInputPlugin.cxx index d06d4705a..affd76718 100644 --- a/src/input/plugins/FfmpegInputPlugin.cxx +++ b/src/input/plugins/FfmpegInputPlugin.cxx @@ -33,26 +33,24 @@ extern "C" { #include } -struct FfmpegInputStream { - InputStream base; - +struct FfmpegInputStream final : public InputStream { AVIOContext *h; bool eof; - FfmpegInputStream(const char *uri, Mutex &mutex, Cond &cond, + FfmpegInputStream(const char *_uri, Mutex &_mutex, Cond &_cond, AVIOContext *_h) - :base(input_plugin_ffmpeg, uri, mutex, cond), + :InputStream(input_plugin_ffmpeg, _uri, _mutex, _cond), h(_h), eof(false) { - base.ready = true; - base.seekable = (h->seekable & AVIO_SEEKABLE_NORMAL) != 0; - base.size = avio_size(h); + seekable = (h->seekable & AVIO_SEEKABLE_NORMAL) != 0; + size = avio_size(h); /* hack to make MPD select the "ffmpeg" decoder plugin - since avio.h doesn't tell us the MIME type of the resource, we can't select a decoder plugin, but the "ffmpeg" plugin is quite good at auto-detection */ - base.SetMimeType("audio/x-mpd-ffmpeg"); + SetMimeType("audio/x-mpd-ffmpeg"); + SetReady(); } ~FfmpegInputStream() { @@ -105,8 +103,7 @@ input_ffmpeg_open(const char *uri, return nullptr; } - auto *i = new FfmpegInputStream(uri, mutex, cond, h); - return &i->base; + return new FfmpegInputStream(uri, mutex, cond, h); } static size_t diff --git a/src/input/plugins/FileInputPlugin.cxx b/src/input/plugins/FileInputPlugin.cxx index 49dc3df7e..932db2150 100644 --- a/src/input/plugins/FileInputPlugin.cxx +++ b/src/input/plugins/FileInputPlugin.cxx @@ -33,18 +33,16 @@ static constexpr Domain file_domain("file"); -struct FileInputStream { - InputStream base; - +struct FileInputStream final : public InputStream { int fd; - FileInputStream(const char *path, int _fd, off_t size, - Mutex &mutex, Cond &cond) - :base(input_plugin_file, path, mutex, cond), + FileInputStream(const char *path, int _fd, off_t _size, + Mutex &_mutex, Cond &_cond) + :InputStream(input_plugin_file, path, _mutex, _cond), fd(_fd) { - base.size = size; - base.seekable = true; - base.SetReady(); + size = _size; + seekable = true; + SetReady(); } ~FileInputStream() { @@ -88,9 +86,7 @@ input_file_open(const char *filename, posix_fadvise(fd, (off_t)0, st.st_size, POSIX_FADV_SEQUENTIAL); #endif - FileInputStream *fis = new FileInputStream(filename, fd, st.st_size, - mutex, cond); - return &fis->base; + return new FileInputStream(filename, fd, st.st_size, mutex, cond); } static bool diff --git a/src/input/plugins/MmsInputPlugin.cxx b/src/input/plugins/MmsInputPlugin.cxx index 845fe5d5d..d4095b2cb 100644 --- a/src/input/plugins/MmsInputPlugin.cxx +++ b/src/input/plugins/MmsInputPlugin.cxx @@ -33,8 +33,8 @@ class MmsInputStream final : public ThreadInputStream { mmsx_t *mms; public: - MmsInputStream(const char *uri, Mutex &mutex, Cond &cond) - :ThreadInputStream(input_plugin_mms, uri, mutex, cond, + MmsInputStream(const char *_uri, Mutex &_mutex, Cond &_cond) + :ThreadInputStream(input_plugin_mms, _uri, _mutex, _cond, MMS_BUFFER_SIZE) { } @@ -89,9 +89,9 @@ input_mms_open(const char *url, } size_t -MmsInputStream::Read(void *ptr, size_t size, Error &error) +MmsInputStream::Read(void *ptr, size_t read_size, Error &error) { - int nbytes = mmsx_read(nullptr, mms, (char *)ptr, size); + int nbytes = mmsx_read(nullptr, mms, (char *)ptr, read_size); if (nbytes <= 0) { if (nbytes < 0) error.SetErrno("mmsx_read() failed"); diff --git a/src/input/plugins/NfsInputPlugin.cxx b/src/input/plugins/NfsInputPlugin.cxx index 5081eff27..9b5ca5959 100644 --- a/src/input/plugins/NfsInputPlugin.cxx +++ b/src/input/plugins/NfsInputPlugin.cxx @@ -33,22 +33,20 @@ extern "C" { #include #include -class NfsInputStream { - InputStream base; - +class NfsInputStream final : public InputStream { nfs_context *ctx; nfsfh *fh; public: - NfsInputStream(const char *uri, - Mutex &mutex, Cond &cond, + NfsInputStream(const char *_uri, + Mutex &_mutex, Cond &_cond, nfs_context *_ctx, nfsfh *_fh, - InputStream::offset_type size) - :base(input_plugin_nfs, uri, mutex, cond), + InputStream::offset_type _size) + :InputStream(input_plugin_nfs, _uri, _mutex, _cond), ctx(_ctx), fh(_fh) { - base.ready = true; - base.seekable = true; - base.size = size; + seekable = true; + size = _size; + SetReady(); } ~NfsInputStream() { @@ -56,16 +54,12 @@ public: nfs_destroy_context(ctx); } - InputStream *GetBase() { - return &base; - } - bool IsEOF() const { - return base.offset >= base.size; + return offset >= size; } - size_t Read(void *ptr, size_t size, Error &error) { - int nbytes = nfs_read(ctx, fh, size, (char *)ptr); + size_t Read(void *ptr, size_t read_size, Error &error) { + int nbytes = nfs_read(ctx, fh, read_size, (char *)ptr); if (nbytes < 0) { error.SetErrno(-nbytes, "nfs_read() failed"); nbytes = 0; @@ -74,15 +68,16 @@ public: return nbytes; } - bool Seek(InputStream::offset_type offset, int whence, Error &error) { + bool Seek(InputStream::offset_type new_offset, int whence, Error &error) { uint64_t current_offset; - int result = nfs_lseek(ctx, fh, offset, whence, ¤t_offset); + int result = nfs_lseek(ctx, fh, new_offset, whence, + ¤t_offset); if (result < 0) { error.SetErrno(-result, "smbc_lseek() failed"); return false; } - base.offset = current_offset; + offset = current_offset; return true; } }; @@ -150,8 +145,7 @@ input_nfs_open(const char *uri, return nullptr; } - auto is = new NfsInputStream(uri, mutex, cond, ctx, fh, st.st_size); - return is->GetBase(); + return new NfsInputStream(uri, mutex, cond, ctx, fh, st.st_size); } static size_t diff --git a/src/input/plugins/RewindInputPlugin.cxx b/src/input/plugins/RewindInputPlugin.cxx index d8ef62021..9665615f8 100644 --- a/src/input/plugins/RewindInputPlugin.cxx +++ b/src/input/plugins/RewindInputPlugin.cxx @@ -28,9 +28,7 @@ extern const InputPlugin rewind_input_plugin; -class RewindInputStream { - InputStream base; - +class RewindInputStream final : public InputStream { InputStream *input; /** @@ -56,8 +54,8 @@ class RewindInputStream { public: RewindInputStream(InputStream *_input) - :base(rewind_input_plugin, _input->GetURI(), - _input->mutex, _input->cond), + :InputStream(rewind_input_plugin, _input->GetURI(), + _input->mutex, _input->cond), input(_input), tail(0) { } @@ -65,10 +63,6 @@ public: input->Close(); } - InputStream *GetBase() { - return &base; - } - bool Check(Error &error) { return input->Check(error); } @@ -100,7 +94,7 @@ private: * buffer contain more data for the next read operation? */ bool ReadingFromBuffer() const { - return tail > 0 && base.offset < input->offset; + return tail > 0 && offset < input->offset; } /** @@ -110,21 +104,20 @@ private: * attributes. */ void CopyAttributes() { - InputStream *dest = &base; const InputStream *src = input; - assert(dest != src); + assert(src != this); - if (!dest->IsReady() && src->IsReady()) { + if (!IsReady() && src->IsReady()) { if (src->HasMimeType()) - dest->SetMimeType(src->GetMimeType()); + SetMimeType(src->GetMimeType()); - dest->size = src->GetSize(); - dest->seekable = src->IsSeekable(); - dest->SetReady(); + size = src->GetSize(); + seekable = src->IsSeekable(); + SetReady(); } - dest->offset = src->offset; + offset = src->offset; } }; @@ -169,31 +162,31 @@ input_rewind_available(InputStream *is) } inline size_t -RewindInputStream::Read(void *ptr, size_t size, Error &error) +RewindInputStream::Read(void *ptr, size_t read_size, Error &error) { if (ReadingFromBuffer()) { /* buffered read */ - assert(head == (size_t)base.offset); + assert(head == (size_t)offset); assert(tail == (size_t)input->offset); - if (size > tail - head) - size = tail - head; + if (read_size > tail - head) + read_size = tail - head; - memcpy(ptr, buffer + head, size); - head += size; - base.offset += size; + memcpy(ptr, buffer + head, read_size); + head += read_size; + offset += read_size; - return size; + return read_size; } else { /* pass method call to underlying stream */ - size_t nbytes = input->Read(ptr, size, error); + size_t nbytes = input->Read(ptr, read_size, error); if (input->offset > (InputPlugin::offset_type)sizeof(buffer)) /* disable buffering */ tail = 0; - else if (tail == (size_t)base.offset) { + else if (tail == (size_t)offset) { /* append to buffer */ memcpy(buffer + tail, ptr, nbytes); @@ -226,25 +219,25 @@ input_rewind_eof(InputStream *is) } inline bool -RewindInputStream::Seek(InputPlugin::offset_type offset, int whence, +RewindInputStream::Seek(InputPlugin::offset_type new_offset, int whence, Error &error) { - assert(base.IsReady()); + assert(IsReady()); if (whence == SEEK_SET && tail > 0 && - offset <= (InputPlugin::offset_type)tail) { + new_offset <= (InputPlugin::offset_type)tail) { /* buffered seek */ assert(!ReadingFromBuffer() || - head == (size_t)base.offset); + head == (size_t)offset); assert(tail == (size_t)input->offset); - head = (size_t)offset; - base.offset = offset; + head = (size_t)new_offset; + offset = new_offset; return true; } else { - bool success = input->Seek(offset, whence, error); + bool success = input->Seek(new_offset, whence, error); CopyAttributes(); /* disable the buffer, because input has left the @@ -290,6 +283,5 @@ input_rewind_open(InputStream *is) /* seekable resources don't need this plugin */ return is; - RewindInputStream *c = new RewindInputStream(is); - return c->GetBase(); + return new RewindInputStream(is); } diff --git a/src/input/plugins/SmbclientInputPlugin.cxx b/src/input/plugins/SmbclientInputPlugin.cxx index 9709d089a..c291f0608 100644 --- a/src/input/plugins/SmbclientInputPlugin.cxx +++ b/src/input/plugins/SmbclientInputPlugin.cxx @@ -28,21 +28,19 @@ #include -class SmbclientInputStream { - InputStream base; - +class SmbclientInputStream final : public InputStream { SMBCCTX *ctx; int fd; public: - SmbclientInputStream(const char *uri, - Mutex &mutex, Cond &cond, + SmbclientInputStream(const char *_uri, + Mutex &_mutex, Cond &_cond, SMBCCTX *_ctx, int _fd, const struct stat &st) - :base(input_plugin_smbclient, uri, mutex, cond), + :InputStream(input_plugin_smbclient, _uri, _mutex, _cond), ctx(_ctx), fd(_fd) { - base.ready = true; - base.seekable = true; - base.size = st.st_size; + seekable = true; + size = st.st_size; + SetReady(); } ~SmbclientInputStream() { @@ -52,17 +50,13 @@ public: smbclient_mutex.unlock(); } - InputStream *GetBase() { - return &base; - } - bool IsEOF() const { - return base.offset >= base.size; + return offset >= size; } - size_t Read(void *ptr, size_t size, Error &error) { + size_t Read(void *ptr, size_t read_size, Error &error) { smbclient_mutex.lock(); - ssize_t nbytes = smbc_read(fd, ptr, size); + ssize_t nbytes = smbc_read(fd, ptr, read_size); smbclient_mutex.unlock(); if (nbytes < 0) { error.SetErrno("smbc_read() failed"); @@ -72,16 +66,16 @@ public: return nbytes; } - bool Seek(InputStream::offset_type offset, int whence, Error &error) { + bool Seek(InputStream::offset_type new_offset, int whence, Error &error) { smbclient_mutex.lock(); - off_t result = smbc_lseek(fd, offset, whence); + off_t result = smbc_lseek(fd, new_offset, whence); smbclient_mutex.unlock(); if (result < 0) { error.SetErrno("smbc_lseek() failed"); return false; } - base.offset = result; + offset = result; return true; } }; @@ -144,8 +138,7 @@ input_smbclient_open(const char *uri, return nullptr; } - auto s = new SmbclientInputStream(uri, mutex, cond, ctx, fd, st); - return s->GetBase(); + return new SmbclientInputStream(uri, mutex, cond, ctx, fd, st); } static size_t -- cgit v1.2.3