home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 035 / pmics.zip / engcom.cc < prev    next >
C/C++ Source or Header  |  1994-11-23  |  3KB  |  120 lines

  1. /*
  2.     PMICS -- PM interface for playing chess on internet chess server
  3.     Copyright (C) 1994  Kevin Nomura
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19.     Author can be reached at email: chow@netcom.com
  20. */
  21. #define  INCL_DOSNMPIPES
  22. #include <os2.h>
  23. #include "engcom.hh"
  24. #include "pmics.hh"
  25. #include "session.hh"
  26.  
  27. EngineComm *engineComm;
  28. extern ASession  *aSession;
  29. static void _System PipeListen(ULONG hFile);
  30.  
  31. EngineComm :: EngineComm() : hpipe(0), connected(false)
  32. {
  33.   APIRET    rc;
  34.   HFILE     hFile;
  35.  
  36.   IFUNCTRACE_DEVELOP();
  37.   rc = DosCreateNPipe (NPIPE_NAME, // create named pipe
  38.                &hFile,       // pipe handle
  39.                NP_ACCESS_DUPLEX, // allow duplex access
  40.                NP_WAIT |     // blocking mode
  41.                NP_TYPE_MESSAGE | // msg oriented pipe
  42.                NP_READMODE_MESSAGE | // msg oriented read
  43.                0x01,            // single instance only
  44.                1024,        // outbound buffer size
  45.                1024,        // inbound buffer size
  46.                0);            // default timeout value
  47.   ITRACE_DEVELOP("EngineComm: DosCreateNPipe rc=" + IString(rc) +
  48.          " hFile=" + IString(hFile));
  49.  
  50.   if (rc != 0)
  51.     throw "DosCreateNPipe";
  52.  
  53.   engineComm = this;        // export
  54.   hpipe = IHandle(hFile);
  55.   pthr = new IThread(PipeListen, (ULONG)hFile);
  56. }
  57.  
  58.  
  59. EngineComm :: ~EngineComm()
  60. {
  61.   delete pthr;
  62. }
  63.  
  64.  
  65. void EngineComm :: sendCommand (char *s)
  66. {
  67.   ULONG   rc, ulBytes;
  68.  
  69.   IFUNCTRACE_DEVELOP();
  70.   ITRACE_DEVELOP(s);
  71.   if (connected) {
  72.     rc = DosWrite(hpipe, 
  73.           s,
  74.           strlen(s),
  75.           &ulBytes);
  76.     ITRACE_DEVELOP("DosWrite rc " + IString(rc) +
  77.            "ulBytes " + IString(ulBytes));
  78.   }
  79. }
  80.  
  81.  
  82. void _System PipeListen(ULONG hFile)
  83. {
  84.   char   request[256];
  85.   ULONG  ulBytes;
  86.   APIRET rc;
  87.  
  88.   IFUNCTRACE_DEVELOP();
  89.   while (1) {
  90.     rc = DosConnectNPipe(hFile);
  91.     ITRACE_DEVELOP("DosConnectNPipe rc=" + IString(rc));
  92.     engineComm->setConnected();
  93.  
  94.     while (1) {
  95.       rc = DosRead(hFile,
  96.            request,
  97.            sizeof(request),
  98.            &ulBytes);
  99.       ITRACE_DEVELOP("DosRead from pipe rc " + IString(rc) +
  100.              "ulBytes " + IString(ulBytes));
  101.       if (rc) {
  102.     ITRACE_DEVELOP("------ PipeListen: DosRead() rc = " + IString(rc));
  103.     ITRACE_DEVELOP("Assuming broken pipe.  breaking from inner loop.");
  104.     break;
  105.       }
  106.       else if (ulBytes == 0) {
  107.     ITRACE_DEVELOP("----- PipeListen: ulBytes==0, assuming broken pipe");
  108.     break;
  109.       }
  110.  
  111.       request[ulBytes] = 0;
  112.       aSession->write(request);    // send move to the comm port
  113.     }
  114.  
  115.     rc = DosDisConnectNPipe(hFile);
  116.     ITRACE_DEVELOP("DosDisconnectNPipe rc=" + IString(rc));
  117.     engineComm->clearConnected();
  118.   }
  119. }
  120.