aboutsummaryrefslogtreecommitdiffstats
path: root/src/PlaylistSave.cxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/PlaylistSave.cxx57
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);
}