2009-02-28 Gonzalo Paniagua Javier <gonzalo@novell.com>
[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 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)
45 #if NET_2_0
46                         : base (StringComparer.OrdinalIgnoreCase)
47 #endif
48                 {
49                         auto_fill = Response != null;
50                         IsReadOnly = ReadOnly;
51                 }
52
53                 internal HttpCookieCollection (bool auto_fill, bool read_only)
54 #if NET_2_0
55                         : base (StringComparer.OrdinalIgnoreCase)
56 #endif
57                 {
58                         this.auto_fill = auto_fill;
59                         IsReadOnly = read_only;
60                 }
61
62                 internal HttpCookieCollection (string cookies)
63 #if NET_2_0
64                         : base (StringComparer.OrdinalIgnoreCase)
65 #endif
66                 {
67                         if (cookies == null || cookies == "")
68                                 return;
69
70                         string[] cookie_components = cookies.Split (';');
71                         foreach (string kv in cookie_components) {
72                                 int pos = kv.IndexOf ('=');
73                                 if (pos == -1) {
74                                         /* XXX ugh */
75                                         continue;
76                                 }
77                                 else {
78                                         string key = kv.Substring (0, pos);
79                                         string val = kv.Substring (pos+1);
80
81                                         Add (new HttpCookie (key.Trim (), val.Trim()));
82                                 }
83                         }
84                 }
85
86                 public HttpCookieCollection ()
87 #if NET_2_0
88                         : base (StringComparer.OrdinalIgnoreCase)
89 #endif
90                 {
91                 }
92
93                 public void Add (HttpCookie cookie)
94                 {
95                         if (BaseGet (cookie.Name) != null)
96                                 return;
97
98                         BaseAdd (cookie.Name, cookie);
99                 }
100
101                 public void Clear ()
102                 {
103                         BaseClear ();
104                 }
105
106                 public void CopyTo (Array array, int index)
107                 {
108                         /* XXX this is kind of gross and inefficient
109                          * since it makes a copy of the superclass's
110                          * list */
111                         object[] values = BaseGetAllValues();
112                         values.CopyTo (array, index);
113                 }
114
115                 public string GetKey (int index)
116                 {
117                         HttpCookie cookie = (HttpCookie)BaseGet (index);
118                         if (cookie == null)
119                                 return null;
120                         else
121                                 return cookie.Name;
122                 }
123
124                 public void Remove (string name)
125                 {
126                         BaseRemove (name);
127                 }
128
129                 public void Set (HttpCookie cookie)
130                 {
131                         BaseSet (cookie.Name, cookie);
132                 }
133
134                 public HttpCookie Get (int index)
135                 {
136                         return (HttpCookie)BaseGet (index);
137                 }
138
139                 public HttpCookie Get (string name)
140                 {
141                         return this [name];
142                 }
143
144                 public HttpCookie this [int index]
145                 {
146                         get {
147                                 return (HttpCookie)BaseGet (index);
148                         }
149                 }
150
151                 public HttpCookie this [string name]
152                 {
153                         get {
154                                 HttpCookie cookie = (HttpCookie)BaseGet (name);
155                                 if (!IsReadOnly && auto_fill && cookie == null) {
156                                         cookie = new HttpCookie (name);
157                                         BaseAdd (name, cookie);
158                                 }
159                                 return cookie;
160                         }
161                 }
162
163                 public string[] AllKeys {
164                         get {
165                                 string[] keys = new string [Keys.Count];
166                                 ((ICollection)Keys).CopyTo (keys, 0);
167                                 return keys;
168                         }
169                 }
170         }
171 }
172