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

Last change on this file since 16309 was 16309, checked in by nit, 12 years ago

fix tabs

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