libdvbv5: Move charsets to be inside the parms struct
authorMauro Carvalho Chehab <m.chehab@samsung.com>
Sat, 30 Aug 2014 14:05:37 +0000 (11:05 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Sat, 30 Aug 2014 14:05:37 +0000 (11:05 -0300)
Instead of using global vars and expose them to the library API,
move the charset definition to be part of the parms struct.

The default changesets can vary from Country to Country.

Also, the output changeset should match whatever is defined at
the system. So, applications may need to change them.

Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
lib/include/libdvbv5/dvb-fe.h
lib/libdvbv5/descriptors/desc_event_extended.c
lib/libdvbv5/descriptors/desc_event_short.c
lib/libdvbv5/descriptors/desc_network_name.c
lib/libdvbv5/descriptors/desc_service.c
lib/libdvbv5/descriptors/desc_ts_info.c
lib/libdvbv5/dvb-fe.c
lib/libdvbv5/parse_string.c
lib/libdvbv5/parse_string.h
lib/libdvbv5/tables/vct.c

index 40dbe1a..18807b7 100644 (file)
@@ -99,6 +99,10 @@ struct dvb_v5_fe_parms {
        struct dvb_v5_stats             stats;
        int                             lna;
 
+       /* Charsets to be used by the conversion utilities */
+       char                            *default_charset;
+       char                            *output_charset;
+
        /* Satellite specific stuff, specified by the library client */
        const struct dvb_sat_lnb        *lnb;
        int                             sat_number;
index 71e747a..4762a14 100644 (file)
@@ -59,7 +59,7 @@ int dvb_desc_event_extended_init(struct dvb_v5_fe_parms *parms, const uint8_t *b
        len = *buf;
        len1 = len;
        buf++;
-       parse_string(parms, &event->text, &event->text_emph, buf, len1, dvb_default_charset, dvb_output_charset);
+       dvb_parse_string(parms, &event->text, &event->text_emph, buf, len1);
        buf += len;
        return 0;
 }
index 9b19269..eb8aca8 100644 (file)
@@ -42,7 +42,7 @@ int dvb_desc_event_short_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
        len = buf[0];
        buf++;
        len1 = len;
-       parse_string(parms, &event->name, &event->name_emph, buf, len1, dvb_default_charset, dvb_output_charset);
+       dvb_parse_string(parms, &event->name, &event->name_emph, buf, len1);
        buf += len;
 
        event->text = NULL;
@@ -50,7 +50,7 @@ int dvb_desc_event_short_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
        len = buf[0];
        len2 = len;
        buf++;
-       parse_string(parms, &event->text, &event->text_emph, buf, len2, dvb_default_charset, dvb_output_charset);
+       dvb_parse_string(parms, &event->text, &event->text_emph, buf, len2);
        buf += len;
        return 0;
 }
index fe593e4..2d784b1 100644 (file)
@@ -33,7 +33,7 @@ int dvb_desc_network_name_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf
        len1 = len;
        net->network_name = NULL;
        net->network_name_emph = NULL;
-       parse_string(parms, &net->network_name, &net->network_name_emph, buf, len1, dvb_default_charset, dvb_output_charset);
+       dvb_parse_string(parms, &net->network_name, &net->network_name_emph, buf, len1);
        buf += len;
        return 0;
 }
index 6858c32..01ab33e 100644 (file)
@@ -37,7 +37,7 @@ int dvb_desc_service_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, str
        len = buf[0];
        buf++;
        len1 = len;
-       parse_string(parms, &service->provider, &service->provider_emph, buf, len1, dvb_default_charset, dvb_output_charset);
+       dvb_parse_string(parms, &service->provider, &service->provider_emph, buf, len1);
        buf += len;
 
        service->name = NULL;
@@ -45,7 +45,7 @@ int dvb_desc_service_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, str
        len = buf[0];
        len2 = len;
        buf++;
-       parse_string(parms, &service->name, &service->name_emph, buf, len2, dvb_default_charset, dvb_output_charset);
+       dvb_parse_string(parms, &service->name, &service->name_emph, buf, len2);
        buf += len;
        return 0;
 }
