Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
474 diamond 1
delete_file_worker:
2
; in: ecx=flags: 1=deleting directory
3
; out: eax=0 - OK, eax=1 - retry, eax=2 - skip, eax=-1 - cancel,
4
;      PF, ZF, CF and SF set accordingly to 'cmp eax,2' (or 'cmp al,2')
5
        push    ebx
6
        push    70
7
        pop     eax
8
        mov     ebx, delinfo
517 diamond 9
        int     0x40
474 diamond 10
        pop     ebx
11
        test    eax, eax
12
        jz      .ret
13
        cmp     [del_bSkipAll], 0
14
        jz      @f
15
        push    2
16
        pop     eax
17
        jmp     .ret
18
@@:
19
        push    execdata
20
        push    aCannotDeleteFolder
21
        test    cl, 1
22
        jnz     @f
23
        mov     dword [esp], aCannotDeleteFile
24
@@:
25
        call    get_error_msg
26
        push    eax
27
        mov     eax, esp
28
        push    DeleteErrorBtn
29
        push    4
30
        push    eax
31
        push    3
32
        call    SayErr
33
        add     esp, 3*4
34
        cmp     al, -1
35
        jz      @f
36
        inc     eax
37
        cmp     al, 4   ; "cancel" button
38
        jnz     @f
39
        or      eax, -1
40
@@:
41
        cmp     al, 3   ; "skip all" button
42
        jnz     .ret
43
        mov     [del_bSkipAll], 1
44
        dec     eax
45
.ret:
46
        cmp     al, 2
47
        ret
48
 
49
delete_file:
50
; in: eax->BDFE block
51
; out: CF and ZF not set <=> cancel job ("ja cancel_label")
52
        pushad
53
        mov     [del_dir_stack_ptr], del_dir_stack
54
        lea     esi, [ebp + panel1_dir - panel1_data]
55
        mov     edi, execdata
56
@@:
57
        lodsb
58
        test    al, al
59
        jz      @f
60
        stosb
61
        jmp     @b
62
@@:
63
        mov     esi, [esp+28]
64
        mov     ecx, esi
65
        add     esi, 40
589 diamond 66
        cmp     byte [edi-1], '/'
67
        jz      .l1
474 diamond 68
        mov     al, '/'
69
        stosb
70
.l1:
71
        lodsb
72
        cmp     edi, execdataend
73
        jb      @f
74
        call    panels_OnKey.bigfilename
75
        popad
76
        ret
77
@@:
78
        stosb
79
        test    al, al
80
        jnz     .l1
81
        mov     ecx, [esp+28]
82
        test    byte [ecx], 10h
83
        jnz     .delete_dir
84
.retrydel:
85
        xor     ecx, ecx
86
        call    delete_file_worker
87
        jae     @f
88
        jp      .retrydel
89
@@:
90
        popad
91
        ret
92
 
93
.delete_dir:
94
; recursive delete of directory
95
        xor     ebp, ebp        ; ebp will contain number of undeletable items
96
.return_from_recursion:
97
        mov     ebx, dirinfo
98
        mov     [ebx+dirinfo.first-dirinfo], ebp
99
        mov     [ebx+dirinfo.size-dirinfo], del_dir_query_size
100
        mov     [ebx+dirinfo.dirdata-dirinfo], del_dir_query_area
101
        mov     [ebx+dirinfo.name-dirinfo], execdata
102
        push    70
103
        pop     eax
517 diamond 104
        int     0x40
474 diamond 105
; if we get read error, the best available action is try to delete directory itself
106
        test    eax, eax
107
        jz      @f
108
        cmp     eax, 6
109
        jnz     .do_delete_dir
110
@@:
111
; loop through a directory and delete items
112
        mov     edx, del_dir_query_area+32
113
        imul    ebx, 304
114
        add     ebx, edx
115
.delete_dir_entry_loop:
116
        cmp     edx, ebx
517 diamond 117
        jb      .do_delete_dir_entry
118
        cmp     ebx, del_dir_query_area+32+304*del_dir_query_size
119
        jnz     .delete_dir_entry_done
120
        jmp     .return_from_recursion
121
.do_delete_dir_entry:
474 diamond 122
; ignore special entries "." and ".."
123
        inc     ebp
124
        cmp     word [edx+40], '.'
125
        jz      .delete_dir_entry_continue
126
        cmp     word [edx+40], '..'
127
        jnz     @f
128
        cmp     byte [edx+42], 0
129
        jz      .delete_dir_entry_continue
130
@@:
131
        dec     ebp
132
        mov     esi, execdata
133
@@:
134
        lodsb
135
        test    al, al
136
        jnz     @b
137
        mov     byte [esi-1], '/'
138
        mov     edi, esi
139
        lea     esi, [edx+40]
140
@@:
141
        cmp     edi, execdataend
142
        jae     .fullname_big
143
        lodsb
144
        stosb
145
        test    al, al
146
        jnz     @b
147
        test    byte [edx], 10h
148
        jnz     .entry_is_folder
149
.retry2:
150
        xor     ecx, ecx
151
        call    delete_file_worker
152
        ja      .cancel
153
        jz      .skip
154
        jp      .retry2
155
        jmp     .restore_name
156
.entry_is_folder:
157
; allocate new item in directory stack
158
        mov     eax, [del_dir_stack_ptr]
159
        mov     [eax], ebp
160
        add     eax, 4
161
        mov     [del_dir_stack_ptr], eax
162
; do recursive deleting
163
        jmp     .delete_dir
164
.fullname_big:
165
; we will just ignore such files and continue - in real life this situation can not happen
166
        inc     ebp
167
        mov     esi, execdataend-1
168
        jmp     .do_restore_name
169
.skip:
170
        inc     ebp
171
.restore_name:
172
        mov     esi, execdata
173
@@:
174
        lodsb
175
        test    al, al
176
        jnz     @b
177
        dec     esi
178
        dec     esi
179
.do_restore_name:
517 diamond 180
        call    delete_last_name
474 diamond 181
.delete_dir_entry_continue:
182
        add     edx, 304
