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 /src/libwebvi/webvicontext.c | |
| parent | 7c81286a59639e139ac7e947378be24410701a5e (diff) | |
| download | vdr-plugin-webvideo-0099ac650c9a478af925c19e404436938a2b6437.tar.gz vdr-plugin-webvideo-0099ac650c9a478af925c19e404436938a2b6437.tar.bz2 | |
implement timeout callback
Diffstat (limited to 'src/libwebvi/webvicontext.c')
| -rw-r--r-- | src/libwebvi/webvicontext.c | 29 |
1 files changed, 28 insertions, 1 deletions
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 } |
