From 220d9528a3251aaeb789e75d4f649ac04b9a9001 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 9 Sep 2016 18:34:55 +0200 Subject: archive/Plugin: migrate open() from class Error to C++ exceptions --- src/archive/ArchiveFile.hxx | 1 - src/archive/ArchivePlugin.cxx | 9 ++------- src/archive/ArchivePlugin.hxx | 9 ++++----- src/archive/plugins/Bzip2ArchivePlugin.cxx | 2 +- src/archive/plugins/Iso9660ArchivePlugin.cxx | 11 ++++------- src/archive/plugins/ZzipArchivePlugin.cxx | 10 ++++------ src/db/update/Archive.cxx | 11 ++++++----- src/input/plugins/ArchiveInputPlugin.cxx | 6 +----- test/visit_archive.cxx | 17 +++++------------ 9 files changed, 27 insertions(+), 49 deletions(-) diff --git a/src/archive/ArchiveFile.hxx b/src/archive/ArchiveFile.hxx index b7335072c..ec626dc96 100644 --- a/src/archive/ArchiveFile.hxx +++ b/src/archive/ArchiveFile.hxx @@ -22,7 +22,6 @@ class Mutex; class Cond; -class Error; struct ArchivePlugin; class ArchiveVisitor; class InputStream; diff --git a/src/archive/ArchivePlugin.cxx b/src/archive/ArchivePlugin.cxx index 79df23612..172c57354 100644 --- a/src/archive/ArchivePlugin.cxx +++ b/src/archive/ArchivePlugin.cxx @@ -20,20 +20,15 @@ #include "config.h" #include "ArchivePlugin.hxx" #include "fs/Path.hxx" -#include "util/Error.hxx" #include ArchiveFile * -archive_file_open(const ArchivePlugin *plugin, Path path, - Error &error) +archive_file_open(const ArchivePlugin *plugin, Path path) { assert(plugin != nullptr); assert(plugin->open != nullptr); assert(!path.IsNull()); - ArchiveFile *file = plugin->open(path, error); - assert((file == nullptr) == error.IsDefined()); - - return file; + return plugin->open(path); } diff --git a/src/archive/ArchivePlugin.hxx b/src/archive/ArchivePlugin.hxx index 69838ecee..e9ab3b669 100644 --- a/src/archive/ArchivePlugin.hxx +++ b/src/archive/ArchivePlugin.hxx @@ -22,7 +22,6 @@ class ArchiveFile; class Path; -class Error; struct ArchivePlugin { const char *name; @@ -43,9 +42,10 @@ struct ArchivePlugin { /** * tryes to open archive file and associates handle with archive * returns pointer to handle used is all operations with this archive - * or nullptr when opening fails + * + * Throws std::runtime_error on error. */ - ArchiveFile *(*open)(Path path_fs, Error &error); + ArchiveFile *(*open)(Path path_fs); /** * suffixes handled by this plugin. @@ -55,7 +55,6 @@ struct ArchivePlugin { }; ArchiveFile * -archive_file_open(const ArchivePlugin *plugin, Path path, - Error &error); +archive_file_open(const ArchivePlugin *plugin, Path path); #endif diff --git a/src/archive/plugins/Bzip2ArchivePlugin.cxx b/src/archive/plugins/Bzip2ArchivePlugin.cxx index 1601b8c42..89ccc0a93 100644 --- a/src/archive/plugins/Bzip2ArchivePlugin.cxx +++ b/src/archive/plugins/Bzip2ArchivePlugin.cxx @@ -127,7 +127,7 @@ Bzip2InputStream::Open() /* archive open && listing routine */ static ArchiveFile * -bz2_open(Path pathname, gcc_unused Error &error) +bz2_open(Path pathname) { static Mutex mutex; static Cond cond; diff --git a/src/archive/plugins/Iso9660ArchivePlugin.cxx b/src/archive/plugins/Iso9660ArchivePlugin.cxx index 44e3ae71a..95f0b9830 100644 --- a/src/archive/plugins/Iso9660ArchivePlugin.cxx +++ b/src/archive/plugins/Iso9660ArchivePlugin.cxx @@ -123,16 +123,13 @@ Iso9660ArchiveFile::Visit(char *path, size_t length, size_t capacity, } static ArchiveFile * -iso9660_archive_open(Path pathname, Error &error) +iso9660_archive_open(Path pathname) { /* open archive */ auto iso = iso9660_open(pathname.c_str()); - if (iso == nullptr) { - error.Format(iso9660_domain, - "Failed to open ISO9660 file %s", - pathname.c_str()); - return nullptr; - } + if (iso == nullptr) + throw FormatRuntimeError("Failed to open ISO9660 file %s", + pathname.c_str()); return new Iso9660ArchiveFile(iso); } diff --git a/src/archive/plugins/ZzipArchivePlugin.cxx b/src/archive/plugins/ZzipArchivePlugin.cxx index 45ae02cc3..506a29703 100644 --- a/src/archive/plugins/ZzipArchivePlugin.cxx +++ b/src/archive/plugins/ZzipArchivePlugin.cxx @@ -68,14 +68,12 @@ static constexpr Domain zzip_domain("zzip"); /* archive open && listing routine */ static ArchiveFile * -zzip_archive_open(Path pathname, Error &error) +zzip_archive_open(Path pathname) { ZZIP_DIR *dir = zzip_dir_open(pathname.c_str(), nullptr); - if (dir == nullptr) { - error.Format(zzip_domain, "Failed to open ZIP file %s", - pathname.c_str()); - return nullptr; - } + if (dir == nullptr) + throw FormatRuntimeError("Failed to open ZIP file %s", + pathname.c_str()); return new ZzipArchiveFile(dir); } diff --git a/src/db/update/Archive.cxx b/src/db/update/Archive.cxx index c645211fa..397a2a6a0 100644 --- a/src/db/update/Archive.cxx +++ b/src/db/update/Archive.cxx @@ -30,11 +30,11 @@ #include "archive/ArchivePlugin.hxx" #include "archive/ArchiveFile.hxx" #include "archive/ArchiveVisitor.hxx" -#include "util/Error.hxx" #include "util/StringCompare.hxx" #include "Log.hxx" #include +#include #include @@ -150,10 +150,11 @@ UpdateWalk::UpdateArchiveFile(Directory &parent, const char *name, return; /* open archive */ - Error error; - ArchiveFile *file = archive_file_open(&plugin, path_fs, error); - if (file == nullptr) { - LogError(error); + ArchiveFile *file; + try { + file = archive_file_open(&plugin, path_fs); + } catch (const std::runtime_error &e) { + LogError(e); if (directory != nullptr) editor.LockDeleteDirectory(directory); return; diff --git a/src/input/plugins/ArchiveInputPlugin.cxx b/src/input/plugins/ArchiveInputPlugin.cxx index 3e307bfcc..268c77ca0 100644 --- a/src/input/plugins/ArchiveInputPlugin.cxx +++ b/src/input/plugins/ArchiveInputPlugin.cxx @@ -29,7 +29,6 @@ #include "fs/Path.hxx" #include "Log.hxx" #include "util/ScopeExit.hxx" -#include "util/Error.hxx" #include @@ -61,10 +60,7 @@ OpenArchiveInputStream(Path path, Mutex &mutex, Cond &cond) return nullptr; } - Error error; - auto file = archive_file_open(arplug, Path::FromFS(archive), error); - if (file == nullptr) - throw std::runtime_error(error.GetMessage()); + auto file = archive_file_open(arplug, Path::FromFS(archive)); AtScopeExit(file) { file->Close(); diff --git a/test/visit_archive.cxx b/test/visit_archive.cxx index 96c2eb9d2..28d5dda35 100644 --- a/test/visit_archive.cxx +++ b/test/visit_archive.cxx @@ -27,7 +27,6 @@ #include "archive/ArchiveFile.hxx" #include "archive/ArchiveVisitor.hxx" #include "fs/Path.hxx" -#include "util/Error.hxx" #include "Log.hxx" #include @@ -46,8 +45,6 @@ class MyArchiveVisitor final : public ArchiveVisitor { int main(int argc, char **argv) try { - Error error; - if (argc != 3) { fprintf(stderr, "Usage: visit_archive PLUGIN PATH\n"); return EXIT_FAILURE; @@ -76,15 +73,11 @@ try { int result = EXIT_SUCCESS; - ArchiveFile *file = archive_file_open(plugin, path, error); - if (file != nullptr) { - MyArchiveVisitor visitor; - file->Visit(visitor); - file->Close(); - } else { - fprintf(stderr, "%s", error.GetMessage()); - result = EXIT_FAILURE; - } + ArchiveFile *file = archive_file_open(plugin, path); + + MyArchiveVisitor visitor; + file->Visit(visitor); + file->Close(); /* deinitialize everything */ -- cgit v1.2.3