queue/PlaylistEdit: throw PlaylistError on error

This commit is contained in:
Max Kellermann 2016-02-28 10:51:07 +01:00
parent 50b930f283
commit b6cb9b853a
7 changed files with 49 additions and 84 deletions

View File

@ -66,7 +66,7 @@ handle_save(Client &client, Request args, gcc_unused Response &r)
} }
CommandResult CommandResult
handle_load(Client &client, Request args, Response &r) handle_load(Client &client, Request args, gcc_unused Response &r)
{ {
RangeArg range = args.ParseOptional(1, RangeArg::All()); RangeArg range = args.ParseOptional(1, RangeArg::All());
@ -74,12 +74,10 @@ handle_load(Client &client, Request args, Response &r)
Error error; Error error;
const SongLoader loader(client); const SongLoader loader(client);
if (!playlist_open_into_queue(args.front(), playlist_open_into_queue(args.front(),
range.start, range.end, range.start, range.end,
client.playlist, client.playlist,
client.player_control, loader, error)) client.player_control, loader);
return print_error(r, error);
return CommandResult::OK; return CommandResult::OK;
} }

View File

@ -54,11 +54,7 @@ AddUri(Client &client, const LocatedUri &uri, Response &r)
return print_error(r, error); return print_error(r, error);
auto &partition = client.partition; auto &partition = client.partition;
unsigned id = partition.playlist.AppendSong(partition.pc, partition.playlist.AppendSong(partition.pc, std::move(*song));
std::move(*song), error);
if (id == 0)
return print_error(r, error);
return CommandResult::OK; return CommandResult::OK;
} }
@ -186,12 +182,8 @@ handle_rangeid(Client &client, Request args, Response &r)
return CommandResult::ERROR; return CommandResult::ERROR;
} }
Error error; client.partition.playlist.SetSongIdRange(client.partition.pc,
if (!client.partition.playlist.SetSongIdRange(client.partition.pc, id, start, end);
id, start, end,
error))
return print_error(r, error);
return CommandResult::OK; return CommandResult::OK;
} }

View File

@ -28,15 +28,13 @@
#include <functional> #include <functional>
static bool static bool
AddToQueue(Partition &partition, const LightSong &song, Error &error) AddToQueue(Partition &partition, const LightSong &song)
{ {
const Storage &storage = *partition.instance.storage; const Storage &storage = *partition.instance.storage;
unsigned id = partition.playlist.AppendSong(partition.pc,
partition.playlist.AppendSong(partition.pc, DatabaseDetachSong(storage,
DatabaseDetachSong(storage, song));
song), return true;
error);
return id != 0;
} }
bool bool
@ -48,6 +46,6 @@ AddFromDatabase(Partition &partition, const DatabaseSelection &selection,
return false; return false;
using namespace std::placeholders; using namespace std::placeholders;
const auto f = std::bind(AddToQueue, std::ref(partition), _1, _2); const auto f = std::bind(AddToQueue, std::ref(partition), _1);
return db->Visit(selection, f, error); return db->Visit(selection, f, error);
} }

View File

@ -35,12 +35,11 @@
#include <memory> #include <memory>
bool void
playlist_load_into_queue(const char *uri, SongEnumerator &e, playlist_load_into_queue(const char *uri, SongEnumerator &e,
unsigned start_index, unsigned end_index, unsigned start_index, unsigned end_index,
playlist &dest, PlayerControl &pc, playlist &dest, PlayerControl &pc,
const SongLoader &loader, const SongLoader &loader)
Error &error)
{ {
const std::string base_uri = uri != nullptr const std::string base_uri = uri != nullptr
? PathTraitsUTF8::GetParent(uri) ? PathTraitsUTF8::GetParent(uri)
@ -60,20 +59,15 @@ playlist_load_into_queue(const char *uri, SongEnumerator &e,
continue; continue;
} }
unsigned id = dest.AppendSong(pc, std::move(*song), error); dest.AppendSong(pc, std::move(*song));
if (id == 0)
return false;
} }
return true;
} }
bool void
playlist_open_into_queue(const char *uri, playlist_open_into_queue(const char *uri,
unsigned start_index, unsigned end_index, unsigned start_index, unsigned end_index,
playlist &dest, PlayerControl &pc, playlist &dest, PlayerControl &pc,
const SongLoader &loader, const SongLoader &loader)
Error &error)
{ {
Mutex mutex; Mutex mutex;
Cond cond; Cond cond;
@ -83,13 +77,10 @@ playlist_open_into_queue(const char *uri,
loader.GetStorage(), loader.GetStorage(),
#endif #endif
mutex, cond)); mutex, cond));
if (playlist == nullptr) { if (playlist == nullptr)
error.Set(playlist_domain, int(PlaylistResult::NO_SUCH_LIST), throw PlaylistError::NoSuchList();
"No such playlist");
return false;
}
return playlist_load_into_queue(uri, *playlist, playlist_load_into_queue(uri, *playlist,
start_index, end_index, start_index, end_index,
dest, pc, loader, error); dest, pc, loader);
} }

View File

