forked from KolibriOS/kolibrios
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:
parent
271a48126e
commit
ae17b4e165
@ -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);
|
||||
|
Binary file not shown.
55
programs/cmm/aelia/link.h
Normal file
55
programs/cmm/aelia/link.h
Normal 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;
|
||||
}
|
@ -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, "&"))
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
*/
|
@ -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 |
@ -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)];
|
||||
|
@ -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
68
programs/cmm/lib/debug.h
Normal 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
|
@ -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
|
@ -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";
|
||||
|
||||
|
163
programs/cmm/lib/patterns/http_downloader.h
Normal file
163
programs/cmm/lib/patterns/http_downloader.h
Normal 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, "&")) strcpy(i+1, i+5);
|
||||
debug("_rez:");debugln(_rez);
|
||||
}
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user