00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "ClientResponseParser.h"
00019 #include "ClientDelegation.h"
00020 #include "SupportedKeyStoredEvent.h"
00021 #include "SupportedClientResponseEvent.h"
00022 #include "SupportedClientResponseHandler.h"
00023
00024 #include "timing.h"
00025
00026 using namespace CODEX_KeyService;
00027
00028 void
00029 ClientResponseParser::operator()( unsigned char* server,
00030 unsigned char* mID,
00031 CODEX_Quorum::Message* m )
00032 {
00033 if ( NULL == m )
00034 {
00035 if ( 0 != server ) delete [] server;
00036 if ( 0 != mID ) delete [] mID;
00037 return;
00038 }
00039 #ifdef TIMING
00040 ActiveTimer.start();
00041 #endif
00042 const unsigned char* buff = m->buffer();
00043 long buffLength = m->length();
00044 unsigned char* pBuff = (unsigned char*) (buff+2);
00045 SupportedClientResponseEventBase* evt = NULL;
00046 if ( ClientDelegation::kRequestSignature != buff[0] )
00047 {
00048 if ( 0 != server ) delete [] server;
00049 if ( 0 != mID ) delete [] mID;
00050 delete m;
00051 #ifdef TIMING
00052 ActiveTimer.stop();
00053 #endif
00054 return;
00055 }
00056 switch( buff[1] )
00057 {
00058 using namespace CODEX_Client;
00059 case CODEX_Client::kBoundNameMsg :
00060 evt = new
00061 SupportedClientResponseEvent< BoundNameMsg, SignedCreateKeyMsg >(
00062 this, server, mID, m_destination );
00063 break;
00064 case CODEX_Client::kKeyStoredMsg :
00065 evt = new
00066 SupportedClientResponseEvent< KeyStoredMsg, SignedWriteKeyMsg >(
00067 this, server, mID, m_destination );
00068 break;
00069 case ClientDelegation::kSupportedKeyStoredMsg :
00070 evt = new SupportedKeyStoredEvent( this, server, mID, m_destination );
00071 break;
00072 case CODEX_Client::kBlindKeyMsg :
00073 evt = new SupportedClientResponseEvent< VerifiableBlindKeyMsg,
00074 SignedReadKeyMsg >(
00075 this, server, mID, m_destination );
00076 break;
00077 default :
00078
00079 cerr << "Bad message type: "
00080 << (unsigned int)buff[1]
00081 << endl;
00082 if ( 0 != server ) delete [] server;
00083 if ( 0 != mID ) delete [] mID;
00084 break;
00085 }
00086 if ( NULL != evt )
00087 {
00088 if ( evt->unmarshal( &pBuff, buffLength-2 ) )
00089 {
00090
00091 sendEvent( evt, 0 );
00092 }
00093 else
00094 {
00095
00096 delete evt;
00097 }
00098 }
00099 delete m;
00100 #ifdef TIMING
00101 ActiveTimer.stop();
00102 #endif
00103 }