• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2011-2012 - Mauro Carvalho Chehab
3  * Copyright (c) 2012 - Andre Roth <neolynx@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation version 2.1 of the License.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18  *
19  */
20 
21 #include <libdvbv5/desc_event_extended.h>
22 #include <libdvbv5/dvb-fe.h>
23 #include <parse_string.h>
24 
25 #ifdef ENABLE_NLS
26 # include "gettext.h"
27 # include <libintl.h>
28 # define _(string) dgettext(LIBDVBV5_DOMAIN, string)
29 #else
30 # define _(string) string
31 #endif
32 
33 #if __GNUC__ >= 9
34 #pragma GCC diagnostic ignored "-Waddress-of-packed-member"
35 #endif
36 
dvb_desc_event_extended_init(struct dvb_v5_fe_parms * parms,const uint8_t * buf,struct dvb_desc * desc)37 int dvb_desc_event_extended_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
38 {
39 	struct dvb_desc_event_extended *event = (struct dvb_desc_event_extended *) desc;
40 	uint8_t len, size_items;
41 	const uint8_t *buf_start;
42 	int first = 1;
43 	struct dvb_desc_event_extended_item *item;
44 
45 	event->ids = buf[0];
46 
47 	event->language[0] = buf[1];
48 	event->language[1] = buf[2];
49 	event->language[2] = buf[3];
50 	event->language[3] = '\0';
51 
52 	size_items = buf[4];
53 	buf += 5;
54 
55 	event->items = NULL;
56 	event->num_items = 0;
57 	buf_start = buf;
58 	while (buf - buf_start < size_items) {
59 		if (first) {
60 			first = 0;
61 			event->num_items = 1;
62 			event->items = calloc(sizeof(struct dvb_desc_event_extended_item), event->num_items);
63 			if (!event->items) {
64 				dvb_logerr(_("%s: out of memory"), __func__);
65 				return -1;
66 			}
67 			item = event->items;
68 		} else {
69 			event->num_items++;
70 			event->items = realloc(event->items, sizeof(struct dvb_desc_event_extended_item) * (event->num_items));
71 			item = event->items + (event->num_items - 1);
72 		}
73 		len = *buf;
74 		buf++;
75 		item->description = NULL;
76 		item->description_emph = NULL;
77 		dvb_parse_string(parms, &item->description, &item->description_emph, buf, len);
78 		buf += len;
79 
80 		len = *buf;
81 		buf++;
82 		item->item = NULL;
83 		item->item_emph = NULL;
84 		dvb_parse_string(parms, &item->item, &item->item_emph, buf, len);
85 		buf += len;
86 	}
87 
88 
89 	len = *buf;
90 	buf++;
91 
92 	if (len) {
93 		event->text = NULL;
94 		event->text_emph = NULL;
95 		dvb_parse_string(parms, &event->text, &event->text_emph, buf, len);
96 		buf += len;
97 	}
98 
99 	return 0;
100 }
101 
dvb_desc_event_extended_free(struct dvb_desc * desc)102 void dvb_desc_event_extended_free(struct dvb_desc *desc)
103 {
104 	struct dvb_desc_event_extended *event = (struct dvb_desc_event_extended *) desc;
105 	int i;
106 	free(event->text);
107 	free(event->text_emph);
108 	for (i = 0; i < event->num_items; i++) {
109 		free(event->items[i].description);
110 		free(event->items[i].description_emph);
111 		free(event->items[i].item);
112 		free(event->items[i].item_emph);
113 	}
114 	free(event->items);
115 }
116 
dvb_desc_event_extended_print(struct dvb_v5_fe_parms * parms,const struct dvb_desc * desc)117 void dvb_desc_event_extended_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
118 {
119 	const struct dvb_desc_event_extended *event = (const struct dvb_desc_event_extended *) desc;
120 	int i;
121 	dvb_loginfo("|           '%s'", event->text);
122 	for (i = 0; i < event->num_items; i++) {
123 		dvb_loginfo("|              description   '%s'", event->items[i].description);
124 		dvb_loginfo("|              item          '%s'", event->items[i].item);
125 	}
126 }
127 
128