]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
service: add PMT# for noname services and include full service name in service lists
authorJaroslav Kysela <perex@perex.cz>
Thu, 31 Jul 2014 19:08:18 +0000 (21:08 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 31 Jul 2014 19:11:18 +0000 (21:11 +0200)
src/service.c
src/service.h

index e18459851aa8d1277de741ca233a297226fdd54d..532bf0daa613fab4f24acc090bb505db0046fdcd 100644 (file)
@@ -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
  */
index 54b7f9ff4ce2bf7c49329d2dee6a9c4f51ad423c..2361eead91257db09a455f2f3a7365361fbaaa35 100644 (file)
@@ -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__