home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / ckc190.tar.gz / ckc190.tar / ckmscr.c < prev    next >
C/C++ Source or Header  |  1994-08-19  |  14KB  |  493 lines

  1. /*
  2.  * File ckmscr.c
  3.  *
  4.  * Mac Kermit file transfer display.
  5.  *
  6.  * Original by: Bill Schilit, May 1984
  7.  * Modified by many others since then.
  8.  */
  9. /*
  10.   Copyright (C) 1984, 1994, Trustees of Columbia University in the City of New
  11.   York.  The C-Kermit software may not be, in whole or in part, licensed or
  12.   sold for profit as a software product itself, nor may it be included in or
  13.   distributed with commercial products or otherwise distributed by commercial
  14.   concerns to their clients or customers without written permission of the
  15.   Office of Kermit Development and Distribution, Columbia University.  This
  16.   copyright notice must not be removed, altered, or obscured.
  17. */
  18. #include "ckcdeb.h"
  19. #include "ckcker.h"
  20.  
  21. #include "ckmdef.h"        /* General Mac defs */
  22. #include "ckmres.h"                        /* Mac resource equates */
  23. #include "ckmptp.h"                        /* ckm* Prototypes */
  24.  
  25. int scrpkt, scrnak;                        /* NAK, packet counts */
  26. long scrck;                                /* char (K) count */
  27. int scrpacln, scrcksum, scrwslots, scrbufnum; /* pkt len, checksum, win size */
  28. long scrfsize, scrffc;
  29. DialogPtr scrdlg = (DialogPtr) NULL;    /* screen's dialog */
  30.  
  31. extern char filnam[];
  32. extern int what, binary;
  33.  
  34. void update_scr_therm();
  35. static pascal void draw_screen_xfr_therm (WindowPtr win, short itemno);
  36. static char cwdbuf[81];
  37.  
  38. /****************************************************************************/
  39. /* scrcreate - create the status display.  Called when a protocol
  40.  *               menu item is selected and a display is desired (I don't
  41.  *               think you'd want to see this for REMOTE command).
  42.  *
  43.  */
  44. /****************************************************************************/
  45. scrcreate() {
  46.     Rect itemr;
  47.     short itype;
  48.     Handle itemhdl;
  49.  
  50.     if (scrdlg != NULL)
  51.     printerr ("scrcreate with active screen!", 0);
  52.  
  53.     scrdlg = GetNewDialog (SCRBOXID, NILPTR, (WindowPtr) -1);
  54.     scrck = -1;
  55.     scrnak = scrpkt = 0;
  56.     scrpacln = scrcksum = 0;
  57.     scrwslots = scrbufnum = -1;
  58.     scrfsize = scrffc = 0;
  59.     ffc = 0;
  60.     
  61.     SetStrText (SRES_PTTXT,
  62.                 "\pEmergency exit: hold down \021 and type a period.",
  63.                 scrdlg);                /* yes, so set the text */
  64.  
  65.     SetStrText (SRES_BTEXT, "\p", scrdlg);
  66.     strcpy(cwdbuf,"Current Directory: ");
  67.     strncat(cwdbuf,zgtdir(),60);
  68.     c2pstr(cwdbuf);
  69.     SetStrText (SRES_BTEXT, cwdbuf, scrdlg);
  70.     debug(F101,"scrcreate what","",what);
  71.     debug(F101,"scrcreate protocmd","",protocmd);
  72.  
  73.     switch (what) {                        /* What are we doing? */
  74.       case W_SEND:
  75.         SetStrText (SRES_DIR,"\p   Sending",scrdlg);
  76.         break;
  77.       case W_REMO:
  78.       case W_RECV:
  79.         if (protocmd == SERV_REMO)
  80.           SetStrText (SRES_DIR,"\p   Server",scrdlg);          
  81.         else
  82.           SetStrText (SRES_DIR,"\pReceiving",scrdlg);
  83.         break;
  84.       default:
  85.         SetStrText (SRES_DIR,
  86.                     (protocmd == SEND_REMO) ? "\p   Sending" : "\pReceiving",
  87.                     scrdlg);
  88.         break;
  89.     }
  90.     GetDItem (scrdlg, SRES_THERM, &itype, &itemhdl, &itemr);
  91.     SetDItem (scrdlg, SRES_THERM, itype,
  92.               (Handle) draw_screen_xfr_therm,
  93.               &itemr);
  94.     update_scr_therm();
  95.  
  96.     miniparser (TRUE);                    /* keep things moving */
  97. } /* scrcreate */
  98.  
  99.  
  100. /****************************************************************************/
  101. /* scrdispose - called to finish up the status display, on a
  102.  *                  transaction complete screen() call.
  103.  */
  104. /****************************************************************************/
  105. void
  106. scrdispose (Boolean wait) {
  107.     EventRecord dummyEvt;
  108.  
  109.     if (scrdlg == NULL)
  110.       printerr ("scrdispose called with no screen active!", 0);
  111.  
  112.     SysBeep (3);
  113.  
  114.     if (wait) {            /* deactivate buttons */
  115.         HiliteControl (getctlhdl (SRES_CANF, scrdlg), 255);
  116.         HiliteControl (getctlhdl (SRES_CANG, scrdlg), 255);
  117.  
  118.         if (tlevel < 0)    {    /* if no takefile running */
  119.             SetStrText (SRES_PTTXT,
  120.                         "\pType a key or click the mouse to continue.",
  121.                         scrdlg);        /* yes, so set the text */
  122.         /* wait for mouse or key down and discard the event when it happens */
  123.  
  124.             while (!GetNextEvent (keyDownMask + mDownMask, &dummyEvt))
  125.               /* do nothing */ ;
  126.         }
  127.     } else {
  128.         SetStrText (SRES_PTTXT, "\pNormal cleanupè",  scrdlg);
  129.     }
  130.     DisposDialog (scrdlg);
  131.     scrdlg = NULL;
  132. } /* scrdispose */
  133.  
  134. void
  135. update_scr_therm() {
  136.     GrafPtr savePort;
  137.     
  138.     GetPort (&savePort);                /* there just has to be a better way */
  139.     SetPort (scrdlg);
  140.     draw_screen_xfr_therm (scrdlg, SRES_THERM);
  141.     SetPort (savePort);
  142. }
  143.  
  144. static pascal void
  145. draw_screen_xfr_therm (WindowPtr win, short itemno) {
  146. #pragma unused (win)
  147.     Rect r, itemr;
  148.     short itype;
  149.     Handle itemhdl;
  150.     PenState oldpenstate;
  151.  
  152.     if (itemno != SRES_THERM)            /* Shouldn't ever happen */
  153.       return;
  154.  
  155.     GetPenState(&oldpenstate);            /* save so we can fuss with */
  156.     PenNormal();
  157.     
  158.     GetDItem (scrdlg, itemno, &itype, &itemhdl, &itemr);
  159.     
  160.     /* EraseRect(&itemr); */
  161.  
  162.     if (fsize <= 0L) {
  163.  
  164.         /* Frame the thermometer in gray */
  165.         PenPat(qd.gray);
  166.         PenSize (2, 2);
  167.         FrameRect(&itemr);
  168.         InsetRect(&itemr, 2, 2);
  169.         EraseRect(&itemr);
  170.     
  171.     } else {
  172.  
  173.         /* Frame the thermometer */
  174.         PenSize (2, 2);
  175.         FrameRect(&itemr);
  176.  
  177.         InsetRect(&itemr, 2, 2);
  178.         PenPat (qd.white);
  179.         FrameRect(&itemr);
  180.         InsetRect(&itemr, 2, 2);
  181.         
  182.     /*
  183.      * We want to fill first (ffc / fsize) of (itemr.right - itemr.left) 
  184.      * with black, and the rest with gray.
  185.      */
  186.     
  187.         r.top = itemr.top;
  188.         r.bottom = itemr.bottom;
  189.         r.left = itemr.left;
  190.         r.right = itemr.left
  191.           + (((long) (itemr.right - itemr.left) * (long) ffc) / (long) fsize);
  192.         if (r.right > itemr.right)        /* reality check */
  193.           r.right = itemr.right;
  194.     
  195.         if (r.left < r.right)            /* has any been transfered? */
  196.           FillRect (&r, qd.dkGray);
  197.     
  198.         if (r.right < itemr.right) {    /* any left to transfer? */
  199.             r.left = r.right;
  200.             r.right = itemr.right;
  201.             FillRect (&r, qd.ltGray);
  202.         }
  203.     }
  204.     
  205.     scrfsize = fsize;
  206.     scrffc = ffc;
  207.     
  208.     SetPenState(&oldpenstate);            /* restore old pen state */
  209. }
  210.  
  211. /* ststrings - translation of SCR_ST subfunctions to descriptive text */
  212.  
  213. char *ststrings[] = {
  214.     ": Transferred OK",        /* ST_OK */
  215.     ": Discarded",        /* ST_DISC */
  216.     ": Interrupted",        /* ST_INT */
  217.     ": Skipped ",        /* ST_SKIP */
  218.     ": Fatal error"        /* ST_ERR */
  219. };
  220.  
  221. /* scrtosresnum - table to translate from SCR_XXX values into resource
  222.  *                     item numbers.  Entries we aren't interested in are
  223.  *                  set to SRES_UNDEF.
  224.  */
  225.  
  226. int scrtoresnum[] = {
  227.     SRES_UNDEF,            /* 0 - nothing */
  228.     SRES_FILN,            /* SCR_FN - filename */
  229.     SRES_AFILN,            /* SCR_AN - as filename */
  230.     SRES_UNDEF,            /* SCR_FS - file size */
  231.     SRES_UNDEF,            /* SCR_XD - x-packet data */
  232.     SRES_PTEXT,            /* SCR_ST - status (goes in prev. text area) */
  233.     SRES_UNDEF,            /* SCR_PN - packet number */
  234.     SRES_UNDEF,            /* SCR_PT - packet type (special) */
  235.     SRES_BTEXT,            /* SCR_TC - transaction complete */
  236.     SRES_ITEXT,            /* SCR_EM - error msg (does alert) */
  237.     SRES_ITEXT,            /* SCR_WM - warning message */
  238.     SRES_BTEXT,            /* SCR_TU - arb text */
  239.     SRES_BTEXT,            /* SCR_TN - arb text */
  240.     SRES_BTEXT,            /* SCR_TZ - arb text */
  241.     SRES_BTEXT,            /* SCR_QE - arb text */
  242.     SRES_ITEXT            /* SCR_DT - date text */
  243. };
  244.  
  245. /****************************************************************************/
  246. /* screen - display status information on the screen during protocol.
  247.  *            Here we just set the items in their StatText dialog boxes,
  248.  *            updates occur through the miniparser, which we are nice
  249.  *            enough to call here to handle things.
  250.  */
  251. /****************************************************************************/
  252. _PROTOTYP( VOID screen, (int, char, long, char *) );
  253.  
  254. VOID
  255. screen (int f, char c, long n, char *s) {
  256. /* s is a C string (not a Pascal Str255) */
  257.     int rnum;
  258.     long i;
  259.     char buf[256];
  260.     extern int spktl, rln, bctu, wslots;
  261.     static char last_st = ST_OK;
  262.     static char got_err = 0; /* becomes true if we get an error message */
  263.  
  264.     if (scrdlg == NULL)        /* not using? */
  265.       return;
  266.  
  267.     miniparser (TRUE);        /* keep the mac going */
  268.  
  269.     if (quiet)            /* Silent?  Then just do miniparser(). */
  270.       return;
  271.  
  272. #ifdef COMMENT
  273.     if (f == SCR_EM) {                    /* error message? */
  274.         printerr (s, 0);                /* display it */
  275.         return;                            /* and return */
  276.     }
  277. #endif
  278.  
  279.     /*
  280.      * This is a really ugly hack (which *I* didn't create), but...
  281.      * If we are seeing the name of an incoming file, then call
  282.      * dorecvdialog() to give the user a possible chance (if they
  283.      * have asked for interactive recieve dialogs) to put the file
  284.      * somewhere interactively.
  285.      *
  286.      * Putting this hook in here is really a kludge.
  287.      */
  288.     if (f == SCR_FN) {                    /* seeing a file name? */
  289.         SetStrText (SRES_AFILN, "\p", scrdlg);
  290.         if (what == W_RECV)                /* of an incoming file? */
  291.           dorecvdialog (s, &cmarg2);    /* yes, allow user to do dialog */
  292.     }
  293.     rnum = scrtoresnum[f];                /* load default DITL number */
  294.                                         /* where result will be posted */
  295.  
  296.     switch (f) {                        /* according to function... */
  297.       case SCR_EM:                        /* error message */
  298.       case SCR_WM:                        /* warning message */
  299.         got_err = 1;
  300.         SysBeep(3);                        /* get the user's attention */
  301.         Delay ((long) 10, &i);
  302.         SysBeep(3);
  303.         Delay ((long) 10, &i);
  304.         SysBeep(3);
  305.         if (n != 0L) {
  306.             strcpy (buf, s);
  307.             strcat (buf, " ");
  308.             s = &buf[strlen(buf)];
  309.             NumToString(n, s);
  310.             p2cstr(s);
  311.             s = buf;
  312.         }
  313.         break;
  314.       
  315.       case SCR_FN:
  316.         got_err = 0;                    /* Reset for this file */
  317.         SetStrText (SRES_ITEXT, "\p", scrdlg);
  318.         break;
  319.  
  320.       case SCR_CD:
  321.         SetStrText (SRES_BTEXT, "\p", scrdlg);
  322.         strcpy(cwdbuf,"Current Directory: ");
  323.         strncat(cwdbuf,zgtdir(),60);
  324.         c2pstr(cwdbuf);
  325.         SetStrText (SRES_BTEXT, cwdbuf, scrdlg);
  326.         break;
  327.  
  328.       case SCR_FS:                        /* File Size */
  329.       case SCR_AN:                        /* "As-Name" */
  330.         if ((filargs.filflg & (FIL_RSRC | FIL_DATA)) ==
  331.             (FIL_RSRC | FIL_DATA)) {
  332.             /* in MacBinary mode */
  333.             SetStrText (SRES_FFORK, "\p", scrdlg);
  334.             SetStrText (SRES_FMODE, "\pMacBinary Mode", scrdlg);
  335.         } else {
  336.             SetStrText (SRES_FFORK, (filargs.filflg & FIL_RSRC) ?
  337.                         "\pRSRC Fork" : "\pData Fork", scrdlg);
  338.             SetStrText (SRES_FMODE, (filargs.filflg & FIL_BINA) ?
  339.                         "\pBinary Mode" : "\pText Mode", scrdlg);
  340.         }
  341.         break;
  342.  
  343.       case SCR_PT:                        /* Packet type? */
  344.         if (what == W_SEND) {            /* sent a packet... */
  345.             i = spktl-bctu;
  346.             if (i+2 <= MAXPACK) i += 2;    /* short packet */
  347.         } else {                        /* received a packet */
  348.             i = rln + bctu;
  349.             if (rln <= MAXPACK)            /* if it was a short packet */
  350.               i += 2;                    /* then add space for SEQ and TYPE */
  351.         }
  352.         if (i != scrpacln) {            /* Length */
  353.             scrpacln = i;
  354.             SetNumText (SRES_PACSZ, scrpacln, scrdlg);
  355.         }
  356.         /* checksum type */
  357.         if (bctu != scrcksum) {
  358.             scrcksum = bctu;
  359.             SetNumText (SRES_CKSUM, scrcksum, scrdlg);
  360.         }
  361.     
  362.         /* window size */
  363.         if ((wslots != scrwslots)
  364.             || ((what == W_SEND) && (sbufnum != scrbufnum))
  365.             || ((what != W_SEND) && (rbufnum != scrbufnum))) {
  366.             char *cp;
  367.  
  368.             scrwslots = wslots;
  369.             if (what == W_SEND)
  370.               scrbufnum = sbufnum;
  371.             else
  372.               scrbufnum = rbufnum;
  373.  
  374.             NumToString ((wslots - scrbufnum), buf); /* convert to number */
  375.             p2cstr(buf);
  376.             strcat (buf, "/");            /* make it be a fraction */
  377.             cp = (char *) buf + strlen (buf);
  378.             NumToString (scrwslots, cp);
  379.             p2cstr(cp);
  380.             c2pstr(buf);                /* convert whole buf back to string */
  381.             SetStrText (SRES_WINSZ, (unsigned char *) buf, scrdlg);
  382.         }
  383.         if (c == 'Y')
  384.           return;                        /* don't do anything for yaks */
  385.  
  386.         if (c == 'N' || c == 'Q' ||        /* check for all types of */
  387.             c == 'T' || c == '%')    /* NAK */
  388.           i = ++scrnak, rnum = SRES_NRTY; /* increment nak counter */
  389.         else
  390.           i = ++scrpkt, rnum = SRES_NPKT; /* else increment pkt counter */
  391.  
  392.         NumToString (i, buf);            /* translate to number */
  393.         p2cstr(buf);
  394.         s = buf;                        /* new buffer */
  395.         break;                            /* all done */
  396.  
  397.       case SCR_ST:                        /* status */
  398.         last_st = c;                    /* PWP: save for later */
  399.         if (f == ST_SKIP)
  400.           strcpy(buf, s);
  401.         else /* file name; should be same as filargs.fillcl */
  402.           strcpy (buf, filnam);
  403.         strcat (buf, ststrings[c]);        /* add status */
  404.         s = buf;
  405. #ifdef COMMENT
  406.         SetStrText (SRES_BTEXT, "\p", scrdlg);    /* clear eg. remote size */
  407.         SetStrText (SRES_ITEXT, "\p", scrdlg);    /* clear eg. date */
  408. #endif
  409.         break;
  410.  
  411.       case SCR_TC:                        /* transaction completed */
  412.         if (!server) {                    /* are we a server? */
  413.             /* if not, dispose the screen */
  414.             scrdispose ((last_st != ST_OK) || got_err);
  415.             got_err = 0;                /* reset this */
  416.             return;                        /* and we are done */
  417.         }
  418.         s = "Server transaction complete";
  419.         break;
  420.  
  421. #ifdef COMMENT
  422.       case SCR_DT:        /* file creation date */
  423.         strcpy (buf, "Creation date: __/__/__ ");
  424.         buf[15] = s[4];
  425.         buf[16] = s[5];
  426.         buf[18] = s[6];
  427.         buf[19] = s[7];
  428.         buf[21] = s[2];
  429.         buf[22] = s[3];
  430.         strcat (buf, &s[8]);
  431.         s = buf;
  432.         break;
  433. #endif /* COMMENT */
  434.  
  435.       case SCR_QE:                        /* Quantity equals */
  436.         strcpy (buf, s);
  437.         strcat (buf, " = ");
  438.         s = &buf[strlen(buf)];
  439.         NumToString(n, s);
  440.         p2cstr(s);
  441.         s = buf;
  442.         scrck = -1;                        /* force update of # Ks transfered */
  443.         break;
  444.     }
  445.  
  446.     if (rnum != SRES_UNDEF)                /* have DITL number for this? */
  447.     SetStrText (rnum, c2p_tmp(s), scrdlg); /* yes, so set the text */
  448.  
  449.     if ((scrfsize != fsize) || (scrffc != ffc))
  450.       update_scr_therm();
  451.  
  452.     if ((i = (ffc + 512) / 1024) != scrck) { /* Size changed? */
  453.         scrck = i;                        /* remember new value */
  454.         NumToString (scrck, buf);        /* convert to number */
  455.         p2cstr(buf);
  456.         if (fsize != 0) {                /* know the size? */
  457.             char *cp;
  458.             strcat (buf, "/");            /* make it be a fraction */
  459.             cp = (char *) buf + strlen (buf);
  460.             NumToString ((fsize + 512) / 1024, cp);
  461.             p2cstr(cp);
  462.         }
  463.         c2pstr(buf);
  464.         SetStrText (SRES_KXFER, (unsigned char *)buf, scrdlg);
  465.     }
  466. } /* screen */
  467.  
  468. /****************************************************************************/
  469. /* scrmydlg - handle dialog events occuring in the screen (status)
  470.  *              dialog.  Called by the miniparser when a dialog event
  471.  *              occurs and we are supposed to handle it.
  472.  */
  473. /****************************************************************************/
  474. scrmydlg (item) int item; {
  475.     switch (item) {
  476.       case SRES_CANF:
  477.         cxseen = TRUE;
  478.         break;
  479.       case SRES_CANG:
  480.         czseen = TRUE;
  481.         break;
  482.     }
  483. } /* scrmydlg */
  484.  
  485. /*
  486.  * Junk so Emacs will set local variables to be compatible with Mac/MPW.
  487.  * Should be at end of file.
  488.  * 
  489.  * Local Variables:
  490.  * tab-width: 4
  491.  * End:
  492.  */
  493.