@@ -1,4 +1,4 @@
# define MEMSIZE 1024*46 0
# define MEMSIZE 1024*5 0
# include "../lib/io.h"
# include "../lib/gui.h"
@@ -17,147 +17,183 @@
# include "lang.h--"
# endif
_http http ;
proc_info Form ;
bool install_complete = false ;
sensor progress ;
_http http ;
# define WINW 460
# define WINH 380
//#define LANG_RUS 1
# ifdef LANG_RUS
# define WINH 345
# define T_WINDOW_TITLE "<22> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> KolibriOS"
# define T_TITLE_H1 "<22> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> "
# define T_INTRO "<22> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ਫ<EFBFBD> <E0A8AB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ᪠砥<E1AAA0> <20> <> <EFBFBD> <E1ABA5> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> KolibriOS <20> <20> <> ᯠ<EFBFBD> <E1AFA0> <EFBFBD> <EFBFBD> <20> <> <20> <> RAM-<2D> <> <EFBFBD> <EFBFBD> . <20> <> <EFBFBD> <20> ⮬ <20> <> <EFBFBD> <EFBFBD> <20> <> <20> 㤥<EFBFBD> <20> <> १<EFBFBD> <E0A5A7> <EFBFBD> 饭<EFBFBD> , <20> <> <EFBFBD> <20> ⮣<EFBFBD> <20> <> <EFBFBD> <EFBFBD> 室<EFBFBD> <E5AEA4> <EFBFBD> <20> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> <20> <> ࠧ <20> <20> <> १<EFBFBD> <E0A5A7> <EFBFBD> 㧨<EFBFBD> <E3A7A8> <EFBFBD> . <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> , <20> <> <EFBFBD> ன<EFBFBD> <E0AEA9> <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ਫ<EFBFBD> <E0A8AB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> । <20> <> 砫<EFBFBD> <E7A0AB> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> .
<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> : <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 䠩 <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> RAM - <EFBFBD> <EFBFBD> ᪥ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> १ <EFBFBD> <EFBFBD> <EFBFBD> ᠭ <EFBFBD> ! " ;
# define T_INSTALL "<22> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> "
# define T_COMPLETE "<22> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> 襭<EFBFBD> "
# define T_EXIT "<22> <> 室"
# define IMG_URL "http: //builds.kolibrios.org/rus/data/data/kolibri.img"
# define KS "<22> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ன<EFBFBD> <E0AEA9> "
# define RA "<22> <> १<EFBFBD> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <20> ணࠬ<E0AEA3> <E0A0AC> "
# else
# define WINH 305
# define T_WINDOW_TITLE "KolibriOS Online Updater"
# 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.
Please close all opened apps before start .
ALERT : All chages on RAM - disk will be lost ! " ;
Note that all changes on RAM - disk will be lost . " ;
# define T_INSTALL "Update"
# define T_COMPLETE "Update complete"
# define T_EXIT "Exit"
# define IMG_URL "http: //builds.kolibrios.org/eng/data/data/kolibri.img"
# define KS "Keep settings folder"
# define RA "Restart all apps"
# endif
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 ( )
{
//load_dll(libini, #lib_init,1);
int btn ;
sensor progress ;
load_dll ( libio , # libio_init , 1 ) ;
load_dll ( libimg , # libimg_init , 1 ) ;
load_dll ( libHTTP , # http_lib_init , 1 ) ;
SetEventMask ( EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_STACK ) ;
loop ( ) switch ( WaitEventTimeout ( 300 ) & 0xFF )
@ SetEventMask ( EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_STACK ) ;
loop ( ) switch ( @ WaitEventTimeout ( 300 ) )
{
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 ;
case evKey :
GetKeys ( ) ;
if ( key_scancode = = SCAN_CODE_ESC) ExitProcess ( ) ;
if ( key_scancode = = SCAN_CODE_ENTER) {
switch ( @ GetKeyScancode ( ) ) {
case SCAN_CODE_ESC : ExitProcess ( ) ;
case SCAN_CODE_ENTER :
if ( install_complete ) ExitProcess ( ) ;
else EventInstall ( ) ;
else {
_INSTALL :
http . get ( IMG_URL ) ;
goto _DRAW_WINDOW ;
}
}
break ;
case evReDraw :
draw_window ( ) ;
break ;
_DRAW_WINDOW :
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 :
if ( http . transfer < = 0 ) break ;
http . receive ( ) ;
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 ( ) ;
DefineAndDrawWindow ( screen . width - WINW / 2 , screen . height - WINH / 2 ,
WINW + 9 , WINH + skin_height , 0x34 , sc . work , T_WINDOW_TITLE , 0 ) ;
GetProcessInfo ( # Form , - 1 ) ;
WriteText ( 30 , 20 , 0x81 , 0xEC008C , T_TITLE_H1 ) ;
if ( install_complete ) {
DrawInstallComplete ( ) ;
} else {
DrawIntro ( ) ;
progress . set_size ( 30 , WINH - 130 , WINW - 60 , 20 ) ;
}
dword rdempty = malloc ( 1440 * 1024 ) ;
CreateFile ( 0 , 1440 * 1024 , rdempty , " /rd/1/rdempty " ) ;
free ( rdempty ) ;
file_size stdcall ( " /rd/1/rdempty " ) ;
rdempty = EBX ;
DeleteFile ( " /rd/1/rdempty " ) ;
return rdempty ;
}
void DrawIntro ( )
signed CheckFreeSpace ( dword _latest , _combined )
{
DrawTextViewArea ( 30 , 50 , WINW - 60 , WINH - 80 ,
T_INTRO , - 1 , sc . work_text ) ;
DrawCaptButton ( WINW - 110 / 2 , WINH - 70 , 110 , 28 , 9999 ,
0x0092D8 , 0xFFFfff , T_INSTALL ) ;
}
dword cur_size , new_size , empty ;
DIR_SIZE dir_size ;
void DrawInstallComplete ( )
{
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 ) ;
}
dir_size . get ( " /sys " ) ;
cur_size = dir_size . bytes ;
void EventInstall ( )
{
http . get ( IMG_URL ) ;
copyf ( " /sys " , _combined ) ;
copyf ( _latest , _combined ) ;
dir_size . get ( _combined ) ;
new_size = dir_size . bytes ;
empty = GetFreeSpaceOfRamdisk ( ) ;
return cur_size + empty - new_size / 1024 ;
}
void EventDownloadComplete ( )
{
dword unimg_id , slot_n ;
signed space_delta ;
int i = 0 ;
CreateFile ( http . content_received , http . content_poin ter , " /tmp0/1/latest.img " ) ;
http . free ( ) ;
char osupda te[ 32 ] ;
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 {
slot_n = GetProcessSlot ( unimg_id ) ;
pause ( 10 ) ;
} while ( slot_n ! = 0 ) ;
copyf ( " /rd/1/settings " , " /tmp0/1/settings_backup " ) ;
copy f( " /tmp0/1/latest_img " , " /rd/1 " ) ;
copyf ( " /tmp0/1/settings_backup " , " /rd/1/settings " ) ;
RestartAllProcess ( ) ;
space_delta = CheckFreeSpace ( # latest , # combined ) ;
i f ( space_delta < 0 ) {
sprintf ( # param , " 'Not enought free space! You need %d Kb more.'E " , - space_delta ) ;
notify ( # param ) ;
} else {
copyf ( " /sys " , # backup ) ;
copyf ( # latest , " /sys " ) ;
if ( keep_settings . checked ) copyf ( # backup_settings , " /rd/1/settings " ) ;
if ( restart_apps . checked ) RestartAllProcess ( ) ;
install_complete = true ;
draw_window ( ) ;
}
void RestartAllProcess ( ) {
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 ) ; }