source: titan/plugins/readerconfig/readerconfig.h @ 32524

Last change on this file since 32524 was 32524, checked in by obi, 6 years ago

add mixer support

File size: 11.7 KB
Line 
1#ifndef READERCONFIG_H
2#define READERCONFIG_H
3
4struct oscam
5{
6        char* enable;
7        char* label;
8        char* device;
9        char* rest;
10        struct oscam* next;
11};
12struct oscam* oscam = NULL;
13
14struct oscam* addoscam(char *enable, char* label, char* device, char* rest, struct oscam* last)
15{
16        struct oscam *newnode = NULL, *prev = NULL, *node = oscam;
17
18        newnode = (struct oscam*)calloc(1, sizeof(struct oscam));
19        if(newnode == NULL)
20        {
21                err("no memory");
22                return NULL;
23        }
24
25        if(last != NULL)
26        {
27                last->enable = ostrcat(enable, NULL, 0, 0);
28                last->label = ostrcat(label, NULL, 0, 0);
29                last->device = ostrcat(device, NULL, 0, 0);
30        }
31        newnode->rest = ostrcat(rest, NULL, 0, 0);
32
33        if(last == NULL)
34        {
35                while(node != NULL)
36                {
37                        prev = node;
38                        node = node->next;
39                }
40        }
41        else
42        {
43                prev = last;
44                node = last->next;
45        }
46
47        if(prev == NULL)
48                oscam = newnode;
49        else
50                prev->next = newnode;
51
52        newnode->next = node;
53
54        return newnode;
55}
56
57int readoscam(const char* filename)
58{
59        debug(1000, "in");
60        FILE *fd = NULL;
61        char *fileline = NULL;
62        char *enable = NULL, *label = NULL, *device = NULL, *rest = NULL;
63        int linecount = 0, len = 0;
64        struct oscam* last = NULL;
65
66        fileline = malloc(MINMALLOC);
67        if(fileline == NULL)
68        {
69                err("no memory");
70                return 1;
71        }
72
73        fd = fopen(filename, "r");
74        if(fd == NULL)
75        {
76                perr("can't open %s", filename);
77                free(fileline);
78                return 1;
79        }
80
81        while(fgets(fileline, MINMALLOC, fd) != NULL)
82        {
83                len = strlen(fileline) - 1;
84                if(len >= 0 && fileline[len] == '\n')
85                        fileline[len] = '\0';
86                len--;
87                if(len >= 0 && fileline[len] == '\r')
88                        fileline[len] = '\0';
89
90                linecount++;
91
92                fileline = strstrip(fileline);
93
94                if(ostrstrcase(fileline, "enable") == fileline)
95                {
96                        char* pos = strchr(fileline, '=');
97                        if(pos != NULL)
98                        {
99                                pos++;
100                                free(enable); enable = NULL;
101                                enable = ostrcat(strstrip(pos), NULL, 0, 0);
102                        }
103                }
104                else if(ostrstrcase(fileline, "Label") == fileline)
105                {
106                        char* pos = strchr(fileline, '=');
107                        if(pos != NULL)
108                        {
109                                pos++;
110                                free(label); label = NULL;
111                                label = ostrcat(strstrip(pos), NULL, 0, 0);
112                        }
113                }
114                else if(ostrstrcase(fileline, "device") == fileline)
115                {
116                        char* pos = strchr(fileline, '=');
117                        if(pos != NULL)
118                        {
119                                pos++;
120                                free(device); device = NULL;
121                                device = ostrcat(strstrip(pos), NULL, 0, 0);
122                        }
123                }
124                else
125                {
126                        rest = ostrcat(rest, fileline, 1, 0);
127                        rest = ostrcat(rest, "\n", 1, 0);
128                }
129
130                if(ostrstrcase(fileline, "[reader]") == fileline)
131                {
132                        //add to struct
133                        last = addoscam(enable, label, device, rest, last);
134
135                        free(enable); enable = NULL;
136                        free(label); label = NULL;
137                        free(device); device = NULL;
138                        free(rest); rest = NULL;
139                }
140        }
141
142        //add to struct
143        last = addoscam(enable, label, device, rest, last);
144
145        free(enable); enable = NULL;
146        free(label); label = NULL;
147        free(device); device = NULL;
148        free(rest); rest = NULL;
149
150        free(fileline);
151        fclose(fd);
152        return 0;
153}
154
155int deloscam(struct oscam* onode)
156{
157        int ret = 1;
158        struct oscam *node = oscam, *prev = oscam;
159
160        while(node != NULL)
161        {
162                if(onode == node)
163                {
164                        ret = 0;
165                        if(node == oscam)
166                                oscam = node->next;
167                        else
168                                prev->next = node->next;
169
170                        free(node->enable);
171                        node->enable = NULL;
172
173                        free(node->label);
174                        node->label = NULL;
175
176                        free(node->device);
177                        node->device = NULL;
178
179                        free(node->rest);
180                        node->rest = NULL;
181
182                        free(node);
183                        node = NULL;
184
185                        break;
186                }
187
188                prev = node;
189                node = node->next;
190        }
191
192        return ret;
193}
194
195void freeoscam()
196{
197        struct oscam *node = oscam, *prev = oscam;
198
199        while(node != NULL)
200        {
201                prev = node;
202                node = node->next;
203                if(prev != NULL)
204                        deloscam(prev);
205        }
206}
207
208int writeoscam(const char *filename)
209{
210        debug(1000, "in");
211        FILE *fd = NULL;
212        struct oscam *node = oscam;
213        int ret1 = 0, ret2 = 0, ret3 = 0, ret4 = 0;
214
215        fd = fopen(filename, "w");
216        if(fd == NULL)
217        {
218                perr("can't open %s", filename);
219                return 1;
220        }
221
222        while(node != NULL)
223        {
224                if(node->rest != NULL) ret1 = fprintf(fd, "%s", node->rest);
225                if(node->enable != NULL) ret2 = fprintf(fd, "enable = %s\n", node->enable);
226                if(node->label != NULL) ret3 = fprintf(fd, "Label = %s\n", node->label);
227                if(node->device != NULL) ret4 = fprintf(fd, "device = %s\n", node->device);
228                if(ret1 < 0 || ret2 < 0 || ret3 < 0 || ret4 < 0)
229                {
230                        perr("writting file %s", filename);
231                }
232                node = node->next;
233        }
234
235        fclose(fd);
236        return 0;
237}
238
239void screenoscamconfig(struct oscam* node, char* file)
240{
241        int rcret = -1;
242        struct skin* oscamconfig = getscreen("readerconfig");
243        struct skin* listbox = getscreennode(oscamconfig, "listbox");
244        struct skin* enable = getscreennode(oscamconfig, "enable");
245        struct skin* device = getscreennode(oscamconfig, "device");
246        struct skin* menutitle = getscreennode(oscamconfig, "menutitle");
247        struct skin* tmp = NULL;
248
249        if(node == NULL) return;
250
251        listbox->aktline = 1;
252        listbox->aktpage = -1;
253
254        addchoicebox(enable, "0", _("no"));
255        addchoicebox(enable, "1", _("yes"));
256        setchoiceboxselection(enable, node->enable);
257
258        addchoicebox(device, "/dev/sci0", _("first slot"));
259        addchoicebox(device, "/dev/sci1", _("second slot"));
260        setchoiceboxselection(device, node->device);
261
262        if(node->device == NULL || (ostrcmp(node->device, "/dev/sci0") != 0 && ostrcmp(node->device, "/dev/sci1") != 0))
263                device->hidden = YES;
264        else
265                device->hidden = NO;
266
267        char* tmpstr = NULL;
268        tmpstr = ostrcat(_("Reader Configuration"), " : ", 0, 0);
269        tmpstr = ostrcat(tmpstr, file, 1, 0);
270        changetext(menutitle, tmpstr);
271        free(tmpstr), tmpstr = NULL;
272
273        drawscreen(oscamconfig, 0, 0);
274        addscreenrc(oscamconfig, listbox);
275               
276        tmp = listbox->select;
277        while(1)
278        {
279                addscreenrc(oscamconfig, tmp);
280                rcret = waitrc(oscamconfig, 0, 0);
281                tmp = listbox->select;
282
283                if(rcret == getrcconfigint("rcexit", NULL)) break;
284                if(rcret == getrcconfigint("rcok", NULL))
285                {
286                        free(node->enable);
287                        node->enable = ostrcat(enable->ret, NULL, 0, 0);
288
289                        if(node->device != NULL && (ostrcmp(node->device, "/dev/sci0") == 0 || ostrcmp(node->device, "/dev/sci1") == 0))
290                        {
291                                free(node->device);
292                                node->device = ostrcat(device->ret, NULL, 0, 0);
293                        }
294                        break;
295                }
296        }
297
298        delownerrc(oscamconfig);
299        clearscreen(oscamconfig);
300}
301
302char* getoscamconfig()
303{
304        int count = 0;
305        char* tmpstr = NULL;
306        struct menulist* mlist = NULL, *mbox = NULL, *tmpmlist = NULL;
307       
308        if(file_exist("/mnt/swapextensions/keys/oscam.server"))
309        {
310                tmpmlist = addmenulist(&mlist, _("Use config from Flash (permanent)"), NULL, NULL, 0, 0);
311                changemenulistparam(tmpmlist, "/mnt/swapextensions", NULL, NULL, NULL);
312                free(tmpstr); tmpstr = NULL;
313                tmpstr = ostrcat("/mnt/swapextensions", NULL, 0, 0);
314                count++;
315        }
316       
317        if(file_exist("/var/keys/oscam.server"))
318        {
319                tmpmlist = addmenulist(&mlist, _("Use config from Flash (temporary)"), NULL, NULL, 0, 0);
320                changemenulistparam(tmpmlist, "/var", NULL, NULL, NULL);
321                free(tmpstr); tmpstr = NULL;
322                tmpstr = ostrcat("/var", NULL, 0, 0);
323                count++;
324        }
325       
326        if(file_exist("/var/swap/keys/oscam.server"))
327        {
328                tmpmlist = addmenulist(&mlist, _("Use config from Stick or HDD"), NULL, NULL, 0, 0);
329                changemenulistparam(tmpmlist, "/var/swap", NULL, NULL, NULL);
330                free(tmpstr); tmpstr = NULL;
331                tmpstr = ostrcat("/var/swap", NULL, 0, 0);
332                count++;
333        }
334       
335        if(count > 1)
336        {
337                free(tmpstr); tmpstr = NULL;
338                mbox = menulistbox(mlist, NULL, _("Reader Configuration"), _("Choose your Config File from the following list"), NULL, NULL, 0, 0);
339                if(mbox != NULL)
340                        tmpstr = ostrcat(mbox->param, NULL, 0, 0);
341        }
342        else
343                textbox(_("Message"), _("No config file found."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0);
344       
345        freemenulist(mlist, 0); mlist = NULL;
346        return tmpstr;
347}
348
349void screenoscam(char* cfgfile)
350{
351        int rcret = -1;
352        struct skin* skinoscam = getscreen("reader");
353        struct skin* listbox = getscreennode(skinoscam, "listbox");
354        struct skin* menutitle = getscreennode(skinoscam, "menutitle");
355        struct skin* b2 = getscreennode(skinoscam, "b2");
356
357        struct skin* tmp = NULL;
358        struct oscam* node = NULL;
359        char* tmpstr = NULL, *file = NULL, *cmd = NULL, *dvbapi = NULL;
360
361        if(cfgfile == NULL)
362        {
363                tmpstr = getoscamconfig();     
364                if(tmpstr == NULL) return;
365                dvbapi = ostrcat(tmpstr, "/keys/oscam.dvbapi", 0, 0);
366                file = ostrcat(tmpstr, "/keys/oscam.server", 0, 0);
367                free(tmpstr), tmpstr = NULL; 
368        }
369        else
370        {
371                cmd = ostrcat("/sbin/emu.sh keydir ", cfgfile, 0, 0);
372                tmpstr = string_newline(command(cmd));
373                dvbapi = ostrcat(tmpstr, "/oscam.dvbapi", 0, 0);
374                file = ostrcat(tmpstr, "/oscam.server", 0, 0);
375                free(cmd), cmd = NULL;
376                free(tmpstr), tmpstr = NULL;
377        }
378       
379        readoscam(file);
380        listbox->aktline = 1;
381        listbox->aktpage = -1;
382
383        tmpstr = ostrcat(_("Reader Selection"), " : ", 0, 0);
384        tmpstr = ostrcat(tmpstr, file, 1, 0);
385        changetext(menutitle, tmpstr);
386        free(tmpstr), tmpstr = NULL;
387
388        if(file_exist(dvbapi))
389                changetext(b2, _("Dvbapi (enabled)"));
390        else
391                changetext(b2, _("Dvbapi (disabled)"));
392
393start:
394
395        tmp = NULL;
396        node = oscam;
397        delmarkedscreennodes(skinoscam, 1);
398        delownerrc(skinoscam);
399
400        while(node != NULL)
401        {
402                if(node->label == NULL || node->enable == NULL)
403                {
404                        node = node->next;
405                        continue;
406                }
407                tmp = addlistbox(skinoscam, listbox, tmp, 1);
408                if(tmp != NULL)
409                {
410                        tmpstr = ostrcat(node->label, NULL, 0, 0);
411                        tmpstr = ostrcat(tmpstr, " -> ", 1, 0);
412                        if(ostrcmp(node->enable, "0") == 0)
413                                tmpstr = ostrcat(tmpstr, _("off"), 1, 0);
414                        else
415                        {
416                                tmpstr = ostrcat(tmpstr, _("on"), 1, 0);
417                                tmpstr = ostrcat(tmpstr, " (", 1, 0);
418                                tmpstr = ostrcat(tmpstr, _("Reader active"), 1, 0);
419                                tmpstr = ostrcat(tmpstr, ")", 1, 0);
420                        }
421
422                        changetext(tmp, tmpstr);
423                        free(tmpstr); tmpstr = NULL;
424                        tmp->del = 1;
425                        tmp->handle = (char*)node;
426                }
427                node = node->next;
428        }
429
430        drawscreen(skinoscam, 0, 0);
431        addscreenrc(skinoscam, listbox);
432
433        while(1)
434        {
435                rcret = waitrc(skinoscam, 0, 0);
436
437                if(rcret == getrcconfigint("rcexit", NULL)) break;
438                if(rcret == getrcconfigint("rcok", NULL))
439                {
440                        //write oscam
441                        if(writeoscam(file) == 0)
442                        {
443                                textbox(_("Message"), _("Oscam config written to medium !"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
444                                if(textbox(_("Message"), _("Restart Oscam ?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 5, 0) == 1)
445                                {
446                                        startinternreader(0);
447                                        char* cmd = NULL;
448                                        cmd = ostrcat("emu.sh restart" , NULL, 0, 0);
449                                        system(cmd);
450                                        free(cmd);
451                                }
452                                drawscreen(skinoscam, 0, 0);
453                                break;
454                        }
455                }
456                if(rcret == getrcconfigint("rcred", NULL))
457                {
458                        if(listbox->select != NULL && listbox->select->handle != NULL)
459                        {
460                                screenoscamconfig((struct oscam*)listbox->select->handle, file);
461                                goto start;
462                        }
463                }
464                if(rcret == getrcconfigint("rcgreen", NULL))
465                {
466                        int ret = 1;
467                       
468                        tmpstr = ostrcat(dvbapi, ".disable", 0, 0);
469                        if(tmpstr != NULL)
470                        {
471                                if(file_exist(dvbapi) == 1)
472                                {
473                                        ret = rename(dvbapi, tmpstr);
474                                        free(tmpstr); tmpstr = NULL;
475                                        tmpstr = ostrcat(tmpstr, _("Oscam dvbapi config disabled !"), 0, 0);
476                                        changetext(b2, _("Dvbapi (disabled)"));
477                                }
478                                else if(file_exist(tmpstr) == 1)
479                                {
480                                        ret = rename(tmpstr, dvbapi);
481                                        free(tmpstr); tmpstr = NULL;
482                                        tmpstr = ostrcat(tmpstr, _("Oscam dvbapi config enabled !"), 0, 0);
483                                        changetext(b2, _("Dvbapi (enabled)"));
484                                }
485                        }
486                       
487                        if(ret == 0)
488                        {
489                                textbox(_("Message"), tmpstr, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
490                                if(textbox(_("Message"), _("Restart Oscam ?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 5, 0) == 1)
491                                {
492                                        startinternreader(0);
493                                        char* cmd = NULL;
494                                        cmd = ostrcat("emu.sh restart" , NULL, 0, 0);
495                                        system(cmd);
496                                        free(cmd);
497                                }                       
498                        }
499                        free(tmpstr); tmpstr = NULL;
500                        drawscreen(skinoscam, 0, 0);   
501                }
502        }
503
504        startinternreader(1);
505
506        free(dvbapi); dvbapi = NULL;
507        free(file); file = NULL;
508        delmarkedscreennodes(skinoscam, 1);
509        freeoscam();
510        delownerrc(skinoscam);
511        clearscreen(skinoscam);
512}
513
514#endif
Note: See TracBrowser for help on using the repository browser.