home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / fed0217s.zip / source / pipe.cpp < prev    next >
C/C++ Source or Header  |  2001-11-12  |  2KB  |  124 lines

  1. /*
  2. ** Module   :PIPE.CPP
  3. ** Abstract :
  4. **
  5. ** Copyright (C) Sergey I. Yevtushenko
  6. **
  7. ** Log: Mon  05/11/2001 Created
  8. **
  9. */
  10.  
  11. #define INCL_DOS
  12. #include <os2.h>
  13.  
  14. #include <string.h>
  15. #include <stdio.h>
  16. #include <pipe.h>
  17.  
  18. NamedPipe::NamedPipe():hPipe((unsigned long)-1)
  19. {
  20.     cData = new char[MAX_DATA];
  21. }
  22.  
  23. NamedPipe::NamedPipe(char* name):hPipe((unsigned long)-1)
  24. {
  25.     cData = new char[MAX_DATA];
  26.     Open(name);
  27. }
  28.  
  29. NamedPipe::~NamedPipe()
  30. {
  31.     Close();
  32.     delete cData;
  33. }
  34.  
  35. void NamedPipe::Open(char* name)
  36. {
  37.     if(IsValid())
  38.         Close();
  39.  
  40.     int rc = DosCreateNPipe(name, &hPipe,
  41.                             NP_NOINHERIT | NP_ACCESS_INBOUND,
  42.                             NP_WAIT | NP_TYPE_BYTE | NP_READMODE_BYTE | 1, /* one instance allowed */
  43.                             4096, 4096, 512);
  44.  
  45.     if(rc)
  46.         hPipe = (unsigned long)-1;
  47. }
  48.  
  49. char* NamedPipe::ReadMsg()
  50. {
  51.     if(!IsValid())
  52.     {
  53. //printf("IsValid = %d\n", IsValid());
  54.         return 0;
  55.     }
  56.  
  57.     int rc = DosConnectNPipe(hPipe);
  58.  
  59. //printf("rc = %d\n", rc);
  60.  
  61.     if(rc)
  62.         return 0;
  63.  
  64.     ULONG ulSz = 0;
  65.     int iSz    = 0;
  66.     cData[0]   = 0;
  67.  
  68.     for(;;)
  69.     {
  70.         char c;
  71.  
  72.         rc = DosRead(hPipe, &cData[iSz], (MAX_DATA - iSz), &ulSz);
  73.  
  74. //printf("rc = %d, ulSz = %d\n", rc, ulSz);
  75.  
  76.         if(rc)
  77.             break;
  78.  
  79.         if(iSz < MAX_DATA)
  80.         {
  81.             iSz += ulSz;
  82.             break;
  83.         }
  84.     }
  85.  
  86.     DosDisConnectNPipe(hPipe);
  87.  
  88.     if(!iSz)
  89.         return 0;
  90.  
  91.     cData[iSz] = 0;
  92.  
  93.     char* p = &cData[iSz - 1];
  94.  
  95.     while(p > cData)
  96.     {
  97.         if(*p == '\r' || *p == '\n' || *p == ' ')
  98.         {
  99.             *p-- = 0;
  100.             continue;
  101.         }
  102.         break;
  103.     }
  104.  
  105.     iSz = strlen(cData);
  106.  
  107.     if(!iSz)
  108.         return 0;
  109.  
  110.     //Create a copy of data
  111.     char* res = new char[iSz + 1];
  112.  
  113.     strcpy(res, cData);
  114.  
  115.     return res;
  116. }
  117.  
  118. void NamedPipe::Close()
  119. {
  120.     DosClose(hPipe);
  121.     hPipe = (unsigned long)-1;
  122. }
  123.  
  124.