diff options
author | Antti Ajanki <antti.ajanki@iki.fi> | 2013-08-06 10:00:55 +0300 |
---|---|---|
committer | Antti Ajanki <antti.ajanki@iki.fi> | 2013-08-06 10:00:55 +0300 |
commit | 0099ac650c9a478af925c19e404436938a2b6437 (patch) | |
tree | 754cc0a3c0cc6e587eb206e0ba5cc91ed7dd8708 | |
parent | 7c81286a59639e139ac7e947378be24410701a5e (diff) | |
download | vdr-plugin-webvideo-0099ac650c9a478af925c19e404436938a2b6437.tar.gz vdr-plugin-webvideo-0099ac650c9a478af925c19e404436938a2b6437.tar.bz2 |
implement timeout callback
-rw-r--r-- | src/libwebvi/libwebvi.c | 12 | ||||
-rw-r--r-- | src/libwebvi/webvicontext.c | 29 | ||||
-rw-r--r-- | src/libwebvi/webvicontext.h | 3 | ||||
-rw-r--r-- | src/webvicli/webvicli/client.py | 2 |
4 files changed, 40 insertions, 6 deletions
diff --git a/src/libwebvi/libwebvi.c b/src/libwebvi/libwebvi.c index b3d030a..feeec28 100644 --- a/src/libwebvi/libwebvi.c +++ b/src/libwebvi/libwebvi.c @@ -90,13 +90,17 @@ WebviResult webvi_set_config(WebviCtx ctxhandle, WebviConfig conf, ...) { webvi_context_set_debug(ctx, strcmp(p, "0") != 0); break; case WEBVI_CONFIG_TIMEOUT_CALLBACK: - // FIXME - // va_arg(argptr, long) + { + webvi_timeout_callback callback = va_arg(argptr, webvi_timeout_callback); + webvi_context_set_timeout_callback(ctx, callback); break; + } case WEBVI_CONFIG_TIMEOUT_DATA: - // FIXME - // va_arg(argptr, long) + { + void *data = va_arg(argptr, void *); + webvi_context_set_timeout_data(ctx, data); break; + } default: res = WEBVIERR_INVALID_PARAMETER; }; diff --git a/src/libwebvi/webvicontext.c b/src/libwebvi/webvicontext.c index 4e33e94..16cba10 100644 --- a/src/libwebvi/webvicontext.c +++ b/src/libwebvi/webvicontext.c @@ -14,6 +14,8 @@ struct WebviContext { WebviHandle next_request; CURLM *curl_multi_handle; gchar *template_path; + webvi_timeout_callback timeout_callback; + void *timeout_data; GArray *finish_messages; /* The value returned by the latest webvi_context_next_message() call */ WebviMsg current_message; @@ -49,6 +51,7 @@ static RequestState curl_code_to_pipe_state(CURLcode curlcode); static WebviResult curlmcode_to_webvierr(CURLMcode mcode); static void webvi_log_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data); +static int curl_timeout_wrapper(CURLM* curlmulti, long timeout_ms, void *userdata); static void register_context(WebviCtx key, WebviContext *value); static GTree *get_tls_contexts(); static void webvi_context_delete(WebviContext *ctx); @@ -161,11 +164,35 @@ void webvi_context_remove_request(WebviContext *self, WebviHandle h) { } CURLM *webvi_context_get_curl_multi_handle(WebviContext *self) { - if (!self->curl_multi_handle) + if (!self->curl_multi_handle) { self->curl_multi_handle = curl_multi_init(); + curl_multi_setopt(self->curl_multi_handle, CURLMOPT_TIMERFUNCTION, + curl_timeout_wrapper); + curl_multi_setopt(self->curl_multi_handle, CURLMOPT_TIMERDATA, self); + } return self->curl_multi_handle; } +int curl_timeout_wrapper(CURLM* curlmulti, long timeout_ms, void *userdata) +{ + WebviContext *ctx = (WebviContext *)userdata; + if (ctx->timeout_callback) { + ctx->timeout_callback(timeout_ms, ctx->timeout_data); + } + + return 0; +} + +void webvi_context_set_timeout_callback(WebviContext *ctx, + webvi_timeout_callback callback) +{ + ctx->timeout_callback = callback; +} + +void webvi_context_set_timeout_data(WebviContext *ctx, void *data) { + ctx->timeout_data = data; +} + WebviCtx handle_for_context(WebviContext *ctx) { return (WebviCtx)ctx; // FIXME } diff --git a/src/libwebvi/webvicontext.h b/src/libwebvi/webvicontext.h index 7fa0738..b3beb0e 100644 --- a/src/libwebvi/webvicontext.h +++ b/src/libwebvi/webvicontext.h @@ -43,6 +43,9 @@ void webvi_context_set_template_path(WebviContext *self, const char *webvi_context_get_template_path(const WebviContext *self); const LinkTemplates *get_link_templates(WebviContext *self); CURLM *webvi_context_get_curl_multi_handle(WebviContext *self); +void webvi_context_set_timeout_callback(WebviContext *ctx, + webvi_timeout_callback callback); +void webvi_context_set_timeout_data(WebviContext *ctx, void *data); WebviHandle webvi_context_add_request(WebviContext *self, WebviRequest *req); void webvi_context_remove_request(WebviContext *self, WebviHandle h); diff --git a/src/webvicli/webvicli/client.py b/src/webvicli/webvicli/client.py index 5de29c9..7dfbccb 100644 --- a/src/webvicli/webvicli/client.py +++ b/src/webvicli/webvicli/client.py @@ -236,7 +236,7 @@ class WVClient: def set_template_path(self, path): self.webvi.set_template_path(path) - def update_timeout(self, timeout_ms, data): + def update_timeout(self, timeout_ms): if timeout_ms < 0: self.alarm = None else: |