From 1ec1600aa7a0eb4c098be30b809a92d683cd5bf4 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 29 Mar 2016 14:53:31 +0200 Subject: [PATCH] markdown: initial work, register all classes --- Makefile | 17 +-- src/access.c | 4 + src/bouquet.c | 1 + src/channels.c | 2 + src/config.c | 2 + src/descrambler/caclient.c | 5 + src/dvr/dvr_autorec.c | 1 + src/dvr/dvr_config.c | 1 + src/dvr/dvr_db.c | 1 + src/dvr/dvr_timerec.c | 1 + src/epggrab.c | 6 + src/epggrab/channel.c | 1 + src/epggrab/module.c | 12 +- src/epggrab/private.h | 9 ++ src/esfilter.c | 5 +- src/idnode.c | 110 ++++++++++++++---- src/idnode.h | 2 + src/imagecache.c | 2 + src/input.c | 10 ++ src/input.h | 4 +- src/input/mpegts.c | 2 + src/input/mpegts.h | 2 + src/input/mpegts/iptv/iptv.c | 3 + src/input/mpegts/iptv/iptv_private.h | 1 + src/input/mpegts/linuxdvb/linuxdvb_adapter.c | 33 ++++++ src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 2 +- src/input/mpegts/linuxdvb/linuxdvb_private.h | 34 +++++- src/input/mpegts/mpegts_mux_sched.c | 2 + src/input/mpegts/mpegts_network.c | 1 + src/input/mpegts/mpegts_network_dvb.c | 22 +++- src/input/mpegts/satip/satip.c | 11 ++ src/input/mpegts/satip/satip_frontend.c | 2 +- src/input/mpegts/satip/satip_private.h | 13 +++ src/input/mpegts/tvhdhomerun/tvhdhomerun.c | 5 + src/input/mpegts/tvhdhomerun/tvhdhomerun.h | 6 + src/main.c | 3 + src/profile.c | 1 + src/satip/server.c | 2 + src/service.c | 2 + src/service_mapper.c | 1 + src/timeshift.c | 2 + src/tvhlog.c | 1 + src/webui/webui.c | 1 + src/webui/webui.h | 1 + 44 files changed, 302 insertions(+), 47 deletions(-) diff --git a/Makefile b/Makefile index cc0726897..655858b95 100644 --- a/Makefile +++ b/Makefile @@ -293,13 +293,13 @@ SRCS-2 += \ src/parsers/parser_hevc.c \ src/parsers/parser_latm.c \ src/parsers/parser_avc.c \ - src/parsers/parser_teletext.c \ + src/parsers/parser_teletext.c SRCS-2 += \ - src/epggrab/module.c\ - src/epggrab/channel.c\ - src/epggrab/module/pyepg.c\ - src/epggrab/module/xmltv.c\ + src/epggrab/module.c \ + src/epggrab/channel.c \ + src/epggrab/module/pyepg.c \ + src/epggrab/module/xmltv.c SRCS-2 += \ src/plumbing/tsfix.c \ @@ -320,9 +320,10 @@ SRCS-2 += \ src/webui/extjs.c \ src/webui/simpleui.c \ src/webui/statedump.c \ - src/webui/html.c\ - src/webui/webui_api.c\ - src/webui/xmltv.c + src/webui/html.c \ + src/webui/webui_api.c \ + src/webui/xmltv.c \ + src/webui/doc_md.c SRCS-2 += \ src/muxer.c \ diff --git a/src/access.c b/src/access.c index 3899ad9c3..24d100414 100644 --- a/src/access.c +++ b/src/access.c @@ -2099,6 +2099,10 @@ access_init(int createdefault, int noacl) TAILQ_INIT(&passwd_entries); TAILQ_INIT(&ipblock_entries); + idclass_register(&access_entry_class); + idclass_register(&passwd_entry_class); + idclass_register(&ipblock_entry_class); + /* Load ipblock entries */ if ((c = hts_settings_load("ipblock")) != NULL) { HTSMSG_FOREACH(f, c) { diff --git a/src/bouquet.c b/src/bouquet.c index ac359fe79..36cece81f 100644 --- a/src/bouquet.c +++ b/src/bouquet.c @@ -1229,6 +1229,7 @@ bouquet_init(void) bouquet_t *bq; RB_INIT(&bouquets); + idclass_register(&bouquet_class); /* Load */ if ((c = hts_settings_load("bouquet")) != NULL) { diff --git a/src/channels.c b/src/channels.c index a29bcc203..4f2f068cd 100644 --- a/src/channels.c +++ b/src/channels.c @@ -1103,6 +1103,8 @@ channel_init ( void ) RB_INIT(&channels); memoryinfo_register(&channels_memoryinfo); + idclass_register(&channel_class); + idclass_register(&channel_tag_class); /* Tags */ channel_tag_init(); diff --git a/src/config.c b/src/config.c index f130d9c74..518639c98 100644 --- a/src/config.c +++ b/src/config.c @@ -1639,6 +1639,8 @@ config_boot ( const char *path, gid_t gid, uid_t uid ) config_scanfile_ok = 0; config.theme_ui = strdup("blue"); + idclass_register(&config_class); + /* Generate default */ if (!path) { const char *homedir = getenv("HOME"); diff --git a/src/descrambler/caclient.c b/src/descrambler/caclient.c index 32f506cb6..2610f076a 100644 --- a/src/descrambler/caclient.c +++ b/src/descrambler/caclient.c @@ -352,13 +352,18 @@ caclient_init(void) { htsmsg_t *c, *e; htsmsg_field_t *f; + const idclass_t **r; pthread_mutex_init(&caclients_mutex, NULL); TAILQ_INIT(&caclients); + idclass_register(&caclient_class); #if ENABLE_TSDEBUG tsdebugcw_init(); #endif + for (r = caclient_classes; *r; r++) + idclass_register(*r); + if (!(c = hts_settings_load("caclient"))) return; HTSMSG_FOREACH(f, c) { diff --git a/src/dvr/dvr_autorec.c b/src/dvr/dvr_autorec.c index 9af63ab84..b15fe0e06 100644 --- a/src/dvr/dvr_autorec.c +++ b/src/dvr/dvr_autorec.c @@ -1290,6 +1290,7 @@ dvr_autorec_init(void) htsmsg_field_t *f; TAILQ_INIT(&autorec_entries); + idclass_register(&dvr_autorec_entry_class); if((l = hts_settings_load("dvr/autorec")) != NULL) { HTSMSG_FOREACH(f, l) { if((c = htsmsg_get_map_by_field(f)) == NULL) diff --git a/src/dvr/dvr_config.c b/src/dvr/dvr_config.c index 1050439ca..a7c526fb8 100644 --- a/src/dvr/dvr_config.c +++ b/src/dvr/dvr_config.c @@ -1277,6 +1277,7 @@ dvr_config_init(void) /* Default settings */ LIST_INIT(&dvrconfigs); + idclass_register(&dvr_config_class); if ((l = hts_settings_load("dvr/config")) != NULL) { HTSMSG_FOREACH(f, l) { diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 84b1397b1..1980c24e8 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -3514,6 +3514,7 @@ dvr_entry_init(void) dvr_entry_t *de1, *de2; dvr_in_init = 1; + idclass_register(&dvr_entry_class); rere = htsmsg_create_map(); /* load config, but remove parent/child fields */ if((l = hts_settings_load("dvr/log")) != NULL) { diff --git a/src/dvr/dvr_timerec.c b/src/dvr/dvr_timerec.c index 7da367bd9..8ecb966e4 100644 --- a/src/dvr/dvr_timerec.c +++ b/src/dvr/dvr_timerec.c @@ -681,6 +681,7 @@ dvr_timerec_init(void) htsmsg_field_t *f; TAILQ_INIT(&timerec_entries); + idclass_register(&dvr_timerec_entry_class); if((l = hts_settings_load("dvr/timerec")) != NULL) { HTSMSG_FOREACH(f, l) { if((c = htsmsg_get_map_by_field(f)) == NULL) diff --git a/src/epggrab.c b/src/epggrab.c index 38876c87e..f957e3452 100644 --- a/src/epggrab.c +++ b/src/epggrab.c @@ -399,6 +399,12 @@ void epggrab_init ( void ) pthread_mutex_init(&epggrab_mutex, NULL); pthread_cond_init(&epggrab_cond, NULL); + idclass_register(&epggrab_class); + idclass_register(&epggrab_mod_class); + idclass_register(&epggrab_mod_int_class); + idclass_register(&epggrab_mod_ext_class); + idclass_register(&epggrab_mod_ota_class); + epggrab_channel_init(); /* Initialise modules */ diff --git a/src/epggrab/channel.c b/src/epggrab/channel.c index 0123787e7..018c1105b 100644 --- a/src/epggrab/channel.c +++ b/src/epggrab/channel.c @@ -793,6 +793,7 @@ void epggrab_channel_init( void ) { TAILQ_INIT(&epggrab_channel_entries); + idclass_register(&epggrab_channel_class); } void diff --git a/src/epggrab/module.c b/src/epggrab/module.c index b32196d9e..d4af185c7 100644 --- a/src/epggrab/module.c +++ b/src/epggrab/module.c @@ -162,7 +162,7 @@ const idclass_t epggrab_mod_class = { } }; -const idclass_t epggrab_class_mod_int = { +const idclass_t epggrab_mod_int_class = { .ic_super = &epggrab_mod_class, .ic_class = "epggrab_mod_int", .ic_caption = N_("Internal EPG grabber"), @@ -189,7 +189,7 @@ const idclass_t epggrab_class_mod_int = { } }; -const idclass_t epggrab_class_mod_ext = { +const idclass_t epggrab_mod_ext_class = { .ic_super = &epggrab_mod_class, .ic_class = "epggrab_mod_ext", .ic_caption = N_("External EPG grabber"), @@ -207,7 +207,7 @@ const idclass_t epggrab_class_mod_ext = { } }; -const idclass_t epggrab_class_mod_ota = { +const idclass_t epggrab_mod_ota_class = { .ic_super = &epggrab_mod_class, .ic_class = "epggrab_mod_ota", .ic_caption = N_("Over-the-air EPG grabber"), @@ -334,7 +334,7 @@ epggrab_module_int_t *epggrab_module_int_create /* Pass through */ epggrab_module_create((epggrab_module_t*)skel, - cls ?: &epggrab_class_mod_int, + cls ?: &epggrab_mod_int_class, id, saveid, name, priority); /* Int data */ @@ -565,7 +565,7 @@ epggrab_module_ext_t *epggrab_module_ext_create /* Pass through */ hts_settings_buildpath(path, sizeof(path), "epggrab/%s.sock", sockid); epggrab_module_int_create((epggrab_module_int_t*)skel, - &epggrab_class_mod_ext, + &epggrab_mod_ext_class, id, saveid, name, priority, path, NULL, parse, trans); @@ -591,7 +591,7 @@ epggrab_module_ota_t *epggrab_module_ota_create /* Pass through */ epggrab_module_create((epggrab_module_t*)skel, - &epggrab_class_mod_ota, + &epggrab_mod_ota_class, id, saveid, name, priority); /* Setup */ diff --git a/src/epggrab/private.h b/src/epggrab/private.h index 5221801e7..73edc6240 100644 --- a/src/epggrab/private.h +++ b/src/epggrab/private.h @@ -182,6 +182,15 @@ int xmltv_parse_accessibility size_t freesat_huffman_decode ( char *dst, size_t* dstlen, const uint8_t *src, size_t srclen ); +/* ************************************************************************** + * Classes + * *************************************************************************/ + +extern const idclass_t epggrab_mod_class; +extern const idclass_t epggrab_mod_int_class; +extern const idclass_t epggrab_mod_ext_class; +extern const idclass_t epggrab_mod_ota_class; + /* ************************************************************************** * Module setup(s) * *************************************************************************/ diff --git a/src/esfilter.c b/src/esfilter.c index 2915dfe2a..7be72ddf4 100644 --- a/src/esfilter.c +++ b/src/esfilter.c @@ -1187,8 +1187,11 @@ esfilter_init(void) htsmsg_field_t *f; int i; - for (i = 0; i <= ESF_CLASS_LAST; i++) + for (i = 0; i <= ESF_CLASS_LAST; i++) { TAILQ_INIT(&esfilters[i]); + if (esfilter_classes[i]) + idclass_register(esfilter_classes[i]); + } if (!(c = hts_settings_load("esfilter"))) return; diff --git a/src/idnode.c b/src/idnode.c index c7b4fa2b1..53fc03f02 100644 --- a/src/idnode.c +++ b/src/idnode.c @@ -32,7 +32,7 @@ #include "access.h" static const idnodes_rb_t * idnode_domain ( const idclass_t *idc ); -static void idclass_root_register ( idnode_t *in ); +static idnodes_rb_t * idclass_find_domain ( const idclass_t *idc ); typedef struct idclass_link { @@ -137,9 +137,11 @@ idnode_insert(idnode_t *in, const char *uuid, const idclass_t *class, int flags) tvhtrace("idnode", "insert node %s", idnode_uuid_as_str(in, ubuf)); /* Register the class */ - idclass_register(class); // Note: we never actually unregister - idclass_root_register(in); - assert(in->in_domain); + in->in_domain = idclass_find_domain(class); + if (in->in_domain == NULL) { + tvherror("idnode", "classs '%s' is not registered", class->ic_class); + abort(); + } c = RB_INSERT_SORTED(in->in_domain, in, in_domain_link, in_cmp); assert(c == NULL); @@ -1327,39 +1329,52 @@ idclass_get_property_groups (const idclass_t *idc, const char *lang) return NULL; } -void -idclass_register(const idclass_t *idc) +static idnodes_rb_t * +idclass_find_domain(const idclass_t *idc) { - while (idc) { - SKEL_ALLOC(idclasses_skel); - idclasses_skel->idc = idc; - if (RB_INSERT_SORTED(&idclasses, idclasses_skel, link, ic_cmp)) - break; - RB_INIT(&idclasses_skel->nodes); /* not used, but for sure */ - SKEL_USED(idclasses_skel); - tvhtrace("idnode", "register class %s", idc->ic_class); - idc = idc->ic_super; - } + idclass_link_t *r; + idc = idnode_root_class(idc); + SKEL_ALLOC(idclasses_skel); + idclasses_skel->idc = idc; + r = RB_FIND(&idrootclasses, idclasses_skel, link, ic_cmp); + if (r) + return &r->nodes; + return NULL; } static void -idclass_root_register(idnode_t *in) +idclass_root_register(const idclass_t *idc) { - const idclass_t *idc = in->in_class; idclass_link_t *r; - idc = idnode_root_class(idc); SKEL_ALLOC(idclasses_skel); idclasses_skel->idc = idc; r = RB_INSERT_SORTED(&idrootclasses, idclasses_skel, link, ic_cmp); - if (r) { - in->in_domain = &r->nodes; - return; - } + if (r) return; RB_INIT(&idclasses_skel->nodes); r = idclasses_skel; SKEL_USED(idclasses_skel); tvhtrace("idnode", "register root class %s", idc->ic_class); - in->in_domain = &r->nodes; +} + +void +idclass_register(const idclass_t *idc) +{ + const idclass_t *prev = NULL; + while (idc) { + SKEL_ALLOC(idclasses_skel); + idclasses_skel->idc = idc; + if (RB_INSERT_SORTED(&idclasses, idclasses_skel, link, ic_cmp)) { + prev = NULL; + break; + } + RB_INIT(&idclasses_skel->nodes); /* not used, but for sure */ + SKEL_USED(idclasses_skel); + tvhtrace("idnode", "register class %s", idc->ic_class); + prev = idc; + idc = idc->ic_super; + } + if (prev) + idclass_root_register(prev); } const idclass_t * @@ -1374,6 +1389,53 @@ idclass_find ( const char *class ) return t ? t->idc : NULL; } +idclass_t const ** +idclass_find_all(void) +{ + idclass_link_t *l; + idclass_t const **ret; + int i = 0, count = 0; + RB_FOREACH(l, &idclasses, link) + count++; + if (count == 0) + return NULL; + ret = calloc(count + 1, sizeof(idclass_t *)); + RB_FOREACH(l, &idclasses, link) + ret[i++] = l->idc; + ret[i] = NULL; + return ret; +} + +idclass_t const ** +idclass_find_children(const char *clazz) +{ + const idclass_t *ic = idclass_find(clazz), *root; + idclass_link_t *l; + idclass_t const **ret; + int i, count; + + if (ic == NULL) + return NULL; + root = idnode_root_class(ic); + if (root == NULL) + return NULL; + ret = NULL; + count = i = 0; + RB_FOREACH(l, &idclasses, link) { + if (root == idnode_root_class(l->idc)) { + if (i <= count) { + count += 50; + ret = realloc(ret, count * sizeof(const idclass_t *)); + } + ret[i++] = ic; + } + } + if (i <= count) + ret = realloc(ret, (count + 1) * sizeof(const idclass_t *)); + ret[i] = NULL; + return ret; +} + /* * Just get the class definition */ diff --git a/src/idnode.h b/src/idnode.h index f859fbb92..13b4a2267 100644 --- a/src/idnode.h +++ b/src/idnode.h @@ -221,6 +221,8 @@ void idnode_notify_title_changed (void *in, const char *lang); void idclass_register ( const idclass_t *idc ); const idclass_t *idclass_find ( const char *name ); +idclass_t const **idclass_find_all(void); +idclass_t const **idclass_find_children(const char *name); const char *idclass_get_caption ( const idclass_t *idc, const char *lang ); htsmsg_t *idclass_serialize0 (const idclass_t *idc, htsmsg_t *list, int optmask, const char *lang); htsmsg_t *idnode_serialize0 (idnode_t *self, htsmsg_t *list, int optmask, const char *lang); diff --git a/src/imagecache.c b/src/imagecache.c index acb94ca9c..cf9fff570 100644 --- a/src/imagecache.c +++ b/src/imagecache.c @@ -410,6 +410,8 @@ imagecache_init ( void ) imagecache_conf.ignore_sslcert = 0; #endif + idclass_register(&imagecache_class); + /* Create threads */ #if ENABLE_IMAGECACHE tvh_cond_init(&imagecache_cond); diff --git a/src/input.c b/src/input.c index f93cdcaec..7774c3454 100644 --- a/src/input.c +++ b/src/input.c @@ -37,6 +37,16 @@ const idclass_t tvh_input_instance_class = .ic_perm_def = ACCESS_ADMIN }; +/* + * + */ +void +tvh_hardware_init ( void ) +{ + idclass_register(&tvh_input_class); + idclass_register(&tvh_input_instance_class); +} + /* * Create entry */ diff --git a/src/input.h b/src/input.h index 1ae6236dc..595980f98 100644 --- a/src/input.h +++ b/src/input.h @@ -116,6 +116,8 @@ struct tvh_hardware { LIST_ENTRY(tvh_hardware) th_link; }; +void tvh_hardware_init(void); + void *tvh_hardware_create0 ( void *o, const idclass_t *idc, const char *uuid, htsmsg_t *conf ); void tvh_hardware_delete ( tvh_hardware_t *th ); @@ -136,8 +138,6 @@ tvh_hardware_list_t tvh_hardware; * Methods */ -void input_init ( void ); - htsmsg_t * tvh_input_stream_create_msg ( tvh_input_stream_t *st ); void tvh_input_stream_destroy ( tvh_input_stream_t *st ); diff --git a/src/input/mpegts.c b/src/input/mpegts.c index 95e77d910..3d7687593 100644 --- a/src/input/mpegts.c +++ b/src/input/mpegts.c @@ -26,7 +26,9 @@ mpegts_init ( int linuxdvb_mask, int nosatip, str_list_t *satip_client, /* Register classes (avoid API 400 errors due to not yet defined) */ idclass_register(&mpegts_network_class); idclass_register(&mpegts_mux_class); + idclass_register(&mpegts_mux_instance_class); idclass_register(&mpegts_service_class); + idclass_register(&mpegts_service_raw_class); /* FastScan init */ dvb_fastscan_init(); diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 0e37a2386..f6426f62a 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -64,7 +64,9 @@ typedef TAILQ_HEAD(mpegts_table_feed_queue, mpegts_table_feed) /* Classes */ extern const idclass_t mpegts_network_class; extern const idclass_t mpegts_mux_class; +extern const idclass_t mpegts_mux_instance_class; extern const idclass_t mpegts_service_class; +extern const idclass_t mpegts_service_raw_class; extern const idclass_t mpegts_input_class; /* ************************************************************************** diff --git a/src/input/mpegts/iptv/iptv.c b/src/input/mpegts/iptv/iptv.c index 19182c332..466376992 100644 --- a/src/input/mpegts/iptv/iptv.c +++ b/src/input/mpegts/iptv/iptv.c @@ -982,6 +982,9 @@ iptv_network_init ( void ) htsmsg_t *c, *e; htsmsg_field_t *f; + /* Register muxes */ + idclass_register(&iptv_mux_class); + /* Register builders */ mpegts_network_register_builder(&iptv_network_class, iptv_network_builder); diff --git a/src/input/mpegts/iptv/iptv_private.h b/src/input/mpegts/iptv/iptv_private.h index f0d96edf9..d2c5a61c8 100644 --- a/src/input/mpegts/iptv/iptv_private.h +++ b/src/input/mpegts/iptv/iptv_private.h @@ -174,6 +174,7 @@ iptv_service_t *iptv_service_create0 extern const idclass_t iptv_network_class; extern const idclass_t iptv_auto_network_class; +extern const idclass_t iptv_mux_class; extern iptv_input_t *iptv_input; extern iptv_network_t *iptv_network; diff --git a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c index e55297b59..409618ad3 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c @@ -597,6 +597,39 @@ linuxdvb_adapter_init ( void ) { force_dvbs = getenv("TVHEADEND_DEBUG_FORCE_DVBS") != NULL; + idclass_register(&linuxdvb_adapter_class); + + idclass_register(&linuxdvb_frontend_dvbt_class); + idclass_register(&linuxdvb_frontend_dvbs_class); + idclass_register(&linuxdvb_frontend_dvbs_slave_class); + idclass_register(&linuxdvb_frontend_dvbc_class); + idclass_register(&linuxdvb_frontend_atsc_t_class); + idclass_register(&linuxdvb_frontend_atsc_c_class); + idclass_register(&linuxdvb_frontend_isdb_t_class); + idclass_register(&linuxdvb_frontend_isdb_c_class); + idclass_register(&linuxdvb_frontend_isdb_s_class); + idclass_register(&linuxdvb_frontend_dab_class); + + idclass_register(&linuxdvb_lnb_class); + idclass_register(&linuxdvb_rotor_class); + idclass_register(&linuxdvb_rotor_gotox_class); + idclass_register(&linuxdvb_rotor_usals_class); + idclass_register(&linuxdvb_en50494_class); + idclass_register(&linuxdvb_switch_class); + idclass_register(&linuxdvb_diseqc_class); + + idclass_register(&linuxdvb_satconf_class); + idclass_register(&linuxdvb_satconf_lnbonly_class); + idclass_register(&linuxdvb_satconf_2port_class); + idclass_register(&linuxdvb_satconf_4port_class); + idclass_register(&linuxdvb_satconf_en50494_class); + idclass_register(&linuxdvb_satconf_advanced_class); + idclass_register(&linuxdvb_satconf_ele_class); + +#if ENABLE_LINUXDVB_CA + idclass_register(&linuxdvb_ca_class); +#endif + /* Install monitor on /dev */ (void)fsmonitor_add("/dev", &devmon); diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index eebc25d1f..18b1b6c4a 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -298,7 +298,7 @@ const idclass_t linuxdvb_frontend_dvbs_class = const idclass_t linuxdvb_frontend_dvbs_slave_class = { .ic_super = &linuxdvb_frontend_class, - .ic_class = "linuxdvb_frontend_dvbs", + .ic_class = "linuxdvb_frontend_dvbs_slave", .ic_caption = N_("Linux DVB-S slave frontend"), .ic_properties = (const property_t[]){ { diff --git a/src/input/mpegts/linuxdvb/linuxdvb_private.h b/src/input/mpegts/linuxdvb/linuxdvb_private.h index 276b3f964..d9d1e37c8 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_private.h +++ b/src/input/mpegts/linuxdvb/linuxdvb_private.h @@ -68,8 +68,6 @@ typedef TAILQ_HEAD(linuxdvb_satconf_ele_list,linuxdvb_satconf_ele) linuxdvb_satc typedef TAILQ_HEAD(linuxdvb_ca_capmt_queue,linuxdvb_ca_capmt) linuxdvb_ca_capmt_queue_t; #endif -extern const idclass_t linuxdvb_adapter_class; - struct linuxdvb_adapter { tvh_hardware_t; @@ -345,6 +343,38 @@ struct linuxdvb_en50494 uint32_t le_tune_freq; /* the real frequency to tune to */ }; +/* + * Classes + */ + +extern const idclass_t linuxdvb_adapter_class; +extern const idclass_t linuxdvb_frontend_dvbt_class; +extern const idclass_t linuxdvb_frontend_dvbs_class; +extern const idclass_t linuxdvb_frontend_dvbs_slave_class; +extern const idclass_t linuxdvb_frontend_dvbc_class; +extern const idclass_t linuxdvb_frontend_atsc_t_class; +extern const idclass_t linuxdvb_frontend_atsc_c_class; +extern const idclass_t linuxdvb_frontend_isdb_t_class; +extern const idclass_t linuxdvb_frontend_isdb_c_class; +extern const idclass_t linuxdvb_frontend_isdb_s_class; +extern const idclass_t linuxdvb_frontend_dab_class; + +extern const idclass_t linuxdvb_lnb_class; +extern const idclass_t linuxdvb_rotor_class; +extern const idclass_t linuxdvb_rotor_gotox_class; +extern const idclass_t linuxdvb_rotor_usals_class; +extern const idclass_t linuxdvb_en50494_class; +extern const idclass_t linuxdvb_switch_class; +extern const idclass_t linuxdvb_diseqc_class; + +extern const idclass_t linuxdvb_satconf_class; +extern const idclass_t linuxdvb_satconf_lnbonly_class; +extern const idclass_t linuxdvb_satconf_2port_class; +extern const idclass_t linuxdvb_satconf_4port_class; +extern const idclass_t linuxdvb_satconf_en50494_class; +extern const idclass_t linuxdvb_satconf_advanced_class; +extern const idclass_t linuxdvb_satconf_ele_class; + /* * Methods */ diff --git a/src/input/mpegts/mpegts_mux_sched.c b/src/input/mpegts/mpegts_mux_sched.c index 756ec9a63..e310e3f88 100644 --- a/src/input/mpegts/mpegts_mux_sched.c +++ b/src/input/mpegts/mpegts_mux_sched.c @@ -332,6 +332,8 @@ mpegts_mux_sched_init ( void ) htsmsg_t *c, *e; htsmsg_field_t *f; + idclass_register(&mpegts_mux_sched_class); + /* Load settings */ if ((c = hts_settings_load_r(1, "muxsched"))) { HTSMSG_FOREACH(f, c) { diff --git a/src/input/mpegts/mpegts_network.c b/src/input/mpegts/mpegts_network.c index 299eca1e6..6b556c396 100644 --- a/src/input/mpegts/mpegts_network.c +++ b/src/input/mpegts/mpegts_network.c @@ -582,6 +582,7 @@ mpegts_network_register_builder mnb->idc = idc; mnb->build = build; LIST_INSERT_HEAD(&mpegts_network_builders, mnb, link); + idclass_register(idc); } void diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index 47fa55842..6aeef5531 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -823,7 +823,7 @@ dvb_network_builder return (mpegts_network_t*)dvb_network_create0(NULL, idc, conf); } -static const idclass_t* dvb_network_classes[] = { +static const idclass_t * dvb_network_classes[] = { &dvb_network_dvbt_class, &dvb_network_dvbc_class, &dvb_network_dvbs_class, @@ -833,7 +833,21 @@ static const idclass_t* dvb_network_classes[] = { &dvb_network_isdb_c_class, &dvb_network_isdb_s_class, #if 0 /* TODO: write DAB stream parser */ - &dvb_network_dab_class + &dvb_network_dab_class, +#endif +}; + +static const idclass_t * dvb_mux_classes[] = { + &dvb_network_dvbt_class, + &dvb_network_dvbc_class, + &dvb_network_dvbs_class, + &dvb_network_atsc_t_class, + &dvb_network_atsc_c_class, + &dvb_network_isdb_t_class, + &dvb_network_isdb_c_class, + &dvb_network_isdb_s_class, +#if 0 /* TODO: write DAB stream parser */ + &dvb_network_dab_class, #endif }; @@ -847,6 +861,10 @@ void dvb_network_init ( void ) /* Load list of mux charset global overrides */ dvb_charset_init(); + /* Register mux classes */ + for (i = 0; i < ARRAY_SIZE(dvb_mux_classes); i++) + idclass_register(dvb_mux_classes[i]); + /* Register class builders */ for (i = 0; i < ARRAY_SIZE(dvb_network_classes); i++) mpegts_network_register_builder(dvb_network_classes[i], diff --git a/src/input/mpegts/satip/satip.c b/src/input/mpegts/satip/satip.c index b90b994d6..a9d19ebfa 100644 --- a/src/input/mpegts/satip/satip.c +++ b/src/input/mpegts/satip/satip.c @@ -1273,6 +1273,17 @@ satip_device_discovery_start( void ) void satip_init ( int nosatip, str_list_t *clients ) { + idclass_register(&satip_device_class); + + idclass_register(&satip_frontend_class); + idclass_register(&satip_frontend_dvbt_class); + idclass_register(&satip_frontend_dvbs_class); + idclass_register(&satip_frontend_dvbs_slave_class); + idclass_register(&satip_frontend_atsc_t_class); + idclass_register(&satip_frontend_atsc_c_class); + + idclass_register(&satip_satconf_class); + satip_enabled = !nosatip; TAILQ_INIT(&satip_discoveries); satip_static_clients = clients; diff --git a/src/input/mpegts/satip/satip_frontend.c b/src/input/mpegts/satip/satip_frontend.c index dab617c94..c2e5da158 100644 --- a/src/input/mpegts/satip/satip_frontend.c +++ b/src/input/mpegts/satip/satip_frontend.c @@ -357,7 +357,7 @@ const idclass_t satip_frontend_dvbs_class = const idclass_t satip_frontend_dvbs_slave_class = { .ic_super = &satip_frontend_class, - .ic_class = "satip_frontend_dvbs", + .ic_class = "satip_frontend_dvbs_slave", .ic_caption = N_("SAT>IP DVB-S slave frontend"), .ic_properties = (const property_t[]){ { diff --git a/src/input/mpegts/satip/satip_private.h b/src/input/mpegts/satip/satip_private.h index 6802076bc..dd58c9d79 100644 --- a/src/input/mpegts/satip/satip_private.h +++ b/src/input/mpegts/satip/satip_private.h @@ -195,6 +195,19 @@ struct satip_satconf idnode_set_t *sfc_networks; }; +/* + * Classes + */ +extern const idclass_t satip_frontend_class; + +extern const idclass_t satip_frontend_dvbt_class; +extern const idclass_t satip_frontend_dvbs_class; +extern const idclass_t satip_frontend_dvbs_slave_class; +extern const idclass_t satip_frontend_atsc_t_class; +extern const idclass_t satip_frontend_atsc_c_class; + +extern const idclass_t satip_satconf_class; + /* * Methods */ diff --git a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c index 153e2ecbf..48b946ac4 100644 --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c @@ -399,6 +399,11 @@ void tvhdhomerun_init ( void ) hdhomerun_debug_set_filename(hdhomerun_debug_obj, s); hdhomerun_debug_enable(hdhomerun_debug_obj); } + idclass_register(&tvhdhomerun_device_class); + idclass_register(&tvhdhomerun_frontend_dvbt_class); + idclass_register(&tvhdhomerun_frontend_dvbc_class); + idclass_register(&tvhdhomerun_frontend_atsc_t_class); + idclass_register(&tvhdhomerun_frontend_atsc_c_class); TAILQ_INIT(&tvhdhomerun_discoveries); pthread_mutex_init(&tvhdhomerun_discovery_lock, NULL); tvh_cond_init(&tvhdhomerun_discovery_cond); diff --git a/src/input/mpegts/tvhdhomerun/tvhdhomerun.h b/src/input/mpegts/tvhdhomerun/tvhdhomerun.h index 4aed37b62..bbec1bcfc 100644 --- a/src/input/mpegts/tvhdhomerun/tvhdhomerun.h +++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun.h @@ -20,6 +20,12 @@ #ifndef __TVH_tvhdhomerun_H__ #define __TVH_tvhdhomerun_H__ +extern const idclass_t tvhdhomerun_device_class; +extern const idclass_t tvhdhomerun_frontend_dvbt_class; +extern const idclass_t tvhdhomerun_frontend_dvbc_class; +extern const idclass_t tvhdhomerun_frontend_atsc_t_class; +extern const idclass_t tvhdhomerun_frontend_atsc_c_class; + void tvhdhomerun_init( void ); void tvhdhomerun_done( void ); diff --git a/src/main.c b/src/main.c index 5164a717e..4d1e3c71e 100644 --- a/src/main.c +++ b/src/main.c @@ -1134,6 +1134,7 @@ main(int argc, char **argv) config_init(opt_nobackup == 0); /* Memoryinfo */ + idclass_register(&memoryinfo_class); memoryinfo_register(&tasklet_memoryinfo); #if ENABLE_SLOW_MEMORYINFO memoryinfo_register(&htsmsg_memoryinfo); @@ -1152,6 +1153,8 @@ main(int argc, char **argv) tvhthread_create(&mtimer_tick_tid, NULL, mtimer_tick_thread, NULL, "mtick"); tvhthread_create(&tasklet_tid, NULL, tasklet_thread, NULL, "tasklet"); + tvh_hardware_init(); + dbus_server_init(opt_dbus, opt_dbus_session); intlconv_init(); diff --git a/src/profile.c b/src/profile.c index afbcbc275..f3886b4e9 100644 --- a/src/profile.c +++ b/src/profile.c @@ -49,6 +49,7 @@ void profile_register(const idclass_t *clazz, profile_builder_t builder) { profile_build_t *pb = calloc(1, sizeof(*pb)), *pb2; + idclass_register(clazz); pb->clazz = clazz; pb->build = builder; pb2 = LIST_FIRST(&profile_builders); diff --git a/src/satip/server.c b/src/satip/server.c index 090ce4a16..a70c267c8 100644 --- a/src/satip/server.c +++ b/src/satip/server.c @@ -779,6 +779,8 @@ void satip_server_init(int rtsp_port) int descramble, rewrite_pmt, muxcnf; char *nat_ip; + idclass_register(&satip_server_class); + http_server_ip = NULL; satip_server_bootid = time(NULL); satip_server_conf.satip_deviceid = 1; diff --git a/src/service.c b/src/service.c index f8557a2d4..e53a81af4 100644 --- a/src/service.c +++ b/src/service.c @@ -1526,6 +1526,8 @@ service_init(void) TAILQ_INIT(&service_all); TAILQ_INIT(&service_raw_all); TAILQ_INIT(&service_raw_remove); + idclass_register(&service_class); + idclass_register(&service_raw_class); pthread_mutex_init(&pending_save_mutex, NULL); tvh_cond_init(&pending_save_cond); tvhthread_create(&service_saver_tid, NULL, service_saver, NULL, "service"); diff --git a/src/service_mapper.c b/src/service_mapper.c index d04fc53de..72147f820 100644 --- a/src/service_mapper.c +++ b/src/service_mapper.c @@ -557,6 +557,7 @@ void service_mapper_init ( void ) htsmsg_t *m; TAILQ_INIT(&service_mapper_queue); + idclass_register(&service_mapper_conf_class); tvh_cond_init(&service_mapper_cond); tvhthread_create(&service_mapper_tid, NULL, service_mapper_thread, NULL, "svcmap"); diff --git a/src/timeshift.c b/src/timeshift.c index 72387bd37..0bf2b8e60 100644 --- a/src/timeshift.c +++ b/src/timeshift.c @@ -83,6 +83,8 @@ void timeshift_init ( void ) timeshift_conf.max_period = 60; // Hr (60mins) timeshift_conf.max_size = 10000 * (size_t)1048576; // 10G + idclass_register(×hift_conf_class); + /* Load settings */ if ((m = hts_settings_load("timeshift/config"))) { idnode_load(×hift_conf.idnode, m); diff --git a/src/tvhlog.c b/src/tvhlog.c index c8d2b6cbc..784097680 100644 --- a/src/tvhlog.c +++ b/src/tvhlog.c @@ -443,6 +443,7 @@ tvhlog_init ( int level, int options, const char *path ) void tvhlog_start ( void ) { + idclass_register(&tvhlog_conf_class); tvhthread_create(&tvhlog_tid, NULL, tvhlog_thread, NULL, "log"); } diff --git a/src/webui/webui.c b/src/webui/webui.c index c35bd2b38..46d2aaa93 100644 --- a/src/webui/webui.c +++ b/src/webui/webui.c @@ -1864,6 +1864,7 @@ webui_init(int xspf) http_path_add("/favicon.ico", NULL, favicon, ACCESS_WEB_INTERFACE); http_path_add("/playlist", NULL, page_http_playlist, ACCESS_ANONYMOUS); http_path_add("/xmltv", NULL, page_xmltv, ACCESS_ANONYMOUS); + http_path_add("/markdown", NULL, page_markdown, ACCESS_ANONYMOUS); http_path_add("/state", NULL, page_statedump, ACCESS_ADMIN); diff --git a/src/webui/webui.h b/src/webui/webui.h index 2aae83501..fac1b9733 100644 --- a/src/webui/webui.h +++ b/src/webui/webui.h @@ -35,6 +35,7 @@ const char* html_escape(char *dst, const char *src, size_t len); int page_static_file(http_connection_t *hc, const char *remain, void *opaque); int page_xmltv(http_connection_t *hc, const char *remain, void *opaque); +int page_markdown(http_connection_t *hc, const char *remain, void *opaque); #if ENABLE_LINUXDVB void extjs_start_dvb(void); -- 2.47.3