diff options
Diffstat (limited to 'libpiano')
-rw-r--r-- | libpiano/src/main.c | 38 | ||||
-rw-r--r-- | libpiano/src/piano.h | 2 | ||||
-rw-r--r-- | libpiano/src/xml.c | 25 | ||||
-rw-r--r-- | libpiano/src/xml.h | 2 |
4 files changed, 67 insertions, 0 deletions
diff --git a/libpiano/src/main.c b/libpiano/src/main.c index 99daee1..1d5a6d0 100644 --- a/libpiano/src/main.c +++ b/libpiano/src/main.c @@ -464,3 +464,41 @@ PianoReturn_t PianoCreateStation (PianoHandle_t *ph, char *musicId) { return ret; } + +/* FIXME: update station data instead of replacing them */ +/* add more music to existing station; multithreaded apps beware! this alters + * station data, don't forget to lock the station pointer you passed to this + * function + * @public yes + * @param piano handle + * @param add music to this station + * @param music id; can be obtained with PianoSearchMusic () + */ +PianoReturn_t PianoStationAddMusic (PianoHandle_t *ph, + PianoStation_t *station, char *musicId) { + char xmlSendBuf[10000], url[PIANO_URL_BUFFER_SIZE]; + char *requestStr, *retStr; + PianoReturn_t ret; + + snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" + "<methodCall><methodName>station.addSeed</methodName><params>" + "<param><value><int>%li</int></value></param>" + "<param><value><string>%s</string></value></param>" + "<param><value><string>%s</string></value></param>" + "<param><value><string>%s</string></value></param>" + "</params></methodCall>", time (NULL), ph->user.authToken, + station->id, musicId); + requestStr = PianoEncryptString (xmlSendBuf); + + snprintf (url, sizeof (url), PIANO_RPC_URL "rid=%s&lid=%s" + "&method=addSeed&arg1=%s&arg2=%s", ph->routeId, + ph->user.listenerId, station->id, musicId); + + PianoHttpPost (ph->curlHandle, url, requestStr, &retStr); + ret = PianoXmlParseAddSeed (ph, retStr, station); + + free (requestStr); + free (retStr); + + return ret; +} diff --git a/libpiano/src/piano.h b/libpiano/src/piano.h index bd90c4c..f2b8f95 100644 --- a/libpiano/src/piano.h +++ b/libpiano/src/piano.h @@ -162,5 +162,7 @@ PianoReturn_t PianoDeleteStation (PianoHandle_t *ph, PianoStation_t *station); PianoReturn_t PianoSearchMusic (PianoHandle_t *ph, char *searchStr, PianoSearchResult_t *searchResult); PianoReturn_t PianoCreateStation (PianoHandle_t *ph, char *musicId); +PianoReturn_t PianoStationAddMusic (PianoHandle_t *ph, + PianoStation_t *station, char *musicId); #endif /* _PIANO_H */ diff --git a/libpiano/src/xml.c b/libpiano/src/xml.c index 1267951..2d9e82d 100644 --- a/libpiano/src/xml.c +++ b/libpiano/src/xml.c @@ -348,6 +348,31 @@ PianoReturn_t PianoXmlParseCreateStation (PianoHandle_t *ph, char *xml) { return PIANO_RET_OK; } +/* parse "add seed" answer, nearly the same as ParseCreateStation + * @param piano handle + * @param xml document + * @param update this station + */ +PianoReturn_t PianoXmlParseAddSeed (PianoHandle_t *ph, char *xml, + PianoStation_t *station) { + xmlNode *docRoot; + xmlDocPtr doc; + PianoReturn_t ret; + + if ((ret = PianoXmlInitDoc (xml, &doc, &docRoot)) != PIANO_RET_OK) { + return ret; + } + + /* get <struct> node */ + xmlNode *dataRoot = docRoot->children->children->children->children; + PianoDestroyStation (station); + PianoXmlStructParser (dataRoot, PianoXmlParseStationsCb, station); + + xmlFreeDoc (doc); + + return PIANO_RET_OK; +} + /* parses playlist; used when searching too * @param piano handle * @param xml document diff --git a/libpiano/src/xml.h b/libpiano/src/xml.h index 1165f12..ebc2df7 100644 --- a/libpiano/src/xml.h +++ b/libpiano/src/xml.h @@ -32,6 +32,8 @@ PianoReturn_t PianoXmlParseSearch (char *searchXml, PianoSearchResult_t *searchResult); PianoReturn_t PianoXmlParseSimple (char *xml); PianoReturn_t PianoXmlParseCreateStation (PianoHandle_t *ph, char *xml); +PianoReturn_t PianoXmlParseAddSeed (PianoHandle_t *ph, char *xml, + PianoStation_t *station); char *PianoXmlEncodeString (const char *s); |