diff --git a/programs/develop/libraries/http/examples/deflate.asm b/programs/develop/libraries/http/examples/deflate.asm new file mode 100644 index 000000000..bbd3e8dfb --- /dev/null +++ b/programs/develop/libraries/http/examples/deflate.asm @@ -0,0 +1,467 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2009-2015. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; downloader.asm - HTTP client for KolibriOS ;; +;; ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +URLMAXLEN = 1024 +BUFFERSIZE = 4096 + +__DEBUG__ = 1 +__DEBUG_LEVEL__ = 1 + +format binary as "" +;-------------------------------------- +frame_1: + .x = 5 + .y = 10 + .width = 350 + .height = 55 +;-------------------------------------- +frame_2: + .x = 5 + .y = 75 + .width = 350 + .height = 55 +;--------------------------------------------------------------------- +use32 + org 0x0 + + db 'MENUET01' ; header + dd 0x01 ; header version + dd START ; entry point + dd IM_END ; image size + dd I_END ; required memory + dd stacktop ; esp + dd params ; I_PARAM + dd 0x0 ; I_Path +;--------------------------------------------------------------------- +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../dll.inc' +include '../../../../debug-fdo.inc' +include '../../box_lib/trunk/box_lib.mac' +include '../../http/http.inc' + +virtual at 0 + http_msg http_msg +end virtual +;--------------------------------------------------------------------- +START: + + mcall 68, 11 ; init heap so we can allocate memory dynamically + +; load libraries + stdcall dll.Load, @IMPORT + test eax, eax + jnz exit +;--------------------------------------------------------------------- + mov edi,filename_area + mov esi,start_temp_file_name + call copy_file_name_path + + mov edi,fname_buf + mov esi,start_file_path + call copy_file_name_path + +;OpenDialog initialisation + push dword OpenDialog_data + call [OpenDialog_Init] + +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] +;--------------------------------------------------------------------- +; check parameters + cmp byte[params], 0 ; no parameters ? + je reset_events ; load the GUI + + inc [silently] + +download: + call download_1 + + test [silently], 0xff + jnz save + +reset_events: + DEBUGF 1, "resetting events\n" + +; Report events +; defaults + mouse + mcall 40,EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER +;--------------------------------------------------------------------- +redraw: + call draw_window + +still: +;; DEBUGF 1, "waiting for events\n" + + mcall 10 ; wait here for event + + cmp eax, EV_REDRAW + je redraw + + cmp eax, EV_KEY + je key + + cmp eax, EV_BUTTON + je button + + cmp eax, EV_MOUSE + je mouse + + jmp still +;--------------------------------------------------------------------- +key: + mcall 2 ; read key + + stdcall [edit_box_key], dword edit1 + + cmp ax, 13 shl 8 + je download + + jmp still +;--------------------------------------------------------------------- +button: + + mcall 17 ; get id + + cmp ah, 26 + jne @f +; invoke OpenDialog + push dword OpenDialog_data + call [OpenDialog_Start] + cmp [OpenDialog_data.status],1 + jne still + +; prepare for PathShow + push dword PathShow_data_1 + call [PathShow_prepare] + call draw_window + jmp still +@@: + cmp ah, 1 ; button id=1 ? + je exit + + call download_1 + jmp save +;--------------------------------------------------------------------- +mouse: + stdcall [edit_box_mouse], edit1 + jmp still +;--------------------------------------------------------------------- +exit: + DEBUGF 1, "Exiting\n" + invoke HTTP_free, [identifier] ; free buffer +fail: + or eax, -1 ; close this program + mcall +;--------------------------------------------------------------------- +download_1: + DEBUGF 1, "Starting download\n" + + invoke HTTP_get, 0, 0, params, sz_add_header + test eax, eax + jz fail + mov [identifier], eax + + .loop: + invoke HTTP_receive, [identifier] + test eax, eax + jnz .loop + + mov eax, [identifier] + mov ebx, [eax + http_msg.content_length] + mov [final_size], ebx + mov ebx, [eax + http_msg.content_ptr] + mov [final_buffer], ebx + + invoke HTTP_find_header, [identifier], sz_content_enc + test eax, eax + jz .no_deflate + +; TODO: check if parameter equals "deflate" + + DEBUGF 1, "deflating\n" + + lea eax, [final_size] + invoke deflate_unpack, [final_buffer], eax + push eax + mcall 68, 13, [final_buffer] ; Free the compressed data + pop [final_buffer] + + DEBUGF 1, "deflated size=%u bytes\n", [final_size] + .no_deflate: + + invoke HTTP_free, [identifier] + mov [identifier], 0 + + ret +;--------------------------------------------------------------------- +save: + cmp [final_buffer], 0 + je still + + mcall 70, fileinfo + + DEBUGF 1, "File saved\n" + + test [silently], 0xff + jnz exit + + mov ecx, [sc.work_text] + or ecx, 0x80000000 + mcall 4, <10, frame_2.y+frame_2.height+7>, , download_complete + + jmp still +;--------------------------------------------------------------------- +copy_file_name_path: + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @r + ret +;--------------------------------------------------------------------- +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* + +draw_window: + + mcall 12, 1 ; start window draw +;----------------------------------- +; get system colors + mcall 48, 3, sc, 40 +;----------------------------------- +; draw window + mov edx, [sc.work] + or edx, 0x34000000 + mcall 0, <50, 370>, <350, 170>, , 0, title +;----------------------------------- +; draw frames + mov [frame_data.x],dword frame_1.x shl 16+frame_1.width + mov [frame_data.y],dword frame_1.y shl 16+frame_1.height + mov [frame_data.text_pointer],dword select_addr_text + mov eax,[sc.work] + mov [frame_data.font_backgr_color],eax + mov eax,[sc.work_text] + mov [frame_data.font_color],eax + + push dword frame_data + call [Frame_draw] +;----------------------------------- + mov [frame_data.x],dword frame_2.x shl 16+frame_2.width + mov [frame_data.y],dword frame_2.y shl 16+frame_2.height + mov [frame_data.text_pointer],dword select_path_text + + push dword frame_data + call [Frame_draw] +;----------------------------------- +; draw "url:" text + mov ecx, [sc.work_text] + or ecx, 80000000h + mcall 4, , , type_pls +;----------------------------------- +; draw editbox + edit_boxes_set_sys_color edit1, editboxes_end, sc + stdcall [edit_box_draw], edit1 +;----------------------------------- +; draw buttons + mcall 8,,,22,[sc.work_button] ; reload + mcall ,,, 24 ; stop + + mcall , ,,26 ; save +;----------------------------------- +; draw buttons text + mov ecx, [sc.work_button_text] + or ecx, 80000000h + mcall 4, , , button_text.1 + mcall , , , button_text.2 + mcall , , , button_text.3 + + mcall 13,,,0xffffff + push dword PathShow_data_1 + call [PathShow_draw] + + mcall 12, 2 ; end window redraw + + ret +;--------------------------------------------------------------------- +; Data area +;----------------------------------------------------------------------------- +align 4 +@IMPORT: + +library lib_http, 'http.obj', \ + box_lib, 'box_lib.obj', \ + proc_lib, 'proc_lib.obj', \ + archiver, 'archiver.obj' + +import lib_http, \ + HTTP_get, 'get' , \ + HTTP_receive, 'receive', \ + HTTP_find_header, 'find_header_field', \ + HTTP_free, 'free' + +import box_lib, \ + edit_box_draw, 'edit_box', \ + edit_box_key, 'edit_box_key', \ + edit_box_mouse, 'edit_box_mouse', \ + PathShow_prepare, 'PathShow_prepare', \ + PathShow_draw, 'PathShow_draw', \ + Frame_draw, 'frame_draw' + +import proc_lib, \ + OpenDialog_Init, 'OpenDialog_init', \ + OpenDialog_Start, 'OpenDialog_start' + +import archiver,\ + deflate_unpack, 'deflate_unpack' +;--------------------------------------------------------------------- +fileinfo dd 2, 0, 0 +final_size dd 0 +final_buffer dd 0 + db 0 + dd fname_buf +;--------------------------------------------------------------------- + +mouse_dd dd 0 +edit1 edit_box 295, 48, (frame_1.y+10), 0xffffff, 0xff, 0x80ff, 0, 0x8000, URLMAXLEN, document_user, mouse_dd, ed_focus+ed_always_focus, 7, 7 +editboxes_end: + +;--------------------------------------------------------------------- + +include_debug_strings + +;--------------------------------------------------------------------- + +type_pls db 'URL:', 0 +button_text: +.1: db 'DOWNLOAD',0 +.2: db 'STOP',0 +.3: db 'SELECT', 0 +download_complete db 'FILE SAVED!', 0 +title db 'HTTP Downloader', 0 +silently db 0 + +sz_add_header db 'Accept-Encoding: deflate', 13, 10, 0 ; archiver.obj doesnt export unpack method for gzip yet :( +sz_content_enc db 'content-encoding', 0 + +;--------------------------------------------------------------------- +select_addr_text db ' NETWORK ADDRESS: ',0 +select_path_text db ' PATH TO SAVE FILE: ',0 +;--------------------------------------------------------------------- +frame_data: +.type dd 0 ;+0 +.x: +.x_size dw 0 ;+4 +.x_start dw 0 ;+6 +.y: +.y_size dw 0 ;+8 +.y_start dw 0 ;+10 +.ext_fr_col dd 0x0 ;+12 +.int_fr_col dd 0xffffff ;+16 +.draw_text_flag dd 1 ;+20 +.text_pointer dd 0 ;+24 +.text_position dd 0 ;+28 +.font_number dd 0 ;+32 +.font_size_y dd 9 ;+36 +.font_color dd 0x0 ;+40 +.font_backgr_color dd 0xffffff ;+44 +;--------------------------------------------------------------------- +PathShow_data_1: +.type dd 0 ;+0 +.start_y dw frame_2.y+14 ;+4 +.start_x dw frame_2.x+20 ;+6 +.font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 +.area_size_x dw frame_2.width-35 ;+10 +.font_number dd 0 ;+12 ; 0 - monospace, 1 - variable +.background_flag dd 0 ;+16 +.font_color dd 0 ;+20 +.background_color dd 0 ;+24 +.text_pointer dd fname_buf ;+28 +.work_area_pointer dd text_work_area ;+32 +.temp_text_length dd 0 ;+36 +;--------------------------------------------------------------------- +OpenDialog_data: +.type dd 1 ; Save +.procinfo dd procinfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_path dd temp_dir_path ;+16 +.dir_default_path dd communication_area_default_path ;+20 +.start_path dd open_dialog_path ;+24 +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_pach dd fname_buf ;+36 +.filename_area dd filename_area ;+40 +.filter_area dd Filter +.x: +.x_size dw 420 ;+48 ; Window X size +.x_start dw 200 ;+50 ; Window X position +.y: +.y_size dw 320 ;+52 ; Window y size +.y_start dw 120 ;+54 ; Window Y position + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_path: + db '/sys/File Managers/opendial',0 +communication_area_default_path: + db '/sys',0 + +Filter: +dd Filter.end - Filter +.1: +db 'IMG',0 +db 'IMA',0 +.end: +db 0 + +start_temp_file_name: db 'some.garbage',0 + +start_file_path: db '/sys/.download', 0 +;--------------------------------------------------------------------- +document_user db 'http://' +;--------------------------------------------------------------------- +IM_END: +;--------------------------------------------------------------------- +params rb URLMAXLEN +;--------------------------------------------------------------------- + sc system_colors +;--------------------------------------------------------------------- +identifier dd ? +;--------------------------------------------------------------------- +filename_area: + rb 256 +;--------------------------------------------------------------------- +temp_dir_path: + rb 4096 +;--------------------------------------------------------------------- +procinfo: + rb 1024 +;--------------------------------------------------------------------- +fname_buf: + rb 4096 +;--------------------------------------------------------------------- +text_work_area: + rb 1024 +;--------------------------------------------------------------------- + rb 4096 +stacktop: +;--------------------------------------------------------------------- +I_END: +;--------------------------------------------------------------------- + + diff --git a/programs/develop/libraries/http/examples/downloader.asm b/programs/develop/libraries/http/examples/get.asm similarity index 100% rename from programs/develop/libraries/http/examples/downloader.asm rename to programs/develop/libraries/http/examples/get.asm diff --git a/programs/develop/libraries/http/examples/pasta.asm b/programs/develop/libraries/http/examples/post.asm similarity index 100% rename from programs/develop/libraries/http/examples/pasta.asm rename to programs/develop/libraries/http/examples/post.asm