Committed C# port from Mohamad
[zxing.git] / csharp / qrcode / decoder / Mode.cs
1 /*\r
2 * Copyright 2007 ZXing authors\r
3 *\r
4 * Licensed under the Apache License, Version 2.0 (the "License");\r
5 * you may not use this file except in compliance with the License.\r
6 * You may obtain a copy of the License at\r
7 *\r
8 *      http://www.apache.org/licenses/LICENSE-2.0\r
9 *\r
10 * Unless required by applicable law or agreed to in writing, software\r
11 * distributed under the License is distributed on an "AS IS" BASIS,\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13 * See the License for the specific language governing permissions and\r
14 * limitations under the License.\r
15 */\r
16 using System;\r
17 using com.google.zxing;\r
18 using com.google.zxing.common;\r
19 \r
20 namespace com.google.zxing.qrcode.decoder\r
21 {\r
22     public sealed class Mode\r
23     { \r
24           // No, we can't use an enum here. J2ME doesn't support it.\r
25           public static Mode TERMINATOR = new Mode(new int[]{0, 0, 0}, 0x00, "TERMINATOR"); // Not really a mode...\r
26           public static Mode NUMERIC = new Mode(new int[]{10, 12, 14}, 0x01, "NUMERIC");\r
27           public static Mode ALPHANUMERIC = new Mode(new int[]{9, 11, 13}, 0x02, "ALPHANUMERIC");\r
28           public static Mode BYTE = new Mode(new int[]{8, 16, 16}, 0x04, "BYTE");\r
29           public static Mode ECI = new Mode(null, 0x07, "ECI"); // character counts don't apply\r
30           public static Mode KANJI = new Mode(new int[]{8, 10, 12}, 0x08, "KANJI");\r
31           public static Mode FNC1_FIRST_POSITION = new Mode(null, 0x05, "FNC1_FIRST_POSITION");\r
32           public static Mode FNC1_SECOND_POSITION = new Mode(null, 0x09, "FNC1_SECOND_POSITION");\r
33 \r
34           private int[] characterCountBitsForVersions;\r
35           private int bits;\r
36           private string name;\r
37 \r
38           private Mode(int[] characterCountBitsForVersions, int bits, string name) {\r
39             this.characterCountBitsForVersions = characterCountBitsForVersions;\r
40             this.bits = bits;\r
41             this.name = name;\r
42           }\r
43 \r
44           /**\r
45            * @param bits four bits encoding a QR Code data mode\r
46            * @return {@link Mode} encoded by these bits\r
47            * @throws ArgumentException if bits do not correspond to a known mode\r
48            */\r
49           public static Mode forBits(int bits) {\r
50             switch (bits) {\r
51               case 0x0:\r
52                 return TERMINATOR;\r
53               case 0x1:\r
54                 return NUMERIC;\r
55               case 0x2:\r
56                 return ALPHANUMERIC;\r
57               case 0x4:\r
58                 return BYTE;\r
59               case 0x5:\r
60                 return FNC1_FIRST_POSITION;\r
61               case 0x7:\r
62                 return ECI;\r
63               case 0x8:\r
64                 return KANJI;\r
65               case 0x9:\r
66                 return FNC1_SECOND_POSITION;\r
67               default:\r
68                 throw new ArgumentException();\r
69             }\r
70           }\r
71 \r
72           /**\r
73            * @param version version in question\r
74            * @return number of bits used, in this QR Code symbol {@link Version}, to encode the\r
75            *         count of characters that will follow encoded in this {@link Mode}\r
76            */\r
77           public int getCharacterCountBits(Version version) {\r
78             if (characterCountBitsForVersions == null) {\r
79               throw new ArgumentException("Character count doesn't apply to this mode");\r
80             }\r
81             int number = version.getVersionNumber();\r
82             int offset;\r
83             if (number <= 9) {\r
84               offset = 0;\r
85             } else if (number <= 26) {\r
86               offset = 1;\r
87             } else {\r
88               offset = 2;\r
89             }\r
90             return characterCountBitsForVersions[offset];\r
91           }\r
92 \r
93           public int getBits() {\r
94             return bits;\r
95           }\r
96 \r
97           public string getName() {\r
98             return name;\r
99           }\r
100 \r
101           public string toString() {\r
102             return name;\r
103           }\r
104 \r
105     \r
106     \r
107     }\r
108 }