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
00010 message = new Message();
00011 replyMsg = new Message();
00012
00013
00014
00015
00016 if ( n == NULL )
00017 {
00018 perror( "Invalid NameSpace. The NameSpace provided is NULL. \n" );
00019 exit( 1 );
00020 }
00021
00022 if ( user == client )
00023 {
00024
00025 }
00026 else if ( user == server )
00027 {
00028
00029 }
00030 else
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 )
00040 {
00041 connected = 1;
00042 fd = n->Nopen( name );
00043 }
00044 else if ( user == server )
00045 {
00046 connected = 1;
00047 n->Nattach( name );
00048 }
00049 else
00050 {
00051 perror( "Invalid MsgThread type. \n " );
00052 exit( 1 );
00053 }
00054 }
00055
00056 void MsgThread::disconnect()
00057 {
00058 if ( !connected ) return;
00059
00060
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
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 )
00094 {
00095 return -10;
00096 }
00097
00098 register int rc = message->checkHeader( rcvid );
00099
00100 if ( rc != 0 ) return rc;
00101
00102
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