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