source: titan/plugins/hbbtv/hbbtv.h @ 23356

Last change on this file since 23356 was 23356, checked in by nit, 7 years ago

fix

File size: 17.2 KB
Line 
1#ifndef OPERA_H
2#define OPERA_H
3
4struct hbbtvfav
5{
6        char* name;
7        char* addr;
8        struct hbbtvfav* next;
9};
10
11struct hbbtvfav *hbbtvfav = NULL;
12
13#define NAME "YWNATIVE"
14#define CONTROL_PIPE_W "/tmp/"NAME"_control_w"
15#define CONTROL_PIPE_R "/tmp/"NAME"_control_r"
16#define RC_TITAN "/tmp/rc_enigma2"
17
18extern struct skin* skin;
19
20void operareceivercb(char* cmd);
21
22int operarcsockfd = -1;
23int operarcconnfd = -1;
24int opera_control_r_fd = -1;
25int operarcthread_ok = 0;
26int operareceiverthread_ok = 0;
27//100 = live play
28//0 = pause
29//1 = play
30//2 = stop
31int operaservicestate = 100;
32char* operaplayurl = NULL;
33
34struct hbbtvfav* addhbbtvfav(char *line, int count, struct hbbtvfav* last)
35{
36        //debug(1000, "in");
37        struct hbbtvfav *newnode = NULL, *prev = NULL, *node = hbbtvfav;
38        int ret = 0;
39
40        newnode = (struct hbbtvfav*)calloc(1, sizeof(struct hbbtvfav));
41        if(newnode == NULL)
42        {
43                err("no memory");
44                return NULL;
45        }
46
47        newnode->name = malloc(1024);
48        if(newnode->name == NULL)
49        {
50                err("no mem");
51                free(newnode);
52                return NULL;
53        }
54
55        newnode->addr = malloc(1024);
56        if(newnode->addr == NULL)
57        {
58                err("no mem");
59                free(newnode->name);
60                free(newnode);
61                return NULL;
62        }
63
64        ret = sscanf(line, "%[^#]#%s", newnode->name, newnode->addr);
65        if(ret != 2)
66        {
67                if(count > 0)
68                {
69                        err("hbbtvfav line %d not ok", count);
70                }
71                else
72                {
73                        err("add hbbtvfav");
74                }
75                free(newnode->name);
76                free(newnode->addr);
77                free(newnode);
78                return NULL;
79        }
80
81        newnode->name = ostrshrink(newnode->name);
82        newnode->addr = ostrshrink(newnode->addr);
83
84        if(last == NULL)
85        {
86                while(node != NULL)
87                {
88                        prev = node;
89                        node = node->next;
90                }
91        }
92        else
93        {
94                prev = last;
95                node = last->next;
96        }
97
98        if(prev == NULL)
99                hbbtvfav = newnode;
100        else
101                prev->next = newnode;
102        newnode->next = node;
103
104        //debug(1000, "out");
105        return newnode;
106}
107
108int readhbbtvfav(const char* filename)
109{
110        debug(1000, "in");
111        FILE *fd = NULL;
112        char *fileline = NULL;
113        int linecount = 0, len = 0;
114        struct hbbtvfav* last = NULL, *tmplast = NULL;
115
116        fileline = malloc(MINMALLOC);
117        if(fileline == NULL)
118        {
119                err("no memory");
120                return 1;
121        }
122
123        fd = fopen(filename, "r");
124        if(fd == NULL)
125        {
126                perr("can't open %s", filename);
127                free(fileline);
128                return 1;
129        }
130
131        while(fgets(fileline, MINMALLOC, fd) != NULL)
132        {
133                if(fileline[0] == '#' || fileline[0] == '\n')
134                        continue;
135                len = strlen(fileline) - 1;
136                if(len >= 0 && fileline[len] == '\n')
137                        fileline[len] = '\0';
138                len--;
139                if(len >= 0 && fileline[len] == '\r')
140                        fileline[len] = '\0';
141
142                linecount++;
143
144                if(last == NULL) last = tmplast;
145                last = addhbbtvfav(fileline, linecount, last);
146                if(last != NULL) tmplast = last;
147        }
148
149        free(fileline);
150        fclose(fd);
151        return 0;
152}
153
154int delhbbtvfav(char* name)
155{
156        debug(1000, "in");
157        int ret = 1;
158        struct hbbtvfav *node = hbbtvfav, *prev = hbbtvfav;
159
160        while(node != NULL)
161        {
162                if(ostrcmp(node->name, name) == 0)
163                {
164                        if(node == hbbtvfav)
165                                hbbtvfav = node->next;
166                        else
167                                prev->next = node->next;
168
169                        free(node);
170                        node = NULL;
171                        ret = 0;
172                        break;
173                }
174
175                prev = node;
176                node = node->next;
177        }
178        debug(1000, "out");
179        return ret;
180}
181
182void freehbbtvfav()
183{
184        debug(1000, "in");
185        struct hbbtvfav *node = hbbtvfav, *prev = hbbtvfav;
186
187        while(node != NULL)
188        {
189                prev = node;
190                node = node->next;
191                if(prev != NULL)
192                        delhbbtvfav(prev->name);
193        }
194        debug(1000, "out");
195}
196
197void operarcthread()
198{
199        int ret = 0;
200
201        debug(788, "opera create rc socket");
202
203        ret = sockcreate(&operarcsockfd, RC_TITAN, 1);
204        if(ret != 0) return;
205
206        //closeonexec(operarcsockfd);
207
208        debug(788, "opera wait for rc accept");
209        operarcthread_ok = 1;
210        operarcconnfd = sockaccept(&operarcsockfd, 0);
211        debug(788, "opera got rc accept");
212}
213
214void operareceiverthread(struct stimerthread* self)
215{
216        int ret = 0, control_w_fd = -1;
217        fd_set rfds;
218        struct timeval tv;
219        unsigned char* buf = NULL;
220
221        if(self == NULL) return;
222
223        control_w_fd = open(CONTROL_PIPE_W, O_RDONLY);
224        if(control_w_fd < 0)
225        {
226                perr("open or create %s", CONTROL_PIPE_W);
227                return;
228        }
229
230        fcntl(control_w_fd, F_SETFL, fcntl(control_w_fd, F_GETFL) | O_NONBLOCK);
231        //closeonexec(control_w_fd);
232
233        buf = malloc(MINMALLOC);
234        if(buf == NULL)
235        {
236                close(control_w_fd);
237                err("no mem");
238                return;
239        }
240
241        debug(788, "opera receive thread start");
242
243        operareceiverthread_ok = 1;
244        while(self->aktion != STOP)
245        {
246                tv.tv_sec = 1;
247                tv.tv_usec = 0;
248                FD_ZERO(&rfds);
249                FD_SET(control_w_fd, &rfds);
250
251                ret = TEMP_FAILURE_RETRY(select(control_w_fd + 1, &rfds, NULL, NULL, &tv));
252
253                if(ret > 0)
254                {
255                        memset(buf, 0, MINMALLOC);
256                        unsigned char* pbuf = buf;
257                        while(pbuf - buf < MINMALLOC)
258                        {
259                                unsigned char c;
260
261                                ret = read(control_w_fd, &c, 1);
262                                if(ret == 1)
263                                {
264                                        if(c == '\n') break;
265                                        *pbuf = c;
266                                        pbuf++;
267                                }
268                        }
269                        if(pbuf != buf)
270                                operareceivercb((char*)buf);
271                }
272                else if(ret == 0) //timeout
273                        continue;
274                else //error
275                {
276                        perr("select failed");
277                        usleep(10000);
278                }
279         }
280
281         close(control_w_fd); control_w_fd = -1;
282         free(buf); buf = NULL;
283         debug(788, "opera receive thread end");
284}
285
286void operasendkey(char* rckey)
287{
288        if(operarcconnfd > -1 && rckey != NULL)
289                socksend(&operarcconnfd, (unsigned char*)rckey, strlen(rckey), -1);
290        else
291        {
292                err("no opera rc context sockfd=%d", operarcconnfd);
293        }
294}
295
296//flag 0: stop live tv and start play service
297//flag 1: stop play and start live service
298//flag 2: stop play
299int operaservice(char* url, int flag)
300{
301        char* tmpstr = NULL;
302
303        //stop live tv service and start play
304        if(flag == 0)
305        {
306                if(operaservicestate == 100)
307                {
308                        int ret = servicestop(status.aktservice, 1, 1);
309                        if(ret == 1) return 1;
310                }
311
312                free(operaplayurl); operaplayurl = NULL;
313                operaplayurl = ostrcat(url, NULL, 0, 0);
314                playerstop();
315                playerafterend();
316                playerstart(operaplayurl);
317                operaservicestate = 1;
318        }
319
320        //stop play and start live service
321        if(flag == 1 && operaservicestate != 100)
322        {
323                //stop player if running
324                playerstop();
325                playerafterend();
326                free(operaplayurl); operaplayurl = NULL;
327
328                if(status.aktservice->channel != NULL)
329                {
330                        tmpstr = ostrcat(status.aktservice->channellist, NULL, 0, 0);
331                        servicestart(status.aktservice->channel, tmpstr, NULL, 3);
332                }
333                else
334                {
335                        tmpstr = ostrcat(status.lastservice->channellist, NULL, 0, 0);
336                        servicestart(status.lastservice->channel, tmpstr, NULL, 0);
337                }
338                free(tmpstr); tmpstr = NULL;
339                operaservicestate = 100;
340        }
341
342        //stop play
343        if(flag == 2 && operaservicestate != 100)
344        {
345                playerstop();
346                playerafterend();
347                free(operaplayurl); operaplayurl = NULL;
348                operaservicestate = 2;
349        }
350
351        return 0;
352}
353
354void screenopera(char* url)
355{
356        int rcret = 0, i = 0;
357        char* tmpstr = NULL, *savedir = NULL, *dirbuf = NULL;;
358        struct stimerthread* operareceiver = NULL;
359        char* opera_root, *opera_bin = NULL, *opera_dir = NULL;
360        char* opera_home = NULL, *opera_fonts = NULL, *opera_widgets = NULL;
361
362        if(isdir("/var/swap/titanplugins/hbbtv/opera"))
363                opera_root = ostrcat("/var/swap/titanplugins/hbbtv/opera", NULL, 0, 0);
364        else
365                opera_root = ostrcat("/mnt/swapextensions/titanplugins/hbbtv/opera", NULL, 0, 0);
366
367        opera_bin = ostrcat(opera_root, "/bin/opera", 0, 0);
368        opera_dir = ostrcat(opera_root, "/opera_dir", 0, 0);
369        opera_home = ostrcat(opera_root, "/opera_home/", 0, 0);
370        opera_fonts = ostrcat(opera_root, "/fonts", 0, 0);
371        opera_widgets = ostrcat(opera_root, "/widgets", 0, 0);
372
373        resettvpic();
374        drawscreen(skin, 0, 0);
375
376        debug(788, "step 1, set env");
377        //setenv("DFBARGS", "pixelformat=ARGB,no-cursor,bg-none,no-linux-input-grab,no-vt", 1);
378        setenv("OPERA_MULTITAP", "NO", 1);
379        setenv("OPERA_SHOW_STATUSWINDOW", "NO", 1);
380        setenv("OPERA_FB_BORDERWIDTH", "0", 1);
381        setenv("OPERA_SHOW_IMEWINDOW", "NO", 1);
382        setenv("OPERA_SHOW_NAVIGATIONWINDOW", "NO", 1);
383        setenv("OPERA_SHOW_MOUSEPOINTER", "NO", 1);
384        setenv("OPERA_SHOW_HIGHLIGHT", "NO", 1);
385        setenv("OPERA_ESC_EXIT", "YES", 1);
386        setenv("FREETYPE_FONT_SET", "YES", 1);
387        setenv("OPERA_ROOT", opera_root, 1);
388        setenv("OPERA_FB_SIZE", "1280x720", 1);
389        setenv("OPERA_DIR", opera_dir, 1);
390        setenv("OPERA_HOME", opera_home, 1);
391        setenv("OPERA_FONTS", opera_fonts, 1);
392        setenv("OPERA_WIDGETS", opera_widgets, 1);
393        setenv("LD_LIBRARY_PATH", opera_root, 1); // + ":" + os.environ["LD_LIBRARY_PATH"]
394
395        unlink(CONTROL_PIPE_W);
396        unlink(CONTROL_PIPE_R);
397        unlink(RC_TITAN);
398
399        mkfifo(CONTROL_PIPE_W, 0666);
400        mkfifo(CONTROL_PIPE_R, 0666);
401        //mkfifo(RC_TITAN, 0666);
402
403        debug(788, "step 2, start opera");
404        //writesys("/proc/cpu/alignment", "0", 0);
405
406        operarcthread_ok = 0;
407        operareceiverthread_ok = 0;
408        addtimer(&operarcthread, START, 10, 1, NULL, NULL, NULL);
409        operareceiver = addtimer(&operareceiverthread, START, 10, 1, NULL, NULL, NULL);
410
411        //wait for threads
412        int count = 0;
413        while(operarcthread_ok == 0 || operareceiverthread_ok == 0)
414        {
415                usleep(100000);
416                count++;
417                if(count > 20) break;
418        }
419
420        //save working dir
421        dirbuf = malloc(PATH_MAX);
422        if(dirbuf != NULL)
423        {
424                savedir = getcwd(dirbuf, PATH_MAX);
425                chdir(opera_root);
426        }
427
428        fbsave();
429
430        tmpstr = ostrcat(tmpstr, opera_bin, 1, 0);
431        tmpstr = ostrcat(tmpstr, " -u ", 1, 0);
432        tmpstr = ostrcat(tmpstr, url, 1, 0);
433        tmpstr = ostrcat(tmpstr, " --dfb:mode=1280x720,no-debug,no-vt,no-vt-switch &", 1, 0);
434        system(tmpstr);
435        free(tmpstr); tmpstr = NULL;
436
437        //free all opera vars
438        free(opera_root); opera_root = NULL;
439        free(opera_bin); opera_bin = NULL;
440        free(opera_dir); opera_dir = NULL;
441        free(opera_home); opera_home = NULL;
442        free(opera_fonts); opera_fonts = NULL;
443        free(opera_widgets); opera_widgets = NULL;
444
445        //reset working dir
446        if(savedir != NULL)
447                chdir(dirbuf);
448        free(dirbuf); dirbuf = NULL;
449
450        while(1)
451        {
452                rcret = waitrc(NULL, 1000, 0);
453
454                //check for player EOF
455                if(operaservicestate < 2 && !playerisplaying())
456                        operaservice(NULL, 1);
457
458                if(rcret == getrcconfigint("rchbbtv", NULL) || rcret == getrcconfigint("rcrecord", NULL))
459                {
460                        //operasendkey("ESC\n");
461                        break;
462                }
463                else if(rcret == getrcconfigint("rcexit", NULL))
464                        operasendkey("BACK\n");
465                else if(rcret == getrcconfigint("rcred", NULL))
466                        operasendkey("RED\n");
467                else if(rcret == getrcconfigint("rcgreen", NULL))
468                        operasendkey("GREEN\n");
469                else if(rcret == getrcconfigint("rcyellow", NULL))
470                        operasendkey("YELLOW\n");
471                else if(rcret == getrcconfigint("rcblue", NULL))
472                        operasendkey("BLUE\n");
473                else if(rcret == getrcconfigint("rcok", NULL))
474                {
475                        operasendkey("OK\n");
476                        operasendkey("ENTER\n");
477                }
478                else if(rcret == getrcconfigint("rcup", NULL))
479                        operasendkey("UP\n");
480                else if(rcret == getrcconfigint("rcdown", NULL))
481                        operasendkey("DOWN\n");
482                else if(rcret == getrcconfigint("rcleft", NULL))
483                        operasendkey("LEFT\n");
484                else if(rcret == getrcconfigint("rcright", NULL))
485                        operasendkey("RIGHT\n");
486                else if(rcret == getrcconfigint("rc1", NULL))
487                        operasendkey("1\n");
488                else if(rcret == getrcconfigint("rc2", NULL))
489                        operasendkey("2\n");
490                else if(rcret == getrcconfigint("rc3", NULL))
491                        operasendkey("3\n");
492                else if(rcret == getrcconfigint("rc4", NULL))
493                        operasendkey("4\n");
494                else if(rcret == getrcconfigint("rc5", NULL))
495                        operasendkey("5\n");
496                else if(rcret == getrcconfigint("rc6", NULL))
497                        operasendkey("6\n");
498                else if(rcret == getrcconfigint("rc7", NULL))
499                        operasendkey("7\n");
500                else if(rcret == getrcconfigint("rc8", NULL))
501                        operasendkey("8\n");
502                else if(rcret == getrcconfigint("rc9", NULL))
503                        operasendkey("9\n");
504                else if(rcret == getrcconfigint("rc0", NULL))
505                        operasendkey("0\n");
506        }
507
508        if(operareceiver != NULL)
509        {
510                operareceiver->aktion = STOP;
511                while(operareceiver != NULL && operareceiver->status != DEACTIVE)
512                {
513                        usleep(100000);
514                        i++; if(i > 20) break;
515                }
516
517                if(i > 20)
518                {
519                        err("detect hanging timer sub thread (operareceiver)");
520                }
521        }
522
523        sockclose(&operarcsockfd);
524        sockclose(&operarcconnfd);
525        close(opera_control_r_fd);
526
527        debug(788, "killall -9 opera");
528        tmpstr = ostrcat(tmpstr, "killall -9 opera", 1, 0);
529        system(tmpstr);
530        free(tmpstr); tmpstr = NULL;
531
532        free(operaplayurl); operaplayurl = NULL;
533
534        //writesys("/proc/cpu/alignment", "3", 0);
535
536        //setvideomode("720p50", 0);
537        //changefbresolution("720p50");
538        //sleep(3);
539        fbrestore();
540
541        operaservice(NULL, 1); //stop play, start live tv
542
543        //reset tv pic size
544        status.tvpic = 1;
545        resettvpic();
546        clearfball();
547}
548
549void operareceivercb(char* cmd)
550{
551        int count = 0;
552        char* tmpstr = NULL;
553        struct splitstr* ret = NULL;
554
555        debug(788, "cmd=%s", cmd);
556
557        tmpstr = ostrcat(cmd, NULL, 0, 0);
558        ret = strsplit(tmpstr, " ", &count);
559
560        if(ret != NULL && count > 0)
561        {
562                if(ostrcmp("HELLO", (&ret[0])->part) == 0)
563                {
564                        opera_control_r_fd = open(CONTROL_PIPE_R, O_WRONLY);
565                        if(opera_control_r_fd < 0)
566                        {
567                                perr("open or create "CONTROL_PIPE_R);
568                        }
569                }
570                else if(ostrcmp("AvSetWin", (&ret[0])->part) == 0)
571                {
572                        int x = 0, y = 0, w = 0, h = 0;
573                        float xw = 720.0 / 1280.0;
574                        float yh = 576.0 / 720.0;
575                        char* position = NULL;
576
577                        if(count > 1) x = atoi((&ret[1])->part) * xw;
578                        if(count > 2) y = atoi((&ret[2])->part) * yh;
579                        if(count > 3) w = atoi((&ret[3])->part) * xw;
580                        if(count > 4) h = atoi((&ret[4])->part) * yh;
581
582                        if(w == 0 && h == 0)
583                        {
584                                w = 720;
585                                h = 576;
586                        }
587
588                        position = ostrcat(position, oitoax(x), 1, 1);
589                        position = ostrcat(position, " ", 1, 0);
590                        position = ostrcat(position, oitoax(y), 1, 1);
591                        position = ostrcat(position, " ", 1, 0);
592                        position = ostrcat(position, oitoax(w), 1, 1);
593                        position = ostrcat(position, " ", 1, 0);
594                        position = ostrcat(position, oitoax(h), 1, 1);
595
596                        debug(788, "change tv pic to: %s", position);
597                        writesys("/proc/stb/vmpeg/0/dst_all", position, 0);
598                }
599                else if(ostrcmp("AvGetFullScreen", (&ret[0])->part) == 0)
600                {
601                        char* w = NULL, *h = NULL;
602
603                        w = readsys("/proc/stb/vmpeg/0/dst_width", 1);
604                        h = readsys("/proc/stb/vmpeg/0/dst_height", 1);
605
606                        if(ostrcmp(w, "2d0") == 0 && ostrcmp(h, "240") == 0)
607                                write(opera_control_r_fd, "AvGetFullScreen 1\n", 18);
608                        else
609                                write(opera_control_r_fd, "AvGetFullScreen 0\n", 18);
610
611                        free(w); w = NULL;
612                        free(h); h = NULL;
613                }
614                else if(ostrcmp("AvGetVisible", (&ret[0])->part) == 0)
615                {
616                        unsigned long val = readsysul("/proc/stb/video/alpha", 1);
617
618                        if(val == 0)
619                                write(opera_control_r_fd, "AvGetVisible 1\n", 15);
620                        else
621                                write(opera_control_r_fd, "AvGetVisible 0\n", 15);
622                }
623                /*
624                else if(ostrncmp("AvSetVisible", (&ret[0])->part) == 0)
625                {
626                        //if(count > 1 && ostrcmp("1", (&ret[1])->part) == 0)
627                        //{
628                        //      writesys("/proc/stb/video/alpha", "255", 0);
629                        //else
630                        //      writesys("/proc/stb/video/alpha", "0", 0);
631                        //}
632                }
633                */
634                else if(ostrcmp("AvPlay", (&ret[0])->part) == 0)
635                {
636                        if(count > 2)
637                        {
638                                if(ostrcmp("100", (&ret[2])->part) == 0) //play or continue
639                                {
640                                        if(ostrcmp(operaplayurl, (&ret[1])->part) != 0) //different url, so play
641                                        {
642                                                operaservice((&ret[1])->part, 0); //stop live tv and play
643                                        }
644                                        else
645                                        {
646                                                playercontinue();
647                                                operaservicestate = 1;
648                                        }
649                                }
650                                else if(ostrcmp("0", (&ret[2])->part) == 0) //pause
651                                {
652                                        playerpause();
653                                        operaservicestate = 0;
654                                }
655                        }
656                }
657                else if(ostrcmp("AvStop", (&ret[0])->part) == 0)
658                {
659                        operaservice(NULL, 2); //stop play
660                }
661                else if(ostrcmp("AvGetPos", (&ret[0])->part) == 0)
662                {
663                        char* tmppos = NULL;
664                        unsigned long pos = 0;
665
666                        pos = playergetpts() / 90000;
667
668                        tmppos = ostrcat(tmppos, "AvGetPos ", 1, 0);
669                        tmppos = ostrcat(tmppos, olutoa(pos), 1, 1);
670                        tmppos = ostrcat(tmppos, "\n", 1, 0);
671
672                        if(tmppos != NULL)
673                                write(opera_control_r_fd, tmppos, strlen(tmppos));
674
675                        free(tmppos); tmppos = NULL;
676                }
677                else if(ostrcmp("AvGetDuration", (&ret[0])->part) == 0)
678                {
679                        char* tmplen = NULL;
680                        unsigned long len = 0;
681
682                        len = playergetlength();
683
684                        tmplen = ostrcat(tmplen, "AvGetDuration ", 1, 0);
685                        tmplen = ostrcat(tmplen, olutoa(len), 1, 1);
686                        tmplen = ostrcat(tmplen, "\n", 1, 0);
687
688                        if(tmplen != NULL)
689                                write(opera_control_r_fd, tmplen, strlen(tmplen));
690
691                        free(tmplen); tmplen = NULL;
692                }
693                else if(ostrcmp("AvGetState", (&ret[0])->part) == 0)
694                {
695                        char* tmpstate = NULL;
696
697                        tmpstate = ostrcat(tmpstate, "AvGetState ", 1, 0);
698                        if(operaservicestate == 1)
699                                tmpstate = ostrcat(tmpstate, "1", 1, 0);
700                        else
701                                tmpstate = ostrcat(tmpstate, "0", 1, 0);
702                        tmpstate = ostrcat(tmpstate, "\n", 1, 0);
703
704                        if(tmpstate != NULL)
705                                write(opera_control_r_fd, tmpstate, strlen(tmpstate));
706
707                        free(tmpstate); tmpstate = NULL;
708                }
709                else if(ostrcmp("ReleaseHandle", (&ret[0])->part) == 0)
710                {
711                        if(count > 1 && ostrcmp("1", (&ret[1])->part) == 0) //VOD
712                        {
713                                operaservice(NULL, 1); //stop play, start live tv
714                        }
715                }
716        }
717
718        free(tmpstr); tmpstr = NULL;
719        free(ret); ret = NULL;
720}
721
722void screenoperafav()
723{
724        //int ret = 0;
725        struct menulist* mlist = NULL, *mbox = NULL, *tmpmbox = NULL;
726        struct hbbtvfav *node = NULL;
727
728        //ret = servicestop(status.aktservice, 1, 0);
729        //if(ret == 1) return;
730        //setfbtransparent(255);
731
732        readhbbtvfav(getconfig("hbbtvfavfile", NULL));
733        node = hbbtvfav;
734
735        if(status.aktservice->channel != NULL && status.aktservice->channel->hbbtvurl != NULL)
736        {
737                debug(788, "hbbtvurl=%s", status.aktservice->channel->hbbtvurl);
738                tmpmbox = addmenulist(&mlist, "Channel HBBTV", NULL, NULL, 0, 0);
739                if(tmpmbox != NULL)
740                        tmpmbox->param = ostrcat(status.aktservice->channel->hbbtvurl, NULL, 0, 0);
741        }
742
743        while(node != NULL)
744        {
745                tmpmbox = addmenulist(&mlist, node->name, NULL, NULL, 0, 0);
746                if(tmpmbox != NULL)
747                        tmpmbox->param = ostrcat(node->addr, NULL, 0, 0);
748
749                node = node->next;
750        }
751
752start:
753        drawscreen(skin, 0, 0);
754        mbox = menulistbox(mlist, "menulist", "HBBTV Favoriten", NULL, NULL, 0, 0);
755        if(mbox != NULL)
756        {
757                if(mbox->param != NULL)
758                {
759                        drawscreen(skin, 0, 0);
760                        screenopera(mbox->param);
761                }
762                goto start;
763        }
764
765        freemenulist(mlist, 1);
766        freehbbtvfav();
767        //setosdtransparent(getskinconfigint("osdtransparent", NULL));
768        //if(status.lastservice != NULL)
769        //      servicestart(status.lastservice->channel, NULL, NULL, 0);
770        //flushrc(500);
771}
772
773#endif
Note: See TracBrowser for help on using the repository browser.