Commit 390ed297 authored by Eric Wong's avatar Eric Wong

storedPlaylist: cleanup load function

* stop supporting unused parentlen block, I have no idea how it was ever usable, but playlists don't work in subdirectories... * myFgets is far easier to use than fgetc loops. * Since we're using myFgets, we'll just skip lines that are too long, rather than error out and bitch and moan about things... git-svn-id: https://svn.musicpd.org/mpd/trunk@7118 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent 24c58132
...@@ -104,28 +104,18 @@ StoredPlaylist *newStoredPlaylist(const char *utf8name, int fd, int ignoreExisti ...@@ -104,28 +104,18 @@ StoredPlaylist *newStoredPlaylist(const char *utf8name, int fd, int ignoreExisti
return sp; return sp;
} }
/* FIXME - this function is gross */
StoredPlaylist *loadStoredPlaylist(const char *utf8path, int fd) StoredPlaylist *loadStoredPlaylist(const char *utf8path, int fd)
{ {
StoredPlaylist *sp; StoredPlaylist *sp;
FILE *file; FILE *file;
char s[MPD_PATH_MAX]; char buffer[MPD_PATH_MAX];
char path_max_tmp[MPD_PATH_MAX]; char path_max_tmp[MPD_PATH_MAX];
char path_max_tmp2[MPD_PATH_MAX]; /* TODO: cleanup */ const size_t musicDir_len = strlen(musicDir);
char path_max_tmp3[MPD_PATH_MAX]; /* TODO: cleanup */
int slength = 0;
char *temp;
char *parent;
int parentlen;
int tempInt;
int commentCharFound = 0;
Song *song;
if (!valid_playlist_name(fd, utf8path)) if (!valid_playlist_name(fd, utf8path))
return NULL; return NULL;
utf8_to_fs_playlist_path(path_max_tmp, utf8path); utf8_to_fs_playlist_path(path_max_tmp, utf8path);
while (!(file = fopen(path_max_tmp, "r")) && errno == EINTR); while (!(file = fopen(path_max_tmp, "r")) && errno == EINTR);
if (file == NULL) { if (file == NULL) {
commandError(fd, ACK_ERROR_NO_EXIST, "could not open file " commandError(fd, ACK_ERROR_NO_EXIST, "could not open file "
...@@ -137,66 +127,20 @@ StoredPlaylist *loadStoredPlaylist(const char *utf8path, int fd) ...@@ -137,66 +127,20 @@ StoredPlaylist *loadStoredPlaylist(const char *utf8path, int fd)
if (!sp) if (!sp)
goto out; goto out;
temp = utf8_to_fs_charset(path_max_tmp2, (char *)utf8path); while (myFgets(buffer, sizeof(buffer), file)) {
parent = parent_path(path_max_tmp3, temp); char *s = buffer;
parentlen = strlen(parent); Song *song;
while ((tempInt = fgetc(file)) != EOF) { if (*s == PLAYLIST_COMMENT)
s[slength] = tempInt; continue;
if (s[slength] == '\n' || s[slength] == '\0') { if (s[musicDir_len] == '/' &&
commentCharFound = 0; !strncmp(s, musicDir, musicDir_len))
s[slength] = '\0'; memmove(s, s + musicDir_len + 1,
if (s[0] == PLAYLIST_COMMENT) strlen(s + musicDir_len + 1) + 1);
commentCharFound = 1; if ((song = getSongFromDB(s)))
if (!strncmp(s, musicDir, strlen(musicDir)) && appendSongToStoredPlaylist(sp, song);
s[strlen(musicDir)] == '/') { else if (isValidRemoteUtf8Url(s))
memmove(s, &(s[strlen(musicDir) + 1]), insertInListWithoutKey(sp->list, xstrdup(s));
strlen(&(s[strlen(musicDir) + 1])) + 1);
} else if (parentlen) {
temp = xstrdup(s);
strcpy(s, parent);
strncat(s, "/", MPD_PATH_MAX - parentlen);
strncat(s, temp, MPD_PATH_MAX - parentlen - 1);
if (strlen(s) >= MPD_PATH_MAX) {
commandError(sp->fd,
ACK_ERROR_PLAYLIST_LOAD,
"\"%s\" is too long", temp);
free(temp);
freeStoredPlaylist(sp);
sp = NULL;
goto out;
}
free(temp);
}
slength = 0;
temp = fs_charset_to_utf8(path_max_tmp, s);
if (temp && !commentCharFound) {
song = getSongFromDB(temp);
if (song) {
appendSongToStoredPlaylist(sp, song);
continue;
}
if (!isValidRemoteUtf8Url(temp))
continue;
song = newSong(temp, SONG_TYPE_URL, NULL);
if (song) {
appendSongToStoredPlaylist(sp, song);
freeJustSong(song);
}
}
} else if (slength == (MPD_PATH_MAX - 1)) {
s[slength] = '\0';
commandError(sp->fd, ACK_ERROR_PLAYLIST_LOAD,
"line \"%s\" in playlist \"%s\" "
"is too long", s, utf8path);
freeStoredPlaylist(sp);
sp = NULL;
goto out;
} else if (s[slength] != '\r') {
slength++;
}
} }
out: out:
......
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