Subversion Repositories Kolibri OS

Rev

Rev 8839 | Rev 8996 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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