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

@@ -195,11 +195,11 @@ public:
#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,
DetachedSong &&song,
Error &error);
unsigned AppendSong(PlayerControl &pc, DetachedSong &&song);
/**
* @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
* with the specified id.
*/
bool SetSongIdRange(PlayerControl &pc, unsigned id,
SongTime start, SongTime end,
Error &error);
void SetSongIdRange(PlayerControl &pc, unsigned id,
SongTime start, SongTime end);
void AddSongIdTag(unsigned id, TagType tag_type, const char *value);
void ClearSongIdTag(unsigned id, TagType tag_type);

View File

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