bool mpd_entity_feed(struct mpd_entity *entity, const struct mpd_pair *pair) { assert(pair != NULL); assert(pair->name != NULL); assert(pair->value != NULL); if (strcmp(pair->name, "file") == 0 || strcmp(pair->name, "directory") == 0 || strcmp(pair->name, "playlist") == 0) return false; switch (entity->type) { case MPD_ENTITY_TYPE_UNKNOWN: break; case MPD_ENTITY_TYPE_DIRECTORY: mpd_directory_feed(entity->info.directory, pair); break; case MPD_ENTITY_TYPE_SONG: mpd_song_feed(entity->info.song, pair); break; case MPD_ENTITY_TYPE_PLAYLIST: mpd_playlist_feed(entity->info.playlistFile, pair); break; } return true; }
struct mpd_playlist * mpd_recv_playlist(struct mpd_connection *connection) { struct mpd_pair *pair; struct mpd_playlist *playlist; pair = mpd_recv_pair_named(connection, "playlist"); if (pair == NULL) return NULL; playlist = mpd_playlist_begin(pair); mpd_return_pair(connection, pair); if (playlist == NULL) { mpd_error_code(&connection->error, MPD_ERROR_OOM); return NULL; } while ((pair = mpd_recv_pair(connection)) != NULL && mpd_playlist_feed(playlist, pair)) mpd_return_pair(connection, pair); if (mpd_error_is_defined(&connection->error)) { assert(pair == NULL); mpd_playlist_free(playlist); return NULL; } /* unread this pair for the next mpd_recv_playlist() call */ mpd_enqueue_pair(connection, pair); return playlist; }