57
57
(unsigned long) time (NULL) % 10000000);
60
/* free complete search result
62
* @param search result
60
/* destroy artist linked list
64
void PianoDestroySearchResult (PianoSearchResult_t *searchResult) {
62
void PianoDestroyArtists (PianoArtist_t *artists) {
65
63
PianoArtist_t *curArtist, *lastArtist;
66
PianoSong_t *curSong, *lastSong;
68
curArtist = searchResult->artists;
69
66
while (curArtist != NULL) {
70
67
free (curArtist->name);
71
68
free (curArtist->musicId);
69
free (curArtist->seedId);
72
70
lastArtist = curArtist;
73
71
curArtist = curArtist->next;
77
curSong = searchResult->songs;
78
while (curSong != NULL) {
79
free (curSong->title);
80
free (curSong->artist);
81
free (curSong->musicId);
83
curSong = curSong->next;
76
/* free complete search result
78
* @param search result
80
void PianoDestroySearchResult (PianoSearchResult_t *searchResult) {
81
PianoDestroyArtists (searchResult->artists);
82
PianoDestroyPlaylist (searchResult->songs);
88
85
/* free single station
128
125
free (curSong->stationId);
129
126
free (curSong->album);
130
127
free (curSong->artistMusicId);
128
free (curSong->feedbackId);
129
free (curSong->seedId);
130
free (curSong->detailUrl);
131
131
lastSong = curSong;
132
132
curSong = curSong->next;
137
void PianoDestroyStationInfo (PianoStationInfo_t *info) {
138
PianoDestroyPlaylist (info->feedback);
139
PianoDestroyPlaylist (info->songSeeds);
140
PianoDestroyArtists (info->artistSeeds);
137
143
/* destroy genre linked list
139
145
void PianoDestroyGenres (PianoGenre_t *genres) {
242
248
"rid=%s&method=sync", ph->routeId);
252
char *xmlencodedPassword = NULL;
254
/* username == email address does not contain &,<,>," */
255
if ((xmlencodedPassword =
256
PianoXmlEncodeString (logindata->password)) ==
258
return PIANO_RET_OUT_OF_MEMORY;
246
261
snprintf (xmlSendBuf, sizeof (xmlSendBuf),
247
262
"<?xml version=\"1.0\"?><methodCall>"
248
263
"<methodName>listener.authenticateListener</methodName>"
250
265
"<param><value><string>%s</string></value></param>"
251
266
"<param><value><string>%s</string></value></param>"
252
267
"</params></methodCall>", (unsigned long) timestamp,
253
logindata->user, logindata->password);
268
logindata->user, xmlencodedPassword);
254
269
snprintf (req->urlPath, sizeof (req->urlPath), PIANO_RPC_PATH
255
270
"rid=%s&method=authenticateListener", ph->routeId);
272
free (xmlencodedPassword);
458
476
snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>"
459
477
"<methodCall><methodName>station.createStation</methodName>"
460
478
"<params><param><value><int>%lu</int></value></param>"
461
480
"<param><value><string>%s</string></value></param>"
462
482
"<param><value><string>%s%s</string></value></param>"
484
"<param><value><string></string></value></param>"
463
485
"</params></methodCall>", (unsigned long) timestamp,
464
486
ph->user.authToken, reqData->type, reqData->id);
466
488
snprintf (req->urlPath, sizeof (req->urlPath), PIANO_RPC_PATH
467
"rid=%s&lid=%s&method=createStation&arg1=%s%s", ph->routeId,
489
"rid=%s&lid=%s&method=createStation&arg1=%s%s&arg2=", ph->routeId,
468
490
ph->user.listenerId, reqData->type, reqData->id);
480
502
snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>"
481
503
"<methodCall><methodName>station.addSeed</methodName><params>"
482
504
"<param><value><int>%lu</int></value></param>"
483
"<param><value><string>%s</string></value></param>"
484
"<param><value><string>%s</string></value></param>"
506
"<param><value><string>%s</string></value></param>"
508
"<param><value><string>%s</string></value></param>"
485
510
"<param><value><string>%s</string></value></param>"
486
511
"</params></methodCall>", (unsigned long) timestamp,
487
512
ph->user.authToken, reqData->station->id, reqData->musicId);
724
case PIANO_REQUEST_GET_STATION_INFO: {
725
/* get station information (seeds and feedback) */
726
PianoRequestDataGetStationInfo_t *reqData = req->data;
728
assert (reqData != NULL);
729
assert (reqData->station != NULL);
731
snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>"
732
"<methodCall><methodName>station.getStation</methodName>"
733
"<params><param><value><int>%lu</int></value></param>"
735
"<param><value><string>%s</string></value></param>"
737
"<param><value><string>%s</string></value></param>"
738
"</params></methodCall>", (unsigned long) timestamp,
739
ph->user.authToken, reqData->station->id);
740
snprintf (req->urlPath, sizeof (req->urlPath), PIANO_RPC_PATH
741
"rid=%s&lid=%s&method=getStation&arg1=%s",
742
ph->routeId, ph->user.listenerId, reqData->station->id);
746
case PIANO_REQUEST_DELETE_FEEDBACK: {
747
PianoSong_t *song = req->data;
749
assert (song != NULL);
751
snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>"
752
"<methodCall><methodName>station.deleteFeedback</methodName>"
753
"<params><param><value><int>%lu</int></value></param>"
755
"<param><value><string>%s</string></value></param>"
757
"<param><value><string>%s</string></value></param>"
758
"</params></methodCall>", (unsigned long) timestamp,
759
ph->user.authToken, song->feedbackId);
760
snprintf (req->urlPath, sizeof (req->urlPath), PIANO_RPC_PATH
761
"rid=%s&lid=%s&method=deleteFeedback&arg1=%s",
762
ph->routeId, ph->user.listenerId, song->feedbackId);
766
case PIANO_REQUEST_DELETE_SEED: {
767
PianoRequestDataDeleteSeed_t *reqData = req->data;
770
assert (reqData != NULL);
771
assert (reqData->song != NULL || reqData->artist != NULL);
773
if (reqData->song != NULL) {
774
seedId = reqData->song->seedId;
775
} else if (reqData->artist != NULL) {
776
seedId = reqData->artist->seedId;
779
assert (seedId != NULL);
781
snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>"
782
"<methodCall><methodName>station.deleteSeed</methodName>"
783
"<params><param><value><int>%lu</int></value></param>"
785
"<param><value><string>%s</string></value></param>"
787
"<param><value><string>%s</string></value></param>"
788
"</params></methodCall>", (unsigned long) timestamp,
789
ph->user.authToken, seedId);
790
snprintf (req->urlPath, sizeof (req->urlPath), PIANO_RPC_PATH
791
"rid=%s&lid=%s&method=deleteSeed&arg1=%s",
792
ph->routeId, ph->user.listenerId, seedId);
699
796
/* "high-level" wrapper */
700
797
case PIANO_REQUEST_RATE_SONG: {
701
798
/* love/ban song */
1017
1115
&reqData->searchResult);
1119
case PIANO_REQUEST_GET_STATION_INFO: {
1120
/* get station information (seeds and feedback) */
1121
PianoRequestDataGetStationInfo_t *reqData = req->data;
1123
assert (req->responseData != NULL);
1124
assert (reqData != NULL);
1126
ret = PianoXmlParseGetStationInfo (req->responseData,
1131
case PIANO_REQUEST_DELETE_SEED: {
1132
assert (req->responseData != NULL);
1134
/* dummy function, checks for errors only */
1135
ret = PianoXmlParseTranformStation (req->responseData);