Subversion Repositories Kolibri OS

Rev

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

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