osupdate: final

git-svn-id: svn://kolibrios.org@8013 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2020-05-31 14:37:09 +00:00
parent 5950bfe4cd
commit f6ab28ae5b
4 changed files with 128 additions and 79 deletions

View File

@ -130,4 +130,4 @@ void EventInstall()
draw_window(); draw_window();
} }
void Operation_Draw_Progress(dword filename) { debug("copying: "); debugln(filename); } void Operation_Draw_Progress(dword filename) { }

View File

@ -299,7 +299,6 @@ struct libimg_image
bg = _bg; bg = _bg;
i32.load("/sys/icons32.png"); i32.load("/sys/icons32.png");
i32.replace_color(0x00000000, bg); i32.replace_color(0x00000000, bg);
debugln("wolo");
} }
if (icon_n>=0) i32.draw(x, y, 32, 32, 0, icon_n*32); if (icon_n>=0) i32.draw(x, y, 32, 32, 0, icon_n*32);
} }

View File

@ -53,5 +53,19 @@ enum {
RunProgram(proc_name, ""); RunProgram(proc_name, "");
} }
:void RestartAllProcess() {
int i;
proc_info Process, Self;
GetProcessInfo(#Self, -1);
for (i=0; i<MAX_PROCESS_COUNT; i++;)
{
GetProcessInfo(#Process, i);
if (Process.name)
&& (!streq(#Process.name, "OS"))
&& (Process.ID != Self.ID)
KillProcess(Process.ID);
}
RunProgram("/sys/launcher", NULL);
}
#endif #endif

View File

@ -1,4 +1,4 @@
#define MEMSIZE 1024*460 #define MEMSIZE 1024*50
#include "../lib/io.h" #include "../lib/io.h"
#include "../lib/gui.h" #include "../lib/gui.h"
@ -17,147 +17,183 @@
#include "lang.h--" #include "lang.h--"
#endif #endif
_http http;
proc_info Form;
bool install_complete = false; bool install_complete = false;
sensor progress; _http http;
#define WINW 460 #define WINW 460
#define WINH 380
//#define LANG_RUS 1 //#define LANG_RUS 1
#ifdef LANG_RUS #ifdef LANG_RUS
#define WINH 345
#define T_WINDOW_TITLE "Ž­« ©­ ®¡­®¢«¥­¨¥ KolibriOS" #define T_WINDOW_TITLE "Ž­« ©­ ®¡­®¢«¥­¨¥ KolibriOS"
#define T_TITLE_H1 "Ž<>€‰<E282AC> Ž<><C5BD>Ž<E280B9>ˆ…" #define T_TITLE_H1 "Ž<>€‰<E282AC> Ž<><C5BD>Ž<E280B9>ˆ…"
#define T_INTRO "„ ­­®¥ ¯à¨«®¦¥­¨¥ ᪠砥⠯®á«¥¤­îî ¢¥àá¨î KolibriOS ¨ à á¯ ªã¥â ¥¥ ­  RAM-¤¨áª. <20>ਠí⮬ ï¤à® ­¥ ¡ã¤¥â ¯¥à¥§ ¯ã饭®, ¤«ï í⮣® ­¥®¡å®¤¨¬® á®åà ­¨âì ®¡à § ¨ ¯¥à¥§ £à㧨âáï. <20>®¦ «ã©áâ , § ªà®©â¥ ¢á¥ ®âªàëâë¥ ¯à¨«®¦¥­¨ï ¯¥à¥¤ ­ ç «®¬ ®¡­®¢«¥­¨ï. #define T_INTRO "„ ­­®¥ ¯à¨«®¦¥­¨¥ ᪠砥⠯®á«¥¤­îî ¢¥àá¨î KolibriOS ¨ à á¯ ªã¥â ¥¥ ­  RAM-¤¨áª. <20>ਠí⮬ ï¤à® ­¥ ¡ã¤¥â ¯¥à¥§ ¯ã饭®, ¤«ï í⮣® ­¥®¡å®¤¨¬® á®åà ­¨âì ®¡à § ¨ ¯¥à¥§ £à㧨âáï. <20>®¦ «ã©áâ , § ªà®©â¥ ¢á¥ ®âªàëâë¥ ¯à¨«®¦¥­¨ï ¯¥à¥¤ ­ ç «®¬ ®¡­®¢«¥­¨ï.
<EFBFBD>ˆŒ<EFBFBD>ˆ: ᥠ¨§¬¥­­ë¥ ä ©«ë ­  RAM-¤¨áª¥ ¡ã¤ãâ ¯¥à¥§ ¯¨á ­ë!"; <EFBFBD>ˆŒ<EFBFBD>ˆ: ᥠ¨§¬¥­­ë¥ ä ©«ë ­  RAM-¤¨áª¥ ¡ã¤ãâ ¯¥à¥§ ¯¨á ­ë!";
#define T_INSTALL "Ž¡­®¢¨âì" #define T_INSTALL "Ž¡­®¢¨âì"
#define T_COMPLETE "Ž¡­®¢«¥­¨¥ § ¢¥à襭®" #define T_COMPLETE "Ž¡­®¢«¥­¨¥ § ¢¥à襭®"
#define T_EXIT "‚ë室" #define T_EXIT "‚ë室"
#define IMG_URL "http://builds.kolibrios.org/rus/data/data/kolibri.img" #define IMG_URL "http://builds.kolibrios.org/rus/data/data/kolibri.img"
#define KS "‘®åà ­¨âì ­ áâனª¨"
#define RA "<22>¥à¥§ ¯ãáâ¨âì ¢á¥ ¯à®£à ¬¬ë"
#else #else
#define WINH 305
#define T_WINDOW_TITLE "KolibriOS Online Updater" #define T_WINDOW_TITLE "KolibriOS Online Updater"
#define T_TITLE_H1 "ONLINE UPDATE" #define T_TITLE_H1 "ONLINE UPDATE"
#define T_INTRO "This app will download the latest KolibriOS dirsto and update your RAM-disk with it. Kernel won't be restarted. #define T_INTRO "This app will download the latest KolibriOS dirsto and update your RAM-disk with it. Kernel won't be restarted.
Please close all opened apps before start. Please close all opened apps before start.
Note that all changes on RAM-disk will be lost.";
ALERT: All chages on RAM-disk will be lost!";
#define T_INSTALL "Update" #define T_INSTALL "Update"
#define T_COMPLETE "Update complete" #define T_COMPLETE "Update complete"
#define T_EXIT "Exit" #define T_EXIT "Exit"
#define IMG_URL "http://builds.kolibrios.org/eng/data/data/kolibri.img" #define IMG_URL "http://builds.kolibrios.org/eng/data/data/kolibri.img"
#define KS "Keep settings folder"
#define RA "Restart all apps"
#endif #endif
char accept_language[]="en"; //not used, necessary for http.get() char accept_language[]="en"; //not used, necessary for http.get()
void Operation_Draw_Progress(dword f) {} //not used, necessary for copyf()
checkbox keep_settings = { KS, true };
checkbox restart_apps = { RA, true };
void main() void main()
{ {
//load_dll(libini, #lib_init,1); int btn;
sensor progress;
load_dll(libio, #libio_init,1); load_dll(libio, #libio_init,1);
load_dll(libimg, #libimg_init,1); load_dll(libimg, #libimg_init,1);
load_dll(libHTTP, #http_lib_init,1); load_dll(libHTTP, #http_lib_init,1);
SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_STACK); @SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_STACK);
loop() switch(WaitEventTimeout(300) & 0xFF) loop() switch(@WaitEventTimeout(300))
{ {
case evButton: case evButton:
if (GetButtonID() == 1) ExitProcess(); else EventInstall(); btn = @GetButtonID();
if (btn<=2) ExitProcess();
if (btn==9) goto _INSTALL;
keep_settings.click(btn);
restart_apps.click(btn);
break; break;
case evKey: case evKey:
GetKeys(); switch (@GetKeyScancode()) {
if (key_scancode == SCAN_CODE_ESC) ExitProcess(); case SCAN_CODE_ESC: ExitProcess();
if (key_scancode == SCAN_CODE_ENTER) { case SCAN_CODE_ENTER:
if (install_complete) ExitProcess(); if (install_complete) ExitProcess();
else EventInstall(); else {
_INSTALL:
http.get(IMG_URL);
goto _DRAW_WINDOW;
}
} }
break; break;
case evReDraw: case evReDraw:
draw_window(); _DRAW_WINDOW:
break; sc.get();
DefineAndDrawWindow(screen.width-WINW/2,screen.height-WINH/2,
WINW+9,WINH+skin_height,0x34,sc.work,T_WINDOW_TITLE,0);
WriteText(30, 20, 0x81, 0xEC008C, T_TITLE_H1);
if (!install_complete) {
DrawTextViewArea(30, 50, WINW-60, WINH-80, T_INTRO, -1, sc.work_text);
progress.set_size(30, WINH-130, WINW-60, 20);
if (http.transfer<=0) {
DrawCaptButton(WINW-110/2, WINH-70, 110, 28, 9, 0x0092D8, 0xFFFfff, T_INSTALL);
keep_settings.draw(30, WINH - 210);
restart_apps.draw(30, WINH - 185);
}
} else {
DrawIcon32(WINW-32/2, 140, sc.work, 49);
WriteTextCenter(0,185, WINW, sc.work_text, T_COMPLETE);
DrawCaptButton(WINW-110/2, WINH-70, 110, 28, 2,
0x0092D8, 0xFFFfff, T_EXIT);
}
case evNetwork: case evNetwork:
if (http.transfer <= 0) break; if (http.transfer <= 0) break;
http.receive(); http.receive();
if (http.content_length) { if (http.content_length) {
progress.draw_progress(http.content_length - http.content_received * progress.w / http.content_length); progress.draw_progress(http.content_length - http.content_received
* progress.w / http.content_length);
}
if (!http.receive_result) {
CreateFile(http.content_received,
http.content_pointer, "/tmp0/1/latest.img");
http.free();
EventDownloadComplete();
} }
if (http.receive_result == 0) EventDownloadComplete();
} }
} }
void draw_window() dword GetFreeSpaceOfRamdisk()
{ {
sc.get(); dword rdempty = malloc(1440*1024);
DefineAndDrawWindow(screen.width-WINW/2,screen.height-WINH/2, CreateFile(0, 1440*1024, rdempty, "/rd/1/rdempty");
WINW+9,WINH+skin_height,0x34,sc.work,T_WINDOW_TITLE,0); free(rdempty);
GetProcessInfo(#Form, -1); file_size stdcall ("/rd/1/rdempty");
WriteText(30, 20, 0x81, 0xEC008C, T_TITLE_H1); rdempty = EBX;
if (install_complete) { DeleteFile("/rd/1/rdempty");
DrawInstallComplete(); return rdempty;
} else {
DrawIntro();
progress.set_size(30, WINH-130, WINW-60, 20);
}
} }
void DrawIntro() signed CheckFreeSpace(dword _latest, _combined)
{ {
DrawTextViewArea(30, 50, WINW-60, WINH-80, dword cur_size, new_size, empty;
T_INTRO, -1, sc.work_text); DIR_SIZE dir_size;
DrawCaptButton(WINW-110/2, WINH-70, 110, 28, 9999,
0x0092D8, 0xFFFfff, T_INSTALL);
}
void DrawInstallComplete() dir_size.get("/sys");
{ cur_size = dir_size.bytes;
DrawIcon32(WINW-32/2, 140, sc.work, 49);
WriteTextCenter(0,185, WINW, sc.work_text, T_COMPLETE);
DrawCaptButton(WINW-110/2, WINH-70, 110, 28, 1,
0x0092D8, 0xFFFfff, T_EXIT);
}
void EventInstall() copyf("/sys", _combined);
{ copyf(_latest, _combined);
http.get(IMG_URL); dir_size.get(_combined);
new_size = dir_size.bytes;
empty = GetFreeSpaceOfRamdisk();
return cur_size + empty - new_size / 1024;
} }
void EventDownloadComplete() void EventDownloadComplete()
{ {
dword unimg_id, slot_n; dword unimg_id, slot_n;
signed space_delta;
int i=0;
CreateFile(http.content_received, http.content_pointer, "/tmp0/1/latest.img"); char osupdate[32];
http.free(); char latest[40];
char backup[40];
char combined[40];
char exract_param[64];
char backup_settings[64];
unimg_id = RunProgram("/sys/unimg", "/tmp0/1/latest.img /tmp0/1/latest_img -e"); do { sprintf(#osupdate, "/tmp0/1/osupdate%d", i); i++;
} while (dir_exists(#osupdate));
CreateDir(#osupdate);
sprintf(#latest, "%s/latest", #osupdate);
sprintf(#backup, "%s/rdbackup", #osupdate);
sprintf(#combined, "%s/combined", #osupdate);
sprintf(#backup_settings, "%s/settings", #backup);
sprintf(#exract_param, "/tmp0/1/latest.img %s -e", #latest);
unimg_id = RunProgram("/sys/unimg", #exract_param);
do { do {
slot_n = GetProcessSlot(unimg_id); slot_n = GetProcessSlot(unimg_id);
pause(10); pause(10);
} while (slot_n!=0); } while (slot_n!=0);
copyf("/rd/1/settings", "/tmp0/1/settings_backup"); space_delta = CheckFreeSpace(#latest, #combined);
copyf("/tmp0/1/latest_img", "/rd/1"); if (space_delta<0) {
copyf("/tmp0/1/settings_backup", "/rd/1/settings"); sprintf(#param, "'Not enought free space! You need %d Kb more.'E", -space_delta);
notify(#param);
RestartAllProcess(); } else {
install_complete = true; copyf("/sys", #backup);
draw_window(); copyf(#latest, "/sys");
} if (keep_settings.checked) copyf(#backup_settings, "/rd/1/settings");
if (restart_apps.checked) RestartAllProcess();
void RestartAllProcess() { install_complete = true;
int i;
proc_info Process;
for (i=0; i<MAX_PROCESS_COUNT; i++;)
{
GetProcessInfo(#Process, i);
if (Process.name)
&& (!streq(#Process.name, "OS"))
&& (Process.ID != Form.ID)
KillProcess(Process.ID);
} }
RunProgram("/sys/launcher", NULL);
} }
void Operation_Draw_Progress(dword filename) { debug("copying: "); debugln(filename); }