Subversion Repositories Kolibri OS

Rev

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