183
        jmp     .delete_dir_entry_loop
184
.delete_dir_entry_done:
185
.do_delete_dir:
186
        mov     cl, 1
187
        call    delete_file_worker
188
        ja      .cancel
189
        jz      @f
190
        jp      .delete_dir
191
@@:
192
; al=0 - OK, al=2 - skip this directory
193
; return to previous directory
194
; pop item from directory stack
195
        mov     ecx, [del_dir_stack_ptr]
196
        cmp     ecx, del_dir_stack
197
        jbe     .done
198
        sub     ecx, 4
199
        mov     [del_dir_stack_ptr], ecx
200
        mov     ebp, [ecx]
201
        cmp     al, 2
202
        sbb     ebp, -1
203
; restore prev directory name
204
        mov     esi, execdata
517 diamond 205
        call    delete_last_name_from_end
206
        jmp     .return_from_recursion
207
.done:
208
.cancel:
209
        mov     [dirinfo.first], 0      ; do not destroys flags
210
        popad
211
        ret
212
 
213
makedir:
214
; create directory with name from CopyDestEditBuf+12
215
; destroys eax
216
        push    ebx
217
        push    70
218
        pop     eax
219
        mov     ebx, mkdirinfo
220
        int     0x40
221
        pop     ebx
222
        test    eax, eax
223
        jz      .ret
224
        cmp     dword [esp+8], DeleteErrorBtn
225
        jnz     @f
226
        cmp     [copy_bSkipAll], 0
227
        jz      @f
228
        push    1
229
        pop     eax
230
        jmp     .ret
474 diamond 231
@@:
517 diamond 232
        push    dword CopyDestEditBuf+12
233
        push    dword aCannotMakeFolder
234
        call    get_error_msg
235
        push    eax
236
        mov     eax, esp
237
        push    dword [eax+20]
238
        push    dword [eax+16]
239
        push    eax
240
        push    3
241
        call    SayErr
242
        add     esp, 3*4
243
        test    eax, eax
244
        jz      makedir
245
.ret:
246
        ret     8
247
 
248
copy_file_worker:
249
; in: execdata = source name, CopyDestEditBuf+12 = destination name, edx = BDFE block for source
250
; out: CF and ZF not set <=> cancel job ("ja cancel_label")
251
; destroys eax,esi,edi
589 diamond 252
        lea     edi, [edx+40]
253
        and     [source_hFile], 0
254
copy_file_worker2:
517 diamond 255
        push    CopyDestEditBuf+12+513
256
        cmp     [bDestIsFolder], 0
257
        jz      .noaddtoname
258
        mov     esi, CopyDestEditBuf+12
259
@@:
474 diamond 260
        lodsb
261
        test    al, al
262
        jnz     @b
589 diamond 263
        pop     eax
264
        dec     esi
517 diamond 265
        push    esi
589 diamond 266
        cmp     byte [esi-1], '/'
267
        jz      @f
268
        mov     byte [esi], '/'
269
        inc     esi
517 diamond 270
@@:
589 diamond 271
        xchg    esi, edi
272
@@:
517 diamond 273
        cmp     edi, CopyDestEditBuf+12+513
274
        jae     .overflow
275
        lodsb
276
        stosb
277
        test    al, al
278
        jnz     @b
279
        jmp     .noaddtoname
280
.overflow:
281
.ret_zf:
282
        pop     esi
589 diamond 283
        and     byte [esi], 0           ; ZF=1
517 diamond 284
        ret
285
.noaddtoname:
589 diamond 286
; ¥«ì§ï ᪮¯¨à®¢ âì ä ©« ¯®¢¥àå á ¬®£® ᥡï!
517 diamond 287
        mov     esi, execdata
288
        mov     edi, CopyDestEditBuf+12
589 diamond 289
        cmp     [source_hModule], 0
290
        jnz     @f
517 diamond 291
        push    esi edi
292
        call    strcmpi
293
        pop     edi esi
294
        jnz     @f
295
        push    esi
296
        push    aCannotCopyToSelf
297
        mov     eax, esp
298
        push    ContinueBtn
299
        push    1
300
        push    eax
301
        push    2
302
        call    SayErr
303
        pop     eax
304
        pop     eax
305
        jmp     .ret_zf
306
@@:
589 diamond 307
; ‘®¡á⢥­­®, ª®¯¨à㥬
517 diamond 308
; esi->source name, edi->destination name
309
        push    ebx
310
        mov     [writeinfo.code], 2
311
        mov     [writeinfo.name], edi
312
        and     dword [writeinfo.first], 0
313
        and     dword [writeinfo.first+4], 0
314
        mov     [writeinfo.data], copy_buffer
315
        mov     ebx, readinfo
316
        and     dword [ebx+readinfo.first-readinfo], 0
317
        and     dword [ebx+readinfo.first+4-readinfo], 0
318
        mov     [ebx+readinfo.size-readinfo], copy_buffer_size
319
        mov     [ebx+readinfo.data-readinfo], copy_buffer
320
        mov     [ebx+readinfo.name-readinfo], esi
589 diamond 321
        mov     eax, [source_hFile]
322
        push    eax
323
        test    eax, eax
324
        jnz     .copyloop
325
.source_reopen:
326
        mov     eax, [source_hModule]
327
        test    eax, eax
328
        jz      .copyloop
329
        pushad
330
        push    O_READ+O_SEQUENTIAL_ONLY
331
        push    esi
332
        push    [source_hPlugin]
333
        call    [eax+PluginInfo.open]
334
        mov     [source_hFile], eax
335
        popad
517 diamond 336
.copyloop:
337
        mov     ebx, readinfo
589 diamond 338
        mov     eax, [source_hModule]
339
        test    eax, eax
340
        jz      .native
341
        mov     ecx, [source_hFile]
342
        jecxz   .readerr
343
        pushad
344
        push    [ebx+readinfo.size-readinfo]
345
        push    [ebx+readinfo.data-readinfo]
346
        push    ecx
347
        call    [eax+PluginInfo.read]
