]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
[PR-155] Change dvb charset to allow proper overriding.
authorJacek Tomasiak <jacek.tomasiak@gmail.com>
Sun, 30 Sep 2012 17:11:06 +0000 (19:11 +0200)
committerAdam Sutton <dev@adamsutton.me.uk>
Tue, 9 Oct 2012 10:48:24 +0000 (11:48 +0100)
dvb_charset field (in service UI config) now overrides any DVB provided
values rather than simply acting as a default for where values are not
specified.

This helps fix problems both where providers fail to specify the charset
(and ISO6937 is not used) and also where the simply specify the wrong
charset entirely.

src/dvb/dvb_multiplex.c
src/dvb/dvb_support.c
src/dvb/dvb_support.h
src/dvb/dvb_transport.c
src/epggrab/module/eit.c
src/service.c
src/service.h
src/webui/extjs.c
src/webui/static/app/dvb.js

index 9358443ff0c551c644b5ebf98da639e8afd92233..64ea79456dcbe44ac41a4cd75a9e8a80c2fb9311 100644 (file)
@@ -1177,8 +1177,8 @@ dvb_mux_copy(th_dvb_adapter_t *dst, th_dvb_mux_instance_t *tdmi_src,
     if(t_src->s_svcname != NULL)
       t_dst->s_svcname = strdup(t_src->s_svcname);
 
-    if(t_src->s_dvb_default_charset != NULL)
-      t_dst->s_dvb_default_charset = strdup(t_src->s_dvb_default_charset);
+    if(t_src->s_dvb_charset != NULL)
+      t_dst->s_dvb_charset = strdup(t_src->s_dvb_charset);
 
     if(t_src->s_ch != NULL)
       service_map_channel(t_dst, t_src->s_ch, 0);
index e1066c0c8ba65993969cd70d1b4b5824669b1045..73b7c4b78e3779831c909ab00a095c9fbee9a371 100644 (file)
@@ -202,7 +202,7 @@ static inline size_t dvb_convert(int conv,
  */
 
 int
-dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char *dvb_default_charset, dvb_string_conv_t *conv)
+dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char *dvb_charset, dvb_string_conv_t *conv)
 {
   int ic;
   size_t len, outlen;
@@ -220,6 +220,7 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char
     conv++;
   }
 
