Subversion Repositories Kolibri OS

Rev

Rev 2314 | Go to most recent revision | Blame | 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.  
  209. start_transfer:
  210.  
  211.         ; first, resolve the hostname
  212.  
  213.         push    esp     ; reserve stack place
  214.  
  215.         push    esp     ; fourth parameter
  216.         push    0       ; third parameter
  217.         push    0       ; second parameter
  218.         push    dword SRV     ; first parameter
  219.         call    [getaddrinfo]
  220.  
  221.         pop     esi
  222.  
  223. ; test for error
  224.         test    eax, eax
  225.         jnz     still
  226.  
  227.         mov     esi, [esi]
  228.         mov     esi, [esi + sockaddr_in.sin_addr]
  229.         mov     dword [IP], esi
  230.  
  231.         mcall   socket, AF_INET4, SOCK_DGRAM, 0                ; socket_open
  232.         cmp     eax, -1
  233.         je      still
  234.  
  235.         mov     [socketnum], eax
  236.  
  237.         mcall   connect, [socketnum], sockaddr, sockaddr_len         ; socket_connect
  238.         cmp     eax, -1
  239.         je      still
  240.  
  241.         mov     word [I_END], opcode_rrq
  242.         cmp     [option_group2],op3
  243.         je      @f
  244.         mov     word [I_END], opcode_wrq
  245.       @@:
  246.  
  247.         xor     al , al
  248.         mov     edi, remote_addr
  249.         mov     ecx, 250
  250.         repnz   scasb
  251.         sub     edi, remote_addr-1
  252.         mov     ecx, edi
  253.         mov     edi, I_END+2
  254.         mov     esi, remote_addr
  255.         rep     movsb
  256.  
  257.         cmp     [option_group1], op1
  258.         je      .ascii
  259.  
  260.         mov     esi, octet
  261.         movsd
  262.         movsb
  263.  
  264.         jmp     .send_request
  265.  
  266.       .ascii:
  267.  
  268.         mov     esi, netascii
  269.         movsd
  270.         movsd
  271.  
  272.       .send_request:
  273.  
  274.         xor     al, al
  275.         stosb
  276.  
  277.         sub     edi, I_END
  278.         mov     esi, edi
  279.         mcall   send, [socketnum], I_END
  280.  
  281.         mcall   40, 10000101b
  282.  
  283.         mov     [last_ack], 0
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290. receive_data_loop:
  291.  
  292.         mcall   23, TIMEOUT
  293.  
  294.         dec     eax
  295.         jz      .red
  296.  
  297.         dec     eax
  298.         jz      .key
  299.  
  300.  
  301.         mcall   recv, [socketnum], buffer, buffer_len, 0  ; receive data
  302.  
  303.         cmp     word[buffer], opcode_data
  304.         jne     .error
  305.  
  306.         mov     bx, [last_ack]
  307.         cmp     word [buffer + 2], bx
  308.         jne     .packet_got_lost
  309.         inc     [last_ack]
  310.  
  311.         cmp     eax, 4+512
  312.         je      .continue
  313.  
  314. ; last packet, or something else
  315. .error:
  316.  
  317. .packet_got_lost:
  318.  
  319.  
  320.  
  321. .continue:
  322.  
  323.         mov     word[buffer], opcode_ack                ; send ack
  324.         mcall   send, [socketnum], buffer, 4, 0
  325.  
  326.         jmp     receive_data_loop
  327.  
  328. .red:
  329.  
  330.         call    draw_window
  331.  
  332.         jmp     receive_data_loop
  333.  
  334.  
  335. .key:
  336.         mcall   2
  337.         cmp     ah, 2
  338.         jz      exit
  339.  
  340.         ; close socket ?
  341.  
  342.         jmp     receive_data_loop
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349. ;--------------------------------
  350.  
  351.  
  352. send_:
  353.  
  354.         invoke  file_open, local_addr, O_READ
  355.         or      eax, eax
  356.         jz      .exit
  357.         mov     [fh], eax
  358.  
  359.         stdcall mem.Alloc, filebuffer_size
  360.         or      eax, eax
  361.         jz      .exit
  362.         mov     [fb], eax
  363.  
  364.         mov     [last_ack], 0
  365.         mov     [fo], 0
  366.  
  367. .read_chunk:
  368.  
  369.         invoke  file_seek, [fh], [fo], SEEK_END
  370.         cmp     eax, -1
  371.         je      .exit
  372.         invoke  file_read, [fh], [fb], filebuffer_size
  373.         cmp     eax, -1
  374.         je      .exit
  375.         add     [fo], filebuffer_size
  376.         cmp     eax, filebuffer_size
  377.         je      .packet
  378.  
  379.         ; ijhidfhfdsndsfqk
  380.  
  381. .packet:
  382.  
  383.         movzx   esi, [last_ack]
  384.         and     esi, 0x000000001f   ; last five bits    BUFFER SIZE MUST BE 16 kb for this to work !!!
  385.         shl     esi, 9              ; = * 512
  386.         add     esi, [fb]
  387.         mov     edi, buffer
  388.         mov     ax, opcode_data
  389.         stosw
  390.         mov     ax, [last_ack]
  391.         stosw
  392.         mov     ecx, 512/4
  393.         rep     movsd
  394.  
  395.         mcall   send, [socketnum], buffer, 4+512, 0       ; send data
  396.  
  397.  
  398. .loop:
  399.  
  400.         mcall   23, TIMEOUT
  401.  
  402.         dec     eax
  403.         jz      .red
  404.  
  405.         dec     eax
  406.         jz      .key
  407.  
  408.         mcall   recv, [socketnum], buffer, buffer_len, 0  ; receive ack
  409.  
  410.         cmp     word[buffer], opcode_ack
  411.         jne     .exit
  412.  
  413.         mov     ax, [last_ack]
  414.         cmp     word[buffer+2], ax
  415.         jne     .packet
  416.         inc     [last_ack]
  417.         test    [last_ack],0x001f
  418.         jz      .read_chunk
  419.         jmp     .packet
  420.  
  421.  
  422. .red:
  423.  
  424.         call    draw_window
  425.  
  426.         jmp     .loop
  427.  
  428.  
  429. .key:
  430.         mcall   2
  431.         cmp     ah, 2
  432.         jz      exit
  433.  
  434.         ; close socket ?
  435.  
  436.         jmp     .loop
  437.  
  438. .exit:
  439.         invoke  file_close, [fh]
  440.         jmp     still
  441.  
  442.  
  443.  
  444.  
  445.  
  446. ;-------------------------
  447. ; DATA
  448.  
  449. socketnum      dd 0
  450. kbps           dd 0
  451. done           dd 0
  452.  
  453. sockaddr:
  454.         dw AF_INET4
  455.         dw 69
  456. IP      db 192,168,1,115
  457. sockaddr_len = $ - sockaddr
  458.  
  459. align 16
  460. @IMPORT:
  461.  
  462. library box_lib , 'box_lib.obj'
  463. library io_lib  , 'libio.obj'
  464. library network , 'network.obj'
  465.  
  466. import  box_lib                                 ,\
  467.         edit_box_draw    ,'edit_box'            ,\
  468.         edit_box_key     ,'edit_box_key'        ,\
  469.         edit_box_mouse   ,'edit_box_mouse'      ,\
  470.         version_ed       ,'version_ed'          ,\
  471.         check_box_draw   ,'check_box_draw'      ,\
  472.         check_box_mouse  ,'check_box_mouse'     ,\
  473.         version_ch       ,'version_ch'          ,\
  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, 10,10
  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. IM_END: