Subversion Repositories Kolibri OS

Rev

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