Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1337 hidnplayr 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'
1373 IgorA 12
include '../../../../../programs/develop/libraries/box_lib/trunk/box_lib.mac'
1337 hidnplayr 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: