Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ServerMessageDispatcher.cc

00001 /*
00002  * Copyright 2003 Michael A. Marsh, Cornell University. All rights reserved.
00003  * This software is released under the modified BSD license.
00004  * See the file LICENSE in the top-level directory for details.
00005  */
00006 //
00007 // $Id: ServerMessageDispatcher.cc,v 1.3 2004/05/19 15:56:58 mmarsh Exp $
00008 //
00009 // $Log: ServerMessageDispatcher.cc,v $
00010 // Revision 1.3  2004/05/19 15:56:58  mmarsh
00011 // *** empty log message ***
00012 //
00013 // Revision 1.2  2003/11/04 22:31:51  mmarsh
00014 // *** empty log message ***
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    // The message still has all of its headers.
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       // We're responsible for cleaning up the message passed in.
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       // We're responsible for cleaning up the message passed in.
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    // We're responsible for cleaning up the message passed in.
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 }

Generated on Fri May 6 17:41:14 2005 for COrnell Data EXchange (CODEX) by  doxygen 1.4.1