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

C:/temp/src/j2k/nto/bakJuly/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 ), 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 MsgContainerType 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 MsgContainer
00023   {
00024 //    printf( "Client \n" );
00025   }
00026   else if ( user == server ) // Server MsgContainer
00027   {
00028 //    printf( "Server \n" );
00029   }
00030   else                       // Invalid MsgContainer
00031   {
00032     perror( "Invalid MsgContainer type. \n " );
00033     exit( 1 );
00034   }
00035 }
00036 
00037 void  MsgContainer::connect( const char* name = NULL )
00038 {
00039   if ( user == client )      // Client MsgContainer
00040   {
00041     connected = 1;
00042     fd = n->Nopen( name );
00043   }
00044   else if ( user == server ) // Server MsgContainer
00045   {
00046     connected = 1;
00047     n->Nattach( name );
00048   }
00049   else                       // Invalid MsgContainer
00050   {
00051     perror( "Invalid MsgContainer type. \n " );
00052     exit( 1 );
00053   }
00054 }
00055 
00056 void MsgContainer::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 MsgContainer::~MsgContainer() 
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 MsgContainer::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 MsgContainer::receive()
00110 {
00111   register int rcvid = MsgReceive( 
00112           n->getChannel(), 
00113     message->getMessageAddr(), 
00114     message->getMessageSize(), 
00115     NULL 
00116   );
00117 
00118   return rcvid;
00119 }
00120 
00121 void MsgContainer::send( int data )
00122 {
00123   message->setNumber( data );
00124   register int err = MsgSend( fd, 
00125       message->getMessageAddr(), 
00126       message->getMessageSize(), 
00127      replyMsg->getMessageAddr(), 
00128      replyMsg->getMessageSize() 
00129   );
00130 
00131   if ( err == -1 )
00132   {
00133     switch( errno )
00134     {
00135       case EBADF:
00136         printf( "The connection indicated by coid is no longer connected to a channel, \n" );
00137         printf( "or the connection indicated by coid doesn't exist. \n" );
00138         printf( "The channel may have been terminated by the server, \n" );
00139         printf( "or the network manager if it failed to respond to multiple polls. \n" );
00140       break;
00141 
00142       case EFAULT:
00143         printf( "A fault occurred when the kernel tried to access the buffers provided. \n" );
00144         printf( "This may have occurred on the receive or the reply. \n" );
00145       break;
00146 
00147       case EINTR:
00148         printf( "The call was interrupted by a signal. \n" );
00149       break;
00150 
00151       case ESRVRFAULT:
00152         printf( "A fault occurred in a server's address space when accessing the server's message buffers. \n" );
00153       break;
00154 
00155       case ETIMEDOUT:
00156         printf( "A kernel timeout unblocked the call. See TimerTimeout(). \n" );
00157       break;
00158 
00159       default:
00160         printf( "Unknown error %d: %s\n", errno, strerror( errno ) );
00161       break;
00162     }
00163   }
00164 }
00165 
00166 void MsgContainer::reply( int rcvid, int data )
00167 {
00168   replyMsg->setNumber( data );
00169 
00170   register int state = EOK;
00171 
00172   register int err = MsgReply( rcvid, state, replyMsg->getMessageAddr(), replyMsg->getMessageSize() );
00173 
00174   if ( err == -1 )
00175   {
00176     switch( errno )
00177     {
00178       case EFAULT:
00179         printf( "A fault occurred in the sender's address space \n" );
00180         printf( "when a server tried to access the sender's return message buffers. \n" );
00181       break;
00182 
00183       case ESRCH:
00184         printf( "The thread indicated by rcvid doesn't exist,  \n" );
00185         printf( "or is no longer REPLY-blocked on the channel, \n" );
00186         printf( "or the connection is detached. \n" );
00187       break;
00188 
00189       case ESRVRFAULT:
00190         printf( "A fault occurred when the kernel tried to access the buffers provided. \n" );
00191       break;
00192 
00193       default:
00194         printf( "Unknown error occured. \n" );
00195       break;
00196     }
00197 
00198     printf( "An error happened while replying to a message: MsgReply, code = %d, type = %s", 
00199             errno, strerror( errno ) 
00200     );
00201 
00202     exit( 1 );
00203   }
00204 } 
00205 
00206 #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