home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 239.lha / amiga / src / dnet / window.c < prev   
Encoding:
C/C++ Source or Header  |  1989-05-02  |  10.3 KB  |  478 lines

  1.  
  2. /*
  3.  * WINDOW.C
  4.  *
  5.  *    DNET interactive terminal window.
  6.  */
  7.  
  8. #include "dnet.h"
  9. #include <stdio.h>
  10. #include <local/ipc.h>
  11.  
  12. #include "/server/servers.h"
  13.  
  14. long    IntuitionBase;
  15. long    GfxBase;
  16.  
  17. TA Ta = { (ubyte *)"topaz", 8 };
  18.  
  19. ITEXT IText[] = {
  20.     { 0, 1, JAM2, 0, 0, &Ta, (ubyte *)"SendBreak"   },
  21.     { 0, 1, JAM2, 0, 0, &Ta, (ubyte *)"StartDNET"   },
  22.     { 0, 1, JAM2, 0, 0, &Ta, (ubyte *)"QUIT"        }
  23. };
  24.  
  25. ITEM Item[] = {
  26.     { &Item[1], 0, 0, 120, 10, ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP, 0, (APTR)&IText[0], NULL, 'b' },
  27.     { &Item[2], 0,10, 120, 10, ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP, 0, (APTR)&IText[1], NULL, 's' },
  28.     { NULL    , 0,20, 120, 10, ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP, 0, (APTR)&IText[2], NULL, 'q' }
  29. };
  30.  
  31. MENU Menu[] = {
  32.     { NULL    , 0, 0, 120, 20, MENUENABLED, "DnetControl", &Item[0] }
  33. };
  34.  
  35. ubyte Title[80];
  36.  
  37. void
  38. do_dnetwindow(oldbaud)
  39. {
  40.     static struct NewWindow Nw = {
  41.     50, 50, 320, 100, -1, -1,
  42.     CLOSEWINDOW|MENUPICK,
  43.     WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|NOCAREREFRESH|ACTIVATE,
  44.     NULL, NULL, Title, NULL, NULL,
  45.     32, 32, -1, -1, WBENCHSCREEN
  46.     };
  47.     struct Window *win;
  48.     char RcvBuf[128];
  49.     char Cc;
  50.     char RSync = 0;
  51.     long imask, smask, conmask, mask, dnet_mask, ipc_mask;
  52.     IOCON *iocr, *iocw;
  53.     char notdone = 1;
  54.  
  55.     sprintf(Title, "DNET V%s%s", VERSION, DNET_VERSION);
  56.     setparity(0xFF, 0x00, 1);
  57.     IntuitionBase = (long)OpenLibrary("intuition.library", 0);
  58.     GfxBase = (long)OpenLibrary("graphics.library", 0);
  59.     if (IntuitionBase == NULL || GfxBase == NULL)
  60.     goto e1;
  61.     InitDeemuNW(Deemu+DMNWOFF, &Nw);
  62.     win = OpenWindow(&Nw);
  63.     if (win == NULL)
  64.     goto e1;
  65.     SetMenuStrip(win, Menu);
  66.     OpenConsole(win, &iocr, &iocw);
  67.     if (iocr == NULL)
  68.     goto e3;
  69.     if (Cto_act) {
  70.     AbortIO(&Cto);
  71.     WaitIO(&Cto);
  72.     Cto_act = 0;
  73.     }
  74.     if (Wto_act) {
  75.     AbortIO(&Wto);
  76.     WaitIO(&Wto);
  77.     Wto_act = 0;
  78.     }
  79.     SetBaudRate(oldbaud);
  80.  
  81.     if (OpenCfgFile()) {    /*  Automatic enviroment reset.     */
  82.     char *env;
  83.     char *get = (AutoAnswer) ? "ENVA" : ((DialOut) ? "ENVO" : "ENVM");
  84.  
  85.     while (env = GetCfgLine(get)) {
  86.         register char *ptr;
  87.         for (ptr = env; *ptr && *ptr != ' ' && *ptr != 9; ++ptr);
  88.         if (*ptr) {
  89.         *ptr = 0;
  90.         for (++ptr; *ptr == ' ' || *ptr == 9; ++ptr);
  91.         SetDEnv(env, ptr);
  92.         }
  93.     }
  94.     }
  95.  
  96.     if (Cd == 0 && AutoAnswer) {
  97.     if (OpenCfgFile()) {
  98.         register char *str;
  99.         while (str = GetCfgLine("RESM")) {  /* RESM MODEM-CMD   */
  100.         short len = strlen(str);
  101.         str[len++] = '\r';
  102.         NetWrite(str, len, 0);
  103.         Cto.tr_time.tv_secs = 1;
  104.         Cto.tr_time.tv_micro= 0;
  105.         DoIO(&Cto);
  106.         }
  107.         CloseCfgFile();
  108.     } else {
  109.         NetWrite("AT\r", 3, 0);   /*  cause modem to reset baud rate */
  110.         Cto.tr_time.tv_secs = 1;
  111.         Cto.tr_time.tv_micro= 0;
  112.         DoIO(&Cto);
  113.         NetWrite("AT\r", 3, 0);     /*  cause modem to reset baud rate */
  114.         Cto.tr_time.tv_secs = 1;
  115.         Cto.tr_time.tv_micro= 0;
  116.         DoIO(&Cto);
  117.         NetWrite("ATS0=1\r", 7, 0); /*  auto answer on */
  118.     }
  119.     }
  120.  
  121.     iocr->io_Data = (APTR)&Cc;
  122.     iocr->io_Length = 1;
  123.     SendIO(iocr);
  124.  
  125.     imask   = 1 << win->UserPort->mp_SigBit;
  126.     smask   = 1 << IOSink->mp_SigBit;
  127.     conmask = 1 << iocr->io_Message.mn_ReplyPort->mp_SigBit;
  128.     dnet_mask = 1 << DNetPort->mp_SigBit;
  129.     ipc_mask= 1 << IPCPort->mp_SigBit;
  130.  
  131.     LoadConnectList();
  132.  
  133.     Signal(FindTask(NULL), imask|smask|conmask|dnet_mask|ipc_mask);
  134.  
  135.     while (!Quit && OnLine == 0) {
  136.     mask = Wait(imask|smask|conmask|dnet_mask|ipc_mask);
  137.     if (mask & ipc_mask)
  138.         handle_ipc();
  139.     if (mask & dnet_mask) {
  140.         register IOR *ior;
  141.         while (ior = (IOR *)GetMsg(DNetPort)) {
  142.         switch(ior->io_Command) {
  143.         default:
  144.         case DNCMD_WRITE:
  145.         case DNCMD_EOF:
  146.         case DNCMD_IOCTL:
  147.         case DNCMD_QUIT:
  148.         case DNCMD_OPEN:
  149.             ior->io_Error = 1;
  150.             break;
  151.         case DNCMD_CLOSE:
  152.             Chan[(ulong)ior->io_Unit].state = CHAN_FREE;
  153.             break;
  154.         case DNCMD_SOPEN:
  155.             {
  156.             uword chan = (ulong)ior->io_Unit;
  157.             Chan[chan].state = CHAN_FREE;
  158.             if (!ior->io_Error) {
  159.                 Chan[chan].state = CHAN_CLOSE;
  160.                 Chan[chan].port  = (PORT *)ior->io_Offset;
  161.                 Chan[chan].flags = CHANF_RCLOSE;
  162.                 WritePort(Chan[chan].port, DNCMD_CLOSE, NULL, 0, PKT_REQ, chan);
  163.             }
  164.             if (ior->io_Length)
  165.                 FreeMem(ior->io_Data, ior->io_Length);
  166.             FreeMem(ior, sizeof(IOR));
  167.             ior = NULL;
  168.             }
  169.             break;
  170.         }
  171.         if (ior)
  172.             ReplyMsg(ior);
  173.         }
  174.     }
  175.     if (mask & imask) {
  176.         struct IntuiMessage *im;
  177.         while (im = GetMsg(win->UserPort)) {
  178.         switch(im->Class) {
  179.         case CLOSEWINDOW:
  180.             notdone = 0;
  181.             Quit = 1;
  182.             break;
  183.         case MENUPICK:
  184.             switch((uword)((MENUNUM(im->Code)<<8)|ITEMNUM(im->Code))) {
  185.             case 0x0000:    /*    menu 0 item 0    */
  186.             NetBreak();
  187.             break;
  188.             case 0x0001:    /*    menu 0 item 1    */
  189.             notdone = 0;
  190.             OnLine = 1;
  191.             break;
  192.             case 0x0002:    /*    menu 0 item 2    */
  193.             notdone = 0;
  194.             Quit = 1;
  195.             break;
  196.             case 0x0100:    /*    menu 1 item 0    */
  197.             break;
  198.             }
  199.             break;
  200.         }
  201.         ReplyMsg(im);
  202.         }
  203.     }
  204.     if (mask & smask) {
  205.         register IOSER *ios;
  206.         if (ios = NetReadReady()) {
  207.         int n;
  208.         register ubyte *ptr;
  209.  
  210.         WaitIO(ios);
  211.         NetReadReturned();
  212.         if (ios->IOSer.io_Actual > 0) {
  213.             ptr = (ubyte *)ios->IOSer.io_Data;
  214.  
  215.             if (RSync && *ptr == PKCMD_RESTART) {
  216.             OnLine = 1;
  217.             notdone = 0;
  218.             }
  219.             RSync = (*ptr == SYNC);
  220.             for (n = 0; n < ios->IOSer.io_Actual; ++n)
  221.             ptr[n] &= 0x7F;
  222.             oldbaud = CheckConnect(oldbaud, ptr, n);
  223.             iocw->io_Data   = (APTR)ptr;
  224.             iocw->io_Length = n;
  225.             DoIO(iocw);
  226.         }
  227.         if ((n = NetReady()) >= sizeof(RcvBuf))
  228.             n = sizeof(RcvBuf) - 1;
  229.         if (n <= 0)
  230.             n = 1;
  231.         NetStartRead(RcvBuf, n);
  232.         }
  233.     }
  234.     if (mask & conmask) {
  235.         if (CheckIO(iocr)) {
  236.         WaitIO(iocr);
  237.         if (!Master8)
  238.             addparity(iocr->io_Data, iocr->io_Actual);
  239.         NetWrite(iocr->io_Data, iocr->io_Actual, 0);
  240.         NetWaitWrite();
  241.         iocr->io_Data = (APTR)&Cc;
  242.         iocr->io_Length = 1;
  243.         SendIO(iocr);
  244.         }
  245.     }
  246.     if (AutoAnswer && Cd)
  247.         break;
  248.     }
  249.  
  250.     UnLoadConnectList();
  251.  
  252.     {
  253.     register IOSER *ios = NetAbortRead();
  254.  
  255.     if (ios->IOSer.io_Actual > 0) {
  256.         register ubyte *ptr = (ubyte *)ios->IOSer.io_Data;
  257.         register short n;
  258.         for (n = 0; n < ios->IOSer.io_Actual; ++n)
  259.         ptr[n] &= 0x7F;
  260.         oldbaud = CheckConnect(oldbaud, ptr, n);
  261.     }
  262.     }
  263.  
  264.     if (DDebug)
  265.     printf("SETTING BAUD RATE TO %d\n", oldbaud);
  266.  
  267.     if (AutoAnswer && Cd) {
  268.     char *msg = "\r\nDNET AutoAnswer, Protocol Start\r\n";
  269.     OnLine = 1;
  270.     NetWrite(msg, strlen(msg), 0);
  271.     Cto.tr_time.tv_secs = 3;
  272.     Cto.tr_time.tv_micro= 0;
  273.     DoIO(&Cto);
  274.     }
  275.  
  276.     NetStartRead(&Raux->sync, 3);
  277.  
  278.     AbortIO(iocr);
  279.     WaitIO(iocr);
  280.     CloseConsole(iocr, iocw);
  281. e3:
  282.     CloseWindow(win);
  283. e1:
  284.     if (IntuitionBase)  CloseLibrary(IntuitionBase);
  285.     if (GfxBase)        CloseLibrary(GfxBase);
  286.     if (Quit)
  287.     puts("DNET EXITING");
  288.     else
  289.     puts("DNET RUNNING");
  290.     return;
  291. }
  292.  
  293. /*
  294.  *  PARITY ROUTINES
  295.  */
  296.  
  297. static ubyte Party[256/8];
  298.  
  299. setparity(pand, por, peven)
  300. {
  301.     register short i, j, k, l;
  302.     bzero(Party, sizeof(Party));
  303.     for (i = 0; i < 128; ++i) {
  304.     for (j = (~i & 127), k = 0; j; j >>= 1) {   /*  k = count # of 0's */
  305.         if (j & 1)
  306.         ++k;
  307.     }
  308.     k ^= peven;
  309.     l = (((k & 1) ? 0x01 : 0) | por) & pand;
  310.     Party[i >> 3] |= l << (i & 7);
  311.     }
  312. }
  313.  
  314. addparity(buf, bytes)
  315. register ubyte *buf;
  316. {
  317.     register short i;
  318.     for (i = bytes - 1; i >= 0; --i) {
  319.     if (Party[buf[i]>>3] & (1 << (buf[i]&7)))
  320.         buf[i] |= 0x80;
  321.     }
  322. }
  323.  
  324. OpenConsole(win, piocr, piocw)
  325. IOCON **piocr, **piocw;
  326. struct Window *win;
  327. {
  328.     PORT *port;
  329.     static IOCON iocr, iocw;
  330.     int error;
  331.  
  332.     port = CreatePort(NULL, 0);
  333.     iocr.io_Command = CMD_READ;
  334.     iocr.io_Data = (APTR)win;
  335.     iocr.io_Message.mn_Node.ln_Type = NT_MESSAGE;
  336.     iocr.io_Message.mn_ReplyPort = port;
  337.     error = OpenDevice("console.device", 0, &iocr, 0);
  338.     if (!error) {
  339.     iocw = iocr;
  340.     iocw.io_Command = CMD_WRITE;
  341.     *piocr = &iocr;
  342.     *piocw = &iocw;
  343.     } else {
  344.     *piocr = *piocw = NULL;
  345.     }
  346. }
  347.  
  348. CloseConsole(iocr, iocw)
  349. IOCON *iocr;
  350. IOCON *iocw;
  351. {
  352.     CloseDevice(iocr);
  353.     DeletePort(iocr->io_Message.mn_ReplyPort);
  354. }
  355.  
  356. InitDeemuNW(ary, nw)
  357. register short *ary;
  358. register NW *nw;
  359. {
  360.     register short alen = ary[3];
  361.     SCR Scr;
  362.  
  363.     if (GetScreenData(&Scr, sizeof(Scr), nw->Type, nw->Screen) == 0) {
  364.     Scr.Width = 320;
  365.     Scr.Height= 200;
  366.     }
  367.     if (alen >= 8) {
  368.     if ((nw->Width   = ary[6]) < 0)
  369.         nw->Width += Scr.Width;
  370.     if ((nw->Height  = ary[7]) < 0)
  371.         nw->Height+= Scr.Height;
  372.     }
  373.     if (alen >= 4) {
  374.     if ((nw->LeftEdge= ary[4]) < 0)
  375.         nw->LeftEdge += Scr.Width - nw->Width;
  376.     if ((nw->TopEdge = ary[5]) < 0)
  377.         nw->TopEdge += Scr.Height - nw->Height;
  378.     }
  379.     if (nw->LeftEdge < 0 || nw->TopEdge < 0 || nw->Width < 0 || nw->Height < 0 ||
  380.     nw->LeftEdge + nw->Width > Scr.Width || nw->TopEdge + nw->Height > Scr.Height) {
  381.  
  382.     nw->LeftEdge = nw->TopEdge = 0;
  383.     nw->Width = 320;
  384.     nw->Height= 100;
  385.     }
  386.     if (alen >= 9)
  387.     nw->DetailPen = ary[8] >> 8;
  388.     if (alen >= 10)
  389.     nw->BlockPen  = ary[8];
  390. }
  391.  
  392. /*
  393.  *
  394.  */
  395.  
  396. static MLIST CList;
  397.  
  398. LoadConnectList()
  399. {
  400.     char *ptr;
  401.     NODE *node;
  402.  
  403.     NewList(&CList);
  404.  
  405.     OpenCfgFile();
  406.     while (ptr = GetCfgLine("AUTA")) {
  407.     long baudrate = atoi(ptr);
  408.     while (*ptr && *ptr != '\"')
  409.         ++ptr;
  410.     if (*ptr == '\"') {
  411.         register char *en;
  412.         register NODE *node;
  413.  
  414.         for (en = ++ptr; *en && *en != '\"'; ++en);
  415.         *en = 0;
  416.  
  417.         if (node = malloc(sizeof(NODE)+strlen(ptr)+1)) {
  418.         AddTail(&CList, node);
  419.         node->ln_Name = (char *)baudrate;
  420.         strcpy(node + 1, ptr);
  421.         }
  422.     }
  423.     }
  424.     CloseCfgFile();
  425. }
  426.  
  427. UnLoadConnectList()
  428. {
  429.     NODE *node;
  430.     while (node = RemHead(&CList))
  431.     free(node);
  432. }
  433.  
  434. CheckConnect(oldbaud, ptr, n)
  435. register char *ptr;
  436. {
  437.     static char tmpbuf[64];
  438.     static short tlen;
  439.     register short i;
  440.     register NODE *node;
  441.     long newbaud = oldbaud;
  442.  
  443.     for (i = 0; i < n; ++i) {
  444.     if (ptr[i] == 13 || ptr[i] == 10) {
  445.         register char *ptr;
  446.         tmpbuf[tlen++] = 0;
  447.         if (tlen < 2) {
  448.         tlen = 0;
  449.         continue;
  450.         }
  451.         tlen = 0;
  452.         for (node = GetHead(&CList); node; node = GetSucc(node)) {
  453.         if (strcmp(tmpbuf, node + 1) == 0) {
  454.             newbaud = (long)node->ln_Name;
  455.             if (DDebug)
  456.             printf("Successful compare, baud -> %d\n", newbaud);
  457.             break;
  458.         }
  459.         }
  460.         if (GetHead(&CList) == NULL) {
  461.         if (strncmp(tmpbuf, "CONNECT", 7) == 0) {
  462.             newbaud = atoi(tmpbuf + 7);
  463.             if (newbaud == 0)
  464.             newbaud = 300;
  465.         }
  466.         }
  467.         continue;
  468.     }
  469.     tmpbuf[tlen++] = ptr[i];
  470.     if (tlen == sizeof(tmpbuf))
  471.         tlen = 0;
  472.     }
  473.     if (oldbaud != newbaud)
  474.     SetBaudRate(newbaud);
  475.     return(newbaud);
  476. }
  477.  
  478.