348
        mov     [esp+28], eax
349
        popad
350
        cmp     eax, -1
351
        jz      .readerr
352
        mov     ebx, eax
353
        jmp     .copyreadok
354
.native:
517 diamond 355
        push    70
356
        pop     eax
357
        int     0x40
358
        test    eax, eax
359
        jz      .copyreadok
360
        cmp     eax, 6
361
        jz      .copyreadok
589 diamond 362
.readerr:
517 diamond 363
        cmp     [copy_bSkipAll2], 0
364
        jnz     .copyfailed_del2
365
        push    esi
366
        push    dword aCannotReadFile
367
        call    get_error_msg
368
        push    eax
369
        mov     eax, esp
370
        push    dword DeleteErrorBtn
371
        push    4
372
        push    eax
373
        push    3
374
        call    SayErr
375
        add     esp, 3*4
376
        test    eax, eax
589 diamond 377
        jnz     .copyfailed_parseuser
378
        cmp     [source_hModule], 0
517 diamond 379
        jz      .copyloop
589 diamond 380
        cmp     [source_hFile], 0
381
        jz      .source_reopen
382
        jmp     .copyloop
517 diamond 383
.copyreadok:
384
        add     dword [readinfo.first], ebx
385
        adc     dword [readinfo.first+4], 0
386
        mov     [writeinfo.size], ebx
387
        test    ebx, ebx
388
        jnz     .copywrite
389
        cmp     byte [writeinfo.code], 2
390
        jnz     .copydone
391
.copywrite:
392
        mov     ebx, writeinfo
393
        push    70
394
        pop     eax
395
        int     0x40
396
        test    eax, eax
397
        jz      .copywriteok
398
        cmp     [copy_bSkipAll2], 0
399
        jnz     .copyfailed_del2
400
        push    edi
401
        push    dword aCannotWriteFile
402
        call    get_error_msg
403
        push    eax
404
        mov     eax, esp
405
        push    dword DeleteErrorBtn
406
        push    4
407
        push    eax
408
        push    3
409
        call    SayErr
410
        add     esp, 3*4
411
        test    eax, eax
412
        jz      .copywrite
413
.copyfailed_parseuser:
414
        cmp     al, 2
415
        jnz     @f
416
        mov     [copy_bSkipAll2], 1
417
        dec     eax
418
@@:
419
        cmp     al, 1
420
        pushf
421
        jmp     .copyfailed
422
.copywriteok:
423
        mov     ecx, [writeinfo.size]
424
        add     dword [writeinfo.first], ecx
425
        adc     dword [writeinfo.first+4], 0
426
        mov     [writeinfo.code], 3
427
        cmp     ecx, copy_buffer_size
428
        jz      .copyloop
429
.copydone:
589 diamond 430
        pop     ecx
431
        test    ecx, ecx
432
        jnz     @f
433
        mov     eax, [source_hModule]
434
        test    eax, eax
435
        jz      @f
436
        mov     ecx, [source_hFile]
437
        jecxz   @f
438
        push    edx
439
        push    ecx
440
        call    [eax+PluginInfo.close]
441
        pop     edx
442
@@:
517 diamond 443
; now try to set attributes from source, ignore errors
444
        mov     edi, attrinfo.attr
445
        mov     esi, edx
446
        push    8
447
        pop     ecx
448
        rep     movsd
589 diamond 449
; replace zero dates with default values
450
        mov     eax, [default_attr]
451
        cmp     dword [edi-32+8], 0
452
        jnz     @f
453
        mov     ecx, [eax+8]
454
        mov     [edi-32+8], ecx
455
        mov     ecx, [eax+12]
456
        mov     [edi-32+12], ecx
457
@@:
458
        cmp     dword [edi-32+16], 0
459
        jnz     @f
460
        mov     ecx, [eax+16]
461
        mov     [edi-32+16], ecx
462
        mov     ecx, [eax+20]
463
        mov     [edi-32+20], ecx
464
@@:
465
        cmp     dword [edi-32+24], 0
466
        jnz     @f
467
        mov     ecx, [eax+24]
468
        mov     [edi-32+24], ecx
469
        mov     ecx, [eax+28]
470
        mov     [edi-32+28], ecx
471
@@:
517 diamond 472
        mov     ebx, attrinfo
473
        mov     [ebx+attrinfo.name-attrinfo], CopyDestEditBuf+12
474
        inc     dword [ebx]
475
        push    70
476
        pop     eax
477
        push    ebx
478
        int     0x40
479
        pop     ebx
480
        dec     dword [ebx]
481
        xor     eax, eax        ; ZF=1
482
.ret:
483
        pop     ebx
484
        pop     esi
589 diamond 485
        mov     byte [esi], 0
517 diamond 486
        ret
487
.copydone2:
488
        popf
489
        jmp     .ret
490
.copyfailed:
589 diamond 491
        pop     ecx
492
        test    ecx, ecx
493
        jnz     @f
494
        mov     eax, [source_hModule]
495
        test    eax, eax
496
        jz      @f
497
        mov     ecx, [source_hFile]
498
        jecxz   @f
499
        push    ecx
500
        call    [eax+PluginInfo.close]
501
@@:
517 diamond 502
        cmp     [bConfirmDeleteIncomplete], 0
503
        jz      .copyfailed_del
504
        cmp     [writeinfo.code], 2
505
        jz      .copydone2
506
        push    dword aIncompleteFile
507
        mov     eax, esp
508
        push    dword DeleteOrKeepBtn
509
        push    2
510
        push    eax
511
        push    1
512
        push    dword aCopyCaption
589 diamond 513
        call    Message
517 diamond 514
        add     esp, 4
515
        test    eax, eax
516
        jnz     .copydone2
517
.copyfailed_del:
518
        mov     ebx, delinfo
519
        push    dword [ebx+21]
520
        mov     dword [ebx+21], edi
521
        push    70
522
        pop     eax
523
        int     0x40
524
; ignore errors
525
        pop     dword [delinfo+21]
526
        jmp     .copydone2
