flush
[mcs.git] / class / Mono.Data.Tds / Mono.Data.Tds.Protocol / TdsCollation.cs
blobc1cf111d16333e91cd9004ea006a0f6c93927e8a
1 //
2 // Mono.Data.Tds.Protocol.TdsCollation.cs
3 //
4 // Authors:
5 // Veerapuram Varadhan <vvaradhan@novell.com>
6 // Dmitry S. Kataev <dmitryskey@hotmail.com>
7 //
8 // Charset parts - Copyright (C) 2006,2007 Dmitry S. Kataev
9 // Copyright (C) Novell Inc, 2009
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 //
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 using System;
34 using System.Collections;
35 using System.Text;
37 namespace Mono.Data.Tds {
38 internal static class TdsCollation
40 public static int LCID (byte[] collation)
42 if (collation == null)
43 return -1;
45 return (collation[0] | (collation[1] << 8) | ((collation[2] & 0x0F) << 16));
48 public static int CollationFlags (byte[] collation)
50 if (collation == null)
51 return -1;
53 return ((collation[2] & 0xF0) | ((collation[3] & 0x0F) << 4));
56 public static int Version (byte[] collation)
58 if (collation == null)
59 return -1;
61 return (collation[3] & 0xF0);
64 public static int SortId (byte[] collation)
66 if (collation == null)
67 return -1;
69 return (collation[4]);
73 internal static class TdsCharset
75 private static Hashtable lcidCodes = new Hashtable();
76 private static Hashtable sortCodes = new Hashtable();
78 static TdsCharset ()
80 lcidCodes[0x436] = 1252;
81 lcidCodes[0x41C] = 1250;
82 lcidCodes[0x401] = 1256;
83 lcidCodes[0x801] = 1256;
84 lcidCodes[0xC01] = 1256;
85 lcidCodes[0x1001] = 1256;
86 lcidCodes[0x1401] = 1256;
87 lcidCodes[0x1801] = 1256;
88 lcidCodes[0x1C01] = 1256;
89 lcidCodes[0x2001] = 1256;
90 lcidCodes[0x2401] = 1256;
91 lcidCodes[0x2801] = 1256;
92 lcidCodes[0x2C01] = 1256;
93 lcidCodes[0x3001] = 1256;
94 lcidCodes[0x3401] = 1256;
95 lcidCodes[0x3801] = 1256;
96 lcidCodes[0x3C01] = 1256;
97 lcidCodes[0x4001] = 1256;
98 lcidCodes[0x42D] = 1252;
99 lcidCodes[0x423] = 1251;
100 lcidCodes[0x402] = 1251;
101 lcidCodes[0x403] = 1252;
102 lcidCodes[0x30404] = 950;
103 lcidCodes[0x404] = 950;
104 lcidCodes[0x804] = 936;
105 lcidCodes[0x20804] = 936;
106 lcidCodes[0x1004] = 936;
107 lcidCodes[0x41a] = 1250;
108 lcidCodes[0x405] = 1250;
109 lcidCodes[0x406] = 1252;
110 lcidCodes[0x413] = 1252;
111 lcidCodes[0x813] = 1252;
112 lcidCodes[0x409] = 1252;
113 lcidCodes[0x809] = 1252;
114 lcidCodes[0x1009] = 1252;
115 lcidCodes[0x1409] = 1252;
116 lcidCodes[0xC09] = 1252;
117 lcidCodes[0x1809] = 1252;
118 lcidCodes[0x1C09] = 1252;
119 lcidCodes[0x2409] = 1252;
120 lcidCodes[0x2009] = 1252;
121 lcidCodes[0x425] = 1257;
122 lcidCodes[0x0438] = 1252;
123 lcidCodes[0x429] = 1256;
124 lcidCodes[0x40B] = 1252;
125 lcidCodes[0x40C] = 1252;
126 lcidCodes[0x80C] = 1252;
127 lcidCodes[0x100C] = 1252;
128 lcidCodes[0xC0C] = 1252;
129 lcidCodes[0x140C] = 1252;
130 lcidCodes[0x10437] = 1252;
131 lcidCodes[0x10407] = 1252;
132 lcidCodes[0x407] = 1252;
133 lcidCodes[0x807] = 1252;
134 lcidCodes[0xC07] = 1252;
135 lcidCodes[0x1007] = 1252;
136 lcidCodes[0x1407] = 1252;
137 lcidCodes[0x408] = 1253;
138 lcidCodes[0x40D] = 1255;
139 lcidCodes[0x439] = 65001;
140 lcidCodes[0x40E] = 1250;
141 lcidCodes[0x104E] = 1250;
142 lcidCodes[0x40F] = 1252;
143 lcidCodes[0x421] = 1252;
144 lcidCodes[0x410] = 1252;
145 lcidCodes[0x810] = 1252;
146 lcidCodes[0x411] = 932;
147 lcidCodes[0x10411] = 932;
148 lcidCodes[0x412] = 949;
149 lcidCodes[0x412] = 949;
150 lcidCodes[0x426] = 1257;
151 lcidCodes[0x427] = 1257;
152 lcidCodes[0x827] = 1257;
153 lcidCodes[0x41C] = 1251;
154 lcidCodes[0x414] = 1252;
155 lcidCodes[0x814] = 1252;
156 lcidCodes[0x415] = 1250;
157 lcidCodes[0x816] = 1252;
158 lcidCodes[0x416] = 1252;
159 lcidCodes[0x418] = 1250;
160 lcidCodes[0x419] = 1251;
161 lcidCodes[0x81A] = 1251;
162 lcidCodes[0xC1A] = 1251;
163 lcidCodes[0x41B] = 1250;
164 lcidCodes[0x424] = 1250;
165 lcidCodes[0x80A] = 1252;
166 lcidCodes[0x40A] = 1252;
167 lcidCodes[0xC0A] = 1252;
168 lcidCodes[0x100A] = 1252;
169 lcidCodes[0x140A] = 1252;
170 lcidCodes[0x180A] = 1252;
171 lcidCodes[0x1C0A] = 1252;
172 lcidCodes[0x200A] = 1252;
173 lcidCodes[0x240A] = 1252;
174 lcidCodes[0x280A] = 1252;
175 lcidCodes[0x2C0A] = 1252;
176 lcidCodes[0x300A] = 1252;
177 lcidCodes[0x340A] = 1252;
178 lcidCodes[0x380A] = 1252;
179 lcidCodes[0x3C0A] = 1252;
180 lcidCodes[0x400A] = 1252;
181 lcidCodes[0x41D] = 1252;
182 lcidCodes[0x41E] = 874;
183 lcidCodes[0x41F] = 1254;
184 lcidCodes[0x422] = 1251;
185 lcidCodes[0x420] = 1256;
186 lcidCodes[0x42A] = 1258;
188 sortCodes[30] = 437;
189 sortCodes[31] = 437;
190 sortCodes[32] = 437;
191 sortCodes[33] = 437;
192 sortCodes[34] = 437;
193 sortCodes[40] = 850;
194 sortCodes[41] = 850;
195 sortCodes[42] = 850;
196 sortCodes[43] = 850;
197 sortCodes[44] = 850;
198 sortCodes[49] = 850;
199 sortCodes[50] = 1252;
200 sortCodes[51] = 1252;
201 sortCodes[52] = 1252;
202 sortCodes[53] = 1252;
203 sortCodes[54] = 1252;
204 sortCodes[55] = 850;
205 sortCodes[56] = 850;
206 sortCodes[57] = 850;
207 sortCodes[58] = 850;
208 sortCodes[59] = 850;
209 sortCodes[60] = 850;
210 sortCodes[61] = 850;
211 sortCodes[71] = 1252;
212 sortCodes[72] = 1252;
213 sortCodes[73] = 1252;
214 sortCodes[74] = 1252;
215 sortCodes[75] = 1252;
216 sortCodes[80] = 1250;
217 sortCodes[81] = 1250;
218 sortCodes[82] = 1250;
219 sortCodes[83] = 1250;
220 sortCodes[84] = 1250;
221 sortCodes[85] = 1250;
222 sortCodes[86] = 1250;
223 sortCodes[87] = 1250;
224 sortCodes[88] = 1250;
225 sortCodes[89] = 1250;
226 sortCodes[90] = 1250;
227 sortCodes[91] = 1250;
228 sortCodes[92] = 1250;
229 sortCodes[93] = 1250;
230 sortCodes[94] = 1250;
231 sortCodes[95] = 1250;
232 sortCodes[96] = 1250;
233 sortCodes[97] = 1250;
234 sortCodes[98] = 1250;
235 sortCodes[104] = 1251;
236 sortCodes[105] = 1251;
237 sortCodes[106] = 1251;
238 sortCodes[107] = 1251;
239 sortCodes[108] = 1251;
240 sortCodes[112] = 1253;
241 sortCodes[113] = 1253;
242 sortCodes[114] = 1253;
243 sortCodes[120] = 1253;
244 sortCodes[121] = 1253;
245 sortCodes[124] = 1253;
246 sortCodes[128] = 1254;
247 sortCodes[129] = 1254;
248 sortCodes[130] = 1254;
249 sortCodes[136] = 1255;
250 sortCodes[137] = 1255;
251 sortCodes[138] = 1255;
252 sortCodes[144] = 1256;
253 sortCodes[145] = 1256;
254 sortCodes[146] = 1256;
255 sortCodes[152] = 1257;
256 sortCodes[153] = 1257;
257 sortCodes[154] = 1257;
258 sortCodes[155] = 1257;
259 sortCodes[156] = 1257;
260 sortCodes[157] = 1257;
261 sortCodes[158] = 1257;
262 sortCodes[159] = 1257;
263 sortCodes[160] = 1257;
264 sortCodes[183] = 1252;
265 sortCodes[184] = 1252;
266 sortCodes[185] = 1252;
267 sortCodes[186] = 1252;
268 sortCodes[192] = 932;
269 sortCodes[193] = 932;
270 sortCodes[194] = 949;
271 sortCodes[195] = 949;
272 sortCodes[196] = 950;
273 sortCodes[197] = 950;
274 sortCodes[198] = 936;
275 sortCodes[199] = 936;
276 sortCodes[200] = 932;
277 sortCodes[201] = 949;
278 sortCodes[202] = 950;
279 sortCodes[203] = 936;
280 sortCodes[204] = 874;
281 sortCodes[205] = 874;
282 sortCodes[206] = 874;
285 public static Encoding GetEncoding (byte[] collation)
287 if (TdsCollation.SortId (collation) != 0)
288 return GetEncodingFromSortOrder (collation);
289 else
290 return GetEncodingFromLCID (collation);
293 public static Encoding GetEncodingFromLCID (byte[] collation)
295 int lcid = TdsCollation.LCID (collation);
296 return GetEncodingFromLCID (lcid);
299 public static Encoding GetEncodingFromLCID (int lcid)
301 if (lcidCodes[lcid] != null)
302 return Encoding.GetEncoding ((int)lcidCodes[lcid]);
303 else
304 return null;
307 public static Encoding GetEncodingFromSortOrder(byte[] collation)
309 int sortId = TdsCollation.SortId (collation);
310 return GetEncodingFromSortOrder (sortId);
313 public static Encoding GetEncodingFromSortOrder (int sortId)
315 if (sortCodes[sortId] != null)
316 return Encoding.GetEncoding ((int)sortCodes[sortId]);
317 else
318 return null;