diff --git a/src/gui/lua/lua_api_version.h b/src/gui/lua/lua_api_version.h index 7d33c9c18..e69dd01c8 100644 --- a/src/gui/lua/lua_api_version.h +++ b/src/gui/lua/lua_api_version.h @@ -4,4 +4,4 @@ * to luainstance.h changes */ #define LUA_API_VERSION_MAJOR 1 -#define LUA_API_VERSION_MINOR 77 +#define LUA_API_VERSION_MINOR 78 diff --git a/src/gui/lua/lua_curl.cpp b/src/gui/lua/lua_curl.cpp index 1407d4eb2..7c4254cd5 100644 --- a/src/gui/lua/lua_curl.cpp +++ b/src/gui/lua/lua_curl.cpp @@ -52,9 +52,12 @@ CLuaCurl *CLuaInstCurl::CurlCheckData(lua_State *L, int n) void CLuaInstCurl::LuaCurlRegister(lua_State *L) { luaL_Reg meth[] = { - { "new", CLuaInstCurl::CurlNew }, - { "download", CLuaInstCurl::CurlDownload }, - { "__gc", CLuaInstCurl::CurlDelete }, + { "new", CLuaInstCurl::CurlNew }, + { "download", CLuaInstCurl::CurlDownload }, + { "encodeUri", CLuaInstCurl::CurlEncodeUri }, + { "decodeUri", CLuaInstCurl::CurlDecodeUri }, + { "setUriData", CLuaInstCurl::CurlSetUriData }, + { "__gc", CLuaInstCurl::CurlDelete }, { NULL, NULL } }; @@ -374,6 +377,108 @@ Example: return 2; } +std::string CLuaInstCurl::CurlUriInternal(std::string data, bool decode) +{ + std::string retString = ""; + CURL *curl_handle = curl_easy_init(); + if (curl_handle) { + int outlength; + char *pfTmp; + if (decode) + pfTmp = curl_easy_unescape(curl_handle, data.c_str(), data.length(), &outlength); + else + pfTmp = curl_easy_escape(curl_handle, data.c_str(), data.length()); + if (pfTmp) { + retString = static_cast(pfTmp); + curl_free(pfTmp); + } + curl_easy_cleanup(curl_handle); + } + return retString; +} + +int CLuaInstCurl::CurlEncodeUri(lua_State *L) +{ + CLuaCurl *D = CurlCheckData(L, 1); + if (!D) { + lua_pushnil(L); + return 1; + } + const char *data = luaL_checkstring(L, 2); + if (!data) { + lua_pushnil(L); + return 1; + } + + std::string retString = CurlUriInternal(static_cast(data), false); + + if (retString.empty()) + lua_pushnil(L); + else + lua_pushstring(L, retString.c_str()); + + return 1; +} + +int CLuaInstCurl::CurlDecodeUri(lua_State *L) +{ + CLuaCurl *D = CurlCheckData(L, 1); + if (!D) { + lua_pushnil(L); + return 1; + } + const char *data = luaL_checkstring(L, 2); + if (!data) { + lua_pushnil(L); + return 1; + } + + std::string retString = CurlUriInternal(static_cast(data), true); + + if (retString.empty()) + lua_pushnil(L); + else + lua_pushstring(L, retString.c_str()); + + return 1; +} + +int CLuaInstCurl::CurlSetUriData(lua_State *L) +{ + CLuaCurl *D = CurlCheckData(L, 1); + if (!D) { + lua_pushnil(L); + return 1; + } + int numargs = lua_gettop(L); + if (numargs < 3) { + printf("CLuaInstVideo::%s: not enough arguments (%d, expected at least 2)\n", __func__, numargs-1); + lua_pushnil(L); + return 1; + } + + const char *key; + const char *data; + std::string retString = ""; + for (int i = 2; i < numargs; i += 2) { + key = luaL_checkstring(L, i); + data = luaL_checkstring(L, i+1); + if (key && data && (strlen(key) > 0)) { + if (i > 2) + retString += "&"; + retString += static_cast(key) + "="; + retString += CurlUriInternal(static_cast(data), false); + } + } + + if (retString.empty()) + lua_pushnil(L); + else + lua_pushstring(L, retString.c_str()); + + return 1; +} + int CLuaInstCurl::CurlDelete(lua_State *L) { CLuaCurl *D = CurlCheckData(L, 1); diff --git a/src/gui/lua/lua_curl.h b/src/gui/lua/lua_curl.h index 26eccb93a..f3a077856 100644 --- a/src/gui/lua/lua_curl.h +++ b/src/gui/lua/lua_curl.h @@ -47,6 +47,7 @@ class CLuaInstCurl ~CLuaInstCurl() {}; static CLuaInstCurl* getInstance(); static void LuaCurlRegister(lua_State *L); + static std::string CurlUriInternal(std::string data, bool decode); private: static CLuaCurl *CurlCheckData(lua_State *L, int n); @@ -57,6 +58,9 @@ class CLuaInstCurl #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 CurlEncodeUri(lua_State *L); + static int CurlDecodeUri(lua_State *L); + static int CurlSetUriData(lua_State *L); static int CurlDelete(lua_State *L); };