2009-05-22 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Channels / HttpChannelManager.cs
1 //\r
2 // HttpChannelManager.cs\r
3 //\r
4 // Author:\r
5 //      Vladimir Krasnov <vladimirk@mainsoft.com>\r
6 //\r
7 // Copyright (C) 2005-2006 Mainsoft, Inc.  http://www.mainsoft.com\r
8 //\r
9 // Permission is hereby granted, free of charge, to any person obtaining\r
10 // a copy of this software and associated documentation files (the\r
11 // "Software"), to deal in the Software without restriction, including\r
12 // without limitation the rights to use, copy, modify, merge, publish,\r
13 // distribute, sublicense, and/or sell copies of the Software, and to\r
14 // permit persons to whom the Software is furnished to do so, subject to\r
15 // the following conditions:\r
16 // \r
17 // The above copyright notice and this permission notice shall be\r
18 // included in all copies or substantial portions of the Software.\r
19 // \r
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
27 //\r
28 using System;
29 using System.Collections.Generic;
30 using System.Text;
31 using System.Net;
32
33 namespace System.ServiceModel.Channels
34 {
35         internal class HttpChannelManager<TChannel> where TChannel : class, IChannel
36         {
37                 static Dictionary<Uri, HttpListener> opened_listeners;\r
38                 static Dictionary<Uri, List<HttpChannelListener<TChannel>>> registered_channels;
39                 HttpChannelListener<TChannel> channel_listener;
40                 HttpListener http_listener;
41
42                 static HttpChannelManager ()
43                 {
44                         opened_listeners = new Dictionary<Uri, HttpListener> ();\r
45                         registered_channels = new Dictionary<Uri, List<HttpChannelListener<TChannel>>> ();
46                 }
47
48                 public HttpChannelManager (HttpChannelListener<TChannel> channel_listener)
49                 {
50                         this.channel_listener = channel_listener;
51                 }
52
53                 public void Open (TimeSpan timeout)
54                 {\r
55                         lock (opened_listeners) {\r
56                                 if (!opened_listeners.ContainsKey (channel_listener.Uri)) {\r
57                                         HttpListener listener = new HttpListener ();\r
58 \r
59                                         string uriString = channel_listener.Uri.ToString ();\r
60                                         if (!uriString.EndsWith ("/", StringComparison.Ordinal))\r
61                                                 uriString += "/";\r
62                                         listener.Prefixes.Add (uriString);\r
63                                         listener.Start ();\r
64 \r
65                                         opened_listeners [channel_listener.Uri] = listener;\r
66                                         List<HttpChannelListener<TChannel>> registeredList = new List<HttpChannelListener<TChannel>> ();                                        \r
67                                         registered_channels [channel_listener.Uri] = registeredList;\r
68                                 }\r
69 \r
70                                 http_listener = opened_listeners [channel_listener.Uri];\r
71                                 registered_channels [channel_listener.Uri].Add (channel_listener);                              \r
72                         }
73                 }
74
75                 public void Stop ()
76                 {\r
77                         lock (opened_listeners) {\r
78                                 if (http_listener == null)\r
79                                         return;\r
80                                 List<HttpChannelListener<TChannel>> channelsList = registered_channels [channel_listener.Uri];\r
81                                 channelsList.Remove (channel_listener);\r
82                                 if (channelsList.Count == 0) {                                  \r
83                                         if (http_listener.IsListening)\r
84                                                 http_listener.Stop ();\r
85                                         ((IDisposable) http_listener).Dispose ();\r
86 \r
87                                         opened_listeners.Remove (channel_listener.Uri);                         \r
88                                 }                               \r
89                         }
90                 }
91
92                 public HttpListener HttpListener
93                 {
94                         get { return http_listener; }
95                 }
96         }       
97 }