source: titan/plugins/dlna/dlna.h @ 41285

Last change on this file since 41285 was 24522, checked in by obi, 10 years ago

fix gmediarender and add debug for minidlna

File size: 9.6 KB
Line 
1#ifndef DLNA_H
2#define DLNA_H
3
4extern struct inetwork* inetwork;
5
6struct dlna
7{
8        char* interface;
9        char* port;
10        char* name;
11        char* dir1;
12        char* dir2;
13        char* dir3;
14        char* dir4;
15};
16
17void dlnasetdefault(struct dlna* node)
18{
19        if(node == NULL) return;
20 
21        node->interface = ostrcat(node->interface, "eth0", 1, 0);
22        node->port = ostrcat(node->port, "8200", 1, 0);
23        node->name = ostrcat(node->name, "DLNASERVER", 1, 0);
24}
25
26void freedlnacontent(struct dlna* node)
27{
28        if(node == NULL) return;
29 
30        free(node->interface); node->interface = NULL;
31        free(node->port); node->port = NULL;
32        free(node->name); node->name = NULL;
33        free(node->dir1); node->dir1 = NULL;
34        free(node->dir2); node->dir2 = NULL;
35        free(node->dir3); node->dir3 = NULL;
36        free(node->dir4); node->dir4 = NULL;
37}
38
39int readdlna(const char* filename, struct dlna* node)
40{
41        debug(1000, "in");
42        FILE *fd = NULL;
43        char *fileline = NULL, *tmpstr = NULL;
44        int len = 0;
45 
46        if(node == NULL) return 1;
47
48        fileline = malloc(MINMALLOC);
49        if(fileline == NULL)
50        {
51                err("no memory");
52                return 1;
53        }
54
55        fd = fopen(filename, "r");
56        if(fd == NULL)
57        {
58                perr("can't open %s", filename);
59                free(fileline);
60                return 1;
61        }
62
63        while(fgets(fileline, MINMALLOC, fd) != NULL)
64        {
65                if(fileline[0] == '#' || fileline[0] == '\n')
66                        continue;
67                len = strlen(fileline) - 1;
68                if(len >= 0 && fileline[len] == '\n')
69                        fileline[len] = '\0';
70                len--;
71                if(len >= 0 && fileline[len] == '\r')
72                        fileline[len] = '\0';
73
74                tmpstr = ostrstrcase(fileline, "network_interface=");
75                if(tmpstr != NULL)
76                {
77                        tmpstr += 18;
78                        if(tmpstr != NULL)
79                        {
80                                tmpstr[strlen(tmpstr)] = '\0';
81                                free(node->interface);
82                                node->interface = ostrcat(tmpstr, NULL, 0, 0);
83                        }                               
84                }
85                tmpstr = ostrstrcase(fileline, "port=");
86                if(tmpstr != NULL)
87                {
88                        tmpstr += 5;
89                        if(tmpstr != NULL)
90                        {
91                                tmpstr[strlen(tmpstr)] = '\0';
92                                free(node->port);
93                                node->port = ostrcat(tmpstr, NULL, 0, 0);
94                        }                               
95                }
96                tmpstr = ostrstrcase(fileline, "friendly_name=");
97                if(tmpstr != NULL)
98                {
99                        tmpstr += 14;
100                        if(tmpstr != NULL)
101                        {
102                                tmpstr[strlen(tmpstr)] = '\0';
103                                free(node->name);
104                                node->name = ostrcat(tmpstr, NULL, 0, 0);
105                        }                               
106                }
107                tmpstr = ostrstrcase(fileline, "media_dir=");
108                if(tmpstr != NULL && node->dir1 == NULL)
109                {
110                        tmpstr += 10;
111                        if(tmpstr != NULL)
112                        {
113                                tmpstr[strlen(tmpstr)] = '\0';
114                                free(node->dir1);
115                                node->dir1 = ostrcat(tmpstr, NULL, 0, 0);
116                        }
117                        continue;
118                }
119                tmpstr = ostrstrcase(fileline, "media_dir=");
120                if(tmpstr != NULL && node->dir2 == NULL)
121                {
122                        tmpstr += 10;
123                        if(tmpstr != NULL)
124                        {
125                                tmpstr[strlen(tmpstr)] = '\0';
126                                free(node->dir2);
127                                node->dir2 = ostrcat(tmpstr, NULL, 0, 0);
128                        }
129                        continue;
130                }
131                tmpstr = ostrstrcase(fileline, "media_dir=");
132                if(tmpstr != NULL && node->dir3 == NULL)
133                {
134                        tmpstr += 10;
135                        if(tmpstr != NULL)
136                        {
137                                tmpstr[strlen(tmpstr)] = '\0';
138                                free(node->dir3);
139                                node->dir3 = ostrcat(tmpstr, NULL, 0, 0);
140                        }
141                        continue;
142                }
143                tmpstr = ostrstrcase(fileline, "media_dir=");
144                if(tmpstr != NULL && node->dir4 == NULL)
145                {
146                        tmpstr += 10;
147                        if(tmpstr != NULL)
148                        {
149                                tmpstr[strlen(tmpstr)] = '\0';
150                                free(node->dir4);
151                                node->dir4 = ostrcat(tmpstr, NULL, 0, 0);
152                        }
153                        continue;
154                }
155        }
156
157        free(fileline);
158        fclose(fd);
159        return 0;
160}
161
162int writedlna(const char* filename, struct dlna* node)
163{
164        char* savesettings = NULL;
165 
166        if(node == NULL) return 1;
167       
168        if(node->interface != NULL)
169        {
170                savesettings = ostrcat(savesettings, "network_interface=", 1, 0);
171                savesettings = ostrcat(savesettings, node->interface, 1, 0);
172                savesettings = ostrcat(savesettings, "\n", 1, 0);
173        }
174
175        if(node->port != NULL)
176        {
177                savesettings = ostrcat(savesettings, "port=", 1, 0);
178                savesettings = ostrcat(savesettings, oitoa(atoi(node->port)), 1, 1);
179                savesettings = ostrcat(savesettings, "\n", 1, 0);
180        }
181
182        if(node->name != NULL)
183        {
184                savesettings = ostrcat(savesettings, "friendly_name=", 1, 0);
185                savesettings = ostrcat(savesettings, node->name, 1, 0);
186                savesettings = ostrcat(savesettings, "\n", 1, 0);
187        }
188 
189        if(node->dir1 != NULL)
190        {
191                savesettings = ostrcat(savesettings, "media_dir=", 1, 0);
192                savesettings = ostrcat(savesettings, node->dir1, 1, 0);
193                savesettings = ostrcat(savesettings, "\n", 1, 0);
194        }
195 
196        if(node->dir2 != NULL)
197        {
198                savesettings = ostrcat(savesettings, "media_dir=", 1, 0);
199                savesettings = ostrcat(savesettings, node->dir2, 1, 0);
200                savesettings = ostrcat(savesettings, "\n", 1, 0);
201        }
202 
203        if(node->dir3 != NULL)
204        {
205                savesettings = ostrcat(savesettings, "media_dir=", 1, 0);
206                savesettings = ostrcat(savesettings, node->dir3, 1, 0);
207                savesettings = ostrcat(savesettings, "\n", 1, 0);
208        }
209 
210        if(node->dir4 != NULL)
211        {
212                savesettings = ostrcat(savesettings, "media_dir=", 1, 0);
213                savesettings = ostrcat(savesettings, node->dir4, 1, 0);
214                savesettings = ostrcat(savesettings, "\n", 1, 0);
215        }
216       
217        FILE* fd = fopen(filename, "w");
218        if(fd)
219        {
220                fprintf(fd, "%s\n", savesettings);
221                fclose(fd);
222        }
223        free(savesettings); savesettings = NULL;
224
225        return 0;
226}
227
228void screendlna()
229{
230        int rcret = -1, ret = 0;
231        struct skin* dlna = getscreen("dlnasettings");
232        struct skin* listbox = getscreennode(dlna, "listbox");
233        struct skin* startmode = getscreennode(dlna, "startmode");
234        struct skin* interface = getscreennode(dlna, "interface");
235        struct skin* port = getscreennode(dlna, "port");
236        struct skin* name = getscreennode(dlna, "name");
237        struct skin* dir1 = getscreennode(dlna, "dir1");
238        struct skin* dir2 = getscreennode(dlna, "dir2");
239        struct skin* dir3 = getscreennode(dlna, "dir3");
240        struct skin* dir4 = getscreennode(dlna, "dir4");
241        struct inetwork* net = inetwork;
242        struct skin* tmp = NULL;
243        char* tmpstr = NULL, *dlnastop = NULL, *dlnastart = NULL, *dlnaconfig = NULL;
244
245        struct dlna* node = (struct dlna*)malloc(sizeof(struct dlna));
246        if(node == NULL)
247        {
248                err("no mem");
249                return;
250        }
251        memset(node, 0, sizeof(struct dlna));
252
253        dlnasetdefault(node);
254       
255        if(file_exist("/var/etc/minidlna.conf") == 1)
256        {
257                dlnastop = "/var/usr/local/share/titan/plugins/dlna/dlna.sh stop /var/etc/minidlna.conf";
258                dlnastart = "/var/usr/local/share/titan/plugins/dlna/dlna.sh start /var/etc/minidlna.conf";
259                dlnaconfig = "/var/swap/etc/minidlna.conf";     
260        }
261        else if(file_exist("/var/swap/etc/minidlna.conf") == 1)
262        {
263                dlnastop = "/var/swap/usr/local/share/titan/plugins/dlna/dlna.sh stop /var/swap/etc/minidlna.conf";
264                dlnastart = "/var/swap/usr/local/share/titan/plugins/dlna/dlna.sh start /var/swap/etc/minidlna.conf";
265                dlnaconfig = "/var/swap/etc/minidlna.conf";     
266        }
267        else
268        {
269                dlnastop = "/mnt/swapextensions/usr/local/share/titan/plugins/dlna/dlna.sh stop /mnt/swapextensions/etc/minidlna.conf";
270                dlnastart = "/mnt/swapextensions/usr/local/share/titan/plugins/dlna/dlna.sh start /mnt/swapextensions/etc/minidlna.conf";
271                dlnaconfig = "/mnt/swapextensions/etc/minidlna.conf";   
272        }
273       
274        readdlna(dlnaconfig, node);
275       
276        addchoicebox(startmode, "n", _("no"));
277        addchoicebox(startmode, "y", _("yes"));
278        setchoiceboxselection(startmode, getownconfig("dlna"));
279
280        while(net != NULL)
281        {
282                if(net->flag == 1)
283                        addchoicebox(interface, net->device, net->device);
284                net = net->next;
285        }
286        setchoiceboxselection(interface, node->interface);
287 
288        changemask(port, "00000");
289        changeinput(port, node->port);
290        port->input = mask(port->input, 5, "0");
291
292        changeinput(name, node->name);
293
294        changeinput(dir1, node->dir1);
295        changeinput(dir2, node->dir2);
296        changeinput(dir3, node->dir3);
297        changeinput(dir4, node->dir4);
298
299        freedlnacontent(node);
300        drawscreen(dlna, 0, 0);
301        addscreenrc(dlna, listbox);
302
303        tmp = listbox->select;
304        while(1)
305        {
306                addscreenrc(dlna, tmp);
307                rcret = waitrc(dlna, 0, 0);
308                tmp = listbox->select;
309
310                if(rcret == getrcconfigint("rcexit", NULL)) break;
311
312                if(rcret == getrcconfigint("rcok", NULL) || rcret == getrcconfigint("rcgreen", NULL))
313                {
314                        node->interface = ostrcat(interface->ret, NULL, 0, 0);
315                        node->port = ostrcat(port->ret, NULL, 0, 0);
316                        node->name = ostrcat(name->ret, NULL, 0, 0);
317                        node->dir1 = ostrcat(dir1->ret, NULL, 0, 0);
318                        node->dir2 = ostrcat(dir2->ret, NULL, 0, 0);
319                        node->dir3 = ostrcat(dir3->ret, NULL, 0, 0);
320                        node->dir4 = ostrcat(dir4->ret, NULL, 0, 0);
321                        writedlna(dlnaconfig, node);
322                        freedlnacontent(node);
323                        if(startmode->ret != NULL) addownconfig("dlna", startmode->ret);
324                       
325                        if(rcret == getrcconfigint("rcok", NULL)) break;
326                       
327                        if(rcret == getrcconfigint("rcgreen", NULL))
328                        {
329                                debug(10, "cmd: %s", dlnastop);
330                                system(dlnastop);
331                                debug(10, "cmd: %s", dlnastart);
332                                ret = system(dlnastart);
333                                if(ret == 0)
334                                        textbox(_("Message"), _("DLNA started."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
335                                else
336                                        textbox(_("Message"), _("DLNA not started,\nPlease check your config."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
337                                drawscreen(dlna, 0, 0);
338                        }
339                }
340
341                if(rcret == getrcconfigint("rcyellow", NULL))
342                {
343                        debug(10, "cmd: %s", dlnastop);
344                        system(dlnastop);
345                        textbox(_("Message"), _("DLNA now stopped"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
346                        drawscreen(dlna, 0, 0);
347                }
348
349                if(rcret == getrcconfigint("rcblue", NULL))
350                {
351                        if(listbox->select != NULL && (ostrcmp(listbox->select->name, "dir1") == 0 || ostrcmp(listbox->select->name, "dir2") == 0 || ostrcmp(listbox->select->name, "dir3") == 0 || ostrcmp(listbox->select->name, "dir4") == 0))
352                        {
353                                clearscreen(dlna);
354                                tmpstr = screendir(listbox->select->ret, "", NULL, NULL, NULL, NULL, 0, "SELECT", 0, NULL, 0, NULL, 0, 700, 0, 650, 0, 0);
355                                if(tmpstr != NULL)
356                                        changeinput(listbox->select, tmpstr);
357                                free(tmpstr); tmpstr = NULL;
358
359                                drawscreen(dlna, 0, 0);
360                        }
361                }
362
363        }
364
365        freedlnacontent(node);
366        free(node);
367        delownerrc(dlna);
368        clearscreen(dlna);
369}
370
371#endif
Note: See TracBrowser for help on using the repository browser.