Listing 3: A logging example using CommsChannel

#include <iostream.h>
#include "channel.hpp"
#include <string.h>

#define LOG_BUFFER   255

class LogServer {
   public:
      LogServer();
      void run();

   private:
      CommsChannel   server;
      bool           ok;
   };

class Logger {
   public:
      Logger();
      void log(string message);

   private:
      CommsChannel   client;
      bool           ok;
   };


// Log server implementation

LogServer::LogServer () : server("ExampleLogger", LOG_BUFFER) {
   if ( server.status() == CommsChannel::ok ) {
      ok = true;
      }
   else {
      ok = false;
      cout << "CommsChannel could not be opened." << endl;
      }
   }

void
LogServer::run() {
   char buffer[LOG_BUFFER+1];
   int bytes;
   char pause;

   cout << "Log server started" << endl;

   while (ok) {
      bytes = server.readBlocking(buffer, 1);
      if (bytes == 1) {
         bytes = buffer[0];
         bytes = server.readBlocking(buffer, bytes);
         if (bytes > 0) {
            buffer[bytes] = '\0';
            cout << buffer << endl;
            }

         cin >> pause;
         }

      if (server.status() != CommsChannel::ok) {
         ok = false;
         }
      }

   cout << "Log server stopping. Last status was: ";
   cout << server.status() << endl;
   }

// Log client implementation

Logger::Logger () : client("ExampleLogger") {
   if ( client.status() == CommsChannel::ok ) {
      ok = true;
      }
   else {
      ok = false;
      cout << "CommsChannel could not be opened." << endl;
      }
   }

void
Logger::log(string word) {
   char buffer[LOG_BUFFER+1];
   int bytes = word.length();
 
   if (bytes-2 > LOG_BUFFER) {
      cout << "Error while logging. Data too long" << endl;
      }

   buffer[0] = bytes;
   strcpy(&buffer[1], word.c_str());

   if (client.writeBlocking(buffer, bytes+2) < 0) {
      cout << "Error while logging. Last status was: ";
      cout << client.status() << endl;
      }
   }

// Testing - run with an argument in one process for a server,
// without an argument in another process as the client
void main(int argc) {
   if (argc > 1) {      // server
      LogServer s;
      s.run();
      }
   else {               // client
      string word;
      Logger l;
      while(true) {
         cout << "Log word: ";
         cin >> word;
         l.log(word);
         }
      }
   }

//End of File