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

Last change on this file since 34463 was 34463, checked in by gost, 7 years ago

[plugins] multiimage... call plugin after unpack

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