index 713c1b8..35aa4eb 100644 (file)
@@ -39,8 +39,7 @@ int dvb_desc_ts_info_init(struct dvb_v5_fe_parms *parms,
        len = d->length_of_ts_name;
        d->ts_name = NULL;
        d->ts_name_emph = NULL;
-       parse_string(parms, &d->ts_name, &d->ts_name_emph, buf, len,
-                    dvb_default_charset, dvb_output_charset);
+       dvb_parse_string(parms, &d->ts_name, &d->ts_name_emph, buf, len);
        p += len;
 
        memcpy(&d->transmission_type, p, sizeof(d->transmission_type));
index c260674..c1f0264 100644 (file)
@@ -87,6 +87,8 @@ struct dvb_v5_fe_parms *dvb_fe_open2(int adapter, int frontend, unsigned verbose
        parms->abort = 0;
        parms->logfunc = logfunc;
        parms->lna = LNA_AUTO;
+       parms->default_charset = "iso-8859-1";
+       parms->output_charset = "utf-8";
 
        if (ioctl(fd, FE_GET_INFO, &parms->info) == -1) {
                dvb_perror("FE_GET_INFO");
index 774499c..3750d04 100644 (file)
@@ -35,9 +35,6 @@
 
 #define CS_OPTIONS "//TRANSLIT"
 
-char *dvb_default_charset = "iso-8859-1";
-char *dvb_output_charset = "utf-8";
-
 struct charset_conv {
        unsigned len;
        unsigned char  data[3];
@@ -303,12 +300,12 @@ static struct charset_conv en300468_latin_00_to_utf8[256] = {
        [0xff] = { 2, {0xc2, 0xad, } },
 };
 
-void iconv_to_charset(struct dvb_v5_fe_parms *parms,
-                     char *dest,
-                     size_t destlen,
-                     const unsigned char *src,
-                     size_t len,
-                     char *type, char *output_charset)
+void dvb_iconv_to_charset(struct dvb_v5_fe_parms *parms,
+                         char *dest,
+                         size_t destlen,
+                         const unsigned char *src,
+                         size_t len,
+                         char *input_charset, char *output_charset)
 {
        char out_cs[strlen(output_charset) + 1 + sizeof(CS_OPTIONS)];
        char *p = dest;
@@ -316,12 +313,12 @@ void iconv_to_charset(struct dvb_v5_fe_parms *parms,
        strcpy(out_cs, output_charset);
        strcat(out_cs, CS_OPTIONS);
 
-       iconv_t cd = iconv_open(out_cs, type);
+       iconv_t cd = iconv_open(out_cs, input_charset);
        if (cd == (iconv_t)(-1)) {
                memcpy(p, src, len);
                p[len] = '\0';
                dvb_logerr("Conversion from %s to %s not supported\n",
-                               type, output_charset);
+                               input_charset, output_charset);
        } else {
                iconv(cd, (ICONV_CONST char **)&src, &len, &p, &destlen);
                iconv_close(cd);
@@ -330,14 +327,13 @@ void iconv_to_charset(struct dvb_v5_fe_parms *parms,
 }
 
 static void charset_conversion(struct dvb_v5_fe_parms *parms, char **dest, const unsigned char *s,
-                              size_t len,
-                              char *type, char *output_charset)
+                              size_t len, char *input_charset)
 {
        size_t destlen = len * 3;
        int need_conversion = 1;
 
        /* Special handler for ISO-6937 */
-       if (!strcasecmp(type, "ISO-6937")) {
+       if (!strcasecmp(input_charset, "ISO-6937")) {
                char *p = *dest;
                unsigned char *tmp;
                unsigned char *p1, *p2;
@@ -351,12 +347,12 @@ static void charset_conversion(struct dvb_v5_fe_parms *parms, char **dest, const
                *p = '\0';
 
                /* If desired charset is not UTF-8, prepare for conversion */
-               if (strcasecmp(output_charset, "UTF-8")) {
+               if (strcasecmp(parms->output_charset, "UTF-8")) {
                        tmp = (unsigned char *)*dest;
                        len = p - *dest;
 
                        *dest = malloc(destlen + 1);
-                       type = "UTF-8";
+                       input_charset = "UTF-8";
                        s = tmp;
                } else
                        need_conversion = 0;
@@ -365,16 +361,16 @@ static void charset_conversion(struct dvb_v5_fe_parms *parms, char **dest, const
 
        /* Convert from original charset to the desired one */
        if (need_conversion)
-               iconv_to_charset(parms, *dest, destlen, s, len, type,
-                                output_charset);
+               dvb_iconv_to_charset(parms, *dest, destlen, s, len,
+                                    input_charset,
+                                    parms->output_charset);
 }
 
-void parse_string(struct dvb_v5_fe_parms *parms, char **dest, char **emph,
-                 const unsigned char *src, size_t len,
-                 char *default_charset, char *output_charset)
+void dvb_parse_string(struct dvb_v5_fe_parms *parms, char **dest, char **emph,
+                     const unsigned char *src, size_t len)
 {
        size_t destlen, i, len2 = 0;
-       char *p, *p2, *type = default_charset;
+       char *p, *p2, *type = parms->default_charset;
        unsigned char *tmp1 = NULL, *tmp2 = NULL;
        const unsigned char *s;
        int emphasis = 0;
@@ -483,7 +479,7 @@ void parse_string(struct dvb_v5_fe_parms *parms, char **dest, char **emph,
        else
                s = src;
 
-       charset_conversion(parms, dest, s, len, type, output_charset);
+       charset_conversion(parms, dest, s, len, type);
        /* The code had over-sized the space. Fix it. */
        if (*dest)
                *dest = realloc(*dest, strlen(*dest) + 1);
@@ -496,7 +492,7 @@ void parse_string(struct dvb_v5_fe_parms *parms, char **dest, char **emph,
                free (*emph);
                *emph = NULL;
        } else {
-               charset_conversion(parms, emph, tmp2, len2, type, output_charset);
+               charset_conversion(parms, emph, tmp2, len2, type);
                *emph = realloc(*emph, strlen(*emph) + 1);
        }
 
index e269ff3..ad790c7 100644 (file)
 
 struct dvb_v5_fe_parms;
 
-void iconv_to_charset(struct dvb_v5_fe_parms *parms,
-                     char *dest,
-                     size_t destlen,
-                     const unsigned char *src,
-                     size_t len,
-                     char *type, char *output_charset);
+void dvb_iconv_to_charset(struct dvb_v5_fe_parms *parms,
+                         char *dest,
+                         size_t destlen,
+                         const unsigned char *src,
+                         size_t len,
+                         char *type, char *output_charset);
 
-void parse_string(struct dvb_v5_fe_parms *parms, char **dest, char **emph,
-                 const unsigned char *src, size_t len,
-                 char *default_charset, char *output_charset);
-
-extern char *dvb_default_charset;
-extern char *dvb_output_charset;
+void dvb_parse_string(struct dvb_v5_fe_parms *parms, char **dest, char **emph,
+                     const unsigned char *src, size_t len);
 
 #if HAVE_VISIBILITY
 #pragma GCC visibility pop
index 73bae63..c32e22c 100644 (file)
@@ -96,12 +96,12 @@ ssize_t atsc_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
                bswap16(channel->bitfield3);
 
                /* Short name is always UTF-16 */
-               iconv_to_charset(parms, channel->short_name,
-                                sizeof(channel->short_name),
-                                (const unsigned char *)channel->__short_name,
-                                sizeof(channel->__short_name),
-                                "UTF-16",
-                                dvb_output_charset);
+               dvb_iconv_to_charset(parms, channel->short_name,
+                                    sizeof(channel->short_name),
+                                    (const unsigned char *)channel->__short_name,
+                                    sizeof(channel->__short_name),
+                                    "UTF-16",
+                                    parms->output_charset);
 
                /* Fill descriptors */