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

ClientResponseParser.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: ClientResponseParser.cc,v 1.3 2004/05/19 15:56:51 mmarsh Exp $
00008 //
00009 // $Log: ClientResponseParser.cc,v $
00010 // Revision 1.3  2004/05/19 15:56:51  mmarsh
00011 // *** empty log message ***
00012 //
00013 // Revision 1.2  2003/11/04 22:31:49  mmarsh
00014 // *** empty log message ***
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          // Bad message type for a client request -- drop it.
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          // Enqueue the event.
00091          sendEvent( evt, 0 );
00092       }
00093       else
00094       {
00095          // Bad message format -- drop it.
00096          delete evt;
00097       }
00098    }
00099    delete m;
00100 #ifdef TIMING
00101    ActiveTimer.stop();
00102 #endif
00103 }

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