Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7739 leency 1
//Copyright 2007-2020 by Veliant & Leency
6978 leency 2
//Asper, lev, Lrz, Barsuk, Nable, hidnplayr...
3067 leency 3
 
8332 leency 4
//===================================================//
5
//                                                   //
6
//                       LIB                         //
7
//                                                   //
8
//===================================================//
9
 
8413 leency 10
#define MEMSIZE 1024 * 130
5499 leency 11
#include "..\lib\gui.h"
4508 leency 12
#include "..\lib\draw_buf.h"
13
#include "..\lib\list_box.h"
14
#include "..\lib\cursor.h"
5978 leency 15
#include "..\lib\collection.h"
6795 leency 16
#include "..\lib\random.h"
7037 leency 17
#include "..\lib\clipboard.h"
5981 leency 18
 
5499 leency 19
#include "..\lib\obj\box_lib.h"
7049 leency 20
#include "..\lib\obj\libimg.h"
5499 leency 21
#include "..\lib\obj\http.h"
5690 leency 22
#include "..\lib\obj\iconv.h"
7748 leency 23
#include "..\lib\obj\proc_lib.h"
8330 leency 24
#include "..\lib\obj\netcode.h"
7757 leency 25
 
5978 leency 26
#include "..\lib\patterns\history.h"
7748 leency 27
#include "..\lib\patterns\simple_open_dialog.h"
7759 leency 28
#include "..\lib\patterns\toolbar_button.h"
7914 leency 29
#include "..\lib\patterns\restart_process.h"
5408 leency 30
 
8336 leency 31
#include "const.h"
32
#include "cache.h"
33
#include "show_src.h"
34
 
8332 leency 35
//===================================================//
36
//                                                   //
37
//                       DATA                        //
38
//                                                   //
39
//===================================================//
7757 leency 40
bool debug_mode = false;
8396 leency 41
bool show_images = true;
7771 leency 42
 
8016 leency 43
_history history;
44
 
7970 leency 45
enum { TARGET_SAME_TAB, TARGET_NEW_WINDOW, TARGET_NEW_TAB };
46
 
8330 leency 47
#include "TWB\TWB.c" //HTML Parser, a core component
7757 leency 48
 
7759 leency 49
TWebBrowser WB1;
7758 leency 50
 
7771 leency 51
#include "history.h"
7752 leency 52
 
7758 leency 53
#define PADDING 9
54
#define TSZE 25
7771 leency 55
#define STATUSBAR_H 15
56
#define TAB_H 20
7758 leency 57
dword TOOLBAR_H = PADDING+TSZE+PADDING+2;
4677 leency 58
 
7759 leency 59
_http http = 0;
7758 leency 60
 
7750 leency 61
bool source_mode = false;
7282 leency 62
 
8330 leency 63
progress_bar prbar;
7750 leency 64
proc_info Form;
7748 leency 65
 
8336 leency 66
#include "tabs.h"
67
 
68
dword cur_img_url;
69
dword shared_url;
8445 leency 70
dword http_get_type=PAGE;
8365 leency 71
dword render_start_time;
7780 leency 72
int menu_id=NULL;
73
 
7748 leency 74
char default_dir[] = "/rd/1";
7788 leency 75
od_filter filter2 = { 22, "TXT\0HTM\0HTML\0DOCX\0\0" };
7748 leency 76
 