@ -41,22 +41,21 @@ struct PlayerControl;
* @param start_index the index of the first song * @param start_index the index of the first song
* @param end_index the index of the last song (excluding) * @param end_index the index of the last song (excluding)
*/ */
bool void
playlist_load_into_queue(const char *uri, SongEnumerator &e, playlist_load_into_queue(const char *uri, SongEnumerator &e,
unsigned start_index, unsigned end_index, unsigned start_index, unsigned end_index,
playlist &dest, PlayerControl &pc, playlist &dest, PlayerControl &pc,
const SongLoader &loader, const SongLoader &loader);
Error &error);
/** /**
* Opens a playlist with a playlist plugin and append to the specified * Opens a playlist with a playlist plugin and append to the specified
* play queue. * play queue.
*/ */
bool void
playlist_open_into_queue(const char *uri, playlist_open_into_queue(const char *uri,
unsigned start_index, unsigned end_index, unsigned start_index, unsigned end_index,
playlist &dest, PlayerControl &pc, playlist &dest, PlayerControl &pc,
const SongLoader &loader, Error &error); const SongLoader &loader);
#endif #endif

View File

@ -195,11 +195,11 @@ public:
#endif #endif
/** /**
* @return the new song id or 0 on error * Throws PlaylistError if the queue would be too large.
*
* @return the new song id
*/ */
unsigned AppendSong(PlayerControl &pc, unsigned AppendSong(PlayerControl &pc, DetachedSong &&song);
DetachedSong &&song,
Error &error);
/** /**
* @return the new song id or 0 on error * @return the new song id or 0 on error
@ -254,9 +254,8 @@ public:
* Sets the start_time and end_time attributes on the song * Sets the start_time and end_time attributes on the song
* with the specified id. * with the specified id.
*/ */
bool SetSongIdRange(PlayerControl &pc, unsigned id, void SetSongIdRange(PlayerControl &pc, unsigned id,
SongTime start, SongTime end, SongTime start, SongTime end);
Error &error);
void AddSongIdTag(unsigned id, TagType tag_type, const char *value); void AddSongIdTag(unsigned id, TagType tag_type, const char *value);
void ClearSongIdTag(unsigned id, TagType tag_type); void ClearSongIdTag(unsigned id, TagType tag_type);

View File

@ -92,15 +92,13 @@ playlist::CommitBulk(PlayerControl &pc)
} }
unsigned unsigned
playlist::AppendSong(PlayerControl &pc, DetachedSong &&song, Error &error) playlist::AppendSong(PlayerControl &pc, DetachedSong &&song)
{ {
unsigned id; unsigned id;
if (queue.IsFull()) { if (queue.IsFull())
error.Set(playlist_domain, int(PlaylistResult::TOO_LARGE), throw PlaylistError(PlaylistResult::TOO_LARGE,
"Playlist is too large"); "Playlist is too large");
return 0;
}
const DetachedSong *const queued_song = GetQueuedSong(); const DetachedSong *const queued_song = GetQueuedSong();
@ -134,7 +132,7 @@ playlist::AppendURI(PlayerControl &pc, const SongLoader &loader,
if (song == nullptr) if (song == nullptr)
return 0; return 0;
return AppendSong(pc, std::move(*song), error); return AppendSong(pc, std::move(*song));
} }
void void
@ -419,26 +417,20 @@ playlist::Shuffle(PlayerControl &pc, unsigned start, unsigned end)
OnModified(); OnModified();
} }
bool void
playlist::SetSongIdRange(PlayerControl &pc, unsigned id, playlist::SetSongIdRange(PlayerControl &pc, unsigned id,
SongTime start, SongTime end, SongTime start, SongTime end)
Error &error)
{ {
assert(end.IsZero() || start < end); assert(end.IsZero() || start < end);
int position = queue.IdToPosition(id); int position = queue.IdToPosition(id);
if (position < 0) { if (position < 0)
error.Set(playlist_domain, int(PlaylistResult::NO_SUCH_SONG), throw PlaylistError::NoSuchSong();
"No such song");
return false;
}
if (playing) { if (playing) {
if (position == current) { if (position == current)
error.Set(playlist_domain, int(PlaylistResult::DENIED), throw PlaylistError(PlaylistResult::DENIED,
"Cannot edit the current song"); "Cannot edit the current song");
return false;
}
if (position == queued) { if (position == queued) {
/* if we're manipulating the "queued" song, /* if we're manipulating the "queued" song,
@ -455,12 +447,9 @@ playlist::SetSongIdRange(PlayerControl &pc, unsigned id,
if (!duration.IsNegative()) { if (!duration.IsNegative()) {
/* validate the offsets */ /* validate the offsets */
if (start > duration) { if (start > duration)
error.Set(playlist_domain, throw PlaylistError(PlaylistResult::BAD_RANGE,
int(PlaylistResult::BAD_RANGE), "Invalid start offset");
"Invalid start offset");
return false;
}
if (end >= duration) if (end >= duration)
end = SongTime::zero(); end = SongTime::zero();
@ -474,5 +463,4 @@ playlist::SetSongIdRange(PlayerControl &pc, unsigned id,
UpdateQueuedSong(pc, nullptr); UpdateQueuedSong(pc, nullptr);
queue.ModifyAtPosition(position); queue.ModifyAtPosition(position);
OnModified(); OnModified();
return true;
} }