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
00015 message = new Message();
00016 replyMsg = new Message();
00017
00018
00019
00020
00021 if ( n == NULL )
00022 {
00023 perror( "Invalid NameSpace. The NameSpace provided is NULL. \n" );
00024 exit( 1 );
00025 }
00026
00027 if ( user == client )
00028 {
00029
00030 }
00031 else if ( user == server )
00032 {
00033
00034 }
00035 else
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 )
00045 {
00046 connected = 1;
00047 fd = n->Nopen( name );
00048 }
00049 else if ( user == server )
00050 {
00051 connected = 1;
00052 n->Nattach( name );
00053 }
00054 else
00055 {
00056 perror( "Invalid MsgContainer type. \n " );
00057 exit( 1 );
00058 }
00059 }
00060
00061 void MsgContainer::disconnect()
00062 {
00063 if ( !connected ) return;
00064
00065
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
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 )
00099 {
00100 return -10;
00101 }
00102
00103 register int rc = message->checkHeader( rcvid );
00104
00105 if ( rc != 0 ) return rc;
00106
00107
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