basic NLS support for scan util

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




So, new option appears, -E encoding.
If not given, use no recoding (default, old behaviour).
Affects provider's name and services name, thus output is encoded in encoding (I see some progs using UTF or so in input channels.conf, and, also, there is no other way for progs to know which encoding was used by provider).
*** scan.c.orig	2008-05-03 16:26:59.000000000 +0400
--- scan.c	2008-05-08 15:49:23.000000000 +0400
***************
*** 33,38 ****
--- 33,39 ----
  #include <assert.h>
  #include <glob.h>
  #include <ctype.h>
+ #include <iconv.h>
  
  #include <linux/dvb/frontend.h>
  #include <linux/dvb/dmx.h>
***************
*** 43,48 ****
--- 44,50 ----
  #include "dump-vdr.h"
  #include "scan.h"
  #include "lnb.h"
+ #include "../../lib/libucsi/dvb/types.h"
  
  #include "atsc_psip_section.h"
  
***************
*** 84,89 ****
--- 86,93 ----
  static enum format output_format = OUTPUT_ZAP;
  static int output_format_set = 0;
  
+ #define ICONV_ENC_LENGTH	32
+ static char output_encoding[ICONV_ENC_LENGTH]="";
  
  enum polarisation {
  	POLARISATION_HORIZONTAL     = 0x00,
***************
*** 107,113 ****
--- 111,119 ----
  	int transport_stream_id;
  	int service_id;
  	char *provider_name;
+ 	char *provider_name_enc;
  	char *service_name;
+ 	char *service_name_enc;	// recoded to the charset given
  	uint16_t pmt_pid;
  	uint16_t pcr_pid;
  	uint16_t video_pid;
***************
*** 126,131 ****
--- 132,138 ----
  	int channel_num;
  };
  
