00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "ClientMessageParser.h"
00019 #include "RoutedClientMessageEvent.h"
00020 #include "RoutedClientMessageHandler.h"
00021
00022 #include "timing.h"
00023
00024 using namespace CODEX_KeyService;
00025
00026 void
00027 ClientMessageParser::operator()( unsigned char* server,
00028 unsigned char* mID,
00029 CODEX_Quorum::Message* m )
00030 {
00031 if ( NULL == 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 ClientMessageEventBase* evt = NULL;
00044 switch( buff[0] )
00045 {
00046 using namespace CODEX_Client;
00047 case (CODEX_Client::kCreateKeyMsg |
00048 CODEX_Client::SignatureMask) :
00049 evt = new RoutedClientMessageEvent< SignedCreateKeyMsg >(
00050 this, m_destination, server, mID );
00051 break;
00052 case (CODEX_Client::kWriteKeyMsg |
00053 CODEX_Client::SignatureMask) :
00054 evt = new RoutedClientMessageEvent< SignedWriteKeyMsg >(
00055 this, m_destination, server, mID );
00056 break;
00057 case (CODEX_Client::kReadKeyMsg |
00058 CODEX_Client::SignatureMask) :
00059 evt = new RoutedClientMessageEvent< LabeledReadKeyMsg >(
00060 this, m_destination, server, mID );
00061 break;
00062 default :
00063
00064 cerr << "Bad message type: "
00065 << (unsigned int)buff[0]
00066 << endl;
00067 if ( 0 != server ) delete [] server;
00068 if ( 0 != mID ) delete [] mID;
00069 break;
00070 }
00071 if ( NULL != evt )
00072 {
00073 if ( evt->unmarshal( &pBuff, buffLength ) )
00074 {
00075
00076 sendEvent( evt, 0 );
00077 }
00078 else
00079 {
00080
00081 delete evt;
00082 }
00083 }
00084 delete m;
00085 #ifdef TIMING
00086 ActiveTimer.stop();
00087 #endif
00088 }