Merge pull request #1349 from martinjt/MachineKeyProtect
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Dispatcher / MessageProcessingContext.cs
index 578ab414e3231df6a0e27da4453905100b5dfe5d..cb065c84155def5d0c5577a1fc33b468b2d52d78 100644 (file)
-using System;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-using System.ServiceModel;\r
-using System.ServiceModel.Channels;\r
-\r
-namespace System.ServiceModel.Dispatcher \r
-{\r
-       internal class MessageProcessingContext \r
-       {\r
-               OperationContext operation_context;\r
-               RequestContext request_context;\r
-               Message incoming_message;\r
-               IDefaultCommunicationTimeouts timeouts;\r
-\r
-               Message reply_message;          \r
-               InstanceContext instance_context;               \r
-               Exception processingException;\r
-               DispatchOperation operation;\r
-               UserEventsHandler user_events_handler;          \r
-\r
-               public MessageProcessingContext (OperationContext opCtx)\r
-               {\r
-                       operation_context = opCtx;\r
-                       request_context = opCtx.RequestContext;\r
-                       incoming_message = opCtx.IncomingMessage;\r
-                       timeouts = opCtx.CommunicationTimeouts;\r
-                       user_events_handler = new UserEventsHandler (this);\r
-               }\r
-\r
-               public DispatchOperation Operation\r
-               {\r
-                       get { return operation; }\r
-                       set { operation = value; }\r
-               }\r
-\r
-               public Exception ProcessingException\r
-               {\r
-                       get { return processingException; }\r
-                       set { processingException = value; }\r
-               }\r
-               \r
-               public Message ReplyMessage\r
-               {\r
-                       get { return reply_message; }\r
-                       set { reply_message = value; }\r
-               }\r
-\r
-               public IDefaultCommunicationTimeouts CommunicationTimeouts\r
-               {\r
-                       get { return timeouts; }\r
-                       set { timeouts = value; }\r
-               }               \r
-\r
-               public InstanceContext InstanceContext\r
-               {\r
-                       get { return instance_context; }\r
-                       set { instance_context = value; }\r
-               }\r
-\r
-               public Message IncomingMessage\r
-               {\r
-                       get { return incoming_message; }\r
-                       set { incoming_message = value; }\r
-               }\r
-\r
-               public RequestContext RequestContext\r
-               {\r
-                       get { return request_context; }\r
-                       set { request_context = value; }\r
-               }\r
-\r
-               public OperationContext OperationContext\r
-               {\r
-                       get { return operation_context; }\r
-                       set { operation_context = value; }\r
-               }\r
-\r
-               public UserEventsHandler EventsHandler\r
-               {\r
-                       get { return user_events_handler; }\r
-                       set { user_events_handler = value; }\r
-               }\r
-\r
-               public void Reply (bool useTimeout)\r
-               {\r
-                       EventsHandler.BeforeSendReply ();\r
-                       if (useTimeout)\r
-                               RequestContext.Reply (ReplyMessage, CommunicationTimeouts.SendTimeout);\r
-                       else\r
-                               RequestContext.Reply (ReplyMessage);\r
-               }               \r
-       }\r
-\r
-       #region user events implementation\r
-\r
-       internal class UserEventsHandler\r
-       {\r
-               MessageProcessingContext request_context;\r
-               DispatchRuntime dispatch_runtime;\r
-               IClientChannel channel;\r
-               object [] msg_inspectors_states;\r
-               object [] callcontext_initializers_states;\r
-\r
-               public UserEventsHandler (MessageProcessingContext mrc)\r
-               {\r
-                       request_context = mrc;\r
-                       dispatch_runtime = mrc.OperationContext.EndpointDispatcher.DispatchRuntime;\r
-                       msg_inspectors_states = new object [dispatch_runtime.MessageInspectors.Count];\r
-                       channel = request_context.OperationContext.Channel as IClientChannel;\r
-               }\r
-\r
-               public void AfterReceiveRequest ()\r
-               {\r
-                       Message message = request_context.IncomingMessage;\r
-\r
-                       for (int i = 0; i < dispatch_runtime.MessageInspectors.Count; ++i)\r
-                               msg_inspectors_states [i] = dispatch_runtime.MessageInspectors [i].AfterReceiveRequest (\r
-                                          ref message, channel, request_context.InstanceContext);\r
-                       request_context.IncomingMessage = message;\r
-\r
-               }\r
-\r
-               public void BeforeSendReply ()\r
-               {\r
-                       Message toBeChanged = request_context.ReplyMessage;\r
-                       for (int i = 0; i < dispatch_runtime.MessageInspectors.Count; ++i)\r
-                               dispatch_runtime.MessageInspectors [i].BeforeSendReply (ref toBeChanged, msg_inspectors_states [i]);\r
-               }\r
-\r
-               public void BeforeInvoke (DispatchOperation operation)\r
-               {\r
-                       callcontext_initializers_states = new object [operation.CallContextInitializers.Count];\r
-                       for (int i = 0; i < callcontext_initializers_states.Length; ++i)\r
-                               callcontext_initializers_states [i] = operation.CallContextInitializers [i].BeforeInvoke (\r
-                                       request_context.InstanceContext, channel, request_context.IncomingMessage);\r
-\r
-               }\r
-\r
-               public void AfterInvoke (DispatchOperation operation)\r
-               {\r
-                       for (int i = 0; i < callcontext_initializers_states.Length; ++i)\r
-                               operation.CallContextInitializers [i].AfterInvoke (callcontext_initializers_states [i]);\r
-               }\r
-       }\r
-\r
-       #endregion\r
-}\r
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+
+namespace System.ServiceModel.Dispatcher 
+{
+       internal class MessageProcessingContext 
+       {
+               OperationContext operation_context;
+               RequestContext request_context;
+               Message incoming_message;
+
+               Message reply_message;          
+               InstanceContext instance_context;               
+               Exception processingException;
+               DispatchOperation operation;
+               UserEventsHandler user_events_handler;          
+               IChannel reply_or_input;
+
+               public MessageProcessingContext (OperationContext opCtx, IChannel replyOrInput)
+               {
+                       operation_context = opCtx;
+                       request_context = opCtx.RequestContext;
+                       incoming_message = opCtx.IncomingMessage;
+                       user_events_handler = new UserEventsHandler (this);
+                       reply_or_input = replyOrInput;
+               }
+
+               public IChannel Channel {
+                       get { return reply_or_input; }
+               }
+
+               public DispatchOperation Operation
+               {
+                       get { return operation; }
+                       set { operation = value; }
+               }
+
+               public Exception ProcessingException
+               {
+                       get { return processingException; }
+                       set { processingException = value; }
+               }
+               
+               public Message ReplyMessage
+               {
+                       get { return reply_message; }
+                       set { reply_message = value; }
+               }
+
+               public InstanceContext InstanceContext
+               {
+                       get { return instance_context; }
+                       set { instance_context = value; }
+               }
+
+               public Message IncomingMessage
+               {
+                       get { return incoming_message; }
+                       set { incoming_message = value; }
+               }
+
+               public RequestContext RequestContext
+               {
+                       get { return request_context; }
+                       set { request_context = value; }
+               }
+
+               public OperationContext OperationContext
+               {
+                       get { return operation_context; }
+                       set { operation_context = value; }
+               }
+
+               public UserEventsHandler EventsHandler
+               {
+                       get { return user_events_handler; }
+                       set { user_events_handler = value; }
+               }
+
+               public void Reply (IDuplexChannel channel, bool useTimeout)
+               {
+                       EventsHandler.BeforeSendReply ();
+                       if (useTimeout && Operation.Parent.ChannelDispatcher != null) // FIXME: this condition is a workaround for NRE, there might be better way to get timeout value.
+                               channel.Send (ReplyMessage, Operation.Parent.ChannelDispatcher.timeouts.SendTimeout);
+                       else
+                               channel.Send (ReplyMessage);
+               }
+
+               public void Reply (bool useTimeout)
+               {
+                       EventsHandler.BeforeSendReply ();
+                       if (useTimeout && Operation.Parent.ChannelDispatcher != null) // FIXME: this condition is a workaround for NRE, there might be better way to get timeout value.
+                               RequestContext.Reply (ReplyMessage, Operation.Parent.ChannelDispatcher.timeouts.SendTimeout);
+                       else
+                               RequestContext.Reply (ReplyMessage);
+               }
+       }
+
+       #region user events implementation
+
+       internal class UserEventsHandler
+       {
+               MessageProcessingContext request_context;
+               DispatchRuntime dispatch_runtime;
+               IClientChannel channel;
+               object [] msg_inspectors_states;
+               object [] callcontext_initializers_states;
+
+               public UserEventsHandler (MessageProcessingContext mrc)
+               {
+                       request_context = mrc;
+                       dispatch_runtime = mrc.OperationContext.EndpointDispatcher.DispatchRuntime;
+                       msg_inspectors_states = new object [dispatch_runtime.MessageInspectors.Count];
+                       channel = request_context.OperationContext.Channel as IClientChannel;
+               }
+
+               public void AfterReceiveRequest ()
+               {
+                       Message message = request_context.IncomingMessage;
+
+                       for (int i = 0; i < dispatch_runtime.MessageInspectors.Count; ++i)
+                               msg_inspectors_states [i] = dispatch_runtime.MessageInspectors [i].AfterReceiveRequest (
+                                          ref message, channel, request_context.InstanceContext);
+                       request_context.IncomingMessage = message;
+
+               }
+
+               public void BeforeSendReply ()
+               {
+                       Message toBeChanged = request_context.ReplyMessage;
+                       for (int i = 0; i < dispatch_runtime.MessageInspectors.Count; ++i)
+                               dispatch_runtime.MessageInspectors [i].BeforeSendReply (ref toBeChanged, msg_inspectors_states [i]);
+                       request_context.ReplyMessage = toBeChanged;
+               }
+
+               public void BeforeInvoke (DispatchOperation operation)
+               {
+                       callcontext_initializers_states = new object [operation.CallContextInitializers.Count];
+                       for (int i = 0; i < callcontext_initializers_states.Length; ++i)
+                               callcontext_initializers_states [i] = operation.CallContextInitializers [i].BeforeInvoke (
+                                       request_context.InstanceContext, channel, request_context.IncomingMessage);
+
+               }
+
+               public void AfterInvoke (DispatchOperation operation)
+               {
+                       for (int i = 0; i < callcontext_initializers_states.Length; ++i)
+                               operation.CallContextInitializers [i].AfterInvoke (callcontext_initializers_states [i]);
+               }
+       }
+
+       #endregion
+}