Listing 1: CommsChannel definition

#if !defined(commsChannel_HPP_ONCEONLY)
#define commsChannel_HPP_ONCEONLY
#include <windows.h>
#include <string>
using namespace std;

struct CommsData;             // forward definition

#if defined(__DLL__)
__declspec(dllexport)
#else
__declspec(dllimport)
#endif
class CommsChannel {
public:

   enum statusEnum {
      ok = 0,                    //first ones are >= 0
      waitError,
      waitTimeout,
      waitTimeoutChunkTooSmall,
      objectAlreadyOpen = -1000, //All of the rest are < 0
      objectClosed,
      mutexCreationError,
      mutexOpenError,
      mutexAlreadyExists,
      mutexNotFound,
      channelCreationError,
      channelOpenError,
      channelMappingError,
      channelAlreadyExists,
      channelNotFound
      };

   CommsChannel(string name, int size);
   CommsChannel(string name);
   CommsChannel();
   ~CommsChannel();

   statusEnum open(string name, int size);
   statusEnum open(string name);
   statusEnum close();

   int read(char* buffer, int size,
            bool chunk = false, DWORD timeOut = 0);
   int write(char* buffer, int size,
             bool chunk = true, DWORD timeOut = 0);

   int readImmediate(char* buffer, int size, bool chunk = false)
          {read(buffer, size, chunk, 0);}
   int writeImmediate(char* buffer, int size, bool chunk = true)
          {write(buffer, size, chunk, 0);}

   int readBlocking(char* buffer, int size, bool chunk = false)
          {read(buffer, size, chunk, INFINITE);}
   int writeBlocking(char* buffer, int size, bool chunk = true)
          {write(buffer, size, chunk, INFINITE);}

   statusEnum status() const {return error;}
   const string& name() const;

   int   bytesToRead() const;
   int   roomToWrite() const;

private:
   bool              opened;
   string            channelName;
   bool              server;
   char*             fsBuffer;
   char*             tsBuffer;

   statusEnum        error;

   HANDLE            handle;
   HANDLE            generalMutex;
   HANDLE            fsNotEmptySem;
   HANDLE            fsNotFullSem;
   HANDLE            tsNotEmptySem;
   HANDLE            tsNotFullSem;
   CommsData*        data;

   static string     noName;

   int blockOnChannel(int size, bool chunk, DWORD timeout,
                      bool reading, HANDLE& mutex, HANDLE& semaphore,
                      int& start, int& next);

};

#endif // !defined(commsChannel_HPP_ONCEONLY)

// End of File