/* parse getStation xml struct */ static void PianoXmlParseGetStationInfoCb (const char *key, const ezxml_t value, void *data) { PianoStationInfo_t *info = data; if (strcmp ("seeds", key) == 0) { const ezxml_t dataNode = ezxml_get (value, "array", 0, "data", -1); for (ezxml_t seedNode = ezxml_child (dataNode, "value"); seedNode; seedNode = seedNode->next) { struct PianoXmlParseSeedBag bag; memset (&bag, 0, sizeof (bag)); PianoXmlStructParser (ezxml_child (seedNode, "struct"), PianoXmlParseSeedCb, &bag); /* FIXME: use if-clause */ assert (bag.seedId != NULL); assert (bag.song != NULL || bag.artist != NULL); if (bag.song != NULL) { bag.song->seedId = bag.seedId; if (info->songSeeds == NULL) { info->songSeeds = bag.song; } else { PianoSong_t *curSong = info->songSeeds; while (curSong->next != NULL) { curSong = curSong->next; } curSong->next = bag.song; } } else if (bag.artist != NULL) { bag.artist->seedId = bag.seedId; if (info->artistSeeds == NULL) { info->artistSeeds = bag.artist; } else { PianoArtist_t *curSong = info->artistSeeds; while (curSong->next != NULL) { curSong = curSong->next; } curSong->next = bag.artist; } } else { free (bag.seedId); } } } else if (strcmp ("feedback", key) == 0) { const ezxml_t dataNode = ezxml_get (value, "array", 0, "data", -1); for (ezxml_t feedbackNode = ezxml_child (dataNode, "value"); feedbackNode; feedbackNode = feedbackNode->next) { if (PianoXmlParsePlaylistStruct (feedbackNode, &info->feedback) != PIANO_RET_OK) { break; } } } }
/* callback for xml struct parser used in PianoXmlParseSearch, "switch" for * PianoXmlParseSearchArtistCb and PianoXmlParsePlaylistCb */ static void PianoXmlParseSearchCb (const char *key, const ezxml_t value, void *data) { PianoSearchResult_t *searchResult = data; ezxml_t curNode; if (strcmp ("artists", key) == 0) { /* skip <value><array><data> */ for (curNode = ezxml_child (ezxml_get (value, "array", 0, "data", -1), "value"); curNode; curNode = curNode->next) { PianoArtist_t *artist; if ((artist = calloc (1, sizeof (*artist))) == NULL) { /* fail silently */ break; } memset (artist, 0, sizeof (*artist)); PianoXmlStructParser (ezxml_child (curNode, "struct"), PianoXmlParseSearchArtistCb, artist); /* add result to linked list */ if (searchResult->artists == NULL) { searchResult->artists = artist; } else { PianoArtist_t *curArtist = searchResult->artists; while (curArtist->next != NULL) { curArtist = curArtist->next; } curArtist->next = artist; } } } else if (strcmp ("songs", key) == 0) { for (curNode = ezxml_child (ezxml_get (value, "array", 0, "data", -1), "value"); curNode; curNode = curNode->next) { if (PianoXmlParsePlaylistStruct (curNode, &searchResult->songs) != PIANO_RET_OK) { break; } } } }
/* parses playlist; used when searching too * @param piano handle * @param xml document * @param return: playlist */ PianoReturn_t PianoXmlParsePlaylist (PianoHandle_t *ph, char *xml, PianoSong_t **retPlaylist) { ezxml_t xmlDoc, dataNode; PianoReturn_t ret = PIANO_RET_OK; if ((ret = PianoXmlInitDoc (xml, &xmlDoc)) != PIANO_RET_OK) { return ret; } dataNode = ezxml_get (xmlDoc, "params", 0, "param", 0, "value", 0, "array", 0, "data", -1); for (dataNode = ezxml_child (dataNode, "value"); dataNode; dataNode = dataNode->next) { if ((ret = PianoXmlParsePlaylistStruct (dataNode, retPlaylist)) != PIANO_RET_OK) { break; } } ezxml_free (xmlDoc); return ret; }