Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   Related Pages  

MessageParser.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: MessageParser.cc,v 1.3 2004/05/19 15:56:24 mmarsh Exp $
00008 //
00009 // $Log: MessageParser.cc,v $
00010 // Revision 1.3  2004/05/19 15:56:24  mmarsh
00011 // Added copyright and license statements.
00012 //
00013 // Revision 1.2  2003/11/04 22:31:45  mmarsh
00014 // *** empty log message ***
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          // Bad message type for an APSS request -- drop it.
00068          if ( 0 != server ) delete [] server;
00069          if ( 0 != mID ) delete [] mID;
00070 //         cerr << "Bad message type: "
00071 //              << (unsigned int)buff[0]
00072 //              << endl;
00073          break;
00074    }
00075    if ( 0 != evt )
00076    {
00077       if ( evt->unmarshal( &pBuff, buffLength ) )
00078       {
00079          // Enqueue the event.
00080          sendEvent( evt, 0 );
00081       }
00082       else
00083       {
00084          // Bad message format -- drop it.
00085          delete evt;
00086       }
00087    }
00088    delete m;
00089 #ifdef TIMING
00090    ActiveTimer.stop();
00091 #endif
00092 }

Generated on Wed Jun 2 16:32:55 2004 for COrnell Data EXchange (CODEX) by doxygen1.2.18