527
.copyfailed_del2:
528
        xor     eax, eax
529
        pushf
530
        jmp     .copyfailed_del
531
 
532
copy_file:
533
; in: eax->BDFE block for source, CopyDestEditBuf+12 contains ASCIIZ full name for destination
534
; out: CF and ZF not set <=> cancel job ("ja cancel_label")
535
        pushad
536
        mov     [copy_dir_stack_ptr], copy_dir_stack
537
        mov     [bNeedRestoreName], 0
538
        lea     esi, [ebp + panel1_dir - panel1_data]
539
        mov     edi, execdata
540
@@:
541
        lodsb
542
        test    al, al
543
        jz      @f
544
        stosb
545
        jmp     @b
546
@@:
547
        mov     esi, [esp+28]
548
        add     esi, 40
589 diamond 549
        cmp     byte [edi-1], '/'
550
        jz      .l1
517 diamond 551
        mov     al, '/'
552
        stosb
553
.l1:
554
        lodsb
555
        cmp     edi, execdataend
556
        jb      @f
557
        call    panels_OnKey.bigfilename
589 diamond 558
        stc
517 diamond 559
        popad
560
        ret
561
@@:
562
        stosb
563
        test    al, al
564
        jnz     .l1
565
        mov     edx, [esp+28]
566
        test    byte [edx], 10h
567
        jnz     .copy_dir
568
        call    copy_file_worker
569
.popad_ret:
570
        popad
571
        ret
572
 
573
.biiig:
574
        mov     byte [edi-1], 0
575
        jmp     .popad_ret
576
 
577
.copy_dir:
578
; recursive copy of directory
579
        cmp     [bDestIsFolder], 0
580
        mov     [bDestIsFolder], 0
581
        jz      .target_created
582
        mov     [bNeedRestoreName], 1
583
        mov     esi, CopyDestEditBuf+12
584
@@:
585
        lodsb
586
        test    al, al
587
        jnz     @b
589 diamond 588
        dec     esi
589
        cmp     byte [esi-1], '/'
590
        jz      @f
591
        mov     byte [esi], '/'
592
        inc     esi
593
@@:
517 diamond 594
        mov     edi, esi
595
        lea     esi, [edx+40]
596
@@:
597
        cmp     edi, CopyDestEditBuf+12+513
598
        jae     .biiig
599
        lodsb
600
        stosb
601
        test    al, al
602
        jnz     @b
603
.create_target:
604
.enter_recursion:
605
        push    DeleteErrorBtn
606
        push    4
607
        call    makedir
608
        jz      .target_created
609
        cmp     al, 2
610
        jnz     @f
611
        dec     eax
612
        mov     [copy_bSkipAll], 1
613
@@:
614
        cmp     al, 1
615
        jz      .copy_dir_entry_done
589 diamond 616
        jmp     .cancel2
517 diamond 617
.target_created:
589 diamond 618
        mov     edx, [source_hModule]
619
        test    edx, edx
620
        jz      .nosetdir
621
        mov     esi, execdata
622
        push    esi     ; absolute_path
623
@@:
624
        lodsb
625
        test    al, al
626
        jnz     @b
627
@@:
628
        dec     esi
629
        cmp     byte [esi-1], '/'
630
        jnz     @b
631
        push    esi     ; relative_path
632
        push    [source_hPlugin]        ; hPlugin
633
        call    [edx+PluginInfo.SetFolder]
634
        test    al, al
635
        jnz     .nosetdir
636
        cmp     [copy_bSkipAll3], 0
637
        jz      .skip2
638
        push    execdata
639
        push    aCannotSetFolder
640
        mov     eax, esp
641
        push    DeleteErrorBtn
642
        push    4
643
        push    eax
644
        push    2
645
        call    SayErr
646
        pop     ecx ecx
647
        test    al, al
648
        jz      .target_created
649
        cmp     al, 2
650
        setz    [copy_bSkipAll3]
651
        ja      .cancel2
652
        jmp     .skip2
653
.nosetdir:
517 diamond 654
        xor     ebp, ebp        ; ebp will contain number of copied items
655
.return_from_recursion:
656
.read_retry:
657
        mov     ebx, dirinfo
658
        mov     [ebx+dirinfo.first-dirinfo], ebp
659
        mov     [ebx+dirinfo.size-dirinfo], copy_dir_query_size
660
        mov     [ebx+dirinfo.dirdata-dirinfo], copy_dir_query_area
661
        mov     [ebx+dirinfo.name-dirinfo], execdata
589 diamond 662
        mov     eax, [source_hModule]
663
        test    eax, eax
664
        jz      .readfolder_native
665
        push    ebp
666
        push    [ebx+dirinfo.dirdata-dirinfo]
667
        push    [ebx+dirinfo.size-dirinfo]
668
        push    [ebx+dirinfo.first-dirinfo]
669
        push    [source_hPlugin]
670
        call    [eax+PluginInfo.ReadFolder]
671
        pop     ebp
672
        mov     ebx, dword [copy_dir_query_area+4]
673
        jmp     @f
674
.readfolder_native:
517 diamond 675
        push    70
676
        pop     eax
677
        int     0x40
589 diamond 678
@@:
517 diamond 679
        test    eax, eax
680
        jz      .readok
681
        cmp     eax, 6
682
        jz      .readok
683
; read error
684
        cmp     [copy_bSkipAll], 0
589 diamond 685
        jnz     .skip1
517 diamond 686
        push    execdata
687
        push    aCannotReadFolder
688
        call    get_error_msg
689
        push    eax
690
        mov     eax, esp
691
        push    DeleteErrorBtn
692
        push    4
693
        push    eax
694
        push    3
695
        call    SayErr
696
        add     esp, 3*4
697
        test    al, al
698
        jz      .read_retry
699
        cmp     al, 2
700
        jnz     @f
701
        dec     eax
702
        mov     [copy_bSkipAll], 1
703
@@:
704
        cmp     al, 1
705
        jz      .skip1
706
        jmp     .cancel
707
.readok:
708
; loop through a directory and copy items
709
        mov     edx, copy_dir_query_area+32
710
        imul    ebx, 304
711
        add     ebx, edx
712
.copy_dir_entry_loop:
713
        cmp     edx, ebx
714
        jb      .do_copy_dir_entry
715
        cmp     ebx, copy_dir_query_area+32+copy_dir_query_size*304
716
        jz      .return_from_recursion
717
        jmp     .copy_dir_entry_done
718
.do_copy_dir_entry:
719
        inc     ebp
720
; ignore special entries "." and ".."
721
        cmp     word [edx+40], '.'
722
        jz      .copy_dir_entry_continue
723
        cmp     word [edx+40], '..'
724
        jnz     @f
725
        cmp     byte [edx+42], 0
726
        jz      .copy_dir_entry_continue
727
@@:
728
        mov     esi, execdata
729
@@:
730
        lodsb
731
        test    al, al
732
        jnz     @b
589 diamond 733
        dec     esi
734
        cmp     byte [esi-1], '/'
735
        jz      @f
736
        mov     byte [esi], '/'
737
        inc     esi
738
@@:
517 diamond 739
        mov     edi, esi
740
        lea     esi, [edx+40]
741
@@:
742
        cmp     edi, execdataend
743
        jae     .fullname_big
744
        lodsb
745
        stosb
746
        test    al, al
747
        jnz     @b
748
        mov     esi, CopyDestEditBuf+12
749
@@:
750
        lodsb
751
        test    al, al
752
        jnz     @b
589 diamond 753
        dec     esi
754
        cmp     byte [esi-1], '/'
755
        jz      @f
756
        mov     byte [esi], '/'
757
        inc     esi
758
@@:
517 diamond 759
        mov     edi, esi
760
        lea     esi, [edx+40]
761
@@:
762
        cmp     edi, CopyDestEditBuf+513
763
        jae     .fullname2_big
764
        lodsb
765
        stosb
766
        test    al, al
767
        jnz     @b
768
        test    byte [edx], 10h
769
        jnz     .entry_is_folder
770
        call    copy_file_worker
589 diamond 771
        ja      .cancel3
517 diamond 772
        jmp     .restore_name
773
.entry_is_folder:
774
; allocate new item in directory stack
775
        mov     eax, [copy_dir_stack_ptr]
776
        mov     [eax], ebp
777
        add     eax, 4
778
        mov     [copy_dir_stack_ptr], eax
779
; do recursive copying
780
        jmp     .enter_recursion
781
.fullname_big:
782
; we will just ignore such files and continue - in real life this situation can not happen
783
        mov     esi, execdataend-1
784
        jmp     .do_restore_name2
785
.fullname2_big:
786
        mov     esi, CopyDestEditBuf+12+512
787
        jmp     .restore_name2
788
.restore_name:
789
        mov     esi, CopyDestEditBuf+12
790
@@:
791
        lodsb
792
        test    al, al
793
        jnz     @b
474 diamond 794
        dec     esi
795
        dec     esi
517 diamond 796
.restore_name2:
797
        call    delete_last_name
798
        mov     esi, execdata
474 diamond 799
@@:
800
        lodsb
517 diamond 801
        test    al, al
474 diamond 802
        jnz     @b
517 diamond 803
        dec     esi
804
        dec     esi
805
.do_restore_name2:
806
        call    delete_last_name
807
.copy_dir_entry_continue:
808
        add     edx, 304
809
        jmp     .copy_dir_entry_loop
589 diamond 810
.skip1:
517 diamond 811
.copy_dir_entry_done:
812
; return to previous directory
589 diamond 813
        mov     esi, execdata
814
        call    delete_last_name_from_end
815
        mov     eax, [source_hModule]
816
        test    eax, eax
817
        jz      @f
818
        push    execdata
819
        push    aDotDot
820
        push    [source_hPlugin]
821
        call    [eax+PluginInfo.SetFolder]
822
        jmp     @f
823
.skip2:
824
        mov     esi, execdata
825
        call    delete_last_name_from_end
826
@@:
517 diamond 827
; pop item from directory stack
828
        mov     ecx, [copy_dir_stack_ptr]
829
        cmp     ecx, copy_dir_stack
830
        jbe     .done
831
        sub     ecx, 4
832
        mov     [copy_dir_stack_ptr], ecx
833
        mov     ebp, [ecx]
834
; restore prev directory name
835
        mov     esi, CopyDestEditBuf+12
836
        call    delete_last_name_from_end
474 diamond 837
        jmp     .return_from_recursion
838
.done:
839
        mov     [dirinfo.first], 0      ; do not destroys flags
840
        popad
841
        ret
589 diamond 842
.cancel2:
843
        sub     [copy_dir_stack_ptr], 4
844
.cancel3:
845
        mov     esi, execdata
846
        call    delete_last_name_from_end
847
.cancel:
848
        mov     eax, [source_hModule]
849
        test    eax, eax
850
        jz      .cancel.ret
851
        cmp     [copy_dir_stack_ptr], copy_dir_stack
852
        jb      .cancel.ret
853
        push    execdata
854
        push    aDotDot
855
        push    [source_hPlugin]
856
        call    [eax+PluginInfo.SetFolder]
857
        jmp     .cancel2
858
.cancel.ret:
859
        xor     eax, eax
860
        inc     eax
861
        popad
862
        ret
517 diamond 863
 
864
delete_last_name_from_end:
865
        lodsb
866
        test    al, al
867
        jnz     delete_last_name_from_end
868
        dec     esi
869
        dec     esi
870
delete_last_name:
871
        std
872
@@:
873
        lodsb
874
        cmp     al, '/'
875
        jnz     @b
876
        cld
589 diamond 877
        inc     esi
878
        cmp     esi, execdata
879
        jz      @f
880
        cmp     esi, CopyDestEditBuf+12
881
        jz      @f
882
        dec     esi
883
@@:
517 diamond 884
        mov     byte [esi+1], 0
885
        ret
589 diamond 886
 
887
copy_AddDir:
888
        push    1
889
        pop     eax                     ; for "return true"
890
        pushad
891
        mov     esi, CopyDestEditBuf+12
892
@@:
893
        lodsb
894
        test    al, al
895
        jnz     @b
896
        cmp     byte [esi-2], '/'
897
        jnz     @f
898
        dec     esi
899
@@:
900
        push    dword [esi-1]
901
        push    esi
902
        mov     byte [esi-1], '/'
903
        mov     edi, esi
904
        mov     esi, [esp+28h+4]
905
.0:
906
        lodsb
907
        stosb
908
        cmp     edi, CopyDestEditBuf+12+512
909
        jae     .done
910
        test    al, al
911
        jnz     .0
912
        push    RetryOrCancelBtn
913
        push    2
914
        call    makedir
915
        jz      .done
916
        and     dword [esp+8+1Ch], 0
917
.done:
918
        pop     esi
919
        pop     dword [esi-1]
920
        popad
921
        ret     8
922
 
923
copy_AddFile:
924
        pushad
925
        mov     eax, [esp+20h+12]
926
        mov     [source_hFile], eax
927
        mov     edx, [esp+20h+8]
928
        mov     edi, [esp+20h+4]
929
        call    copy_file_worker2
930
        popad
931
        setna   al
932
        ret     12
933
 
934
virtual at 0
935
_FILE:
936
.pos            dq      ?
937
.bufpos         dq      ?
938
.bufsize        dd      ?
939
.mode           dd      ?
940
.hPlugin        dd      ?
941
.hFile          dd      ?
942
.fileinfo:
943
.fimode         dd      ?
944
.fioffset       dq      ?
945
.fisize         dd      ?
946
.fibuf          dd      ?
947
.finame         rb      1024
948
.attr           rb      40
949
align 512
950
.buf            rb      2048
951
.size = $
952
end virtual
953
 
954
O_READ = 1      ; allows read from file
955
O_WRITE = 2     ; allows write to file
956
O_CREATE = 4    ; if file does not exist and this flag is set, create file;
957
                ; if file does not exist and this flag is not set, fail
958
O_TRUNCATE = 8  ; truncate file if it exists
959
O_SEQUENTIAL_ONLY = 10h ; there will be no 'seek'/'setpos' calls
960
 
961
; HANDLE __stdcall open(const char* name, int mode);
962
; Opens physical file
963
open:
964
        pushad
965
        mov     ecx, _FILE.size
966
        call    xpgalloc
967
        test    eax, eax
968
        jz      .ret0z
969
        mov     [esp+28], eax
970
        mov     ecx, eax
971
        mov     esi, [esp+36]
972
        lea     edi, [eax+_FILE.finame]
973
        lea     edx, [eax+_FILE.finame+1024]
974
@@:
975
        lodsb
976
        stosb
977
        test    al, al
978
        jz      @f
979
        cmp     edi, edx
980
        jb      @b
981
.ret0:
982
        call    pgfree
983
.ret0z:
984
        popad
985
        xor     eax, eax
986
        ret     8
987
@@:
988
        mov     eax, [esp+40]
989
        mov     [ecx+_FILE.mode], eax
990
.getattr:
991
        lea     edi, [ecx+_FILE.fileinfo]
992
        mov     ebx, edi
993
        push    5
994
        pop     eax
995
        stosd
996
        xor     eax, eax
997
        stosd
998
        stosd
999
        stosd
1000
        lea     eax, [ecx+_FILE.attr]
1001
        stosd
1002
        push    70
1003
        pop     eax
1004
        int     0x40
1005
        test    eax, eax
1006
        jz      .found
1007
        cmp     eax, 5
1008
        jnz     .ret0
1009
; file does not exist
1010
        test    [ecx+_FILE.mode], O_CREATE
631 diamond 1011
        jz      .ret0
589 diamond 1012
.truncate:
1013
        lea     ebx, [ecx+_FILE.fileinfo]
1014
        mov     byte [ebx], 2
1015
        push    70
1016
        pop     eax
1017
        int     0x40
1018
        test    eax, eax
1019
        jz      .getattr
1020
        jmp     .ret0
1021
.found:
1022
        test    [ecx+_FILE.mode], O_TRUNCATE
1023
        jz      @f
1024
        cmp     dword [ecx+_FILE.attr+36], eax
1025
        jnz     .truncate
1026
        cmp     dword [ecx+_FILE.attr+32], eax
1027
        jnz     .truncate
1028
@@:
1029
        mov     dword [ecx+_FILE.pos], eax
1030
        mov     dword [ecx+_FILE.pos+4], eax
1031
        mov     dword [ecx+_FILE.bufpos], eax
1032
        mov     dword [ecx+_FILE.bufpos+4], eax
1033
        mov     [ecx+_FILE.bufsize], eax
1034
        mov     [ecx+_FILE.hPlugin], eax
1035
        mov     [ecx+_FILE.hFile], eax
1036
        mov     dword [ecx+_FILE.fioffset], eax
1037
        mov     dword [ecx+_FILE.fioffset+4], eax
1038
        mov     [esp+28], ecx
1039
        popad
1040
        ret     8
1041
 
631 diamond 1042
; HANDLE __stdcall open2(int plugin_id, HANDLE plugin_instance, const char* name, int mode);
1043
; Opens file on plugin panel
1044
open2:
1045
        cmp     dword [esp+4], 0
1046
        jnz     .plugin
1047
        pop     eax
1048
        add     esp, 8
1049
        push    eax
1050
        jmp     open
1051
.plugin:
1052
        pushad
1053
        mov     ecx, _FILE.size
1054
        call    xpgalloc
1055
        test    eax, eax
1056
        jz      .ret0z
1057
        mov     [esp+28], eax
1058
        mov     ecx, eax
1059
        mov     esi, [esp+44]
1060
        lea     edi, [eax+_FILE.finame]
1061
        lea     edx, [eax+_FILE.finame+1024]
1062
@@:
1063
        lodsb
1064
        stosb
1065
        test    al, al
1066
        jz      @f
1067
        cmp     edi, edx
1068
        jb      @b
1069
.ret0:
1070
        call    pgfree
1071
.ret0z:
1072
        popad
1073
        xor     eax, eax
1074
        ret     8
1075
@@:
1076
        mov     edx, [esp+36]
1077
        mov     [ecx+_FILE.hPlugin], edx
1078
        mov     ebx, [esp+40]
1079
        mov     eax, [esp+48]
1080
        mov     [ecx+_FILE.mode], eax
1081
        push    ebx ecx
1082
        push    eax
1083
        lea     eax, [ecx+_FILE.finame]
1084
        push    eax
1085
        push    ebx
1086
        call    [edx+PluginInfo.open]
1087
        pop     ecx ebx
1088
        test    eax, eax
1089
        jz      .ret0
1090
        mov     [ecx+_FILE.hFile], eax
1091
        mov     edx, [esp+36]
1092
        push    ecx
1093
        lea     edi, [ecx+_FILE.fileinfo]
1094
        push    edi
1095
        xor     eax, eax
1096
        push    ecx
1097
        push    10
1098
        pop     ecx
1099
        rep     stosd
1100
        pop     ecx
1101
        lea     eax, [ecx+_FILE.finame]
1102
        push    eax
1103
        push    ebx
1104
        call    [edx+PluginInfo.getattr]
1105
        pop     ecx
1106
        xor     eax, eax
1107
        mov     dword [ecx+_FILE.pos], eax
1108
        mov     dword [ecx+_FILE.pos+4], eax
1109
        mov     dword [ecx+_FILE.bufpos], eax
1110
        mov     dword [ecx+_FILE.bufpos+4], eax
1111
        mov     [ecx+_FILE.bufsize], eax
1112
        mov     dword [ecx+_FILE.fioffset], eax
1113
        mov     dword [ecx+_FILE.fioffset+4], eax
1114
        mov     [esp+28], ecx
1115
        popad
1116
        ret     16
1117
 
589 diamond 1118
; unsigned __stdcall read(HANDLE hFile, void* buf, unsigned size);
1119
read:
1120
        xor     eax, eax
1121
        pushad
1122
        mov     ecx, [esp+36]
1123
        test    [ecx+_FILE.mode], O_READ
1124
        jnz     @f
1125
.ret:
1126
        popad
1127
        ret     12
1128
@@:
1129
        cmp     dword [esp+44], eax
1130
        jz      .ret
1131
        mov     [ecx+_FILE.fimode], eax
1132
        mov     ebx, [ecx+_FILE.bufsize]
1133
        mov     eax, dword [ecx+_FILE.pos]
1134
        and     eax, 2047
1135
        sub     ebx, eax
1136
        jbe     .nobuf0
1137
        cmp     ebx, [esp+44]
1138
        jbe     @f
1139
        mov     ebx, [esp+44]
1140
@@:
1141
        push    ecx
1142
        lea     esi, [ecx+eax+_FILE.buf]
1143
        mov     ecx, ebx
1144
        mov     edi, [esp+44]
1145
        rep     movsb
1146
        pop     ecx
1147
        mov     [esp+40], edi
1148
        add     [esp+28], ebx
1149
        add     dword [ecx+_FILE.pos], ebx
1150
        adc     dword [ecx+_FILE.pos+4], 0
631 diamond 1151
        test    dword [ecx+_FILE.pos], 2047
1152
        jnz     @f
1153
        and     [ecx+_FILE.bufsize], 0
1154
@@:
589 diamond 1155
        sub     [esp+44], ebx
1156
        jz      .ret
1157
.nobuf0:
1158
        test    dword [ecx+_FILE.pos], 2047
1159
        jz      .aligned
1160
        cmp     dword [ecx+_FILE.bufsize], 0
1161
        jnz     .ret
1162
        lea     ebx, [ecx+_FILE.fileinfo]
1163
        mov     dword [ebx+12], 2048
1164
        lea     eax, [ecx+_FILE.buf]
1165
        mov     dword [ebx+16], eax
1166
        mov     eax, dword [ecx+_FILE.fioffset]
1167
        mov     dword [ecx+_FILE.bufpos], eax
1168
        mov     eax, dword [ecx+_FILE.fioffset+4]
1169
        mov     dword [ecx+_FILE.bufpos+4], eax
1170
        call    .doread
1171
        test    eax, eax
1172
        jnz     .ret
1173
        mov     [ecx+_FILE.bufsize], ebx
1174
        mov     eax, dword [ecx+_FILE.pos]
1175
        and     eax, 2047
1176
        sub     ebx, eax
1177
        jbe     .ret
1178
        cmp     ebx, [esp+44]
1179
        jbe     @f
1180
        mov     ebx, [esp+44]
1181
@@:
1182
        push    ecx
1183
        lea     esi, [ecx+eax+_FILE.buf]
1184
        mov     ecx, ebx
1185
        mov     edi, [esp+44]
1186
        rep     movsb
1187
        pop     ecx
1188
        add     dword [ecx+_FILE.pos], ebx
1189
        adc     dword [ecx+_FILE.pos+4], 0
1190
        mov     [esp+40], edi
1191
        add     [esp+28], ebx
1192
        sub     [esp+44], ebx
1193
        jz      .ret
1194
        test    dword [ecx+_FILE.pos], 2047
1195
        jnz     .ret
1196
.aligned:
1197
        lea     ebx, [ecx+_FILE.fileinfo]
1198
        mov     eax, [esp+44]
1199
        and     eax, not 2047
1200
        jz      .finish
1201
        and     [ecx+_FILE.bufsize], 0
1202
        mov     [ebx+12], eax
1203
        mov     eax, [esp+40]
1204
        mov     [ebx+16], eax
1205
        call    .doread
1206
        test    eax, eax
1207
        jnz     .ret
1208
        add     dword [ecx+_FILE.pos], ebx
1209
        adc     dword [ecx+_FILE.pos+4], 0
1210
        add     [esp+28], ebx
1211
        add     [esp+40], ebx
1212
        sub     [esp+44], ebx
1213
        jz      .ret
1214
        cmp     ebx, [ecx+_FILE.fisize]
1215
        jb      .ret
1216
.finish:
1217
        lea     ebx, [ecx+_FILE.fileinfo]
1218
        mov     dword [ebx+12], 2048
1219
        lea     eax, [ecx+_FILE.buf]
1220
        mov     [ebx+16], eax
1221
        and     [ecx+_FILE.bufsize], 0
1222
        mov     eax, dword [ecx+_FILE.fioffset]
1223
        mov     dword [ecx+_FILE.bufpos], eax
1224
        mov     eax, dword [ecx+_FILE.fioffset+4]
1225
        mov     dword [ecx+_FILE.bufpos+4], eax
1226
        call    .doread
1227
        test    eax, eax
1228
        jnz     .ret
1229
        mov     [ecx+_FILE.bufsize], ebx
1230
        cmp     ebx, [esp+44]
1231
        jb      @f
1232
        mov     ebx, [esp+44]
1233
@@:
1234
        add     [esp+28], ebx
1235
        add     dword [ecx+_FILE.pos], ebx
1236
        adc     dword [ecx+_FILE.pos+4], 0
1237
        lea     esi, [ecx+_FILE.buf]
1238
        mov     edi, [esp+40]
1239
        mov     ecx, ebx
1240
        rep     movsb
1241
        popad
1242
        ret     12
1243
.doread:
1244
        mov     eax, [ecx+_FILE.hPlugin]
1245
        test    eax, eax
1246
        jz      .native
1247
        push    ecx
1248
        push    [ecx+_FILE.fisize]
1249
        push    [ecx+_FILE.fibuf]
1250
        push    [ecx+_FILE.hFile]
1251
        call    [eax+PluginInfo.read]
1252
        pop     ecx
1253
        cmp     eax, -1
1254
        jz      @f
1255
        mov     ebx, eax
1256
        xor     eax, eax
1257
        jmp     .addpos
1258
@@:
1259
        ret
1260
.native:
1261
        push    70
1262
        pop     eax
1263
        int     0x40
1264
        test    eax, eax
1265
        jz      .addpos
1266
        cmp     eax, 6
1267
        jnz     @b
1268
        xor     eax, eax
1269
.addpos:
1270
        add     dword [ecx+_FILE.fioffset], ebx
1271
        adc     dword [ecx+_FILE.fioffset+4], 0
1272
        ret
1273
 
1274
; void __stdcall seek(HANDLE hFile, int method, __int64 newpos);
1275
seek:
1276
        pushad
1277
        mov     ecx, [esp+36]
1278
        mov     eax, [esp+44]
1279
        mov     edx, [esp+48]
1280
        cmp     dword [esp+40], 1
1281
        jb      .set
1282
        ja      .end
1283
        add     eax, dword [ecx+_FILE.pos]
1284
        adc     edx, dword [ecx+_FILE.pos+4]
1285
        jmp     .set
1286
.end:
1287
        add     eax, dword [ecx+_FILE.attr+32]
1288
        adc     edx, dword [ecx+_FILE.attr+36]
1289
.set:
1290
        mov     dword [ecx+_FILE.pos], eax
1291
        mov     dword [ecx+_FILE.pos+4], edx
1292
        and     eax, not 2047
1293
        cmp     eax, dword [ecx+_FILE.bufpos]
1294
        jnz     @f
1295
        cmp     edx, dword [ecx+_FILE.bufpos+4]
1296
        jz      .bufposok
1297
@@:
1298
        and     [ecx+_FILE.bufsize], 0
1299
        mov     dword [ecx+_FILE.bufpos], eax
1300
        mov     dword [ecx+_FILE.bufpos+4], edx
1301
.bufposok:
1302
        cmp     [ecx+_FILE.bufsize], 0
1303
        jnz     .ret
1304
        cmp     eax, dword [ecx+_FILE.fioffset]
1305
        jnz     @f
1306
        cmp     edx, dword [ecx+_FILE.fioffset+4]
1307
        jz      .ret
1308
@@:
1309
        mov     dword [ecx+_FILE.fioffset], eax
1310
        mov     dword [ecx+_FILE.fioffset+4], edx
1311
        mov     eax, [ecx+_FILE.hPlugin]
1312
        test    eax, eax
1313
        jz      @f
1314
        push    dword [ecx+_FILE.fioffset+4]
1315
        push    dword [ecx+_FILE.fioffset]
1316
        push    [ecx+_FILE.hFile]
1317
        call    [eax+PluginInfo.setpos]
1318
@@:
1319
.ret:
1320
        popad
1321
        ret     16
1322
 
1323
setpos_default:
1324
        push    dword [esp+12]
1325
        push    dword [esp+12]
1326
        push    0
1327
        push    dword [esp+16]
1328
        call    seek
1329
        ret     12
1330
 
631 diamond 1331
; __int64 __stdcall tell(HANDLE hFile);
1332
tell:
1333
        mov     eax, [esp+4]
1334
        mov     edx, dword [eax+_FILE.pos+4]
1335
        mov     eax, dword [eax+_FILE.pos]
1336
        ret     4
1337
 
589 diamond 1338
; __int64 __stdcall filesize(HANDLE hFile);
1339
filesize:
1340
        mov     eax, [esp+4]
1341
        mov     edx, dword [eax+_FILE.attr+36]
1342
        mov     eax, dword [eax+_FILE.attr+32]
1343
        ret     4
1344
 
1345
; void __stdcall close(HANDLE hFile);
1346
close:
1347
        pushad
1348
        mov     ecx, [esp+24h]
1349
        mov     eax, [ecx+_FILE.hPlugin]
1350
        test    eax, eax
1351
        jz      @f
1352
        push    ecx
1353
        push    [ecx+_FILE.hFile]
1354
        call    [eax+PluginInfo.close]
1355
        pop     ecx
1356
@@:
1357
        call    pgfree
1358
        popad
1359
        ret     4
1360
 
1361
getattr_default:
1362
        mov     eax, 2
1363
        ret     12