Merge pull request #2227 from esdrubal/tzparse
[mono.git] / mcs / class / System.Web / System.Web / HttpCookieCollection.cs
1 //
2 // System.Web.HttpCookieCollection.cs 
3 //
4 // Author:
5 //      Chris Toshok (toshok@novell.com)
6 //
7
8 //
9 // Copyright (C) 2005-2009 Novell, Inc (http://www.novell.com)
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30
31 using System.Collections;
32 using System.Collections.Specialized;
33 using System.Security.Permissions;
34
35 namespace System.Web
36 {
37         // CAS - no InheritanceDemand here as the class is sealed
38         [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
39         public sealed class HttpCookieCollection : NameObjectCollectionBase
40         {
41                 private bool auto_fill = false;
42
43                 [Obsolete ("Don't use this constructor, use the (bool, bool) one, as it's more clear what it does")]
44                 internal HttpCookieCollection (HttpResponse Response, bool ReadOnly) : base (StringComparer.OrdinalIgnoreCase)
45                 {
46                         auto_fill = Response != null;
47                         IsReadOnly = ReadOnly;
48                 }
49
50                 internal HttpCookieCollection (bool auto_fill, bool read_only) : base (StringComparer.OrdinalIgnoreCase)
51                 {
52                         this.auto_fill = auto_fill;
53                         IsReadOnly = read_only;
54                 }
55
56                 internal HttpCookieCollection (string cookies) : base (StringComparer.OrdinalIgnoreCase)
57                 {
58                         if (String.IsNullOrEmpty (cookies))
59                                 return;
60
61                         string[] cookie_components = cookies.Split (';');
62                         foreach (string kv in cookie_components) {
63                                 int pos = kv.IndexOf ('=');
64                                 if (pos == -1) {
65                                         /* XXX ugh */
66                                         continue;
67                                 }
68                                 else {
69                                         string key = kv.Substring (0, pos);
70                                         string val = kv.Substring (pos+1);
71
72                                         Add (new HttpCookie (key.Trim (), val.Trim()));
73                                 }
74                         }
75                 }
76
77                 public HttpCookieCollection () : base (StringComparer.OrdinalIgnoreCase)
78                 {
79                 }
80
81                 public void Add (HttpCookie cookie)
82                 {
83                         BaseAdd (cookie.Name, cookie);
84                 }
85
86                 public void Clear ()
87                 {
88                         BaseClear ();
89                 }
90
91                 public void CopyTo (Array array, int index)
92                 {
93                         /* XXX this is kind of gross and inefficient
94                          * since it makes a copy of the superclass's
95                          * list */
96                         object[] values = BaseGetAllValues();
97                         values.CopyTo (array, index);
98                 }
99
100                 public string GetKey (int index)
101                 {
102                         HttpCookie cookie = (HttpCookie)BaseGet (index);
103                         if (cookie == null)
104                                 return null;
105                         else
106                                 return cookie.Name;
107                 }
108
109                 public void Remove (string name)
110                 {
111                         BaseRemove (name);
112                 }
113
114                 public void Set (HttpCookie cookie)
115                 {
116                         BaseSet (cookie.Name, cookie);
117                 }
118
119                 public HttpCookie Get (int index)
120                 {
121                         return (HttpCookie)BaseGet (index);
122                 }
123
124                 public HttpCookie Get (string name)
125                 {
126                         return this [name];
127                 }
128
129                 public HttpCookie this [int index]
130                 {
131                         get {
132                                 return (HttpCookie)BaseGet (index);
133                         }
134                 }
135
136                 public HttpCookie this [string name]
137                 {
138                         get {
139                                 HttpCookie cookie = (HttpCookie)BaseGet (name);
140                                 if (!IsReadOnly && auto_fill && cookie == null) {
141                                         cookie = new HttpCookie (name);
142                                         BaseAdd (name, cookie);
143                                 }
144                                 return cookie;
145                         }
146                 }
147
148                 public string[] AllKeys {
149                         get {
150                                 string[] keys = new string [Keys.Count];
151                                 ((ICollection)Keys).CopyTo (keys, 0);
152                                 return keys;
153                         }
154                 }
155         }
156 }
157