From aff490c6b29d25490c42be723554a72faadea48c Mon Sep 17 00:00:00 2001 From: Jacek Tomasiak Date: Sun, 30 Sep 2012 19:11:06 +0200 Subject: [PATCH] [PR-155] Change dvb charset to allow proper overriding. 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 | 4 ++-- src/dvb/dvb_support.c | 22 ++++++++++++---------- src/dvb/dvb_support.h | 4 ++-- src/dvb/dvb_transport.c | 12 ++++++------ src/epggrab/module/eit.c | 2 +- src/service.c | 12 ++++++------ src/service.h | 4 ++-- src/webui/extjs.c | 16 ++++++++-------- src/webui/static/app/dvb.js | 10 +++++----- 9 files changed, 44 insertions(+), 42 deletions(-) diff --git a/src/dvb/dvb_multiplex.c b/src/dvb/dvb_multiplex.c index 9358443f..64ea7945 100644 --- a/src/dvb/dvb_multiplex.c +++ b/src/dvb/dvb_multiplex.c @@ -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); diff --git a/src/dvb/dvb_support.c b/src/dvb/dvb_support.c index e1066c0c..73b7c4b7 100644 --- a/src/dvb/dvb_support.c +++ b/src/dvb/dvb_support.c @@ -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; diff --git a/src/dvb/dvb_support.h b/src/dvb/dvb_support.h index f138f388..f4726cda 100644 --- a/src/dvb/dvb_support.h +++ b/src/dvb/dvb_support.h @@ -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)) diff --git a/src/dvb/dvb_transport.c b/src/dvb/dvb_transport.c index 6499d3cd..cf27b231 100644 --- a/src/dvb/dvb_transport.c +++ b/src/dvb/dvb_transport.c @@ -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); diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index 12b52b0c..792b9671 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -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]; diff --git a/src/service.c b/src/service.c index 52936d66..f9224eb8 100644 --- a/src/service.c +++ b/src/service.c @@ -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); } diff --git a/src/service.h b/src/service.h index 81af6208..692157d7 100644 --- a/src/service.h +++ b/src/service.h @@ -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); diff --git a/src/webui/extjs.c b/src/webui/extjs.c index 2832c155..cf318fc5 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -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); diff --git a/src/webui/static/app/dvb.js b/src/webui/static/app/dvb.js index a483753b..d1806e67 100644 --- a/src/webui/static/app/dvb.js +++ b/src/webui/static/app/dvb.js @@ -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 - : 'ISO6937'; + : 'auto'; }, 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',