Add. timerfunction
to multi interface
This commit is contained in:
parent
dde623513c
commit
922d993c9a
@ -579,8 +579,6 @@ static int lcurl_progress_callback(void *arg, double dltotal, double dlnow,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int lcurl_easy_set_PROGRESSFUNCTION(lua_State *L){
|
static int lcurl_easy_set_PROGRESSFUNCTION(lua_State *L){
|
||||||
lcurl_easy_t *p = lcurl_geteasy(L);
|
lcurl_easy_t *p = lcurl_geteasy(L);
|
||||||
int n = lcurl_easy_set_callback(L, p, &p->pr,
|
int n = lcurl_easy_set_callback(L, p, &p->pr,
|
||||||
|
126
src/lcmulti.c
126
src/lcmulti.c
@ -15,10 +15,11 @@ int lcurl_multi_create(lua_State *L, int error_mode){
|
|||||||
lcurl_multi_t *p = lutil_newudatap(L, lcurl_multi_t, LCURL_MULTI);
|
lcurl_multi_t *p = lutil_newudatap(L, lcurl_multi_t, LCURL_MULTI);
|
||||||
p->curl = curl_multi_init();
|
p->curl = curl_multi_init();
|
||||||
if(!p->curl) return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_MULTI, CURLM_INTERNAL_ERROR);
|
if(!p->curl) return lcurl_fail_ex(L, p->err_mode, LCURL_ERROR_MULTI, CURLM_INTERNAL_ERROR);
|
||||||
|
p->L = L;
|
||||||
p->err_mode = error_mode;
|
p->err_mode = error_mode;
|
||||||
lcurl_util_new_weak_table(L, "v");
|
lcurl_util_new_weak_table(L, "v");
|
||||||
p->h_ref = luaL_ref(L, LCURL_LUA_REGISTRY);
|
p->h_ref = luaL_ref(L, LCURL_LUA_REGISTRY);
|
||||||
|
p->tm.cb_ref = p->tm.ud_ref = LUA_NOREF;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,6 +178,122 @@ static int lcurl_opt_set_string_array_(lua_State *L, int opt){
|
|||||||
#undef LCURL_LNG_OPT
|
#undef LCURL_LNG_OPT
|
||||||
#undef LCURL_STR_ARR_OPT
|
#undef LCURL_STR_ARR_OPT
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
//{ CallBack
|
||||||
|
|
||||||
|
static int lcurl_multi_set_callback(lua_State *L,
|
||||||
|
lcurl_multi_t *p, lcurl_callback_t *c,
|
||||||
|
int OPT_CB, int OPT_UD,
|
||||||
|
const char *method, void *func
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if(c->ud_ref != LUA_NOREF){
|
||||||
|
luaL_unref(L, LCURL_LUA_REGISTRY, c->ud_ref);
|
||||||
|
c->ud_ref = LUA_NOREF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(c->cb_ref != LUA_NOREF){
|
||||||
|
luaL_unref(L, LCURL_LUA_REGISTRY, c->cb_ref);
|
||||||
|
c->cb_ref = LUA_NOREF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lua_gettop(L) >= 3){// function + context
|
||||||
|
lua_settop(L, 3);
|
||||||
|
luaL_argcheck(L, !lua_isnil(L, 2), 2, "no function present");
|
||||||
|
c->ud_ref = luaL_ref(L, LCURL_LUA_REGISTRY);
|
||||||
|
c->cb_ref = luaL_ref(L, LCURL_LUA_REGISTRY);
|
||||||
|
|
||||||
|
curl_multi_setopt(p->curl, OPT_UD, p);
|
||||||
|
curl_multi_setopt(p->curl, OPT_CB, func);
|
||||||
|
|
||||||
|
assert(1 == lua_gettop(L));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_settop(L, 2);
|
||||||
|
|
||||||
|
if(lua_isnoneornil(L, 2)){
|
||||||
|
lua_pop(L, 1);
|
||||||
|
assert(1 == lua_gettop(L));
|
||||||
|
|
||||||
|
curl_multi_setopt(p->curl, OPT_UD, 0);
|
||||||
|
curl_multi_setopt(p->curl, OPT_CB, 0);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lua_isfunction(L, 2)){
|
||||||
|
c->cb_ref = luaL_ref(L, LCURL_LUA_REGISTRY);
|
||||||
|
assert(1 == lua_gettop(L));
|
||||||
|
|
||||||
|
curl_multi_setopt(p->curl, OPT_UD, p);
|
||||||
|
curl_multi_setopt(p->curl, OPT_CB, func);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lua_isuserdata(L, 2) || lua_istable(L, 2)){
|
||||||
|
lua_getfield(L, 2, method);
|
||||||
|
luaL_argcheck(L, lua_isfunction(L, -1), 2, "method not found in object");
|
||||||
|
c->cb_ref = luaL_ref(L, LCURL_LUA_REGISTRY);
|
||||||
|
c->ud_ref = luaL_ref(L, LCURL_LUA_REGISTRY);
|
||||||
|
curl_multi_setopt(p->curl, OPT_UD, p);
|
||||||
|
curl_multi_setopt(p->curl, OPT_CB, func);
|
||||||
|
assert(1 == lua_gettop(L));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pushliteral(L, "invalid object type");
|
||||||
|
return lua_error(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
//{Timer
|
||||||
|
|
||||||
|
int lcurl_multi_timer_callback(CURLM *multi, long ms, void *arg){
|
||||||
|
lcurl_multi_t *p = arg;
|
||||||
|
lua_State *L = p->L;
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
int top = lua_gettop(L);
|
||||||
|
int n = lcurl_util_push_cb(L, &p->tm);
|
||||||
|
|
||||||
|
lua_pushnumber(L, ms);
|
||||||
|
if(lua_pcall(L, n, LUA_MULTRET, 0)){
|
||||||
|
assert(lua_gettop(L) >= top);
|
||||||
|
lua_settop(L, top); //! @todo
|
||||||
|
// lua_pushlightuserdata(L, (void*)LCURL_ERROR_TAG);
|
||||||
|
// lua_insert(L, top+1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lua_gettop(L) > top){
|
||||||
|
if(lua_isnil(L, top + 1)){
|
||||||
|
lua_settop(L, top);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lua_isboolean(L, top + 1))
|
||||||
|
ret = lua_toboolean(L, top + 1)?0:-1;
|
||||||
|
else ret = lua_tonumber(L, top + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_settop(L, top);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int lcurl_multi_set_TIMERFUNCTION(lua_State *L){
|
||||||
|
lcurl_multi_t *p = lcurl_getmulti(L);
|
||||||
|
return lcurl_multi_set_callback(L, p, &p->tm,
|
||||||
|
CURLMOPT_TIMERFUNCTION, CURLMOPT_TIMERDATA,
|
||||||
|
"write", lcurl_multi_timer_callback
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
static int lcurl_multi_setopt(lua_State *L){
|
static int lcurl_multi_setopt(lua_State *L){
|
||||||
lcurl_multi_t *p = lcurl_getmulti(L);
|
lcurl_multi_t *p = lcurl_getmulti(L);
|
||||||
int opt = luaL_checklong(L, 2);
|
int opt = luaL_checklong(L, 2);
|
||||||
@ -185,6 +302,7 @@ static int lcurl_multi_setopt(lua_State *L){
|
|||||||
#define OPT_ENTRY(l, N, T, S) case CURLMOPT_##N: return lcurl_multi_set_##N(L);
|
#define OPT_ENTRY(l, N, T, S) case CURLMOPT_##N: return lcurl_multi_set_##N(L);
|
||||||
switch(opt){
|
switch(opt){
|
||||||
#include "lcoptmulti.h"
|
#include "lcoptmulti.h"
|
||||||
|
OPT_ENTRY(timerfunction, TIMERFUNCTION, TTT, 0)
|
||||||
}
|
}
|
||||||
#undef OPT_ENTRY
|
#undef OPT_ENTRY
|
||||||
|
|
||||||
@ -193,8 +311,6 @@ static int lcurl_multi_setopt(lua_State *L){
|
|||||||
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
static const struct luaL_Reg lcurl_multi_methods[] = {
|
static const struct luaL_Reg lcurl_multi_methods[] = {
|
||||||
{"add_handle", lcurl_multi_add_handle },
|
{"add_handle", lcurl_multi_add_handle },
|
||||||
{"remove_handle", lcurl_multi_remove_handle },
|
{"remove_handle", lcurl_multi_remove_handle },
|
||||||
@ -204,6 +320,7 @@ static const struct luaL_Reg lcurl_multi_methods[] = {
|
|||||||
|
|
||||||
#define OPT_ENTRY(L, N, T, S) { "setopt_"#L, lcurl_multi_set_##N },
|
#define OPT_ENTRY(L, N, T, S) { "setopt_"#L, lcurl_multi_set_##N },
|
||||||
#include "lcoptmulti.h"
|
#include "lcoptmulti.h"
|
||||||
|
OPT_ENTRY(timerfunction, TIMERFUNCTION, TTT, 0)
|
||||||
#undef OPT_ENTRY
|
#undef OPT_ENTRY
|
||||||
|
|
||||||
{"close", lcurl_multi_cleanup },
|
{"close", lcurl_multi_cleanup },
|
||||||
@ -214,7 +331,8 @@ static const struct luaL_Reg lcurl_multi_methods[] = {
|
|||||||
|
|
||||||
static const lcurl_const_t lcurl_multi_opt[] = {
|
static const lcurl_const_t lcurl_multi_opt[] = {
|
||||||
#define OPT_ENTRY(L, N, T, S) { "OPT_MULTI_"#N, CURLMOPT_##N },
|
#define OPT_ENTRY(L, N, T, S) { "OPT_MULTI_"#N, CURLMOPT_##N },
|
||||||
#include "lcoptmulti.h"
|
#include "lcoptmulti.h"
|
||||||
|
OPT_ENTRY(timerfunction, TIMERFUNCTION, TTT, 0)
|
||||||
#undef OPT_ENTRY
|
#undef OPT_ENTRY
|
||||||
|
|
||||||
{NULL, 0}
|
{NULL, 0}
|
||||||
|
@ -6,8 +6,10 @@
|
|||||||
|
|
||||||
typedef struct lcurl_multi_tag{
|
typedef struct lcurl_multi_tag{
|
||||||
CURLM *curl;
|
CURLM *curl;
|
||||||
|
lua_State *L;
|
||||||
int err_mode;
|
int err_mode;
|
||||||
int h_ref;
|
int h_ref;
|
||||||
|
lcurl_callback_t tm;
|
||||||
}lcurl_multi_t;
|
}lcurl_multi_t;
|
||||||
|
|
||||||
int lcurl_multi_create(lua_State *L, int error_mode);
|
int lcurl_multi_create(lua_State *L, int error_mode);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user