playlist/lastfm: allocate the lastfm_playlist object at the end

Simplify the error path, because the other allocations may fail.
This commit is contained in:
Max Kellermann 2013-08-05 21:31:54 +02:00
parent af63372d2b
commit 6d0ada7f45
1 changed files with 14 additions and 15 deletions

View File

@ -156,7 +156,6 @@ lastfm_find(const char *response, const char *name)
static struct playlist_provider *
lastfm_open_uri(const char *uri, Mutex &mutex, Cond &cond)
{
struct lastfm_playlist *playlist;
GError *error = NULL;
char *p, *q, *response, *session;
@ -209,11 +208,6 @@ lastfm_open_uri(const char *uri, Mutex &mutex, Cond &cond)
}
}
/* create the playlist object */
playlist = g_new(struct lastfm_playlist, 1);
playlist_provider_init(&playlist->base, &lastfm_playlist_plugin);
/* open the last.fm playlist */
p = g_strconcat("http://ws.audioscrobbler.com/radio/xspf.php?"
@ -221,40 +215,45 @@ lastfm_open_uri(const char *uri, Mutex &mutex, Cond &cond)
NULL);
g_free(session);
playlist->is = input_stream_open(p, mutex, cond, &error);
const auto is = input_stream_open(p, mutex, cond, &error);
g_free(p);
if (playlist->is == NULL) {
if (is == nullptr) {
if (error != NULL) {
g_warning("Failed to load XSPF playlist: %s",
error->message);
g_error_free(error);
} else
g_warning("Failed to load XSPF playlist");
g_free(playlist);
return NULL;
}
mutex.lock();
input_stream_wait_ready(playlist->is);
input_stream_wait_ready(is);
/* last.fm does not send a MIME type, we have to fake it here
:-( */
input_stream_override_mime_type(playlist->is, "application/xspf+xml");
input_stream_override_mime_type(is, "application/xspf+xml");
mutex.unlock();
/* parse the XSPF playlist */
playlist->xspf = playlist_list_open_stream(playlist->is, NULL);
if (playlist->xspf == NULL) {
input_stream_close(playlist->is);
g_free(playlist);
const auto xspf = playlist_list_open_stream(is, nullptr);
if (xspf == nullptr) {
input_stream_close(is);
g_warning("Failed to parse XSPF playlist");
return NULL;
}
/* create the playlist object */
const auto playlist = g_new(struct lastfm_playlist, 1);
playlist_provider_init(&playlist->base, &lastfm_playlist_plugin);
playlist->is = is;
playlist->xspf = xspf;
return &playlist->base;
}