00001 #ifndef _IT_BUS_PDK_MESSAGING_OP_HANDLER_H_
00002 #define _IT_BUS_PDK_MESSAGING_OP_HANDLER_H_
00003
00004
00005
00006
00007 #include <it_bus/api_defines.h>
00008 #include <it_bus/message_writer.h>
00009 #include <it_bus/message_reader.h>
00010 #include <it_bus/operation.h>
00011 #include <it_bus_pdk/transport_readable_message.h>
00012 #include <it_bus_pdk/transport_writable_message.h>
00013 #include <it_bus_pdk/messaging_port.h>
00014 #include <it_bus_pdk/pass_thru_operation.h>
00015
00016 namespace IT_Bus
00017 {
00018 class BusContextRegistry;
00019 class Endpoint;
00020 class SendMessageContext;
00021 class DispatchInfo;
00022
00023 class IT_BUS_API MessagingServerOperation : public ServerOperation, public ServerOperationPassThrough
00024 {
00025 public:
00034 MessagingServerOperation(
00035 MessageReader & message_reader,
00036 MessageWriter* message_writer,
00037 const IT_WSDL::WSDLPort & wsdl_port,
00038 const IT_WSDL::WSDLOperation& wsdl_operation,
00039 MessagingPort & messaging_port,
00040 BusContextRegistry& context_registry,
00041 ContextContainer* request_contexts,
00042 ContextContainer* reply_contexts
00043 );
00044
00045 virtual
00046 ~MessagingServerOperation();
00047
00048 virtual ReadableMessage &
00049 get_input_message();
00050
00051 virtual WritableMessage &
00052 get_output_message();
00053
00054 virtual TransportReadableMessage &
00055 get_transport_input_message();
00056
00057 virtual TransportWritableMessage &
00058 get_transport_output_message();
00059
00060 virtual ContextContainer*
00061 request_contexts();
00062
00063 virtual ContextContainer*
00064 reply_contexts();
00065
00066 virtual void
00067 read();
00068
00069 virtual void
00070 write();
00071
00072 void
00073 exception_occured();
00074
00075 virtual MessageReader*
00076 get_message_reader();
00077
00078 virtual MessageWriter*
00079 get_message_writer();
00080
00081 void
00082 set_contexts(
00083 ContextContainer* request_contexts,
00084 ContextContainer* reply_contexts
00085 );
00086
00087 virtual ServerOperationPassThrough*
00088 get_server_pass_through();
00089
00090
00091 BinaryBuffer*
00092 get_passthru_reply();
00093
00094 BinaryBuffer*
00095 get_passthru_request();
00096
00097 void
00098 enable_passthru();
00099
00100
00101
00102 void
00103 set_passthru_reply(
00104 BinaryBuffer* buffer
00105 );
00106
00107 void
00108 set_passthru_request(
00109 BinaryBuffer* buffer
00110 );
00111
00112 bool
00113 passthru_enabled();
00114
00115 void
00116 set_message_writer(
00117 MessageWriter*
00118 );
00119
00120 void
00121 set_send_message_context(
00122 SendMessageContext* message_context
00123 );
00124
00125 SendMessageContext*
00126 get_send_message_context();
00127
00128 void
00129 set_dispatch_context(
00130 DispatchInfo* dispatch_context
00131 );
00132
00133 DispatchInfo*
00134 get_dispatch_context();
00135
00136 CorrelationId
00137 get_correlation_id() const;
00138
00139 void
00140 notify_async_dispatch();
00141
00142 void
00143 set_reply_contexts(
00144 ContextContainer* container
00145 );
00146
00147 private:
00148 MessagingServerOperation &
00149 operator = (
00150 const MessagingServerOperation& rhs
00151 );
00152
00153 MessagingServerOperation(
00154 const MessagingServerOperation& rhs
00155 );
00156
00157 void
00158 take_contexts();
00159
00160
00161 MessageWriter* m_message_writer;
00162 MessageReader& m_message_reader;
00163 TransportWritableMessage m_output_message;
00164 TransportReadableMessage m_input_message;
00165
00166 MessagingPort& m_messaging_port;
00167 BusContextRegistry& m_context_registry;
00168 ContextContainer* m_request_contexts;
00169 ContextContainer* m_reply_contexts;
00170 BinaryBuffer* m_passthru_request_buffer;
00171 BinaryBuffer* m_passthru_reply_buffer;
00172 bool m_passthru_enabled;
00173 bool m_contexts_in_tls;
00174 SendMessageContext* m_message_context;
00175 DispatchInfo* m_dispatch_context;
00176 bool m_async_dispatch;
00177 };
00178
00179 inline void
00180 MessagingServerOperation::set_reply_contexts(
00181 ContextContainer* container
00182 )
00183 {
00184 assert(m_async_dispatch);
00185 assert(m_reply_contexts == 0);
00186 m_reply_contexts = container;
00187 }
00188 }
00189
00190 #endif