**** Merged from MCS ****
[mono-project.git] / mcs / class / System.Web / System.Web.Configuration / GlobalizationConfigurationHandler.cs
blobf8499c5f29a991bca7def73be37ff6c0f8fdabe2
1 //
2 // System.Web.Configuration.GlobalizationConfigurationHandler
3 //
4 // Authors:
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //
7 // (C) 2003 Ximian, Inc (http://www.ximian.com)
8 //
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.
31 using System.Configuration;
32 using System.Globalization;
33 using System.Text;
34 using System.Xml;
36 namespace System.Web.Configuration
38 class GlobalizationConfigurationHandler : IConfigurationSectionHandler
40 static bool encoding_warning;
41 static bool culture_warning;
43 public object Create (object parent, object configContext, XmlNode section)
45 GlobalizationConfiguration config = new GlobalizationConfiguration (parent);
47 if (section.HasChildNodes)
48 ThrowException ("No child nodes allowed here.", section);
50 string attvalue = AttValue ("requestEncoding", section, true);
51 if (attvalue == null)
52 config.RequestEncoding = Encoding.Default;
53 else
54 config.RequestEncoding = GetEncoding (section, "requestEncoding", attvalue);
56 attvalue = AttValue ("responseEncoding", section, true);
57 if (attvalue == null)
58 config.ResponseEncoding = Encoding.Default;
59 else
60 config.ResponseEncoding = GetEncoding (section, "responseEncoding", attvalue);
62 attvalue = AttValue ("fileEncoding", section, true);
63 if (attvalue == null)
64 config.FileEncoding = Encoding.Default;
65 else
66 config.FileEncoding = GetEncoding (section, "fileEncoding", attvalue);
68 attvalue = AttValue ("culture", section, true);
69 if (attvalue != null)
70 config.Culture = GetCulture (section, "culture", attvalue);
72 attvalue = AttValue ("uiculture", section, true);
73 if (attvalue != null)
74 config.UICulture = GetCulture (section, "uiculture", attvalue);
76 if (section.Attributes == null || section.Attributes.Count != 0)
77 ThrowException ("Unknown attribute(s).", section);
79 return config;
82 static Encoding GetEncoding (XmlNode section, string att, string enc)
84 Encoding encoding = null;
85 try {
86 switch (enc.ToLower ()) {
87 case "utf-16le":
88 case "utf-16":
89 case "ucs-2":
90 case "unicode":
91 case "iso-10646-ucs-2":
92 encoding = new UnicodeEncoding (false, true);
93 break;
94 case "utf-16be":
95 case "unicodefffe":
96 encoding = new UnicodeEncoding (true, true);
97 break;
98 case "utf-8":
99 case "unicode-1-1-utf-8":
100 case "unicode-2-0-utf-8":
101 case "x-unicode-1-1-utf-8":
102 case "x-unicode-2-0-utf-8":
103 encoding = new UTF8Encoding (false, false);
104 break;
105 default:
106 encoding = Encoding.GetEncoding (enc);
107 break;
109 } catch {
110 EncodingFailed (section, att, enc);
111 encoding = new UTF8Encoding (false, false);
114 return encoding;
117 static CultureInfo GetCulture (XmlNode section, string att, string cul)
119 CultureInfo culture = null;
120 try {
121 culture = new CultureInfo (cul);
122 } catch {
123 CultureFailed (section, att, cul);
124 culture = new CultureInfo (0x007f); // Invariant
127 return culture;
130 static void EncodingFailed (XmlNode section, string att, string enc)
132 if (encoding_warning)
133 return;
135 encoding_warning = true;
136 Console.WriteLine ("Encoding {1} cannot be loaded. Perhaps your runtime \n" +
137 "don't have ICU support?\n{0}=\"{1}\"\n", att, enc);
140 static void CultureFailed (XmlNode section, string att, string cul)
142 if (culture_warning)
143 return;
145 culture_warning = true;
146 Console.WriteLine ("Culture {1} cannot be loaded. Perhaps your runtime \n" +
147 "don't have ICU support?\n{0}=\"{1}\"\n", att, cul);
150 // A few methods to save some typing
151 static string AttValue (string name, XmlNode node, bool optional)
153 return HandlersUtil.ExtractAttributeValue (name, node, optional);
156 static string AttValue (string name, XmlNode node)
158 return HandlersUtil.ExtractAttributeValue (name, node, true);
161 static void ThrowException (string message, XmlNode node)
163 HandlersUtil.ThrowException (message, node);