bool MPD::Song::SendQueue() { ExtractQueue(); if (!myHandshake.OK()) return false; Log(llInfo, "Submitting songs..."); string result, postdata; CURLcode code; postdata = "s="; postdata += myHandshake.SessionID; for (std::deque<string>::const_iterator it = Song::SubmitQueue.begin(); it != Song::SubmitQueue.end(); it++) postdata += *it; Log(llVerbose, "URL: %s", myHandshake.SubmissionURL.c_str()); Log(llVerbose, "Post data: %s", postdata.c_str()); CURL *submission = curl_easy_init(); curl_easy_setopt(submission, CURLOPT_URL, myHandshake.SubmissionURL.c_str()); curl_easy_setopt(submission, CURLOPT_POST, 1); curl_easy_setopt(submission, CURLOPT_POSTFIELDS, postdata.c_str()); curl_easy_setopt(submission, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(submission, CURLOPT_WRITEDATA, &result); curl_easy_setopt(submission, CURLOPT_CONNECTTIMEOUT, curl_queue_connecttimeout); curl_easy_setopt(submission, CURLOPT_TIMEOUT, curl_queue_timeout); curl_easy_setopt(submission, CURLOPT_DNS_CACHE_TIMEOUT, 0); curl_easy_setopt(submission, CURLOPT_NOPROGRESS, 1); curl_easy_setopt(submission, CURLOPT_NOSIGNAL, 1); code = curl_easy_perform(submission); curl_easy_cleanup(submission); IgnoreNewlines(result); if (result == "OK") { Log(llInfo, "Number of submitted songs: %d", Song::SubmitQueue.size()); SubmitQueue.clear(); std::ofstream f(Config.file_cache.c_str(), std::ios::trunc); f.close(); NowPlayingNotify = s.Data && !s.isStream(); return true; } else { if (result.empty()) { Log(llError, "Error while submitting songs: %s", curl_easy_strerror(code)); } else { Log(llError, "Audioscrobbler returned status %s", result.c_str()); // BADSESSION or FAILED was returned, handshake needs resetting. myHandshake.Clear(); Log(llVerbose, "Handshake reset"); } return false; } }