00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "ServerMessageDispatcher.h"
00019 #include "ServerState.h"
00020
00021 using namespace CODEX_Server;
00022
00023 void
00024 ServerMessageDispatcher::operator()( CODEX_Quorum::Message* m )
00025 {
00026
00027 if ( NULL == m )
00028 {
00029 return;
00030 }
00031 int header_length = ServerState::nSID + ServerState::nMID;
00032 if ( m->length() < header_length + 2 )
00033 {
00034
00035 delete m;
00036 return;
00037 }
00038 unsigned char mType = m->buffer()[ header_length ];
00039 MapType::const_iterator itr = m_parsers.find(mType);
00040 if ( m_parsers.end() == itr )
00041 {
00042
00043 cout << "no parser found for " << (int)mType << endl;
00044 delete m;
00045 return;
00046 }
00047 unsigned char* server = new unsigned char[ServerState::nSID];
00048 if ( NULL == server )
00049 {
00050 delete m;
00051 return;
00052 }
00053 memcpy( server, m->buffer(), ServerState::nSID );
00054 unsigned char* mID = new unsigned char[ServerState::nMID];
00055 if ( NULL == mID )
00056 {
00057 delete [] server;
00058 delete m;
00059 return;
00060 }
00061 memcpy( mID, m->buffer() + ServerState::nSID, ServerState::nMID );
00062 CODEX_Quorum::Message* msg =
00063 new CODEX_Quorum::Message( m->buffer() + header_length + 1 ,
00064 m->length() - header_length - 1 );
00065
00066 delete m;
00067 (*itr->second)( server, mID, msg );
00068 }
00069
00070 bool
00071 ServerMessageDispatcher::addParser( unsigned char mType, MessageParser* mp )
00072 {
00073 return m_parsers.insert( MapType::value_type( mType, mp ) ).second;
00074 }