Small style stuff
[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 namespace com.google.zxing.qrcode.decoder\r
18 {\r
19         \r
20         /// <summary> <p>See ISO 18004:2006, 6.4.1, Tables 2 and 3. This enum encapsulates the various modes in which\r
21         /// data can be encoded to bits in the QR code standard.</p>\r
22         /// \r
23         /// </summary>\r
24         /// <author>  Sean Owen\r
25         /// </author>\r
26         /// <author>www.Redivivus.in (suraj.supekar@redivivus.in) - Ported from ZXING Java Source \r
27         /// </author>\r
28         public sealed class Mode\r
29         {\r
30                 public int Bits\r
31                 {\r
32                         get\r
33                         {\r
34                                 return bits;\r
35                         }\r
36                         \r
37                 }\r
38                 public System.String Name\r
39                 {\r
40                         get\r
41                         {\r
42                                 return name;\r
43                         }\r
44                         \r
45                 }\r
46                 \r
47                 // No, we can't use an enum here. J2ME doesn't support it.\r
48                 \r
49                 //UPGRADE_NOTE: Final was removed from the declaration of 'TERMINATOR '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
50                 public static readonly Mode TERMINATOR = new Mode(new int[]{0, 0, 0}, 0x00, "TERMINATOR"); // Not really a mode...\r
51                 //UPGRADE_NOTE: Final was removed from the declaration of 'NUMERIC '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
52                 public static readonly Mode NUMERIC = new Mode(new int[]{10, 12, 14}, 0x01, "NUMERIC");\r
53                 //UPGRADE_NOTE: Final was removed from the declaration of 'ALPHANUMERIC '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
54                 public static readonly Mode ALPHANUMERIC = new Mode(new int[]{9, 11, 13}, 0x02, "ALPHANUMERIC");\r
55                 //UPGRADE_NOTE: Final was removed from the declaration of 'STRUCTURED_APPEND '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
56                 public static readonly Mode STRUCTURED_APPEND = new Mode(new int[]{0, 0, 0}, 0x03, "STRUCTURED_APPEND"); // Not supported\r
57                 //UPGRADE_NOTE: Final was removed from the declaration of 'BYTE '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
58                 public static readonly Mode BYTE = new Mode(new int[]{8, 16, 16}, 0x04, "BYTE");\r
59                 //UPGRADE_NOTE: Final was removed from the declaration of 'ECI '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
60                 public static readonly Mode ECI = new Mode(null, 0x07, "ECI"); // character counts don't apply\r
61                 //UPGRADE_NOTE: Final was removed from the declaration of 'KANJI '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
62                 public static readonly Mode KANJI = new Mode(new int[]{8, 10, 12}, 0x08, "KANJI");\r
63                 //UPGRADE_NOTE: Final was removed from the declaration of 'FNC1_FIRST_POSITION '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
64                 public static readonly Mode FNC1_FIRST_POSITION = new Mode(null, 0x05, "FNC1_FIRST_POSITION");\r
65                 //UPGRADE_NOTE: Final was removed from the declaration of 'FNC1_SECOND_POSITION '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
66                 public static readonly Mode FNC1_SECOND_POSITION = new Mode(null, 0x09, "FNC1_SECOND_POSITION");\r
67                 \r
68                 //UPGRADE_NOTE: Final was removed from the declaration of 'characterCountBitsForVersions '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
69                 private int[] characterCountBitsForVersions;\r
70                 //UPGRADE_NOTE: Final was removed from the declaration of 'bits '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
71                 private int bits;\r
72                 //UPGRADE_NOTE: Final was removed from the declaration of 'name '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"\r
73                 private System.String name;\r
74                 \r
75                 private Mode(int[] characterCountBitsForVersions, int bits, System.String name)\r
76                 {\r
77                         this.characterCountBitsForVersions = characterCountBitsForVersions;\r
78                         this.bits = bits;\r
79                         this.name = name;\r
80                 }\r
81                 \r
82                 /// <param name="bits">four bits encoding a QR Code data mode\r
83                 /// </param>\r
84                 /// <returns> {@link Mode} encoded by these bits\r
85                 /// </returns>\r
86                 /// <throws>  IllegalArgumentException if bits do not correspond to a known mode </throws>\r
87                 public static Mode forBits(int bits)\r
88                 {\r
89                         switch (bits)\r
90                         {\r
91                                 \r
92                                 case 0x0: \r
93                                         return TERMINATOR;\r
94                                 \r
95                                 case 0x1: \r
96                                         return NUMERIC;\r
97                                 \r
98                                 case 0x2: \r
99                                         return ALPHANUMERIC;\r
100                                 \r
101                                 case 0x3: \r
102                                         return STRUCTURED_APPEND;\r
103                                 \r
104                                 case 0x4: \r
105                                         return BYTE;\r
106                                 \r
107                                 case 0x5: \r
108                                         return FNC1_FIRST_POSITION;\r
109                                 \r
110                                 case 0x7: \r
111                                         return ECI;\r
112                                 \r
113                                 case 0x8: \r
114                                         return KANJI;\r
115                                 \r
116                                 case 0x9: \r
117                                         return FNC1_SECOND_POSITION;\r
118                                 \r
119                                 default: \r
120                                         throw new System.ArgumentException();\r
121                                 \r
122                         }\r
123                 }\r
124                 \r
125                 /// <param name="version">version in question\r
126                 /// </param>\r
127                 /// <returns> number of bits used, in this QR Code symbol {@link Version}, to encode the\r
128                 /// count of characters that will follow encoded in this {@link Mode}\r
129                 /// </returns>\r
130                 public int getCharacterCountBits(Version version)\r
131                 {\r
132                         if (characterCountBitsForVersions == null)\r
133                         {\r
134                                 throw new System.ArgumentException("Character count doesn't apply to this mode");\r
135                         }\r
136                         int number = version.VersionNumber;\r
137                         int offset;\r
138                         if (number <= 9)\r
139                         {\r
140                                 offset = 0;\r
141                         }\r
142                         else if (number <= 26)\r
143                         {\r
144                                 offset = 1;\r
145                         }\r
146                         else\r
147                         {\r
148                                 offset = 2;\r
149                         }\r
150                         return characterCountBitsForVersions[offset];\r
151                 }\r
152                 \r
153                 public override System.String ToString()\r
154                 {\r
155                         return name;\r
156                 }\r
157         }\r
158 }