/* * Copyright 2012 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #import "ZXQRCodeMode.h" #import "ZXQRCodeVersion.h" @interface ZXQRCodeMode () @property (nonatomic, strong, readonly) NSArray *characterCountBitsForVersions; @end @implementation ZXQRCodeMode - (id)initWithCharacterCountBitsForVersions:(NSArray *)characterCountBitsForVersions bits:(int)bits name:(NSString *)name { if (self = [super init]) { _characterCountBitsForVersions = characterCountBitsForVersions; _bits = bits; _name = name; } return self; } + (ZXQRCodeMode *)forBits:(int)bits { switch (bits) { case 0x0: return [ZXQRCodeMode terminatorMode]; case 0x1: return [ZXQRCodeMode numericMode]; case 0x2: return [ZXQRCodeMode alphanumericMode]; case 0x3: return [ZXQRCodeMode structuredAppendMode]; case 0x4: return [ZXQRCodeMode byteMode]; case 0x5: return [ZXQRCodeMode fnc1FirstPositionMode]; case 0x7: return [ZXQRCodeMode eciMode]; case 0x8: return [ZXQRCodeMode kanjiMode]; case 0x9: return [ZXQRCodeMode fnc1SecondPositionMode]; case 0xD: return [ZXQRCodeMode hanziMode]; default: return nil; } } - (int)characterCountBits:(ZXQRCodeVersion *)version { int number = version.versionNumber; int offset; if (number <= 9) { offset = 0; } else if (number <= 26) { offset = 1; } else { offset = 2; } return [self.characterCountBitsForVersions[offset] intValue]; } - (NSString *)description { return self.name; } + (ZXQRCodeMode *)terminatorMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x00 name:@"TERMINATOR"]; }); return thisMode; } + (ZXQRCodeMode *)numericMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@10, @12, @14] bits:0x01 name:@"NUMERIC"]; }); return thisMode; } + (ZXQRCodeMode *)alphanumericMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@9, @11, @13] bits:0x02 name:@"ALPHANUMERIC"]; }); return thisMode; } + (ZXQRCodeMode *)structuredAppendMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x03 name:@"STRUCTURED_APPEND"]; }); return thisMode; } + (ZXQRCodeMode *)byteMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@8, @16, @16] bits:0x04 name:@"BYTE"]; }); return thisMode; } + (ZXQRCodeMode *)eciMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x07 name:@"ECI"]; }); return thisMode; } + (ZXQRCodeMode *)kanjiMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@8, @10, @12] bits:0x08 name:@"KANJI"]; }); return thisMode; } + (ZXQRCodeMode *)fnc1FirstPositionMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x05 name:@"FNC1_FIRST_POSITION"]; }); return thisMode; } + (ZXQRCodeMode *)fnc1SecondPositionMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x09 name:@"FNC1_SECOND_POSITION"]; }); return thisMode; } + (ZXQRCodeMode *)hanziMode { static ZXQRCodeMode *thisMode = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@8, @10, @12] bits:0x0D name:@"HANZI"]; }); return thisMode; } @end