Subversion Repositories Kolibri OS

Rev

Rev 474 | Rev 517 | 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
485 heavyiron 9
        mcall
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
        push    -1
33
        push    -1
34
        push    aError
35
        call    SayErr
36
        add     esp, 3*4
37
        cmp     al, -1
38
        jz      @f
39
        inc     eax
40
        cmp     al, 4   ; "cancel" button
41
        jnz     @f
42
        or      eax, -1
43
@@:
44
        cmp     al, 3   ; "skip all" button
45
        jnz     .ret
46
        mov     [del_bSkipAll], 1
47
        dec     eax
48
.ret:
49
        cmp     al, 2
50
        ret
51
 
52
delete_file:
53
; in: eax->BDFE block
54
; out: CF and ZF not set <=> cancel job ("ja cancel_label")
55
        pushad
56
        mov     [del_dir_stack_ptr], del_dir_stack
57
        lea     esi, [ebp + panel1_dir - panel1_data]
58
        mov     edi, execdata
59
@@:
60
        lodsb
61
        test    al, al
62
        jz      @f
63
        stosb
64
        jmp     @b
65
@@:
66
        mov     esi, [esp+28]
67
        mov     ecx, esi
68
        add     esi, 40
69
        mov     al, '/'
70
        stosb
71
.l1:
72
        lodsb
73
        cmp     edi, execdataend
74
        jb      @f
75
        call    panels_OnKey.bigfilename
76
        popad
77
        ret
78
@@:
79
        stosb
80
        test    al, al
81
        jnz     .l1
82
        mov     ecx, [esp+28]
83
        test    byte [ecx], 10h
84
        jnz     .delete_dir
85
.retrydel:
86
        xor     ecx, ecx
87
        call    delete_file_worker
88
        jae     @f
89
        jp      .retrydel
90
@@:
91
        popad
92
        ret
93
 
94
.delete_dir:
95
; recursive delete of directory
96
        xor     ebp, ebp        ; ebp will contain number of undeletable items
97
.return_from_recursion:
98
        mov     ebx, dirinfo
99
        mov     [ebx+dirinfo.first-dirinfo], ebp
100
        mov     [ebx+dirinfo.size-dirinfo], del_dir_query_size
101
        mov     [ebx+dirinfo.dirdata-dirinfo], del_dir_query_area
102
        mov     [ebx+dirinfo.name-dirinfo], execdata
103
        push    70
104
        pop     eax
485 heavyiron 105
        mcall
474 diamond 106
; if we get read error, the best available action is try to delete directory itself
107
        test    eax, eax
108
        jz      @f
109
        cmp     eax, 6
110
        jnz     .do_delete_dir
111
@@:
112
; loop through a directory and delete items
113
        mov     edx, del_dir_query_area+32
114
        imul    ebx, 304
115
        add     ebx, edx
116
.delete_dir_entry_loop:
117
        cmp     edx, ebx
118
        jae     .delete_dir_entry_done
119
; ignore special entries "." and ".."
120
        inc     ebp
121
        cmp     word [edx+40], '.'
122
        jz      .delete_dir_entry_continue
123
        cmp     word [edx+40], '..'
124
        jnz     @f
125
        cmp     byte [edx+42], 0
126
        jz      .delete_dir_entry_continue
127
@@:
128
        dec     ebp
129
        mov     esi, execdata
130
@@:
131
        lodsb
132
        test    al, al
133
        jnz     @b
134
        mov     byte [esi-1], '/'
135
        mov     edi, esi
136
        lea     esi, [edx+40]
137
@@:
138
        cmp     edi, execdataend
139
        jae     .fullname_big
140
        lodsb
141
        stosb
142
        test    al, al
143
        jnz     @b
144
        test    byte [edx], 10h
145
        jnz     .entry_is_folder
146
.retry2:
147
        xor     ecx, ecx
148
        call    delete_file_worker
149
        ja      .cancel
150
        jz      .skip
151
        jp      .retry2
152
        jmp     .restore_name
153
.entry_is_folder:
154
; allocate new item in directory stack
155
        mov     eax, [del_dir_stack_ptr]
156
        mov     [eax], ebp
157
        add     eax, 4
158
        mov     [del_dir_stack_ptr], eax
159
; do recursive deleting
160
        jmp     .delete_dir
161
.fullname_big:
162
; we will just ignore such files and continue - in real life this situation can not happen
163
        inc     ebp
164
        mov     esi, execdataend-1
165
        jmp     .do_restore_name
166
.skip:
167
        inc     ebp
168
.restore_name:
169
        mov     esi, execdata
170
@@:
171
        lodsb
172
        test    al, al
173
        jnz     @b
174
        dec     esi
175
        dec     esi
176
.do_restore_name:
177
        std
178
@@:
179
        lodsb
180
        cmp     al, '/'
181
        jnz     @b
182
        cld
183
        mov     byte [esi+1], 0
184
.delete_dir_entry_continue:
185
        add     edx, 304
186
        jmp     .delete_dir_entry_loop
187
.delete_dir_entry_done:
188
.do_delete_dir:
189
        mov     cl, 1
190
        call    delete_file_worker
191
        ja      .cancel
192
        jz      @f
193
        jp      .delete_dir
194
@@:
195
; al=0 - OK, al=2 - skip this directory
196
; return to previous directory
197
; pop item from directory stack
198
        mov     ecx, [del_dir_stack_ptr]
199
        cmp     ecx, del_dir_stack
200
        jbe     .done
201
        sub     ecx, 4
202
        mov     [del_dir_stack_ptr], ecx
203
        mov     ebp, [ecx]
204
        cmp     al, 2
205
        sbb     ebp, -1
206
; restore prev directory name
207
        mov     esi, execdata
208
@@:
209
        lodsb
210
        test    al, al
211
        jnz     @b
212
        dec     esi
213
        dec     esi
214
        std
215
@@:
216
        lodsb
217
        cmp     al, '/'
218
        jnz     @b
219
        cld
220
        mov     byte [esi+1], 0
221
        jmp     .return_from_recursion
222
.done:
223
.cancel:
224
        mov     [dirinfo.first], 0      ; do not destroys flags
225
        popad
226
        ret