2004-02-17 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web / HttpCacheVaryByParams.cs
1 // \r
2 // System.Web.HttpCacheVaryByParams\r
3 //\r
4 // Author:\r
5 //   Patrik Torstensson (Patrik.Torstensson@labs2.com)\r
6 //\r
7 using System;\r
8 using System.Text;\r
9 using System.Collections;\r
10 \r
11 namespace System.Web {\r
12    public sealed class HttpCacheVaryByParams {\r
13       private Hashtable _Items;\r
14       private bool _IgnoreParams;\r
15       private bool _Wildcard;\r
16       private bool _Dirty;\r
17 \r
18       // TODO: We need internal methods here to communicate with CachePolicy\r
19 \r
20       internal HttpCacheVaryByParams() {\r
21       }\r
22 \r
23       public bool IgnoreParams {\r
24          get {\r
25             return _IgnoreParams;\r
26          }\r
27 \r
28          set {\r
29             if (_Wildcard || null != _Items) {\r
30                return;\r
31             }\r
32 \r
33             _Dirty = true;\r
34             _IgnoreParams = value;\r
35          }\r
36       }\r
37 \r
38       internal HttpResponseHeader GetResponseHeader ()\r
39       {\r
40               if (_IgnoreParams)\r
41                       throw new Exception ("Can not get VaryByParams Header when params are ignored.");\r
42 \r
43               if (_Wildcard)\r
44                       return new HttpResponseHeader ("Vary", "*");\r
45 \r
46               if (_Items == null)\r
47                       return null;\r
48 \r
49               StringBuilder builder = new StringBuilder ();\r
50               foreach (string item in _Items.Keys) {\r
51                       if (!(bool) _Items [item])\r
52                               continue;\r
53                       builder.Append (item + ";");\r
54               }\r
55 \r
56               return new HttpResponseHeader ("Vary", builder.ToString ());\r
57       }\r
58            \r
59       public bool this[string header] {\r
60          get {\r
61             if (null == header) {\r
62                throw new ArgumentNullException("header");\r
63             }\r
64 \r
65             if (header == "*") {\r
66                return _Wildcard;\r
67             }\r
68 \r
69             if (null != _Items) {\r
70                return _Items.ContainsKey(header);\r
71             }\r
72 \r
73             return false;\r
74          }\r
75 \r
76          set {\r
77             if (null == header) {\r
78                throw new ArgumentNullException("header");\r
79             }\r
80 \r
81             if (!(value)) {\r
82                return;\r
83             }\r
84 \r
85             _Dirty = true;\r
86 \r
87             if (header == "*") {\r
88                _Wildcard = true;\r
89                _Items = null;\r
90                return;\r
91             }\r
92 \r
93             if (!_Wildcard) {\r
94                if (null == _Items) {\r
95                   _Items = new Hashtable();\r
96                }\r
97 \r
98                _Items[header] = true;\r
99             }\r
100          }\r
101       }\r
102 \r
103            internal string [] GetParamNames ()\r
104            {\r
105                    if (_Items == null)\r
106                            return null;\r
107 \r
108                    string[] prms = new string [_Items.Count];\r
109                    int i = 0;\r
110                    foreach (string prm in _Items.Keys)\r
111                            prms [i++] = prm;\r
112                    \r
113                    return prms;\r
114            }\r
115    }\r
116 }\r