7755 leency 77
char editURL[URL_SIZE+1];
8332 leency 78
edit_box omnibox_edit = {, PADDING+TSZE*2+PADDING+6, PADDING+3, 0xffffff,
7758 leency 79
	0x94AECE, 0xffffff, 0xffffff,0x10000000,URL_SIZE-2,#editURL,0,,19,19};
4534 leency 80
 
8332 leency 81
//===================================================//
82
//                                                   //
83
//                       CODE                        //
84
//                                                   //
85
//===================================================//
86
 
7748 leency 87
void LoadLibraries()
88
{
8330 leency 89
	load_dll(boxlib,      #box_lib_init,0);
90
	load_dll(libimg,      #libimg_init,1);
91
	load_dll(libHTTP,     #http_lib_init,1);
92
	load_dll(iconv_lib,   #iconv_open,0);
93
	load_dll(netcode_lib, #base64_encode,0);
94
	load_dll(Proc_lib,    #OpenDialog_init,0);
7748 leency 95
	OpenDialog_init stdcall (#o_dialog);
96
}
97
 
98
void HandleParam()
99
{
8278 leency 100
	if (!param) {
8336 leency 101
		history.add(DEFAULT_URL);
8278 leency 102
	} else {
103
		if (!strncmp(#param, "-source ", 8)) {
7750 leency 104
			source_mode = true;
7765 leency 105
			history.add(#param + 8);
7936 leency 106
		} else if (!strncmp(#param, "-new ", 5)) {
107
			history.add(#param + 5);
7748 leency 108
		} else {
7914 leency 109
			if (GetProcessesCount("WEBVIEW") == 1) {
110
				history.add(#param);
111
			} else {
112
				shared_url = memopen(#webview_shared, URL_SIZE+1, SHM_OPEN + SHM_WRITE);
113
				strncpy(shared_url, #param, URL_SIZE);
114
				ExitProcess();
115
			}
7748 leency 116
		}
117
	}
7914 leency 118
	shared_url = memopen(#webview_shared, URL_SIZE+1, SHM_CREATE + SHM_WRITE);
7920 leency 119
	ESDWORD[shared_url] = '\0';
7748 leency 120
}
121
 
3067 leency 122
void main()
123
{
8332 leency 124
	int redirect_count=0;
7748 leency 125
	LoadLibraries();
126
	HandleParam();
6045 leency 127
	WB1.list.SetFont(8, 14, 10011000b);
5779 leency 128
	WB1.list.no_selection = true;
7759 leency 129
	WB1.custom_encoding = -1;
8332 leency 130
	@SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER + EVM_STACK);
7914 leency 131
	loop() switch(@WaitEventTimeout(30))
6978 leency 132
	{
133
		case evMouse:
8332 leency 134
			edit_box_mouse stdcall (#omnibox_edit);
6978 leency 135
			mouse.get();
7970 leency 136
 
7282 leency 137
			if (WB1.list.MouseScroll(mouse.vert)) WB1.DrawPage();
7970 leency 138
 
8490 leency 139
			if (WB1.list.count > WB1.list.visible) {
140
				scrollbar_v_mouse (#scroll_wv);
141
				if (scroll_wv.delta2) {
142
					WB1.list.first = scroll_wv.position;
143
					WB1.DrawPage();
144
					break;
145
				}
6978 leency 146
			}
7970 leency 147
 
8500 leency 148
			if (WB1.list.MouseOver(mouse.x, mouse.y)) && (links.hover(WB1.list.y, WB1.list.first))
7758 leency 149
			{
8330 leency 150
				if (mouse.key&MOUSE_MIDDLE) && (mouse.up) {
8500 leency 151
					GetKeyModifier();
7970 leency 152
					if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT) {
153
						EventClickLink(TARGET_NEW_WINDOW);
154
					} else {
155
						EventClickLink(TARGET_NEW_TAB);
156
					}
157
				}
8330 leency 158
				if (mouse.key&MOUSE_LEFT) && (mouse.up) {
7970 leency 159
					CursorPointer.Restore();
160
					EventClickLink(TARGET_SAME_TAB);
161
				}
8330 leency 162
				if (mouse.key&MOUSE_RIGHT) && (mouse.up) {
7970 leency 163
					CursorPointer.Restore();
164
					EventShowLinkMenu();
165
				}
166
			} else {
167
				CursorPointer.Restore();
8330 leency 168
				if (mouse.key&MOUSE_RIGHT) && (mouse.up) && (WB1.list.MouseOver(mouse.x, mouse.y)) {
7970 leency 169
					EventShowPageMenu();
170
				}
7758 leency 171
			}
6978 leency 172
			break;
5711 leency 173
 
6978 leency 174
		case evButton:
8332 leency 175
			ProcessButtonClick( @GetButtonID() );
6978 leency 176
			break;
5711 leency 177
 
6978 leency 178
		case evKey:
8332 leency 179
			@GetKeys();
180
			edit_box_key stdcall(#omnibox_edit);
181
			ProcessKeyEvent();
6978 leency 182
			break;
183
 
184
		case evReDraw:
8490 leency 185
			DefineAndDrawWindow(GetScreenWidth()-WIN_W/2-random(80),GetScreenHeight()-WIN_H/2-random(80),
186
			//DefineAndDrawWindow(0,0,
187
				WIN_W,WIN_H,0x73,0,0,0);
6978 leency 188
			GetProcessInfo(#Form, SelfInfo);
7780 leency 189
			ProcessMenuClick();
7806 leency 190
			sc.get();
7759 leency 191
			if (Form.status_window>2) break;
6978 leency 192
			if (Form.height<120) { MoveSize(OLD,OLD,OLD,120); break; }
193
			if (Form.width<280) { MoveSize(OLD,OLD,280,OLD); break; }
7748 leency 194
			draw_window();
6978 leency 195
			break;
196
 
197
		case evNetwork:
7758 leency 198
			if (http.transfer <= 0) break;
199
			http.receive();
8336 leency 200
 
201
			if (http_get_type==PAGE) {
202
				CheckContentType();
203
				prbar.max = http.content_length;
204
				if (prbar.value != http.content_received) {
205
					prbar.value = http.content_received;
206
					DrawProgress();
207
				}
208
			}
209
 
7758 leency 210
			if (http.receive_result != 0) break;
8499 leency 211
			if (debug_mode) {
212
				EAX = http.transfer;
213
				debugln(#EAX.http_msg.http_header);
214
			}
7758 leency 215
			if (http.status_code >= 300) && (http.status_code < 400)
216
			{
217
				// Handle redirects
218
				if (redirect_count<=5) {
219
					redirect_count++;
8305 leency 220
					HandleRedirect();
7758 leency 221
				} else {
222
					StopLoading();
7791 leency 223
					redirect_count = 0;
8440 leency 224
					if (http_get_type==IMG) goto _IMG_RES;
8457 leency 225
					notify("'Too many redirects.' -E");
4536 leency 226
				}
7758 leency 227
			} else {
228
				// Loading the page is complete, free resources
229
				redirect_count = 0;
8016 leency 230
				if (http_get_type==PAGE) {
8413 leency 231
					history.add(http.cur_url);
8462 leency 232
					if (!strchr(http.cur_url, '?')) {
8492 leency 233
						cache.add(http.cur_url, http.content_pointer, http.content_received, PAGE, WB1.custom_encoding);
8462 leency 234
					}
235
					LoadInternalPage(http.content_pointer, http.content_received);
8425 leency 236
					free(http.content_pointer);
8016 leency 237
				}
238
				else if (http_get_type==IMG) {
8440 leency 239
					_IMG_RES:
8454 leency 240
					if (http.status_code >= 200) && (http.status_code < 300) {
8492 leency 241
						cache.add(cur_img_url, http.content_pointer, http.content_received, IMG, NULL);
8454 leency 242
					} else {
8492 leency 243
						cache.add(cur_img_url, 0, 0, IMG, NULL);
8454 leency 244
					}
8698 leency 245
					http.hfree();
8425 leency 246
					free(http.content_pointer);
8336 leency 247
					GetImg(false);
8016 leency 248
				}
6978 leency 249
			}
7914 leency 250
			break;
251
		default:
252
			if (ESDWORD[shared_url] != '\0') {
253
				EventOpenNewTab(shared_url);
254
				ESDWORD[shared_url] = '\0';
255
				ActivateWindow(GetProcessSlot(Form.ID));
256
			}
6978 leency 257
	}
3067 leency 258
}
259
 
8332 leency 260
 
261
//===================================================//
262
//                                                   //
263
//                      EVENTS                       //
264
//                                                   //
265
//===================================================//
266
 
267
void ProcessButtonClick(dword id__)
7772 leency 268
{
8332 leency 269
	switch (id__)
270
	{
271
		case 1: ExitProcess();
272
		case TAB_CLOSE_ID...TAB_CLOSE_ID+TABS_MAX: EventTabClose(id__ - TAB_CLOSE_ID); return;
273
		case TAB_ID...TAB_ID+TABS_MAX: EventAllTabsClick(id__ - TAB_ID); return;
8492 leency 274
		case ENCODINGS...ENCODINGS+6: EventManuallyChangeEncoding(id__-ENCODINGS); return;
8332 leency 275
		case NEW_WINDOW:       RunProgram(#program_path, NULL); return;
276
		case NEW_TAB:          if (!http.transfer) EventOpenNewTab(URL_SERVICE_HOMEPAGE); return;
277
		case SCAN_CODE_BS:
278
		case BACK_BUTTON:      if (history.back()) OpenPage(history.current()); return;
279
		case FORWARD_BUTTON:   if (history.forward()) OpenPage(history.current()); return;
280
		case GOTOURL_BUTTON:   EventSubmitOmnibox();	return;
281
		case REFRESH_BUTTON:   EventRefreshPage(); return;
282
		case CHANGE_ENCODING:  EventShowEncodingsList(); return;
283
		case SANDWICH_BUTTON:  EventShowMainMenu(); return;
284
		case VIEW_SOURCE:      EventViewSource(); return;
285
		case EDIT_SOURCE:      EventEditSource(); return;
286
		case VIEW_HISTORY:     OpenPage(URL_SERVICE_HISTORY); return;
287
		case DOWNLOAD_MANAGER: EventOpenDownloader(""); return;
288
		case UPDATE_BROWSER:   EventUpdateBrowser(); return;
289
		case CLEAR_CACHE:      EventClearCache(); return;
290
		case IN_NEW_TAB:       EventClickLink(TARGET_NEW_TAB); return;
291
		case IN_NEW_WINDOW:    EventClickLink(TARGET_NEW_WINDOW); return;
292
		case COPY_LINK_URL:    EventCopyLinkToClipboard(); return;
293
		case DOWNLOAD_LINK_CT: EventOpenDownloader( GetAbsoluteActiveURL() ); return;
294
		case OPEN_FILE:        EventOpenDialog(); return;
295
	}
296
}
297
 
8500 leency 298
void ProcessKeyEvent()
8332 leency 299
{
300
	if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT)
301
	{
302
		if (key_scancode == SCAN_CODE_TAB) {EventActivatePreviousTab();return;}
8500 leency 303
		if (key_scancode == SCAN_CODE_KEY_T) {EventOpenNewTab(URL_SERVICE_TEST);return;}
8332 leency 304
	}
305
 
7772 leency 306
	if (key_modifier&KEY_LCTRL) || (key_modifier&KEY_RCTRL) switch(key_scancode)
307
	{
8500 leency 308
		case SCAN_CODE_KEY_O: EventOpenDialog(); return;
309
		case SCAN_CODE_KEY_H: ProcessButtonClick(VIEW_HISTORY); return;
310
		case SCAN_CODE_KEY_U: EventViewSource(); return;
311
		case SCAN_CODE_KEY_T: EventOpenNewTab(URL_SERVICE_HOMEPAGE); return;
312
		case SCAN_CODE_KEY_N: RunProgram(#program_path, NULL); return;
313
		case SCAN_CODE_KEY_J: ProcessButtonClick(DOWNLOAD_MANAGER); return;
314
		case SCAN_CODE_KEY_R: ProcessButtonClick(REFRESH_BUTTON); return;
315
		case SCAN_CODE_ENTER: EventSeachWeb(); return;
316
		case SCAN_CODE_LEFT:  ProcessButtonClick(BACK_BUTTON); return;
317
		case SCAN_CODE_RIGHT: ProcessButtonClick(FORWARD_BUTTON); return;
318
		case SCAN_CODE_KEY_W: EventCloseActiveTab(); return;
319
		case SCAN_CODE_TAB:   EventActivateNextTab(); return;
8336 leency 320
		case SCAN_CODE_F5:    EventClearCache(); return;
8500 leency 321
		default: return;
7772 leency 322
	}
8332 leency 323
 
324
	switch(key_scancode)
325
	{
326
		case SCAN_CODE_UP:    EventScrollUpAndDown(SCAN_CODE_UP); return;
327
		case SCAN_CODE_DOWN:  EventScrollUpAndDown(SCAN_CODE_DOWN); return;
328
		case SCAN_CODE_F6:    {omnibox_edit.flags=ed_focus; DrawOmnibox();} return;
329
		case SCAN_CODE_F5:    EventRefreshPage(); return;
330
		case SCAN_CODE_ENTER: if (omnibox_edit.flags & ed_focus) EventSubmitOmnibox(); return;
331
		case SCAN_CODE_F12:   EventToggleDebugMode(); return;
332
		case SCAN_CODE_F11:   show_images^=1; EventClearCache(); return;
333
		default:              if (WB1.list.ProcessKey(key_scancode)) WB1.DrawPage(); return;
334
	}
7772 leency 335
}
336
 
3067 leency 337
void SetElementSizes()
338
{
8332 leency 339
	omnibox_edit.width = Form.cwidth - omnibox_edit.left - 52 - 16;
8457 leency 340
	WB1.list.SetSizes(0, TOOLBAR_H+TAB_H, Form.cwidth - scroll_wv.size_x,
7771 leency 341
		Form.cheight - TOOLBAR_H - STATUSBAR_H - TAB_H, BASIC_LINE_H);
7759 leency 342
	WB1.list.wheel_size = 7 * BASIC_LINE_H;
7746 leency 343
	WB1.list.column_max = WB1.list.w - scroll_wv.size_x / WB1.list.font_w + 1;
6794 leency 344
	WB1.list.visible = WB1.list.h;
3067 leency 345
}
346
 
5981 leency 347
 
7748 leency 348
void draw_window()
3067 leency 349
{
7910 leency 350
	bool burger_active = false;
351
	if (menu_id == OPEN_FILE) burger_active = true;
352
 
3067 leency 353
	SetElementSizes();
7758 leency 354
 
7806 leency 355
	DrawBar(0,0, Form.cwidth,PADDING, sc.work);
356
	DrawBar(0,PADDING+TSZE+1, Form.cwidth,PADDING-1, sc.work);
357
	DrawBar(0,TOOLBAR_H-2, Form.cwidth,1, MixColors(sc.work_dark, sc.work, 180));
358
	DrawBar(0,TOOLBAR_H-1, Form.cwidth,1, sc.work_graph);
8332 leency 359
	DrawBar(0, PADDING, omnibox_edit.left-2, TSZE+1, sc.work);
360
	DrawBar(omnibox_edit.left+omnibox_edit.width+18, PADDING, Form.cwidth-omnibox_edit.left-omnibox_edit.width-18, TSZE+1, sc.work);
7758 leency 361
 
7910 leency 362
	DrawTopPanelButton(BACK_BUTTON, PADDING-1, PADDING, 30, false);
363
	DrawTopPanelButton(FORWARD_BUTTON, PADDING+TSZE+PADDING-2, PADDING, 31, false);
364
	DrawTopPanelButton(SANDWICH_BUTTON, Form.cwidth-PADDING-TSZE-3, PADDING, -1, burger_active); //burger menu
7758 leency 365
 
7806 leency 366
	DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, sc.work_graph);
7758 leency 367
 
368
	DrawRectangle(WB1.list.x + WB1.list.w, WB1.list.y, scroll_wv.size_x,
369
		WB1.list.h-1, scroll_wv.bckg_col);
370
 
8457 leency 371
	if (!canvas.bufw) {
8500 leency 372
		EventOpenFirstPage();
8457 leency 373
	} else {
7771 leency 374
		WB1.DrawPage();
8457 leency 375
		DrawOmnibox();
7771 leency 376
	}
377
	DrawProgress();
8413 leency 378
	DrawStatusBar(NULL);
7771 leency 379
	DrawTabsBar();
380
}
381
 
8500 leency 382
void EventOpenFirstPage()
383
{
384
	OpenPage(history.current());
385
}
386
 
8492 leency 387
void EventManuallyChangeEncoding(int _new_encoding)
7759 leency 388
{
389
	dword newbuf, newsize;
390
	WB1.custom_encoding = _new_encoding;
391
	newsize = strlen(WB1.o_bufpointer);
392
	newbuf = malloc(newsize);
393
	memmov(newbuf, WB1.o_bufpointer, newsize);
394
	LoadInternalPage(newbuf, newsize);
395
	free(newbuf);
396
}
3067 leency 397
 
7759 leency 398
 
8332 leency 399
void EventScrollUpAndDown(int _direction)
4413 leency 400
{
8332 leency 401
	int i;
402
	for (i=0;i
403
		if (_direction == SCAN_CODE_UP) WB1.list.KeyUp();
404
		if (_direction == SCAN_CODE_DOWN) WB1.list.KeyDown();
405
	}
406
	WB1.DrawPage();
4413 leency 407
}
408
 
8305 leency 409
void EventToggleDebugMode()
410
{
411
	debug_mode ^= 1;
412
	if (debug_mode) notify("'Debug mode ON'-I");
413
	else notify("'Debug mode OFF'-I");
414
}
415
 
416
void EventAllTabsClick(dword _n)
417
{
418
	if (mouse.mkm) {
8490 leency 419
		StopLoading();
8305 leency 420
		EventTabClose(_n);
421
	} else {
8490 leency 422
		if (!http.transfer) EventTabClick(_n);
8355 leency 423
	}
8305 leency 424
}
425
 
426
void EventEditSource()
427
{
428
	if (check_is_the_adress_local(history.current())) {
8330 leency 429
		RunProgram("/rd/1/quark", history.current());
8305 leency 430
	} else {
431
		CreateFile(WB1.bufsize, WB1.bufpointer, "/tmp0/1/WebView_tmp.htm");
8330 leency 432
		if (!EAX) RunProgram("/rd/1/quark", "/tmp0/1/WebView_tmp.htm");
8305 leency 433
	}
434
}
435
 
436
void EventClearCache()
437
{
438
	cache.clear();
439
	notify(#clear_cache_ok);
440
	EventRefreshPage();
441
}
442
 
443
void EventCopyLinkToClipboard()
444
{
445
	Clipboard__CopyText(GetAbsoluteActiveURL());
446
	notify("'URL copied to clipboard'O");
447
}
448
 
4636 leency 449
void StopLoading()
450
{
8305 leency 451
	if (http.stop()) pause(10);
8330 leency 452
	prbar.value = 0;
4645 leency 453
}
454
 
7756 leency 455
//rewrite into
7757 leency 456
//bool strrpl(dword dst, from, into, dst_len);
457
bool ReplaceSpaceInUrl(dword url, size) {
7756 leency 458
	unsigned int i, j;
7757 leency 459
	bool was_changed=false;
460
	for (i=url+size-3; i>url; i--)
7720 leency 461
	{
7756 leency 462
		if (ESBYTE[i]!=' ') continue;
7757 leency 463
		for (j=url+size-3; j>=i; j--) {
464
			ESBYTE[j+3]=ESBYTE[j+2];
7756 leency 465
			ESBYTE[j+2]=ESBYTE[j+1];
466
			ESBYTE[j+1]=ESBYTE[j];
467
		}
468
		ESBYTE[i] = '%';
469
		ESBYTE[i+1] = '2';
470
		ESBYTE[i+2] = '0';
7757 leency 471
		was_changed = true;
7720 leency 472
	}
7757 leency 473
	return was_changed;
7720 leency 474
}
475
 
7801 leency 476
bool HandleUrlFiles(dword _path, _data)
477
{
478
	dword url_from_file;
479
	if (!UrlExtIs(_path, "url")) return false;
7945 leency 480
	if (! url_from_file = strstri(_data, "URL=")) return false;
7801 leency 481
	replace_char(url_from_file, '\n', '\0', strlen(url_from_file));
7945 leency 482
	OpenPage(url_from_file);
483
	return true;
7801 leency 484
}
485
 
7755 leency 486
bool GetLocalFileData(dword _path)
4416 leency 487
{
7801 leency 488
	dword data, size;
8392 leency 489
	read_file(_path, #data, #size);
7801 leency 490
	if (!HandleUrlFiles(_path, data)) {
491
		LoadInternalPage(data, size);
4692 leency 492
	}
7801 leency 493
	free(data);
494
	return true;
7755 leency 495
}
7282 leency 496
 
8336 leency 497
bool GetUrl(dword _http_url)
8330 leency 498
{
499
	char new_url_full[URL_SIZE+1];
500
 
501
	if (!strncmp(_http_url,"http:",5)) {
502
		http.get(_http_url);
8336 leency 503
		return true;
8330 leency 504
	} else if (!strncmp(_http_url,"https://",8)) {
505
		strcpy(#new_url_full, "http://gate.aspero.pro/?site=");
506
		strncat(#new_url_full, _http_url, URL_SIZE);
507
		http.get(#new_url_full);
8336 leency 508
		return true;
8330 leency 509
	}
8336 leency 510
	return false;
8330 leency 511
}
512
 
7755 leency 513
void OpenPage(dword _open_URL)
514
{
515
	char new_url[URL_SIZE+1];
7788 leency 516
	int unz_id;
7755 leency 517
 
518
	StopLoading();
519
 
7771 leency 520
	SetOmniboxText(_open_URL);
521
 
7755 leency 522
	strncpy(#new_url, _open_URL, URL_SIZE);
523
 
524
	//Exclude # from the URL to the load page
525
	//We will bring it back when we get the buffer
7970 leency 526
	if (strrchr(#new_url, '#')) {
527
		anchors.take_anchor_from(#new_url);
528
	}
7755 leency 529
 
7976 leency 530
	/*
531
	There could be several possible types of addresses:
532
	- cached page (only http/https)
533
	- internal page
534
	- web page
535
	- local file
536
	So we need to detect what incoming address is
537
	and then halndle it in the propper way.
538
	*/
539
 
8016 leency 540
	if (cache.has(#new_url)) {
7764 leency 541
		//CACHED PAGE
8413 leency 542
		if (cache.current_type==PAGE) {
543
			history.add(#new_url);
8492 leency 544
			WB1.custom_encoding = cache.current_charset;
8413 leency 545
			LoadInternalPage(cache.current_buf, cache.current_size);
546
		}
547
		else {
548
			EventDownloadAndOpenImage(#new_url);
549
		}
7764 leency 550
 
551
	} else if (!strncmp(#new_url,"WebView:",8)) {
7755 leency 552
		//INTERNAL PAGE
8413 leency 553
		history.add(#new_url);
8492 leency 554
		WB1.custom_encoding = -1;
8278 leency 555
		if (streq(#new_url, URL_SERVICE_HOMEPAGE)) LoadInternalPage(#buildin_page_home, sizeof(buildin_page_home));
556
		else if (streq(#new_url, URL_SERVICE_HELP)) LoadInternalPage(#buildin_page_help, sizeof(buildin_page_help));
8457 leency 557
		else if (streq(#new_url, URL_SERVICE_TEST)) LoadInternalPage(#buildin_page_test, sizeof(buildin_page_test));
7976 leency 558
		else if (streq(#new_url, URL_SERVICE_HISTORY)) ShowHistory();
8278 leency 559
		else LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error));
7800 leency 560
 
7755 leency 561
	} else if (!strncmp(#new_url,"http:",5)) || (!strncmp(#new_url,"https:",6)) {
562
		//WEB PAGE
7757 leency 563
		if (ReplaceSpaceInUrl(#new_url, URL_SIZE)) {
564
			strcpy(#editURL, #new_url);
565
		}
566
 
8016 leency 567
		http_get_type = PAGE;
8330 leency 568
		GetUrl(#new_url);
7758 leency 569
 
570
		DrawOmnibox();
571
 
7755 leency 572
		if (!http.transfer) {
8413 leency 573
			history.add(#new_url);
8278 leency 574
			LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error));
4646 leency 575
		}
7755 leency 576
	} else {
577
		//LOCAL PAGE
8413 leency 578
		history.add(#new_url);
7788 leency 579
		if (UrlExtIs(#new_url,".docx")) {
580
			DeleteFile("/tmp0/1/temp/word/document.xml");
581
			CreateDir("/tmp0/1/temp");
582
			unz_id = RunProgram("/sys/unz", sprintf(#param, "-o \"/tmp0/1/temp\" -h \"%s\"", #new_url));
583
			while (GetProcessSlot(unz_id)) pause(2);
584
			strcpy(#new_url, "/tmp0/1/temp/word/document.xml");
585
		}
7755 leency 586
		if (!GetLocalFileData(#new_url)) {
8278 leency 587
			LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error));
4650 leency 588
		}
4636 leency 589
	}
4416 leency 590
}
4415 leency 591
 
8278 leency 592
dword EventOpenDownloader(dword _url)
593
{
594
	//char download_params[URL_SIZE+50];
595
	return RunProgram("/sys/network/dl", _url);
596
}
7970 leency 597
 
598
bool EventClickAnchor()
4508 leency 599
{
7970 leency 600
	dword aURL = links.active_url;
601
 
602
	if (anchors.get_pos_by_name(aURL+1)!=-1) {
603
		WB1.list.first = anchors.get_pos_by_name(aURL+1);
8417 leency 604
		WB1.list.CheckDoesValuesOkey();
7970 leency 605
		strcpy(#editURL, history.current());
606
		strcat(#editURL, aURL);
607
		DrawOmnibox();
608
		WB1.DrawPage();
609
		return true;
610
	}
611
	return false;
612
}
613
 
614
void EventClickLink(dword _target)
615
{
7756 leency 616
	char new_url[URL_SIZE+1];
7936 leency 617
	char new_url_full[URL_SIZE+1];
7970 leency 618
	dword aURL = GetAbsoluteActiveURL();
619
	if (!aURL) return;
4415 leency 620
 
7970 leency 621
	strcpy(#new_url, aURL);
622
 
623
	if (ESBYTE[aURL]=='#') {
624
		if (_target == TARGET_SAME_TAB) {
625
			EventClickAnchor();
626
			return;
627
		} else {
628
			strcpy(#new_url, history.current());
629
			strcat(#new_url, aURL);
630
		}
631
	}
632
 
633
	if (_target == TARGET_NEW_TAB) {
634
		EventOpenNewTab(#new_url);
7758 leency 635
		return;
636
	}
637
 
7970 leency 638
	if (_target == TARGET_NEW_WINDOW) {
639
		strcpy(#new_url_full, "-new ");
640
		strncat(#new_url_full, #new_url, URL_SIZE);
641
		RunProgram(#program_path, #new_url_full);
7755 leency 642
		return;
5768 leency 643
	}
7742 leency 644
 
7970 leency 645
	if (!strncmp(#new_url,"mailto:", 7)) || (!strncmp(#new_url,"tel:", 4)) {
646
		notify(#new_url);
7755 leency 647
		return;
7742 leency 648
	}
4508 leency 649
 
7771 leency 650
	if (http.transfer) {
5774 leency 651
		StopLoading();
652
	}
6730 leency 653
 
7755 leency 654
	if (strrchr(#new_url, '#')!=0) {
655
		anchors.take_anchor_from(#new_url);
656
		OpenPage(#new_url);
6730 leency 657
		return;
658
	}
659
 
7755 leency 660
	if (!strncmp(#new_url,"WebView:",8)) {
661
		OpenPage(#new_url);
7742 leency 662
		return;
663
	}
6730 leency 664
 
7755 leency 665
	if (strncmp(#new_url,"http://",7)!=0) && (strncmp(#new_url,"https://",8)!=0)
5774 leency 666
	{
7755 leency 667
		if (UrlExtIs(#new_url,".htm")!=true) && (UrlExtIs(#new_url,".html")!=true)
6730 leency 668
		{
7755 leency 669
			if (strchr(#new_url, '|')) {
670
				ESBYTE[strchr(#new_url, '|')] = NULL;
671
				RunProgram(#new_url, strlen(#new_url)+1+#new_url);
672
			} else {
673
				RunProgram("/sys/@open", #new_url);
7422 leency 674
			}
6730 leency 675
			return;
676
		}
5774 leency 677
	}
7755 leency 678
	OpenPage(#new_url);
679
}
680
 
681
void EventSubmitOmnibox()
682
{
683
	char new_url[URL_SIZE+1];
684
	if (!editURL[0]) return;
685
	if (!strncmp(#editURL,"http:",5)) || (editURL[0]=='/')
686
	|| (!strncmp(#editURL,"https:",6)) || (!strncmp(#editURL,"WebView:",8)) {
687
		OpenPage(#editURL);
688
	} else {
689
		strcpy(#new_url, "http://");
7970 leency 690
		strncat(#new_url, #editURL, URL_SIZE-1);
7755 leency 691
		OpenPage(#new_url);
6931 leency 692
	}
5774 leency 693
}
694
 
7755 leency 695
void LoadInternalPage(dword _bufdata, _in_bufsize){
696
	if (!_bufdata) || (!_in_bufsize) {
8278 leency 697
		LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error));
7755 leency 698
	} else {
699
		WB1.list.first = 0; //scroll page to the top
700
		DrawOmnibox();
701
		if(!strrchr(#editURL, '#')) {
702
			strcat(#editURL, #anchors.current);
703
			DrawOmnibox();
704
		}
8365 leency 705
		render_start_time = GetStartTime();
7759 leency 706
		WB1.ParseHtml(_bufdata, _in_bufsize);
8302 leency 707
		// REJECTED. Reason: infinite redirect at Google Results.
708
		/*
709
		if (WB1.redirect) { //
710
			get_absolute_url(#WB1.redirect, history.current());
711
			history.back();
712
			OpenPage(#WB1.redirect);
713
		}
714
		*/
8413 leency 715
		DrawStatusBar(NULL);
7771 leency 716
		DrawActiveTab();
7756 leency 717
		if (source_mode) {
718
			source_mode = false;
7799 leency 719
			WB1.custom_encoding = CH_CP866;
7759 leency 720
			ShowSource(WB1.bufpointer, _in_bufsize);
7757 leency 721
		} else {
8016 leency 722
			WB1.DrawPage();
7756 leency 723
		}
8698 leency 724
		http.hfree();
8445 leency 725
		if (WB1.img_url.count) { GetImg(true); DrawOmnibox(); }
7742 leency 726
	}
727
}
728
 
7799 leency 729
bool UrlExtIs(dword base, ext)
7742 leency 730
{
7755 leency 731
	if (!strcmpi(base + strlen(base) - strlen(ext), ext)) return true;
7742 leency 732
	return false;
733
}
734
 
735
void DrawProgress()
736
{
8330 leency 737
	dword pct;
738
	if (!http.transfer) return;
739
	if (http_get_type==PAGE) && (prbar.max) pct = prbar.value*30/prbar.max; else pct = 10;
8336 leency 740
	if (http_get_type==IMG) pct = prbar.value * 70 / prbar.max + 30;
8332 leency 741
	DrawBar(omnibox_edit.left-1, omnibox_edit.top+20, pct*omnibox_edit.width+16/100, 2, 0x72B7EB);
7742 leency 742
}
743
 
7770 leency 744
void EventShowPageMenu()
6782 leency 745
{
8020 leency 746
	open_lmenu(mouse.x, mouse.y, MENU_TOP_LEFT, NULL, #rmb_menu);
7780 leency 747
	menu_id = VIEW_SOURCE;
6782 leency 748
}
749
 
7770 leency 750
void EventShowLinkMenu()
7759 leency 751
{
8020 leency 752
	open_lmenu(mouse.x, mouse.y, MENU_TOP_LEFT, NULL, #link_menu);
7789 simsanutiy 753
	menu_id = IN_NEW_TAB;
7759 leency 754
}
755
 
7780 leency 756
void EventShowMainMenu()
757
{
8020 leency 758
	open_lmenu(Form.cwidth - PADDING -4, PADDING + TSZE + 3,
759
		MENU_TOP_RIGHT, NULL, #main_menu);
7780 leency 760
	menu_id = OPEN_FILE;
761
}
762
 
7770 leency 763
void EventShowEncodingsList()
7758 leency 764
{
8020 leency 765
	open_lmenu(Form.cwidth-4, Form.cheight - STATUSBAR_H + 12,
766
		MENU_BOT_RIGHT, WB1.cur_encoding + 1,
767
		"UTF-8\nKOI8-RU\nCP1251\nCP1252\nISO8859-5\nCP866");
7780 leency 768
	menu_id = ENCODINGS;
7758 leency 769
}
770
 
7780 leency 771
void ProcessMenuClick()
6795 leency 772
{
7780 leency 773
	int click_id;
7910 leency 774
	if (menu_id) {
775
		if (click_id = get_menu_click()) {
776
			click_id += menu_id - 1;
8332 leency 777
			ProcessButtonClick(click_id);
7910 leency 778
		}
779
		if (!menu_process_id) menu_id = NULL;
7780 leency 780
	}
6795 leency 781
}
782
 
7743 leency 783
void EventSeachWeb()
784
{
7755 leency 785
	char new_url[URL_SIZE+1];
8492 leency 786
	replace_char(#editURL, ' ', '+', URL_SIZE);
7755 leency 787
	strcpy(#new_url, "https://www.google.com/search?q=");
788
	strncat(#new_url, #editURL, URL_SIZE);
789
	OpenPage(#new_url);
7743 leency 790
}
791
 
7748 leency 792
void EventOpenDialog()
793
{
794
	OpenDialog_start stdcall (#o_dialog);
795
	if (o_dialog.status) {
7755 leency 796
		OpenPage(#openfile_path);
7748 leency 797
	}
798
}
799
 
7750 leency 800
void EventViewSource()
801
{
7771 leency 802
	source_mode = true;
803
	EventOpenNewTab(history.current());
7750 leency 804
}
805
 
7893 leency 806
void EventRefreshPage()
807
{
808
	if (http.transfer) {
809
		StopLoading();
810
		draw_window();
811
	} else {
812
		OpenPage(history.current());
813
	}
814
}
815
 
7765 leency 816
void EventUpdateBrowser()
817
{
818
	dword downloader_id, slot_n;
819
	dword current_size;
820
	dword new_size;
821
 
822
	draw_window();
823
 
8278 leency 824
	downloader_id = EventOpenDownloader(#update_param);
7765 leency 825
	do {
826
		slot_n = GetProcessSlot(downloader_id);
827
		pause(10);
828
	} while (slot_n!=0);
829
 
8392 leency 830
	current_size = get_file_size(#program_path);
831
	new_size = get_file_size("/tmp0/1/Downloads/WebView.com");
7765 leency 832
 
8413 leency 833
	if (!new_size) || (new_size<5000) { notify(#update_download_error); return; }
834
	if (current_size == new_size) { notify(#update_is_current);	return; }
7765 leency 835
 
8332 leency 836
	if (CopyFileAtOnce(new_size, "/tmp0/1/Downloads/WebView.com", #program_path)) {
7765 leency 837
		notify(#update_can_not_copy);
838
	} else {
839
		notify(#update_ok);
840
		RunProgram(#program_path, history.current());
841
		ExitProcess();
842
	}
843
}
844
 
8413 leency 845
void DrawStatusBar(dword _msg)
6795 leency 846
{
7970 leency 847
	dword status_y = Form.cheight - STATUSBAR_H + 4;
848
	dword status_w = Form.cwidth - 90;
8417 leency 849
	if (Form.status_window>2) return;
7806 leency 850
	DrawBar(0,Form.cheight - STATUSBAR_H+1, Form.cwidth,STATUSBAR_H-1, sc.work);
8413 leency 851
	if (_msg) {
852
		ESI = math.min(status_w/6, strlen(_msg));
853
		WriteText(10, status_y, 0, sc.work_text, _msg);
7758 leency 854
	}
7970 leency 855
	DefineHiddenButton(status_w+20, status_y-3, 60, 12, CHANGE_ENCODING);
856
	WriteTextCenter(status_w+20, status_y, 60, sc.work_text, WB1.cur_encoding*10+#charsets);
7758 leency 857
}
858
 
859
void DrawOmnibox()
860
{
7784 leency 861
	int imgxoff;
7758 leency 862
 
8332 leency 863
	DrawOvalBorder(omnibox_edit.left-2, omnibox_edit.top-3, omnibox_edit.width+18, 24, sc.work_graph,
7806 leency 864
		sc.work_graph, sc.work_graph, sc.work_dark);
8332 leency 865
	DrawBar(omnibox_edit.left-1, omnibox_edit.top-2, omnibox_edit.width+18, 1, 0xD8DCD8);
866
	DrawBar(omnibox_edit.left-1, omnibox_edit.top-1, omnibox_edit.width+18, 1, omnibox_edit.color);
867
	DrawBar(omnibox_edit.left-1, omnibox_edit.top, 1, 22, omnibox_edit.color);
7758 leency 868
 
8332 leency 869
	if (omnibox_edit.flags & ed_focus) omnibox_edit.flags = ed_focus; else omnibox_edit.flags = 0;
870
	EditBox_UpdateText(#omnibox_edit, omnibox_edit.flags);
871
	edit_box_draw stdcall(#omnibox_edit);
7784 leency 872
	if (http.transfer) imgxoff = 16*23*3; else imgxoff = 0;
8332 leency 873
	_PutImage(omnibox_edit.left+omnibox_edit.width+1, omnibox_edit.top-1, 16, 23, imgxoff + #editbox_icons);
874
	DefineHiddenButton(omnibox_edit.left+omnibox_edit.width-1, omnibox_edit.top-2, 17, 23, REFRESH_BUTTON);
7758 leency 875
 
876
	DrawProgress();
877
}
878
 
7771 leency 879
void SetOmniboxText(dword _text)
880
{
8336 leency 881
	edit_box_set_text stdcall (#omnibox_edit, _text);
8355 leency 882
	omnibox_edit.pos = omnibox_edit.flags = 0;
883
	DrawOmnibox();
7771 leency 884
}
7758 leency 885
 
7970 leency 886
dword GetAbsoluteActiveURL()
887
{
888
	char abs_url[URL_SIZE];
889
	if (links.active_url) {
890
		strncpy(#abs_url, links.active_url, URL_SIZE);
8291 leency 891
		get_absolute_url(#abs_url, history.current());
7970 leency 892
		return #abs_url;
893
	}
894
	return 0;
895
}
7771 leency 896
 
8305 leency 897
void CheckContentType()
898
{
899
	char content_type[64];
8319 leency 900
	if (http.header_field("content-type", #content_type, sizeof(content_type))) // application || image
8413 leency 901
 
902
	if (content_type[0] == 'i') {
903
		EventDownloadAndOpenImage(http.cur_url);
904
		StopLoading();
8499 leency 905
	}
906
	else if (content_type[0] == 'a') {
8444 leency 907
		EventOpenDownloader(http.cur_url);
8305 leency 908
		StopLoading();
909
	}
8499 leency 910
	else {
911
		WB1.custom_encoding = -1;
912
		if (EAX = strchr(#content_type, '=')) {
913
			WB1.custom_encoding = get_encoding_type_by_name(EAX+1);
914
		}
915
	}
8305 leency 916
}
917
 
8413 leency 918
void EventDownloadAndOpenImage(dword _url)
919
{
920
	char image_download_url[URL_SIZE];
921
	strcpy(#image_download_url, "-eo ");
922
	strncat(#image_download_url, _url, URL_SIZE);
923
	EventOpenDownloader(#image_download_url);
924
}
925
 
8305 leency 926
void HandleRedirect()
927
{
8500 leency 928
	dword redirect_url = malloc(URL_SIZE);
929
	http.header_field("location", redirect_url, URL_SIZE);
930
	get_absolute_url(redirect_url, http.cur_url);
8305 leency 931
	http.hfree();
8500 leency 932
	if (http_get_type==PAGE) OpenPage(redirect_url);
933
	else if (http_get_type==IMG) GetUrl(redirect_url);
934
	free(redirect_url);
8305 leency 935
}
936
 
8336 leency 937
dword GetImg(bool _new)
8016 leency 938
{
8336 leency 939
	int i;
8330 leency 940
	if (!show_images) return;
8336 leency 941
	http_get_type = IMG;
942
 
8396 leency 943
	for (i = 0; i < WB1.img_url.count; i++)
8336 leency 944
	{
8396 leency 945
		cur_img_url = WB1.img_url.get(i);
8440 leency 946
		if (debug_mode) {debug("get img: ");debugln(cur_img_url);}
8336 leency 947
		if (cache.has(cur_img_url)==false) {
8396 leency 948
			prbar.max = WB1.img_url.count;
8336 leency 949
			prbar.value = i;
8413 leency 950
			if (GetUrl(cur_img_url)) {DrawStatusBar(cur_img_url); DrawProgress(); return;}
8336 leency 951
		}
8016 leency 952
	}
8336 leency 953
	if (_new) return;
8016 leency 954
	DrawOmnibox();
8413 leency 955
	DrawStatusBar(T_RENDERING);
8500 leency 956
	WB1.Reparse();
8016 leency 957
	WB1.DrawPage();
8413 leency 958
	debugln(sprintf(#param, T_DONE_IN_SEC, GetStartTime()-render_start_time/100));
959
	DrawStatusBar(NULL);
8016 leency 960
}
961
 
5631 pavelyakov 962
stop: