Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
3545 hidnplayr 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'
3549 yogev_ezra 18
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
3545 hidnplayr 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: