style
[mono.git] / mcs / class / System.Web / System.Web / HttpValueCollection.cs
1 // 
2 // System.Web.HttpValueCollection
3 //
4 // Author:
5 //      Patrik Torstensson (Patrik.Torstensson@labs2.com)
6 //
7 using System;
8 using System.Collections.Specialized;
9 using System.Runtime.Serialization;
10 using System.Text;
11 using System.Web.Util;
12
13 namespace System.Web
14 {
15         [Serializable]
16         class HttpValueCollection : NameValueCollection
17         {
18                 bool _bHeaders;
19
20                 internal HttpValueCollection ()
21                 {
22                         _bHeaders = false;
23                 }
24
25                 internal HttpValueCollection (string sData)
26                 {
27                         FillFromQueryString (sData, WebEncoding.Encoding);
28                         IsReadOnly = true;
29                 }
30
31                 internal HttpValueCollection(string sData, bool ReadOnly, Encoding encoding)
32                 {
33                         FillFromQueryString (sData, encoding);
34                         IsReadOnly = ReadOnly;
35                 }
36
37                 protected HttpValueCollection (SerializationInfo info, StreamingContext context)
38                         : base (info, context)
39                 {
40                 }
41
42                 // string = header1: value1\r\nheader2: value2
43                 internal void FillFromHeaders (string sHeaders, Encoding encoding)
44                 {
45                         _bHeaders = true;
46                         char [] arrSplitValue = new char [] {':'};
47                         string sKey, sValue;
48
49                         sKey = "";
50                         sValue = "";
51
52                         string [] arrValues = sHeaders.Split(new char [] {'\r', '\n'});
53                         foreach (string sLine in arrValues) {
54                                 string [] arrKeyValue = sLine.Split (arrSplitValue);
55                                 if (arrKeyValue.Length == 1 && arrKeyValue [0].Length == 0) {
56                                         // Empty \r or \n is ignored
57                                         continue;
58                                 }
59
60                                 if (arrKeyValue[0] != sKey && sKey.Length > 0) {
61                                         Add (HttpUtility.UrlDecode (sKey, encoding),
62                                              HttpUtility.UrlDecode (sValue, encoding));
63                                 }
64
65                                 if (arrKeyValue.Length == 1) {
66                                         sValue += "\r\n" + arrKeyValue [0].Trim();
67                                         continue;
68                                 } else if (arrKeyValue.Length == 2) {
69                                         if (arrKeyValue[0].Length == 0) {
70                                                 sValue += arrKeyValue [1].Trim();
71                                                 continue;
72                                         }
73
74                                         sKey = arrKeyValue [0].Trim();
75                                         sValue = arrKeyValue [1].Trim();
76                                 } 
77                         }
78
79                         if (sKey.Length > 0) {
80                                 Add (HttpUtility.UrlDecode (sKey, encoding),
81                                      HttpUtility.UrlDecode (sValue, encoding));
82                         }
83                 }
84
85                 internal void FillFromHeaders (string sData)
86                 {
87                         FillFromHeaders (sData, WebEncoding.Encoding);
88                 }
89
90                 // String = test=aaa&kalle=nisse
91                 internal void FillFromQueryString(string sData, Encoding encoding)
92                 {
93                         _bHeaders = false;
94
95                         char [] arrSplitValue = new char [] {'='};
96
97                         string [] arrValues = sData.Split (new char [] {'&'});
98                         foreach (string sValue in arrValues) {
99                                 string [] arrKeyValue = sValue.Split (arrSplitValue);
100                                 switch (arrKeyValue.Length) {
101                                 case 1: // Add key only
102                                         Add (HttpUtility.UrlDecode(arrKeyValue[0].Trim(), encoding), string.Empty);
103                                         break;
104                                 case 2:
105                                         Add(HttpUtility.UrlDecode (arrKeyValue [0].Trim(), encoding), 
106                                             HttpUtility.UrlDecode (arrKeyValue [1].Trim(), encoding));
107                                         break;
108                                 default:
109                                         throw new InvalidOperationException ("Data is malformed");
110                                 }
111                         }               
112                 }
113
114                 internal void FillFromQueryString (string sData)
115                 {
116                         FillFromQueryString (sData, WebEncoding.Encoding);
117                 }
118
119                 internal void FillFromCookieString (string sData)
120                 {
121                         FillFromQueryString (sData, WebEncoding.Encoding);
122                 }
123
124                 internal void MakeReadOnly ()
125                 {
126                         IsReadOnly = true;
127                 }
128
129                 internal void MakeReadWrite ()
130                 {
131                         IsReadOnly = false;
132                 }
133
134                 internal void Merge (NameValueCollection oData)
135                 {
136                         foreach (string sKey in oData)
137                                 Add (sKey, oData [sKey]);
138                 }
139
140                 internal void Reset ()
141                 {
142                         Clear ();
143                 }
144
145                 [MonoTODO("string ToString(bool UrlEncode)")]
146                 internal string ToString (bool UrlEncode)
147                 {
148                         if (_bHeaders) {
149                         }
150
151                         // TODO: Should return a correctly formated string (different depending on header flag)
152                         throw new NotImplementedException ();
153                 }
154
155                 virtual new public string ToString ()
156                 {
157                         return ToString (false);
158                 }
159         }
160 }
161