+  // automatic charset detection
   switch(src[0]) {
   case 0:
     return -1;
@@ -250,16 +251,17 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char
     return -1;
 
   default:
-    if (dvb_default_charset != NULL && sscanf(dvb_default_charset, "ISO8859-%d", &i) > 0) {
-      if (i > 0 && i < 16) {
-        ic = convert_iso_8859[i];
-      } else {
-        ic = convert_iso6937;
-      }
+    ic = convert_iso6937;
+    break;
+  }
+
+  // manual charset override
+  if (dvb_charset != NULL && dvb_charset[0] != 0) {
+    if (sscanf(dvb_charset, "ISO8859-%d", &i) > 0 && i > 0 && i < 16) {
+      ic = convert_iso_8859[i];
     } else {
       ic = convert_iso6937;
     }
-    break;
   }
 
   if(srclen < 1) {
@@ -284,7 +286,7 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char
 
 int
 dvb_get_string_with_len(char *dst, size_t dstlen, 
-                       const uint8_t *buf, size_t buflen, char *dvb_default_charset,
+                       const uint8_t *buf, size_t buflen, char *dvb_charset,
       dvb_string_conv_t *conv)
 {
   int l = buf[0];
@@ -292,7 +294,7 @@ dvb_get_string_with_len(char *dst, size_t dstlen,
   if(l + 1 > buflen)
     return -1;
 
-  if(dvb_get_string(dst, dstlen, buf + 1, l, dvb_default_charset, conv))
+  if(dvb_get_string(dst, dstlen, buf + 1, l, dvb_charset, conv))
     return -1;
 
   return l + 1;
index f138f388c037fafb3f04dc4a4580578c5c5b3259..f4726cdab39e84da4f265cba0977fbb261865fd1 100644 (file)
@@ -62,11 +62,11 @@ typedef struct dvb_string_conv
 } dvb_string_conv_t;
 
 int dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, 
-                  const size_t srclen, char *dvb_default_charset,
+                  const size_t srclen, char *dvb_charset,
        dvb_string_conv_t *conv);
 
 int dvb_get_string_with_len(char *dst, size_t dstlen, 
-                           const uint8_t *buf, size_t buflen, char *dvb_default_charset,
+                           const uint8_t *buf, size_t buflen, char *dvb_charset,
           dvb_string_conv_t *conv);
 
 #define bcdtoint(i) ((((i & 0xf0) >> 4) * 10) + (i & 0x0f))
index 6499d3cda5e244f5a7a103757810eb0e1867ef09..cf27b231f162fd3467a015ae7c95c228ae978297 100644 (file)
@@ -237,8 +237,8 @@ dvb_transport_load(th_dvb_mux_instance_t *tdmi)
     psi_load_service_settings(c, t);
     pthread_mutex_unlock(&t->s_stream_mutex);
 
-    s = htsmsg_get_str(c, "dvb_default_charset");
-    t->s_dvb_default_charset = s ? strdup(s) : NULL;
+    s = htsmsg_get_str(c, "dvb_charset");
+    t->s_dvb_charset = s ? strdup(s) : NULL;
 
     s = htsmsg_get_str(c, "default_authority");
     t->s_default_authority = s ? strdup(s) : NULL;
@@ -284,8 +284,8 @@ dvb_transport_save(service_t *t)
     htsmsg_add_u32(m, "mapped", 1);
   }
 
-  if(t->s_dvb_default_charset != NULL)
-    htsmsg_add_str(m, "dvb_default_charset", t->s_dvb_default_charset);
+  if(t->s_dvb_charset != NULL)
+    htsmsg_add_str(m, "dvb_charset", t->s_dvb_charset);
   
   htsmsg_add_u32(m, "dvb_eit_enable", t->s_dvb_eit_enable);
 
@@ -459,8 +459,8 @@ dvb_transport_build_msg(service_t *t)
   if(t->s_ch != NULL)
     htsmsg_add_str(m, "channelname", t->s_ch->ch_name);
 
-  if(t->s_dvb_default_charset != NULL)
-    htsmsg_add_str(m, "dvb_default_charset", t->s_dvb_default_charset);
+  if(t->s_dvb_charset != NULL)
+    htsmsg_add_str(m, "dvb_charset", t->s_dvb_charset);
 
   htsmsg_add_u32(m, "dvb_eit_enable", t->s_dvb_eit_enable);
 
index 12b52b0cb7df4b6d2c8b8fd741b8be73a8dca041..792b9671248d6251ddc5372ac118cb4f3e4900a9 100644 (file)
@@ -534,7 +534,7 @@ static int _eit_process_event
 
   /* Process tags */
   memset(&ev, 0, sizeof(ev));
-  ev.default_charset = svc->s_dvb_default_charset;
+  ev.default_charset = svc->s_dvb_charset;
   while (dllen > 2) {
     int r;
     dtag = ptr[0];
index 52936d66f17b0d1c8c7d8d00e83f3b003689854c..f9224eb8db98064147783e35caad97ac4b785aa0 100644 (file)
@@ -485,7 +485,7 @@ service_destroy(service_t *t)
   free(t->s_identifier);
   free(t->s_svcname);
   free(t->s_provider);
-  free(t->s_dvb_default_charset);
+  free(t->s_dvb_charset);
 
   while((st = TAILQ_FIRST(&t->s_components)) != NULL) {
     TAILQ_REMOVE(&t->s_components, st, es_link);
@@ -524,7 +524,7 @@ service_create(const char *identifier, int type, int source_type)
   t->s_refcount = 1;
   t->s_enabled = 1;
   t->s_pcr_last = PTS_UNSET;
-  t->s_dvb_default_charset = NULL;
+  t->s_dvb_charset = NULL;
   t->s_dvb_eit_enable = 1;
   TAILQ_INIT(&t->s_components);
 
@@ -702,15 +702,15 @@ service_map_channel(service_t *t, channel_t *ch, int save)
  *
  */
 void
-service_set_dvb_default_charset(service_t *t, const char *dvb_default_charset)
+service_set_dvb_charset(service_t *t, const char *dvb_charset)
 {
   lock_assert(&global_lock);
 
-  if(t->s_dvb_default_charset != NULL && !strcmp(t->s_dvb_default_charset, dvb_default_charset))
+  if(t->s_dvb_charset != NULL && !strcmp(t->s_dvb_charset, dvb_charset))
     return;
 
-  free(t->s_dvb_default_charset);
-  t->s_dvb_default_charset = strdup(dvb_default_charset);
+  free(t->s_dvb_charset);
+  t->s_dvb_charset = strdup(dvb_charset);
   t->s_config_save(t);
 }
 
index 81af62086fa7262a4f58a0421e8eb2e0e0956645..692157d7b142e2c2d09cf319b696cbf249222497 100644 (file)
@@ -492,7 +492,7 @@ typedef struct service {
    * DVB default charset
    *   used to overide the default ISO6937 per service
    */
-  char *s_dvb_default_charset;
+  char *s_dvb_charset;
 
   /**
    * Set if EIT grab is enabled for DVB service (the default).
@@ -584,7 +584,7 @@ int tss2errcode(int tss);
 
 uint16_t service_get_encryption(service_t *t);
 
-void service_set_dvb_default_charset(service_t *t, const char *dvb_default_charset);
+void service_set_dvb_charset(service_t *t, const char *dvb_charset);
 
 void service_set_dvb_eit_enable(service_t *t, int dvb_eit_enable);
 
index 2832c155acac29d5fa0abd0fc26d15df0d4e74c8..cf318fc5db3423cd5878f6a509dba771ea8bfb0d 100644 (file)
@@ -1415,7 +1415,7 @@ service_update(htsmsg_t *in)
   uint32_t u32;
   const char *id;
   const char *chname;
-  const char *dvb_default_charset;
+  const char *dvb_charset;
 
   TAILQ_FOREACH(f, &in->hm_fields, hmf_link) {
     if((c = htsmsg_get_map_by_field(f)) == NULL ||
@@ -1431,8 +1431,8 @@ service_update(htsmsg_t *in)
     if((chname = htsmsg_get_str(c, "channelname")) != NULL) 
       service_map_channel(t, channel_find_by_name(chname, 1, 0), 1);
 
-    if((dvb_default_charset = htsmsg_get_str(c, "dvb_default_charset")) != NULL)
-      service_set_dvb_default_charset(t, dvb_default_charset);
+    if((dvb_charset = htsmsg_get_str(c, "dvb_charset")) != NULL)
+      service_set_dvb_charset(t, dvb_charset);
 
     if(!htsmsg_get_u32(c, "dvb_eit_enable", &u32))
       service_set_dvb_eit_enable(t, u32);
@@ -1517,8 +1517,8 @@ extjs_servicedetails(http_connection_t *hc,
 
   htsmsg_add_msg(out, "streams", streams);
 
-  if(t->s_dvb_default_charset != NULL)
-    htsmsg_add_str(out, "dvb_default_charset", t->s_dvb_default_charset);
+  if(t->s_dvb_charset != NULL)
+    htsmsg_add_str(out, "dvb_charset", t->s_dvb_charset);
 
   htsmsg_add_u32(out, "dvb_eit_enable", t->s_dvb_eit_enable);
 
@@ -1749,7 +1749,7 @@ extjs_service_update(htsmsg_t *in)
   uint32_t u32;
   const char *id;
   const char *chname;
-  const char *dvb_default_charset;
+  const char *dvb_charset;
 
   TAILQ_FOREACH(f, &in->hm_fields, hmf_link) {
     if((c = htsmsg_get_map_by_field(f)) == NULL ||
@@ -1765,8 +1765,8 @@ extjs_service_update(htsmsg_t *in)
     if((chname = htsmsg_get_str(c, "channelname")) != NULL) 
       service_map_channel(t, channel_find_by_name(chname, 1, 0), 1);
 
-    if((dvb_default_charset = htsmsg_get_str(c, "dvb_default_charset")) != NULL)
-      service_set_dvb_default_charset(t, dvb_default_charset);
+    if((dvb_charset = htsmsg_get_str(c, "dvb_charset")) != NULL)
+      service_set_dvb_charset(t, dvb_charset);
 
     if(!htsmsg_get_u32(c, "dvb_eit_enable", &u32))
       service_set_dvb_eit_enable(t, u32);
index a483753b96eb6a0dc2fe1803d698428f89cfda3e..d1806e67aea536419d38ac8e3976a258c1ba119a 100644 (file)
@@ -444,18 +444,18 @@ tvheadend.dvb_services = function(adapterId) {
                        })
                },
                {
-                       header : "DVB default charset",
-                       dataIndex : 'dvb_default_charset',
+                       header : "DVB charset",
+                       dataIndex : 'dvb_charset',
                        width : 200,
                        renderer : function(value, metadata, record, row, col, store) {
                                return value ? value
-                                       : '<span class="tvh-grid-unset">ISO6937</span>';
+                                       : '<span class="tvh-grid-unset">auto</span>';
                        },
                        editor : new fm.ComboBox({
                                mode : 'local',
                                store : new Ext.data.SimpleStore({
                                        fields : [ 'key', 'value' ],
-                                       data : [ [ 'ISO6937', 'default' ], [ 'ISO6937', 'ISO6937' ],
+                                       data : [ [ null, 'auto' ], [ 'ISO6937', 'ISO6937' ],
                                                [ 'ISO8859-1', 'ISO8859-1' ], [ 'ISO8859-2', 'ISO8859-2' ],
                                                [ 'ISO8859-3', 'ISO8859-3' ], [ 'ISO8859-4', 'ISO8859-4' ],
                                                [ 'ISO8859-5', 'ISO8859-5' ], [ 'ISO8859-6', 'ISO8859-6' ],
@@ -510,7 +510,7 @@ tvheadend.dvb_services = function(adapterId) {
                root : 'entries',
                fields : Ext.data.Record.create([ 'id', 'enabled', 'type', 'sid', 'pmt',
                        'pcr', 'svcname', 'network', 'provider', 'mux', 'channelname',
-                       'dvb_default_charset', 'dvb_eit_enable' ]),
+                       'dvb_charset', 'dvb_eit_enable' ]),
                url : "dvb/services/" + adapterId,
                autoLoad : true,
                id : 'id',