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

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

[multiimage] extensions

  • Property svn:executable set to *
File size: 16.2 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
17char* get_dir(char* path)
18{
19        struct dirent* dirzeiger;
20        char* dirall = NULL;
21        DIR *dir = opendir(path);
22        if (dir != 0)
23        {
24                struct dirent* dirzeiger;
25                while(0 != (dirzeiger = readdir(dir)))
26                {
27                        if(dirzeiger->d_name[0] != '.')
28                        {
29                                dirall = ostrcat(dirall, dirzeiger->d_name, 1, 0);
30                                dirall = ostrcat(dirall, " \n", 1, 0);
31                        }
32                }
33                closedir(dir);
34        }
35        return dirall;
36}
37
38void multiimage_thread()
39{
40        char* cmd = NULL;
41        while (Multi_Image_thread->aktion != STOP)
42        {
43                sleep(3);
44                if(file_exist("/tmp/multiende") == 1)
45                {
46                        textbox(_("Message"), _("INFO\nImage extracted"), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 500, 200, 0, 0);
47                        remove("/tmp/multiende");
48                        break;
49                }
50        }
51        if(Multi_Image_thread->aktion == STOP)
52        {
53                system("killall multi_unpack.sh");
54                system("killall ubireader_extract_files");
55                cmd = ostrcat("rm -r ",imagepath, 0, 0);
56                system(cmd);
57                free(cmd); cmd = NULL;
58               
59        }
60        else
61        {
62                if(status.extplugin != NULL)
63                {
64                        free(status.extplugin);
65                        status.extplugin = NULL;
66                }
67                //Aufruf des plugins
68                status.extplugin = ostrcat("MultiImage", NULL, 0, 0);
69        }
70        Multi_Image_thread = NULL;
71}
72
73
74char* find_multiimage_dev()
75{
76        char* mdev = NULL;
77        char* path = NULL;
78       
79        char* pos = NULL;
80        FILE* fd = NULL;
81        char* fileline = NULL;
82        fd = fopen("/proc/partitions", "r");
83        if(fd == NULL)
84        {
85                err("open /proc/partitions");
86                return NULL;
87        }
88        fileline = malloc(MINMALLOC);
89        if(fileline == NULL)
90        {
91                err("no mem");
92                return NULL;
93        }
94        while(fgets(fileline, MINMALLOC, fd) != NULL)
95        {
96                pos = ostrstr(fileline, "sd");
97                if(pos != NULL)
98                {
99                        pos = string_newline(pos);
100                        if(strlen(pos) == 4)
101                        {
102                                path = getconfig("mountpath", NULL);
103                                path = ostrcat(path, "/", 0, 0);
104                                path = ostrcat(path, pos, 1, 0);
105                                path = ostrcat(path, "/", 1, 0);
106                                path = ostrcat(path, "titan_multi", 1, 0);
107                                if(file_exist(path) == 1)
108                                {
109                                        mdev = ostrcat(mdev, pos, 1, 0);
110                                }
111                                free(path); path = NULL;
112                        }
113                }
114                if(mdev != NULL)
115                        break;
116        }
117        free(fileline);
118        fclose(fd);     
119
120        return mdev;
121}
122
123
124int no_mdev()
125{
126        char* mdev = NULL;
127        char* path = NULL;
128        char* dirall = NULL;
129        char* cmd = NULL;
130        struct skin* tmp = NULL;
131        int ret = 0;   
132        int rcret = 0; 
133        int ren = 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),NULL, 0, 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("rcred", 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                if(rcret == getrcconfigint("rcgreen", NULL))
222                {
223                        mdev = ostrcat(mdev, device->ret, 1, 0);
224                        path = getconfig("mountpath", NULL);
225                        path = ostrcat(path, "/", 0, 0);
226                        path = ostrcat(path, mdev, 1, 0);
227                       
228                        cmd = ostrcat("mount | grep ", mdev, 0, 0);
229                        cmd = ostrcat(cmd, " | grep ext[2,3,4]", 1, 0);
230                        ret = system(cmd);
231                        free(cmd); cmd = NULL;
232                        if(ret == 0)
233                        {
234                                cmd = ostrcat(path, "/", 0, 0);
235                                cmd = ostrcat(cmd, "titan_multi", 1, 0);
236                                mkdir(cmd, 777);
237                                free(cmd); cmd=NULL;
238                                ren = 1;
239                        }
240                        else
241                        {
242                                textbox("ERROR", _("No Linux partiton found on this device."), _("OK"), getrcconfigint("rcok", NULL),NULL, 0, NULL, 0, NULL, 0, 600, 200, 0, 0);
243                                ren = 0;
244                        }
245                        free(path); path=NULL;
246                        free(mdev); mdev=NULL;
247                        if(ren == 1)
248                                break;
249                }
250                drawscreen(multipart, 0, 0);
251        }
252        delownerrc(multipart);
253        clearscreen(multipart);
254       
255        if(mdev == NULL)
256                return 1;       
257       
258        if(ren != 1)
259        {
260                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)
261                {
262                        free(mdev); mdev = NULL;
263                        return 1;
264                }
265                cmd = ostrcat("mkfs.ext2.gui /dev/" , mdev, 0, 0);
266                debug(81, "format cmd: %s", cmd);
267                ret = system(cmd);
268                free(cmd); cmd = NULL;
269                if(ret != 0)
270                {
271                        textbox(_("Message"), _("ERROR\nPartition could not be created"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0);
272                        return 1;
273                }
274                path = getconfig("mountpath", NULL);
275                path = ostrcat(path, "/", 0, 0);
276                path = ostrcat(path, mdev, 1, 0);
277                cmd = ostrcat("mount /dev/" , mdev, 0, 0);
278                cmd = ostrcat(cmd, " ", 1, 0);
279                cmd = ostrcat(cmd, path, 1, 0);
280                //system(cmd);
281                free(cmd); cmd = NULL;
282                cmd = ostrcat(path, "/", 0, 0);
283                cmd = ostrcat(cmd, "titan_multi", 1, 0);
284                mkdir(cmd, 777);
285                free(cmd); cmd = NULL;
286                free(path); path = NULL;
287                free(mdev); mdev = NULL;
288                system ("echo MultiImage > /dev/vfd");
289        }       
290       
291        return 0;
292}
293       
294// type 1 = install image
295// type 2 = rename image
296int multiimage_install(char* imagefile, char* mdev, int type)
297{
298        int rcret = 0;
299        int rc = 0;
300        char* path = NULL;
301        char* path2 = NULL;
302        char* path3 = NULL;
303        char* cmd = NULL;
304        char* temp = NULL;
305        char* iname = NULL;
306
307        struct skin* tmp = NULL;
308        struct skin* multiinstall = getscreen("multiinstall");
309        struct skin* listbox = getscreennode(multiinstall, "listbox");
310        struct skin* text1 = getscreennode(multiinstall, "text1");
311        struct skin* imagename = getscreennode(multiinstall, "imagename");
312        struct skin* b2 = getscreennode(multiinstall, "b2");
313        if(type == 1)
314        {
315                changetext(b2, _("INSTALL"));
316                changeinput(imagename, "imagename");
317        }
318        if(type == 2)
319        {
320                changetext(b2, _("RENAME"));
321                changeinput(imagename, imagefile);
322        }
323       
324        path = getconfig("mountpath", NULL);
325        path = ostrcat(path, "/", 0, 0);
326        path = ostrcat(path, mdev, 1, 0);
327
328        path2 = ostrcat(path, "/", 0, 0);
329        path2 = ostrcat(path2,"titan_multi", 1, 0);
330               
331        changetext(text1, imagefile);
332       
333       
334        drawscreen(multiinstall, 0, 0);
335        addscreenrc(multiinstall, listbox);
336        tmp = listbox->select;
337        while(1)
338        {
339                addscreenrc(multiinstall, tmp);
340                rcret = waitrc(multiinstall, 2000, 0);
341                tmp = listbox->select;
342                if(rcret == getrcconfigint("rcexit", NULL))
343                        break;
344                if(rcret == getrcconfigint("rcred", NULL))
345                {
346                        path3 = ostrcat(path2, "/", 0, 0);
347                        path3 = ostrcat(path3, imagename->ret, 1, 0);
348                        if(file_exist(path3) == 1)
349                        {
350                                free(path3); path3=NULL;
351                                textbox(_("Message"), _("ERROR\nImage already present!"), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 500, 200, 0, 0);
352                                continue;
353                        }
354                        if(type == 1)
355                        {
356                                textbox(_("Message"), _("INFO\nExtracting will take a few minutes ..."), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 200, 0, 0);
357                                iname = ostrcat(imagename->ret, NULL, 1, 0);
358                                rc = 1;
359                                break;
360                        }
361                        if(type == 2)
362                        {
363                                temp = ostrcat(path2, "/", 0, 0);
364                                temp = ostrcat(temp, imagefile, 1, 0);
365                                cmd = ostrcat("mv ", temp, 0, 0);
366                                cmd = ostrcat(cmd, " ", 1, 0);
367                                cmd = ostrcat(cmd, path3, 1, 0);
368                                system(cmd);
369                                free(cmd); cmd=NULL;
370                                free(temp); temp=NULL;
371                                rc = 2;
372                                break;
373                        }
374                }
375                drawscreen(multiinstall, 0, 0);
376        }
377        delownerrc(multiinstall);
378        clearscreen(multiinstall);
379        if(rc == 1)
380        {
381                if(imagepath != NULL)
382                        free(imagepath);
383                imagepath = NULL;
384                imagepath = ostrcat(path2, "/", 0, 0);
385                imagepath = ostrcat(imagepath, iname, 1, 0);
386                temp = createpluginpath("/multiimage/ubireader/ubi_reader-master/scripts/ubireader_extract_files", 0);
387                cmd = createpluginpath("/multiimage/multi_unpack.sh", 0);
388                cmd = ostrcat(cmd, " ", 1, 0);
389                cmd = ostrcat(cmd, imagefile, 1, 0);
390                cmd = ostrcat(cmd, " ", 1, 0);
391                cmd = ostrcat(cmd, iname, 1, 0);
392                cmd = ostrcat(cmd, " ", 1, 0);
393                cmd = ostrcat(cmd, path, 1, 0);
394                cmd = ostrcat(cmd, " ", 1, 0);
395                cmd = ostrcat(cmd, temp, 1, 0);
396                cmd = ostrcat(cmd, " &", 1, 0);
397                system(cmd);
398                free(cmd); cmd=NULL;
399                free(temp); temp=NULL;
400                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);
401       
402                Multi_Image_thread = addtimer(&multiimage_thread, START, 10000, 1, NULL, NULL, NULL);
403        }
404
405        free(path); path=NULL; 
406        free(path2); path2=NULL;       
407        free(path3); path3=NULL;       
408        return rc;
409}
410
411int multiimage_screen(char* mdev)
412{
413        struct skin* tmp = NULL;
414        char* path = NULL;
415        char* cmd = NULL;
416        char* tmpstr = NULL;
417        char* selimage = NULL;
418        struct dirent* dirzeiger;       
419        DIR *dir = NULL;
420        int rcret = 0; 
421        int rc = 0;
422        int test = 0;
423       
424        struct skin* multiimage = getscreen("multiimage");
425        struct skin* listbox = getscreennode(multiimage, "listbox");
426        struct skin* images = getscreennode(multiimage, "images");
427        struct skin* chnode1 = NULL;
428       
429        path = getconfig("mountpath", NULL);
430        path = ostrcat(path, "/", 0, 0);
431        path = ostrcat(path, mdev, 1, 0);
432        path = ostrcat(path, "/", 1, 0);
433        path = ostrcat(path,"titan_multi", 1, 0);
434       
435        delmarkedscreennodes(multiimage, 1);
436        listbox->aktpage = -1;
437        listbox->aktline = 1;
438       
439        tmpstr = ostrcat(path, "/", 0, 0);
440        tmpstr = ostrcat(tmpstr, ".multi_image", 1, 0);
441        selimage = readsys(tmpstr, 1);
442        free(tmpstr); tmpstr=NULL;
443       
444        dir = opendir(path);
445        if (dir != 0)
446        {
447                while(0 != (dirzeiger = readdir(dir)))
448                {
449                        if(dirzeiger->d_name[0] != '.')
450                        {
451                                test = 1;
452                                chnode1 = addlistbox(multiimage, listbox, chnode1, 1);
453                                if(chnode1 != NULL)
454                                {
455                                        chnode1->posy = images->posy;
456                                        chnode1->width = images->width;
457                                        chnode1->height = images->height;
458                                        chnode1->bordersize = images->bordersize;
459                                        chnode1->bordercol = images->bordercol;
460                                        chnode1->prozwidth = images->prozwidth;
461                                        chnode1->deaktivcol = images->deaktivcol;
462                                        chnode1->name = ostrcat(dirzeiger->d_name, NULL, 0, 0);
463                                        if(selimage != NULL && ostrcmp(selimage, dirzeiger->d_name) == 0)
464                                        {
465                                                tmpstr = ostrcat(dirzeiger->d_name, "  (selected)", 0, 0);     
466                                                changetext(chnode1, tmpstr);
467                                                free(tmpstr); tmpstr=NULL;
468                                                test = 2;
469                                        }
470                                        else           
471                                                changetext(chnode1, dirzeiger->d_name);
472                                }
473                        }
474                }
475                closedir(dir);
476                free(selimage); selimage = NULL;
477                if(test == 0)
478                        images->hidden = NO;
479                else
480                {
481                        images->hidden = YES;
482                        chnode1 = addlistbox(multiimage, listbox, chnode1, 1);
483                        if(chnode1 != NULL)
484                        {
485                                chnode1->posy = images->posy;
486                                chnode1->width = images->width;
487                                chnode1->height = images->height;
488                                chnode1->bordersize = images->bordersize;
489                                chnode1->bordercol = images->bordercol;
490                                chnode1->prozwidth = images->prozwidth;
491                                chnode1->deaktivcol = images->deaktivcol;
492                                chnode1->name = ostrcat("Flash", NULL, 0, 0);
493                                if(test == 1)
494                                        changetext(chnode1, "Flash  (selected)");
495                                else
496                                        changetext(chnode1, "Flash");
497                        }
498                }
499        }
500        drawscreen(multiimage, 0, 0);
501        addscreenrc(multiimage, listbox);
502        tmp = listbox->select;
503        while(1)
504        {
505                addscreenrc(multiimage, tmp);
506                rcret = waitrc(multiimage, 2000, 0);
507                tmp = listbox->select;
508                if(rcret == getrcconfigint("rcok", NULL))
509                {
510                        if(listbox->select != NULL)
511                        {       
512                                rc = 1;
513                                tmpstr = ostrcat(path, "/", 0, 0);
514                                tmpstr = ostrcat(tmpstr, ".multi_image", 1, 0);
515                                writesys(tmpstr, listbox->select->name, 0);
516                                free(tmpstr); tmpstr=NULL;
517                                break;
518                        }
519                }
520                if(rcret == getrcconfigint("rcexit", NULL))
521                {
522                         rc = 0;
523                         break;
524                }
525                if(rcret == getrcconfigint("rcred", NULL))
526                {
527                        if(listbox->select != NULL)
528                        {       
529                                rc = 1;
530                                cmd = ostrcat(_("Sure to delete Image?\n"), listbox->select->name, 0, 0);
531                                if(textbox("MultiImage", cmd, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0) == 1)
532                                {
533                                        free(cmd); cmd= NULL;
534                                        cmd = ostrcat("rm -r " , path, 0, 0);
535                                        cmd = ostrcat(cmd , "/", 1, 0);
536                                        cmd = ostrcat(cmd , listbox->select->name, 1, 0);
537                                        debug(81, "delete cmd: %s", cmd);
538                                        system(cmd);
539                                }
540                                free(cmd); cmd= NULL;
541                                break;
542                        }
543                }
544                if(rcret == getrcconfigint("rcgreen", NULL))
545                {
546                        rc = 2;
547                        break;
548                }
549                if(rcret == getrcconfigint("rcblue", NULL))
550                {
551                        rc = 3;
552                        break;
553                }
554                if(rcret == getrcconfigint("rcyellow", NULL))
555                {
556                        rc = 1;
557                        selimage = ostrcat(listbox->select->name, NULL, 0, 0);
558                        break;
559                }
560                drawscreen(multiimage, 0, 0);
561        }
562        delownerrc(multiimage);
563        delmarkedscreennodes(multiimage, 1);
564        clearscreen(multiimage);
565        free(path); path=NULL;
566        if(selimage != NULL)
567        {
568                multiimage_install(selimage, mdev, 2);
569                free(selimage); selimage = NULL;
570        }
571        return rc;
572}
573
574void multi_main(void)
575{
576        char* mdev = NULL;
577        char* imagefile = NULL;
578        int ret = 0;
579               
580        mdev = find_multiimage_dev();
581       
582        while (mdev == NULL)
583        {
584                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)
585                        return;
586                if(no_mdev() != 0)
587                        return;         
588                mdev = find_multiimage_dev();
589        }
590        while(1)
591        {
592                ret = multiimage_screen(mdev);
593               
594                if(ret == 0)
595                        break;
596                if(ret == 1)
597                        continue;
598                if(ret == 2)
599                {
600                        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);                                     
601                        imagefile = screendir("/tmp", "*.zip", NULL, NULL, NULL, NULL, 0, "SELECT", 0, NULL, 0, NULL, 0, 1200, 0, 600, 0, 0);
602                        if(imagefile != NULL)
603                        {
604                                ret = multiimage_install(imagefile, mdev, 1);
605                                free(imagefile); imagefile=NULL;
606                                if(ret == 1)
607                                        return;
608                        }
609                }
610                if(ret == 3)
611                {
612                        if(no_mdev() != 0)
613                                continue;               
614                        free(mdev); mdev=NULL;
615                        mdev = find_multiimage_dev();
616                }
617        }
618        free(mdev); mdev=NULL;
619}
620       
621       
622               
623//wird beim laden ausgefuehrt
624void init(void)
625{
626        char* tmpstr = NULL;
627        pluginaktiv = 1;
628       
629        tmpstr = createpluginpath("/multiimage/skin.xml", 0);
630        readscreen(tmpstr, 122, 1);
631
632        debug(10, "MultiImage Plugin loaded!!!");
633}
634
635//wird beim entladen ausgefuehrt
636void deinit(void)
637{
638        if(Multi_Image_thread != NULL)
639        {
640                Multi_Image_thread->aktion = STOP;
641                while (Multi_Image_thread != NULL)
642                {
643                        sleep(1);
644                }
645        }
646        pluginaktiv = 0;
647        debug(10, "MultiImage removed !!!");
648        delmarkedscreen(122);
649}
650
651//wird in der Pluginverwaltung bzw Menue ausfeguehrt
652void start(void)
653{
654        if(Multi_Image_thread != NULL)
655        {
656                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)
657                        return;
658                Multi_Image_thread->aktion = STOP;
659                struct skin* load = getscreen("loading");
660                drawscreen(load, 0, 0);
661                while (Multi_Image_thread != NULL)
662                {
663                        sleep(1);
664                }
665                clearscreen(load);
666        }
667
668        multi_main();
669}
Note: See TracBrowser for help on using the repository browser.