diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | libpiano/main.c | 7 | ||||
-rw-r--r-- | libpiano/piano.h | 6 | ||||
-rw-r--r-- | libpiano/xml.c | 29 | ||||
-rw-r--r-- | src/main.c | 18 |
5 files changed, 55 insertions, 9 deletions
@@ -1,3 +1,7 @@ +2008-06-10 + * introduced love/ban error reporting + * fixed love/ban segfault + 2008-06-09 * replaced calloc & strcpy by strdup in xml.c * rating implemented diff --git a/libpiano/main.c b/libpiano/main.c index 0a14311..25fad38 100644 --- a/libpiano/main.c +++ b/libpiano/main.c @@ -218,10 +218,11 @@ void PianoGetPlaylist (PianoHandle_t *ph, char *stationId) { free (requestStr); } -void PianoRateTrack (PianoHandle_t *ph, PianoStation_t *station, +PianoReturn_t PianoRateTrack (PianoHandle_t *ph, PianoStation_t *station, PianoSong_t *song, PianoSongRating_t rating) { char xmlSendBuf[10000], url[PIANO_URL_BUFFER_SIZE]; char *requestStr, *retStr; + PianoReturn_t ret = PIANO_RET_ERR; snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" "<methodCall><methodName>station.addFeedback</methodName>" @@ -245,7 +246,9 @@ void PianoRateTrack (PianoHandle_t *ph, PianoStation_t *station, song->matchingSeed, song->userSeed, song->focusTraitId, (rating == PIANO_RATE_LOVE) ? "true" : "false"); PianoHttpPost (ph->curlHandle, url, requestStr, &retStr); - /* FIXME: check answer (success = <?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value>1</value></param></params></methodResponse> ) */ + ret = PianoXmlParseRate (retStr); free (requestStr); free (retStr); + + return ret; } diff --git a/libpiano/piano.h b/libpiano/piano.h index ac64cd1..5048dc0 100644 --- a/libpiano/piano.h +++ b/libpiano/piano.h @@ -115,6 +115,10 @@ struct PianoHandle { typedef struct PianoHandle PianoHandle_t; +/* FIXME: more error types (http failed, e.g.) later */ +enum PianoReturn {PIANO_RET_OK, PIANO_RET_ERR}; +typedef enum PianoReturn PianoReturn_t; + enum PianoSongRating {PIANO_RATE_BAN, PIANO_RATE_LOVE}; typedef enum PianoSongRating PianoSongRating_t; @@ -126,7 +130,7 @@ void PianoConnect (PianoHandle_t *, char *, char *); void PianoGetStations (PianoHandle_t *ph); void PianoGetPlaylist (PianoHandle_t *ph, char *stationId); -void PianoRateTrack (PianoHandle_t *ph, PianoStation_t *station, +PianoReturn_t PianoRateTrack (PianoHandle_t *ph, PianoStation_t *station, PianoSong_t *song, PianoSongRating_t rating); #endif /* _PIANO_H */ diff --git a/libpiano/xml.c b/libpiano/xml.c index 370d236..8881ac9 100644 --- a/libpiano/xml.c +++ b/libpiano/xml.c @@ -276,3 +276,32 @@ void PianoXmlParsePlaylist (PianoHandle_t *ph, char *xml) { xmlFreeDoc (doc); xmlCleanupParser(); } + +/* parse addFeedback answer + * @author PromyLOPh + * @added 2008-06-10 + * @param xml string + * @return + */ +PianoReturn_t PianoXmlParseRate (char *xml) { + xmlNode *docRoot = NULL, *curNode = NULL; + xmlDocPtr doc = xmlReadDoc ((xmlChar *) xml, NULL, NULL, 0); + PianoReturn_t ret = PIANO_RET_ERR; + + if (doc == NULL) { + printf ("whoops... xml parser error\n"); + return; + } + + docRoot = xmlDocGetRootElement (doc); + + xmlNode *val = docRoot->children->children->children->children; + if (xmlStrEqual (val->content, (xmlChar *) "1")) { + ret = PIANO_RET_OK; + } + + xmlFreeDoc (doc); + xmlCleanupParser(); + + return ret; +} @@ -283,17 +283,23 @@ int main (int argc, char **argv) { case 'b': player.doQuit = 1; - PianoRateTrack (&ph, curStation, curSong, - PIANO_RATE_BAN); - printf ("Banned.\n"); + if (PianoRateTrack (&ph, curStation, curSong, + PIANO_RATE_BAN) == PIANO_RET_OK) { + printf ("Banned.\n"); + } else { + printf ("Error while banning track.\n"); + } /* pandora does this too, I think */ PianoDestroyPlaylist (&ph); break; case 'l': - PianoRateTrack (&ph, curStation, curSong, - PIANO_RATE_LOVE); - printf ("Loved.\n"); + if (PianoRateTrack (&ph, curStation, curSong, + PIANO_RATE_LOVE) == PIANO_RET_OK) { + printf ("Loved.\n"); + } else { + printf ("Error while loving track.\n"); + } break; case 'n': |