+ 
  struct transponder {
  	struct list_head list;
  	struct list_head services;
***************
*** 536,544 ****
  {
  	unsigned char len;
  	unsigned char *src, *dest;
  
  	s->type = buf[2];
! 
  	buf += 3;
  	len = *buf;
  	buf++;
--- 543,557 ----
  {
  	unsigned char len;
  	unsigned char *src, *dest;
+ 	int consumed=0;
+ 	iconv_t conv_;
+ 	char buv[1024], *buv_, *srv;
+ 	const char *chs;
+ 	
+ 	size_t inbytesleft=0, outbytesleft=0;
  
  	s->type = buf[2];
! 	
  	buf += 3;
  	len = *buf;
  	buf++;
***************
*** 550,566 ****
  	memcpy (s->provider_name, buf, len);
  	s->provider_name[len] = '\0';
  
  	/* remove control characters (FIXME: handle short/long name) */
  	/* FIXME: handle character set correctly (e.g. via iconv)
  	 * c.f. EN 300 468 annex A */
  	for (src = dest = (unsigned char *) s->provider_name; *src; src++)
! 		if (*src >= 0x20 && (*src < 0x80 || *src > 0x9f))
  			*dest++ = *src;
  	*dest = '\0';
  	if (!s->provider_name[0]) {
  		/* zap zero length names */
  		free (s->provider_name);
  		s->provider_name = 0;
  	}
  
  	if (s->service_name)
--- 563,598 ----
  	memcpy (s->provider_name, buf, len);
  	s->provider_name[len] = '\0';
  
+ 	// I do not know, if a provider would like to use NLS....
+ 	chs=dvb_charset(s->provider_name, len+1, &consumed);
  	/* remove control characters (FIXME: handle short/long name) */
  	/* FIXME: handle character set correctly (e.g. via iconv)
  	 * c.f. EN 300 468 annex A */
  	for (src = dest = (unsigned char *) s->provider_name; *src; src++)
! 		if (*src >= 0x20 && (*src < 0x80 || *src > 0x9f)) {
  			*dest++ = *src;
+ 			inbytesleft++;
+ 			}
  	*dest = '\0';
  	if (!s->provider_name[0]) {
  		/* zap zero length names */
  		free (s->provider_name);
  		s->provider_name = 0;
+ 	} 	else {
+ 	if(strlen(output_encoding) > 1) {
+ 	bzero(buv,1024);
+ 	if(s->provider_name_enc) free(s->provider_name_enc);
+ 	if(consumed > 0) {
+ 		conv_=iconv_open(output_encoding, chs);
+ 		inbytesleft++; // for '\0'
+ 		buv_=(char*)buv;
+ 		srv=s->provider_name;
+ 		outbytesleft=inbytesleft*4;
+ 		iconv(conv_,&srv, &inbytesleft,&buv_, &outbytesleft);
+ 		iconv_close(conv_);
+ 		s->provider_name_enc=strdup(buv);
+ 		}
+ 		}
  	}
  
  	if (s->service_name)
***************
*** 574,597 ****
  	memcpy (s->service_name, buf, len);
  	s->service_name[len] = '\0';
  
  	/* remove control characters (FIXME: handle short/long name) */
  	/* FIXME: handle character set correctly (e.g. via iconv)
  	 * c.f. EN 300 468 annex A */
  	for (src = dest = (unsigned char *) s->service_name; *src; src++)
! 		if (*src >= 0x20 && (*src < 0x80 || *src > 0x9f))
  			*dest++ = *src;
  	*dest = '\0';
  	if (!s->service_name[0]) {
  		/* zap zero length names */
  		free (s->service_name);
  		s->service_name = 0;
  	}
- 
  	info("0x%04x 0x%04x: pmt_pid 0x%04x %s -- %s (%s%s)\n",
  	    s->transport_stream_id,
  	    s->service_id,
  	    s->pmt_pid,
! 	    s->provider_name, s->service_name,
  	    s->running == RM_NOT_RUNNING ? "not running" :
  	    s->running == RM_STARTS_SOON ? "starts soon" :
  	    s->running == RM_PAUSING     ? "pausing" :
--- 606,648 ----
  	memcpy (s->service_name, buf, len);
  	s->service_name[len] = '\0';
  
+ 	chs=dvb_charset(s->service_name, len+1, &consumed);
+ 	inbytesleft=0;
  	/* remove control characters (FIXME: handle short/long name) */
  	/* FIXME: handle character set correctly (e.g. via iconv)
  	 * c.f. EN 300 468 annex A */
  	for (src = dest = (unsigned char *) s->service_name; *src; src++)
! 		if (*src >= 0x20 && (*src < 0x80 || *src > 0x9f)) {
  			*dest++ = *src;
+ 			inbytesleft++;
+ 			}
  	*dest = '\0';
  	if (!s->service_name[0]) {
  		/* zap zero length names */
  		free (s->service_name);
  		s->service_name = 0;
+ 	} else {
+ 	if(strlen(output_encoding) > 1) {
+ 	bzero(buv,1024);
+ 	if(s->service_name_enc) free(s->service_name_enc);
+ 	if(consumed > 0) {
+ 		conv_=iconv_open(output_encoding, chs);
+ 		inbytesleft++; // for '\0'
+ 		buv_=(char*)buv;
+ 		srv=s->service_name;
+ 		outbytesleft=inbytesleft*4;
+ 		iconv(conv_,&srv, &inbytesleft,&buv_, &outbytesleft);
+ 		iconv_close(conv_);
+ 		s->service_name_enc=strdup(buv);
+ 		}
+ 		}
  	}
  	info("0x%04x 0x%04x: pmt_pid 0x%04x %s -- %s (%s%s)\n",
  	    s->transport_stream_id,
  	    s->service_id,
  	    s->pmt_pid,
! 	    (s->provider_name_enc)?s->provider_name_enc:s->provider_name,
! 	    (s->service_name_enc)? s->service_name_enc: s->service_name,
  	    s->running == RM_NOT_RUNNING ? "not running" :
  	    s->running == RM_STARTS_SOON ? "starts soon" :
  	    s->running == RM_PAUSING     ? "pausing" :
***************
*** 829,835 ****
          debug("0x%04x 0x%04x: %s -- %s, pmt_pid 0x%04x, vpid 0x%04x, apid %s\n",
  	    s->transport_stream_id,
  	    s->service_id,
! 	    s->provider_name, s->service_name,
  	    s->pmt_pid, s->video_pid, msg_buf);
  }
  
--- 880,887 ----
          debug("0x%04x 0x%04x: %s -- %s, pmt_pid 0x%04x, vpid 0x%04x, apid %s\n",
  	    s->transport_stream_id,
  	    s->service_id,
! 	    (s->provider_name_enc)?s->provider_name_enc:s->provider_name,
! 	    (s->service_name_enc)?s->service_name_enc:s->service_name,
  	    s->pmt_pid, s->video_pid, msg_buf);
  }
  
***************
*** 1897,1903 ****
  {
          int i;
  
! 	fprintf(f, "%-24.24s (0x%04x) %02x: ", s->service_name, s->service_id, s->type);
  	if (!s->pcr_pid || (s->type > 2))
  		fprintf(f, "           ");
  	else if (s->pcr_pid == s->video_pid)
--- 1949,1955 ----
  {
          int i;
  
! 	fprintf(f, "%-24.24s (0x%04x) %02x: ", (s->service_name_enc)?s->service_name_enc:s->service_name, s->service_id, s->type);
  	if (!s->pcr_pid || (s->type > 2))
  		fprintf(f, "           ");
  	else if (s->pcr_pid == s->video_pid)
***************
*** 2001,2008 ****
  				break;
  			  case OUTPUT_VDR:
  				vdr_dump_service_parameter_set (stdout,
! 						    s->service_name,
! 						    s->provider_name,
  						    t->type,
  						    &t->param,
  						    sat_polarisation(t),
--- 2053,2060 ----
  				break;
  			  case OUTPUT_VDR:
  				vdr_dump_service_parameter_set (stdout,
! 						    (s->service_name_enc)?s->service_name_enc : s->service_name,
! 						    (s->provider_name_enc)?s->provider_name_enc:s->provider_name,
  						    t->type,
  						    &t->param,
  						    sat_polarisation(t),
***************
*** 2028,2034 ****
  				break;
  			  case OUTPUT_ZAP:
  				zap_dump_service_parameter_set (stdout,
! 						    s->service_name,
  						    t->type,
  						    &t->param,
  						    sat_polarisation(t),
--- 2080,2086 ----
  				break;
  			  case OUTPUT_ZAP:
  				zap_dump_service_parameter_set (stdout,
! 						    (s->service_name_enc)?s->service_name_enc : s->service_name,
  						    t->type,
  						    &t->param,
  						    sat_polarisation(t),
***************
*** 2107,2113 ****
  	"	-P do not use ATSC PSIP tables for scanning\n"
  	"	    (but only PAT and PMT) (applies for ATSC only)\n"
  	"	-A N	check for ATSC 1=Terrestrial [default], 2=Cable or 3=both\n"
! 	"	-U	Uniquely name unknown services\n";
  
  void
  bad_usage(char *pname, int problem)
--- 2159,2166 ----
  	"	-P do not use ATSC PSIP tables for scanning\n"
  	"	    (but only PAT and PMT) (applies for ATSC only)\n"
  	"	-A N	check for ATSC 1=Terrestrial [default], 2=Cable or 3=both\n"
! 	"	-U	Uniquely name unknown services\n"
! 	"	-E enc	Output encoding for iconv. Look at iconv -l.\n";
  
  void
  bad_usage(char *pname, int problem)
***************
*** 2155,2161 ****
  
  	/* start with default lnb type */
  	lnb_type = *lnb_enum(0);
! 	while ((opt = getopt(argc, argv, "5cnpa:f:d:s:o:x:e:t:i:l:vquPA:U")) != -1) {
  		switch (opt) {
  		case 'a':
  			adapter = strtoul(optarg, NULL, 0);
--- 2208,2214 ----
  
  	/* start with default lnb type */
  	lnb_type = *lnb_enum(0);
! 	while ((opt = getopt(argc, argv, "5cnpa:f:d:s:o:x:e:t:E:i:l:vquPA:U")) != -1) {
  		switch (opt) {
  		case 'a':
  			adapter = strtoul(optarg, NULL, 0);
***************
*** 2235,2240 ****
--- 2288,2296 ----
  		case 'U':
  			unique_anon_services = 1;
  			break;
+ 		case 'E':
+ 			strncpy(output_encoding,optarg,ICONV_ENC_LENGTH);
+ 			break;
  		default:
  			bad_usage(argv[0], 0);
  			return -1;
*** Makefile.orig	2008-05-03 16:26:59.000000000 +0400
--- Makefile	2008-05-06 17:46:24.000000000 +0400
***************
*** 15,20 ****
--- 15,21 ----
  removing = atsc_psip_section.c atsc_psip_section.h
  
  CPPFLAGS += -DDATADIR=\"$(prefix)/share\"
+ LOADLIBES +=  -L../../lib/libucsi -lucsi
  
  .PHONY: all
  
_______________________________________________
linux-dvb mailing list
linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

[Index of Archives]     [Linux Media]     [Video 4 Linux]     [Asterisk]     [Samba]     [Xorg]     [Xfree86]     [Linux USB]

  Powered by Linux