aboutsummaryrefslogtreecommitdiffstats
path: root/src/PlaylistFile.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/PlaylistFile.cxx')
-rw-r--r--src/PlaylistFile.cxx151
1 files changed, 68 insertions, 83 deletions
diff --git a/src/PlaylistFile.cxx b/src/PlaylistFile.cxx
index 6541e6598..c05558fe3 100644
--- a/src/PlaylistFile.cxx
+++ b/src/PlaylistFile.cxx
@@ -25,7 +25,6 @@
#include "DatabasePlugin.hxx"
#include "DatabaseGlue.hxx"
#include "Song.hxx"
-#include "io_error.h"
#include "Mapper.hxx"
#include "TextFile.hxx"
#include "conf.h"
@@ -34,6 +33,7 @@
#include "fs/FileSystem.hxx"
#include "fs/DirectoryReader.hxx"
#include "util/UriUtil.hxx"
+#include "util/Error.hxx"
#include <assert.h>
#include <sys/types.h>
@@ -79,22 +79,20 @@ spl_valid_name(const char *name_utf8)
}
static const Path &
-spl_map(GError **error_r)
+spl_map(Error &error)
{
const Path &path_fs = map_spl_path();
if (path_fs.IsNull())
- g_set_error_literal(error_r, playlist_quark(),
- PLAYLIST_RESULT_DISABLED,
- "Stored playlists are disabled");
+ error.Set(playlist_domain, PLAYLIST_RESULT_DISABLED,
+ "Stored playlists are disabled");
return path_fs;
}
static bool
-spl_check_name(const char *name_utf8, GError **error_r)
+spl_check_name(const char *name_utf8, Error &error)
{
if (!spl_valid_name(name_utf8)) {
- g_set_error_literal(error_r, playlist_quark(),
- PLAYLIST_RESULT_BAD_NAME,
+ error.Set(playlist_domain, PLAYLIST_RESULT_BAD_NAME,
"Bad playlist name");
return false;
}
@@ -103,35 +101,33 @@ spl_check_name(const char *name_utf8, GError **error_r)
}
static Path
-spl_map_to_fs(const char *name_utf8, GError **error_r)
+spl_map_to_fs(const char *name_utf8, Error &error)
{
- if (spl_map(error_r).IsNull() || !spl_check_name(name_utf8, error_r))
+ if (spl_map(error).IsNull() || !spl_check_name(name_utf8, error))
return Path::Null();
Path path_fs = map_spl_utf8_to_fs(name_utf8);
if (path_fs.IsNull())
- g_set_error_literal(error_r, playlist_quark(),
- PLAYLIST_RESULT_BAD_NAME,
- "Bad playlist name");
+ error.Set(playlist_domain, PLAYLIST_RESULT_BAD_NAME,
+ "Bad playlist name");
return path_fs;
}
/**
- * Create a GError for the current errno.
+ * Create an #Error for the current errno.
*/
static void
-playlist_errno(GError **error_r)
+playlist_errno(Error &error)
{
switch (errno) {
case ENOENT:
- g_set_error_literal(error_r, playlist_quark(),
- PLAYLIST_RESULT_NO_SUCH_LIST,
- "No such playlist");
+ error.Set(playlist_domain, PLAYLIST_RESULT_NO_SUCH_LIST,
+ "No such playlist");
break;
default:
- set_error_errno(error_r);
+ error.SetErrno();
break;
}
}
@@ -168,17 +164,17 @@ LoadPlaylistFileInfo(PlaylistInfo &info,
}
PlaylistVector
-ListPlaylistFiles(GError **error_r)
+ListPlaylistFiles(Error &error)
{
PlaylistVector list;
- const Path &parent_path_fs = spl_map(error_r);
+ const Path &parent_path_fs = spl_map(error);
if (parent_path_fs.IsNull())
return list;
DirectoryReader reader(parent_path_fs);
if (reader.HasFailed()) {
- set_error_errno(error_r);
+ error.SetErrno();
return list;
}
@@ -194,20 +190,20 @@ ListPlaylistFiles(GError **error_r)
static bool
SavePlaylistFile(const PlaylistFileContents &contents, const char *utf8path,
- GError **error_r)
+ Error &error)
{
assert(utf8path != NULL);
- if (spl_map(error_r).IsNull())
+ if (spl_map(error).IsNull())
return false;
- const Path path_fs = spl_map_to_fs(utf8path, error_r);
+ const Path path_fs = spl_map_to_fs(utf8path, error);
if (path_fs.IsNull())
return false;
FILE *file = FOpen(path_fs, FOpenMode::WriteText);
if (file == NULL) {
- playlist_errno(error_r);
+ playlist_errno(error);
return false;
}
@@ -219,20 +215,20 @@ SavePlaylistFile(const PlaylistFileContents &contents, const char *utf8path,
}
PlaylistFileContents
-LoadPlaylistFile(const char *utf8path, GError **error_r)
+LoadPlaylistFile(const char *utf8path, Error &error)
{
PlaylistFileContents contents;
- if (spl_map(error_r).IsNull())
+ if (spl_map(error).IsNull())
return contents;
- const Path path_fs = spl_map_to_fs(utf8path, error_r);
+ const Path path_fs = spl_map_to_fs(utf8path, error);
if (path_fs.IsNull())
return contents;
TextFile file(path_fs);
if (file.HasFailed()) {
- playlist_errno(error_r);
+ playlist_errno(error);
return contents;
}
@@ -262,24 +258,20 @@ LoadPlaylistFile(const char *utf8path, GError **error_r)
bool
spl_move_index(const char *utf8path, unsigned src, unsigned dest,
- GError **error_r)
+ Error &error)
{
if (src == dest)
/* this doesn't check whether the playlist exists, but
what the hell.. */
return true;
- GError *error = nullptr;
- auto contents = LoadPlaylistFile(utf8path, &error);
- if (contents.empty() && error != nullptr) {
- g_propagate_error(error_r, error);
+ auto contents = LoadPlaylistFile(utf8path, error);
+ if (contents.empty() && error.IsDefined())
return false;
- }
if (src >= contents.size() || dest >= contents.size()) {
- g_set_error_literal(error_r, playlist_quark(),
- PLAYLIST_RESULT_BAD_RANGE,
- "Bad range");
+ error.Set(playlist_domain, PLAYLIST_RESULT_BAD_RANGE,
+ "Bad range");
return false;
}
@@ -290,25 +282,25 @@ spl_move_index(const char *utf8path, unsigned src, unsigned dest,
const auto dest_i = std::next(contents.begin(), dest);
contents.insert(dest_i, std::move(value));
- bool result = SavePlaylistFile(contents, utf8path, error_r);
+ bool result = SavePlaylistFile(contents, utf8path, error);
idle_add(IDLE_STORED_PLAYLIST);
return result;
}
bool
-spl_clear(const char *utf8path, GError **error_r)
+spl_clear(const char *utf8path, Error &error)
{
- if (spl_map(error_r).IsNull())
+ if (spl_map(error).IsNull())
return false;
- const Path path_fs = spl_map_to_fs(utf8path, error_r);
+ const Path path_fs = spl_map_to_fs(utf8path, error);
if (path_fs.IsNull())
return false;
FILE *file = FOpen(path_fs, FOpenMode::WriteText);
if (file == NULL) {
- playlist_errno(error_r);
+ playlist_errno(error);
return false;
}
@@ -319,14 +311,14 @@ spl_clear(const char *utf8path, GError **error_r)
}
bool
-spl_delete(const char *name_utf8, GError **error_r)
+spl_delete(const char *name_utf8, Error &error)
{
- const Path path_fs = spl_map_to_fs(name_utf8, error_r);
+ const Path path_fs = spl_map_to_fs(name_utf8, error);
if (path_fs.IsNull())
return false;
if (!RemoveFile(path_fs)) {
- playlist_errno(error_r);
+ playlist_errno(error);
return false;
}
@@ -335,58 +327,53 @@ spl_delete(const char *name_utf8, GError **error_r)
}
bool
-spl_remove_index(const char *utf8path, unsigned pos, GError **error_r)
+spl_remove_index(const char *utf8path, unsigned pos, Error &error)
{
- GError *error = nullptr;
- auto contents = LoadPlaylistFile(utf8path, &error);
- if (contents.empty() && error != nullptr) {
- g_propagate_error(error_r, error);
+ auto contents = LoadPlaylistFile(utf8path, error);
+ if (contents.empty() && error.IsDefined())
return false;
- }
if (pos >= contents.size()) {
- g_set_error_literal(error_r, playlist_quark(),
- PLAYLIST_RESULT_BAD_RANGE,
- "Bad range");
+ error.Set(playlist_domain, PLAYLIST_RESULT_BAD_RANGE,
+ "Bad range");
return false;
}
contents.erase(std::next(contents.begin(), pos));
- bool result = SavePlaylistFile(contents, utf8path, error_r);
+ bool result = SavePlaylistFile(contents, utf8path, error);
idle_add(IDLE_STORED_PLAYLIST);
return result;
}
bool
-spl_append_song(const char *utf8path, Song *song, GError **error_r)
+spl_append_song(const char *utf8path, Song *song, Error &error)
{
- if (spl_map(error_r).IsNull())
+ if (spl_map(error).IsNull())
return false;
- const Path path_fs = spl_map_to_fs(utf8path, error_r);
+ const Path path_fs = spl_map_to_fs(utf8path, error);
if (path_fs.IsNull())
return false;
FILE *file = FOpen(path_fs, FOpenMode::AppendText);
if (file == NULL) {
- playlist_errno(error_r);
+ playlist_errno(error);
return false;
}
struct stat st;
if (fstat(fileno(file), &st) < 0) {
- playlist_errno(error_r);
+ playlist_errno(error);
fclose(file);
return false;
}
if (st.st_size / (MPD_PATH_MAX + 1) >= (off_t)playlist_max_length) {
fclose(file);
- g_set_error_literal(error_r, playlist_quark(),
- PLAYLIST_RESULT_TOO_LARGE,
- "Stored playlist is too large");
+ error.Set(playlist_domain, PLAYLIST_RESULT_TOO_LARGE,
+ "Stored playlist is too large");
return false;
}
@@ -399,23 +386,23 @@ spl_append_song(const char *utf8path, Song *song, GError **error_r)
}
bool
-spl_append_uri(const char *url, const char *utf8file, GError **error_r)
+spl_append_uri(const char *url, const char *utf8file, Error &error)
{
if (uri_has_scheme(url)) {
Song *song = Song::NewRemote(url);
- bool success = spl_append_song(utf8file, song, error_r);
+ bool success = spl_append_song(utf8file, song, error);
song->Free();
return success;
} else {
- const Database *db = GetDatabase(error_r);
+ const Database *db = GetDatabase(error);
if (db == nullptr)
return false;
- Song *song = db->GetSong(url, error_r);
+ Song *song = db->GetSong(url, error);
if (song == nullptr)
return false;
- bool success = spl_append_song(utf8file, song, error_r);
+ bool success = spl_append_song(utf8file, song, error);
db->ReturnSong(song);
return success;
}
@@ -423,24 +410,22 @@ spl_append_uri(const char *url, const char *utf8file, GError **error_r)
static bool
spl_rename_internal(const Path &from_path_fs, const Path &to_path_fs,
- GError **error_r)
+ Error &error)
{
if (!FileExists(from_path_fs)) {
- g_set_error_literal(error_r, playlist_quark(),
- PLAYLIST_RESULT_NO_SUCH_LIST,
- "No such playlist");
+ error.Set(playlist_domain, PLAYLIST_RESULT_NO_SUCH_LIST,
+ "No such playlist");
return false;
}
if (FileExists(to_path_fs)) {
- g_set_error_literal(error_r, playlist_quark(),
- PLAYLIST_RESULT_LIST_EXISTS,
- "Playlist exists already");
+ error.Set(playlist_domain, PLAYLIST_RESULT_LIST_EXISTS,
+ "Playlist exists already");
return false;
}
if (!RenameFile(from_path_fs, to_path_fs)) {
- playlist_errno(error_r);
+ playlist_errno(error);
return false;
}
@@ -449,18 +434,18 @@ spl_rename_internal(const Path &from_path_fs, const Path &to_path_fs,
}
bool
-spl_rename(const char *utf8from, const char *utf8to, GError **error_r)
+spl_rename(const char *utf8from, const char *utf8to, Error &error)
{
- if (spl_map(error_r).IsNull())
+ if (spl_map(error).IsNull())
return false;
- Path from_path_fs = spl_map_to_fs(utf8from, error_r);
+ Path from_path_fs = spl_map_to_fs(utf8from, error);
if (from_path_fs.IsNull())
return false;
- Path to_path_fs = spl_map_to_fs(utf8to, error_r);
+ Path to_path_fs = spl_map_to_fs(utf8to, error);
if (to_path_fs.IsNull())
return false;
- return spl_rename_internal(from_path_fs, to_path_fs, error_r);
+ return spl_rename_internal(from_path_fs, to_path_fs, error);
}