Aelia 0.3: Sandwich menu, handle redirects, add links.h

+ lib/debug.h

git-svn-id: svn://kolibrios.org@6058 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2016-01-14 23:05:51 +00:00
parent 271a48126e
commit ae17b4e165
13 changed files with 371 additions and 185 deletions

View File

@ -1,4 +1,4 @@
#define MEMSIZE 4096*30
#define MEMSIZE 4096*60
#include "../lib/font.h"
#include "../lib/io.h"
@ -13,9 +13,7 @@
#include "../lib/patterns/libimg_load_skin.h"
#include "../lib/patterns/simple_open_dialog.h"
#include "../lib/patterns/history.h"
#include "../browser/http_downloader.h"
#include "parse_address.h"
#include "../lib/patterns/http_downloader.h"
char default_dir[] = "/rd/1";
od_filter filter2 = {0,0};
@ -48,9 +46,9 @@ enum {
MAGNIFY_PLUS,
CHANGE_ENCODING,
RUN_EDIT,
SHOW_INFO,
GO_BACK,
GO_FORWARD,
SANDWICH
};
char address[UML]="http://";
@ -60,7 +58,11 @@ edit_box address_box = {250,56,34,0xffffff,0x94AECE,0xffffff,0xffffff,0,UML,#add
#include "ini.h"
#include "gui.h"
#include "label.h"
#include "link.h"
#include "prepare_page.h"
//#include "special_symbols.h"
#define SANDWICH_MENU "Refresh page\nEdit page\nHistory\nAbout"
void InitDlls()
{
@ -75,7 +77,7 @@ void InitDlls()
void main()
{
{
InitDlls();
OpenDialog_init stdcall (#o_dialog);
label.init(DEFAULT_FONT);
@ -98,12 +100,19 @@ void main()
break;
case evReDraw:
draw_window();
if (menu.list.cur_y) {
if (menu.list.cur_y>=10) && (menu.list.cur_y<20) {
encoding = menu.list.cur_y - 10;
debugln("evReDraw: charset changed");
EventOpenAddress(history.current());
EventPageRefresh();
menu.list.cur_y = 0;
}
if (menu.list.cur_y>=20) {
menu.list.cur_y-=20;
if (menu.list.cur_y==0) EventPageRefresh();
if (menu.list.cur_y==1) EventRunEdit();
if (menu.list.cur_y==2) EventShowHistory();
if (menu.list.cur_y==3) EventShowInfo();
menu.list.cur_y = 0;
}
}
}
}
@ -139,8 +148,8 @@ void HandleButtonEvent()
case RUN_EDIT:
EventRunEdit();
break;
case SHOW_INFO:
EventShowInfo();
case SANDWICH:
EventShowSandwichMenu();
break;
}
}
@ -205,6 +214,7 @@ void HandleMouseEvent()
edit_box_mouse stdcall (#address_box);
mouse.get();
list.wheel_size = 7;
link.hover();
if (list.MouseScroll(mouse.vert)) {
DrawPage();
return;
@ -279,6 +289,8 @@ char temp[UML];
else
DrawProgress(STEP_2_COUNT_PAGE_HEIGHT-STEP_1_DOWNLOAD_PAGE/2);
}
strcpy(#address,downloader.url);
DrawAddressBox();
io.buffer_data = downloader.bufpointer;
}
}
@ -356,6 +368,17 @@ void EventGoForward()
if (history.forward()) EventOpenAddress(history.current());
}
void EventShowSandwichMenu()
{
menu.selected = 0;
menu.show(Form.left+Form.cwidth-130,Form.top+TOOLBAR_H+skin_height-10, 130, SANDWICH_MENU, 20);
}
void EventPageRefresh()
{
EventOpenAddress(history.current());
}
/* ------------------------------------------- */
@ -375,11 +398,10 @@ void draw_window()
DrawToolbarButton(GO_BACK, 8);
DrawToolbarButton(GO_FORWARD, 33);
DrawToolbarButton(OPEN_FILE, 68);
DrawToolbarButton(MAGNIFY_PLUS, Form.cwidth - 161);
DrawToolbarButton(MAGNIFY_MINUS, Form.cwidth - 136);
DrawToolbarButton(CHANGE_ENCODING, Form.cwidth - 102);
DrawToolbarButton(RUN_EDIT, Form.cwidth - 68);
DrawToolbarButton(SHOW_INFO, Form.cwidth - 34);
DrawToolbarButton(MAGNIFY_PLUS, Form.cwidth - 125);
DrawToolbarButton(MAGNIFY_MINUS, Form.cwidth - 100);
DrawToolbarButton(CHANGE_ENCODING, Form.cwidth - 64);
DrawToolbarButton(SANDWICH, Form.cwidth - 31);
DrawAddressBox();
@ -413,7 +435,7 @@ void DrawAddressBox()
{
address_box.left = 97;
address_box.top = 11;
address_box.width = Form.cwidth - address_box.left - 172;
address_box.width = Form.cwidth - address_box.left - 138;
DrawRectangle(address_box.left-4, address_box.top-5, address_box.width+6, 23, 0x8C8C8C);
DrawWideRectangle(address_box.left-3, address_box.top-3, address_box.width+5, 21, 4, address_box.color);
address_box.size = address_box.pos = address_box.shift = address_box.shift_old = strlen(#address);

55
programs/cmm/aelia/link.h Normal file
View File

@ -0,0 +1,55 @@
struct _link
{
int count;
int x[4096], y[4096], w[4096], h[4096];
collection text;
collection url;
void clear();
void add();
int hover();
int active;
} link;
void _link::clear()
{
text.drop();
url.drop();
count = 0;
}
void _link::add(int _xx, _yy, _ww, _hh, dword _textt, _urll )
{
if (count==4095) return;
x[count] = _xx;
y[count] = _yy;
w[count] = _ww;
h[count] = _hh;
text.add(_textt);
url.add(_urll);
count++;
}
int _link::hover()
{
//char tempp[4096];
dword color;
int i;
active = 0;
mouse.x = mouse.x - list.x;
mouse.y = mouse.y - list.y;
for (i=0; i<link.count; i++) {
if(link.y[i]>list.first*list.item_h) && (link.y[i]<list.first*list.item_h+list.h) {
// sprintf(#tempp, "mx:%i my:%i x[i]:%i y[i]:%i", mx, my, x[i], y[i]);
// sprintf(#tempp);
if (mouse.x>link.x[i])
&& (-list.first*list.item_h+link.y[i]<mouse.y)
&& (mouse.x<link.x[i]+link.w[i])
&& (-list.first*list.item_h+link.y[i]+link.h[i]>mouse.y)
color = 0xFF0000;
else
color = 0xCCCccc;
DrawRectangle(link.x[i]+list.x+1, -list.first*list.item_h+link.y[i]+list.y, link.w[i], link.h[i], color);
}
}
return false;
}

View File

@ -1,74 +0,0 @@
int check_is_the_adress_local(dword _in)
{
if(!strncmp(_in,"/sys/",5)) return true;
if(!strncmp(_in,"/hd/",4)) return true;
if(!strncmp(_in,"/fd/",4)) return true;
if(!strncmp(_in,"/rd/",4)) return true;
if(!strncmp(_in,"/tmp/",5)) return true;
if(!strncmp(_in,"/cd/",4)) return true;
if(!strncmp(_in,"/bd/",4)) return true;
if(!strncmp(_in,"/usbhd/",7)) return true;
if(!strncmp(_in,"/kolibrios/",11)) return true;
return false;
}
/*
int check_is_the_url_absolute(dword in)
{
if(!strncmp(_in,"http:",5)) return true;
if(!strncmp(_in,"https:",6)) return true;
if(!strncmp(_in,"ftp:",4)) return true;
}
void GetAbsoluteURL(dword in_URL)
{
int i;
dword orig_URL = in_URL;
char newurl[UML];
while (i=strstr(in_URL, "&amp;"))
{
strcpy(i+1, i+5);
}
if (UrlIsAbsolute(in_URL)) return;
IF (!strcmpn(in_URL,"./", 2)) in_URL+=2;
if (!http_transfer)
{
strcpy(#newurl, History.current());
}
else
{
strcpy(#newurl, History.items.get(History.active-2));
}
if (ESBYTE[in_URL] == '/') //remove everything after site domain name
{
i = strchr(#newurl+8, '/');
if (i) ESBYTE[i]=0;
in_URL+=1;
}
_CUT_ST_LEVEL_MARK:
if (newurl[strrchr(#newurl, '/')-2]<>'/')
{
newurl[strrchr(#newurl, '/')] = 0x00;
}
IF (!strncmp(in_URL,"../",3))
{
in_URL+=3;
newurl[strrchr(#newurl, '/')-1] = 0x00;
goto _CUT_ST_LEVEL_MARK;
}
if (newurl[strlen(#newurl)-1]<>'/') strcat(#newurl, "/");
strcat(#newurl, in_URL);
strcpy(orig_URL, #newurl);
}
*/

View File

@ -6,6 +6,7 @@ void PreparePage()
//get font chars width, need to increase performance
get_label_symbols_size();
ChangeCharset(charsets[encoding], "CP866", io.buffer_data);
link.clear();
if (strstri(io.buffer_data, "<html")==-1) {
debugln("no <html> found");
DrawProgress(STEP_2_COUNT_PAGE_HEIGHT); ParceTxt(false); //get page height to calculate buffer size
@ -82,8 +83,19 @@ struct _style {
bool pre;
bool ignore;
dword color;
void clear();
} style;
void _style::clear()
{
b=u=i=s=0;
h1=h2=h3=h4=h5=h6=0;
a=0;
pre=0;
ignore=0;
color=0;
}
struct _text {
dword start;
int x, y;
@ -96,6 +108,7 @@ struct _tag {
dword value[10];
void parce();
int nameis();
void clear();
};
void _tag::parce()
@ -108,10 +121,15 @@ void _tag::parce()
int _tag::nameis(dword _in_tag_name)
{
if (strcmp(_in_tag_name, name)==0) return true;
if (name) && (strcmp(_in_tag_name, name)==0) return true;
return false;
}
void _tag::clear()
{
start=name=0;
}
#define HTML_PADDING_X 8;
#define HTML_PADDING_Y 5;
@ -127,21 +145,24 @@ _text text;
_tag tag;
dword DOM_pos;
tag.clear();
style.clear();
/* Create DOM */
debugln("creating DOM");
DOM.len = strlen(io.buffer_data);
DOM.start = malloc(DOM.len);
DOM.end = DOM.start + DOM.len;
strlcpy(DOM.start, io.buffer_data, DOM.len);
//RemoveSpecialSymbols(DOM.start, DOM.len);
//DOM.len = strlen(DOM.start);
/* Parce DOM */
debugln("starting DOM parce...");
text.start = DOM_pos;
text.start = DOM.start;
for (DOM_pos=DOM.start; DOM_pos<DOM.end; DOM_pos++)
{
if (ESBYTE[DOM_pos]==0x0D) || (ESBYTE[DOM_pos]==0x0A) ESBYTE[DOM_pos]=' ';
ch = ESBYTE[DOM_pos];
//debugch(ch);
if (ch=='<') {
ESBYTE[DOM_pos] = '\0';
tag.start = DOM_pos + 1;
@ -152,7 +173,6 @@ dword DOM_pos;
}
while (get_label_len(text.start) + stroka_x + 30 > list.w)
{
//debugln("long line cut");
zeroch = 0;
for (line_break=tag.start-1; line_break>text.start; line_break--;)
{
@ -161,7 +181,10 @@ dword DOM_pos;
ESBYTE[line_break] >< zeroch; //restore line
}
if (draw==true) {
if (style.a) label_draw_bar(stroka_x, stroka_y+label.size.pt+1, get_label_len(text.start), style.color);
if (style.a) {
link.add(stroka_x,stroka_y,get_label_len(text.start),list.item_h,text.start," ");
label_draw_bar(stroka_x, stroka_y+label.size.pt+1, get_label_len(text.start), style.color);
}
WriteTextIntoBuf(stroka_x, stroka_y, style.color, text.start);
}
ESBYTE[line_break] >< zeroch; //restore line
@ -170,7 +193,10 @@ dword DOM_pos;
stroka_y += list.item_h;
}
if (draw==true) {
if (style.a) label_draw_bar(stroka_x, stroka_y+label.size.pt+1, get_label_len(text.start), style.color);
if (style.a) {
link.add(stroka_x,stroka_y,get_label_len(text.start),list.item_h,text.start," ");
label_draw_bar(stroka_x, stroka_y+label.size.pt+1, get_label_len(text.start), style.color);
}
WriteTextIntoBuf(stroka_x, stroka_y, style.color, text.start);
}
stroka_x += get_label_len(text.start);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -26,6 +26,7 @@
//useful patterns
#include "..\lib\patterns\libimg_load_skin.h"
#include "..\lib\patterns\history.h"
#include "..\lib\patterns\http_downloader.h"
char homepage[] = FROM "html\\homepage.htm";
@ -101,7 +102,6 @@ enum {
#include "..\TWB\TWB.c"
#include "history.h"
#include "show_src.h"
#include "http_downloader.h"
#include "download_manager.h"
char editURL[sizeof(URL)];

View File

@ -1,18 +1,15 @@
c-- window.c
c-- collections.c
c-- menu.c
c-- mixcolors.c
@echo off
@del _window
@del _collections
@del _menu
@del _mixcolors
@rename window.com _window
@rename collections.com _collections
@rename menu.com _menu
@rename mixcolors.com _mixcolors
@del warning.txt
@echo on

68
programs/cmm/lib/debug.h Normal file
View File

@ -0,0 +1,68 @@
#ifndef INCLUDE_DEBUG_H
#define INCLUDE_DEBUG_H
#print "[include <debug.h>]\n"
#ifndef INCLUDE_STRING_H
#include "../lib/strings.h"
#endif
inline fastcall void debugch( ECX)
{
$push eax
$push ebx
$mov eax,63
$mov ebx,1
$int 0x40
$pop ebx
$pop eax
}
inline fastcall void debug( EDX)
{
$push eax
$push ebx
$push ecx
$mov eax, 63
$mov ebx, 1
NEXT_CHAR:
$mov ecx, DSDWORD[edx]
$or cl, cl
$jz DONE
$int 0x40
$inc edx
$jmp NEXT_CHAR
DONE:
$pop ecx
$pop ebx
$pop eax
}
inline fastcall void debugln( EDX)
{
debug( EDX);
debugch('\n');
}
inline void debugi(dword d_int)
{
char tmpch[12];
itoa_(#tmpch, d_int);
debugln(#tmpch);
}
:void assert(dword _type, _actual, _expected)
{
char r[4096];
if (_type=='s') {
if (streq(_actual, _expected)) return;
sprintf(#r, "==========nok{\nactual: %s\nexpected: %s", _actual, _expected);
debugln(#r);
}
if (_type=='i') {
if (_actual == _expected)) return;
sprintf(#r, "==========nok{\nactual: %i\nexpected: %i", _actual, _expected);
debugln(#r);
}
}
#endif

View File

@ -74,7 +74,7 @@ char program_path[4096];
#define SCAN_CODE_DEL 083
#define SCAN_CODE_INS 082
#define SCAN_CODE_SPACE 057
#define SCAN_CODE_LEFT 075
#define SCAN_CODE_RIGHT 077
#define SCAN_CODE_DOWN 080
@ -404,8 +404,8 @@ inline fastcall int GetClientTop()
$mov eax, 48
$mov ebx, 5
$int 0x40
$mov eax, ebx
$shr eax, 16
$mov eax, ebx
$shr eax, 16
}
inline fastcall int GetClientHeight()
@ -413,7 +413,7 @@ inline fastcall int GetClientHeight()
$mov eax, 48
$mov ebx, 5
$int 0x40
$mov eax, ebx
$mov eax, ebx
}
@ -437,61 +437,6 @@ inline fastcall int PlaySpeaker( ESI)
$int 0x40
}
inline fastcall void debugln( EDX)
{
$push eax
$push ebx
$push ecx
$mov eax, 63
$mov ebx, 1
NEXT_CHAR:
$mov ecx, DSDWORD[edx]
$or cl, cl
$jz DONE
$int 0x40
$inc edx
$jmp NEXT_CHAR
DONE:
$mov cl, 13
$int 0x40
$mov cl, 10
$int 0x40
$pop ecx
$pop ebx
$pop eax
}
inline fastcall void debug( EDX)
{
$push eax
$push ebx
$push ecx
$mov eax, 63
$mov ebx, 1
NEXT_CHAR:
$mov ecx, DSDWORD[edx]
$or cl, cl
$jz DONE
$int 0x40
$inc edx
$jmp NEXT_CHAR
DONE:
$pop ecx
$pop ebx
$pop eax
}
inline fastcall void debugch( ECX)
{
$push eax
$push ebx
$mov eax,63
$mov ebx,1
$int 0x40
$pop ebx
$pop eax
}
//------------------------------------------------------------------------------
void DefineAndDrawWindow(dword x, y, size_w, size_h, byte WindowType,dword WindowAreaColor, EDI, ESI)
@ -606,7 +551,7 @@ void DrawBar(dword x,y,w,h,EDX)
EAX = 13;
EBX = x<<16+w;
ECX = y<<16+h;
$int 0x40
$int 0x40
}
void DefineButton(dword x,y,w,h,EDX,ESI)
@ -812,3 +757,7 @@ ______STOP______:
#ifndef INCLUDE_MEM_H
#include "../lib/mem.h"
#endif
#ifndef INCLUDE_DEBUG_H
#include "../lib/debug.h"
#endif

View File

@ -7,10 +7,6 @@
#include "../lib/kolibri.h"
#endif
#ifndef INCLUDE_DLL_H
#include "../lib/dll.h"
#endif
dword iconv_lib = #a_iconv_lib;
char a_iconv_lib[19]="/sys/lib/iconv.obj\0";

View File

@ -0,0 +1,163 @@
enum {
STATE_NOT_STARTED,
STATE_IN_PROGRESS,
STATE_COMPLETED
};
struct DOWNLOADER {
unsigned data_downloaded_size, data_full_size;
dword bufpointer, bufsize, url;
byte state;
dword http_transfer;
int http_status_code;
dword Start();
void Stop();
void Completed();
int MonitorProgress();
} downloader;
dword DOWNLOADER::Start(dword _url)
{
url = _url;
state = STATE_IN_PROGRESS;
http_get stdcall (url, 0, 0, #accept_language);
http_transfer = EAX;
return http_transfer;
}
void DOWNLOADER::Stop()
{
state = STATE_NOT_STARTED;
if (http_transfer!=0)
{
EAX = http_transfer;
EAX = EAX.http_msg.content_ptr; // get pointer to data
$push EAX // save it on the stack
http_free stdcall (http_transfer); // abort connection
$pop EAX
mem_Free(EAX); // free data
http_transfer=0;
bufsize = 0;
bufpointer = mem_Free(bufpointer);
}
data_downloaded_size = data_full_size = 0;
}
void DOWNLOADER::Completed()
{
state = STATE_COMPLETED;
ESI = http_transfer;
bufpointer = ESI.http_msg.content_ptr;
bufsize = ESI.http_msg.content_received;
http_free stdcall (http_transfer);
http_transfer=0;
}
int DOWNLOADER::MonitorProgress()
{
dword receive_result;
char redirect_url[4096*3], finaladress[4096*3];
if (http_transfer <= 0) return false;
http_receive stdcall (http_transfer);
receive_result = EAX;
EDI = http_transfer;
http_status_code = EDI.http_msg.status;
data_full_size = EDI.http_msg.content_length;
data_downloaded_size = EDI.http_msg.content_received;
if (!data_full_size) data_full_size = data_downloaded_size * 6 + 1;
if (receive_result == 0) {
if (http_status_code >= 300) && (http_status_code < 400)
{
http_find_header_field stdcall (http_transfer, "location\0");
if (EAX!=0) {
ESI = EAX;
EDI = #redirect_url;
do {
$lodsb;
$stosb;
} while (AL != 0) && (AL != 13) && (AL != 10));
DSBYTE[EDI-1]='\0';
}
get_absolute_url(#finaladress, url, #redirect_url);
Stop();
Start(#finaladress);
url = #finaladress;
return false;
}
Completed();
}
return true;
}
/*=====================================
== ==
== CHECK URL TYPE ==
== ==
=====================================*/
int check_is_the_adress_local(dword _in)
{
if (ESBYTE[_in]!='/') return false;
_in++;
if(!strncmp(_in,"rd/",3)) return true;
if(!strncmp(_in,"fd/",3)) return true;
if(!strncmp(_in,"hd/",3)) return true;
if(!strncmp(_in,"bd/",3)) return true;
if(!strncmp(_in,"cd/",3)) return true;
if(!strncmp(_in,"sys/",4)) return true;
if(!strncmp(_in,"tmp/",4)) return true;
if(!strncmp(_in,"usbhd",6)) return true;
if(!strncmp(_in,"kolibrios",10)) return true;
return false;
}
int check_is_the_url_absolute(dword _in)
{
if(!strncmp(_in,"ftp:",4)) return true;
if(!strncmp(_in,"http:",5)) return true;
if(!strncmp(_in,"https:",6)) return true;
if(!strncmp(_in,"mailto:",7)) return true;
if(check_is_the_adress_local(_in)) return true;
return false;
}
void get_absolute_url(dword _rez, _base, _new)
{
int i;
debug("_base:");debugln(_base);
debug("_new:");debugln(_new);
//case: ./valera.html
if (!strncmp(_new,"./", 2)) _new+=2;
//case: http://site.name
if (check_is_the_url_absolute(_new)) {
strcpy(_rez, _new);
goto _GET_ABSOLUTE_URL_END;
}
//case: /valera.html
if (ESBYTE[_new] == '/') //remove everything after site domain name
{
strcpy(_rez, _base);
i = strchr(_rez+8,'/');
if (i<1) i=strlen(_rez)+_rez;
strcpy(i, _new);
goto _GET_ABSOLUTE_URL_END;
}
//case: ../../valera.html
strcpy(_rez, _base);
ESBYTE[ strrchr(_rez,'/') + _rez -1 ] = '\0'; //remove name
while (!strncmp(_new,"../",3))
{
_new += 3;
ESBYTE[ strrchr(_rez,'/') + _rez -1 ] = '\0';
}
//case: valera.html
chrcat(_rez, '/');
strcat(_rez, _new);
_GET_ABSOLUTE_URL_END:
while (i=strstr(_rez, "&amp;")) strcpy(i+1, i+5);
debug("_rez:");debugln(_rez);
}

View File

@ -181,6 +181,10 @@ inline signed int strcmp(dword text1, text2)
return 0;
}
inline signed int streq(dword text1, text2) {
if (!strcmp(text1,text2)) return true; else return false;
}
/*
signed int strncmp(dword s1, s2, signed n)
unsigned char _s1,_s2;
@ -385,18 +389,6 @@ inline fastcall void chrcat(ESI, BL)
ESBYTE[ESI+EDI+1] = 0;
}
inline fastcall signed int old_strchr( ESI,BL)
{
int jj=0;
do{
jj++;
$lodsb
IF(AL==BL) return jj;
} while(AL!=0);
return 0;
}
inline dword strchr(dword shb;char s)
{
char ss;
@ -897,14 +889,6 @@ inline signed strcoll(dword text1,text2)
return 0;
}
inline void debugi(dword d_int)
{
char tmpch[12];
itoa_(#tmpch, d_int);
debugln(#tmpch);
}
#define strnmov strmovn
#define stricmp strcmpi
#define strcmpn strncmp