Merge remote-tracking branch 'public/master'
[mono.git] / mcs / class / Mono.Data.Tds / Mono.Data.Tds.Protocol / TdsCollation.cs
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
10 //
11
12 //
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.
31 //
32
33 using System;
34 using System.Collections;
35 using System.Text;
36
37 namespace Mono.Data.Tds {
38         internal static class TdsCollation 
39         {
40                 public static int LCID (byte[] collation)
41                 {
42                         if (collation == null)
43                                 return -1;
44                         
45                         return (collation[0] | (collation[1] << 8) | ((collation[2] & 0x0F) << 16));
46                 }
47                 
48                 public static int CollationFlags (byte[] collation)
49                 {
50                         if (collation == null)
51                                 return -1;
52                         
53                         return ((collation[2] & 0xF0) | ((collation[3] & 0x0F) << 4));
54                 }
55
56                 public static int Version (byte[] collation)
57                 {
58                         if (collation == null)
59                                 return -1;
60                         
61                         return (collation[3] & 0xF0);
62                 }
63                 
64                 public static int SortId (byte[] collation)
65                 {
66                         if (collation == null)
67                                 return -1;
68                         
69                         return (collation[4]);
70                 }
71         }
72         
73         internal static class TdsCharset
74         {
75                 private static Hashtable lcidCodes = new Hashtable();
76                 private static Hashtable sortCodes = new Hashtable();
77                 
78                 static TdsCharset ()
79                 {
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;
187                                                         
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;
283                 }
284                 
285                 public static Encoding GetEncoding (byte[] collation) 
286                 {
287                         if (TdsCollation.SortId (collation) != 0)
288                                 return GetEncodingFromSortOrder (collation);
289                         else
290                                 return GetEncodingFromLCID (collation);
291                 }
292                 
293                 public static Encoding GetEncodingFromLCID (byte[] collation)
294                 {
295                         int lcid = TdsCollation.LCID (collation);
296                         return GetEncodingFromLCID (lcid);
297                 }
298                 
299                 public static Encoding GetEncodingFromLCID (int lcid)
300                 {
301                         if (lcidCodes[lcid] != null)
302                                 return Encoding.GetEncoding ((int)lcidCodes[lcid]);
303                         else
304                                 return null;                    
305                 }
306                 
307                 public static Encoding GetEncodingFromSortOrder(byte[] collation)
308                 {
309                         int sortId = TdsCollation.SortId (collation);
310                         return GetEncodingFromSortOrder (sortId);
311                 }
312
313                 public static Encoding GetEncodingFromSortOrder (int sortId)
314                 {
315                         if (sortCodes[sortId] != null)
316                                 return Encoding.GetEncoding ((int)sortCodes[sortId]);
317                         else
318                                 return null;                    
319                 }
320         }       
321 }