home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / dirutils / browser.lzh / Browser / BrowserII_Src.LZH / FileList.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-20  |  5.9 KB  |  209 lines

  1. /*
  2.  *    FileList.c - Copyright © 1991 by S.R. & P.C.
  3.  *
  4.  *    Created:    11 Apr 1991  23:16:51
  5.  *    Modified:    20 Jul 1991  12:26:18
  6.  *
  7.  *    Make>> make
  8.  */
  9.  
  10. #include "Global.h"
  11. #include "DosVar.h"
  12. #include "ActionBack.h"
  13. #include "FileList.h"
  14. #include "proto/FileList.h"
  15. #include "proto/File.h"
  16. #include "proto/Mouse.h"
  17. #include "proto/Draw.h"
  18. #include "proto/Request.h"
  19. #include "proto/ActionBack.h"
  20.  
  21. extern struct Config Config;
  22. extern struct MinList WindowList;
  23. extern char *ReqTitle;
  24.  
  25.  
  26. void DeleteDest(char *Name)
  27. {
  28.     short Ok = A_RETRY;
  29.  
  30.     while (Ok == A_RETRY && !DeleteFile(Name))
  31.         Ok = ThreeGadRequest("Retry", NULL, "Couldn't delete bad copy of \"%s\"\n%s.", Name, StrIoErr());
  32. }
  33.  
  34.  
  35. void FreeFileBuffers(struct SuperFileInfo *sfi)
  36. {
  37.     struct BufferList *BL, *Cur;
  38.  
  39.     if (sfi->FileInfo.fi_Type != DLX_FILE)
  40.         return;
  41.     BL = sfi->FileDir.File.BufferList;
  42.     while(Cur = BL) {
  43.         BL = Cur->Next;
  44.         FreeMem(Cur, Cur->Size+sizeof(struct BufferList));
  45.     }
  46.     sfi->FileDir.File.BufferList = NULL;
  47. }
  48.  
  49.  
  50. void FreeSuperFileInfo(struct SuperFileInfo *sfi1, BPTR SrcDir, BPTR DestDir)
  51. {
  52.     struct SuperFileInfo *sfi2;
  53.     struct FileInfoBlock *fib;
  54.     char *Name;
  55.     BPTR CD;
  56.  
  57.     switch(sfi1->FileInfo.fi_Type) {
  58.     case DLX_FILE:
  59.         FreeFileBuffers(sfi1);
  60.         if (sfi1->FileDir.File.FH_S)
  61.             Close(sfi1->FileDir.File.FH_S);
  62.         if (sfi1->FileDir.File.FH_D) {
  63.             Close(sfi1->FileDir.File.FH_D);
  64.             CD = CurrentDir(DestDir);
  65.             Name = sfi1->FileInfo.fi_Name;
  66.             if (TwoGadRequest(ReqTitle, "File \"%s\" wasn't completly copied\nDelete bad copy ?", Name)) {
  67.                 DeleteDest(Name);
  68.                 sfi1->ActionBack |= AB_DELETE_DEST;
  69.             }
  70.             else if (fib = AllocMem(sizeof(struct FileInfoBlock), MEMF_PUBLIC|MEMF_CLEAR)) {
  71.                 if (GetFib(Name, fib, TRUE) == A_RETRY) {
  72.                     Fib2Fi(&sfi1->FileInfo, fib);
  73.                     sfi1->ActionBack |= AB_NEW_ENTRY;
  74.                 }
  75.                 FreeMem(fib, sizeof(struct FileInfoBlock));
  76.             }
  77.             CurrentDir(CD);
  78.         }
  79.         break;
  80.     default:    /* dirs, volumes, devices and assigns */
  81.         while(sfi2 = (struct SuperFileInfo *)RemTail((struct List *)&sfi1->FileDir.Dir.SuperFileList))
  82.             FreeSuperFileInfo(sfi2, sfi1->FileDir.Dir.SrcDir, sfi1->FileDir.Dir.DestDir);
  83.         if (sfi1->FileDir.Dir.SrcDir) {
  84.             SendUpdateDir(sfi1->FileDir.Dir.SrcDir);
  85.             UnLock(sfi1->FileDir.Dir.SrcDir);
  86.         }
  87.         if (sfi1->FileDir.Dir.DestDir) {
  88.             SendUpdateDir(sfi1->FileDir.Dir.DestDir);
  89.             UnLock(sfi1->FileDir.Dir.DestDir);
  90.         }
  91.     }
  92.     SendActionBack(sfi1, SrcDir, DestDir);
  93.     CleanFileInfo(&sfi1->FileInfo);
  94.     FreeMem(sfi1, sizeof(struct SuperFileInfo));
  95. }
  96.  
  97.  
  98. void FreeBrowserDir(struct BrowserDir *bd, BPTR DestDir)
  99. {
  100.     struct SuperFileInfo *sfi;
  101.  
  102.     while(sfi = (struct SuperFileInfo *)RemHead((struct List *)&bd->SuperFileList)) {
  103.         /* if ActionBack has only one of SELECT or DESELECT flags,
  104.          * an error occured, so reselect entry */
  105.         if (sfi->ActionBack != AB_NONE && !(sfi->ActionBack & ~(AB_SELECT|AB_DESELECT)))
  106.             sfi->ActionBack = AB_SELECT;
  107.         FreeSuperFileInfo(sfi, bd->DirLock, DestDir);
  108.     }
  109.     SendUpdateDir(bd->DirLock);
  110.     /* Check both dir and root locks before unlock() because only one of them may be valid */
  111.     if (bd->DirLock)
  112.         UnLock(bd->DirLock);
  113.     if (bd->RootLock)
  114.         UnLock(bd->RootLock);
  115.     FreeMem(bd, sizeof(struct BrowserDir));
  116. }
  117.  
  118.  
  119. void FreeFileList(struct HeadFileList *hfl)
  120. {
  121.     struct BrowserDir *bd;
  122.  
  123.     while(bd = (struct BrowserDir *)RemTail((struct List *)&hfl->DirList))
  124.         FreeBrowserDir(bd, hfl->DestDir);
  125.     if (hfl->DestDir) {
  126.         SendUpdateDir(hfl->DestDir);
  127.         UnLock(hfl->DestDir);
  128.     }
  129.     if (hfl->DestRoot)
  130.         UnLock(hfl->DestRoot);
  131.     FreeMem(hfl, sizeof(struct HeadFileList));
  132. }
  133.  
  134.  
  135. struct HeadFileList *MakeSelectedList(struct BrowserWindow *ExcludeWin, BPTR DestDir, BPTR DestRoot)
  136. {
  137.     struct BrowserWindow *Win;
  138.     struct ScrollEntry *S;
  139.     struct HeadFileList *hfl;
  140.     struct BrowserDir *bd;
  141.     struct SuperFileInfo *sfi;
  142.     struct Point Position;
  143.     short i;
  144.  
  145.     if (!(hfl = AllocMem(sizeof(struct HeadFileList), MEMF_PUBLIC|MEMF_CLEAR)))
  146.         return NULL;
  147.     if (Config.Select.si_Flags & SI_AFFECT_SUBDIRS)
  148.         hfl->Select = Config.Select;    /* copy the select info for virtual select */
  149.     hfl->CopyMode = Config.CopyMode;
  150.     hfl->CopyFlags = Config.CopyFlags;
  151.     hfl->DestDir = DestDir;
  152.     hfl->DestRoot = DestRoot;
  153.     NewMinList(&hfl->DirList);
  154.  
  155.     Win = (struct BrowserWindow *)WindowList.mlh_Head;
  156.     while(Win->bw_Node.mln_Succ) {
  157.         if (Win->bw_SelectNum > 0 && Win != ExcludeWin) {
  158.             if (!(bd = AllocMem(sizeof(struct BrowserDir), MEMF_PUBLIC|MEMF_CLEAR))) {
  159.                 FreeFileList(hfl);
  160.                 return NULL;
  161.             }
  162.             AddTail((struct List *)&hfl->DirList, (struct Node *)bd);
  163.             if (Win->bw_Type == BW_DIR) {
  164.                 bd->DirLock = DupLock(Win->bw_DirLock);
  165.                 bd->RootLock = DupLock(Win->bw_RootLock);
  166.             }
  167.             NewMinList(&bd->SuperFileList);
  168.             for( i=0 ; i < Win->bw_ShownEntries ; i++ ) {
  169.                 S = Win->bw_EntryArray[i];
  170.                 if (S->se_State & STATE_SELECTED) {
  171.                     if (!(sfi = AllocMem(sizeof(struct SuperFileInfo), MEMF_PUBLIC|MEMF_CLEAR))) {
  172.                         FreeFileList(hfl);
  173.                         return NULL;
  174.                     }
  175.                     AddTail((struct List*)&bd->SuperFileList, (struct Node *)sfi);
  176.                     CopyFileInfo(&sfi->FileInfo, &S->se_FileInfo);
  177.                     sfi->ActionBack = (Config.Options & OPT_KEEPSELECTED) ? AB_SELECT : AB_DESELECT;
  178.                     /* Now, save file name because some actions create a new one (rename, duplicate,...)*/
  179.                     strcpy(sfi->OldName, sfi->FileInfo.fi_Name);
  180.                     hfl->NumEntries++;
  181.                     DoSelect(Win, S, OPT_TOGGLESELECT);        /* deselect entry */
  182.                     /* change state from SELECTED to GHOSTED */
  183.                     S->se_State = STATE_GHOSTED;
  184.                     switch(sfi->FileInfo.fi_Type) {
  185.                     case DLX_FILE:
  186.                         break;
  187.                     case DLX_DIR:
  188.                         NewMinList(&sfi->FileDir.Dir.SuperFileList);
  189.                         hfl->Dirs = TRUE;
  190.                         break;
  191.                     default:
  192.                         NewMinList(&sfi->FileDir.Dir.SuperFileList);
  193.                         hfl->Vols = TRUE;    /* same flag for Assigns, Volumes and devices */
  194.                     }
  195.                     if (GetSePosition(Win, S, &Position))
  196.                         Print(Win, S, Position.X, Position.Y);
  197.                 }
  198.             }
  199.         }
  200.         MakeBottomInfoString(Win);
  201.         RefreshBottomInfo(Win);
  202.         Win = (struct BrowserWindow *) Win->bw_Node.mln_Succ;
  203.     }
  204.     RefreshBottomInfo((struct BrowserWindow *)WindowList.mlh_Head);
  205.     return hfl;
  206. }
  207.  
  208.  
  209.