Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/nto/MsgThread.cpp

Go to the documentation of this file.
00001 #ifndef __J2K__MsgThread_CPP__
00002 #define __J2K__MsgThread_CPP__
00003 
00004 #include <j2k/nto/MsgThread.hpp>
00005 
00006 MsgThread::MsgThread( NameSpace* n0, MsgThreadType_t user0 = client )
00007   : Basic_PThread(), user( user0 ), n( n0 ), fd( 0 ), connected( 0 )
00008 {
00009   // Allocate memory for Message and Reply buffers
00010   message  = new Message();
00011   replyMsg = new Message();
00012 
00013   // Verify that the MsgThreadType is valid
00014 
00015   // Verify that the NameSpace exists.
00016   if ( n == NULL ) 
00017   {
00018     perror( "Invalid NameSpace. The NameSpace provided is NULL.  \n" );
00019     exit( 1 );
00020   }
00021 
00022   if ( user == client )      // Client MsgThread
00023   {
00024 //    printf( "Client \n" );
00025   }
00026   else if ( user == server ) // Server MsgThread
00027   {
00028 //    printf( "Server \n" );
00029   }
00030   else                       // Invalid MsgThread
00031   {
00032     perror( "Invalid MsgThread type. \n " );
00033     exit( 1 );
00034   }
00035 }
00036 
00037 void  MsgThread::connect( const char* name = NULL )
00038 {
00039   if ( user == client )      // Client MsgThread
00040   {
00041     connected = 1;
00042     fd = n->Nopen( name );
00043   }
00044   else if ( user == server ) // Server MsgThread
00045   {
00046     connected = 1;
00047     n->Nattach( name );
00048   }
00049   else                       // Invalid MsgThread
00050   {
00051     perror( "Invalid MsgThread type. \n " );
00052     exit( 1 );
00053   }
00054 }
00055 
00056 void MsgThread::disconnect()
00057 {
00058   if ( !connected ) return;
00059 
00060   // Close NameSpace connection that was opened.
00061   if ( n != NULL ) 
00062   {
00063     if ( user == client )
00064     {
00065       n->Nclose( fd );
00066     }
00067     else if ( user == server )
00068     { 
00069       n->Ndetach();
00070     }
00071   }
00072   connected = 0;
00073 }
00074 
00075 MsgThread::~MsgThread() 
00076 {
00077   disconnect();
00078 
00079   // Release memory taken by Message and Reply buffers
00080   if ( message != NULL ) 
00081   {
00082     delete message;
00083   }
00084 
00085   if ( replyMsg != NULL ) 
00086   {
00087     delete replyMsg;
00088   }
00089 }
00090 
00091 int MsgThread::handleReceive( int rcvid, int replyData = 0 )
00092 {
00093   if ( rcvid != -1 ) // Error case
00094   {
00095     return -10;
00096   }
00097 
00098   register int rc = message->checkHeader( rcvid );
00099 
00100   if ( rc != 0 ) return rc;
00101       
00102   /* A message (presumable ours) received, handle */
00103   printf( "Server receive %d \n", message->getNumber() );
00104   reply( rcvid, replyData );
00105 
00106   return 0;
00107 }
00108 
00109 int MsgThread::receive()
00110 {
00111   register int rcvid = MsgReceive( n->getChannel(), message->getMessageAddr(), message->getMessageSize(), NULL );
00112   return rcvid;
00113 }
00114 
00115 void MsgThread::send( int data )
00116 {
00117   message->setNumber( data );
00118   register int err = MsgSend( fd, 
00119       message->getMessageAddr(), 
00120       message->getMessageSize(), 
00121      replyMsg->getMessageAddr(), 
00122      replyMsg->getMessageSize() 
00123   );
00124 
00125   if ( err == -1 )
00126   {
00127     switch( errno )
00128     {
00129       case EBADF:
00130         printf( "The connection indicated by coid is no longer connected to a channel, \n" );
00131         printf( "or the connection indicated by coid doesn't exist. \n" );
00132         printf( "The channel may have been terminated by the server, \n" );
00133         printf( "or the network manager if it failed to respond to multiple polls. \n" );
00134         break;
00135       case EFAULT:
00136         printf( "A fault occurred when the kernel tried to access the buffers provided. \n" );
00137         printf( "This may have occurred on the receive or the reply. \n" );
00138         break;
00139       case EINTR:
00140         printf( "The call was interrupted by a signal. \n" );
00141         break;
00142       case ESRVRFAULT:
00143         printf( "A fault occurred in a server's address space when accessing the server's message buffers. \n" );
00144         break;
00145       case ETIMEDOUT:
00146         printf( "A kernel timeout unblocked the call. See TimerTimeout(). \n" );
00147         break;
00148       default:
00149         printf( "Unknown error %d: %s\n", errno, strerror( errno ) );
00150         break;
00151     }
00152   }
00153 }
00154 
00155 void MsgThread::reply( int rcvid, int data )
00156 {
00157   replyMsg->setNumber( data );
00158 
00159   register int state = EOK;
00160 
00161   register int err = MsgReply( rcvid, state, replyMsg->getMessageAddr(), replyMsg->getMessageSize() );
00162 
00163   if ( err == -1 )
00164   {
00165     switch( errno )
00166     {
00167       case EFAULT:
00168         printf( "A fault occurred in the sender's address space \n" );
00169         printf( "when a server tried to access the sender's return message buffers. \n" );
00170       break;
00171 
00172       case ESRCH:
00173         printf( "The thread indicated by rcvid doesn't exist,  \n" );
00174         printf( "or is no longer REPLY-blocked on the channel, \n" );
00175         printf( "or the connection is detached. \n" );
00176       break;
00177 
00178       case ESRVRFAULT:
00179         printf( "A fault occurred when the kernel tried to access the buffers provided. \n" );
00180       break;
00181 
00182       default:
00183         printf( "Unknown error occured. \n" );
00184       break;
00185     }
00186 
00187     printf( "An error happened while replying to a message: MsgReply, code = %d, type = %s", 
00188             errno, strerror( errno ) 
00189     );
00190 
00191     exit( 1 );
00192   }
00193 } 
00194 
00195 #endif  // MsgThread.cpp

Generated on Sun Oct 14 18:46:36 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001