00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __CODEX_APSS_ROUTEDMESSAGEEVENT_H__
00019 #define __CODEX_APSS_ROUTEDMESSAGEEVENT_H__
00020
00021
00022 #include "CODEX_Events/Event.h"
00023 #include "CODEX_Server/RoutingInfo.h"
00024
00025 namespace CODEX_APSS
00026 {
00027 class RoutedMessageHandler;
00028
00035 class RoutedMessageEventBase : public CODEX_Events::EventBase,
00036 public CODEX_Server::RoutingInfo
00037 {
00038 public :
00044 RoutedMessageEventBase( CODEX_Events::Activity* source,
00045 unsigned char* server,
00046 unsigned char* seqNum ) :
00047 CODEX_Events::EventBase( source ),
00048 CODEX_Server::RoutingInfo( server, seqNum )
00049 {}
00050
00052 virtual ~RoutedMessageEventBase() {}
00053
00055 virtual bool unmarshal( unsigned char ** pp, long length ) = 0;
00056 };
00057
00062 template< class MT >
00063 class RoutedMessageEvent : public RoutedMessageEventBase
00064 {
00065 public :
00070 RoutedMessageEvent( CODEX_Events::Activity* source,
00071 RoutedMessageHandler* destination,
00072 unsigned char* server,
00073 unsigned char* seqNum ) :
00074 RoutedMessageEventBase( source, server, seqNum ),
00075 m_destination( destination ),
00076 m_failed( false )
00077 {}
00078
00080 virtual ~RoutedMessageEvent() {}
00081
00082 bool handle() { return m_destination->handler( *this ); }
00083
00085 void reRoute( RoutedMessageHandler* newDestination )
00086 {
00087 m_destination = newDestination;
00088 }
00089
00091 const MT& message() const { return m_message; }
00092
00094 bool failed() const { return m_failed; }
00095
00097 void setFailed() { m_failed = true; }
00098
00100 bool unmarshal( unsigned char ** pp, long length )
00101 {
00102 return ( 0 != m_message.unmarshal( 0, pp, length ) );
00103 }
00104
00105 private :
00106 RoutedMessageHandler* m_destination;
00107 MT m_message;
00108 bool m_failed;
00109 };
00110
00111 }
00112
00113 #endif