Subversion Repositories Kolibri OS

Rev

Rev 1337 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. use32
  2.  
  3.         org 0x0
  4.  
  5.         db 'MENUET01'
  6.         dd 1, START, I_END, IM_END+0x1000, IM_END+0x1000, 0, 0
  7.  
  8. include '../proc32.inc'
  9. include '../macros.inc'
  10. include '../dll.inc'
  11. include '../libio.inc'
  12. include '../../../../../programs/develop/libraries/box_lib/trunk/box_lib.mac'
  13.  
  14. include '../network.inc'
  15.  
  16.  
  17. filebuffer_size equ 4*4096 ; 16kb   (dont try to change it yet..)
  18. TIMEOUT         equ 500
  19. buffer_len      equ 1500
  20.  
  21. AF_INET4        equ 2
  22. IP_PROTO_UDP    equ 17
  23.  
  24. opcode_rrq      equ 1 shl 8
  25. opcode_wrq      equ 2 shl 8
  26. opcode_data     equ 3 shl 8
  27. opcode_ack      equ 4 shl 8
  28. opcode_error    equ 5 shl 8
  29.  
  30. ; read/write request packet
  31. ;
  32. ;  2 bytes     string    1 byte     string   1 byte
  33. ;  ------------------------------------------------
  34. ; | Opcode |  Filename  |   0  |    Mode    |   0  |
  35. ;  ------------------------------------------------
  36.  
  37. ; data packet
  38. ;
  39. ;  2 bytes     2 bytes      n bytes
  40. ;  ----------------------------------
  41. ; | Opcode |   Block #  |   Data     |
  42. ;  ----------------------------------
  43.  
  44. ; acknowledgement packet
  45. ;
  46. ;  2 bytes     2 bytes
  47. ;  ---------------------
  48. ; | Opcode |   Block #  |
  49. ;  ---------------------
  50.  
  51. ; error packet
  52. ;
  53. ;  2 bytes  2 bytes        string    1 byte
  54. ;  -----------------------------------------
  55. ; | Opcode |  ErrorCode |   ErrMsg   |   0  |
  56. ;  -----------------------------------------
  57.  
  58.  
  59. START:
  60.  
  61. ;;        mcall   68, 11
  62.  
  63.         stdcall dll.Load, @IMPORT
  64.         or      eax, eax
  65.         jnz     exit
  66.  
  67. stop_transfer:
  68.         mcall   40, 00100111b
  69.  
  70. red_win:
  71.         call draw_window
  72.  
  73. align 4
  74. still:
  75.         mcall   10
  76.  
  77.         dec     eax
  78.         jz      red_win
  79.  
  80.         dec     eax
  81.         jz      key
  82.  
  83.         dec     eax
  84.         jz      button
  85.  
  86.         push    dword edit1
  87.         call    [edit_box_mouse]
  88.  
  89.         push    dword edit2
  90.         call    [edit_box_mouse]
  91.  
  92.         push    dword edit3
  93.         call    [edit_box_mouse]
  94.  
  95.         push    dword edit4
  96.         call    [edit_box_mouse]
  97.  
  98.         push    dword Option_boxs1
  99.         call    [option_box_mouse]
  100.  
  101.         push    dword Option_boxs2
  102.         call    [option_box_mouse]
  103.  
  104.         jmp     still
  105.  
  106. button:
  107.         mcall   17
  108.  
  109.         cmp     ah,0x10
  110.         je      start_transfer
  111.  
  112.  
  113.         test    ah , ah
  114.         jz      still
  115.  
  116. exit:   mcall   -1
  117. key:
  118.         mcall   2
  119.  
  120.         push    dword edit1
  121.         call    [edit_box_key]
  122.  
  123.         push    dword edit2
  124.         call    [edit_box_key]
  125.  
  126.         push    dword edit3
  127.         call    [edit_box_key]
  128.  
  129.         push    dword edit4
  130.         call    [edit_box_key]
  131.  
  132.         jmp still
  133.  
  134.  
  135. align 4
  136. draw_window:
  137.         mcall   12,1
  138.         mcall   0,(50*65536+400),(30*65536+180),0x34AABBCC,0x085080DD,str_title
  139.  
  140.         mcall   4,35*65536+10,0x80000000, str_server
  141.  
  142.         mov     ebx,5*65536+ 30
  143.         mov     edx, str_source
  144.         mcall
  145.  
  146.         mov     ebx,11*65536+ 50
  147.         mov     edx, str_destination
  148.         mcall
  149.  
  150.         mov     ebx,47*65536+72
  151.         mov     edx, str_mode
  152.         mcall
  153.  
  154.         mov     ebx,160*65536+72
  155.         mov     edx, str_method
  156.         mcall
  157.  
  158.         mov     ebx,270*65536+72
  159.         mov     edx, str_blocksize
  160.         mcall
  161.  
  162.         push    dword edit1
  163.         call    [edit_box_draw]
  164.  
  165.         push    dword edit2
  166.         call    [edit_box_draw]
  167.  
  168.         push    dword edit3
  169.         call    [edit_box_draw]
  170.  
  171.         push    dword edit4
  172.         call    [edit_box_draw]
  173.  
  174.         push    dword Option_boxs1
  175.         call    [option_box_draw]
  176.  
  177.         push    dword Option_boxs2
  178.         call    [option_box_draw]
  179.  
  180.         mcall   8,210*65536+170, 105*65536+16,0x00000010,0x085080DD
  181.  
  182.         mcall   4,260*65536+110, 0x80000000, str_transfer
  183.  
  184.         mcall   38,10*65536+380, 130*65536+130,0x00000000
  185.  
  186.         mcall   4,350*65536+137, 0x80000000, str_kb_s
  187.  
  188. ;        mcall   47,1 shl 31 + 7 shl 16 + 1,kbps,305*65536+137,0x00000000
  189.  
  190.         mcall   4,20*65536+137, 0x80000000, [status]
  191.  
  192. ;        mcall   47,1 shl 31 + 3 shl 16 + 1,done,25*65536+137,0x00000000
  193.  
  194.         mcall   12,2
  195.  
  196.         ret
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203. start_transfer:
  204.  
  205.         ; first, resolve the hostname
  206.  
  207.         push    esp     ; reserve stack place
  208.  
  209.         push    esp     ; fourth parameter
  210.         push    0       ; third parameter
  211.         push    0       ; second parameter
  212.         push    SRV     ; first parameter
  213.         call    [getaddrinfo]
  214.  
  215.         pop     esi     ; now we will have pointer to result in esi
  216.  
  217. ; test for error
  218.         test    eax, eax
  219.         jnz     still
  220.  
  221.         mov     esi, [esi + addrinfo.ai_addr]
  222.         mov     esi, [esi + sockaddr_in.sin_addr]
  223.         mov     dword [IP], esi
  224.  
  225.         stdcall mem.Alloc, buffer_len
  226.         test    eax, eax
  227.         jz      stop_transfer
  228.         mov     [packetbuff], eax
  229.  
  230.         invoke  file_open, local_addr, O_READ + O_WRITE + O_CREATE
  231.         cmp     eax, 32
  232.         jb      stop_transfer
  233.  
  234.         mov     [fh], eax
  235.  
  236.         mcall   socket, AF_INET4, IP_PROTO_UDP, 0               ; socket_open
  237.         cmp     eax, -1
  238.         je      still
  239.  
  240.         mov     [socketnum], eax
  241.  
  242.         mcall   connect, [socketnum], sockaddr, sockaddr_len    ; socket_connect
  243.         cmp     eax, -1
  244.         je      still
  245.  
  246.         mov     word [I_END], opcode_rrq
  247.         cmp     [option_group2],op3             ; method = get?
  248.         jz      @f
  249.         mov     word [I_END], opcode_wrq
  250.        @@:
  251.  
  252.         xor     al , al
  253.         mov     edi, remote_addr
  254.         mov     ecx, 250
  255.         repnz   scasb
  256.         sub     edi, remote_addr
  257.         mov     ecx, edi
  258.         mov     edi, I_END+2
  259.         mov     esi, remote_addr
  260.         rep     movsb
  261.  
  262.         cmp     [option_group1], op1
  263.         je      .ascii
  264.  
  265.         mov     esi, octet
  266.         movsd
  267.         movsb
  268.  
  269.         jmp     .send_request
  270.  
  271.       .ascii:
  272.  
  273.         mov     esi, netascii
  274.         movsd
  275.         movsd
  276.  
  277.       .send_request:
  278.  
  279.         xor     al, al
  280.         stosb
  281.  
  282.         sub     edi, I_END
  283.         mov     esi, edi
  284.         mcall   send, [socketnum], I_END
  285.  
  286.         mov     [last_ack], 0
  287.  
  288. ;        mcall   26, 9
  289. ;        mov     [last_time], eax
  290.  
  291.         mov     [status], str_transfering
  292.         call    draw_window
  293.  
  294.         mcall   40, 10000101b
  295.  
  296.         cmp     [option_group2],op3             ; method = get?
  297.         jnz     send_data_loop
  298.  
  299.         invoke  file_truncate, [fh]
  300.  
  301. receive_data_loop:
  302.  
  303.         mcall   23, TIMEOUT
  304.  
  305.         dec     eax
  306.         jz      .redraw
  307.  
  308.         dec     eax
  309.         dec     eax
  310.         jz      .btn
  311.  
  312.         mcall   recv, [socketnum], [packetbuff], buffer_len ; receive data
  313.  
  314.         mov     esi, [packetbuff]
  315.         cmp     word[esi], opcode_data
  316.         jne     .error
  317.  
  318.         mov     bx, [last_ack]
  319.         inc     bx
  320.         rol     bx, 8
  321.  
  322.         cmp     word [esi + 2], bx
  323.         jne     .packet_got_lost
  324.  
  325.         inc     [last_ack]
  326.  
  327.  
  328.         ; now, we need to store the data
  329.  
  330.         add     esi, 4
  331.         sub     eax, 4
  332.         mov     ecx, eax
  333.         invoke  file_write, [fh], esi ,ecx
  334.  
  335.         cmp     ecx, 512      ; full data packet?
  336.         jge     .continue
  337.  
  338.         ; last packet, or something else
  339.  
  340.         mov     [status], str_success
  341.  
  342. .kill_xfer:
  343.  
  344.         invoke  file_close, [fh]
  345.         mcall   close, [socketnum]
  346.         jmp     stop_transfer
  347.  
  348. .error:
  349.  
  350.         cmp     word[esi], opcode_error
  351.         je      .decode_error
  352.  
  353.         jmp     .continue
  354.  
  355. .packet_got_lost:
  356.  
  357.  
  358. .continue:
  359.  
  360. ;        mcall   26, 9
  361. ;        mov     ebx, [last_time]
  362. ;        mov     [last_time], eax
  363. ;        xor     edx, edx
  364. ;        sub     eax, ebx
  365. ;        xchg    eax, ecx
  366. ;        div     ecx
  367. ;        mov     [kbps], eax
  368. ;        mcall   47,1 shl 31 + 7 shl 16 + 1,kbps,305*65536+137,0x40000000, 0x00ffffff
  369.  
  370.         mov     word [buffer], opcode_ack                ; send ack
  371.         mov     ax, [last_ack]
  372.         rol     ax, 8
  373.         mov     word [buffer+2], ax
  374.         mcall   send, [socketnum], buffer, 4, 0
  375.  
  376.         jmp     receive_data_loop
  377.  
  378.  
  379. .btn:
  380.         mcall   17
  381.  
  382.         jmp     .kill_xfer
  383.  
  384. .redraw:
  385.         call    draw_window
  386.         jmp     receive_data_loop
  387.  
  388.  
  389. .decode_error:
  390.         movzx   esi, word[esi + 2]
  391.         cmp     esi, 7
  392.         cmovg   esi, [zero]
  393.  
  394.         mov     esi, dword [4*esi + error_crosslist]
  395.         mov     [status], esi
  396.  
  397.         jmp     .kill_xfer
  398.  
  399.  
  400.  
  401. ;--------------------------------
  402.  
  403.  
  404. send_data_loop:
  405.  
  406.         mov     word[buffer], opcode_data
  407.  
  408. .read_chunk:
  409.  
  410.         inc     [last_ack]
  411.  
  412.         mov     ax, [last_ack]
  413.         xchg    al, ah
  414.         mov     word[buffer+2], ax
  415.  
  416.         invoke  file_read, [fh], buffer + 4, 512
  417.         cmp     eax, -1
  418.         je      .kill_xfer
  419.  
  420.         add     eax, 4
  421.         mov     [packetsize], eax
  422.  
  423. .send_packet:
  424.         mcall   send, [socketnum], buffer, [packetsize], 0       ; send data
  425.  
  426. .loop:
  427.         mcall   23, TIMEOUT
  428.  
  429.         dec     eax
  430.         jz      .red
  431.  
  432.         dec     eax
  433.         dec     eax
  434.         jz      .btn
  435.  
  436.         mcall   recv, [socketnum], [packetbuff], buffer_len          ; receive ack
  437.         cmp     eax, -1
  438.         je      .kill_xfer
  439.  
  440.         mov     esi, [packetbuff]
  441.  
  442.         cmp     word[esi], opcode_error
  443.         je      .decode_error
  444.  
  445.         cmp     word[esi], opcode_ack
  446.         jne     .send_packet
  447.  
  448.         mov     ax, [last_ack]
  449.         xchg    al, ah
  450.         cmp     word[esi+2], ax
  451.         jne     .send_packet
  452.  
  453.         cmp     [packetsize], 512+4
  454.         jne     .xfer_ok                                      ; transfer is done
  455.  
  456.  
  457.  
  458.         jmp     .read_chunk
  459.  
  460. .red:
  461.         call    draw_window
  462.         jmp     .loop
  463.  
  464. .btn:
  465.         mcall   17
  466.  
  467.  
  468. .kill_xfer:
  469.         mov     [status], str_fail
  470.  
  471. .xfer_done:
  472.         invoke  file_close, [fh]
  473.         mcall   close, [socketnum]
  474.         jmp     stop_transfer
  475.  
  476.  
  477. .xfer_ok:
  478.         mov     [status], str_success
  479.         jmp     .xfer_done
  480.  
  481.  
  482. .decode_error:
  483.         movzx   esi, word[esi + 2]
  484.         cmp     esi, 7
  485.         cmovg   esi, [zero]
  486.  
  487.         mov     esi, dword [4*esi + error_crosslist]
  488.         mov     [status], esi
  489.  
  490.         jmp     .send_packet
  491.  
  492.  
  493.  
  494. ;-------------------------
  495. ; DATA
  496.  
  497. socketnum      dd 0
  498. kbps           dd 0
  499. done           dd 0
  500.  
  501. sockaddr:
  502.         dw AF_INET4
  503.         dw 69 shl 8
  504. IP      db 192,168,1,115
  505. sockaddr_len = $ - sockaddr
  506.  
  507. align 16
  508. @IMPORT:
  509.  
  510. library box_lib , 'box_lib.obj',\
  511.         io_lib  , 'libio.obj',\
  512.         network , 'network.obj'
  513.  
  514. import  box_lib                                 ,\
  515.         edit_box_draw    ,'edit_box'            ,\
  516.         edit_box_key     ,'edit_box_key'        ,\
  517.         edit_box_mouse   ,'edit_box_mouse'      ,\
  518.         version_ed       ,'version_ed'          ,\
  519.         check_box_draw   ,'check_box_draw'      ,\
  520.         check_box_mouse  ,'check_box_mouse'     ,\
  521.         version_ch       ,'version_ch'          ,\
  522.         option_box_draw  ,'option_box_draw'     ,\
  523.         option_box_mouse ,'option_box_mouse'    ,\
  524.         version_op       ,'version_op'
  525.  
  526. import  io_lib                                  ,\
  527.         file_find_first , 'file_find_first'     ,\
  528.         file_find_next  , 'file_find_next'      ,\
  529.         file_find_close , 'file_find_close'     ,\
  530.         file_size       , 'file_size'           ,\
  531.         file_open       , 'file_open'           ,\
  532.         file_read       , 'file_read'           ,\
  533.         file_write      , 'file_write'          ,\
  534.         file_seek       , 'file_seek'           ,\
  535.         file_tell       , 'file_tell'           ,\
  536.         file_eof?       , 'file_iseof'          ,\
  537.         file_seteof     , 'file_seteof'         ,\
  538.         file_truncate   , 'file_truncate'       ,\
  539.         file_close      , 'file_close'
  540.  
  541. import  network                                 ,\
  542.         inet_ntoa       , 'inet_ntoa'           ,\
  543.         getaddrinfo     , 'getaddrinfo'         ,\
  544.         freeaddrinfo    , 'freeaddrinfo'
  545.  
  546.  
  547.  
  548. edit1 edit_box 300,80,5 ,0xffffff,0x6f9480,0,0,0,99 ,SRV,ed_focus,  13,13
  549. edit2 edit_box 300,80,25,0xffffff,0x6a9480,0,0,0,99 ,remote_addr,ed_figure_only, 5,5
  550. edit3 edit_box 300,80,45,0xffffff,0x6a9480,0,0,0,99 ,local_addr,ed_figure_only, 13,13
  551. edit4 edit_box 40,340,68,0xffffff,0x6a9480,0,0,0,5 ,BLK,ed_figure_only, 3, 3
  552.  
  553. op1 option_box option_group1,80,68,6,12,0xffffff,0,0,netascii,octet-netascii
  554. op2 option_box option_group1,80,85,6,12,0xFFFFFF,0,0,octet,get-octet
  555.  
  556. op3 option_box option_group2,210,68,6,12,0xffffff,0,0,get,put-get
  557. op4 option_box option_group2,210,85,6,12,0xFFFFFF,0,0,put,BLK-put
  558.  
  559. option_group1   dd op1
  560. option_group2   dd op3
  561.  
  562. Option_boxs1    dd op1,op2,0
  563. Option_boxs2    dd op3,op4,0
  564.  
  565. str_title       db 'TFTP client for KolibriOS',0
  566. str_server      db 'Server:',0
  567. str_source      db 'Remote file:',0
  568. str_destination db 'Local file:',0
  569. str_mode        db 'Mode:',0
  570. str_method      db 'Method:',0
  571. str_blocksize   db 'Blocksize:',0
  572. str_kb_s        db 'kb/s',0
  573. str_complete    db '% complete',0
  574. str_transfer    db 'Transfer',0
  575. str_waiting     db 'Welcome!',0
  576. str_transfering db 'Transfering...',0
  577.  
  578. str_success     db 'Tranfser completed sucessfully',0
  579. str_fail        db 'Transfer failed!',0
  580.  
  581. str_error:
  582. ._0 db 'Not defined, see error message (if any).',0
  583. ._1 db 'File not found.',0
  584. ._2 db 'Access violation.',0
  585. ._3 db 'Disk full or allocation exceeded.',0
  586. ._4 db 'Illegal TFTP operation.',0
  587. ._5 db 'Unknown transfer ID.',0
  588. ._6 db 'File already exists.',0
  589. ._7 db 'No such user.',0
  590.  
  591.  
  592. error_crosslist:
  593. dd      str_error._0
  594. dd      str_error._1
  595. dd      str_error._2
  596. dd      str_error._3
  597. dd      str_error._4
  598. dd      str_error._5
  599. dd      str_error._6
  600. dd      str_error._7
  601.  
  602.  
  603.  
  604. netascii db 'NetASCII'
  605. octet    db 'Octet'
  606. get      db 'GET'
  607. put      db 'PUT'
  608.  
  609. BLK      db "512",0,0,0
  610.  
  611. last_ack dw ?
  612.  
  613. fh       dd ?   ; file handle
  614.  
  615. last_time dd ?
  616.  
  617. packetbuff      dd      ?
  618. packetsize      dd      ?
  619. status          dd      str_waiting
  620. zero            dd      0
  621.  
  622. SRV db "192.168.1.115",0
  623. times (SRV + 256 - $) db 0
  624.  
  625. remote_addr db "3.png",0
  626. times (remote_addr + 256 - $) db 0
  627.  
  628. local_addr  db "/sys/test.png",0
  629. times (local_addr + 256 - $) db 0
  630.  
  631. I_END:
  632.  
  633. buffer:
  634. rb buffer_len
  635.  
  636. IM_END: