Commit 8d2830b3 authored by Max Kellermann's avatar Max Kellermann

playlist: don't pass "fd" to playlist.c functions

The playlist library shouldn't talk to the client if possible. Introduce the "enum playlist_result" type which the caller (i.e. command.c) may use to generate an error message.
parent 20feb0cb
...@@ -220,6 +220,53 @@ static int mpd_fprintf__ check_int(int fd, int *dst, ...@@ -220,6 +220,53 @@ static int mpd_fprintf__ check_int(int fd, int *dst,
return 0; return 0;
} }
static int print_playlist_result(int fd, enum playlist_result result)
{
switch (result) {
case PLAYLIST_RESULT_SUCCESS:
return 0;
case PLAYLIST_RESULT_ERRNO:
commandError(fd, ACK_ERROR_SYSTEM, strerror(errno));
return -1;
case PLAYLIST_RESULT_NO_SUCH_SONG:
commandError(fd, ACK_ERROR_NO_EXIST, "No such song");
return -1;
case PLAYLIST_RESULT_NO_SUCH_LIST:
commandError(fd, ACK_ERROR_NO_EXIST, "No such playlist");
return -1;
case PLAYLIST_RESULT_LIST_EXISTS:
commandError(fd, ACK_ERROR_NO_EXIST,
"Playlist already exists");
return -1;
case PLAYLIST_RESULT_BAD_NAME:
commandError(fd, ACK_ERROR_ARG,
"playlist name is invalid: "
"playlist names may not contain slashes,"
" newlines or carriage returns");
return -1;
case PLAYLIST_RESULT_BAD_RANGE:
commandError(fd, ACK_ERROR_ARG, "Bad song index");
return -1;
case PLAYLIST_RESULT_NOT_PLAYING:
commandError(fd, ACK_ERROR_PLAYER_SYNC, "Not playing");
return -1;
case PLAYLIST_RESULT_TOO_LARGE:
commandError(fd, ACK_ERROR_PLAYLIST_MAX,
"playlist is at the max size");
return -1;
}
assert(0);
}
static void addCommand(const char *name, static void addCommand(const char *name,
int reqPermission, int reqPermission,
int minargs, int minargs,
...@@ -255,21 +302,25 @@ static int handlePlay(int fd, mpd_unused int *permission, ...@@ -255,21 +302,25 @@ static int handlePlay(int fd, mpd_unused int *permission,
int argc, char *argv[]) int argc, char *argv[])
{ {
int song = -1; int song = -1;
enum playlist_result result;
if (argc == 2 && check_int(fd, &song, argv[1], need_positive) < 0) if (argc == 2 && check_int(fd, &song, argv[1], need_positive) < 0)
return -1; return -1;
return playPlaylist(fd, song, 0); result = playPlaylist(song, 0);
return print_playlist_result(fd, result);
} }
static int handlePlayId(int fd, mpd_unused int *permission, static int handlePlayId(int fd, mpd_unused int *permission,
int argc, char *argv[]) int argc, char *argv[])
{ {
int id = -1; int id = -1;
enum playlist_result result;
if (argc == 2 && check_int(fd, &id, argv[1], need_positive) < 0) if (argc == 2 && check_int(fd, &id, argv[1], need_positive) < 0)
return -1; return -1;
return playPlaylistById(fd, id, 0); result = playPlaylistById(id, 0);
return print_playlist_result(fd, result);
} }
static int handleStop(mpd_unused int fd, mpd_unused int *permission, static int handleStop(mpd_unused int fd, mpd_unused int *permission,
...@@ -283,11 +334,13 @@ static int handleCurrentSong(int fd, mpd_unused int *permission, ...@@ -283,11 +334,13 @@ static int handleCurrentSong(int fd, mpd_unused int *permission,
mpd_unused int argc, mpd_unused char *argv[]) mpd_unused int argc, mpd_unused char *argv[])
{ {
int song = getPlaylistCurrentSong(); int song = getPlaylistCurrentSong();
enum playlist_result result;
if (song >= 0) { if (song < 0)
return playlistInfo(fd, song);
} else
return 0; return 0;
result = playlistInfo(fd, song);
return print_playlist_result(fd, result);
} }
static int handlePause(int fd, mpd_unused int *permission, static int handlePause(int fd, mpd_unused int *permission,
...@@ -384,54 +437,65 @@ static int handleAdd(int fd, mpd_unused int *permission, ...@@ -384,54 +437,65 @@ static int handleAdd(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
char *path = argv[1]; char *path = argv[1];
enum playlist_result result;
if (isRemoteUrl(path)) if (isRemoteUrl(path))
return addToPlaylist(fd, path, NULL); return addToPlaylist(path, NULL);
return addAllIn(fd, path); result = addAllIn(fd, path);
return print_playlist_result(fd, result);
} }
static int handleAddId(int fd, mpd_unused int *permission, static int handleAddId(int fd, mpd_unused int *permission,
int argc, char *argv[]) int argc, char *argv[])
{ {
int added_id; int added_id;
int ret = addToPlaylist(fd, argv[1], &added_id); enum playlist_result result = addToPlaylist(argv[1], &added_id);
if (!ret) { if (result == PLAYLIST_RESULT_SUCCESS)
if (argc == 3) { return result;
int to;
if (check_int(fd, &to, argv[2], if (argc == 3) {
check_integer, argv[2]) < 0) int to;
return -1; if (check_int(fd, &to, argv[2],
ret = moveSongInPlaylistById(fd, added_id, to); check_integer, argv[2]) < 0)
if (ret) { /* move failed */ return -1;
deleteFromPlaylistById(fd, added_id); result = moveSongInPlaylistById(added_id, to);
return ret; if (result != PLAYLIST_RESULT_SUCCESS) {
} int ret = print_playlist_result(fd, result);
deleteFromPlaylistById(added_id);
return ret;
} }
fdprintf(fd, "Id: %d\n", added_id);
} }
return ret;
fdprintf(fd, "Id: %d\n", added_id);
return result;
} }
static int handleDelete(int fd, mpd_unused int *permission, static int handleDelete(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
int song; int song;
enum playlist_result result;
if (check_int(fd, &song, argv[1], need_positive) < 0) if (check_int(fd, &song, argv[1], need_positive) < 0)
return -1; return -1;
return deleteFromPlaylist(fd, song);
result = deleteFromPlaylist(song);
return print_playlist_result(fd, result);
} }
static int handleDeleteId(int fd, mpd_unused int *permission, static int handleDeleteId(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
int id; int id;
enum playlist_result result;
if (check_int(fd, &id, argv[1], need_positive) < 0) if (check_int(fd, &id, argv[1], need_positive) < 0)
return -1; return -1;
return deleteFromPlaylistById(fd, id);
result = deleteFromPlaylistById(id);
return print_playlist_result(fd, result);
} }
static int handlePlaylist(int fd, mpd_unused int *permission, static int handlePlaylist(int fd, mpd_unused int *permission,
...@@ -441,10 +505,10 @@ static int handlePlaylist(int fd, mpd_unused int *permission, ...@@ -441,10 +505,10 @@ static int handlePlaylist(int fd, mpd_unused int *permission,
return 0; return 0;
} }
static int handleShuffle(int fd, mpd_unused int *permission, static int handleShuffle(mpd_unused int fd, mpd_unused int *permission,
mpd_unused int argc, mpd_unused char *argv[]) mpd_unused int argc, mpd_unused char *argv[])
{ {
shufflePlaylist(fd); shufflePlaylist();
return 0; return 0;
} }
...@@ -458,7 +522,10 @@ static int handleClear(mpd_unused int fd, mpd_unused int *permission, ...@@ -458,7 +522,10 @@ static int handleClear(mpd_unused int fd, mpd_unused int *permission,
static int handleSave(int fd, mpd_unused int *permission, static int handleSave(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
return savePlaylist(fd, argv[1]); enum playlist_result result;
result = savePlaylist(argv[1]);
return print_playlist_result(fd, result);
} }
static int handleLoad(int fd, mpd_unused int *permission, static int handleLoad(int fd, mpd_unused int *permission,
...@@ -499,7 +566,10 @@ static int handleLsInfo(int fd, mpd_unused int *permission, ...@@ -499,7 +566,10 @@ static int handleLsInfo(int fd, mpd_unused int *permission,
static int handleRm(int fd, mpd_unused int *permission, static int handleRm(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
return deletePlaylist(fd, argv[1]); enum playlist_result result;
result = deletePlaylist(argv[1]);
return print_playlist_result(fd, result);
} }
static int handleRename(int fd, mpd_unused int *permission, static int handleRename(int fd, mpd_unused int *permission,
...@@ -532,20 +602,26 @@ static int handlePlaylistInfo(int fd, mpd_unused int *permission, ...@@ -532,20 +602,26 @@ static int handlePlaylistInfo(int fd, mpd_unused int *permission,
int argc, char *argv[]) int argc, char *argv[])
{ {
int song = -1; int song = -1;
enum playlist_result result;
if (argc == 2 && check_int(fd, &song, argv[1], need_positive) < 0) if (argc == 2 && check_int(fd, &song, argv[1], need_positive) < 0)
return -1; return -1;
return playlistInfo(fd, song);
result = playlistInfo(fd, song);
return print_playlist_result(fd, result);
} }
static int handlePlaylistId(int fd, mpd_unused int *permission, static int handlePlaylistId(int fd, mpd_unused int *permission,
int argc, char *argv[]) int argc, char *argv[])
{ {
int id = -1; int id = -1;
enum playlist_result result;
if (argc == 2 && check_int(fd, &id, argv[1], need_positive) < 0) if (argc == 2 && check_int(fd, &id, argv[1], need_positive) < 0)
return -1; return -1;
return playlistId(fd, id);
result = playlistId(fd, id);
return print_playlist_result(fd, result);
} }
static int handleFind(int fd, mpd_unused int *permission, static int handleFind(int fd, mpd_unused int *permission,
...@@ -871,72 +947,86 @@ static int handleMove(int fd, mpd_unused int *permission, ...@@ -871,72 +947,86 @@ static int handleMove(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
int from, to; int from, to;
enum playlist_result result;
if (check_int(fd, &from, argv[1], check_integer, argv[1]) < 0) if (check_int(fd, &from, argv[1], check_integer, argv[1]) < 0)
return -1; return -1;
if (check_int(fd, &to, argv[2], check_integer, argv[2]) < 0) if (check_int(fd, &to, argv[2], check_integer, argv[2]) < 0)
return -1; return -1;
return moveSongInPlaylist(fd, from, to); result = moveSongInPlaylist(from, to);
return print_playlist_result(fd, result);
} }
static int handleMoveId(int fd, mpd_unused int *permission, static int handleMoveId(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
int id, to; int id, to;
enum playlist_result result;
if (check_int(fd, &id, argv[1], check_integer, argv[1]) < 0) if (check_int(fd, &id, argv[1], check_integer, argv[1]) < 0)
return -1; return -1;
if (check_int(fd, &to, argv[2], check_integer, argv[2]) < 0) if (check_int(fd, &to, argv[2], check_integer, argv[2]) < 0)
return -1; return -1;
return moveSongInPlaylistById(fd, id, to); result = moveSongInPlaylistById(id, to);
return print_playlist_result(fd, result);
} }
static int handleSwap(int fd, mpd_unused int *permission, static int handleSwap(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
int song1, song2; int song1, song2;
enum playlist_result result;
if (check_int(fd, &song1, argv[1], check_integer, argv[1]) < 0) if (check_int(fd, &song1, argv[1], check_integer, argv[1]) < 0)
return -1; return -1;
if (check_int(fd, &song2, argv[2], check_integer, argv[2]) < 0) if (check_int(fd, &song2, argv[2], check_integer, argv[2]) < 0)
return -1; return -1;
return swapSongsInPlaylist(fd, song1, song2); result = swapSongsInPlaylist(song1, song2);
return print_playlist_result(fd, result);
} }
static int handleSwapId(int fd, mpd_unused int *permission, static int handleSwapId(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
int id1, id2; int id1, id2;
enum playlist_result result;
if (check_int(fd, &id1, argv[1], check_integer, argv[1]) < 0) if (check_int(fd, &id1, argv[1], check_integer, argv[1]) < 0)
return -1; return -1;
if (check_int(fd, &id2, argv[2], check_integer, argv[2]) < 0) if (check_int(fd, &id2, argv[2], check_integer, argv[2]) < 0)
return -1; return -1;
return swapSongsInPlaylistById(fd, id1, id2); result = swapSongsInPlaylistById(id1, id2);
return print_playlist_result(fd, result);
} }
static int handleSeek(int fd, mpd_unused int *permission, static int handleSeek(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
int song, seek_time; int song, seek_time;
enum playlist_result result;
if (check_int(fd, &song, argv[1], check_integer, argv[1]) < 0) if (check_int(fd, &song, argv[1], check_integer, argv[1]) < 0)
return -1; return -1;
if (check_int(fd, &seek_time, argv[2], check_integer, argv[2]) < 0) if (check_int(fd, &seek_time, argv[2], check_integer, argv[2]) < 0)
return -1; return -1;
return seekSongInPlaylist(fd, song, seek_time);
result = seekSongInPlaylist(song, seek_time);
return print_playlist_result(fd, result);
} }
static int handleSeekId(int fd, mpd_unused int *permission, static int handleSeekId(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[]) mpd_unused int argc, char *argv[])
{ {
int id, seek_time; int id, seek_time;
enum playlist_result result;
if (check_int(fd, &id, argv[1], check_integer, argv[1]) < 0) if (check_int(fd, &id, argv[1], check_integer, argv[1]) < 0)
return -1; return -1;
if (check_int(fd, &seek_time, argv[2], check_integer, argv[2]) < 0) if (check_int(fd, &seek_time, argv[2], check_integer, argv[2]) < 0)
return -1; return -1;
return seekSongInPlaylistById(fd, id, seek_time);
result = seekSongInPlaylistById(id, seek_time);
return print_playlist_result(fd, result);
} }
static int handleListAllInfo(int fd, mpd_unused int *permission, static int handleListAllInfo(int fd, mpd_unused int *permission,
......
...@@ -174,10 +174,10 @@ int printAllIn(int fd, const char *name) ...@@ -174,10 +174,10 @@ int printAllIn(int fd, const char *name)
printDirectoryInDirectory, NULL); printDirectoryInDirectory, NULL);
} }
static int directoryAddSongToPlaylist(int fd, Song * song, static int directoryAddSongToPlaylist(mpd_unused int fd, Song * song,
mpd_unused void *data) mpd_unused void *data)
{ {
return addSongToPlaylist(fd, song, NULL); return addSongToPlaylist(song, NULL);
} }
static int directoryAddSongToStoredPlaylist(int fd, Song *song, void *data) static int directoryAddSongToStoredPlaylist(int fd, Song *song, void *data)
......
...@@ -24,6 +24,18 @@ ...@@ -24,6 +24,18 @@
#define PLAYLIST_FILE_SUFFIX "m3u" #define PLAYLIST_FILE_SUFFIX "m3u"
#define PLAYLIST_COMMENT '#' #define PLAYLIST_COMMENT '#'
enum playlist_result {
PLAYLIST_RESULT_SUCCESS,
PLAYLIST_RESULT_ERRNO,
PLAYLIST_RESULT_NO_SUCH_SONG,
PLAYLIST_RESULT_NO_SUCH_LIST,
PLAYLIST_RESULT_LIST_EXISTS,
PLAYLIST_RESULT_BAD_NAME,
PLAYLIST_RESULT_BAD_RANGE,
PLAYLIST_RESULT_NOT_PLAYING,
PLAYLIST_RESULT_TOO_LARGE
};
typedef struct _Playlist { typedef struct _Playlist {
Song **songs; Song **songs;
/* holds version a song was modified on */ /* holds version a song was modified on */
...@@ -55,27 +67,27 @@ void clearPlaylist(void); ...@@ -55,27 +67,27 @@ void clearPlaylist(void);
int clearStoredPlaylist(int fd, const char *utf8file); int clearStoredPlaylist(int fd, const char *utf8file);
int addToPlaylist(int fd, const char *file, int *added_id); enum playlist_result addToPlaylist(const char *file, int *added_id);
int addToStoredPlaylist(int fd, const char *file, const char *utf8file); int addToStoredPlaylist(int fd, const char *file, const char *utf8file);
int addSongToPlaylist(int fd, Song * song, int *added_id); enum playlist_result addSongToPlaylist(Song * song, int *added_id);
void showPlaylist(int fd); void showPlaylist(int fd);
int deleteFromPlaylist(int fd, int song); enum playlist_result deleteFromPlaylist(int song);
int deleteFromPlaylistById(int fd, int song); enum playlist_result deleteFromPlaylistById(int song);
int playlistInfo(int fd, int song); enum playlist_result playlistInfo(int fd, int song);
int playlistId(int fd, int song); enum playlist_result playlistId(int fd, int song);
void stopPlaylist(void); void stopPlaylist(void);
int playPlaylist(int fd, int song, int stopOnError); enum playlist_result playPlaylist(int song, int stopOnError);
int playPlaylistById(int fd, int song, int stopOnError); enum playlist_result playPlaylistById(int song, int stopOnError);
void nextSongInPlaylist(void); void nextSongInPlaylist(void);
...@@ -83,23 +95,21 @@ void syncPlayerAndPlaylist(void); ...@@ -83,23 +95,21 @@ void syncPlayerAndPlaylist(void);
void previousSongInPlaylist(void); void previousSongInPlaylist(void);
void shufflePlaylist(int fd); void shufflePlaylist(void);
int savePlaylist(int fd, const char *utf8file);
int deletePlaylist(int fd, const char *utf8file); enum playlist_result savePlaylist(const char *utf8file);
int deletePlaylistById(int fd, const char *utf8file); enum playlist_result deletePlaylist(const char *utf8file);
void deleteASongFromPlaylist(Song * song); void deleteASongFromPlaylist(Song * song);
int moveSongInPlaylist(int fd, int from, int to); enum playlist_result moveSongInPlaylist(int from, int to);
int moveSongInPlaylistById(int fd, int id, int to); enum playlist_result moveSongInPlaylistById(int id, int to);
int swapSongsInPlaylist(int fd, int song1, int song2); enum playlist_result swapSongsInPlaylist(int song1, int song2);
int swapSongsInPlaylistById(int fd, int id1, int id2); enum playlist_result swapSongsInPlaylistById(int id1, int id2);
int loadPlaylist(int fd, const char *utf8file); int loadPlaylist(int fd, const char *utf8file);
...@@ -121,9 +131,9 @@ unsigned long getPlaylistVersion(void); ...@@ -121,9 +131,9 @@ unsigned long getPlaylistVersion(void);
void playPlaylistIfPlayerStopped(void); void playPlaylistIfPlayerStopped(void);
int seekSongInPlaylist(int fd, int song, float seek_time); enum playlist_result seekSongInPlaylist(int song, float seek_time);
int seekSongInPlaylistById(int fd, int id, float seek_time); enum playlist_result seekSongInPlaylistById(int id, float seek_time);
void playlistVersionChange(void); void playlistVersionChange(void);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment