Subversion Repositories Kolibri OS

Rev

Rev 9536 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #define MEMSIZE 1024*50
  2.  
  3. #include "../lib/gui.h"
  4. #include "../lib/copyf.h"
  5.  
  6. #include "../lib/obj/http.h"
  7. #include "../lib/obj/network.h"
  8.  
  9. #include "../lib/patterns/restart_process.h"
  10.  
  11. bool install_complete = false;
  12. _http http;
  13. dword unimg_id;
  14.  
  15. #define WINW 460
  16. #define WINH 330
  17.  
  18. //#define LANG_RUS 1
  19.  
  20. #ifdef LANG_RUS
  21. #define T_WINDOW_TITLE "Ž­« ©­ ®¡­®¢«¥­¨¥ KolibriOS"
  22. #define T_TITLE_H1 "Ž­« ©­ ®¡­®¢«¥­¨¥"
  23. #define T_INTRO "„ ­­®¥ ¯à¨«®¦¥­¨¥ ᪠砥⠯®á«¥¤­îî ¢¥àá¨î KolibriOS ¨ à á¯ ªã¥â ¥¥ ­  RAM-¤¨áª. à¨ í⮬ ï¤à® ­¥ ¡ã¤¥â ¯¥à¥§ ¯ã饭®, ¤«ï í⮣® ­¥®¡å®¤¨¬® á®åà ­¨âì ®¡à § ¨ ¯¥à¥§ £à㧨âáï. ®¦ «ã©áâ , § ªà®©â¥ ¢á¥ ®âªàëâë¥ ¯à¨«®¦¥­¨ï ¯¥à¥¤ ­ ç «®¬ ®¡­®¢«¥­¨ï.
  24. ‚ˆŒ€ˆ…: ‚ᥠ¨§¬¥­­ë¥ ä ©«ë ­  RAM-¤¨áª¥ ¡ã¤ãâ ¯¥à¥§ ¯¨á ­ë!";
  25. #define T_INSTALL "Ž¡­®¢¨âì"
  26. #define T_DOWNLOADING "‘ª ç¨¢ î ᢥ¦¨© ®¡à § kolibri.img..."
  27. #define T_UNPACKING " á¯ ª®¢ë¢ î ¨ ª®¯¨àãî ä ©«ë..."
  28. #define T_COMPLETE "Ž¡­®¢«¥­¨¥ ãᯥ譮 § ¢¥à襭®."
  29. #define T_EXIT "‚ë室"
  30. #define IMG_URL "http://builds.kolibrios.org/rus/data/data/kolibri.img"
  31. #define KS "‘®åà ­¨âì ­ áâனª¨"
  32. #else
  33. #define T_WINDOW_TITLE "KolibriOS Online Updater"
  34. #define T_TITLE_H1 "Online Updater"
  35. #define T_INTRO "This app will download the latest KolibriOS dirsto and update your RAM-disk with it. Kernel won't be restarted.
  36. Please close all opened apps before start.
  37. Note that all changes on RAM-disk will be lost.";
  38. #define T_INSTALL "Update"
  39. #define T_DOWNLOADING "Downloading the latest kolibri.img..."
  40. #define T_UNPACKING "Unpacking and copying files..."
  41. #define T_COMPLETE "Update complete successfully."
  42. #define T_EXIT "Exit"
  43. #define IMG_URL "http://builds.kolibrios.org/eng/data/data/kolibri.img"
  44. #define KS "Keep settings folder"
  45. #endif
  46. char accept_language[]="en"; //not used, necessary for http.get()
  47. void Operation_Draw_Progress(dword f) {} //not used, necessary for copyf()
  48.  
  49. checkbox keep_settings = { KS, true };
  50. sensor progress = { 40, WINH-70, WINW-80, 20 };
  51.  
  52. void main()
  53. {
  54.         int btn;
  55.         saved_state = FILE_REPLACE;
  56.         load_dll(libHTTP, #http_lib_init,1);
  57.         SetWindowLayerBehaviour(-1, ZPOS_ALWAYS_TOP);
  58.         @SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_STACK);
  59.         loop() switch(@WaitEventTimeout(300))
  60.         {
  61.                 case evButton:
  62.                         btn = @GetButtonID();
  63.                         if (btn<=2) ExitProcess();
  64.                         if (btn==9) goto _INSTALL;
  65.                         keep_settings.click(btn);
  66.                         break;
  67.  
  68.                 case evKey:
  69.                         switch (@GetKeyScancode()) {
  70.                                 case SCAN_CODE_ESC: ExitProcess();
  71.                                 case SCAN_CODE_ENTER:
  72.                                         if (install_complete) ExitProcess();
  73.                                         else {
  74.                                                 _INSTALL:
  75.                                                 http.get(IMG_URL);
  76.                                                 goto _DRAW_WINDOW;
  77.                                                 }
  78.                         }
  79.                         break;
  80.  
  81.                 case evReDraw:
  82.                         _DRAW_WINDOW:
  83.                         draw_window();
  84.  
  85.                 case evNetwork:
  86.                         if (http.transfer <= 0) break;
  87.                         http.receive();
  88.                         if (http.content_length) {
  89.                                 progress.draw_progress(http.content_length - http.content_received
  90.                                         * progress.w / http.content_length);
  91.                         }
  92.                         if (!http.receive_result) {
  93.                                 CreateFile(http.content_received,
  94.                                         http.content_pointer, "/tmp0/1/latest.img");
  95.                                 http.stop();
  96.                                 EventDownloadComplete();
  97.                         }
  98.         }
  99. }
  100.  
  101. void draw_window()
  102. {
  103.         sc.get();
  104.         DefineAndDrawWindow(screen.w-WINW/2,screen.h-WINH/2,
  105.                 WINW+9,WINH+skin_h,0x34,sc.work,T_WINDOW_TITLE,0);
  106.         WriteText(30, 20, 0x91, 0xEC008C, T_TITLE_H1);
  107.         if (!install_complete) {
  108.                         if (GetProcessSlot(unimg_id)) {
  109.                                 //UNPACKING
  110.                                 draw_icon_32(WINW-32/2, 140, sc.work, 89);
  111.                                 WriteTextCenter(0, 185, WINW, sc.work_text, T_UNPACKING);
  112.                         } else if (http.transfer<=0) {
  113.                                 //INTRO
  114.                                 DrawTextViewArea(30, 65, WINW-60, WINH-80, T_INTRO, -1, sc.work_text);
  115.                                 DrawCaptButton(WINW-160, WINH-70, 110, 28, 9, 0x0092D8, 0xFFFfff, T_INSTALL);
  116.                                 keep_settings.draw(30, WINH-65);
  117.                         } else {
  118.                                 //DOWNLOADING
  119.                                 draw_icon_32(WINW-32/2, 140, sc.work, 51);
  120.                                 WriteTextCenter(0, 185, WINW, sc.work_text, T_DOWNLOADING);
  121.                                 progress.draw_wrapper();
  122.                         }
  123.         } else {
  124.                                 //COMPLETE
  125.                                 draw_icon_32(WINW-32/2, 140, sc.work, 49);
  126.                                 WriteTextCenter(0, 185, WINW, sc.work_text, T_COMPLETE);
  127.                                 DrawCaptButton(WINW-110/2, WINH-70, 110, 28, 2,
  128.                                         0x0092D8, 0xFFFfff, T_EXIT);
  129.         }
  130. }
  131.  
  132. dword GetFreeSpaceOfRamdisk()
  133. {
  134.         dword rdempty = malloc(1440*1024);
  135.         CreateFile(0, 1440*1024, rdempty, "/sys/rdempty");
  136.         free(rdempty);
  137.         rdempty = get_file_size("/sys/rdempty");
  138.         DeleteFile("/sys/rdempty");
  139.         return rdempty;
  140. }
  141.  
  142. signed CheckFreeSpace(dword _latest, _combined)
  143. {
  144.         dword cur_size, new_size, empty;
  145.         DIR_SIZE dir_size;
  146.  
  147.         dir_size.get("/sys");
  148.         cur_size = dir_size.bytes;
  149.  
  150.         copyf("/sys", _combined);
  151.         copyf(_latest, _combined);
  152.         dir_size.get(_combined);
  153.         new_size = dir_size.bytes;
  154.  
  155.         empty = GetFreeSpaceOfRamdisk();
  156.  
  157.         return cur_size + empty - new_size / 1024;
  158. }
  159.  
  160. void EventDownloadComplete()
  161. {
  162.         dword slot_n;
  163.         signed space_delta;
  164.         int i=0;
  165.  
  166.         char osupdate[32];
  167.         char latest[40];
  168.         char backup[40];
  169.         char combined[40];
  170.         char exract_param[64];
  171.         char backup_settings[64];
  172.  
  173.         do  { miniprintf(#osupdate, "/tmp0/1/osupdate%d", i); i++;
  174.         } while (dir_exists(#osupdate));
  175.         CreateDir(#osupdate);
  176.  
  177.         miniprintf(#latest, "%s/latest", #osupdate);
  178.         miniprintf(#backup, "%s/rdbackup", #osupdate);
  179.         miniprintf(#combined, "%s/combined", #osupdate);
  180.         miniprintf(#backup_settings, "%s/settings", #backup);
  181.         miniprintf(#exract_param, "/tmp0/1/latest.img %s -e", #latest);
  182.  
  183.         unimg_id = RunProgram("/sys/unimg", #exract_param);
  184.         draw_window();
  185.  
  186.         do {
  187.                 slot_n = GetProcessSlot(unimg_id);
  188.                 pause(10);
  189.         } while (slot_n!=0);
  190.  
  191.         space_delta = CheckFreeSpace(#latest, #combined);
  192.         if (space_delta<0) {
  193.                 miniprintf(#param, "'Not enought free space! You need %d KB more.'E", -space_delta);
  194.                 notify(#param);
  195.         } else {
  196.                 copyf("/sys", #backup);
  197.                 copyf(#latest, "/sys");
  198.                 if (keep_settings.checked) copyf(#backup_settings, "/sys/settings");
  199.                 install_complete = true;               
  200.         }
  201. }
  202.  
  203.  
  204.  
  205.