input/InputStream: migrate from class Error to C++ exceptions

This commit is contained in:
Max Kellermann
2016-09-09 18:47:42 +02:00
parent 597e59f10d
commit 8c744efd56
64 changed files with 440 additions and 473 deletions

View File

@@ -98,8 +98,8 @@ 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, Error &error) override;
size_t Read(void *ptr, size_t size) override;
void Seek(offset_type offset) override;
};
static constexpr Domain cdio_domain("cdio");
@@ -256,30 +256,26 @@ input_cdio_open(const char *uri,
lsn_from, lsn_to);
}
bool
CdioParanoiaInputStream::Seek(offset_type new_offset, Error &error)
void
CdioParanoiaInputStream::Seek(offset_type new_offset)
{
if (new_offset > size) {
error.Format(cdio_domain, "Invalid offset to seek %ld (%ld)",
(long int)new_offset, (long int)size);
return false;
}
if (new_offset > size)
throw FormatRuntimeError("Invalid offset to seek %ld (%ld)",
(long int)new_offset, (long int)size);
/* simple case */
if (new_offset == offset)
return true;
return;
/* calculate current LSN */
lsn_relofs = new_offset / CDIO_CD_FRAMESIZE_RAW;
offset = new_offset;
cdio_paranoia_seek(para, lsn_from + lsn_relofs, SEEK_SET);
return true;
}
size_t
CdioParanoiaInputStream::Read(void *ptr, size_t length, Error &error)
CdioParanoiaInputStream::Read(void *ptr, size_t length)
{
size_t nbytes = 0;
int diff;
@@ -309,11 +305,9 @@ CdioParanoiaInputStream::Read(void *ptr, size_t length, Error &error)
if (s_mess) {
free(s_mess);
}
if (!rbuf) {
error.Set(cdio_domain,
"paranoia read error. Stopping.");
return 0;
}
if (!rbuf)
throw std::runtime_error("paranoia read error");
//store current buffer
memcpy(buffer, rbuf, CDIO_CD_FRAMESIZE_RAW);
buffer_lsn = lsn_relofs;

View File

@@ -61,8 +61,8 @@ 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, Error &error) override;
size_t Read(void *ptr, size_t size) override;
void Seek(offset_type offset) override;
};
static inline bool
@@ -103,15 +103,15 @@ input_ffmpeg_open(const char *uri,
}
size_t
FfmpegInputStream::Read(void *ptr, size_t read_size, Error &error)
FfmpegInputStream::Read(void *ptr, size_t read_size)
{
auto result = avio_read(h, (unsigned char *)ptr, read_size);
if (result <= 0) {
if (result < 0)
SetFfmpegError(error, result, "avio_read() failed");
throw MakeFfmpegError(result, "avio_read() failed");
eof = true;
return false;
return 0;
}
offset += result;
@@ -124,19 +124,16 @@ FfmpegInputStream::IsEOF()
return eof;
}
bool
FfmpegInputStream::Seek(offset_type new_offset, Error &error)
void
FfmpegInputStream::Seek(offset_type new_offset)
{
auto result = avio_seek(h, new_offset, SEEK_SET);
if (result < 0) {
SetFfmpegError(error, result, "avio_seek() failed");
return false;
}
if (result < 0)
throw MakeFfmpegError(result, "avio_seek() failed");
offset = result;
eof = false;
return true;
}
const InputPlugin input_plugin_ffmpeg = {

View File

@@ -49,8 +49,8 @@ public:
return GetOffset() >= GetSize();
}
size_t Read(void *ptr, size_t size, Error &error) override;
bool Seek(offset_type offset, Error &error) override;
size_t Read(void *ptr, size_t size) override;
void Seek(offset_type offset) override;
};
InputStreamPtr
@@ -84,26 +84,19 @@ input_file_open(gcc_unused const char *filename,
return nullptr;
}
bool
FileInputStream::Seek(offset_type new_offset, Error &error)
try {
void
FileInputStream::Seek(offset_type new_offset)
{
reader.Seek((off_t)new_offset);
offset = new_offset;
return true;
} catch (const std::exception &e) {
error.Set(std::current_exception());
return false;
}
size_t
FileInputStream::Read(void *ptr, size_t read_size, Error &error)
try {
FileInputStream::Read(void *ptr, size_t read_size)
{
size_t nbytes = reader.Read(ptr, read_size);
offset += nbytes;
return nbytes;
} catch (const std::exception &e) {
error.Set(std::current_exception());
return 0;
}
const InputPlugin input_plugin_file = {

View File

@@ -63,8 +63,8 @@ public:
return !ReadingFromBuffer() && ProxyInputStream::IsEOF();
}
size_t Read(void *ptr, size_t size, Error &error) override;
bool Seek(offset_type offset, Error &error) override;
size_t Read(void *ptr, size_t size) override;
void Seek(offset_type offset) override;
private:
/**
@@ -77,7 +77,7 @@ private:
};
size_t
RewindInputStream::Read(void *ptr, size_t read_size, Error &error)
RewindInputStream::Read(void *ptr, size_t read_size)
{
if (ReadingFromBuffer()) {
/* buffered read */
@@ -96,7 +96,7 @@ RewindInputStream::Read(void *ptr, size_t read_size, Error &error)
} else {
/* pass method call to underlying stream */
size_t nbytes = input.Read(ptr, read_size, error);
size_t nbytes = input.Read(ptr, read_size);
if (input.GetOffset() > (offset_type)sizeof(buffer))
/* disable buffering */
@@ -116,9 +116,8 @@ RewindInputStream::Read(void *ptr, size_t read_size, Error &error)
}
}
bool
RewindInputStream::Seek(offset_type new_offset,
Error &error)
void
RewindInputStream::Seek(offset_type new_offset)
{
assert(IsReady());
@@ -131,14 +130,12 @@ RewindInputStream::Seek(offset_type new_offset,
head = (size_t)new_offset;
offset = new_offset;
return true;
} else {
/* disable the buffer, because input has left the
buffered range now */
tail = 0;
return ProxyInputStream::Seek(new_offset, error);
ProxyInputStream::Seek(new_offset);
}
}

