source: titan/plugins/multiimage/MultiImage.c @ 34385

Last change on this file since 34385 was 34385, checked in by Stephan, 8 years ago

english texts

  • Property svn:executable set to *
File size: 12.6 KB
Line 
1#include "../../titan/struct.h"
2#include "../../titan/debug.h"
3#include "../../titan/header.h"
4
5char pluginname[] = "MultiImage";
6char plugindesc[] = "Start Images from USB device";
7char pluginpic[] = "%pluginpath%/multiimage/MultiImage.png";
8
9int pluginaktiv = 0;
10//int pluginversion = PLUGINVERSION;
11int pluginversion = 999999;
12
13struct stimerthread* Multi_Image_thread = NULL;
14
15void multiimage_thread()
16{
17        while (Multi_Image_thread->aktion != STOP)
18        {
19                sleep(3);
20                if(file_exist("/tmp/multiende") == 1)
21                {
22                        textbox(_("Message"), _("INFO\nImage extracted"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0);
23                        remove("/tmp/multiende");
24                        break;
25                }
26        }
27        if(Multi_Image_thread->aktion == STOP)
28        {
29                system("killall multi_unpack.sh");
30                system("killall ubireader_extract_files");
31        }
32        Multi_Image_thread = NULL;
33}
34
35
36char* find_multiimage_dev()
37{
38        char* mdev = NULL;
39        char* path = NULL;
40       
41        char* pos = NULL;
42        FILE* fd = NULL;
43        char* fileline = NULL;
44        fd = fopen("/proc/partitions", "r");
45        if(fd == NULL)
46        {
47                err("open /proc/partitions");
48                return NULL;
49        }
50        fileline = malloc(MINMALLOC);
51        if(fileline == NULL)
52        {
53                err("no mem");
54                return NULL;
55        }
56        while(fgets(fileline, MINMALLOC, fd) != NULL)
57        {
58                pos = ostrstr(fileline, "sd");
59                if(pos != NULL)
60                {
61                        pos = string_newline(pos);
62                        if(strlen(pos) == 4)
63                        {
64                                path = getconfig("mountpath", NULL);
65                                path = ostrcat(path, "/", 0, 0);
66                                path = ostrcat(path, pos, 1, 0);
67                                path = ostrcat(path, "/", 1, 0);
68                                path = ostrcat(path, "titan_multi", 1, 0);
69                                if(file_exist(path) == 1)
70                                {
71                                        mdev = ostrcat(mdev, pos, 1, 0);
72                                }
73                                free(path); path = NULL;
74                        }
75                }
76                if(mdev != NULL)
77                        break;
78        }
79        free(fileline);
80        fclose(fd);     
81
82        return mdev;
83}
84
85
86char* get_dir(char* path)
87{
88        struct dirent* dirzeiger;
89        char* dirall = NULL;
90        DIR *dir = opendir(path);
91        if (dir != 0)
92        {
93                struct dirent* dirzeiger;
94                while(0 != (dirzeiger = readdir(dir)))
95                {
96                        if(dirzeiger->d_name[0] != '.')
97                        {
98                                dirall = ostrcat(dirall, dirzeiger->d_name, 1, 0);
99                                dirall = ostrcat(dirall, " \n", 1, 0);
100                        }
101                }
102                closedir(dir);
103        }
104        return dirall;
105}
106       
107
108int no_mdev()
109{
110        char* mdev = NULL;
111        char* path = NULL;
112        char* dirall = NULL;
113        char* cmd = NULL;
114        struct skin* tmp = NULL;
115        int ret = 0;   
116        int rcret = 0; 
117         
118        struct skin* multipart = getscreen("multipart");
119        struct skin* listbox = getscreennode(multipart, "listbox");
120        struct skin* device = getscreennode(multipart, "device");
121        struct skin* text2 = getscreennode(multipart, "textbox2");
122                       
123        char* pos = NULL;
124        FILE* fd = NULL;
125        char* fileline = NULL;
126        fd = fopen("/proc/partitions", "r");
127        if(fd == NULL)
128        {
129                err("open /proc/partitions");
130                return 1;
131        }
132        fileline = malloc(MINMALLOC);
133        if(fileline == NULL)
134        {
135                err("no mem");
136                return 1;
137        }
138        while(fgets(fileline, MINMALLOC, fd) != NULL)
139        {
140                pos = ostrstr(fileline, "sd");
141                if(pos != NULL)
142                {
143                        pos = string_newline(pos);
144                        if(strlen(pos) == 4)
145                        {
146                                if(mdev == NULL)
147                                        mdev = ostrcat(mdev, pos, 1, 0);
148                                addchoicebox(device, pos, pos);
149                        }
150                }
151        }
152        free(fileline);
153        fclose(fd);     
154        if(mdev == NULL)
155        {
156                textbox("MultiImage", "No device available", _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0);
157                return 1;
158        }
159        setchoiceboxselection(device, mdev);
160        path = getconfig("mountpath", NULL);
161        path = ostrcat(path, "/", 0, 0);
162        path = ostrcat(path, mdev, 1, 0);
163       
164        dirall = get_dir(path);
165        free(path); path = NULL;
166       
167        changetext(text2, dirall);
168        free(dirall); dirall = NULL;
169       
170        free(mdev); mdev=NULL;
171       
172        drawscreen(multipart, 0, 0);
173        addscreenrc(multipart, listbox);
174        tmp = listbox->select;
175        while(1)
176        {
177                addscreenrc(multipart, tmp);
178                rcret = waitrc(multipart, 2000, 0);
179                tmp = listbox->select;
180                if(rcret == getrcconfigint("rcexit", NULL)) break;
181               
182                if((rcret == getrcconfigint("rcleft", NULL) || rcret == getrcconfigint("rcright", NULL)) && listbox->select != NULL && ostrcmp(listbox->select->name, "device") == 0)
183                {
184                        mdev = ostrcat(mdev, device->ret, 1, 0);
185                        path = getconfig("mountpath", NULL);
186                        path = ostrcat(path, "/", 0, 0);
187                        path = ostrcat(path, mdev, 1, 0);
188                        dirall = get_dir(path);
189                        free(path); path = NULL;
190                        changetext(text2, dirall);
191                        free(dirall); dirall = NULL;
192                        free(mdev); mdev = NULL;
193                }
194
195                if(rcret == getrcconfigint("rcblue", NULL))
196                {
197                        mdev = ostrcat(mdev, device->ret, 1, 0);
198                        cmd = ostrcat("umount /dev/", mdev, 0, 0);
199                        debug(81, "unmount cmd: %s", cmd);
200                        ret = system(cmd);
201                        free(cmd); cmd = NULL;
202                        break;
203                }
204                drawscreen(multipart, 0, 0);
205        }
206        delownerrc(multipart);
207        clearscreen(multipart);
208       
209        if(mdev == NULL)
210                return 1;       
211       
212        if(textbox("MultiImage", "All data on this device will be deleted!\nOK?", _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0) == 2)
213        {
214                free(mdev); mdev = NULL;
215                return 1;
216        }
217        //cmd = ostrcat("/sbin/cmd.sh mkfs.ext2.gui /dev/" , mdev, 0, 0);
218        cmd = ostrcat("mkfs.ext2.gui /dev/" , mdev, 0, 0);
219        debug(81, "format cmd: %s", cmd);
220        ret = system(cmd);
221        free(cmd); cmd = NULL;
222        if(ret != 0)
223        {
224                textbox(_("Message"), _("ERROR\nPartition could not be created"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0);
225                return 1;
226        }
227        path = getconfig("mountpath", NULL);
228        path = ostrcat(path, "/", 0, 0);
229        path = ostrcat(path, mdev, 1, 0);
230        cmd = ostrcat("mount /dev/" , mdev, 0, 0);
231        cmd = ostrcat(cmd, " ", 1, 0);
232        cmd = ostrcat(cmd, path, 1, 0);
233        //system(cmd);
234        free(cmd); cmd = NULL;
235        cmd = ostrcat(path, "/", 0, 0);
236        cmd = ostrcat(cmd, "titan_multi", 0, 0);
237        mkdir(cmd, 777);
238        free(cmd); cmd = NULL;
239        free(path); path = NULL;
240        free(mdev); mdev = NULL;       
241       
242        return 0;
243}
244       
245int multiimage_screen(char* mdev)
246{
247        struct skin* tmp = NULL;
248        char* path = NULL;
249        char* cmd = NULL;
250        struct dirent* dirzeiger;       
251        DIR *dir = NULL;
252        int rcret = 0; 
253        int rc = 0;
254        int test = 0;
255       
256        struct skin* multiimage = getscreen("multiimage");
257        struct skin* listbox = getscreennode(multiimage, "listbox");
258        struct skin* images = getscreennode(multiimage, "images");
259        struct skin* chnode1 = NULL;
260       
261        path = getconfig("mountpath", NULL);
262        path = ostrcat(path, "/", 0, 0);
263        path = ostrcat(path, mdev, 1, 0);
264        path = ostrcat(path, "/", 1, 0);
265        path = ostrcat(path,"titan_multi", 1, 0);
266       
267        delmarkedscreennodes(multiimage, 1);
268        listbox->aktpage = -1;
269        listbox->aktline = 1;
270       
271        dir = opendir(path);
272        if (dir != 0)
273        {
274                while(0 != (dirzeiger = readdir(dir)))
275                {
276                        if(dirzeiger->d_name[0] != '.')
277                        {
278                                test = 1;
279                                chnode1 = addlistbox(multiimage, listbox, chnode1, 1);
280                                if(chnode1 != NULL)
281                                {
282                                        chnode1->posy = images->posy;
283                                        chnode1->width = images->width;
284                                        chnode1->height = images->height;
285                                        chnode1->bordersize = images->bordersize;
286                                        chnode1->bordercol = images->bordercol;
287                                        chnode1->prozwidth = images->prozwidth;
288                                        chnode1->deaktivcol = images->deaktivcol;
289                                        chnode1->name = ostrcat(dirzeiger->d_name, NULL, 0, 0);
290                                        changetext(chnode1, dirzeiger->d_name);
291                                }
292                        }
293                }
294                closedir(dir);
295                if(test == 0)
296                        images->hidden = NO;
297                else
298                        images->hidden = YES;
299        }
300        drawscreen(multiimage, 0, 0);
301        addscreenrc(multiimage, listbox);
302        tmp = listbox->select;
303        while(1)
304        {
305                addscreenrc(multiimage, tmp);
306                rcret = waitrc(multiimage, 2000, 0);
307                tmp = listbox->select;
308                if(rcret == getrcconfigint("rcexit", NULL))
309                {
310                         rc = 0;
311                         break;
312                }
313                if(rcret == getrcconfigint("rcred", NULL))
314                {
315                        if(listbox->select != NULL)
316                        {       
317                                rc = 1;
318                                cmd = ostrcat("Soll Image ", listbox->select->name, 0, 0);
319                                cmd = ostrcat(cmd, " wirklich gelöscht werden?", 1, 0);
320                                if(textbox("MultiImage", cmd, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0) == 1)
321                                {
322                                        free(cmd); cmd= NULL;
323                                        cmd = ostrcat("rm -r " , path, 0, 0);
324                                        cmd = ostrcat(cmd , "/", 1, 0);
325                                        cmd = ostrcat(cmd , listbox->select->name, 1, 0);
326                                        debug(81, "delete cmd: %s", cmd);
327                                        system(cmd);
328                                }
329                                free(cmd); cmd= NULL;
330                                break;
331                        }
332                }
333                if(rcret == getrcconfigint("rcgreen", NULL))
334                {
335                        rc = 2;
336                        break;
337                }
338                if(rcret == getrcconfigint("rcblue", NULL))
339                {
340                        rc = 3;
341                        break;
342                }
343                drawscreen(multiimage, 0, 0);
344        }
345        delownerrc(multiimage);
346        delmarkedscreennodes(multiimage, 1);
347        clearscreen(multiimage);
348        free(path); path=NULL;
349       
350        return rc;
351}
352
353int multiimage_install(char* imagefile, char* mdev)
354{
355        int rcret = 0;
356        int rc = 0;
357        char* path = NULL;
358        char* path2 = NULL;
359        char* path3 = NULL;
360        char* cmd = NULL;
361        char* iname = NULL;
362
363        struct skin* tmp = NULL;
364        struct skin* multiinstall = getscreen("multiinstall");
365        struct skin* listbox = getscreennode(multiinstall, "listbox");
366        struct skin* text1 = getscreennode(multiinstall, "text1");
367        struct skin* imagename = getscreennode(multiinstall, "imagename");
368       
369        path = getconfig("mountpath", NULL);
370        path = ostrcat(path, "/", 0, 0);
371        path = ostrcat(path, mdev, 1, 0);
372
373        path2 = ostrcat(path, "/", 0, 0);
374        path2 = ostrcat(path2,"titan_multi", 1, 0);
375               
376        changetext(text1, imagefile);
377        changeinput(imagename, "imagename");
378       
379        drawscreen(multiinstall, 0, 0);
380        addscreenrc(multiinstall, listbox);
381        tmp = listbox->select;
382        while(1)
383        {
384                addscreenrc(multiinstall, tmp);
385                rcret = waitrc(multiinstall, 2000, 0);
386                tmp = listbox->select;
387                if(rcret == getrcconfigint("rcexit", NULL))
388                        break;
389                if(rcret == getrcconfigint("rcred", NULL))
390                {
391                        path3 = ostrcat(path2, "/", 0, 0);
392                        path3 = ostrcat(path3, imagename->ret, 1, 0);
393                        if(file_exist(path3) == 1)
394                        {
395                                free(path3); path3=NULL;
396                                textbox(_("Message"), _("ERROR\nImage already present!"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0);
397                                continue;
398                        }
399                        textbox(_("Message"), _("INFO\nExtracting will take a few minutes ..."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0);
400                        iname = ostrcat(imagename->ret, NULL, 1, 0);
401                        rc = 1;
402                        break;
403                }
404                drawscreen(multiinstall, 0, 0);
405        }
406        delownerrc(multiinstall);
407        clearscreen(multiinstall);
408        if(rc == 1)
409        {
410                cmd = createpluginpath("/multiimage/multi_unpack.sh", 0);
411                cmd = ostrcat(cmd, " ", 1, 0);
412                cmd = ostrcat(cmd, imagefile, 1, 0);
413                cmd = ostrcat(cmd, " ", 1, 0);
414                cmd = ostrcat(cmd, iname, 1, 0);
415                cmd = ostrcat(cmd, " ", 1, 0);
416                cmd = ostrcat(cmd, path, 1, 0);
417                cmd = ostrcat(cmd, " &", 1, 0);
418                system(cmd);
419                free(cmd); cmd=NULL;
420                textbox(_("Message"), _("INFO\nExtracting process is running in background.\nA message will be shown when finished."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 250, 10, 0);
421               
422                Multi_Image_thread = addtimer(&multiimage_thread, START, 10000, 1, NULL, NULL, NULL);
423        }
424
425        free(path); path=NULL; 
426        free(path2); path2=NULL;       
427        free(path3); path3=NULL;       
428        return rc;
429}
430
431void multi_main(void)
432{
433        char* mdev = NULL;
434        char* imagefile = NULL;
435        int ret = 0;
436               
437        mdev = find_multiimage_dev();
438       
439        while (mdev == NULL)
440        {
441                if(textbox("MultiImage", "No MultiImage device found.\nCreate device?", _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0) == 2)
442                        return;
443                if(no_mdev() != 0)
444                        return;         
445                mdev = find_multiimage_dev();
446        }
447        while(1)
448        {
449                ret = multiimage_screen(mdev);
450               
451                if(ret == 0)
452                        break;
453                if(ret == 2)
454                {
455                        imagefile = screendir("/tmp", "*.zip", NULL, NULL, NULL, NULL, 0, "SELECT", 0, NULL, 0, NULL, 0, 1200, 0, 600, 0, 0);
456                        if(imagefile != NULL)
457                        {
458                                ret = multiimage_install(imagefile, mdev);
459                                free(imagefile); imagefile=NULL;
460                                if(ret == 1)
461                                        return;
462                        }
463                }
464                if(ret == 3)
465                {
466                        if(no_mdev() != 0)
467                                continue;               
468                        free(mdev); mdev=NULL;
469                        mdev = find_multiimage_dev();
470                }
471        }
472        free(mdev); mdev=NULL;
473}
474       
475       
476               
477//wird beim laden ausgefuehrt
478void init(void)
479{
480        char* tmpstr = NULL;
481        pluginaktiv = 1;
482       
483        tmpstr = createpluginpath("/multiimage/skin.xml", 0);
484        readscreen(tmpstr, 122, 1);
485
486        debug(10, "MultiImage Plugin loaded!!!");
487}
488
489//wird beim entladen ausgefuehrt
490void deinit(void)
491{
492        if(Multi_Image_thread != NULL)
493        {
494                Multi_Image_thread->aktion = STOP;
495                while (Multi_Image_thread != NULL)
496                {
497                        sleep(1);
498                }
499        }
500        pluginaktiv = 0;
501        debug(10, "MultiImage removed !!!");
502        delmarkedscreen(122);
503}
504
505//wird in der Pluginverwaltung bzw Menue ausfeguehrt
506void start(void)
507{
508        if(Multi_Image_thread != NULL)
509        {
510                if(textbox("MultiImage", "Image creation running!!!\nStop process?", _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0) == 2)
511                        return;
512                Multi_Image_thread->aktion = STOP;
513                struct skin* load = getscreen("loading");
514                drawscreen(load, 0, 0);
515                while (Multi_Image_thread != NULL)
516                {
517                        sleep(1);
518                }
519                clearscreen(load);
520        }
521
522        multi_main();
523}
Note: See TracBrowser for help on using the repository browser.