2009-05-13 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Dispatcher / BaseRequestProcessor.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.ServiceModel;\r
4 using System.ServiceModel.Channels;\r
5 using System.ServiceModel.Security;\r
6 using System.ServiceModel.Security.Tokens;\r
7 using System.Text;\r
8 \r
9 namespace System.ServiceModel.Dispatcher\r
10 {\r
11         internal class BaseRequestProcessor\r
12         {\r
13                 HandlersChain initialize_handlers_chain = new HandlersChain();\r
14                 HandlersChain process_handlers_chain = new HandlersChain ();\r
15                 HandlersChain error_handlers_chain = new HandlersChain ();\r
16                 HandlersChain finalize_handlers_chain = new HandlersChain ();\r
17 \r
18                 protected BaseRequestProcessor () { }\r
19 \r
20                 protected virtual void ProcessRequest (MessageProcessingContext mrc)\r
21                 {\r
22                         initialize_handlers_chain.ProcessRequestChain (mrc);\r
23 \r
24                         using (new OperationContextScope (mrc.OperationContext)) {\r
25                                 try {\r
26                                         process_handlers_chain.ProcessRequestChain (mrc);\r
27                                 }\r
28                                 catch (Exception e) {\r
29                                         Console.WriteLine ("Exception " + e.Message + " " + e.StackTrace);\r
30                                         mrc.ProcessingException = e;\r
31                                         error_handlers_chain.ProcessRequestChain (mrc);\r
32                                 }\r
33                                 finally {\r
34                                         finalize_handlers_chain.ProcessRequestChain (mrc);\r
35                                 }\r
36                         }\r
37                 }\r
38 \r
39                 public HandlersChain InitializeChain\r
40                 {\r
41                         get { return initialize_handlers_chain; }\r
42                 }\r
43 \r
44                 public HandlersChain ProcessingChain\r
45                 {\r
46                         get { return process_handlers_chain; }\r
47                 }\r
48 \r
49                 public HandlersChain ErrorChain\r
50                 {\r
51                         get { return error_handlers_chain; }\r
52                 }\r
53 \r
54                 public HandlersChain FinalizationChain\r
55                 {\r
56                         get { return finalize_handlers_chain; }\r
57                 }               \r
58         }\r
59 \r
60         internal class HandlersChain\r
61         {\r
62                 BaseRequestProcessorHandler chain;\r
63 \r
64                 public void ProcessRequestChain (MessageProcessingContext mrc)\r
65                 {\r
66                         if (chain != null)\r
67                                 chain.ProcessRequestChain (mrc);\r
68                 }\r
69 \r
70                 public HandlersChain AddHandler (BaseRequestProcessorHandler handler)\r
71                 {\r
72                         if (chain == null) {\r
73                                 chain = handler;\r
74                         }\r
75                         else {\r
76                                 BaseRequestProcessorHandler current = chain;\r
77                                 while (current.Next != null)\r
78                                         current = current.Next;\r
79                                 current.Next = handler;\r
80                         }\r
81                         return this;\r
82                 }\r
83         }\r
84 }\r