home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / comm / term33so.lha / TransferPanel.c < prev    next >
C/C++ Source or Header  |  1993-04-30  |  16KB  |  639 lines

  1. /*
  2. **    TransferPanel.c
  3. **
  4. **    File transfer control panel support routines
  5. **
  6. **    Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. STATIC struct Gadget    *GadgetList;
  13. STATIC BYTE         LastStatus = -1;
  14. STATIC LONG         TransferInfoCount = 0;
  15.  
  16. STATIC struct IBox     TransferBox = { -1, -1, -1, -1 };
  17.  
  18. STATIC struct Gadget *
  19. CreateAllGadgets(struct TextBox **BoxArray,struct TextBox **BoxList,struct Gadget **GadgetArray,struct Gadget **GadgetList)
  20. {
  21.     struct Gadget        *Gadget;
  22.     struct NewGadget     NewGadget;
  23.     UWORD             Counter,
  24.                  BoxCounter;
  25.     struct TextBox        *Box;
  26.     LONG             TotalLines = 10;
  27.  
  28.     FOREVER
  29.     {
  30.         SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);
  31.  
  32.         *GadgetList    = NULL;
  33.         *BoxList    = NULL;
  34.  
  35.         Counter        = 0;
  36.         BoxCounter    = 0;
  37.  
  38.         memset(&NewGadget,0,sizeof(struct NewGadget));
  39.  
  40.         if(Gadget = CreateContext(GadgetList))
  41.         {
  42.             LONG Width,Left;
  43.  
  44.             SZ_AddLeftOffset(SZ_LeftOffsetDelta(MSG_TRANSFERPANEL_PROTOCOL_TXT,MSG_TRANSFERPANEL_ELAPSED_TIME_TXT));
  45.  
  46.             Width = SZ_BoxWidth(16) + INTERWIDTH + SZ_LeftOffsetDelta(MSG_TRANSFERPANEL_CHARACTERS_PER_SECOND_TXT,MSG_TRANSFERPANEL_NUMBER_OF_TIMEOUTS_TXT) + SZ_BoxWidth(16);
  47.  
  48.             if(Width > SZ_BoxWidth(50))
  49.                 SZ_SetWidth(Width);
  50.             else
  51.                 SZ_SetWidth(SZ_BoxWidth(50));
  52.  
  53.             BoxArray[BoxCounter++] = Box = SZ_CreateTextBox(BoxList,
  54.                 SZ_Lines,    1,
  55.                 SZ_AutoWidth,    TRUE,
  56.             TAG_DONE);
  57.  
  58.             SZ_SetBoxTitles(Box,LocaleString(MSG_TRANSFERPANEL_PROTOCOL_TXT),NULL);
  59.  
  60.             NewGadget . ng_GadgetText    = LocaleString(MSG_TRANSFERPANEL_INFORMATION_GAD);
  61.             NewGadget . ng_GadgetID        = Counter;
  62.             NewGadget . ng_Flags        = PLACETEXT_LEFT;
  63.  
  64.             GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
  65.                 SZ_Adjust,    TRUE,
  66.                 SZ_AutoWidth,    TRUE,
  67.                 SZ_Lines,    TotalLines,
  68.  
  69.                 GTLV_ReadOnly,    TRUE,
  70.             TAG_DONE);
  71.  
  72.             BoxArray[BoxCounter++] = Box = SZ_CreateTextBox(BoxList,
  73.                 SZ_Lines,    3,
  74.                 SZ_AutoWidth,    TRUE,
  75.             TAG_DONE);
  76.  
  77.             SZ_SetBoxTitles(Box,LocaleString(MSG_TRANSFERPANEL_FILE_TXT),LocaleString(MSG_TRANSFERPANEL_NEXT_FILE_TXT),LocaleString(MSG_TRANSFERPANEL_SPACE_LEFT_TXT),NULL);
  78.  
  79.             BoxArray[BoxCounter++] = Box = SZ_CreateTextBox(BoxList,
  80.                 SZ_Lines,    6,
  81.                 SZ_Chars,    16,
  82.                 SZ_SaveY,    TRUE,
  83.             TAG_DONE);
  84.  
  85.             SZ_SetBoxTitles(Box,LocaleString(MSG_TRANSFERPANEL_FILE_SIZE_TXT),LocaleString(MSG_TRANSFERPANEL_FILE_SIZE_TRANSFERRED_TXT),LocaleString(MSG_TRANSFERPANEL_TOTAL_SIZE_TXT),LocaleString(MSG_TRANSFERPANEL_TOTAL_SIZE_TRANSFERRED_TXT),LocaleString(MSG_TRANSFERPANEL_FILES_TRANSFERRED_TXT),LocaleString(MSG_TRANSFERPANEL_BLOCKS_TRANSFERRED_TXT),NULL);
  86.  
  87.             Left = SZ_GetLeftEdge();
  88.  
  89.             BoxArray[BoxCounter++] = Box = SZ_CreateTextBox(BoxList,
  90.                 SZ_Lines,    6,
  91.                 SZ_Chars,    16,
  92.                 SZ_AlignRight,    TRUE,
  93.             TAG_DONE);
  94.  
  95.             SZ_SetBoxTitles(Box,LocaleString(MSG_TRANSFERPANEL_CHARACTERS_PER_SECOND_TXT),LocaleString(MSG_TRANSFERPANEL_CHARACTER_DELAY_TXT),LocaleString(MSG_TRANSFERPANEL_PACKET_DELAY_TXT),LocaleString(MSG_TRANSFERPANEL_PACKET_TYPE_TXT),LocaleString(MSG_TRANSFERPANEL_BLOCK_CHECK_TYPE_TXT),LocaleString(MSG_TRANSFERPANEL_BLOCK_SIZE_TXT),NULL);
  96.  
  97.             BoxArray[BoxCounter++] = Box = SZ_CreateTextBox(BoxList,
  98.                 SZ_Lines,    2,
  99.                 SZ_Chars,    16,
  100.                 SZ_UseLeft,    Left,
  101.                 SZ_AlignBottom,    TRUE,
  102.                 SZ_SaveY,    TRUE,
  103.             TAG_DONE);
  104.  
  105.             SZ_SetBoxTitles(Box,LocaleString(MSG_TRANSFERPANEL_ESTIMATED_TIME_TXT),LocaleString(MSG_TRANSFERPANEL_ELAPSED_TIME_TXT),NULL);
  106.  
  107.             BoxArray[BoxCounter] = Box = SZ_CreateTextBox(BoxList,
  108.                 SZ_Lines,    2,
  109.                 SZ_Chars,    16,
  110.                 SZ_AlignRight,    TRUE,
  111.             TAG_DONE);
  112.  
  113.             SZ_SetBoxTitles(Box,LocaleString(MSG_TRANSFERPANEL_NUMBER_OF_ERRORS_TXT),LocaleString(MSG_TRANSFERPANEL_NUMBER_OF_TIMEOUTS_TXT),NULL);
  114.  
  115.             SZ_SetWidth((SZ_GetWindowWidth() - 3 * InterWidth) / 2);
  116.  
  117.             NewGadget . ng_GadgetText    = LocaleString(MSG_TRANSFERPANEL_DATA_TRANSFERRED_GAD);
  118.             NewGadget . ng_GadgetID        = Counter;
  119.             NewGadget . ng_Flags        = PLACETEXT_ABOVE;
  120.  
  121.             GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
  122.                 SZ_Adjust,    TRUE,
  123.                 SZ_AutoWidth,    TRUE,
  124.                 SZ_AlignLeft,    TRUE,
  125.                 SZ_AlignBottom,    TRUE,
  126.  
  127.                 GTTX_Border,    TRUE,
  128.             TAG_DONE);
  129.  
  130.             NewGadget . ng_GadgetText    = LocaleString(MSG_TRANSFERPANEL_TIME_TO_GO_GAD);
  131.             NewGadget . ng_GadgetID        = Counter;
  132.  
  133.             GadgetArray[Counter++] = Gadget = CreateGadget(TEXT_KIND,Gadget,&NewGadget,
  134.                 SZ_Adjust,    TRUE,
  135.                 SZ_AutoWidth,    TRUE,
  136.                 SZ_AlignRight,    TRUE,
  137.                 SZ_UseTop,    SZ_GetTopEdge(),
  138.  
  139.                 GTTX_Border,    TRUE,
  140.             TAG_DONE);
  141.  
  142.             NewGadget . ng_GadgetText    = LocaleString(MSG_TRANSFERPANEL_ABORT_ENTIRE_TRANSFER_GAD);
  143.             NewGadget . ng_GadgetID        = Counter;
  144.             NewGadget . ng_Flags        = 0;
  145.  
  146.             GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  147.                 SZ_AlignExtra,    TRUE,
  148.                 SZ_Adjust,    TRUE,
  149.                 SZ_AutoWidth,    TRUE,
  150.                 SZ_AlignLeft,    TRUE,
  151.                 SZ_AlignBottom,    TRUE,
  152.             TAG_DONE);
  153.  
  154.             NewGadget . ng_GadgetText    = LocaleString(MSG_TRANSFERPANEL_SKIP_CURRENT_FILE_GAD);
  155.             NewGadget . ng_GadgetID        = Counter;
  156.  
  157.             GadgetArray[Counter] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  158.                 SZ_Adjust,    TRUE,
  159.                 SZ_AutoWidth,    TRUE,
  160.                 SZ_AlignRight,    TRUE,
  161.             TAG_DONE);
  162.         }
  163.         else
  164.             return(Gadget);
  165.  
  166.         if(SZ_GetWindowHeight() > Window -> Height - (Window -> BorderTop + Window -> BorderBottom) && TotalLines > 2)
  167.         {
  168.             TotalLines--;
  169.  
  170.             if(*GadgetList)
  171.             {
  172.                 FreeGadgets(*GadgetList);
  173.  
  174.                 *GadgetList = NULL;
  175.             }
  176.  
  177.             if(*BoxList)
  178.             {
  179.                 SZ_FreeBoxes(*BoxList);
  180.  
  181.                 *BoxList = NULL;
  182.             }
  183.  
  184.             SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);
  185.         }
  186.         else
  187.             return(Gadget);
  188.     }
  189. }
  190.  
  191.     /* GhostStats(struct Gadget *Gadget):
  192.      *
  193.      *    Ghost the percentage bars.
  194.      */
  195.  
  196. VOID
  197. GhostStats(struct Gadget *Gadget)
  198. {
  199.     struct RastPort    *RPort = TransferWindow -> RPort;
  200.     UBYTE         FgPen = ReadAPen(RPort);
  201.  
  202.     SetAPen(RPort,DrawInfo -> dri_Pens[SHADOWPEN]);
  203.  
  204.     SetAfPt(RPort,(UWORD *)&Crosshatch,1);
  205.  
  206.     RectFill(RPort,Gadget -> LeftEdge + 2,Gadget -> TopEdge + 1,Gadget -> LeftEdge + Gadget -> Width - 3,Gadget -> TopEdge + Gadget -> Height - 2);
  207.  
  208.     SetAPen(RPort,FgPen);
  209.  
  210.     SetAfPt(RPort,NULL,0);
  211. }
  212.  
  213.     /* ShowStats(struct Gadget *Gadget,LONG Value,LONG Max):
  214.      *
  215.      *    Show the percentage bars.
  216.      */
  217.  
  218. VOID
  219. ShowStats(struct Gadget *Gadget,LONG Value,LONG Max)
  220. {
  221.     if(TransferWindow)
  222.     {
  223.         struct RastPort    *RPort = TransferWindow -> RPort;
  224.         LONG         MaxWidth = Gadget -> Width - 4,Width;
  225.  
  226.         if(Max < 1)
  227.             Max = 0;
  228.  
  229.         if(Value > Max)
  230.             Value = Max;
  231.  
  232.         if((Width = (MaxWidth * Value) / Max) > 0)
  233.         {
  234.             UBYTE FgPen = ReadAPen(RPort);
  235.  
  236.             if(Width != MaxWidth)
  237.             {
  238.                 SetAPen(RPort,0);
  239.  
  240.                 RectFill(RPort,Gadget -> LeftEdge + 2 + Width - 1,Gadget -> TopEdge + 1,Gadget -> LeftEdge + Gadget -> Width - 3,Gadget -> TopEdge + Gadget -> Height - 2);
  241.             }
  242.  
  243.             SetAPen(RPort,DrawInfo -> dri_Pens[FILLPEN]);
  244.  
  245.             RectFill(RPort,Gadget -> LeftEdge + 2,Gadget -> TopEdge + 1,Gadget -> LeftEdge + Width + 1,Gadget -> TopEdge + Gadget -> Height - 2);
  246.  
  247.             SetAPen(RPort,FgPen);
  248.         }
  249.         else
  250.         {
  251.             UBYTE FgPen = ReadAPen(RPort);
  252.  
  253.             SetAPen(RPort,0);
  254.  
  255.             RectFill(RPort,Gadget -> LeftEdge + 2,Gadget -> TopEdge + 1,Gadget -> LeftEdge + Gadget -> Width - 3,Gadget -> TopEdge + Gadget -> Height - 2);
  256.  
  257.             SetAPen(RPort,FgPen);
  258.         }
  259.     }
  260. }
  261.  
  262.     /* ShowString(struct Gadget *Gadget,STRPTR String,...):
  263.      *
  264.      *    Display percentage information.
  265.      */
  266.  
  267. VOID __stdargs
  268. ShowString(struct Gadget *Gadget,STRPTR String,...)
  269. {
  270.     if(TransferWindow)
  271.     {
  272.         va_list         VarArgs;
  273.         WORD         Len;
  274.         UWORD         Width;
  275.         struct RastPort    *RPort;
  276.         LONG         FgPen,DrawMode;
  277.         struct TextFont    *Font;
  278.  
  279.         RPort        = TransferWindow -> RPort;
  280.         FgPen        = ReadAPen(RPort),
  281.         DrawMode    = ReadDrMd(RPort);
  282.         Font        = RPort -> Font;
  283.  
  284.         if(Font != UserTextFont);
  285.             SetFont(RPort,UserTextFont);
  286.  
  287.         va_start(VarArgs,String);
  288.         VSPrintf(SharedBuffer,String,VarArgs);
  289.         va_end(VarArgs);
  290.  
  291.         Len    = strlen(SharedBuffer);
  292.         Width    = TextLength(RPort,SharedBuffer,Len);
  293.  
  294.         Move(RPort,Gadget -> LeftEdge + 2 + (Gadget -> Width - 4 - Width) / 2,Gadget -> TopEdge + 1 + (Gadget -> Height - 2 - UserFontHeight) / 2 + UserFontBase);
  295.  
  296.         SetAPen(RPort,DrawInfo -> dri_Pens[HIGHLIGHTTEXTPEN]);
  297.  
  298.         if(DrawInfo -> dri_Pens[FILLPEN] == DrawInfo -> dri_Pens[HIGHLIGHTTEXTPEN])
  299.             SetDrMd(RPort,JAM1 | COMPLEMENT);
  300.         else
  301.             SetDrMd(RPort,JAM1);
  302.  
  303.         Text(RPort,SharedBuffer,Len);
  304.  
  305.         SetAPen(RPort,FgPen);
  306.         SetDrMd(RPort,DrawMode);
  307.  
  308.         if(Font != UserTextFont);
  309.             SetFont(RPort,Font);
  310.     }
  311. }
  312.  
  313.     /* AddTransferInfo(STRPTR Message,...):
  314.      *
  315.      *    Add another entry to the transfer information list.
  316.      */
  317.  
  318. VOID __stdargs
  319. AddTransferInfo(STRPTR Message,...)
  320. {
  321.     STATIC UBYTE TempBuffer[256];
  322.  
  323.     struct Node    *Node;
  324.     va_list         VarArgs;
  325.  
  326.     va_start(VarArgs,Message);
  327.     VSPrintf(TempBuffer,Message,VarArgs);
  328.     va_end(VarArgs);
  329.  
  330.     if(Node = AllocVec(sizeof(struct Node) + strlen(TempBuffer) + 1,MEMF_ANY | MEMF_CLEAR))
  331.     {
  332.         Node -> ln_Name = (STRPTR)(Node + 1);
  333.  
  334.         strcpy(Node -> ln_Name,TempBuffer);
  335.  
  336.         GT_SetGadgetAttrs(TransferGadgetArray[GAD_TRANSFER_INFORMATION_LIST],TransferWindow,NULL,
  337.             GTLV_Labels,        ~0,
  338.         TAG_DONE);
  339.  
  340.         AddTail(&TransferInfoList,Node);
  341.  
  342.         GT_SetGadgetAttrs(TransferGadgetArray[GAD_TRANSFER_INFORMATION_LIST],TransferWindow,NULL,
  343.             GTLV_Labels,        &TransferInfoList,
  344.             GTLV_Top,        TransferInfoCount,
  345.             GTLV_MakeVisible,    TransferInfoCount,
  346.         TAG_DONE);
  347.  
  348.         TransferInfoCount++;
  349.     }
  350. }
  351.  
  352.     /* RefreshTransferWindow():
  353.      *
  354.      *    Refresh the entire transfer window.
  355.      */
  356.  
  357. VOID
  358. RefreshTransferWindow()
  359. {
  360.     SZ_DrawBoxes(TransferWindow -> RPort,TransferBoxList);
  361.  
  362.     GT_RefreshWindow(TransferWindow,NULL);
  363.  
  364.     GhostStats(TransferGadgetArray[GAD_TRANSFER_PERCENT]);
  365.     GhostStats(TransferGadgetArray[GAD_TRANSFER_TIME]);
  366. }
  367.  
  368.     /* TransferPanel(STRPTR Title):
  369.      *
  370.      *    Open the transfer window.
  371.      */
  372.  
  373. BYTE
  374. TransferPanel(STRPTR Title)
  375. {
  376.     if(TransferWindow)
  377.         return(TRUE);
  378.     else
  379.     {
  380.         TransferFailed = TransferAborted = FALSE;
  381.  
  382.         if(Status != STATUS_DOWNLOAD && Status != STATUS_UPLOAD)
  383.         {
  384.             LastStatus = Status;
  385.  
  386.             Status = STATUS_DOWNLOAD;
  387.         }
  388.         else
  389.             LastStatus = -1;
  390.  
  391.         if(CreateAllGadgets(TransferBoxArray,&TransferBoxList,TransferGadgetArray,&GadgetList))
  392.         {
  393.             TransferBox . Width    = SZ_GetWindowWidth();
  394.             TransferBox . Height    = Window -> WScreen -> WBorTop + Window -> WScreen -> Font -> ta_YSize + 1;
  395.  
  396.             TransferBox . Left    = GetScreenLeft(Window) + (GetScreenWidth(Window) - SZ_GetWindowWidth()) / 2;
  397.             TransferBox . Top    = GetScreenTop(Window) + (GetScreenHeight(Window) - SZ_GetWindowHeight()) / 2;
  398.  
  399.             if(TransferWindow = OpenWindowTags(NULL,
  400.                 WA_Left,        TransferBox . Left,
  401.                 WA_Top,            TransferBox . Top,
  402.                 WA_Width,        SZ_GetWindowWidth(),
  403.                 WA_Height,        SZ_GetWindowHeight(),
  404.  
  405.                 WA_DragBar,        TRUE,
  406.                 WA_DepthGadget,        TRUE,
  407.                 WA_CloseGadget,        TRUE,
  408.                 WA_RMBTrap,        TRUE,
  409.                 WA_NoCareRefresh,    TRUE,
  410.                 WA_SmartRefresh,    TRUE,
  411.                 WA_Zoom,        &TransferBox,
  412.  
  413.                 WA_CustomScreen,    Window -> WScreen,
  414.  
  415.                 WA_IDCMP,        IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | IDCMP_VANILLAKEY | IDCMP_NEWSIZE | BUTTONIDCMP | LISTVIEWIDCMP | TEXTIDCMP,
  416.  
  417.                 WA_Title,        Title,
  418.             TAG_DONE))
  419.             {
  420.                 ULONG    IntuiLock = LockIBase(NULL);
  421.                 BYTE    Activate,Move;
  422.  
  423.                 GuideContext(CONTEXT_TRANSFER);
  424.  
  425.                 if(Config -> TerminalConfig -> AlertMode == ALERT_SCREEN || Config -> TerminalConfig -> AlertMode == ALERT_BEEP_SCREEN)
  426.                     Move = Activate = TRUE;
  427.                 else
  428.                 {
  429.                     if(IntuitionBase -> ActiveScreen == TransferWindow -> WScreen)
  430.                         Activate = TRUE;
  431.                     else
  432.                         Activate = FALSE;
  433.                 }
  434.  
  435.                 UnlockIBase(IntuiLock);
  436.  
  437.                 if(Move)
  438.                 {
  439.                     if(TransferWindow -> WScreen -> LeftEdge > 0)
  440.                     {
  441.                         if(TransferWindow -> WScreen -> TopEdge > 0)
  442.                             MoveScreen(TransferWindow -> WScreen,-TransferWindow -> WScreen -> LeftEdge,-TransferWindow -> WScreen -> TopEdge);
  443.                         else
  444.                             MoveScreen(TransferWindow -> WScreen,-TransferWindow -> WScreen -> LeftEdge,0);
  445.                     }
  446.                     else
  447.                     {
  448.                         if(TransferWindow -> WScreen -> TopEdge > 0)
  449.                             MoveScreen(TransferWindow -> WScreen,0,-TransferWindow -> WScreen -> TopEdge);
  450.                     }
  451.  
  452.                     WindowToFront(TransferWindow);
  453.  
  454.                     ScreenToFront(TransferWindow -> WScreen);
  455.                 }
  456.  
  457.                 if(Activate)
  458.                     ActivateWindow(TransferWindow);
  459.  
  460.                 PushWindow(TransferWindow);
  461.  
  462.                 AddGList(TransferWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  463.                 RefreshGList(GadgetList,TransferWindow,NULL,(UWORD)-1);
  464.  
  465.                 RefreshTransferWindow();
  466.  
  467.                     /* Protocol */
  468.  
  469.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_1],        0,LocaleString(MSG_GLOBAL_UNKNOWN_TXT));
  470.  
  471.                     /* File, Next file, Space left */
  472.  
  473.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_2],        0,"-");
  474.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_2],        1,"-");
  475.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_2],        2,"-");
  476.  
  477.                     /* File size, Transferred, Total size, Transferred, Files transferred, Blocks transferred */
  478.  
  479.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_LEFT1],    0,"-");
  480.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_LEFT1],    1,"-");
  481.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_LEFT1],    2,"-");
  482.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_LEFT1],    3,"-");
  483.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_LEFT1],    4,"-");
  484.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_LEFT1],    5,"-");
  485.  
  486.                     /* Characters per second, Character delay, Packet delay, Packet type, Block check type, Block size */
  487.  
  488.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_RIGHT1],    0,"-");
  489.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_RIGHT1],    1,"-");
  490.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_RIGHT1],    2,"-");
  491.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_RIGHT1],    3,"-");
  492.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_RIGHT1],    4,"-");
  493.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_RIGHT1],    5,"-");
  494.  
  495.                     /* Estimated time, Elapsed time. */
  496.  
  497.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_LEFT2],    0,"-");
  498.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_LEFT2],    1,"-");
  499.  
  500.                     /* Number of errors, Number of timeouts. */
  501.  
  502.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_RIGHT2],    0,"-");
  503.                 SZ_PrintLine(TransferWindow -> RPort,TransferBoxArray[BOX_TRANSFER_RIGHT2],    1,"-");
  504.  
  505.                 return(TRUE);
  506.             }
  507.         }
  508.  
  509.         return(FALSE);
  510.     }
  511. }
  512.  
  513.     /* DeleteTransferPanel(BYTE WaitForPrompt):
  514.      *
  515.      *    Close the transfer window.
  516.      */
  517.  
  518. VOID
  519. DeleteTransferPanel(BYTE WaitForPrompt)
  520. {
  521.         /* Wait for user to close the window? */
  522.  
  523.     if(WaitForPrompt && TransferWindow && GadgetList)
  524.     {
  525.         struct IntuiMessage    *Message;
  526.         ULONG             IClass,
  527.                      ICode;
  528.         struct Gadget        *IGadget;
  529.         BYTE             Done = FALSE;
  530.  
  531.         GT_SetGadgetAttrs(TransferGadgetArray[GAD_TRANSFER_SKIP],TransferWindow,NULL,
  532.             GA_Disabled,    TRUE,
  533.         TAG_DONE);
  534.  
  535.         do
  536.         {
  537.             WaitPort(TransferWindow -> UserPort);
  538.  
  539.             while(Message = GT_GetIMsg(TransferWindow -> UserPort))
  540.             {
  541.                 IClass    = Message -> Class;
  542.                 ICode    = Message -> Code;
  543.                 IGadget    = Message -> IAddress;
  544.  
  545.                 GT_ReplyIMsg(Message);
  546.  
  547.                 KeySelect(TransferGadgetArray,4,ICode,TransferWindow,&IGadget,&IClass,&ICode);
  548.  
  549.                 switch(IClass)
  550.                 {
  551.                     case IDCMP_NEWSIZE:
  552.  
  553.                         if(!(TransferWindow -> Flags & WFLG_ZOOMED))
  554.                             RefreshTransferWindow();
  555.  
  556.                         break;
  557.  
  558.                     case IDCMP_CLOSEWINDOW:
  559.  
  560.                         Done = TRUE;
  561.  
  562.                         break;
  563.  
  564.                     case IDCMP_VANILLAKEY:
  565.  
  566.                         if(ICode == ESC)
  567.                             Done = TRUE;
  568.  
  569.                         break;
  570.  
  571.                     case IDCMP_GADGETUP:
  572.  
  573.                         if(IGadget -> GadgetID == GAD_TRANSFER_ABORT)
  574.                             Done = TRUE;
  575.  
  576.                         break;
  577.                 }
  578.             }
  579.         }
  580.         while(!Done);
  581.     }
  582.  
  583.     TransferError = FALSE;
  584.  
  585.     if(FileTransferInfo)
  586.     {
  587.         FreeFileTransferInfo(FileTransferInfo);
  588.  
  589.         FileTransferInfo = NULL;
  590.     }
  591.  
  592.     if(LastStatus != -1)
  593.         Status = LastStatus;
  594.  
  595.     LastStatus = -1;
  596.  
  597.     if(TransferWindow)
  598.     {
  599.         PopWindow();
  600.  
  601.         CloseWindow(TransferWindow);
  602.  
  603.         TransferWindow = NULL;
  604.     }
  605.  
  606.     if(GadgetList)
  607.     {
  608.         FreeGadgets(GadgetList);
  609.  
  610.         GadgetList = NULL;
  611.     }
  612.  
  613.     if(TransferBoxList)
  614.     {
  615.         SZ_FreeBoxes(TransferBoxList);
  616.  
  617.         TransferBoxList = NULL;
  618.     }
  619.  
  620.     if(TransferInfoList . lh_Head -> ln_Succ)
  621.     {
  622.         struct Node    *Node = TransferInfoList . lh_Head,
  623.                 *NextNode;
  624.  
  625.         while(NextNode = Node -> ln_Succ)
  626.         {
  627.             Remove(Node);
  628.  
  629.             FreeVec(Node);
  630.  
  631.             Node = NextNode;
  632.         }
  633.  
  634.         TransferInfoCount = 0;
  635.     }
  636.  
  637.     ReleaseWindows();
  638. }
  639.