View File

@@ -26,7 +26,6 @@
#include "PluginUnavailable.hxx"
#include "system/Error.hxx"
#include "util/StringCompare.hxx"
#include "util/Error.hxx"
#include <libsmbclient.h>
@@ -60,8 +59,8 @@ public:
return offset >= size;
}
size_t Read(void *ptr, size_t size, Error &error) override;
bool Seek(offset_type offset, Error &error) override;
size_t Read(void *ptr, size_t size) override;
void Seek(offset_type offset) override;
};
/*
@@ -124,33 +123,28 @@ input_smbclient_open(const char *uri,
}
size_t
SmbclientInputStream::Read(void *ptr, size_t read_size, Error &error)
SmbclientInputStream::Read(void *ptr, size_t read_size)
{
smbclient_mutex.lock();
ssize_t nbytes = smbc_read(fd, ptr, read_size);
smbclient_mutex.unlock();
if (nbytes < 0) {
error.SetErrno("smbc_read() failed");
nbytes = 0;
}
if (nbytes < 0)
throw MakeErrno("smbc_read() failed");
offset += nbytes;
return nbytes;
}
bool
SmbclientInputStream::Seek(offset_type new_offset, Error &error)
void
SmbclientInputStream::Seek(offset_type new_offset)
{
smbclient_mutex.lock();
off_t result = smbc_lseek(fd, new_offset, SEEK_SET);
smbclient_mutex.unlock();
if (result < 0) {
error.SetErrno("smbc_lseek() failed");
return false;
}
if (result < 0)
throw MakeErrno("smbc_lseek() failed");
offset = result;
return true;
}
const InputPlugin input_plugin_smbclient = {