Subversion Repositories Kolibri OS

Rev

Rev 5543 | Rev 6977 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2014-2015. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;  downloader.asm - HTTP client for KolibriOS                     ;;
  7. ;;                                                                 ;;
  8. ;;      hidnplayr@kolibrios.org                                    ;;
  9. ;;                                                                 ;;
  10. ;;          GNU GENERAL PUBLIC LICENSE                             ;;
  11. ;;             Version 2, June 1991                                ;;
  12. ;;                                                                 ;;
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14.  
  15. URLMAXLEN       = 65535
  16.  
  17. __DEBUG__       = 1
  18. __DEBUG_LEVEL__ = 1
  19.  
  20.  
  21. format binary as ""
  22. use32
  23.         org     0x0
  24.  
  25.         db      'MENUET01'      ; header
  26.         dd      0x01            ; header version
  27.         dd      START           ; entry point
  28.         dd      IM_END          ; image size
  29.         dd      I_END+0x1000    ; required memory
  30.         dd      I_END+0x1000    ; esp
  31.         dd      url
  32.         dd      0x0             ; I_Path
  33.  
  34.  
  35. include '../../macros.inc'
  36. include '../../proc32.inc'
  37. include '../../dll.inc'
  38. include '../../debug-fdo.inc'
  39. include '../../develop/libraries/box_lib/trunk/box_lib.mac'
  40. include '../../develop/libraries/http/http.inc'
  41.  
  42. virtual at 0
  43.         http_msg http_msg
  44. end virtual
  45.  
  46.  
  47. START:
  48.         mcall   68, 11                  ; init heap so we can allocate memory dynamically
  49.  
  50. ; load libraries
  51.         stdcall dll.Load, @IMPORT
  52.         test    eax, eax
  53.         jnz     mainloop.exit
  54.  
  55. ; wanted events
  56.         mcall   40, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER
  57.  
  58. ; prepare filename buffers
  59.         mov     edi, fname_buf
  60.         mov     esi, download_file_path
  61.   @@:
  62.         lodsb
  63.         stosb
  64.         test    al, al
  65.         jnz     @r
  66.  
  67. ; Initialise OpenDialog
  68.         invoke  OpenDialog_Init, OpenDialog_data
  69.  
  70. ; If user provided parameters, start download right away!
  71.         cmp     byte[url], 0
  72.         jne     download
  73.  
  74.         mov     [OpenDialog_data.draw_window], draw_window
  75.  
  76. redraw:
  77.         call    draw_window
  78.  
  79. mainloop:
  80.         mcall   10      ; wait here for event
  81.         cmp     eax, EV_REDRAW
  82.         je      redraw
  83.         cmp     eax, EV_KEY
  84.         je      .key
  85.         cmp     eax, EV_BUTTON
  86.         je      .button
  87.         cmp     eax, EV_MOUSE
  88.         je      .mouse
  89.         jmp     mainloop
  90.  
  91.   .key:
  92.         mcall   2       ; read key
  93.         invoke  edit_box_key, edit1
  94.         cmp     ax, 13 shl 8
  95.         je      download
  96.         jmp     mainloop
  97.  
  98.   .button:
  99.         mcall   17      ; get id
  100.         cmp     ah, 1   ; button id=1 ?
  101.         je      .exit
  102.  
  103.         cmp     [btn_text], sz_download
  104.         je      download
  105.  
  106.         cmp     [btn_text], sz_open
  107.         je      open_file
  108.  
  109.   .exit:
  110.         mcall   -1      ; exit
  111.  
  112.   .mouse:
  113.         invoke  edit_box_mouse, edit1
  114.         jmp     mainloop
  115.  
  116.  
  117. open_file:
  118.         mcall   70, fileopen
  119.         jmp     mainloop
  120.  
  121.  
  122. download:
  123. ; Extract the filename from URL
  124.         mov     edi, url
  125.         xor     al, al
  126.         mov     ecx, URLMAXLEN
  127.         repne scasb
  128.         mov     esi, edi
  129.         dec     esi
  130.         dec     esi
  131.         std
  132.   .loop:
  133.         lodsb
  134.         cmp     al, '/'
  135.         je      .done
  136.         test    al, al
  137.         jnz     .loop
  138.   .done:
  139.         cld
  140.         mov     ecx, edi
  141.         sub     ecx, esi
  142.         inc     esi
  143.         inc     esi
  144.         mov     edi, filename_area
  145.         rep movsb
  146.  
  147. ; invoke OpenDialog
  148.         invoke  OpenDialog_Start, OpenDialog_data
  149.         mcall   40, EVM_REDRAW + EVM_BUTTON + EVM_STACK
  150.         call    draw_window
  151.  
  152. ; Create the local file
  153.         mov     [fileinfo], 2           ; create/write to file
  154.         xor     eax, eax
  155.         mov     [fileinfo.offset], eax
  156.         mov     [fileinfo.offset+4], eax
  157.         mov     [fileinfo.size], eax
  158.         mcall   70, fileinfo
  159.         test    eax, eax
  160.         jnz     create_error
  161.  
  162. ; Start the download
  163.         invoke  HTTP_get, url, 0, FLAG_STREAM or FLAG_REUSE_BUFFER, 0
  164.         test    eax, eax
  165.         jz      get_error
  166.  
  167.         mov     [identifier], eax
  168.         mov     [offset], 0
  169.         mov     [btn_text], sz_cancel
  170.         mov     [status], sz_downloading
  171.         or      [edit1.flags], ed_figure_only
  172.         and     [edit1.flags], not ed_focus
  173.         push    [sc.work]
  174.         pop     [edit1.color]
  175.         call    draw_window
  176.  
  177.         jmp     download_loop
  178.  
  179. get_error:
  180.         mov     [btn_text], sz_exit
  181.         mov     [status], sz_err_http
  182.         jmp     redraw
  183.  
  184. create_error:
  185.         mov     [btn_text], sz_exit
  186.         mov     [status], sz_err_create
  187.         jmp     redraw
  188.  
  189. download_loop:
  190.         mcall   10
  191.         cmp     eax, EV_REDRAW
  192.         je      .redraw
  193.         cmp     eax, EV_BUTTON
  194.         je      .button
  195.  
  196.         invoke  HTTP_receive, [identifier]
  197.         test    eax, eax
  198.         jz      got_data
  199.         jmp     download_loop
  200.  
  201.   .redraw:
  202.         call    draw_window
  203.         jmp     download_loop
  204.  
  205.   .button:
  206.         jmp     http_free
  207.  
  208. got_data:
  209.         mov     ebp, [identifier]
  210.         test    [ebp + http_msg.flags], 0xffff0000      ; error?
  211.         jnz     http_error
  212.  
  213.         cmp     [fileinfo], 3                           ; Did we write before?
  214.         je      .write
  215.  
  216.         test    [ebp + http_msg.flags], FLAG_CONTENT_LENGTH
  217.         jz      .first_write
  218.  
  219.         mov     eax, [ebp + http_msg.content_length]
  220.         mov     [pb.max], eax
  221.  
  222.         DEBUGF  1, "new file size=%u\n", eax
  223.         mov     [fileinfo], 4                           ; set end of file
  224.         mov     [fileinfo.offset], eax                  ; new file size
  225.         mcall   70, fileinfo
  226.         test    eax, eax
  227.         jnz     write_error
  228.  
  229.  
  230.   .first_write:
  231.         mov     [fileinfo], 3                           ; write to existing file
  232.   .write:
  233.         mov     ecx, [ebp + http_msg.content_received]
  234.         sub     ecx, [offset]
  235.         jz      download_loop                           ; more then 0 data bytes?
  236.         mov     [fileinfo.size], ecx
  237.         mov     eax, [ebp + http_msg.content_ptr]
  238.         mov     [fileinfo.buffer], eax
  239.         mov     ebx, [offset]
  240.         mov     [fileinfo.offset], ebx
  241.         DEBUGF  1, "Writing to disk: size=%u offset=%u\n", ecx, ebx
  242.         mcall   70, fileinfo
  243.         test    eax, eax                                ; check error code
  244.         jnz     write_error
  245.         cmp     ebx, ecx                                ; check if all bytes were written to disk
  246.         jne     write_error
  247.  
  248.         mov     eax, [ebp + http_msg.content_received]
  249.         mov     [offset], eax
  250.         mov     [pb.value], eax
  251.  
  252.         invoke  progressbar_draw, pb
  253.  
  254.         test    [ebp + http_msg.flags], FLAG_GOT_ALL_DATA
  255.         jz      download_loop
  256.  
  257. ; Download completed successfully
  258.         mov     [status], sz_complete
  259.         mov     [pb.progress_color], 0x0000c800         ; green
  260.         mov     [btn_text], sz_open
  261.         jmp     http_free
  262.  
  263. write_error:
  264.         mov     [status], sz_err_full
  265.         mov     [pb.progress_color], 0x00c80000         ; red
  266.         mov     [btn_text], sz_exit
  267.         jmp     http_free
  268.  
  269. http_error:
  270.         mov     [status], sz_err_http
  271.         mov     [pb.progress_color], 0x00c80000         ; red
  272.         mov     [btn_text], sz_exit
  273. ;        jmp     http_free
  274.  
  275. http_free:
  276.         mcall   40, EVM_REDRAW + EVM_BUTTON
  277.         push    [ebp + http_msg.content_received]
  278.         pop     [pb.value]
  279.  
  280.         mov     ecx, [ebp + http_msg.content_ptr]
  281.         test    ecx, ecx
  282.         jz      @f
  283.         mcall   68, 13                                  ; free the buffer
  284.   @@:
  285.         invoke  HTTP_free, [identifier]                 ; free headers and connection
  286.         jmp     redraw
  287.  
  288. draw_window:
  289.         mcall   12, 1   ; start window draw
  290.  
  291. ; get system colors
  292.         mcall   48, 3, sc, 40
  293.  
  294. ; draw window
  295.         mov     edx, [sc.work]
  296.         or      edx, 0x34000000
  297.         mcall   0, <50, 420>, <350, 120>, , 0, title
  298.  
  299. ; draw button
  300.         mcall   8, <320,75>, <50,24>, 22, [sc.work_button]
  301.  
  302. ; draw button text
  303.         mov     ecx, [sc.work_button_text]
  304.         or      ecx, 90000000h
  305.         mcall   4, <325,56>, , [btn_text]
  306.  
  307. ; draw status text
  308.         mov     ecx, [sc.work_text]
  309.         or      ecx, 90000000h
  310.         mcall   4, <10,70>, , [status]
  311.  
  312. ; draw editbox
  313.         edit_boxes_set_sys_color edit1, editboxes_end, sc
  314.         invoke  edit_box_draw, edit1
  315.  
  316.         cmp     [identifier], 0
  317.         je     @f
  318. ; draw progressbar
  319.         invoke  progressbar_draw, pb
  320.   @@:
  321.         mcall   12, 2   ; end window draw
  322.  
  323. dont_draw:
  324.         ret
  325.  
  326. ;---------------------------------------------------------------------
  327. ; Data area
  328. ;-----------------------------------------------------------------------------
  329. align   4
  330. @IMPORT:
  331.  
  332. library lib_http,       'http.obj', \
  333.         box_lib,        'box_lib.obj', \
  334.         proc_lib,       'proc_lib.obj'
  335.  
  336. import  lib_http, \
  337.         HTTP_get,       'get', \
  338.         HTTP_receive,   'receive', \
  339.         HTTP_free,      'free'
  340.  
  341. import  box_lib, \
  342.         edit_box_draw,    'edit_box', \
  343.         edit_box_key,     'edit_box_key', \
  344.         edit_box_mouse,   'edit_box_mouse', \
  345.         progressbar_draw, 'progressbar_draw', \
  346.         progressbar_prog, 'progressbar_progress'
  347.  
  348. import  proc_lib, \
  349.         OpenDialog_Init,  'OpenDialog_init', \
  350.         OpenDialog_Start, 'OpenDialog_start'
  351.  
  352.  
  353. fileinfo        dd 2
  354.   .offset       dd 0, 0
  355.   .size         dd 0
  356.   .buffer       dd 0
  357.                 db 0
  358.                 dd fname_buf
  359.  
  360. fileopen        dd 7
  361.                 dd 0                    ; flags
  362.                 dd fname_buf            ; parameters
  363.                 dd 0                    ; reserved
  364.                 dd 0                    ; reserved
  365.                 db "/sys/@open", 0      ; path
  366.  
  367. edit1           edit_box 400, 5, 10, 0xffffff, 0x0000ff, 0x0080ff, 0x000000, 0x90000000, URLMAXLEN, url, mouse_dd, ed_focus+ed_always_focus, 0, 0
  368. editboxes_end:
  369.  
  370. identifier      dd 0
  371. btn_text        dd sz_download
  372. status          dd sz_null
  373. sz_download     db 'Download', 0
  374. sz_cancel       db ' Cancel ', 0
  375. sz_open         db '  Open  ', 0
  376. sz_exit         db '  Exit  ', 0
  377.  
  378. sz_null         db 0
  379. sz_downloading  db 'Downloading..', 0
  380. sz_complete     db 'Download completed', 0
  381. sz_err_create   db 'Could not create the local file!', 0
  382. sz_err_full     db 'Disk full!', 0
  383. sz_err_http     db 'HTTP error!', 0
  384. title           db 'HTTP Downloader', 0
  385.  
  386. OpenDialog_data:
  387. .type                   dd 1    ; Save
  388. .procinfo               dd procinfo
  389. .com_area_name          dd communication_area_name
  390. .com_area               dd 0
  391. .opendir_path           dd temp_dir_path
  392. .dir_default_path       dd communication_area_default_path
  393. .start_path             dd open_dialog_path
  394. .draw_window            dd dont_draw
  395. .status                 dd 0
  396. .openfile_patch         dd fname_buf
  397. .filename_area          dd filename_area
  398. .filter_area            dd filter
  399. .x:
  400. .x_size                 dw 420  ; Window X size
  401. .x_start                dw 200  ; Window X position
  402. .y:
  403. .y_size                 dw 320  ; Window y size
  404. .y_start                dw 140  ; Window Y position
  405.  
  406. communication_area_name         db 'FFFFFFFF_open_dialog',0
  407. open_dialog_path                db '/sys/File Managers/opendial',0
  408. communication_area_default_path db '/sys',0
  409.  
  410. filter:
  411. dd      0
  412. db      0
  413.  
  414. pb:
  415. .value          dd 0
  416. .left           dd 5
  417. .top            dd 45
  418. .width          dd 300
  419. .height         dd 16
  420. .style          dd 1
  421. .min            dd 0
  422. .max            dd 0
  423. .back_color     dd 0xefefef
  424. .progress_color dd 0xc8c8c8
  425. .frame_color    dd 0x94aece
  426. .frame_color2   dd 0xffffff
  427.  
  428. include_debug_strings
  429.  
  430. download_file_path db '/tmp0/1/', 0
  431.  
  432. IM_END:
  433.  
  434. url             rb URLMAXLEN
  435. sc              system_colors
  436. offset          dd ?
  437. mouse_dd        dd ?
  438.  
  439. filename_area   rb 256
  440. temp_dir_path   rb 4096
  441. procinfo        rb 1024
  442. fname_buf       rb 4096
  443. text_work_area  rb 1024
  444.  
  445. I_END: