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