[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.
This commit is contained in:
parent
7e71efaeef
commit
aff490c6b2
9 changed files with 44 additions and 42 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Add table
Reference in a new issue