23 #include <SDL2/SDL_system.h>
26 #include <curl/curl.h>
29 #define ERR_NW LOG_STREAM(err, log_network)
30 #define DBG_NW LOG_STREAM(debug, log_network)
36 size_t amount =
size * nmemb;
37 static_cast<std::string*
>(buffer)->append(contents, amount);
38 DBG_NW <<
"Downloaded " << amount <<
" bytes.";
42 void gui_download(
const std::string& url,
const std::string& local_path) {
50 gui2::show_message(
_(
"Download complete"),
_(
"The file has been downloaded."), gui2::dialogs::message::button_style::auto_close);
52 gui2::show_message(
_(
"Download error"),
_(
"An error occurred when downloading the file. Check the game logs for more information."), gui2::dialogs::message::button_style::auto_close);
56 bool download(
const std::string& url,
const std::string& local_path)
58 std::unique_ptr<CURL, decltype(&curl_easy_cleanup)> curl(curl_easy_init(), curl_easy_cleanup);
61 char error[CURL_ERROR_SIZE];
62 std::fill_n(error, CURL_ERROR_SIZE-1,
' ');
63 error[CURL_ERROR_SIZE-1] =
'\0';
66 ERR_NW <<
"curl_easy_init failed initialization, unable to download file.";
74 (res = curl_easy_setopt(curl.get(), CURLOPT_CAINFO, (
game_config::path +
"/certificates/cacert.pem").c_str()) ) != CURLE_OK ||
76 (res = curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str())) != CURLE_OK ||
77 (res = curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION,
write_callback)) != CURLE_OK ||
78 (res = curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &buffer)) != CURLE_OK ||
79 (res = curl_easy_setopt(curl.get(), CURLOPT_ERRORBUFFER, error)) != CURLE_OK ||
80 (res = curl_easy_setopt(curl.get(), CURLOPT_FORBID_REUSE, 1L)) != CURLE_OK ||
81 (res = curl_easy_setopt(curl.get(), CURLOPT_FRESH_CONNECT, 1L)) != CURLE_OK ||
82 (res = curl_easy_setopt(curl.get(), CURLOPT_FAILONERROR, 1L)) != CURLE_OK ||
83 (res = curl_easy_setopt(curl.get(), CURLOPT_TIMEOUT_MS, 5000L)) != CURLE_OK ||
84 #
if LIBCURL_VERSION_NUM >= 0x075500
85 (res = curl_easy_setopt(curl.get(), CURLOPT_PROTOCOLS_STR,
"https")) != CURLE_OK
87 (res = curl_easy_setopt(curl.get(), CURLOPT_PROTOCOLS, CURLPROTO_HTTPS)) != CURLE_OK
90 ERR_NW <<
"Error setting curl option: " << curl_easy_strerror(res);
94 res = curl_easy_perform(curl.get());
96 ERR_NW <<
"Error downloading file from url `" << url <<
"`.\n"
97 <<
"Short error: " << curl_easy_strerror(res) <<
"\n"
98 <<
"Long error: " << std::string(error);
104 DBG_NW <<
"Wrote downloaded file to: " << local_path;
106 ERR_NW <<
"io_exception writing downloaded data to file at: " << local_path <<
"\n" <<
e.what() <<
" : " <<
e.message;
@ yes_no_buttons
Shows a yes and no button.
Declarations for File-IO.
static std::string _(const char *str)
Standard logging facilities (interface).
static bool file_exists(const bfs::path &fpath)
void write_file(const std::string &fname, const std::string &data, std::ios_base::openmode mode)
Throws io_exception if an error occurs.
void show_message(const std::string &title, const std::string &msg, const std::string &button_caption, const bool auto_close, const bool message_use_markup, const bool title_use_markup)
Shows a message to the user.
@ OK
Dialog was closed with the OK button.
High level network layer for config object transport.
void gui_download(const std::string &url, const std::string &local_path)
Initiates a standalone download of a single file from an HTTPS URL.
bool download(const std::string &url, const std::string &local_path)
static size_t write_callback(char *contents, size_t size, size_t nmemb, void *buffer)
std::size_t size(std::string_view str)
Length in characters of a UTF-8 string.
static lg::log_domain log_network("network")
An exception object used when an IO error occurs.