From f48e390437363c4542e0f42ff27e11d723f8df01 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 14 Jan 2015 15:49:53 +0100 Subject: [PATCH] DVB network grid: add 'Force Scan' functionality --- src/api/api_mpegts.c | 39 +++++++++++++++++++++++++++++++ src/input/mpegts.h | 1 + src/input/mpegts/mpegts_network.c | 8 +++++++ src/webui/static/app/mpegts.js | 37 ++++++++++++++++++++++++++++- 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/api/api_mpegts.c b/src/api/api_mpegts.c index 2c15335f..bc5ac657 100644 --- a/src/api/api_mpegts.c +++ b/src/api/api_mpegts.c @@ -136,6 +136,44 @@ api_mpegts_network_create return err; } +static int +api_mpegts_network_scan + ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp ) +{ + htsmsg_field_t *f; + htsmsg_t *uuids; + mpegts_network_t *mn; + const char *uuid; + + if (!(f = htsmsg_field_find(args, "uuid"))) + return -EINVAL; + if ((uuids = htsmsg_field_get_list(f))) { + HTSMSG_FOREACH(f, uuids) { + if (!(uuid = htsmsg_field_get_str(f))) continue; + mn = mpegts_network_find(uuid); + if (mn) { + pthread_mutex_lock(&global_lock); + mpegts_network_scan(mn); + pthread_mutex_unlock(&global_lock); + } + } + } else if ((uuid = htsmsg_field_get_str(f))) { + printf("STR: '%s'\n", uuid); + mn = mpegts_network_find(uuid); + if (mn) { + pthread_mutex_lock(&global_lock); + mpegts_network_scan(mn); + pthread_mutex_unlock(&global_lock); + } + else + return -ENOENT; + } else { + return -EINVAL; + } + + return 0; +} + static int api_mpegts_network_muxclass ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp ) @@ -356,6 +394,7 @@ api_mpegts_init ( void ) { "mpegts/network/create", ACCESS_ADMIN, api_mpegts_network_create, NULL }, { "mpegts/network/mux_class", ACCESS_ADMIN, api_mpegts_network_muxclass, NULL }, { "mpegts/network/mux_create", ACCESS_ADMIN, api_mpegts_network_muxcreate, NULL }, + { "mpegts/network/scan", ACCESS_ADMIN, api_mpegts_network_scan, NULL }, { "mpegts/mux/grid", ACCESS_ADMIN, api_idnode_grid, api_mpegts_mux_grid }, { "mpegts/mux/class", ACCESS_ADMIN, api_idnode_class, (void*)&mpegts_mux_class }, { "mpegts/service/grid", ACCESS_ADMIN, api_idnode_grid, api_mpegts_service_grid }, diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 2754144b..8ebae796 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -726,6 +726,7 @@ void mpegts_network_delete ( mpegts_network_t *mn, int delconf ); int mpegts_network_set_nid ( mpegts_network_t *mn, uint16_t nid ); int mpegts_network_set_network_name ( mpegts_network_t *mn, const char *name ); +void mpegts_network_scan ( mpegts_network_t *mn ); mpegts_mux_t *mpegts_mux_create0 ( mpegts_mux_t *mm, const idclass_t *class, const char *uuid, diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index 8bc9bd92..73ac3463 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -401,6 +401,14 @@ mpegts_network_set_network_name return 1; } +void +mpegts_network_scan ( mpegts_network_t *mn ) +{ + mpegts_mux_t *mm; + LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) + mpegts_mux_scan_state_set(mm, MM_SCAN_STATE_PEND); +} + /****************************************************************************** * Network classes/creation *****************************************************************************/ diff --git a/src/webui/static/app/mpegts.js b/src/webui/static/app/mpegts.js index 07b96438..cfc4249a 100644 --- a/src/webui/static/app/mpegts.js +++ b/src/webui/static/app/mpegts.js @@ -27,6 +27,39 @@ tvheadend.networks = function(panel, index) }); } + var scanButton = { + name: 'scan', + builder: function() { + return new Ext.Toolbar.Button({ + tooltip: 'Force new scan (all muxes) for selected networks', + iconCls: 'find', + text: 'Force Scan', + disabled: true + }); + }, + callback: function(conf, e, store, select) { + var r = select.getSelections(); + if (r && r.length > 0) { + var uuids = []; + for (var i = 0; i < r.length; i++) + uuids.push(r[i].id); + tvheadend.Ajax({ + url: 'api/mpegts/network/scan', + params: { + uuid: Ext.encode(uuids) + }, + success: function(d) { + store.reload(); + } + }); + } + } + }; + + function selected(s, abuttons) { + abuttons.scan.setDisabled(!s || s.length <= 0); + } + tvheadend.idnode_grid(panel, { url: 'api/mpegts/network', titleS: 'Network', @@ -35,7 +68,8 @@ tvheadend.networks = function(panel, index) tabIndex: index, help: function() { new tvheadend.help('Networks', 'config_networks.html'); - }, + }, + tbar: [scanButton], add: { titleS: 'Network', select: { @@ -50,6 +84,7 @@ tvheadend.networks = function(panel, index) } }, del: true, + selected: selected, sort: { field: 'networkname', direction: 'ASC'