Subversion Repositories Kolibri OS

Rev

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

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