summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntti Ajanki <antti.ajanki@iki.fi>2013-08-06 10:00:55 +0300
committerAntti Ajanki <antti.ajanki@iki.fi>2013-08-06 10:00:55 +0300
commit0099ac650c9a478af925c19e404436938a2b6437 (patch)
tree754cc0a3c0cc6e587eb206e0ba5cc91ed7dd8708
parent7c81286a59639e139ac7e947378be24410701a5e (diff)
downloadvdr-plugin-webvideo-0099ac650c9a478af925c19e404436938a2b6437.tar.gz
vdr-plugin-webvideo-0099ac650c9a478af925c19e404436938a2b6437.tar.bz2
implement timeout callback
-rw-r--r--src/libwebvi/libwebvi.c12
-rw-r--r--src/libwebvi/webvicontext.c29
-rw-r--r--src/libwebvi/webvicontext.h3
-rw-r--r--src/webvicli/webvicli/client.py2
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: