Subversion Repositories Kolibri OS

Rev

Rev 631 | Rev 8960 | 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</