From 43253f88c0ab082acc08ceed6d60e3343a42f8a7 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 31 Jul 2014 21:08:18 +0200 Subject: [PATCH] service: add PMT# for noname services and include full service name in service lists --- src/service.c | 49 +++++++++++++++++++++++++++++++++++++++++++++---- src/service.h | 2 ++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/service.c b/src/service.c index e1845985..532bf0da 100644 --- a/src/service.c +++ b/src/service.c @@ -128,7 +128,7 @@ service_class_channel_enum static const char * service_class_get_title ( idnode_t *self ) { - return service_get_channel_name((service_t*)self); + return service_get_full_channel_name((service_t *)self); } static const void * @@ -856,25 +856,39 @@ service_stream_make_nicename(service_t *t, elementary_stream_t *st) void service_make_nicename(service_t *t) { - char buf[256]; + char buf[256], buf2[16]; source_info_t si; elementary_stream_t *st; + char *service_name; + int prefidx; lock_assert(&t->s_stream_mutex); t->s_setsourceinfo(t, &si); + service_name = si.si_service; + if (service_name == NULL || si.si_service[0] == '0') { + snprintf(buf2, sizeof(buf2), "{PMT:%d}", t->s_pmt_pid); + service_name = buf2; + } + snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s", si.si_adapter ?: "", si.si_adapter && si.si_network ? "/" : "", si.si_network ?: "", si.si_network && si.si_mux ? "/" : "", - si.si_mux ?: "", si.si_mux && si.si_service ? "/" : "", - si.si_service ?: ""); + si.si_mux ?: "", si.si_mux && service_name ? "/" : "", + service_name ?: ""); + prefidx = (si.si_adapter ? strlen(si.si_adapter) : 0) + + (si.si_adapter && si.si_network ? 1 : 0) + + (si.si_network ? strlen(si.si_network) : 0) + + (si.si_network && si.si_mux ? 1 : 0) + + (si.si_mux ? strlen(si.si_mux) : 0); service_source_info_free(&si); free(t->s_nicename); t->s_nicename = strdup(buf); + t->s_nicename_prefidx = prefidx; TAILQ_FOREACH(st, &t->s_components, es_link) service_stream_make_nicename(t, st); @@ -1482,6 +1496,33 @@ service_get_channel_name ( service_t *s ) return r; } +/* + * Get full name for channel from service + */ +const char * +service_get_full_channel_name ( service_t *s ) +{ + static char __thread buf[256]; + const char *r = NULL; + int len; + + if (s->s_channel_name) + r = s->s_channel_name(s); + if (r == NULL) + return s->s_nicename; + + len = s->s_nicename_prefidx; + if (len >= sizeof(buf)) + len = sizeof(buf) - 1; + strncpy(buf, s->s_nicename, len); + if (len < sizeof(buf) - 1) + buf[len++] = '/'; + buf[len] = '\0'; + if (len < sizeof(buf)) + snprintf(buf + len, sizeof(buf) - len, "%s", r); + return buf; +} + /* * Get number for service */ diff --git a/src/service.h b/src/service.h index 54b7f9ff..2361eead 100644 --- a/src/service.h +++ b/src/service.h @@ -300,6 +300,7 @@ typedef struct service { * Name usable for displaying to user */ char *s_nicename; + int s_nicename_prefidx; /** * Teletext... @@ -553,6 +554,7 @@ void service_save ( service_t *s, htsmsg_t *c ); void sort_elementary_streams(service_t *t); const char *service_get_channel_name (service_t *s); +const char *service_get_full_channel_name (service_t *s); int service_get_channel_number (service_t *s); #endif // SERVICE_H__