diff options
Diffstat (limited to '')
-rw-r--r-- | src/PlaylistSave.cxx | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/src/PlaylistSave.cxx b/src/PlaylistSave.cxx index 67f05267f..a2f48ba54 100644 --- a/src/PlaylistSave.cxx +++ b/src/PlaylistSave.cxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2014 The Music Player Daemon Project + * Copyright (C) 2003-2015 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -29,6 +29,9 @@ #include "fs/AllocatedPath.hxx" #include "fs/Traits.hxx" #include "fs/FileSystem.hxx" +#include "fs/NarrowPath.hxx" +#include "fs/io/FileOutputStream.hxx" +#include "fs/io/BufferedOutputStream.hxx" #include "util/Alloc.hxx" #include "util/UriUtil.hxx" #include "util/Error.hxx" @@ -37,7 +40,7 @@ #include <string.h> void -playlist_print_song(FILE *file, const DetachedSong &song) +playlist_print_song(BufferedOutputStream &os, const DetachedSong &song) { const char *uri_utf8 = playlist_saveAbsolutePaths ? song.GetRealURI() @@ -45,11 +48,11 @@ playlist_print_song(FILE *file, const DetachedSong &song) const auto uri_fs = AllocatedPath::FromUTF8(uri_utf8); if (!uri_fs.IsNull()) - fprintf(file, "%s\n", uri_fs.c_str()); + os.Format("%s\n", NarrowPath(uri_fs).c_str()); } void -playlist_print_uri(FILE *file, const char *uri) +playlist_print_uri(BufferedOutputStream &os, const char *uri) { auto path = #ifdef ENABLE_DATABASE @@ -61,41 +64,43 @@ playlist_print_uri(FILE *file, const char *uri) AllocatedPath::FromUTF8(uri); if (!path.IsNull()) - fprintf(file, "%s\n", path.c_str()); + os.Format("%s\n", NarrowPath(path).c_str()); } -PlaylistResult -spl_save_queue(const char *name_utf8, const Queue &queue) +bool +spl_save_queue(const char *name_utf8, const Queue &queue, Error &error) { - if (map_spl_path().IsNull()) - return PlaylistResult::DISABLED; - - if (!spl_valid_name(name_utf8)) - return PlaylistResult::BAD_NAME; - - const auto path_fs = map_spl_utf8_to_fs(name_utf8); + const auto path_fs = spl_map_to_fs(name_utf8, error); if (path_fs.IsNull()) - return PlaylistResult::BAD_NAME; + return false; - if (FileExists(path_fs)) - return PlaylistResult::LIST_EXISTS; + if (FileExists(path_fs)) { + error.Set(playlist_domain, int(PlaylistResult::LIST_EXISTS), + "Playlist already exists"); + return false; + } - FILE *file = FOpen(path_fs, FOpenMode::WriteText); + FileOutputStream fos(path_fs, error); + if (!fos.IsDefined()) { + TranslatePlaylistError(error); + return false; + } - if (file == nullptr) - return PlaylistResult::ERRNO; + BufferedOutputStream bos(fos); for (unsigned i = 0; i < queue.GetLength(); i++) - playlist_print_song(file, queue.Get(i)); + playlist_print_song(bos, queue.Get(i)); - fclose(file); + if (!bos.Flush(error) || !fos.Commit(error)) + return false; idle_add(IDLE_STORED_PLAYLIST); - return PlaylistResult::SUCCESS; + return true; } -PlaylistResult -spl_save_playlist(const char *name_utf8, const playlist &playlist) +bool +spl_save_playlist(const char *name_utf8, const playlist &playlist, + Error &error) { - return spl_save_queue(name_utf8, playlist.queue); + return spl_save_queue(name_utf8, playlist.queue, error); } |