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

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

fix

  • Property svn:executable set to *
File size: 12.8 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(_("Sure to delete Image: "), listbox->select->name, 0, 0);
319                                if(textbox("MultiImage", cmd, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0) == 1)
320                                {
321                                        free(cmd); cmd= NULL;
322                                        cmd = ostrcat("rm -r " , path, 0, 0);
323                                        cmd = ostrcat(cmd , "/", 1, 0);
324                                        cmd = ostrcat(cmd , listbox->select->name, 1, 0);
325                                        debug(81, "delete cmd: %s", cmd);
326                                        system(cmd);
327                                }
328                                free(cmd); cmd= NULL;
329                                break;
330                        }
331                }
332                if(rcret == getrcconfigint("rcgreen", NULL))
333                {
334                        rc = 2;
335                        break;
336                }
337                if(rcret == getrcconfigint("rcblue", NULL))
338                {
339                        rc = 3;
340                        break;
341                }
342                drawscreen(multiimage, 0, 0);
343        }
344        delownerrc(multiimage);
345        delmarkedscreennodes(multiimage, 1);
346        clearscreen(multiimage);
347        free(path); path=NULL;
348       
349        return rc;
350}
351
352int multiimage_install(char* imagefile, char* mdev)
353{
354        int rcret = 0;
355        int rc = 0;
356        char* path = NULL;
357        char* path2 = NULL;
358        char* path3 = NULL;
359        char* cmd = NULL;
360        char* temp = 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                temp = createpluginpath("/multiimage/ubireader/ubi_reader-master/scripts/ubireader_extract_files", 0);
411                cmd = createpluginpath("/multiimage/multi_unpack.sh", 0);
412                cmd = ostrcat(cmd, " ", 1, 0);
413                cmd = ostrcat(cmd, imagefile, 1, 0);
414                cmd = ostrcat(cmd, " ", 1, 0);
415                cmd = ostrcat(cmd, iname, 1, 0);
416                cmd = ostrcat(cmd, " ", 1, 0);
417                cmd = ostrcat(cmd, path, 1, 0);
418                cmd = ostrcat(cmd, " ", 1, 0);
419                cmd = ostrcat(cmd, temp, 1, 0);
420                cmd = ostrcat(cmd, " &", 1, 0);
421                system(cmd);
422                free(cmd); cmd=NULL;
423                free(temp); temp=NULL;
424                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);
425               
426                Multi_Image_thread = addtimer(&multiimage_thread, START, 10000, 1, NULL, NULL, NULL);
427        }
428
429        free(path); path=NULL; 
430        free(path2); path2=NULL;       
431        free(path3); path3=NULL;       
432        return rc;
433}
434
435void multi_main(void)
436{
437        char* mdev = NULL;
438        char* imagefile = NULL;
439        int ret = 0;
440               
441        mdev = find_multiimage_dev();
442       
443        while (mdev == NULL)
444        {
445                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)
446                        return;
447                if(no_mdev() != 0)
448                        return;         
449                mdev = find_multiimage_dev();
450        }
451        while(1)
452        {
453                ret = multiimage_screen(mdev);
454               
455                if(ret == 0)
456                        break;
457                if(ret == 2)
458                {
459                        imagefile = screendir("/tmp", "*.zip", NULL, NULL, NULL, NULL, 0, "SELECT", 0, NULL, 0, NULL, 0, 1200, 0, 600, 0, 0);
460                        if(imagefile != NULL)
461                        {
462                                ret = multiimage_install(imagefile, mdev);
463                                free(imagefile); imagefile=NULL;
464                                if(ret == 1)
465                                        return;
466                        }
467                }
468                if(ret == 3)
469                {
470                        if(no_mdev() != 0)
471                                continue;               
472                        free(mdev); mdev=NULL;
473                        mdev = find_multiimage_dev();
474                }
475        }
476        free(mdev); mdev=NULL;
477}
478       
479       
480               
481//wird beim laden ausgefuehrt
482void init(void)
483{
484        char* tmpstr = NULL;
485        pluginaktiv = 1;
486       
487        tmpstr = createpluginpath("/multiimage/skin.xml", 0);
488        readscreen(tmpstr, 122, 1);
489
490        debug(10, "MultiImage Plugin loaded!!!");
491}
492
493//wird beim entladen ausgefuehrt
494void deinit(void)
495{
496        if(Multi_Image_thread != NULL)
497        {
498                Multi_Image_thread->aktion = STOP;
499                while (Multi_Image_thread != NULL)
500                {
501                        sleep(1);
502                }
503        }
504        pluginaktiv = 0;
505        debug(10, "MultiImage removed !!!");
506        delmarkedscreen(122);
507}
508
509//wird in der Pluginverwaltung bzw Menue ausfeguehrt
510void start(void)
511{
512        if(Multi_Image_thread != NULL)
513        {
514                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)
515                        return;
516                Multi_Image_thread->aktion = STOP;
517                struct skin* load = getscreen("loading");
518                drawscreen(load, 0, 0);
519                while (Multi_Image_thread != NULL)
520                {
521                        sleep(1);
522                }
523                clearscreen(load);
524        }
525
526        multi_main();
527}
Note: See TracBrowser for help on using the repository browser.