Subversion Repositories Kolibri OS

Rev

Rev 7939 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #define MEMSIZE 1024*50
  2.  
  3. #include "../lib/io.h"
  4. #include "../lib/gui.h"
  5. #include "../lib/copyf.h"
  6.  
  7. #include "../lib/obj/libini.h"
  8. #include "../lib/obj/libio.h"
  9. #include "../lib/obj/libimg.h"
  10. #include "../lib/obj/http.h"
  11. #include "../lib/obj/network.h"
  12.  
  13. #include "../lib/patterns/restart_process.h"
  14. #include "../lib/patterns/http_downloader.h"
  15.  
  16. #ifndef AUTOBUILD
  17. #include "lang.h--"
  18. #endif
  19.  
  20. bool install_complete = false;
  21. _http http;
  22.  
  23. #define WINW 460
  24. #define WINH 380
  25.  
  26. //#define LANG_RUS 1
  27.  
  28. #ifdef LANG_RUS
  29. #define T_WINDOW_TITLE "Онлайн обновление KolibriOS"
  30. #define T_TITLE_H1 "ОНЛАЙН ОБНОВЛЕНИЕ"
  31. #define T_INTRO "Данное приложение скачает последнюю версию KolibriOS и распакует ее на RAM-диск. При этом ядро не будет перезапущено, для этого необходимо сохранить образ и перезагрузится. Пожалуйста, закройте все открытые приложения перед началом обновления.
  32. ВНИМАНИЕ: Все изменные файлы на RAM-диске будут перезаписаны!";
  33. #define T_INSTALL "Обновить"
  34. #define T_COMPLETE "Обновление завершено"
  35. #define T_EXIT "Выход"
  36. #define IMG_URL "http://builds.kolibrios.org/rus/data/data/kolibri.img"
  37. #define KS "Сохранить настройки"
  38. #define RA "Перезапустить все программы"
  39. #else
  40. #define T_WINDOW_TITLE "KolibriOS Online Updater"
  41. #define T_TITLE_H1 "ONLINE UPDATE"
  42. #define T_INTRO "This app will download the latest KolibriOS dirsto and update your RAM-disk with it. Kernel won't be restarted.
  43. Please close all opened apps before start.
  44. Note that all changes on RAM-disk will be lost.";
  45. #define T_INSTALL "Update"
  46. #define T_COMPLETE "Update complete"
  47. #define T_EXIT "Exit"
  48. #define IMG_URL "http://builds.kolibrios.org/eng/data/data/kolibri.img"
  49. #define KS "Keep settings folder"
  50. #define RA "Restart all apps"
  51. #endif
  52. char accept_language[]="en"; //not used, necessary for http.get()
  53. void Operation_Draw_Progress(dword f) {} //not used, necessary for copyf()
  54.  
  55. checkbox keep_settings = { KS, true };
  56. checkbox restart_apps = { RA, true };
  57.  
  58. void main()
  59. {
  60.         int btn;
  61.         sensor progress;
  62.         load_dll(libio, #libio_init,1);
  63.         load_dll(libimg, #libimg_init,1);
  64.         load_dll(libHTTP,   #http_lib_init,1);
  65.         @SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_STACK);
  66.         loop() switch(@WaitEventTimeout(300))
  67.         {
  68.                 case evButton:
  69.                         btn = @GetButtonID();
  70.                         if (btn<=2) ExitProcess();
  71.                         if (btn==9) goto _INSTALL;
  72.                         keep_settings.click(btn);
  73.                         restart_apps.click(btn);
  74.                         break;
  75.  
  76.                 case evKey:
  77.                         switch (@GetKeyScancode()) {
  78.                                 case SCAN_CODE_ESC: ExitProcess();
  79.                                 case SCAN_CODE_ENTER:
  80.                                         if (install_complete) ExitProcess();
  81.                                         else {
  82.                                                 _INSTALL:
  83.                                                 http.get(IMG_URL);
  84.                                                 goto _DRAW_WINDOW;
  85.                                                 }
  86.                         }
  87.                         break;
  88.  
  89.                 case evReDraw:
  90.                         _DRAW_WINDOW:
  91.                         sc.get();
  92.                         DefineAndDrawWindow(screen.width-WINW/2,screen.height-WINH/2,
  93.                                 WINW+9,WINH+skin_height,0x34,sc.work,T_WINDOW_TITLE,0);
  94.                         WriteText(30, 20, 0x81, 0xEC008C, T_TITLE_H1);
  95.                         if (!install_complete) {
  96.                                         DrawTextViewArea(30, 50, WINW-60, WINH-80, T_INTRO, -1, sc.work_text);
  97.                                         progress.set_size(30, WINH-130, WINW-60, 20);
  98.                                         if (http.transfer<=0) {
  99.                                                 DrawCaptButton(WINW-110/2, WINH-70, 110, 28, 9, 0x0092D8, 0xFFFfff, T_INSTALL);
  100.                                                 keep_settings.draw(30, WINH - 210);
  101.                                                 restart_apps.draw(30, WINH - 185);
  102.                                         }
  103.                         } else {
  104.                                         DrawIcon32(WINW-32/2, 140, sc.work, 49);
  105.                                         WriteTextCenter(0,185, WINW, sc.work_text, T_COMPLETE);
  106.                                         DrawCaptButton(WINW-110/2, WINH-70, 110, 28, 2,
  107.                                                 0x0092D8, 0xFFFfff, T_EXIT);
  108.                         }
  109.  
  110.                 case evNetwork:
  111.                         if (http.transfer <= 0) break;
  112.                         http.receive();
  113.                         if (http.content_length) {
  114.                                 progress.draw_progress(http.content_length - http.content_received
  115.                                         * progress.w / http.content_length);
  116.                         }
  117.                         if (!http.receive_result) {
  118.                                 CreateFile(http.content_received,
  119.                                         http.content_pointer, "/tmp0/1/latest.img");
  120.                                 http.free();
  121.                                 EventDownloadComplete();
  122.                         }
  123.         }
  124. }
  125.  
  126. dword GetFreeSpaceOfRamdisk()
  127. {
  128.         dword rdempty = malloc(1440*1024);
  129.         CreateFile(0, 1440*1024, rdempty, "/rd/1/rdempty");
  130.         free(rdempty);
  131.         file_size stdcall ("/rd/1/rdempty");
  132.         rdempty = EBX;
  133.         DeleteFile("/rd/1/rdempty");
  134.         return rdempty;
  135. }
  136.  
  137. signed CheckFreeSpace(dword _latest, _combined)
  138. {
  139.         dword cur_size, new_size, empty;
  140.         DIR_SIZE dir_size;
  141.  
  142.         dir_size.get("/sys");
  143.         cur_size = dir_size.bytes;
  144.  
  145.         copyf("/sys", _combined);
  146.         copyf(_latest, _combined);
  147.         dir_size.get(_combined);
  148.         new_size = dir_size.bytes;
  149.  
  150.         empty = GetFreeSpaceOfRamdisk();
  151.  
  152.         return cur_size + empty - new_size / 1024;
  153. }
  154.  
  155. void EventDownloadComplete()
  156. {
  157.         dword unimg_id, slot_n;
  158.         signed space_delta;
  159.         int i=0;
  160.  
  161.         char osupdate[32];
  162.         char latest[40];
  163.         char backup[40];
  164.         char combined[40];
  165.         char exract_param[64];
  166.         char backup_settings[64];
  167.  
  168.         do  { sprintf(#osupdate, "/tmp0/1/osupdate%d", i); i++;
  169.         } while (dir_exists(#osupdate));
  170.         CreateDir(#osupdate);
  171.  
  172.         sprintf(#latest, "%s/latest", #osupdate);
  173.         sprintf(#backup, "%s/rdbackup", #osupdate);
  174.         sprintf(#combined, "%s/combined", #osupdate);
  175.         sprintf(#backup_settings, "%s/settings", #backup);
  176.         sprintf(#exract_param, "/tmp0/1/latest.img %s -e", #latest);
  177.  
  178.  
  179.         unimg_id = RunProgram("/sys/unimg", #exract_param);
  180.         do {
  181.                 slot_n = GetProcessSlot(unimg_id);
  182.                 pause(10);
  183.         } while (slot_n!=0);
  184.  
  185.         space_delta = CheckFreeSpace(#latest, #combined);
  186.         if (space_delta<0) {
  187.                 sprintf(#param, "'Not enought free space! You need %d Kb more.'E", -space_delta);
  188.                 notify(#param);
  189.         } else {
  190.                 copyf("/sys", #backup);
  191.                 copyf(#latest, "/sys");
  192.                 if (keep_settings.checked) copyf(#backup_settings, "/rd/1/settings");
  193.                 if (restart_apps.checked) RestartAllProcess();
  194.                 install_complete = true;               
  195.         }
  196. }
  197.  
  198.  
  199.  
  200.