diff --git a/src/gui/lua/lua_curl.cpp b/src/gui/lua/lua_curl.cpp index f25549af5..69d25ea17 100644 --- a/src/gui/lua/lua_curl.cpp +++ b/src/gui/lua/lua_curl.cpp @@ -83,9 +83,9 @@ size_t CLuaInstCurl::CurlWriteToString(void *ptr, size_t size, size_t nmemb, voi return size*nmemb; } -int CLuaInstCurl::CurlProgressFunc(void *p, double dltotal, double dlnow, double /*ultotal*/, double /*ulnow*/) +int CLuaInstCurl::CurlProgressFunc(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t /*ultotal*/, curl_off_t /*ulnow*/) { - if (dltotal <= 0.0) + if (dltotal == 0) return 0; struct progressData *_pgd = static_cast(p); @@ -98,15 +98,16 @@ int CLuaInstCurl::CurlProgressFunc(void *p, double dltotal, double dlnow, double curl_easy_getinfo(_pgd->curl, CURLINFO_SPEED_DOWNLOAD, &dlSpeed); curl_easy_getinfo(_pgd->curl, CURLINFO_RESPONSE_CODE, &responseCode); - double dlFragment = dlnow / dltotal; + uint32_t MUL = 0x7FFF; + uint32_t dlFragment = (dlnow * MUL) / dltotal; if (responseCode != 200) { dlFragment = 0; dlSpeed = 0; } int showDots = 50; - int dots = round(dlFragment * showDots); - printf(" %3.0f%% [", dlFragment * 100); + int dots = (dlFragment * showDots) / MUL; + printf(" %d%% [", (dlFragment * 100) / MUL); int i = 0; for (; i < dots-1; i++) printf("="); @@ -117,10 +118,16 @@ int CLuaInstCurl::CurlProgressFunc(void *p, double dltotal, double dlnow, double for (; i < showDots; i++) printf(" "); printf("] speed: %.03f KB/sec \r", dlSpeed/1024); fflush(stdout); - return 0; } +#if LIBCURL_VERSION_NUM < 0x072000 +int CLuaInstCurl::CurlProgressFunc_old(void *p, double dltotal, double dlnow, double ultotal, double ulnow) +{ + return CurlProgressFunc(p, (curl_off_t)dltotal, (curl_off_t)dlnow, (curl_off_t)ultotal, (curl_off_t)ulnow); +} +#endif + int CLuaInstCurl::CurlDownload(lua_State *L) { /* @@ -275,10 +282,15 @@ Example: progressData pgd; if (!silent) { - curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, CLuaInstCurl::CurlProgressFunc); pgd.curl = curl_handle; pgd.last_dlnow = -1; +#if LIBCURL_VERSION_NUM >= 0x072000 + curl_easy_setopt(curl_handle, CURLOPT_XFERINFOFUNCTION, CLuaInstCurl::CurlProgressFunc); + curl_easy_setopt(curl_handle, CURLOPT_XFERINFODATA, &pgd); +#else + curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, CLuaInstCurl::CurlProgressFunc_old); curl_easy_setopt(curl_handle, CURLOPT_PROGRESSDATA, &pgd); +#endif } char cerror[CURL_ERROR_SIZE]; diff --git a/src/gui/lua/lua_curl.h b/src/gui/lua/lua_curl.h index 67b00eec4..26eccb93a 100644 --- a/src/gui/lua/lua_curl.h +++ b/src/gui/lua/lua_curl.h @@ -29,7 +29,7 @@ class CLuaCurl struct progressData { CURL *curl; - double last_dlnow; + curl_off_t last_dlnow; }; class CLuaInstCurl @@ -52,7 +52,10 @@ class CLuaInstCurl static CLuaCurl *CurlCheckData(lua_State *L, int n); static int CurlNew(lua_State *L); static size_t CurlWriteToString(void *ptr, size_t size, size_t nmemb, void *data); - static int CurlProgressFunc(void *p, double dltotal, double dlnow, double ultotal, double ulnow); +#if LIBCURL_VERSION_NUM < 0x072000 + static int CurlProgressFunc_old(void *p, double dltotal, double dlnow, double ultotal, double ulnow); +#endif + static int CurlProgressFunc(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow); static int CurlDownload(lua_State *L); static int CurlDelete(lua_State *L); }; diff --git a/src/gui/lua/luainstance.h b/src/gui/lua/luainstance.h index 98fe6ea40..5a96eed88 100644 --- a/src/gui/lua/luainstance.h +++ b/src/gui/lua/luainstance.h @@ -31,7 +31,7 @@ extern "C" { #include "luainstance_helpers.h" #define LUA_API_VERSION_MAJOR 1 -#define LUA_API_VERSION_MINOR 30 +#define LUA_API_VERSION_MINOR 31 /* inspired by Steve Kemp http://www.steve.org.uk/ */ class CLuaInstance