00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "MessageParser.h"
00019 #include "RoutedMessageEvent.h"
00020 #include "RoutedMessageHandler.h"
00021
00022 #include "timing.h"
00023
00024 using namespace CODEX_APSS;
00025
00026 void
00027 MessageParser::operator()( unsigned char* server,
00028 unsigned char* mID,
00029 CODEX_Quorum::Message* m )
00030 {
00031 if ( 0 == m )
00032 {
00033 if ( 0 != server ) delete [] server;
00034 if ( 0 != mID ) delete [] mID;
00035 return;
00036 }
00037 #ifdef TIMING
00038 ActiveTimer.start();
00039 #endif
00040 const unsigned char* buff = m->buffer();
00041 long buffLength = m->length();
00042 unsigned char* pBuff = (unsigned char*) (buff+1);
00043 RoutedMessageEventBase* evt = NULL;
00044 switch( buff[0] )
00045 {
00046 case (kInitMsg | SignatureMask) :
00047 evt = new RoutedMessageEvent< SignedInitMsg >(
00048 this, m_destination, server, mID );
00049 break;
00050 case (kEstablishMsg | SignatureMask) :
00051 evt = new RoutedMessageEvent< SignedEstablishMsg >(
00052 this, m_destination, server, mID );
00053 break;
00054 case (kComputeMsg | SignatureMask) :
00055 evt = new RoutedMessageEvent< SignedComputeMsg >(
00056 this, m_destination, server, mID );
00057 break;
00058 case (kRecoverMsg | SignatureMask) :
00059 evt = new RoutedMessageEvent< SignedRecoverMsg >(
00060 this, m_destination, server, mID );
00061 break;
00062 case (kFinishedMsg | SignatureMask) :
00063 evt = new RoutedMessageEvent< SignedFinishedMsg >(
00064 this, m_destination, server, mID );
00065 break;
00066 default :
00067
00068 if ( 0 != server ) delete [] server;
00069 if ( 0 != mID ) delete [] mID;
00070
00071
00072
00073 break;
00074 }
00075 if ( 0 != evt )
00076 {
00077 if ( evt->unmarshal( &pBuff, buffLength ) )
00078 {
00079
00080 sendEvent( evt, 0 );
00081 }
00082 else
00083 {
00084
00085 delete evt;
00086 }
00087 }
00088 delete m;
00089 #ifdef TIMING
00090 ActiveTimer.stop();
00091 #endif
00092 }