Subversion Repositories Kolibri OS

Rev

Rev 485 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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
  9.         int     0x40
  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
  105.         int     0x40
  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
  227.