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

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

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

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