optional<string> FileSharing::download(const string& filename, const string& dir, ProgressMeter& meter) { progressFun = [&] (double p) { meter.setProgress(p);}; if (CURL *curl = curl_easy_init()) { string path = dir + "/" + filename; Debug() << "Downloading to " << path; if (FILE *fp = fopen(path.c_str(), "wb")) { curl_easy_setopt(curl, CURLOPT_URL, escapeUrl(uploadUrl + "/uploads/" + filename).c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeToFile); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); // Internal CURL progressmeter must be disabled if we provide our own callback curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false); // Install the callback function curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progressFunction); curl_easy_setopt(curl, CURLOPT_FAILONERROR, true); CURLcode res = curl_easy_perform(curl); string ret; if(res != CURLE_OK) ret = string("Upload failed: ") + curl_easy_strerror(res); curl_easy_cleanup(curl); fclose(fp); if (!ret.empty()) { remove(path.c_str()); return ret; } else return none; } else return string("Failed to open file: " + path); } else return string("Failed to initialize libcurl"); }
optional<string> FileSharing::uploadSite(const string& path, ProgressMeter& meter) { if (!options.getBoolValue(OptionId::ONLINE)) return none; static ProgressCallback callback = [&] (double p) { meter.setProgress(p);}; return curlUpload(path.c_str(), (uploadUrl + "/upload_site.php").c_str(), &callback, 0); }
optional<string> FileSharing::uploadRetired(const string& path, ProgressMeter& meter) { progressFun = [&] (double p) { meter.setProgress(p);}; return curlUpload(path.c_str(), (uploadUrl + "/upload.php").c_str()); }