123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /*
- * 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 "ZXExpandedProductResultParser.h"
- #import "ZXExpandedProductParsedResult.h"
- #import "ZXResult.h"
-
- @implementation ZXExpandedProductResultParser
-
- - (ZXParsedResult *)parse:(ZXResult *)result {
- ZXBarcodeFormat format = [result barcodeFormat];
- if (kBarcodeFormatRSSExpanded != format) {
- // ExtendedProductParsedResult NOT created. Not a RSS Expanded barcode
- return nil;
- }
- NSString *rawText = [ZXResultParser massagedText:result];
-
- NSString *productID = nil;
- NSString *sscc = nil;
- NSString *lotNumber = nil;
- NSString *productionDate = nil;
- NSString *packagingDate = nil;
- NSString *bestBeforeDate = nil;
- NSString *expirationDate = nil;
- NSString *weight = nil;
- NSString *weightType = nil;
- NSString *weightIncrement = nil;
- NSString *price = nil;
- NSString *priceIncrement = nil;
- NSString *priceCurrency = nil;
- NSMutableDictionary *uncommonAIs = [NSMutableDictionary dictionary];
-
- int i = 0;
-
- while (i < [rawText length]) {
- NSString *ai = [self findAIvalue:i rawText:rawText];
- if (ai == nil) {
- // Error. Code doesn't match with RSS expanded pattern
- // ExtendedProductParsedResult NOT created. Not match with RSS Expanded pattern
- return nil;
- }
- i += [ai length] + 2;
- NSString *value = [self findValue:i rawText:rawText];
- i += [value length];
-
- if ([@"00" isEqualToString:ai]) {
- sscc = value;
- } else if ([@"01" isEqualToString:ai]) {
- productID = value;
- } else if ([@"10" isEqualToString:ai]) {
- lotNumber = value;
- } else if ([@"11" isEqualToString:ai]) {
- productionDate = value;
- } else if ([@"13" isEqualToString:ai]) {
- packagingDate = value;
- } else if ([@"15" isEqualToString:ai]) {
- bestBeforeDate = value;
- } else if ([@"17" isEqualToString:ai]) {
- expirationDate = value;
- } else if ([@"3100" isEqualToString:ai] || [@"3101" isEqualToString:ai] || [@"3102" isEqualToString:ai] || [@"3103" isEqualToString:ai] || [@"3104" isEqualToString:ai] || [@"3105" isEqualToString:ai] || [@"3106" isEqualToString:ai] || [@"3107" isEqualToString:ai] || [@"3108" isEqualToString:ai] || [@"3109" isEqualToString:ai]) {
- weight = value;
- weightType = ZX_KILOGRAM;
- weightIncrement = [ai substringFromIndex:3];
- } else if ([@"3200" isEqualToString:ai] || [@"3201" isEqualToString:ai] || [@"3202" isEqualToString:ai] || [@"3203" isEqualToString:ai] || [@"3204" isEqualToString:ai] || [@"3205" isEqualToString:ai] || [@"3206" isEqualToString:ai] || [@"3207" isEqualToString:ai] || [@"3208" isEqualToString:ai] || [@"3209" isEqualToString:ai]) {
- weight = value;
- weightType = ZX_POUND;
- weightIncrement = [ai substringFromIndex:3];
- } else if ([@"3920" isEqualToString:ai] || [@"3921" isEqualToString:ai] || [@"3922" isEqualToString:ai] || [@"3923" isEqualToString:ai]) {
- price = value;
- priceIncrement = [ai substringFromIndex:3];
- } else if ([@"3930" isEqualToString:ai] || [@"3931" isEqualToString:ai] || [@"3932" isEqualToString:ai] || [@"3933" isEqualToString:ai]) {
- if ([value length] < 4) {
- // The value must have more of 3 symbols (3 for currency and
- // 1 at least for the price)
- // ExtendedProductParsedResult NOT created. Not match with RSS Expanded pattern
- return nil;
- }
- price = [value substringFromIndex:3];
- priceCurrency = [value substringToIndex:3];
- priceIncrement = [ai substringFromIndex:3];
- } else {
- // No match with common AIs
- uncommonAIs[ai] = value;
- }
- }
-
- return [ZXExpandedProductParsedResult expandedProductParsedResultWithRawText:rawText
- productID:productID
- sscc:sscc
- lotNumber:lotNumber
- productionDate:productionDate
- packagingDate:packagingDate
- bestBeforeDate:bestBeforeDate
- expirationDate:expirationDate
- weight:weight
- weightType:weightType
- weightIncrement:weightIncrement
- price:price
- priceIncrement:priceIncrement
- priceCurrency:priceCurrency
- uncommonAIs:uncommonAIs];
- }
-
- - (NSString *)findAIvalue:(int)i rawText:(NSString *)rawText {
- unichar c = [rawText characterAtIndex:i];
- // First character must be a open parenthesis.If not, ERROR
- if (c != '(') {
- return nil;
- }
-
- NSString *rawTextAux = [rawText substringFromIndex:i + 1];
-
- NSMutableString *buf = [NSMutableString string];
- for (int index = 0; index < [rawTextAux length]; index++) {
- unichar currentChar = [rawTextAux characterAtIndex:index];
- if (currentChar == ')') {
- return buf;
- } else if (currentChar >= '0' && currentChar <= '9') {
- [buf appendFormat:@"%C", currentChar];
- } else {
- return nil;
- }
- }
- return buf;
- }
-
- - (NSString *)findValue:(int)i rawText:(NSString *)rawText {
- NSMutableString *buf = [NSMutableString string];
- NSString *rawTextAux = [rawText substringFromIndex:i];
-
- for (int index = 0; index < [rawTextAux length]; index++) {
- unichar c = [rawTextAux characterAtIndex:index];
- if (c == '(') {
- // We look for a new AI. If it doesn't exist (ERROR), we coninue
- // with the iteration
- if ([self findAIvalue:index rawText:rawTextAux] == nil) {
- [buf appendString:@"("];
- } else {
- break;
- }
- } else {
- [buf appendFormat:@"%C", c];
- }
- }
-
- return buf;
- }
-
- @end
|