merge r98447
[mono.git] / mcs / class / Mainsoft.Web / Mainsoft.Web.Hosting / SessionWrapper.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Web;\r
5 using System.Web.J2EE;\r
6 using System.Web.SessionState;\r
7 \r
8 namespace Mainsoft.Web.Hosting\r
9 {\r
10         public static class SessionWrapper\r
11         {\r
12                 static readonly Type IRequiresSessionStateType = typeof (IRequiresSessionState);\r
13                 static readonly Type IReadOnlySessionStateType = typeof (IReadOnlySessionState);\r
14 \r
15                 public static IHttpHandler WrapHandler (IHttpHandler handler) {\r
16                         Type type = (Type) ((IServiceProvider) handler).GetService (typeof (Type));\r
17 \r
18                         if (IRequiresSessionStateType.IsAssignableFrom (type))\r
19                                 return IReadOnlySessionStateType.IsAssignableFrom (type) ?\r
20                                         (handler is IHttpExtendedHandler ? (IHttpHandler) new ReadOnlySessionWrapperExtendedHandler ((IHttpExtendedHandler) handler) : new ReadOnlySessionWrapperHandler (handler)) :\r
21                                         (handler is IHttpExtendedHandler ? new SessionWrapperExtendedHandler ((IHttpExtendedHandler) handler) : new SessionWrapperHandler (handler));\r
22                         return handler;\r
23                 }\r
24 \r
25                 #region SessionWrappers\r
26 \r
27                 class SessionWrapperHandler : IHttpHandler, IRequiresSessionState, IServiceProvider\r
28                 {\r
29                         protected readonly IHttpHandler _handler;\r
30 \r
31                         public SessionWrapperHandler (IHttpHandler handler) {\r
32                                 _handler = handler;\r
33                         }\r
34 \r
35                         public bool IsReusable {\r
36                                 get { return _handler.IsReusable; }\r
37                         }\r
38 \r
39                         public void ProcessRequest (HttpContext context) {\r
40                                 _handler.ProcessRequest (context);\r
41                         }\r
42 \r
43                         public object GetService (Type serviceType) {\r
44                                 return ((IServiceProvider) _handler).GetService (serviceType);\r
45                         }\r
46                 }\r
47 \r
48                 sealed class ReadOnlySessionWrapperHandler : SessionWrapperHandler, IReadOnlySessionState\r
49                 {\r
50                         public ReadOnlySessionWrapperHandler (IHttpHandler handler) : base (handler) { }\r
51                 }\r
52 \r
53                 #endregion\r
54 \r
55                 #region ExtendedSessionWrappers\r
56 \r
57                 class SessionWrapperExtendedHandler : SessionWrapperHandler, IHttpExtendedHandler\r
58                 {\r
59                         public SessionWrapperExtendedHandler (IHttpExtendedHandler handler)\r
60                                 : base (handler) {\r
61                         }\r
62 \r
63                         public bool IsCompleted {\r
64                                 get { return ((IHttpExtendedHandler) _handler).IsCompleted; }\r
65                         }\r
66                 }\r
67 \r
68                 sealed class ReadOnlySessionWrapperExtendedHandler : SessionWrapperExtendedHandler, IReadOnlySessionState\r
69                 {\r
70                         public ReadOnlySessionWrapperExtendedHandler (IHttpExtendedHandler handler) : base (handler) { }\r
71                 }\r
72 \r
73                 #endregion\r
74         }\r
75 }\r