[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:
Jacek Tomasiak 2012-09-30 19:11:06 +02:00 committed by Adam Sutton
parent 7e71efaeef
commit aff490c6b2
9 changed files with 44 additions and 42 deletions

View 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);

View 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_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;
}
} 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;

View 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))

View 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);

View 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];

View 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);
}

View 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);

View 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);

View 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',