diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..155e5a18 --- /dev/null +++ b/.clang-format @@ -0,0 +1,96 @@ +--- +# BasedOnStyle: WebKit +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: false +AlignOperands: false +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false +BreakBeforeBinaryOperators: All +BreakBeforeBraces: WebKit +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: true +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 0 +CommentPragmas: '^ IWYU pragma:' +BreakBeforeInheritanceComma: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '$' +IndentCaseLabels: false +IndentWidth: 2 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: Inner +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +ReflowComments: true +SortIncludes: true +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 8 +UseTab: Never +... diff --git a/ios/Classes/MTBBarcodeScanner.h b/ios/Classes/MTBBarcodeScanner.h new file mode 100755 index 00000000..2486cdf9 --- /dev/null +++ b/ios/Classes/MTBBarcodeScanner.h @@ -0,0 +1,313 @@ +// +// MTBBarcodeScanner.h +// MTBBarcodeScannerExample +// +// Created by Mike Buss on 2/8/14. +// +// + +#import +#import +#import + +typedef NS_ENUM(NSUInteger, MTBCamera) { + MTBCameraBack, + MTBCameraFront +}; + +/** + * Available torch modes when scanning barcodes. + * + * While AVFoundation provides an additional automatic + * mode, it is not supported here because it only works + * with video recordings, not barcode scanning. + */ +typedef NS_ENUM(NSUInteger, MTBTorchMode) { + MTBTorchModeOff, + MTBTorchModeOn, +}; + +@interface MTBBarcodeScanner : NSObject + +/** + * The currently set camera. See MTBCamera for options. + * + * @sa setCamera:error: + */ +@property (nonatomic, assign, readonly) MTBCamera camera; + +/** + * Control the torch on the device, if present. + * + * Attempting to set the torch mode to an unsupported state + * will fail silently, and the value passed into the setter + * will be discarded. + * + * @sa setTorchMode:error: + */ +@property (nonatomic, assign) MTBTorchMode torchMode; + +/** + * Allow the user to tap the previewView to focus a specific area. + * Defaults to YES. + */ +@property (nonatomic, assign) BOOL allowTapToFocus; + +/** + * If set, only barcodes inside this area will be scanned. + * + * Setting this property is only supported while the scanner is active. + * Use the didStartScanningBlock if you want to set it as early as + * possible. + */ +@property (nonatomic, assign) CGRect scanRect; + +/** + * Layer used to present the camera input. If the previewView + * does not use auto layout, it may be necessary to adjust the layers frame. + */ +@property (nonatomic, strong) CALayer *previewLayer; + +/*! + @property didStartScanningBlock + @abstract + Optional callback block that's called when the scanner finished initializing. + + @discussion + Optional callback that will be called when the scanner is initialized and the view + is presented on the screen. This is useful for presenting an activity indicator + while the scanner is initializing. + + The block is always called on the main queue. + */ +@property (nonatomic, copy) void (^didStartScanningBlock)(void); + +/*! + @property didTapToFocusBlock + @abstract + Block that's called when the user taps the screen to focus the camera. If allowsTapToFocus + is set to NO, this will never be called. + */ +@property (nonatomic, copy) void (^didTapToFocusBlock)(CGPoint point); + +/*! + @property resultBlock + @abstract + Block that's called every time one or more barcodes are recognized. + + @discussion + The resultBlock is called on the main queue once for every frame that at least one valid barcode is found. + + This block is automatically set when you call startScanningWithResultBlock: + */ +@property (nonatomic, copy) void (^resultBlock)(NSArray *codes); + +/*! + @property preferredAutoFocusRangeRestriction + @abstract + Auto focus range restriction, if supported. + + @discussion + Defaults to AVCaptureAutoFocusRangeRestrictionNear. Will be ignored on unsupported devices. + */ +@property (nonatomic, assign) AVCaptureAutoFocusRangeRestriction preferredAutoFocusRangeRestriction; + +/** + * Initialize a scanner that will feed the camera input + * into the given UIView. + * + * @param previewView View that will be overlayed with the live feed from the camera input. + * + * @return An instance of MTBBarcodeScanner + */ +- (instancetype)initWithPreviewView:(UIView *)previewView; + +/** + * Initialize a scanner that will feed the camera input + * into the given UIView. Only codes with a type given in + * the metaDataObjectTypes array will be reported to the result + * block when scanning is started using startScanningWithResultBlock: + * + * @see startScanningWithResultBlock: + * + * @param metaDataObjectTypes Array of AVMetadataObjectTypes to scan for. Only codes with types given in this array will be reported to the resultBlock. + * @param previewView View that will be overlayed with the live feed from the camera input. + * + * @return An instance of MTBBarcodeScanner + */ +- (instancetype)initWithMetadataObjectTypes:(NSArray *)metaDataObjectTypes + previewView:(UIView *)previewView; + +/** + * Returns whether any camera exists in this device. + * Be aware that this returns NO if camera access is restricted. + * + * @return YES if the device has a camera and authorization state is not AVAuthorizationStatusRestricted + */ ++ (BOOL)cameraIsPresent; + +/** + * You can use this flag to check whether flipCamera can potentially + * be successful. You may want to hide your button to flip the camera + * if the device only has one camera. + * + * @return YES if a second camera is present and authorization state is not AVAuthorizationStatusRestricted. + * @sa flipCamera + */ +- (BOOL)hasOppositeCamera; + +/** + * Returns whether scanning is prohibited by the user of the device. + * + * @return YES if the user has prohibited access to (or is prohibited from accessing) the camera. + */ ++ (BOOL)scanningIsProhibited; + +/** + * Request permission to access the camera on the device. + * + * The success block will return YES if the user granted permission, has granted permission in the past, or if the device is running iOS 7. + * The success block will return NO if the user denied permission, is restricted from the camera, or if there is no camera present. + */ ++ (void)requestCameraPermissionWithSuccess:(void (^)(BOOL success))successBlock; + +/** + * Start scanning for barcodes. The camera input will be added as a sublayer + * to the UIView given for previewView during initialization. + * + * This method assumes you have already set the `resultBlock` property directly. + * + * This method returns quickly and does not wait for the internal session to + * start. Set the didStartScanningBlock to get a callback when the session + * is ready, i.e., a camera picture is visible. + * + * @param error Error supplied if the scanning could not start. + * + * @return YES if scanning started successfully, NO if there was an error. + */ +- (BOOL)startScanningWithError:(NSError **)error; + +/** + * Start scanning for barcodes. The camera input will be added as a sublayer + * to the UIView given for previewView during initialization. + * + * This method returns quickly and does not wait for the internal session to + * start. Set the didStartScanningBlock to get a callback when the session + * is ready, i.e., a camera picture is visible. + * + * @param resultBlock Callback block for captured codes. If the scanner was instantiated with initWithMetadataObjectTypes:previewView, only codes with a type given in metaDataObjectTypes will be reported. + * @param error Error supplied if the scanning could not start. + * + * @return YES if scanning started successfully, NO if there was an error. + */ +- (BOOL)startScanningWithResultBlock:(void (^)(NSArray *codes))resultBlock error:(NSError **)error; + +/** + * Stop scanning for barcodes. The live feed from the camera will be removed as a sublayer from the previewView given during initialization. + */ +- (void)stopScanning; + +/** + * Whether the scanner is currently scanning for barcodes + * + * @return YES if the scanner is currently scanning for barcodes + */ +- (BOOL)isScanning; + +/** + * If using the front camera, switch to the back, or visa-versa. + * If this method is called when isScanning=NO, it has no effect + * + * If the opposite camera is not available, this method will do nothing. + * + * @sa hasOppositeCamera + */ +- (void)flipCamera; + +/** + * Sets the camera and ignores any errors. + * + * Deprecated. + * + * @sa setCamera:error: + */ +- (void)setCamera:(MTBCamera)camera NS_DEPRECATED_IOS(2.0, 2.0, "Use setCamera:error: instead"); + +/** + * Sets the camera. This operation may fail, e.g., when the device + * does not have the specified camera. + * + * @param camera The camera to use, see MTBCamera for options. + * @error Any error that occurred while trying to set the camera. + * @return YES, if the specified camera was set successfully, NO if any error occurred. + */ +- (BOOL)setCamera:(MTBCamera)camera error:(NSError **)error; + +/** + * If using the front camera, switch to the back, or visa-versa. + * + * If this method is called when (isScanning == NO), it will return + * NO and provide an error. + * + * If the opposite camera is not available, the error parameter + * will explain the error. + * + * @return YES if the camera was flipped, NO if any error occurred. + */ +- (BOOL)flipCameraWithError:(NSError **)error; + +/** + * Return a BOOL value that specifies whether the current capture device has a torch. + * + * @return YES if the the current capture device has a torch. + */ +- (BOOL)hasTorch; + +/** + * Toggle the torch from on to off, or off to on. + * If the device does not support a torch or the opposite mode, calling + * this method will have no effect. + * To set the torch to on/off directly, set the `torchMode` property, or + * use setTorchMode:error: if you care about errors. + */ +- (void)toggleTorch; + +/** + * Attempts to set a new torch mode. + * + * @return YES, if setting the new mode was successful, and the torchMode + * property reflects the new state. NO if there was an error - use the + * error parameter to learn about the reason. + * + * @sa torchMode + */ +- (BOOL)setTorchMode:(MTBTorchMode)torchMode error:(NSError **)error; + +/** + * Freeze capture keeping the last frame on previewView. + * If this method is called before startScanning, it has no effect. + * + * Returns immediately – actually freezing the capture is + * done asynchronously. + */ +- (void)freezeCapture; + +/** + * Unfreeze a frozen capture. + * + * Returns immediately – actually unfreezing the capture is + * done asynchronously. + */ +- (void)unfreezeCapture; + +/** + * Captures a still image of the current camera feed + */ +- (void)captureStillImage:(void (^)(UIImage *image, NSError *error))captureBlock; + +/** + * Determine if currently capturing a still image + */ +- (BOOL)isCapturingStillImage; + +@end diff --git a/ios/Classes/MTBBarcodeScanner.m b/ios/Classes/MTBBarcodeScanner.m new file mode 100755 index 00000000..e465b557 --- /dev/null +++ b/ios/Classes/MTBBarcodeScanner.m @@ -0,0 +1,964 @@ +// +// MTBBarcodeScanner.m +// MTBBarcodeScannerExample +// +// Created by Mike Buss on 2/8/14. +// +// + +#import +#import "MTBBarcodeScanner.h" + +CGFloat const kFocalPointOfInterestX = 0.5; +CGFloat const kFocalPointOfInterestY = 0.5; + +static NSString *kErrorDomain = @"MTBBarcodeScannerError"; + +// Error Codes +static const NSInteger kErrorCodeStillImageCaptureInProgress = 1000; +static const NSInteger kErrorCodeSessionIsClosed = 1001; +static const NSInteger kErrorCodeNotScanning = 1002; +static const NSInteger kErrorCodeSessionAlreadyActive = 1003; +static const NSInteger kErrorCodeTorchModeUnavailable = 1004; + +@interface MTBBarcodeScanner () + +/*! + @property privateSessionQueue + @abstract + Starting or stopping the capture session should only be done on this queue. + */ +@property (strong) dispatch_queue_t privateSessionQueue; + +/*! + @property session + @abstract + The capture session used for scanning barcodes. + */ +@property (nonatomic, strong) AVCaptureSession *session; + +/*! + @property captureDevice + @abstract + Represents the physical device that is used for scanning barcodes. + */ +@property (nonatomic, strong) AVCaptureDevice *captureDevice; + +/*! + @property capturePreviewLayer + @abstract + The layer used to view the camera input. This layer is added to the + previewView when scanning starts. + */ +@property (nonatomic, strong) AVCaptureVideoPreviewLayer *capturePreviewLayer; + +/*! + @property currentCaptureDeviceInput + @abstract + The current capture device input for capturing video. This is used + to reset the camera to its initial properties when scanning stops. + */ +@property (nonatomic, strong) AVCaptureDeviceInput *currentCaptureDeviceInput; + +/* + @property captureDeviceOnput + @abstract + The capture device output for capturing video. + */ +@property (nonatomic, strong) AVCaptureMetadataOutput *captureOutput; + +/*! + @property metaDataObjectTypes + @abstract + The MetaDataObjectTypes to look for in the scanning session. + + @discussion + Only objects with a MetaDataObjectType found in this array will be + reported to the result block. + */ +@property (nonatomic, copy) NSArray *metaDataObjectTypes; + +/*! + @property previewView + @abstract + The view used to preview the camera input. + + @discussion + The AVCaptureVideoPreviewLayer is added to this view to preview the + camera input when scanning starts. When scanning stops, the layer is + removed. + */ +@property (nonatomic, weak) UIView *previewView; + +/*! + @property initialAutoFocusRangeRestriction + @abstract + The auto focus range restriction the AVCaptureDevice was initially configured for when scanning started. + + @discussion + When startScanning is called, the auto focus range restriction of the default AVCaptureDevice + is stored. When stopScanning is called, the AVCaptureDevice is reset to the initial range restriction + to prevent a bug in the AVFoundation framework. + */ +@property (nonatomic, assign) AVCaptureAutoFocusRangeRestriction initialAutoFocusRangeRestriction; + +/*! + @property initialFocusPoint + @abstract + The focus point the AVCaptureDevice was initially configured for when scanning started. + + @discussion + When startScanning is called, the focus point of the default AVCaptureDevice + is stored. When stopScanning is called, the AVCaptureDevice is reset to the initial focal point + to prevent a bug in the AVFoundation framework. + */ +@property (nonatomic, assign) CGPoint initialFocusPoint; + +/*! + @property stillImageOutput + @abstract + Used for still image capture prior to iOS 10 + */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +@property (nonatomic, strong) AVCaptureStillImageOutput *stillImageOutput; +#pragma GCC diagnostic pop + +/*! + @property gestureRecognizer + @abstract + If allowTapToFocus is set to YES, this gesture recognizer is added to the `previewView` + when scanning starts. When the user taps the view, the `focusPointOfInterest` will change + to the location the user tapped. + */ +@property (nonatomic, strong) UITapGestureRecognizer *gestureRecognizer; + +/*! + @property stillImageCaptureBlock + @abstract + Reference to the block passed in when capturing a still image. + */ +@property (nonatomic, copy) void (^stillImageCaptureBlock)(UIImage *image, NSError *error); + +@end + +@implementation MTBBarcodeScanner + +#pragma mark - Lifecycle + +- (instancetype)init { + NSAssert(NO, @"MTBBarcodeScanner init is not supported. Please use initWithPreviewView: \ + or initWithMetadataObjectTypes:previewView: to instantiate a MTBBarcodeScanner"); + return nil; +} + +- (instancetype)initWithPreviewView:(UIView *)previewView { + return [self initWithMetadataObjectTypes:[self defaultMetaDataObjectTypes] previewView:previewView]; +} + +- (instancetype)initWithMetadataObjectTypes:(NSArray *)metaDataObjectTypes previewView:(UIView *)previewView { + NSParameterAssert(metaDataObjectTypes); + NSAssert(metaDataObjectTypes.count > 0, + @"Must initialize MTBBarcodeScanner with at least one metaDataObjectTypes value."); + + self = [super init]; + if (self) { + // Library does not support scanning for faces + NSAssert(!([metaDataObjectTypes indexOfObject:AVMetadataObjectTypeFace] != NSNotFound), + @"The type %@ is not supported by MTBBarcodeScanner.", AVMetadataObjectTypeFace); + + _metaDataObjectTypes = metaDataObjectTypes; + _previewView = previewView; + _allowTapToFocus = YES; + _preferredAutoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear; + [self setupSessionQueue]; + [self addObservers]; + } + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - Scanning + ++ (BOOL)cameraIsPresent { + // capture device is nil if status is AVAuthorizationStatusRestricted + return [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] != nil; +} + ++ (BOOL)hasCamera:(MTBCamera)camera { + AVCaptureDevicePosition position = [self devicePositionForCamera:camera]; + + if (NSClassFromString(@"AVCaptureDeviceDiscoverySession")) { + AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera + mediaType:AVMediaTypeVideo + position:position]; + return (device != nil); + } else { + // We can ignore the deprecation warning here because + // we are using the new AVCaptureDeviceDiscoverySession when it is available +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + // Array is empty if status is AVAuthorizationStatusRestricted + for (AVCaptureDevice *device in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) { + if (device.position == position) { + return YES; + } + } +#pragma GCC diagnostic pop + } + return NO; +} + ++ (MTBCamera)oppositeCameraOf:(MTBCamera)camera { + switch (camera) { + case MTBCameraBack: + return MTBCameraFront; + + case MTBCameraFront: + return MTBCameraBack; + } + + NSAssert(NO, @"Invalid camera type: %lu", (unsigned long)camera); + return MTBCameraBack; +} + ++ (BOOL)scanningIsProhibited { + switch ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]) { + case AVAuthorizationStatusDenied: + case AVAuthorizationStatusRestricted: + return YES; + break; + + default: + return NO; + break; + } +} + ++ (void)requestCameraPermissionWithSuccess:(void (^)(BOOL success))successBlock { + if (![self cameraIsPresent]) { + successBlock(NO); + return; + } + + switch ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]) { + case AVAuthorizationStatusAuthorized: + successBlock(YES); + break; + + case AVAuthorizationStatusDenied: + case AVAuthorizationStatusRestricted: + successBlock(NO); + break; + + case AVAuthorizationStatusNotDetermined: + [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo + completionHandler:^(BOOL granted) { + + dispatch_async(dispatch_get_main_queue(), ^{ + successBlock(granted); + }); + + }]; + break; + } +} + +- (BOOL)startScanningWithError:(NSError **)error { + return [self startScanningWithResultBlock:self.resultBlock error:error]; +} + +- (BOOL)startScanningWithResultBlock:(void (^)(NSArray *codes))resultBlock error:(NSError **)error { + NSAssert([MTBBarcodeScanner cameraIsPresent], @"Attempted to start scanning on a device with no camera. Check requestCameraPermissionWithSuccess: method before calling startScanningWithResultBlock:"); + NSAssert(![MTBBarcodeScanner scanningIsProhibited], @"Scanning is prohibited on this device. \ + Check requestCameraPermissionWithSuccess: method before calling startScanningWithResultBlock:"); + NSAssert(resultBlock, @"startScanningWithResultBlock: requires a non-nil resultBlock."); + + if (self.session) { + if (error) { + *error = [NSError errorWithDomain:kErrorDomain + code:kErrorCodeSessionAlreadyActive + userInfo:@{NSLocalizedDescriptionKey : @"Do not start scanning while another session is in use."}]; + } + + return NO; + } + + // Configure the session + self.captureDevice = [self newCaptureDeviceWithCamera:self.camera]; + AVCaptureSession *session = [self newSessionWithCaptureDevice:self.captureDevice error:error]; + + if (!session) { + // we rely on newSessionWithCaptureDevice:error: to populate the error + return NO; + } + + self.session = session; + + // Configure the preview layer + self.capturePreviewLayer.cornerRadius = self.previewView.layer.cornerRadius; + [self.previewView.layer insertSublayer:self.capturePreviewLayer atIndex:0]; // Insert below all other views + [self refreshVideoOrientation]; + + // Configure 'tap to focus' functionality + [self configureTapToFocus]; + + self.resultBlock = resultBlock; + + dispatch_async(self.privateSessionQueue, ^{ + // Configure the rect of interest + self.captureOutput.rectOfInterest = [self rectOfInterestFromScanRect:self.scanRect]; + + // Start the session after all configurations: + // Must be dispatched as it is blocking + [self.session startRunning]; + + if (self.didStartScanningBlock) { + // Call that block now that we've started scanning: + // Dispatch back to main + dispatch_async(dispatch_get_main_queue(), ^{ + self.didStartScanningBlock(); + }); + } + }); + + return YES; +} + +- (void)stopScanning { + if (!self.session) { + return; + } + + // Turn the torch off + self.torchMode = MTBTorchModeOff; + + // Remove the preview layer + [self.capturePreviewLayer removeFromSuperlayer]; + + // Stop recognizing taps for the 'Tap to Focus' feature + [self stopRecognizingTaps]; + + self.resultBlock = nil; + self.capturePreviewLayer = nil; + + AVCaptureSession *session = self.session; + AVCaptureDeviceInput *deviceInput = self.currentCaptureDeviceInput; + self.session = nil; + + dispatch_async(self.privateSessionQueue, ^{ + // When we're finished scanning, reset the settings for the camera + // to their original states + // Must be dispatched as it is blocking + [self removeDeviceInput:deviceInput session:session]; + for (AVCaptureOutput *output in session.outputs) { + [session removeOutput:output]; + } + + // Must be dispatched as it is blocking + [session stopRunning]; + }); +} + +- (BOOL)isScanning { + return [self.session isRunning]; +} + +- (BOOL)hasOppositeCamera { + MTBCamera otherCamera = [[self class] oppositeCameraOf:self.camera]; + return [[self class] hasCamera:otherCamera]; +} + +- (void)flipCamera { + [self flipCameraWithError:nil]; +} + +- (BOOL)flipCameraWithError:(NSError **)error { + if (!self.isScanning) { + if (error) { + *error = [NSError errorWithDomain:kErrorDomain + code:kErrorCodeNotScanning + userInfo:@{NSLocalizedDescriptionKey : @"Camera cannot be flipped when isScanning is NO"}]; + } + + return NO; + } + + MTBCamera otherCamera = [[self class] oppositeCameraOf:self.camera]; + return [self setCamera:otherCamera error:error]; +} + +#pragma mark - Tap to Focus + +- (void)configureTapToFocus { + if (self.allowTapToFocus) { + UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(focusTapped:)]; + [self.previewView addGestureRecognizer:tapGesture]; + self.gestureRecognizer = tapGesture; + } +} + +- (void)focusTapped:(UITapGestureRecognizer *)tapGesture { + CGPoint tapPoint = [self.gestureRecognizer locationInView:self.gestureRecognizer.view]; + CGPoint devicePoint = [self.capturePreviewLayer captureDevicePointOfInterestForPoint:tapPoint]; + + AVCaptureDevice *device = self.captureDevice; + NSError *error = nil; + + if ([device lockForConfiguration:&error]) { + if (device.isFocusPointOfInterestSupported && + [device isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) { + + device.focusPointOfInterest = devicePoint; + device.focusMode = AVCaptureFocusModeContinuousAutoFocus; + } + [device unlockForConfiguration]; + } else { + NSLog(@"Failed to acquire lock for focus change: %@", error); + } + + if (self.didTapToFocusBlock) { + self.didTapToFocusBlock(tapPoint); + } +} + +- (void)stopRecognizingTaps { + if (self.gestureRecognizer) { + [self.previewView removeGestureRecognizer:self.gestureRecognizer]; + } +} + +#pragma mark - AVCaptureMetadataOutputObjects Delegate + +- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { + if (!self.resultBlock) return; + + NSMutableArray *codes = [[NSMutableArray alloc] init]; + + for (AVMetadataObject *metaData in metadataObjects) { + AVMetadataMachineReadableCodeObject *barCodeObject = (AVMetadataMachineReadableCodeObject *)[self.capturePreviewLayer transformedMetadataObjectForMetadataObject:(AVMetadataMachineReadableCodeObject *)metaData]; + if (barCodeObject) { + [codes addObject:barCodeObject]; + } + } + + self.resultBlock(codes); +} + +#pragma mark - Rotation + +- (void)handleApplicationDidChangeStatusBarNotification:(NSNotification *)notification { + [self refreshVideoOrientation]; +} + +- (void)refreshVideoOrientation { + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + self.capturePreviewLayer.frame = self.previewView.bounds; + if ([self.capturePreviewLayer.connection isVideoOrientationSupported]) { + self.capturePreviewLayer.connection.videoOrientation = [self captureOrientationForInterfaceOrientation:orientation]; + } +} + +- (AVCaptureVideoOrientation)captureOrientationForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + switch (interfaceOrientation) { + case UIInterfaceOrientationPortrait: + return AVCaptureVideoOrientationPortrait; + case UIInterfaceOrientationPortraitUpsideDown: + return AVCaptureVideoOrientationPortraitUpsideDown; + case UIInterfaceOrientationLandscapeLeft: + return AVCaptureVideoOrientationLandscapeLeft; + case UIInterfaceOrientationLandscapeRight: + return AVCaptureVideoOrientationLandscapeRight; + default: + return AVCaptureVideoOrientationPortrait; + } +} + +#pragma mark - Background Handling + +- (void)applicationWillEnterForegroundNotification:(NSNotification *)notification { + // the torch is switched off when the app is backgrounded so we restore the + // previous state once the app is foregrounded again + [self updateForTorchMode:self.torchMode error:nil]; +} + +#pragma mark - Session Configuration + +- (AVCaptureSession *)newSessionWithCaptureDevice:(AVCaptureDevice *)captureDevice error:(NSError **)error { + AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:error]; + + if (!input) { + // we rely on deviceInputWithDevice:error: to populate the error + return nil; + } + + AVCaptureSession *newSession = [[AVCaptureSession alloc] init]; + [self setDeviceInput:input session:newSession]; + + // Set an optimized preset for barcode scanning + [newSession setSessionPreset:AVCaptureSessionPresetHigh]; + + self.captureOutput = [[AVCaptureMetadataOutput alloc] init]; + [self.captureOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; + + [newSession addOutput:self.captureOutput]; + self.captureOutput.metadataObjectTypes = self.metaDataObjectTypes; + + if (!NSClassFromString(@"AVCapturePhotoOutput")) { + // Still image capture configuration +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + self.stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; + self.stillImageOutput.outputSettings = @{AVVideoCodecKey: AVVideoCodecJPEG}; + + if ([self.stillImageOutput isStillImageStabilizationSupported]) { + self.stillImageOutput.automaticallyEnablesStillImageStabilizationWhenAvailable = YES; + } + + if ([self.stillImageOutput respondsToSelector:@selector(isHighResolutionStillImageOutputEnabled)]) { + self.stillImageOutput.highResolutionStillImageOutputEnabled = YES; + } + [newSession addOutput:self.stillImageOutput]; +#pragma GCC diagnostic pop + } + + dispatch_async(self.privateSessionQueue, ^{ + self.captureOutput.rectOfInterest = [self rectOfInterestFromScanRect:self.scanRect]; + }); + + self.capturePreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:newSession]; + self.capturePreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; + self.capturePreviewLayer.frame = self.previewView.bounds; + + [newSession commitConfiguration]; + + return newSession; +} + +- (AVCaptureDevice *)newCaptureDeviceWithCamera:(MTBCamera)camera { + AVCaptureDevice *newCaptureDevice = nil; + AVCaptureDevicePosition position = [[self class] devicePositionForCamera:camera]; + + if (NSClassFromString(@"AVCaptureDeviceDiscoverySession")) { + AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera + mediaType:AVMediaTypeVideo + position:position]; + newCaptureDevice = device; + } else { + // We can ignore the deprecation here because we are using + // AVCaptureDeviceDiscoverySession if it is available +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + for (AVCaptureDevice *device in videoDevices) { + if (device.position == position) { + newCaptureDevice = device; + break; + } + } +#pragma GCC diagnostic pop + } + + // If the front camera is not available, use the back camera + if (!newCaptureDevice) { + newCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; + } + + // Using AVCaptureFocusModeContinuousAutoFocus helps improve scan times + NSError *error = nil; + if ([newCaptureDevice lockForConfiguration:&error]) { + if ([newCaptureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) { + newCaptureDevice.focusMode = AVCaptureFocusModeContinuousAutoFocus; + } + [newCaptureDevice unlockForConfiguration]; + } else { + NSLog(@"Failed to acquire lock for initial focus mode: %@", error); + } + + return newCaptureDevice; +} + ++ (AVCaptureDevicePosition)devicePositionForCamera:(MTBCamera)camera { + switch (camera) { + case MTBCameraFront: + return AVCaptureDevicePositionFront; + case MTBCameraBack: + return AVCaptureDevicePositionBack; + } + + NSAssert(NO, @"Invalid camera type: %lu", (unsigned long)camera); + return AVCaptureDevicePositionUnspecified; +} + +#pragma mark - Default Values + +- (NSArray *)defaultMetaDataObjectTypes { + NSMutableArray *types = [@[AVMetadataObjectTypeQRCode, + AVMetadataObjectTypeUPCECode, + AVMetadataObjectTypeCode39Code, + AVMetadataObjectTypeCode39Mod43Code, + AVMetadataObjectTypeEAN13Code, + AVMetadataObjectTypeEAN8Code, + AVMetadataObjectTypeCode93Code, + AVMetadataObjectTypeCode128Code, + AVMetadataObjectTypePDF417Code, + AVMetadataObjectTypeAztecCode] mutableCopy]; + + if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) { + [types addObjectsFromArray:@[AVMetadataObjectTypeInterleaved2of5Code, + AVMetadataObjectTypeITF14Code, + AVMetadataObjectTypeDataMatrixCode + ]]; + } + + return [types copy]; +} + +#pragma mark - Helper Methods + +- (void)addObservers { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleApplicationDidChangeStatusBarNotification:) + name:UIApplicationDidChangeStatusBarOrientationNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(applicationWillEnterForegroundNotification:) + name:UIApplicationWillEnterForegroundNotification + object:nil]; +} + +- (void)setupSessionQueue { + NSAssert(self.privateSessionQueue == NULL, @"Queue should only be set up once"); + + if (self.privateSessionQueue) { + return; + } + + self.privateSessionQueue = dispatch_queue_create("com.mikebuss.MTBBarcodeScanner.captureSession", DISPATCH_QUEUE_SERIAL); +} + +- (void)setDeviceInput:(AVCaptureDeviceInput *)deviceInput session:(AVCaptureSession *)session { + if (deviceInput == nil) { + // Nil device inputs cannot be added to instances of AVCaptureSession + return; + } + + [self removeDeviceInput:self.currentCaptureDeviceInput session:session]; + + self.currentCaptureDeviceInput = deviceInput; + [self updateFocusPreferencesOfDevice:deviceInput.device reset:NO]; + + [session addInput:deviceInput]; +} + +- (void)removeDeviceInput:(AVCaptureDeviceInput *)deviceInput session:(AVCaptureSession *)session { + if (deviceInput == nil) { + // No need to remove the device input if it was never set + return; + } + + // Restore focus settings to the previously saved state + [self updateFocusPreferencesOfDevice:deviceInput.device reset:YES]; + + [session removeInput:deviceInput]; + self.currentCaptureDeviceInput = nil; +} + +- (void)updateFocusPreferencesOfDevice:(AVCaptureDevice *)inputDevice reset:(BOOL)reset { + NSParameterAssert(inputDevice); + + if (!inputDevice) { + return; + } + + NSError *lockError; + + if (![inputDevice lockForConfiguration:&lockError]) { + NSLog(@"Failed to acquire lock to (re)set focus options: %@", lockError); + return; + } + + // Prioritize the focus on objects near to the device + if (inputDevice.isAutoFocusRangeRestrictionSupported) { + if (!reset) { + self.initialAutoFocusRangeRestriction = inputDevice.autoFocusRangeRestriction; + inputDevice.autoFocusRangeRestriction = self.preferredAutoFocusRangeRestriction; + } else { + inputDevice.autoFocusRangeRestriction = self.initialAutoFocusRangeRestriction; + } + } + + // Focus on the center of the image + if (inputDevice.isFocusPointOfInterestSupported) { + if (!reset) { + self.initialFocusPoint = inputDevice.focusPointOfInterest; + inputDevice.focusPointOfInterest = CGPointMake(kFocalPointOfInterestX, kFocalPointOfInterestY); + } else { + inputDevice.focusPointOfInterest = self.initialFocusPoint; + } + } + + [inputDevice unlockForConfiguration]; + + // this method will acquire its own lock + [self updateForTorchMode:self.torchMode error:nil]; +} + +#pragma mark - Torch Control + +- (void)setTorchMode:(MTBTorchMode)torchMode { + [self setTorchMode:torchMode error:nil]; +} + +- (BOOL)setTorchMode:(MTBTorchMode)torchMode error:(NSError **)error { + if ([self updateForTorchMode:torchMode error:error]) { + // we only update our internal state if setting the torch mode was successful + _torchMode = torchMode; + return YES; + } + + return NO; +} + +- (void)toggleTorch { + switch (self.torchMode) { + case MTBTorchModeOn: + self.torchMode = MTBTorchModeOff; + break; + + case MTBTorchModeOff: + self.torchMode = MTBTorchModeOn; + break; + } +} + +- (BOOL)updateForTorchMode:(MTBTorchMode)preferredTorchMode error:(NSError **)error { + AVCaptureDevice *backCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; + AVCaptureTorchMode avTorchMode = [self avTorchModeForMTBTorchMode:preferredTorchMode]; + + if (!([backCamera isTorchAvailable] && [backCamera isTorchModeSupported:avTorchMode])) { + if (error) { + *error = [NSError errorWithDomain:kErrorDomain + code:kErrorCodeTorchModeUnavailable + userInfo:@{NSLocalizedDescriptionKey : @"Torch unavailable or mode not supported."}]; + } + + return NO; + } + + if (![backCamera lockForConfiguration:error]) { + NSLog(@"Failed to acquire lock to update torch mode."); + return NO; + } + + [backCamera setTorchMode:avTorchMode]; + [backCamera unlockForConfiguration]; + + return YES; +} + +- (BOOL)hasTorch { + AVCaptureDevice *captureDevice = [self newCaptureDeviceWithCamera:self.camera]; + NSError *error = nil; + AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; + return input.device.hasTorch; +} + +- (AVCaptureTorchMode)avTorchModeForMTBTorchMode:(MTBTorchMode)torchMode { + switch (torchMode) { + case MTBTorchModeOn: + return AVCaptureTorchModeOn; + + case MTBTorchModeOff: + return AVCaptureTorchModeOff; + } + + NSAssert(NO, @"Invalid torch mode: %lu", (unsigned long)torchMode); + return AVCaptureTorchModeOff; +} + +#pragma mark - Capture + +- (void)freezeCapture { + self.capturePreviewLayer.connection.enabled = NO; + + dispatch_async(self.privateSessionQueue, ^{ + [self.session stopRunning]; + }); +} + +- (void)unfreezeCapture { + if (!self.session) { + return; + } + + self.capturePreviewLayer.connection.enabled = YES; + + if (!self.session.isRunning) { + [self setDeviceInput:self.currentCaptureDeviceInput session:self.session]; + + dispatch_async(self.privateSessionQueue, ^{ + [self.session startRunning]; + }); + } +} + + +- (void)captureStillImage:(void (^)(UIImage *image, NSError *error))captureBlock { + if ([self isCapturingStillImage]) { + if (captureBlock) { + NSError *error = [NSError errorWithDomain:kErrorDomain + code:kErrorCodeStillImageCaptureInProgress + userInfo:@{NSLocalizedDescriptionKey : @"Still image capture is already in progress. Check with isCapturingStillImage"}]; + captureBlock(nil, error); + } + return; + } + + if (NSClassFromString(@"AVCapturePhotoOutput")) { + AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings]; + AVCapturePhotoOutput *output = [[AVCapturePhotoOutput alloc] init]; + [self.session addOutput:output]; + self.stillImageCaptureBlock = captureBlock; + [output capturePhotoWithSettings:settings delegate:self]; + } else { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + AVCaptureConnection *stillConnection = [self.stillImageOutput connectionWithMediaType:AVMediaTypeVideo]; + if (stillConnection == nil) { + if (captureBlock) { + NSError *error = [NSError errorWithDomain:kErrorDomain + code:kErrorCodeSessionIsClosed + userInfo:@{NSLocalizedDescriptionKey : @"AVCaptureConnection is closed"}]; + captureBlock(nil, error); + } + return; + } + + [self.stillImageOutput captureStillImageAsynchronouslyFromConnection:stillConnection + completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { + if (error) { + captureBlock(nil, error); + return; + } + + NSData *jpegData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; + UIImage *image = [UIImage imageWithData:jpegData]; + if (captureBlock) { + captureBlock(image, nil); + } + }]; +#pragma GCC diagnostic pop + } +} + +#pragma mark - AVCapturePhotoCaptureDelegate + +- (void)captureOutput:(AVCapturePhotoOutput *)captureOutput didFinishProcessingPhotoSampleBuffer:(CMSampleBufferRef)photoSampleBuffer previewPhotoSampleBuffer:(CMSampleBufferRef)previewPhotoSampleBuffer resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings bracketSettings:(AVCaptureBracketedStillImageSettings *)bracketSettings error:(NSError *)error { + NSData *data = [AVCapturePhotoOutput JPEGPhotoDataRepresentationForJPEGSampleBuffer:photoSampleBuffer previewPhotoSampleBuffer:previewPhotoSampleBuffer]; + UIImage *image = nil; + if (data) { + image = [UIImage imageWithData:data]; + } + + if (self.stillImageCaptureBlock) { + self.stillImageCaptureBlock(image, error); + } + + [self.session removeOutput:captureOutput]; +} + +- (BOOL)isCapturingStillImage { + return self.stillImageOutput.isCapturingStillImage; +} + +#pragma mark - Setters + +- (void)setCamera:(MTBCamera)camera { + [self setCamera:camera error:nil]; +} + +- (BOOL)setCamera:(MTBCamera)camera error:(NSError **)error { + if (camera == _camera) { + return YES; + } + + if (!self.isScanning) { + if (error) { + *error = [NSError errorWithDomain:kErrorDomain + code:kErrorCodeNotScanning + userInfo:@{NSLocalizedDescriptionKey : @"Camera cannot be set when isScanning is NO"}]; + } + + return NO; + } + + AVCaptureDevice *captureDevice = [self newCaptureDeviceWithCamera:camera]; + AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:error]; + + if (!input) { + // we rely on deviceInputWithDevice:error to populate the error in this case + return NO; + } + + [self setDeviceInput:input session:self.session]; + _camera = camera; + + return YES; +} + +- (void)setScanRect:(CGRect)scanRect { + NSAssert(!CGRectIsEmpty(scanRect), @"Unable to set an empty rectangle as the scanRect of MTBBarcodeScanner"); + NSAssert(self.isScanning, @"Scan rect cannot be set when not (yet) scanning. You may want to set it within didStartScanningBlock."); + + if (!self.isScanning) { + return; + } + + [self refreshVideoOrientation]; + + _scanRect = scanRect; + + dispatch_async(self.privateSessionQueue, ^{ + self.captureOutput.rectOfInterest = [self.capturePreviewLayer metadataOutputRectOfInterestForRect:_scanRect]; + }); +} + +- (void)setPreferredAutoFocusRangeRestriction:(AVCaptureAutoFocusRangeRestriction)preferredAutoFocusRangeRestriction { + if (preferredAutoFocusRangeRestriction == _preferredAutoFocusRangeRestriction) { + return; + } + + _preferredAutoFocusRangeRestriction = preferredAutoFocusRangeRestriction; + + if (!self.currentCaptureDeviceInput) { + // the setting will be picked up once a new session incl. device input is created + return; + } + + [self updateFocusPreferencesOfDevice:self.currentCaptureDeviceInput.device reset:NO]; +} + +#pragma mark - Getters + +- (CALayer *)previewLayer { + return self.capturePreviewLayer; +} + +#pragma mark - Helper Methods + +- (CGRect)rectOfInterestFromScanRect:(CGRect)scanRect { + CGRect rect = CGRectZero; + if (!CGRectIsEmpty(self.scanRect)) { + rect = [self.capturePreviewLayer metadataOutputRectOfInterestForRect:self.scanRect]; + } else { + rect = CGRectMake(0, 0, 1, 1); // Default rectOfInterest for AVCaptureMetadataOutput + } + return rect; +} + +@end diff --git a/ios/Classes/TiBarcodeModule.h b/ios/Classes/TiBarcodeModule.h old mode 100755 new mode 100644 index 77f60e08..809713cb --- a/ios/Classes/TiBarcodeModule.h +++ b/ios/Classes/TiBarcodeModule.h @@ -1,44 +1,42 @@ /** * Ti.Barcode Module - * Copyright (c) 2010-2013 by Appcelerator, Inc. All Rights Reserved. + * Copyright (c) 2010-2018 by Appcelerator, Inc. All Rights Reserved. * Please see the LICENSE included with this distribution for details. */ +#import "MTBBarcodeScanner.h" +#import "TiBarcodeViewController.h" #import "TiModule.h" -#import "ZXingWidgetController.h" -#import "DecoderDelegate.h" -#import "TwoDDecoderResult.h" - -@interface TiBarcodeModule : TiModule -{ - ZXingWidgetController *controller; - BOOL animate; - BOOL keepOpen; - BOOL useFrontCamera; - BOOL led; +@class TiOverlayView; + +@interface TiBarcodeModule : TiModule { + @private + TiBarcodeViewController *_barcodeViewController; + MTBCamera _selectedCamera; + MTBTorchMode _selectedLEDMode; + NSString *_displayedMessage; } -@property(nonatomic,readonly) NSNumber *UNKNOWN; -@property(nonatomic,readonly) NSNumber *URL; -@property(nonatomic,readonly) NSNumber *SMS; -@property(nonatomic,readonly) NSNumber *TELEPHONE; -@property(nonatomic,readonly) NSNumber *TEXT; -@property(nonatomic,readonly) NSNumber *CALENDAR; -@property(nonatomic,readonly) NSNumber *GEOLOCATION; -@property(nonatomic,readonly) NSNumber *EMAIL; -@property(nonatomic,readonly) NSNumber *CONTACT; -@property(nonatomic,readonly) NSNumber *BOOKMARK; -@property(nonatomic,readonly) NSNumber *WIFI; - -@property(nonatomic,readonly) NSNumber *FORMAT_NONE; -@property(nonatomic,readonly) NSNumber *FORMAT_QR_CODE; -@property(nonatomic,readonly) NSNumber *FORMAT_DATA_MATRIX; -@property(nonatomic,readonly) NSNumber *FORMAT_UPC_E; -@property(nonatomic,readonly) NSNumber *FORMAT_UPC_A; -@property(nonatomic,readonly) NSNumber *FORMAT_EAN_8; -@property(nonatomic,readonly) NSNumber *FORMAT_EAN_13; -@property(nonatomic,readonly) NSNumber *FORMAT_CODE_128; -@property(nonatomic,readonly) NSNumber *FORMAT_CODE_39; -@property(nonatomic,readonly) NSNumber *FORMAT_ITF; +- (NSNumber *)canShow:(id)unused; + +- (void)capture:(id)args; + +- (void)freezeCapture:(id)unused; + +- (void)unfreezeCapture:(id)unused; + +- (void)captureStillImage:(id)value; + +- (void)cancel:(id)unused; + +- (void)setUseLED:(NSNumber *)value; + +- (NSNumber *)useLED; + +- (void)setAllowRotation:(NSNumber *)value; + +- (void)setUseFrontCamera:(NSNumber *)value; + +- (NSNumber *)useFrontCamera; @end diff --git a/ios/Classes/TiBarcodeModule.m b/ios/Classes/TiBarcodeModule.m new file mode 100644 index 00000000..e8f746d0 --- /dev/null +++ b/ios/Classes/TiBarcodeModule.m @@ -0,0 +1,642 @@ +/** + * Ti.Barcode Module + * Copyright (c) 2010-2018 by Appcelerator, Inc. All Rights Reserved. + * Please see the LICENSE included with this distribution for details. + */ + +#import "TiBarcodeModule.h" +#import "LayoutConstraint.h" +#import "TiApp.h" +#import "TiBase.h" +#import "TiHost.h" +#import "TiOverlayView.h" +#import "TiUtils.h" +#import "TiViewProxy.h" + +@implementation TiBarcodeModule + +#pragma mark Internal + +- (id)moduleGUID +{ + return @"fe2e658e-0eaf-44a6-b6d1-c074d6b986a3"; +} + +- (NSString *)moduleId +{ + return @"ti.barcode"; +} + +#pragma mark Lifecycle + +- (void)startup +{ + [super startup]; +} + +- (id)_initWithPageContext:(id)context +{ + if (self = [super _initWithPageContext:context]) { + _selectedCamera = MTBCameraBack; + _selectedLEDMode = MTBTorchModeOff; + } + + return self; +} + +#pragma mark Public API's + +- (NSNumber *)canShow:(id)unused +{ + return @([MTBBarcodeScanner cameraIsPresent] && ![MTBBarcodeScanner scanningIsProhibited]); +} + +- (void)capture:(id)args +{ + ENSURE_UI_THREAD(capture, args); + ENSURE_SINGLE_ARG_OR_NIL(args, NSDictionary); + + BOOL keepOpen = [TiUtils boolValue:[args objectForKey:@"keepOpen"] def:NO]; + BOOL animate = [TiUtils boolValue:[args objectForKey:@"animate"] def:YES]; + BOOL showCancel = [TiUtils boolValue:@"showCancel" properties:args def:YES]; + BOOL showRectangle = [TiUtils boolValue:@"showRectangle" properties:args def:YES]; + NSString *displayedMessage = [TiUtils stringValue:[self valueForUndefinedKey:@"displayedMessage"]]; + + NSMutableArray *acceptedFormats = [self metaDataObjectListFromFormtArray:[args objectForKey:@"acceptedFormats"]]; + TiViewProxy *overlayProxy = [args objectForKey:@"overlay"]; + + if (acceptedFormats.count != 0) { + if ([acceptedFormats containsObject:@"-1"]) { + NSLog(@"[WARN] The code-format FORMAT_NONE is deprecated. Use an empty array instead or don't specify formats."); + [acceptedFormats removeObject:@"-1"]; + } + } else { + [acceptedFormats addObjectsFromArray:@[ AVMetadataObjectTypeQRCode, AVMetadataObjectTypeDataMatrixCode, AVMetadataObjectTypeUPCECode, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeCode39Mod43Code, AVMetadataObjectTypeITF14Code, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeAztecCode, AVMetadataObjectTypeInterleaved2of5Code ]]; + } + + NSError *error = nil; + NSError *cameraError = nil; + UIView *overlayView = nil; + if (overlayProxy != nil) { + overlayView = [self prepareOverlayWithProxy:overlayProxy]; + } + _barcodeViewController = [[TiBarcodeViewController alloc] initWithObjectTypes:acceptedFormats delegate:self showCancel:showCancel showRectangle:showRectangle withOverlay:overlayView]; + [[_barcodeViewController scanner] setCamera:_selectedCamera ?: MTBCameraBack error:&cameraError]; + + if (displayedMessage != nil) { + [[_barcodeViewController overlayView] setDisplayMessage:_displayedMessage]; + } + if (cameraError) { + [self fireEvent:@"error" + withObject:@{ + @"message" : [cameraError localizedDescription] ?: @"Unknown error occurred." + }]; + } + + [[_barcodeViewController scanner] setTorchMode:MTBTorchModeOff]; + + [[_barcodeViewController scanner] startScanningWithResultBlock:^(NSArray *codes) { + if (!codes || [codes count] == 0) { + return; + } + [self handleSuccessResult:[(AVMetadataMachineReadableCodeObject *)[codes firstObject] stringValue]]; + + if (!keepOpen) { + [self closeScanner]; + } + } error:&error]; + + if (error) { + [self fireEvent:@"error" + withObject:@{ + @"message" : [error localizedDescription] ?: @"Unknown error occurred." + }]; + + if (!keepOpen) { + [self closeScanner]; + } + } + + [[[[TiApp app] controller] topPresentedController] presentViewController:_barcodeViewController + animated:animate + completion:^{ + [[_barcodeViewController scanner] setTorchMode:_selectedLEDMode ?: MTBTorchModeOff]; + }]; +} + +- (void)freezeCapture:(id)unused +{ + ENSURE_UI_THREAD(freezeCapture, unused); + [[_barcodeViewController scanner] freezeCapture]; +} + +- (void)unfreezeCapture:(id)unused +{ + ENSURE_UI_THREAD(unfreezeCapture, unused); + [[_barcodeViewController scanner] unfreezeCapture]; +} + +- (void)captureStillImage:(id)value +{ + ENSURE_UI_THREAD(captureStillImage, value); + ENSURE_SINGLE_ARG(value, KrollCallback); + + [[_barcodeViewController scanner] captureStillImage:^(UIImage *image, NSError *error) { + TiBlob *blob = [[TiBlob alloc] _initWithPageContext:[self pageContext]]; + [blob setImage:image]; + [blob setMimeType:@"image/png" type:TiBlobTypeImage]; + + NSDictionary *event = [NSDictionary dictionaryWithObject:blob forKey:@"image"]; + [self _fireEventToListener:@"blob" withObject:event listener:(KrollCallback *)value thisObject:nil]; + }]; +} + +- (void)cancel:(id)unused +{ + ENSURE_UI_THREAD(cancel, unused); + + [self closeScanner]; + [self fireEvent:@"cancel" withObject:nil]; +} + +- (void)setUseLED:(NSNumber *)value +{ + ENSURE_TYPE(value, NSNumber); + [self replaceValue:value forKey:@"useLED" notification:NO]; + + _selectedLEDMode = [TiUtils boolValue:value def:YES] ? MTBTorchModeOn : MTBTorchModeOff; + + if (_barcodeViewController != nil) { + [[_barcodeViewController scanner] setTorchMode:_selectedLEDMode]; + } +} + +- (NSNumber *)useLED +{ + return @(_selectedLEDMode == MTBTorchModeOn); +} + +- (void)setAllowRotation:(NSNumber *)value +{ + DEPRECATED_REMOVED(@"Barcode.allowRotation", @"2.0.0", @"2.0.0"); +} + +- (void)setUseFrontCamera:(NSNumber *)value +{ + ENSURE_TYPE(value, NSNumber); + [self replaceValue:value forKey:@"useFrontCamera" notification:NO]; + + _selectedCamera = [TiUtils boolValue:value def:YES] ? MTBCameraFront : MTBCameraBack; + NSError *cameraError = nil; + + if (_barcodeViewController != nil) { + [[_barcodeViewController scanner] setCamera:_selectedCamera error:&cameraError]; + + if (cameraError) { + [self fireEvent:@"error" + withObject:@{ + @"message" : [cameraError localizedDescription] ?: @"Unknown error occurred." + }]; + } + } +} + +- (NSNumber *)useFrontCamera +{ + return @(_selectedCamera == MTBCameraFront); +} + +- (NSNumber *)parse:(id)args +{ + ENSURE_SINGLE_ARG(args, NSDictionary); + + TiBlob *blob = [args valueForKey:@"image"]; + ENSURE_TYPE(blob, TiBlob); + + UIImage *image = [blob image]; + CIImage *ciImage = [[CIImage alloc] initWithImage:image]; + CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{ CIDetectorAccuracy : CIDetectorAccuracyLow }]; + NSArray *features = [detector featuresInImage:ciImage]; + NSMutableString *result = [[NSMutableString alloc] init]; + for (CIFeature *feature in features) { + if ([feature.type isEqualToString:CIFeatureTypeQRCode]) { + [result appendString:[(CIQRCodeFeature *)feature messageString]]; + } + } + if ([result length] > 0) { + [self handleSuccessResult:result]; + } else { + [self fireEvent:@"error" withObject:@{ @"message" : @"Unknown error occurred." }]; + return @(NO); + } + return @(YES); +} + +#pragma mark Internal + + +- (NSMutableArray *)metaDataObjectListFromFormtArray:(NSArray *)formatArray +{ + // For backward compatibility and parity + NSMutableArray *convertedArray = [NSMutableArray arrayWithCapacity:[formatArray count]]; + for (NSNumber *number in formatArray) { + NSString *object = @"-1"; + switch ([number integerValue]) { + case TiMetadataObjectTypeNone: + object = @"-1"; + break; + case TiMetadataObjectTypeQRCode: + object = AVMetadataObjectTypeQRCode; + break; + case TiMetadataObjectTypeDataMatrixCode: + object = AVMetadataObjectTypeDataMatrixCode; + break; + case TiMetadataObjectTypeUPCECode: + object = AVMetadataObjectTypeUPCECode; + break; + case TiMetadataObjectTypeUPCACode: + object = AVMetadataObjectTypeEAN13Code; + break; + case TiMetadataObjectTypeEAN8Code: + object = AVMetadataObjectTypeEAN8Code; + break; + case TiMetadataObjectTypeEAN13Code: + object = AVMetadataObjectTypeEAN13Code; + break; + case TiMetadataObjectTypeCode128Code: + object = AVMetadataObjectTypeCode128Code; + break; + case TiMetadataObjectTypeCode39Code: + object = AVMetadataObjectTypeCode39Code; + break; + case TiMetadataObjectTypeCode93Code: + object = AVMetadataObjectTypeCode93Code; + break; + case TiMetadataObjectTypeCode39Mod43Code: + object = AVMetadataObjectTypeCode39Mod43Code; + break; + case TiMetadataObjectTypeITF14Code: + object = AVMetadataObjectTypeITF14Code; + break; + case TiMetadataObjectTypePDF417Code: + object = AVMetadataObjectTypePDF417Code; + break; + case TiMetadataObjectTypeAztecCode: + object = AVMetadataObjectTypeAztecCode; + break; + case TiMetadataObjectTypeFace: + object = AVMetadataObjectTypeFace; + break; + case TiMetadataObjectTypeInterleaved2of5Code: + object = AVMetadataObjectTypeInterleaved2of5Code; + break; + } + [convertedArray addObject:object]; + } + return convertedArray; +} + +- (UIView *)prepareOverlayWithProxy:(TiViewProxy *)overlayProxy +{ + [overlayProxy windowWillOpen]; + +#ifndef TI_USE_AUTOLAYOUT + ApplyConstraintToViewWithBounds([overlayProxy layoutProperties], (TiUIView *)[overlayProxy view], [[UIScreen mainScreen] bounds]); +#else + CGSize size = [overlayProxy view].bounds.size; + + CGSize s = [[overlayProxy view] sizeThatFits:CGSizeMake(MAXFLOAT, MAXFLOAT)]; + CGFloat width = s.width; + CGFloat height = s.height; + + if (width > 0 && height > 0) { + size = CGSizeMake(width, height); + } + + if (CGSizeEqualToSize(size, CGSizeZero) || width == 0 || height == 0) { + size = [UIScreen mainScreen].bounds.size; + } + + CGRect rect = CGRectMake(0, 0, size.width, size.height); + [TiUtils setView:[overlayProxy view] positionRect:rect]; + [overlayProxy layoutChildren:NO]; +#endif + + return [overlayProxy view]; +} + +- (void)closeScanner +{ + if (_barcodeViewController == nil) { + NSLog(@"[ERROR] Trying to dismiss a scanner that hasn't been created, yet. Try again, Marty!"); + return; + } + if ([[_barcodeViewController scanner] isScanning]) { + [[_barcodeViewController scanner] stopScanning]; + } + + [_barcodeViewController setScanner:nil]; + [[[[_barcodeViewController view] subviews] objectAtIndex:0] removeFromSuperview]; + [_barcodeViewController dismissViewControllerAnimated:YES completion:nil]; +} + +#pragma mark Parsing Utility Methods + +- (void)parseMeCard:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSString *payload = [content substringFromIndex:7]; + NSArray *tokens = [payload componentsSeparatedByString:@";"]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + for (NSString *token in tokens) { + NSRange range = [token rangeOfString:@":"]; + if (range.location == NSNotFound) + continue; + NSString *key = [token substringToIndex:range.location]; + if ([key isEqualToString:@""]) + continue; + NSString *value = [token substringFromIndex:range.location + 1]; + if ([key isEqualToString:@"N"]) { + key = @"NAME"; + } + value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; + [data setObject:value forKey:[key lowercaseString]]; + } + [event setObject:data forKey:@"data"]; +} + +- (void)parseWifi:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSString *payload = [content substringFromIndex:5]; + NSArray *tokens = [payload componentsSeparatedByString:@";"]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + for (NSString *token in tokens) { + NSRange range = [token rangeOfString:@":"]; + if (range.location == NSNotFound) + continue; + NSString *key = [token substringToIndex:range.location]; + if ([key isEqualToString:@""]) + continue; + NSString *value = [token substringFromIndex:range.location + 1]; + value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; + [data setObject:value forKey:[key lowercaseString]]; + } + [event setObject:data forKey:@"data"]; +} + +- (void)parseBookmark:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSString *payload = [content substringFromIndex:6]; + NSArray *tokens = [payload componentsSeparatedByString:@";"]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + for (NSString *token in tokens) { + NSRange range = [token rangeOfString:@":"]; + if (range.location == NSNotFound) + continue; + NSString *key = [token substringToIndex:range.location]; + if ([key isEqualToString:@""]) + continue; + NSString *value = [token substringFromIndex:range.location + 1]; + value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; + [data setObject:value forKey:[key lowercaseString]]; + } + [event setObject:data forKey:@"data"]; +} + +- (void)parseGeolocation:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSString *payload = [content substringFromIndex:4]; + NSArray *tokens = [payload componentsSeparatedByString:@","]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + @try { + [data setObject:[tokens objectAtIndex:0] forKey:@"latitude"]; + [data setObject:[tokens objectAtIndex:1] forKey:@"longitude"]; + } + @catch (NSException *e) { + NSLog(@"[WARN] Not all parameters available for parsing geolocation"); + } + [event setObject:data forKey:@"data"]; +} + +- (void)parseMailto:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSString *payload = [content substringFromIndex:7]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + [data setObject:payload forKey:@"email"]; + [event setObject:data forKey:@"data"]; +} + +- (void)parseTel:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSString *payload = [content substringFromIndex:4]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + [data setObject:payload forKey:@"phonenumber"]; + [event setObject:data forKey:@"data"]; +} + +- (void)parseSms:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSString *payload = [content substringFromIndex:4]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + [data setObject:payload forKey:@"phonenumber"]; + [event setObject:data forKey:@"data"]; +} + +- (void)parseSmsTo:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSString *payload = [content substringFromIndex:6]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + NSRange range = [payload rangeOfString:@":"]; + if (range.location == NSNotFound) { + [data setObject:payload forKey:@"phonenumber"]; + } else { + [data setObject:[payload substringToIndex:range.location] forKey:@"phonenumber"]; + [data setObject:[payload substringFromIndex:range.location + 1] forKey:@"message"]; + } + [event setObject:data forKey:@"data"]; +} + +- (void)parseEmailto:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSString *payload = [content substringFromIndex:5]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + NSArray *tokens = [payload componentsSeparatedByString:@":"]; + + @try { + if ([tokens count] >= 1) + [data setObject:[tokens objectAtIndex:0] forKey:@"email"]; + if ([tokens count] >= 2) + [data setObject:[tokens objectAtIndex:1] forKey:@"subject"]; + if ([tokens count] >= 3) + [data setObject:[tokens objectAtIndex:2] forKey:@"message"]; + } + @catch (NSException *e) { + NSLog(@"[WARN] Not all parameters available for parsing E-Mail"); + } + [event setObject:data forKey:@"data"]; +} + +- (void)parseVcard:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + for (NSString *token in [content componentsSeparatedByString:@"\n"]) { + if ([token hasPrefix:@"BEGIN:VCARD"]) + continue; + if ([token hasPrefix:@"END:VCARD"]) + break; + NSRange range = [token rangeOfString:@":"]; + if (range.location == NSNotFound) + continue; + NSString *key = [token substringToIndex:range.location]; + NSString *value = [token substringFromIndex:range.location + 1]; + if ([key isEqualToString:@"N"]) { + key = @"NAME"; + } + value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; + [data setObject:value forKey:[key lowercaseString]]; + } + [event setObject:data forKey:@"data"]; +} + +- (void)parseVevent:(NSMutableDictionary *)event withString:(NSString *)content +{ + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + for (NSString *token in [content componentsSeparatedByString:@"\n"]) { + if ([token hasPrefix:@"BEGIN:VEVENT"]) + continue; + if ([token hasPrefix:@"END:VEVENT"]) + break; + NSRange range = [token rangeOfString:@":"]; + if (range.location == NSNotFound) + continue; + NSString *key = [token substringToIndex:range.location]; + NSString *value = [token substringFromIndex:range.location + 1]; + if ([key isEqualToString:@"N"]) { + key = @"NAME"; + } + value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; + if (value != nil) { + [data setObject:[value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] + forKey:[key lowercaseString]]; + } + } + [event setObject:data forKey:@"data"]; +} + +- (void)parseSuccessResult:(NSString *)result +{ + NSLog(@"[DEBUG] Received barcode result = %@", result); + + NSMutableDictionary *event = [NSMutableDictionary dictionary]; + [event setObject:result forKey:@"result"]; + NSString *prefixCheck = [[result substringToIndex:MIN(20, [result length])] lowercaseString]; + if ([prefixCheck hasPrefix:@"http://"] || [prefixCheck hasPrefix:@"https://"]) { + [event setObject:[self URL] forKey:@"contentType"]; + } else if ([prefixCheck hasPrefix:@"sms:"]) { + [event setObject:[self SMS] forKey:@"contentType"]; + [self parseSms:event withString:result]; + } else if ([prefixCheck hasPrefix:@"smsto:"]) { + [event setObject:[self SMS] forKey:@"contentType"]; + [self parseSmsTo:event withString:result]; + } else if ([prefixCheck hasPrefix:@"tel:"]) { + [event setObject:[self TELEPHONE] forKey:@"contentType"]; + [self parseTel:event withString:result]; + } else if ([prefixCheck hasPrefix:@"begin:vevent"]) { + [event setObject:[self CALENDAR] forKey:@"contentType"]; + [self parseVevent:event withString:result]; + } else if ([prefixCheck hasPrefix:@"mecard:"]) { + [event setObject:[self CONTACT] forKey:@"contentType"]; + [self parseMeCard:event withString:result]; + } else if ([prefixCheck hasPrefix:@"begin:vcard"]) { + [event setObject:[self CONTACT] forKey:@"contentType"]; + [self parseVcard:event withString:result]; + } else if ([prefixCheck hasPrefix:@"mailto:"]) { + [event setObject:[self EMAIL] forKey:@"contentType"]; + [self parseMailto:event withString:result]; + } else if ([prefixCheck hasPrefix:@"smtp:"]) { + [event setObject:[self EMAIL] forKey:@"contentType"]; + [self parseEmailto:event withString:result]; + } else if ([prefixCheck hasPrefix:@"geo:"]) { + [event setObject:[self GEOLOCATION] forKey:@"contentType"]; + [self parseGeolocation:event withString:result]; + } else if ([prefixCheck hasPrefix:@"mebkm:"]) { + [event setObject:[self BOOKMARK] forKey:@"contentType"]; + [self parseBookmark:event withString:result]; + } else if ([prefixCheck hasPrefix:@"wifi:"]) { + [event setObject:[self WIFI] forKey:@"contentType"]; + [self parseWifi:event withString:result]; + } else { + // anything else is assumed to be text + [event setObject:[self TEXT] forKey:@"contentType"]; + } + [self fireEvent:@"success" withObject:event]; +} + +- (void)handleSuccessResult:(NSString *)result +{ + @try { + [self parseSuccessResult:result]; + } + @catch (NSException *e) { + [self fireEvent:@"error" withObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:[e reason], @"message", nil]]; + } +} + +#pragma mark TiOverlayViewDelegate + +- (void)cancelled +{ + [self closeScanner]; +} + +#pragma mark Constants + +MAKE_SYSTEM_PROP(FORMAT_NONE, TiMetadataObjectTypeNone); // Deprecated, don't specify types +MAKE_SYSTEM_PROP(FORMAT_QR_CODE, TiMetadataObjectTypeQRCode); +MAKE_SYSTEM_PROP(FORMAT_DATA_MATRIX, TiMetadataObjectTypeDataMatrixCode); +MAKE_SYSTEM_PROP(FORMAT_UPC_E, TiMetadataObjectTypeUPCECode); +MAKE_SYSTEM_PROP(FORMAT_UPC_A, TiMetadataObjectTypeEAN13Code); // Sub-set +MAKE_SYSTEM_PROP(FORMAT_EAN_8, TiMetadataObjectTypeEAN8Code); +MAKE_SYSTEM_PROP(FORMAT_EAN_13, TiMetadataObjectTypeEAN13Code); +MAKE_SYSTEM_PROP(FORMAT_CODE_128, TiMetadataObjectTypeCode128Code); +MAKE_SYSTEM_PROP(FORMAT_CODE_39, TiMetadataObjectTypeCode39Code); +MAKE_SYSTEM_PROP(FORMAT_CODE_93, TiMetadataObjectTypeCode93Code); // New! +MAKE_SYSTEM_PROP(FORMAT_CODE_39_MOD_43, TiMetadataObjectTypeCode39Mod43Code); // New! +MAKE_SYSTEM_PROP(FORMAT_ITF, TiMetadataObjectTypeITF14Code); +MAKE_SYSTEM_PROP(FORMAT_PDF_417, TiMetadataObjectTypePDF417Code); // New! +MAKE_SYSTEM_PROP(FORMAT_AZTEC, TiMetadataObjectTypeAztecCode); // New! +//MAKE_SYSTEM_PROP(FORMAT_FACE, TiMetadataObjectTypeFace); // New! Not Supported +MAKE_SYSTEM_PROP(FORMAT_INTERLEAVED_2_OF_5, TiMetadataObjectTypeInterleaved2of5Code); // New! + +MAKE_SYSTEM_PROP(UNKNOWN, 0); +MAKE_SYSTEM_PROP(URL, 1); +MAKE_SYSTEM_PROP(SMS, 2); +MAKE_SYSTEM_PROP(TELEPHONE, 3); +MAKE_SYSTEM_PROP(TEXT, 4); +MAKE_SYSTEM_PROP(CALENDAR, 5); +MAKE_SYSTEM_PROP(GEOLOCATION, 6); +MAKE_SYSTEM_PROP(EMAIL, 7); +MAKE_SYSTEM_PROP(CONTACT, 8); +MAKE_SYSTEM_PROP(BOOKMARK, 9); +MAKE_SYSTEM_PROP(WIFI, 10); + + +typedef NS_ENUM(NSInteger, TiMetaDataObjectType) { + TiMetadataObjectTypeNone = -1, + TiMetadataObjectTypeQRCode, + TiMetadataObjectTypeDataMatrixCode, + TiMetadataObjectTypeUPCECode, + TiMetadataObjectTypeUPCACode, + TiMetadataObjectTypeEAN8Code, + TiMetadataObjectTypeEAN13Code, + TiMetadataObjectTypeCode128Code, + TiMetadataObjectTypeCode39Code, + TiMetadataObjectTypeCode93Code, + TiMetadataObjectTypeCode39Mod43Code, + TiMetadataObjectTypeITF14Code, + TiMetadataObjectTypePDF417Code, + TiMetadataObjectTypeAztecCode, + TiMetadataObjectTypeFace, + TiMetadataObjectTypeInterleaved2of5Code +}; + +@end diff --git a/ios/Classes/TiBarcodeModule.mm b/ios/Classes/TiBarcodeModule.mm deleted file mode 100755 index 0ba0ceb5..00000000 --- a/ios/Classes/TiBarcodeModule.mm +++ /dev/null @@ -1,933 +0,0 @@ -/** - * Ti.Barcode Module - * Copyright (c) 2010-2013 by Appcelerator, Inc. All Rights Reserved. - * Please see the LICENSE included with this distribution for details. - */ - -// Has to be an .mm file so that ZXing headers are found correctly -#import "TiBarcodeModule.h" -#import "TiBase.h" -#import "TiHost.h" -#import "TiUtils.h" -#import "TiApp.h" -#import -#import - -#import -#import -#import - -// The ZXing library provides support for a MultiFormatReader. However, it -// does not define an interface AND it does not provide support for the -// 'tryHarder' flag (because the current implementation only calls the -// _decode method which defaults to the DEFAULT_HINTS and does not allow -// the specification of the 'tryHarder' flag). The solution is to create -// our own customer multi-format reader class which defines its own -// hints value AND supports the specification of the 'tryHarder' flag. - -@interface CustomMultiFormatReader : FormatReader { -} --(id) init; --(void) setTryHarder:(BOOL)enable; --(void) setAcceptedFormats:(NSArray*)acceptedFormats; - -@end - -@interface ZXingWidgetController (StatusBarStyle) - -@end - -@implementation ZXingWidgetController (StatusBarStyle) - -// MOD-2183: Fix the statusBarStyle by using the parent one. --(UIStatusBarStyle)preferredStatusBarStyle -{ - return [[[TiApp app] controller] preferredStatusBarStyle]; -} - -// MOD-2190: Fix the orientation by using the parent one. -- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation -{ - return [[[[TiApp app] controller] topContainerController] preferredInterfaceOrientationForPresentation]; -} - -@end - -@implementation CustomMultiFormatReader - -static zxing::DecodeHints decodeHints; - -- (id)init { - // Start with the default set of hints. We can always set these ourself, - // but we might as well use the default set specified by ZXing so that - // if the ZXing library is updated with new formats we do not need to - // make any changes on our side. - decodeHints = zxing::DecodeHints::DEFAULT_HINT; - - // NOTE: The ZXing library supports the DataMatrixReader format but - // it is not defined as part of the default hints in DataHints.h. It - // has been commented out in the current library implementation because - // it has not been officially passed by QA. However, it does appear to - // work sufficiently in testing. We can add support for the DataMatrixReader - // format by adding it to the set of readers supported in the hints field. - // - // If the DataMatrixReader is enabled in a future release of ZXing then - // we can remove this call to add it. But, no harm is done if it is already - // in the list. - decodeHints.addFormat(zxing::BarcodeFormat_DATA_MATRIX); - - zxing::MultiFormatReader *reader = new zxing::MultiFormatReader(); - return [super initWithReader:reader]; -} - -- (void)setTryHarder:(BOOL)enable { - // Setting the 'TryHarder' flag to true tells the ZXing library to - // try both the original image and the image rotated 90 degrees. - decodeHints.setTryHarder(enable); -} - -- (void)setAcceptedFormats:(NSArray*)acceptedFormats { - - zxing::DecodeHints newHints = zxing::DecodeHints(); - newHints.setTryHarder(decodeHints.getTryHarder()); - - for (id format in acceptedFormats) { - newHints.addFormat((zxing::BarcodeFormat)[TiUtils intValue:format]); - } - - decodeHints = newHints; -} - -- (zxing::Ref)decode:(zxing::Ref)grayImage { - return reader_->decode(grayImage, decodeHints); -} - -- (zxing::Ref)decode:(zxing::Ref)grayImage andCallback:(zxing::Ref)callback -{ - zxing::DecodeHints hints = decodeHints; - hints.setResultPointCallback(callback); - return reader_->decode(grayImage, hints); -} - -@end - -@implementation TiBarcodeModule - -#pragma mark Internal - -// this is generated for your module, please do not change it --(id)moduleGUID -{ - return @"fe2e658e-0eaf-44a6-b6d1-c074d6b986a3"; -} - -// this is generated for your module, please do not change it --(NSString*)moduleId -{ - return @"ti.barcode"; -} - -#pragma mark Cleanup and Lifecycle - --(void)_cleanup -{ - if (controller!=nil) - { - [self forgetSelf]; - controller.delegate = nil; - // [MOD-232] Animation controlled by caller - [controller dismissViewControllerAnimated:animate completion:nil]; - } - RELEASE_TO_NIL(controller); -} - --(void)_destroy -{ - [self _cleanup]; - [super _destroy]; -} - - -#pragma Public APIs - --(id)useFrontCamera -{ - return NUMBOOL(useFrontCamera); -} - --(void)setUseFrontCamera:(id)arg -{ - bool val = [TiUtils boolValue:arg def:NO]; - useFrontCamera = val; - - if (controller != nil) { - controller.useFrontCamera = useFrontCamera; - [controller syncDeviceInput]; - } -} - --(void)setUseLED:(id)arg -{ - ENSURE_TYPE(arg, NSNumber); - led = [TiUtils boolValue:arg def:NO]; - - if (controller != nil) { - [controller setTorch:led]; - } -} - --(id)useLED -{ - return NUMBOOL(led); -} - --(id)parse:(id)args -{ - ENSURE_SINGLE_ARG(args,NSDictionary); - - id blob = [args valueForKey:@"image"]; - ENSURE_TYPE(blob, TiBlob); - UIImage* image = [(TiBlob*)blob image]; - - bool tryHarder = [TiUtils boolValue:[self valueForUndefinedKey:@"allowRotation"] def:NO]; - id acceptedFormats = [args valueForKey:@"acceptedFormats"]; - - CustomMultiFormatReader* multiFormatReader = [[CustomMultiFormatReader alloc] init]; - [multiFormatReader setTryHarder:tryHarder]; - if (acceptedFormats != nil) { - ENSURE_ARRAY(acceptedFormats); - [multiFormatReader setAcceptedFormats:acceptedFormats]; - } - - Decoder *d = [[Decoder alloc] init]; - d.keepOpen = keepOpen; - d.readers = [NSSet setWithObject:multiFormatReader]; - d.delegate = self; - - bool retVal = [d decodeImage:image]; - - [d release]; - - return NUMBOOL(retVal); -} - --(void)capture:(id)args -{ - ENSURE_UI_THREAD(capture,args); - ENSURE_SINGLE_ARG(args,NSDictionary); - - [self rememberSelf]; - - BOOL tryHarder = [TiUtils boolValue:[self valueForUndefinedKey:@"allowRotation"] def:NO]; - id acceptedFormats = [args valueForKey:@"acceptedFormats"]; - - // [MOD-232] Allow caller to determine if they want to animate - animate = [TiUtils boolValue:[args objectForKey:@"animate"] def:YES]; - - if (controller!=nil) - { - NSMutableDictionary *event = [NSMutableDictionary dictionary]; - [event setObject:@"device busy" forKey:@"message"]; - [self fireEvent:@"error" withObject:event]; - return; - } - - keepOpen = [TiUtils boolValue:@"keepOpen" properties:args def:NO]; - - // allow an overlay view - TiViewProxy *overlayProxy = [args objectForKey:@"overlay"]; - - if (overlayProxy != nil) { - ENSURE_TYPE(overlayProxy, TiViewProxy); - ENSURE_UI_THREAD(capture, args); - - [overlayProxy windowWillOpen]; - - CGSize size = [overlayProxy view].bounds.size; - -#ifndef TI_USE_AUTOLAYOUT - if ([TiUtils respondsToSelector:@selector - (applyConstraintToView:forProxy:withBounds:)]) { - [TiUtils applyConstraintToView:(TiUIView *)[overlayProxy view] - forProxy:overlayProxy - withBounds:[[UIScreen mainScreen] bounds]]; - } else { - //Remove this else block once minimum sdk version is set to 7.2.0. - - ApplyConstraintToViewWithBounds([overlayProxy layoutProperties], (TiUIView *)[overlayProxy view], [[UIScreen mainScreen] bounds]); - } -#else - CGSize s = [[overlayProxy view] sizeThatFits:CGSizeMake(MAXFLOAT,MAXFLOAT)]; - CGFloat width = s.width; - CGFloat height = s.height; - - if (width > 0 && height > 0) { - size = CGSizeMake(width, height); - } - - if (CGSizeEqualToSize(size, CGSizeZero) || width==0 || height == 0) { - size = [UIScreen mainScreen].bounds.size; - } - - CGRect rect = CGRectMake(0, 0, size.width, size.height); - [TiUtils setView:[overlayProxy view] positionRect:rect]; - [overlayProxy layoutChildren:NO]; -#endif - } - - controller = [[ZXingWidgetController alloc] initWithDelegate:self - showCancel:[TiUtils boolValue:@"showCancel" properties:args def:YES] - showRectangle:[TiUtils boolValue:@"showRectangle" properties:args def:YES] - keepOpen:keepOpen - useFrontCamera:useFrontCamera - OneDMode:NO - withOverlay:[overlayProxy view]]; - - [controller setTorch:led]; - - // Use our custom multi-format reader so that we get all of the formats and - // we can control the 'TryHarder' flag for rotation support - CustomMultiFormatReader* multiFormatReader = [[CustomMultiFormatReader alloc] init]; - [multiFormatReader setTryHarder:tryHarder]; - if (acceptedFormats != nil) { - ENSURE_ARRAY(acceptedFormats); - [multiFormatReader setAcceptedFormats:acceptedFormats]; - } - - NSString* displayedMessage = [TiUtils stringValue:[self valueForUndefinedKey:@"displayedMessage"]]; - if (displayedMessage != nil) { - controller.overlayView.displayedMessage = displayedMessage; - } - - NSSet *readers = [[NSSet alloc] initWithObjects: - multiFormatReader, - nil]; - - [multiFormatReader release]; - - controller.readers = readers; - [readers release]; - - id sound = [args objectForKey:@"soundURL"]; - if (sound!=nil) - { - NSURL *soundURL = [TiUtils toURL:sound proxy:self]; - if (soundURL!=nil) - { - [controller setSoundToPlay:soundURL]; - } - } - - [[[[TiApp app] controller] topPresentedController] presentViewController:controller animated:YES completion:nil]; -} - --(void)cancel:(id)args -{ - ENSURE_UI_THREAD(cancel,args); - - if (controller!=nil) - { - [self performSelector:@selector(zxingControllerDidCancel:) withObject:nil]; - } -} - -#pragma mark System Properties - -MAKE_SYSTEM_PROP(UNKNOWN,0); -MAKE_SYSTEM_PROP(URL,1); -MAKE_SYSTEM_PROP(SMS,2); -MAKE_SYSTEM_PROP(TELEPHONE,3); -MAKE_SYSTEM_PROP(TEXT,4); -MAKE_SYSTEM_PROP(CALENDAR,5); -MAKE_SYSTEM_PROP(GEOLOCATION,6); -MAKE_SYSTEM_PROP(EMAIL,7); -MAKE_SYSTEM_PROP(CONTACT,8); -MAKE_SYSTEM_PROP(BOOKMARK,9); -MAKE_SYSTEM_PROP(WIFI,10); - -MAKE_SYSTEM_PROP(FORMAT_NONE,zxing::BarcodeFormat_None); -MAKE_SYSTEM_PROP(FORMAT_QR_CODE,zxing::BarcodeFormat_QR_CODE); -MAKE_SYSTEM_PROP(FORMAT_DATA_MATRIX,zxing::BarcodeFormat_DATA_MATRIX); -MAKE_SYSTEM_PROP(FORMAT_UPC_E,zxing::BarcodeFormat_UPC_E); -MAKE_SYSTEM_PROP(FORMAT_UPC_A,zxing::BarcodeFormat_UPC_A); -MAKE_SYSTEM_PROP(FORMAT_EAN_8,zxing::BarcodeFormat_EAN_8); -MAKE_SYSTEM_PROP(FORMAT_EAN_13,zxing::BarcodeFormat_EAN_13); -MAKE_SYSTEM_PROP(FORMAT_CODE_128,zxing::BarcodeFormat_CODE_128); -MAKE_SYSTEM_PROP(FORMAT_CODE_39,zxing::BarcodeFormat_CODE_39); -MAKE_SYSTEM_PROP(FORMAT_ITF,zxing::BarcodeFormat_ITF); - - -#pragma mark Parsing Utility Methods - --(void)parseMeCard: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSString *payload = [content substringFromIndex:7]; - NSArray *tokens = [payload componentsSeparatedByString:@";"]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - for (NSString *token in tokens) - { - NSRange range = [token rangeOfString:@":"]; - if (range.location==NSNotFound) continue; - NSString *key = [token substringToIndex:range.location]; - if ([key isEqualToString:@""]) continue; - NSString *value = [token substringFromIndex:range.location+1]; - if ([key isEqualToString:@"N"]) - { - key = @"NAME"; - } - value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; - [data setObject:value forKey:[key lowercaseString]]; - } - [event setObject:data forKey:@"data"]; -} - --(void)parseWifi: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSString *payload = [content substringFromIndex:5]; - NSArray *tokens = [payload componentsSeparatedByString:@";"]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - for (NSString *token in tokens) - { - NSRange range = [token rangeOfString:@":"]; - if (range.location==NSNotFound) continue; - NSString *key = [token substringToIndex:range.location]; - if ([key isEqualToString:@""]) continue; - NSString *value = [token substringFromIndex:range.location+1]; - value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; - [data setObject:value forKey:[key lowercaseString]]; - } - [event setObject:data forKey:@"data"]; -} - --(void)parseBookmark: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSString *payload = [content substringFromIndex:6]; - NSArray *tokens = [payload componentsSeparatedByString:@";"]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - for (NSString *token in tokens) - { - NSRange range = [token rangeOfString:@":"]; - if (range.location==NSNotFound) continue; - NSString *key = [token substringToIndex:range.location]; - if ([key isEqualToString:@""]) continue; - NSString *value = [token substringFromIndex:range.location+1]; - value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; - [data setObject:value forKey:[key lowercaseString]]; - } - [event setObject:data forKey:@"data"]; -} - --(void)parseGeolocation: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSString *payload = [content substringFromIndex:4]; - NSArray *tokens = [payload componentsSeparatedByString:@","]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - @try { - [data setObject:[tokens objectAtIndex:0] forKey:@"latitude"]; - [data setObject:[tokens objectAtIndex:1] forKey:@"longitude"]; - } - @catch (NSException *e) { - NSLog(@"[WARN] Not all parameters available for parsing geolocation"); - } - [event setObject:data forKey:@"data"]; -} - --(void)parseMailto: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSString *payload = [content substringFromIndex:7]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - [data setObject:payload forKey:@"email"]; - [event setObject:data forKey:@"data"]; -} - --(void)parseTel: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSString *payload = [content substringFromIndex:4]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - [data setObject:payload forKey:@"phonenumber"]; - [event setObject:data forKey:@"data"]; -} - --(void)parseSms: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSString *payload = [content substringFromIndex:4]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - [data setObject:payload forKey:@"phonenumber"]; - [event setObject:data forKey:@"data"]; -} - --(void)parseSmsTo: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSString *payload = [content substringFromIndex:6]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - NSRange range = [payload rangeOfString:@":"]; - if (range.location==NSNotFound) - { - [data setObject:payload forKey:@"phonenumber"]; - } - else - { - [data setObject:[payload substringToIndex:range.location] forKey:@"phonenumber"]; - [data setObject:[payload substringFromIndex:range.location+1] forKey:@"message"]; - } - [event setObject:data forKey:@"data"]; -} - --(void)parseEmailto: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSString *payload = [content substringFromIndex:5]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - NSArray *tokens = [payload componentsSeparatedByString:@":"]; - // format SMTP:[email address]:[subject]:[message] - try { - if ([tokens count] >= 1) - [data setObject:[tokens objectAtIndex:0] forKey:@"email"]; - if ([tokens count] >= 2) - [data setObject:[tokens objectAtIndex:1] forKey:@"subject"]; - if ([tokens count] >= 3) - [data setObject:[tokens objectAtIndex:2] forKey:@"message"]; - } - catch (NSException *e) { - NSLog(@"[WARN] Not all parameters available for parsing E-Mail"); - } - [event setObject:data forKey:@"data"]; -} - --(void)parseVcard: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - for (NSString *token in [content componentsSeparatedByString:@"\n"]) - { - if ([token hasPrefix:@"BEGIN:VCARD"]) continue; - if ([token hasPrefix:@"END:VCARD"]) break; - NSRange range = [token rangeOfString:@":"]; - if (range.location==NSNotFound) continue; - NSString *key = [token substringToIndex:range.location]; - NSString *value = [token substringFromIndex:range.location+1]; - if ([key isEqualToString:@"N"]) - { - key = @"NAME"; - } - value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; - [data setObject:value forKey:[key lowercaseString]]; - } - [event setObject:data forKey:@"data"]; -} - --(void)parseVevent: (NSMutableDictionary*)event withString:(NSString*)content -{ - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - for (NSString *token in [content componentsSeparatedByString:@"\n"]) - { - if ([token hasPrefix:@"BEGIN:VEVENT"]) continue; - if ([token hasPrefix:@"END:VEVENT"]) break; - NSRange range = [token rangeOfString:@":"]; - if (range.location==NSNotFound) continue; - NSString *key = [token substringToIndex:range.location]; - id value = [token substringFromIndex:range.location+1]; - if ([key isEqualToString:@"N"]) - { - key = @"NAME"; - } - value = [value stringByReplacingOccurrencesOfString:@"\\:" withString:@":"]; - if (value != nil) { - [data setObject:[value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] - forKey:[key lowercaseString]]; - } - } - [event setObject:data forKey:@"data"]; -} - -#pragma mark Delegate Utility - -- (void)parseSuccessResult:(NSString *)result -{ - NSLog(@"[DEBUG] Received barcode result = %@", result); - - NSMutableDictionary *event = [NSMutableDictionary dictionary]; - [event setObject:result forKey:@"result"]; - NSString *prefixCheck = [[result substringToIndex:MIN(20,[result length])] lowercaseString]; - if ([prefixCheck hasPrefix:@"http://"] || [prefixCheck hasPrefix:@"https://"]) - { - [event setObject:[self URL] forKey:@"contentType"]; - } - else if ([prefixCheck hasPrefix:@"sms:"]) - { - [event setObject:[self SMS] forKey:@"contentType"]; - [self parseSms:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"smsto:"]) - { - [event setObject:[self SMS] forKey:@"contentType"]; - [self parseSmsTo:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"tel:"]) - { - [event setObject:[self TELEPHONE] forKey:@"contentType"]; - [self parseTel:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"begin:vevent"]) - { - [event setObject:[self CALENDAR] forKey:@"contentType"]; - [self parseVevent:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"mecard:"]) - { - [event setObject:[self CONTACT] forKey:@"contentType"]; - [self parseMeCard:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"begin:vcard"]) - { - [event setObject:[self CONTACT] forKey:@"contentType"]; - [self parseVcard:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"mailto:"]) - { - [event setObject:[self EMAIL] forKey:@"contentType"]; - [self parseMailto:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"smtp:"]) - { - [event setObject:[self EMAIL] forKey:@"contentType"]; - [self parseEmailto:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"geo:"]) - { - [event setObject:[self GEOLOCATION] forKey:@"contentType"]; - [self parseGeolocation:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"mebkm:"]) - { - [event setObject:[self BOOKMARK] forKey:@"contentType"]; - [self parseBookmark:event withString:result]; - } - else if ([prefixCheck hasPrefix:@"wifi:"]) - { - [event setObject:[self WIFI] forKey:@"contentType"]; - [self parseWifi:event withString:result]; - } - else - { - // anything else is assumed to be text - [event setObject:[self TEXT] forKey:@"contentType"]; - } - [self fireEvent:@"success" withObject:event]; -} - -- (void)handleSuccessResult:(NSString *)result -{ - @try { - [self parseSuccessResult:result]; - } - @catch (NSException * e) { - [self fireEvent:@"error" withObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:[e reason], @"message", nil]]; - } -} - -#pragma mark ZXing Delegate - -- (void)zxingController:(ZXingWidgetController*)controller_ didScanResult:(NSString *)result -{ - [self handleSuccessResult:result]; - if (!keepOpen) { - [self _cleanup]; - } -} - -- (void)zxingControllerDidCancel:(ZXingWidgetController*)controller_ -{ - [self fireEvent:@"cancel" withObject:[NSMutableDictionary dictionary]]; - [self _cleanup]; -} - -#pragma mark Decoder Delegate - -- (void)decoder:(Decoder *)decoder didDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset withResult:(TwoDDecoderResult *)result -{ - [self handleSuccessResult:result.text]; -} - -- (void)decoder:(Decoder *)decoder failedToDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset reason:(NSString *)reason -{ - [self fireEvent:@"error" withObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:reason, @"message", nil]]; -} - - -#pragma mark Layout methods - -/* - TO DO : This section code is copied from LayoutConstraint of SDK. - Remove this section of code once minimum sdk version is set to 7.2.0. -*/ - -void ApplyConstraintToViewWithBounds(LayoutConstraint *constraint, TiUIView *subView, CGRect viewBounds) -{ - if (constraint == NULL) { - DebugLog(@"[ERROR] No constraints available for view %@.", subView); - return; - } - - UIViewAutoresizing resultMask = UIViewAutoresizingNone; - CGRect resultBounds; - resultBounds.origin = CGPointZero; - resultBounds.size = SizeConstraintViewWithSizeAddingResizing(constraint, (TiViewProxy *)[subView proxy], viewBounds.size, &resultMask); - - CGPoint resultCenter = PositionConstraintGivenSizeBoundsAddingResizing(constraint, (TiViewProxy *)[subView proxy], resultBounds.size, - [[subView layer] anchorPoint], viewBounds.size, viewBounds.size, &resultMask); - - resultCenter.x += resultBounds.origin.x + viewBounds.origin.x; - resultCenter.y += resultBounds.origin.y + viewBounds.origin.y; - - [subView setAutoresizingMask:resultMask]; - [subView setCenter:resultCenter]; - [subView setBounds:resultBounds]; -} - -CGSize SizeConstraintViewWithSizeAddingResizing(LayoutConstraint *constraint, NSObject *autoSizer, CGSize referenceSize, UIViewAutoresizing *resultResizing) -{ - //TODO: Refactor for elegance. - CGFloat width; - BOOL ignorePercent = NO; - CGSize parentSize = CGSizeZero; - - if ([autoSizer isKindOfClass:[TiViewProxy class]]) { - TiViewProxy *parent = [(TiViewProxy *)autoSizer parent]; - if (parent != nil && (!TiLayoutRuleIsAbsolute([parent layoutProperties] -> layoutStyle))) { - //Sandbox with percent values is garbage - ignorePercent = YES; - parentSize = [parent size].rect.size; - } - } - - if (resultResizing != NULL) { - *resultResizing &= ~(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); - } - - switch (constraint->width.type) { - case TiDimensionTypeDip: - width = TiDimensionCalculateValue(constraint->width, referenceSize.width); - break; - case TiDimensionTypePercent: - if (ignorePercent) { - width = TiDimensionCalculateValue(constraint->width, parentSize.width); - } else { - width = TiDimensionCalculateValue(constraint->width, referenceSize.width); - } - break; - case TiDimensionTypeUndefined: - if (!TiDimensionIsUndefined(constraint->left) && !TiDimensionIsUndefined(constraint->centerX)) { - width = 2 * (TiDimensionCalculateValue(constraint->centerX, referenceSize.width) - TiDimensionCalculateValue(constraint->left, referenceSize.width)); - break; - } else if (!TiDimensionIsUndefined(constraint->left) && !TiDimensionIsUndefined(constraint->right)) { - width = TiDimensionCalculateMargins(constraint->left, constraint->right, referenceSize.width); - break; - } else if (!TiDimensionIsUndefined(constraint->centerX) && !TiDimensionIsUndefined(constraint->right)) { - width = 2 * (referenceSize.width - TiDimensionCalculateValue(constraint->right, referenceSize.width) - TiDimensionCalculateValue(constraint->centerX, referenceSize.width)); - break; - } - case TiDimensionTypeAuto: - case TiDimensionTypeAutoSize: - case TiDimensionTypeAutoFill: { - width = TiDimensionCalculateMargins(constraint->left, constraint->right, referenceSize.width); - BOOL autoFill = NO; - //Undefined falls to auto behavior - if (TiDimensionIsUndefined(constraint->width) || TiDimensionIsAuto(constraint->width)) { - //Check if default auto behavior is fill - if ([autoSizer respondsToSelector:@selector(defaultAutoWidthBehavior:)]) { - if (TiDimensionIsAutoFill([autoSizer defaultAutoWidthBehavior:nil])) { - autoFill = YES; - } - } - } - if (TiDimensionIsAutoFill(constraint->width) || autoFill) { - if (resultResizing != NULL) { - *resultResizing |= UIViewAutoresizingFlexibleWidth; - } - break; - } - //If it comes here it has to follow SIZE behavior - if ([autoSizer respondsToSelector:@selector(autoWidthForSize:)]) { - CGFloat desiredWidth = [autoSizer autoWidthForSize:CGSizeMake(width, referenceSize.height)]; - width = width < desiredWidth ? width : desiredWidth; - } else if (resultResizing != NULL) { - *resultResizing |= UIViewAutoresizingFlexibleWidth; - } - break; - } - } - - //Should we always do this or only for auto - if ([autoSizer respondsToSelector:@selector(verifyWidth:)]) { - width = [autoSizer verifyWidth:width]; - } - - CGFloat height; - - switch (constraint->height.type) { - case TiDimensionTypeDip: - height = TiDimensionCalculateValue(constraint->height, referenceSize.height); - break; - case TiDimensionTypePercent: - if (ignorePercent) { - height = TiDimensionCalculateValue(constraint->height, parentSize.height); - } else { - height = TiDimensionCalculateValue(constraint->height, referenceSize.height); - } - break; - case TiDimensionTypeUndefined: - if (!TiDimensionIsUndefined(constraint->top) && !TiDimensionIsUndefined(constraint->centerY)) { - height = 2 * (TiDimensionCalculateValue(constraint->centerY, referenceSize.height) - TiDimensionCalculateValue(constraint->top, referenceSize.height)); - break; - } else if (!TiDimensionIsUndefined(constraint->top) && !TiDimensionIsUndefined(constraint->bottom)) { - height = TiDimensionCalculateMargins(constraint->top, constraint->bottom, referenceSize.height); - break; - } else if (!TiDimensionIsUndefined(constraint->centerY) && !TiDimensionIsUndefined(constraint->bottom)) { - height = 2 * (referenceSize.height - TiDimensionCalculateValue(constraint->centerY, referenceSize.height) - TiDimensionCalculateValue(constraint->bottom, referenceSize.height)); - break; - } - case TiDimensionTypeAuto: - case TiDimensionTypeAutoSize: - case TiDimensionTypeAutoFill: { - height = TiDimensionCalculateMargins(constraint->top, constraint->bottom, referenceSize.height); - BOOL autoFill = NO; - //Undefined falls to auto behavior - if (TiDimensionIsUndefined(constraint->height) || TiDimensionIsAuto(constraint->height)) { - //Check if default auto behavior is fill - if ([autoSizer respondsToSelector:@selector(defaultAutoHeightBehavior:)]) { - if (TiDimensionIsAutoFill([autoSizer defaultAutoHeightBehavior:nil])) { - autoFill = YES; - } - } - } - if (TiDimensionIsAutoFill(constraint->height) || autoFill) { - if (resultResizing != NULL) { - *resultResizing |= UIViewAutoresizingFlexibleHeight; - } - break; - } - //If it comes here it has to follow size behavior - if ([autoSizer respondsToSelector:@selector(autoHeightForSize:)]) { - CGFloat desiredHeight = [autoSizer autoHeightForSize:CGSizeMake(width, height)]; - height = height < desiredHeight ? height : desiredHeight; - } else if (resultResizing != NULL) { - *resultResizing |= UIViewAutoresizingFlexibleHeight; - } - break; - } - } - - //Should we always do this or only for auto - if ([autoSizer respondsToSelector:@selector(verifyHeight:)]) { - height = [autoSizer verifyHeight:height]; - } - - // when you use negative top, you get into a situation where you get smaller - // then intended sizes when using auto. this allows you to set a floor for - // the height/width so that it won't be smaller than specified - defaults to 0 - height = MAX(constraint->minimumHeight, height); - width = MAX(constraint->minimumWidth, width); - - if ((resultResizing != NULL) && [autoSizer respondsToSelector:@selector(verifyAutoresizing:)]) { - *resultResizing = [autoSizer verifyAutoresizing:*resultResizing]; - } - - return CGSizeMake(width, height); -} - -CGPoint PositionConstraintGivenSizeBoundsAddingResizing(LayoutConstraint *constraint, TiViewProxy *viewProxy, CGSize viewSize, CGPoint anchorPoint, CGSize referenceSize, CGSize sandboxSize, UIViewAutoresizing *resultResizing) -{ - BOOL clearMargins = NO; - TiViewProxy *parent = [viewProxy parent]; - if (parent != nil && (!TiLayoutRuleIsAbsolute([parent layoutProperties] -> layoutStyle))) { - //Calculated Sandbox implies fixed margins - clearMargins = YES; - } - - BOOL flexibleSize = *resultResizing & UIViewAutoresizingFlexibleWidth; - - *resultResizing &= ~(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin); - - CGFloat centerX = 0.0f; - - BOOL ignoreMargins = NO; - BOOL isSizeUndefined = TiDimensionIsUndefined(constraint->width); - - CGFloat frameLeft = 0.0; - if (!flexibleSize) { - if (TiDimensionIsUndefined(constraint->width)) { - ignoreMargins = TiDimensionDidCalculateValue(constraint->centerX, referenceSize.width, ¢erX); - } else if (!TiDimensionDidCalculateValue(constraint->left, referenceSize.width, &frameLeft)) { - ignoreMargins = TiDimensionDidCalculateValue(constraint->centerX, referenceSize.width, ¢erX); - } - } - - if (!ignoreMargins) { - //Either the view has flexible width or pins were not defined for positioning - int marginSuggestions = 0; - - if (TiDimensionDidCalculateValue(constraint->left, referenceSize.width, &frameLeft)) { - marginSuggestions++; - } else if (!flexibleSize && !clearMargins) { - *resultResizing |= UIViewAutoresizingFlexibleLeftMargin; - } - - if (isSizeUndefined || (marginSuggestions == 0) || flexibleSize) { - - CGFloat frameRight; - if (TiDimensionDidCalculateValue(constraint->right, referenceSize.width, &frameRight)) { - marginSuggestions++; - frameLeft += sandboxSize.width - viewSize.width - frameRight; - } else if (!flexibleSize && !clearMargins) { - *resultResizing |= UIViewAutoresizingFlexibleRightMargin; - } - } - if (marginSuggestions < 1) { - centerX = sandboxSize.width / 2.0 + viewSize.width * (anchorPoint.x - 0.5); - } else { - centerX = frameLeft / marginSuggestions + viewSize.width * anchorPoint.x; - } - } - - flexibleSize = *resultResizing & UIViewAutoresizingFlexibleHeight; - CGFloat centerY = 0.0f; - - isSizeUndefined = TiDimensionIsUndefined(constraint->height); - ignoreMargins = NO; - CGFloat frameTop = 0.0; - if (!flexibleSize) { - if (TiDimensionIsUndefined(constraint->height)) { - ignoreMargins = TiDimensionDidCalculateValue(constraint->centerY, referenceSize.height, ¢erY); - } else if (!TiDimensionDidCalculateValue(constraint->top, referenceSize.height, &frameTop)) { - ignoreMargins = TiDimensionDidCalculateValue(constraint->centerY, referenceSize.height, ¢erY); - ; - } - } - - if (!ignoreMargins) { - //Either the view has flexible height or pins were not defined for positioning - int marginSuggestions = 0; - - if (TiDimensionDidCalculateValue(constraint->top, referenceSize.height, &frameTop)) { - marginSuggestions++; - } else if (!flexibleSize && !clearMargins) { - *resultResizing |= UIViewAutoresizingFlexibleTopMargin; - } - if (isSizeUndefined || (marginSuggestions == 0) || flexibleSize) { - CGFloat frameBottom; - if (TiDimensionDidCalculateValue(constraint->bottom, referenceSize.height, &frameBottom)) { - marginSuggestions++; - frameTop += sandboxSize.height - viewSize.height - frameBottom; - } else if (!flexibleSize && !clearMargins) { - *resultResizing |= UIViewAutoresizingFlexibleBottomMargin; - } - } - if (marginSuggestions < 1) { - centerY = sandboxSize.height / 2.0 + viewSize.height * (anchorPoint.y - 0.5); - } else { - centerY = frameTop / marginSuggestions + viewSize.height * anchorPoint.y; - } - } - - return CGPointMake(centerX, centerY); -} -@end diff --git a/ios/Classes/TiBarcodeModuleAssets.m b/ios/Classes/TiBarcodeModuleAssets.m index a24f9edf..1061ad45 100755 --- a/ios/Classes/TiBarcodeModuleAssets.m +++ b/ios/Classes/TiBarcodeModuleAssets.m @@ -3,13 +3,22 @@ */ #import "TiBarcodeModuleAssets.h" -extern NSData * dataWithHexString (NSString * hexString); +extern NSData* filterDataInRange(NSData* thedata, NSRange range); @implementation TiBarcodeModuleAssets -- (NSData*) moduleAsset +- (NSData *)moduleAsset { - return nil; + + + return nil; +} + +- (NSData *)resolveModuleAsset:(NSString *)path +{ + + + return nil; } @end diff --git a/ios/Classes/TiBarcodeViewController.h b/ios/Classes/TiBarcodeViewController.h new file mode 100644 index 00000000..136370b2 --- /dev/null +++ b/ios/Classes/TiBarcodeViewController.h @@ -0,0 +1,33 @@ +/** + * Ti.Barcode Module + * Copyright (c) 2010-2018 by Appcelerator, Inc. All Rights Reserved. + * Please see the LICENSE included with this distribution for details. + */ + +#import "TiOverlayView.h" +#import + +@class MTBBarcodeScanner; +@class TiOverlayView; + +#if !TARGET_IPHONE_SIMULATOR +#define HAS_AVFF 1 +#endif + +@interface TiBarcodeViewController : UIViewController { + @private + TiOverlayView *_overlayView; + BOOL _showRectangle; +} + +- (TiOverlayView *)overlayView; + +- (id)initWithObjectTypes:(NSArray *)objectTypes + delegate:(id)delegate + showCancel:(BOOL)shouldShowCancel + showRectangle:(BOOL)shouldShowRectangle + withOverlay:(UIView *)overlay; + +@property (nonatomic, strong) MTBBarcodeScanner *scanner; + +@end diff --git a/ios/Classes/TiBarcodeViewController.m b/ios/Classes/TiBarcodeViewController.m new file mode 100644 index 00000000..f1da8c5e --- /dev/null +++ b/ios/Classes/TiBarcodeViewController.m @@ -0,0 +1,97 @@ +/** + * Ti.Barcode Module + * Copyright (c) 2010-2018 by Appcelerator, Inc. All Rights Reserved. + * Please see the LICENSE included with this distribution for details. + */ + +#import "TiBarcodeViewController.h" +#import "MTBBarcodeScanner.h" +#import "TiApp.h" +#import "TiOverlayView.h" + +@implementation TiBarcodeViewController + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (instancetype)initWithObjectTypes:(NSArray *)objectTypes + delegate:(id)delegate + showCancel:(BOOL)shouldShowCancel + showRectangle:(BOOL)shouldShowRectangle + withOverlay:(UIView *)overlay +{ + self = [super init]; + if (self) { +#if HAS_AVFF + _scanner = [[MTBBarcodeScanner alloc] initWithMetadataObjectTypes:objectTypes + previewView:[self view]]; +#endif + _overlayView = [[TiOverlayView alloc] initWithFrame:[UIScreen mainScreen].bounds + showCancel:shouldShowCancel + showRectangle:shouldShowRectangle + withOverlay:overlay]; + _showRectangle = shouldShowRectangle; + _overlayView.delegate = delegate; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleDeviceRotation:) + name:UIApplicationDidChangeStatusBarOrientationNotification + object:nil]; + if (_showRectangle) { + CGRect rect = _overlayView.cropRect; + __weak TiBarcodeViewController *weakSelf = self; + [_scanner setDidStartScanningBlock:^(void) { + [[weakSelf scanner] setScanRect:rect]; + }]; + } + } + return self; +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + [[self view] addSubview:_overlayView]; + [[self view] bringSubviewToFront:_overlayView]; +} + +- (void)viewDidDisappear:(BOOL)animated +{ + [super viewDidDisappear:animated]; + + [_overlayView removeFromSuperview]; +} + +- (TiOverlayView *)overlayView +{ + return _overlayView; +} + +- (UIStatusBarStyle)preferredStatusBarStyle +{ + return [[[TiApp app] controller] preferredStatusBarStyle]; +} + +- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation +{ + return [[[[TiApp app] controller] topContainerController] preferredInterfaceOrientationForPresentation]; +} + +- (void)handleDeviceRotation:(NSNotification *)notification +{ + if (_showRectangle) { + CGRect rect = _overlayView.cropRect; + [_scanner setScanRect:rect]; + } +} + +- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator +{ + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; + [_overlayView updateViewsWithFrame:CGRectMake(_overlayView.frame.origin.x, _overlayView.frame.origin.y, size.width, size.height)]; +} + +@end diff --git a/ios/Classes/TiOverlayView.h b/ios/Classes/TiOverlayView.h new file mode 100644 index 00000000..d69bbdae --- /dev/null +++ b/ios/Classes/TiOverlayView.h @@ -0,0 +1,29 @@ +/** + * Ti.Barcode Module + * Copyright (c) 2010-2018 by Appcelerator, Inc. All Rights Reserved. + * Please see the LICENSE included with this distribution for details. + */ + +#import + +@protocol TiOverlayViewDelegate +- (void)cancelled; +@end + +@interface TiOverlayView : UIView { + @private + UIButton *_cancelButton; + BOOL _showRectangle; +} + +@property (nonatomic, assign) id delegate; +@property (nonatomic, assign) CGRect cropRect; +@property (nonatomic, copy) NSString *displayMessage; + +- (id)initWithFrame:(CGRect)frame + showCancel:(BOOL)showCancel + showRectangle:(BOOL)showRectangle + withOverlay:(UIView *)overlay; + +- (void)updateViewsWithFrame:(CGRect)newFrame; +@end diff --git a/ios/Classes/TiOverlayView.m b/ios/Classes/TiOverlayView.m new file mode 100644 index 00000000..61f2c5fc --- /dev/null +++ b/ios/Classes/TiOverlayView.m @@ -0,0 +1,111 @@ +/** + * Ti.Barcode Module + * Copyright (c) 2010-2018 by Appcelerator, Inc. All Rights Reserved. + * Please see the LICENSE included with this distribution for details. + */ + +#import "TiOverlayView.h" + +#define kTextMargin 10 +CGFloat _kPadding = 10; + +@implementation TiOverlayView + +- (id)initWithFrame:(CGRect)frame + showCancel:(BOOL)showCancel + showRectangle:(BOOL)showRectangle + withOverlay:(UIView *)overlay +{ + self = [super initWithFrame:frame]; + if (self) { + _showRectangle = showRectangle; + self.backgroundColor = [UIColor clearColor]; + if (showCancel) { + _cancelButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; + [_cancelButton setTitle:@"Cancel" forState:UIControlStateNormal]; + [_cancelButton addTarget:self action:@selector(cancel:) forControlEvents:UIControlEventTouchUpInside]; + [self addSubview:_cancelButton]; + } + + [self updateViewsWithFrame:frame]; + + if (overlay != nil) { + [self addSubview:overlay]; + } + } + return self; +} + +- (void)updateViewsWithFrame:(CGRect)newFrame +{ + self.frame = newFrame; + if (self.frame.size.width > self.frame.size.height) { + _kPadding = 70; + } else { + _kPadding = 10; + } + CGFloat rectSize = self.frame.size.width - _kPadding * 2; + CGFloat rectSize2 = rectSize; + if (self.frame.size.width > self.frame.size.height) { + rectSize2 = self.frame.size.height - _kPadding * 2; + } + _cropRect = CGRectMake(_kPadding, (self.frame.size.height - rectSize2) / 2, rectSize, rectSize2); + + if (_cancelButton) { + CGSize theSize = CGSizeMake(100, 50); + CGRect theRect = CGRectMake((self.frame.size.width - theSize.width) / 2, _cropRect.origin.y + _cropRect.size.height + 20, theSize.width, theSize.height); + [_cancelButton setFrame:theRect]; + } + [self setNeedsDisplay]; +} + +- (void)cancel:(id)sender +{ + if (self.delegate != nil) { + [self.delegate cancelled]; + } +} + +- (void)drawRect:(CGRect)rect inContext:(CGContextRef)context +{ + if (_showRectangle) { + CGContextBeginPath(context); + CGContextMoveToPoint(context, rect.origin.x, rect.origin.y); + CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y); + CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + rect.size.height); + CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height); + CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y); + CGContextStrokePath(context); + } +} + +- (void)drawRect:(CGRect)rect +{ + [super drawRect:rect]; + if (_displayMessage == nil) { + self.displayMessage = @"Place the barcode inside the rectangle to scan it."; + } + CGContextRef c = UIGraphicsGetCurrentContext(); + + if (_showRectangle) { + CGFloat white[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + CGContextSetStrokeColor(c, white); + CGContextSetFillColor(c, white); + [self drawRect:_cropRect inContext:c]; + CGContextSaveGState(c); + UIFont *font = [UIFont systemFontOfSize:18]; + NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle alloc] init]; + textStyle.lineBreakMode = NSLineBreakByWordWrapping; + textStyle.alignment = NSTextAlignmentCenter; + CGSize constraint = CGSizeMake(rect.size.width - 2 * kTextMargin, _cropRect.origin.y); + CGSize displaySize = [self.displayMessage boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName : font, NSParagraphStyleAttributeName : textStyle } context:nil].size; + CGRect displayRect = CGRectMake((rect.size.width - displaySize.width) / 2, _cropRect.origin.y - displaySize.height, displaySize.width, displaySize.height); + [self.displayMessage drawInRect:displayRect + withAttributes:@{ NSFontAttributeName : font, + NSParagraphStyleAttributeName : textStyle, + NSForegroundColorAttributeName : UIColor.whiteColor }]; + CGContextRestoreGState(c); + } +} + +@end diff --git a/ios/barcode.xcodeproj/project.pbxproj b/ios/barcode.xcodeproj/project.pbxproj index bacf24fb..b78f7621 100644 --- a/ios/barcode.xcodeproj/project.pbxproj +++ b/ios/barcode.xcodeproj/project.pbxproj @@ -22,13 +22,18 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 190E5FED2109BC8A00FCEA5D /* TiBarcodeModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 190E5FE92109BC8900FCEA5D /* TiBarcodeModule.h */; }; + 190E5FEE2109BC8A00FCEA5D /* TiBarcodeViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 190E5FEA2109BC8A00FCEA5D /* TiBarcodeViewController.h */; }; + 190E5FEF2109BC8A00FCEA5D /* TiBarcodeModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 190E5FEB2109BC8A00FCEA5D /* TiBarcodeModule.m */; }; + 190E5FF02109BC8A00FCEA5D /* TiBarcodeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 190E5FEC2109BC8A00FCEA5D /* TiBarcodeViewController.m */; }; + 190E5FF32109BCB400FCEA5D /* TiOverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = 190E5FF12109BCB400FCEA5D /* TiOverlayView.h */; }; + 190E5FF42109BCB400FCEA5D /* TiOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 190E5FF22109BCB400FCEA5D /* TiOverlayView.m */; }; + 1977771C210EF49200565614 /* MTBBarcodeScanner.m in Sources */ = {isa = PBXBuildFile; fileRef = 1977771A210EF49200565614 /* MTBBarcodeScanner.m */; }; + 1977771D210EF49200565614 /* MTBBarcodeScanner.h in Headers */ = {isa = PBXBuildFile; fileRef = 1977771B210EF49200565614 /* MTBBarcodeScanner.h */; }; 246732D911E27BC500D39AF7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 246732D811E27BC500D39AF7 /* Foundation.framework */; }; - 24DD6CF91134B3F500162E58 /* TiBarcodeModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 24DD6CF71134B3F500162E58 /* TiBarcodeModule.h */; }; 24DE9E1111C5FE74003F90F6 /* TiBarcodeModuleAssets.h in Headers */ = {isa = PBXBuildFile; fileRef = 24DE9E0F11C5FE74003F90F6 /* TiBarcodeModuleAssets.h */; }; 24DE9E1211C5FE74003F90F6 /* TiBarcodeModuleAssets.m in Sources */ = {isa = PBXBuildFile; fileRef = 24DE9E1011C5FE74003F90F6 /* TiBarcodeModuleAssets.m */; }; - A288D4FB1378B0F400FB90D4 /* libZXingWidget.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A288D4FA1378B0D200FB90D4 /* libZXingWidget.a */; }; AA747D9F0F9514B9006C5449 /* TiBarcode_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* TiBarcode_Prefix.pch */; }; - DA9F79ED1231D71200D62DB8 /* TiBarcodeModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA9F79EC1231D71200D62DB8 /* TiBarcodeModule.mm */; }; DAF8E7AF1300AF8B00C06BC6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAF8E7AE1300AF8B00C06BC6 /* UIKit.framework */; }; DAF8E7B21300AF9400C06BC6 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAF8E7B11300AF9400C06BC6 /* AudioToolbox.framework */; }; DAF8E7B51300AF9E00C06BC6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAF8E7B41300AF9E00C06BC6 /* CoreGraphics.framework */; }; @@ -44,32 +49,23 @@ remoteGlobalIDString = D2AAC07D0554694100DB518D; remoteInfo = barcode; }; - A288D4F91378B0D200FB90D4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = A288D4F01378B0D200FB90D4 /* ZXingWidget.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = ZXingWidget; - }; - A288D4FC1378B11500FB90D4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = A288D4F01378B0D200FB90D4 /* ZXingWidget.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = ZXingWidget; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 190E5FE92109BC8900FCEA5D /* TiBarcodeModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TiBarcodeModule.h; path = Classes/TiBarcodeModule.h; sourceTree = ""; }; + 190E5FEA2109BC8A00FCEA5D /* TiBarcodeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TiBarcodeViewController.h; path = Classes/TiBarcodeViewController.h; sourceTree = ""; }; + 190E5FEB2109BC8A00FCEA5D /* TiBarcodeModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TiBarcodeModule.m; path = Classes/TiBarcodeModule.m; sourceTree = ""; }; + 190E5FEC2109BC8A00FCEA5D /* TiBarcodeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TiBarcodeViewController.m; path = Classes/TiBarcodeViewController.m; sourceTree = ""; }; + 190E5FF12109BCB400FCEA5D /* TiOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TiOverlayView.h; path = Classes/TiOverlayView.h; sourceTree = ""; }; + 190E5FF22109BCB400FCEA5D /* TiOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TiOverlayView.m; path = Classes/TiOverlayView.m; sourceTree = ""; }; + 1977771A210EF49200565614 /* MTBBarcodeScanner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MTBBarcodeScanner.m; path = Classes/MTBBarcodeScanner.m; sourceTree = ""; }; + 1977771B210EF49200565614 /* MTBBarcodeScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MTBBarcodeScanner.h; path = Classes/MTBBarcodeScanner.h; sourceTree = ""; }; 246732D811E27BC500D39AF7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 24DD6CF71134B3F500162E58 /* TiBarcodeModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TiBarcodeModule.h; path = Classes/TiBarcodeModule.h; sourceTree = ""; }; 24DD6D1B1134B66800162E58 /* titanium.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = titanium.xcconfig; sourceTree = ""; }; 24DE9E0F11C5FE74003F90F6 /* TiBarcodeModuleAssets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TiBarcodeModuleAssets.h; path = Classes/TiBarcodeModuleAssets.h; sourceTree = ""; }; 24DE9E1011C5FE74003F90F6 /* TiBarcodeModuleAssets.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TiBarcodeModuleAssets.m; path = Classes/TiBarcodeModuleAssets.m; sourceTree = ""; }; - A288D4F01378B0D200FB90D4 /* ZXingWidget.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ZXingWidget.xcodeproj; path = zxing/iphone/ZXingWidget/ZXingWidget.xcodeproj; sourceTree = SOURCE_ROOT; }; AA747D9E0F9514B9006C5449 /* TiBarcode_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiBarcode_Prefix.pch; sourceTree = SOURCE_ROOT; }; D2AAC07E0554694100DB518D /* libTiBarcode.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libTiBarcode.a; sourceTree = BUILT_PRODUCTS_DIR; }; - DA9F79EC1231D71200D62DB8 /* TiBarcodeModule.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = TiBarcodeModule.mm; path = Classes/TiBarcodeModule.mm; sourceTree = ""; }; DAF8E7AE1300AF8B00C06BC6 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; DAF8E7B11300AF9400C06BC6 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; DAF8E7B41300AF9E00C06BC6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -88,7 +84,6 @@ DAF8E7B51300AF9E00C06BC6 /* CoreGraphics.framework in Frameworks */, DAF8E7B71300AF9E00C06BC6 /* QuartzCore.framework in Frameworks */, DAF8E8571300DB7100C06BC6 /* CoreVideo.framework in Frameworks */, - A288D4FB1378B0F400FB90D4 /* libZXingWidget.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -106,7 +101,6 @@ 0867D691FE84028FC02AAC07 /* barcode */ = { isa = PBXGroup; children = ( - A288D4E41378B05400FB90D4 /* Dependencies */, 08FB77AEFE84172EC02AAC07 /* Classes */, 32C88DFF0371C24200C91783 /* Other Sources */, 0867D69AFE84028FC02AAC07 /* Frameworks */, @@ -131,37 +125,35 @@ 08FB77AEFE84172EC02AAC07 /* Classes */ = { isa = PBXGroup; children = ( - 24DD6CF71134B3F500162E58 /* TiBarcodeModule.h */, - DA9F79EC1231D71200D62DB8 /* TiBarcodeModule.mm */, + 19777719210EF44400565614 /* MTBBarcodeScanner */, + 190E5FF12109BCB400FCEA5D /* TiOverlayView.h */, + 190E5FF22109BCB400FCEA5D /* TiOverlayView.m */, + 190E5FE92109BC8900FCEA5D /* TiBarcodeModule.h */, + 190E5FEB2109BC8A00FCEA5D /* TiBarcodeModule.m */, + 190E5FEA2109BC8A00FCEA5D /* TiBarcodeViewController.h */, + 190E5FEC2109BC8A00FCEA5D /* TiBarcodeViewController.m */, 24DE9E0F11C5FE74003F90F6 /* TiBarcodeModuleAssets.h */, 24DE9E1011C5FE74003F90F6 /* TiBarcodeModuleAssets.m */, ); name = Classes; sourceTree = ""; }; - 32C88DFF0371C24200C91783 /* Other Sources */ = { + 19777719210EF44400565614 /* MTBBarcodeScanner */ = { isa = PBXGroup; children = ( - AA747D9E0F9514B9006C5449 /* TiBarcode_Prefix.pch */, - 24DD6D1B1134B66800162E58 /* titanium.xcconfig */, + 1977771B210EF49200565614 /* MTBBarcodeScanner.h */, + 1977771A210EF49200565614 /* MTBBarcodeScanner.m */, ); - name = "Other Sources"; + name = MTBBarcodeScanner; sourceTree = ""; }; - A288D4E41378B05400FB90D4 /* Dependencies */ = { - isa = PBXGroup; - children = ( - A288D4F01378B0D200FB90D4 /* ZXingWidget.xcodeproj */, - ); - name = Dependencies; - sourceTree = ""; - }; - A288D4F61378B0D200FB90D4 /* Products */ = { + 32C88DFF0371C24200C91783 /* Other Sources */ = { isa = PBXGroup; children = ( - A288D4FA1378B0D200FB90D4 /* libZXingWidget.a */, + AA747D9E0F9514B9006C5449 /* TiBarcode_Prefix.pch */, + 24DD6D1B1134B66800162E58 /* titanium.xcconfig */, ); - name = Products; + name = "Other Sources"; sourceTree = ""; }; /* End PBXGroup section */ @@ -171,8 +163,11 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 190E5FF32109BCB400FCEA5D /* TiOverlayView.h in Headers */, AA747D9F0F9514B9006C5449 /* TiBarcode_Prefix.pch in Headers */, - 24DD6CF91134B3F500162E58 /* TiBarcodeModule.h in Headers */, + 190E5FEE2109BC8A00FCEA5D /* TiBarcodeViewController.h in Headers */, + 190E5FED2109BC8A00FCEA5D /* TiBarcodeModule.h in Headers */, + 1977771D210EF49200565614 /* MTBBarcodeScanner.h in Headers */, 24DE9E1111C5FE74003F90F6 /* TiBarcodeModuleAssets.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -191,7 +186,6 @@ buildRules = ( ); dependencies = ( - A288D4FD1378B11500FB90D4 /* PBXTargetDependency */, ); name = barcode; productName = barcode; @@ -216,12 +210,6 @@ mainGroup = 0867D691FE84028FC02AAC07 /* barcode */; productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; projectDirPath = ""; - projectReferences = ( - { - ProductGroup = A288D4F61378B0D200FB90D4 /* Products */; - ProjectRef = A288D4F01378B0D200FB90D4 /* ZXingWidget.xcodeproj */; - }, - ); projectRoot = ""; targets = ( D2AAC07D0554694100DB518D /* barcode */, @@ -230,16 +218,6 @@ }; /* End PBXProject section */ -/* Begin PBXReferenceProxy section */ - A288D4FA1378B0D200FB90D4 /* libZXingWidget.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libZXingWidget.a; - remoteRef = A288D4F91378B0D200FB90D4 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - /* Begin PBXShellScriptBuildPhase section */ 24416B8011C4CA220047AFDD /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -261,8 +239,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 190E5FF42109BCB400FCEA5D /* TiOverlayView.m in Sources */, + 1977771C210EF49200565614 /* MTBBarcodeScanner.m in Sources */, + 190E5FF02109BC8A00FCEA5D /* TiBarcodeViewController.m in Sources */, + 190E5FEF2109BC8A00FCEA5D /* TiBarcodeModule.m in Sources */, 24DE9E1211C5FE74003F90F6 /* TiBarcodeModuleAssets.m in Sources */, - DA9F79ED1231D71200D62DB8 /* TiBarcodeModule.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -274,11 +255,6 @@ target = D2AAC07D0554694100DB518D /* barcode */; targetProxy = 24416B8411C4CA280047AFDD /* PBXContainerItemProxy */; }; - A288D4FD1378B11500FB90D4 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ZXingWidget; - targetProxy = A288D4FC1378B11500FB90D4 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -291,6 +267,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DSTROOT = /tmp/TiBarcode.dst; + ENABLE_BITCODE = NO; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -337,6 +314,7 @@ "ARCHS[sdk=iphoneos*]" = "$(ARCHS_STANDARD)"; "ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)"; DSTROOT = /tmp/TiBarcode.dst; + ENABLE_BITCODE = NO; GCC_C_LANGUAGE_STANDARD = c99; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -360,8 +338,8 @@ "$(TITANIUM_BASE_SDK2)", ); INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - "IPHONEOS_DEPLOYMENT_TARGET[sdk=iphoneos*]" = 5.1.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=iphoneos*]" = 8.0; OTHER_CFLAGS = "-DTI_POST_1_2"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = TiBarcode; @@ -379,9 +357,11 @@ ARCHS = "$(ARCHS_STANDARD)"; "ARCHS[sdk=iphoneos*]" = "$(ARCHS_STANDARD)"; "ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)"; + CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DSTROOT = /tmp/TiBarcode.dst; + ENABLE_BITCODE = NO; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -405,7 +385,7 @@ "$(TITANIUM_BASE_SDK2)", ); INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ( "-DDEBUG", @@ -429,7 +409,9 @@ ARCHS = "$(ARCHS_STANDARD)"; "ARCHS[sdk=iphoneos*]" = "$(ARCHS_STANDARD)"; "ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)"; + CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/TiBarcode.dst; + ENABLE_BITCODE = NO; GCC_C_LANGUAGE_STANDARD = c99; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -453,7 +435,7 @@ "$(TITANIUM_BASE_SDK2)", ); INSTALL_PATH = /usr/local/lib; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DTI_POST_1_2"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = TiBarcode; diff --git a/ios/documentation/changelog.md b/ios/documentation/changelog.md index 2a3312fe..832bd012 100644 --- a/ios/documentation/changelog.md +++ b/ios/documentation/changelog.md @@ -1,5 +1,12 @@ # Change Log
+v2.0.0  [MOD-2354] 
+            - Replaced XZing library with AVFoundation framework.
+            - Supported new barcode types -FORMAT_CODE_93,  FORMAT_CODE_39_MOD_43,  FORMAT_PDF_417, FORMAT_AZTEC, FORMAT_INTERLEAVED_2_OF_5
+            - Supported new methods -  freezeCapture() and unfreezeCapture()
+            - Property 'allowRotation' is removed. By default  it will analyze portrait and landscape image.
+
+
 v1.9.1  [TIMOB-18092] Fixed linker error when building with TiSDK 3.5.0+
 
 v1.9.0  [MOD-18092] Updating module to support 64-bit.
diff --git a/ios/documentation/index.md b/ios/documentation/index.md
index f9c4e3fa..a4c8f5fa 100644
--- a/ios/documentation/index.md
+++ b/ios/documentation/index.md
@@ -50,6 +50,12 @@ Parses a blob image for barcodes. Takes one required argument, a dictionary cont
 ### cancel()
 Cancels and closes the currently open capture window.
 
+### freezeCapture()
+Freeze capture keeping the last frame on camera view. This is supported in iOS only.
+
+### unfreezeCapture()
+Unfreeze a frozen capture. This is supported in iOS only.
+
 ## Events
 Use Ti.Barcode.addEventListener() to process the following events that are sent from the module:
 
@@ -139,12 +145,19 @@ Value representing wifi connection settings
 ### FORMAT_CODE_128[int]
 ### FORMAT_CODE_39[int]
 ### FORMAT_ITF[int]
+### FORMAT_CODE_93[int, iOS only]
+### FORMAT_CODE_39_MOD_43[int, iOS only ]
+### FORMAT_PDF_417[int, iOS only ]
+### FORMAT_AZTEC[int, iOS only ]
+### FORMAT_INTERLEAVED_2_OF_5[int, iOS only ]
 
 ## Usage
 See `example/app.js` for details!
 
-## Module History
+## Author
+Jeff Haynie & Jeff English & Vijay Singh
 
+## Module History
 View the [change log](changelog.html) for this module.
 
 ## Feedback and Support
diff --git a/ios/manifest b/ios/manifest
index 45ffd5b6..1ae5d98c 100644
--- a/ios/manifest
+++ b/ios/manifest
@@ -2,7 +2,7 @@
 # this is your module manifest and used by Titanium
 # during compilation, packaging, distribution, etc.
 #
-version: 1.10.2
+version: 2.0.0
 apiversion: 2
 architectures: armv7 i386 x86_64 arm64
 description: Lets you process 1D/2D barcodes.
diff --git a/ios/titanium.xcconfig b/ios/titanium.xcconfig
index 80e4080b..ef7e933e 100755
--- a/ios/titanium.xcconfig
+++ b/ios/titanium.xcconfig
@@ -4,7 +4,7 @@
 // OF YOUR TITANIUM SDK YOU'RE BUILDING FOR
 //
 //
-TITANIUM_SDK_VERSION = 6.1.2.GA
+TITANIUM_SDK_VERSION = 7.2.0.GA
 
 // 
 // THESE SHOULD BE OK GENERALLY AS-IS
diff --git a/ios/zxing/iphone/ZXingWidget/ZXingWidget.xcodeproj/project.pbxproj b/ios/zxing/iphone/ZXingWidget/ZXingWidget.xcodeproj/project.pbxproj
deleted file mode 100644
index f2124184..00000000
--- a/ios/zxing/iphone/ZXingWidget/ZXingWidget.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,1333 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		1D0CBDF913D0DD5D003D0F8D /* BizcardResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D0CBDF713D0DD5D003D0F8D /* BizcardResultParser.h */; };
-		1D0CBDFA13D0DD5D003D0F8D /* BizcardResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D0CBDF813D0DD5D003D0F8D /* BizcardResultParser.m */; };
-		1DFA090C13CE1A3900599044 /* CBarcodeFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DFA090A13CE1A3900599044 /* CBarcodeFormat.h */; };
-		1DFA090D13CE1A3900599044 /* CBarcodeFormat.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1DFA090B13CE1A3900599044 /* CBarcodeFormat.mm */; };
-		1DFA092413CE251600599044 /* ProductParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DFA092213CE251600599044 /* ProductParsedResult.h */; };
-		1DFA092513CE251600599044 /* ProductParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DFA092313CE251600599044 /* ProductParsedResult.m */; };
-		1DFA092A13CE252300599044 /* ProductResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DFA092813CE252300599044 /* ProductResultParser.h */; };
-		1DFA092B13CE252300599044 /* ProductResultParser.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1DFA092913CE252300599044 /* ProductResultParser.mm */; };
-		1DFA09A013CE5C0300599044 /* AddressBookAUResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DFA099E13CE5C0300599044 /* AddressBookAUResultParser.h */; };
-		1DFA09A113CE5C0300599044 /* AddressBookAUResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DFA099F13CE5C0300599044 /* AddressBookAUResultParser.m */; };
-		1F027FAB11A7BEAF006B06DE /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027F9F11A7BEAF006B06DE /* Decoder.h */; };
-		1F027FAC11A7BEAF006B06DE /* Decoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FA011A7BEAF006B06DE /* Decoder.mm */; };
-		1F027FAD11A7BEAF006B06DE /* DecoderDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FA111A7BEAF006B06DE /* DecoderDelegate.h */; };
-		1F027FAE11A7BEAF006B06DE /* FormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FA211A7BEAF006B06DE /* FormatReader.h */; };
-		1F027FAF11A7BEAF006B06DE /* FormatReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FA311A7BEAF006B06DE /* FormatReader.mm */; };
-		1F027FB211A7BEAF006B06DE /* MultiFormatReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FA611A7BEAF006B06DE /* MultiFormatReader.mm */; };
-		1F027FB311A7BEAF006B06DE /* NSString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FA711A7BEAF006B06DE /* NSString+HTML.h */; };
-		1F027FB411A7BEAF006B06DE /* NSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FA811A7BEAF006B06DE /* NSString+HTML.m */; };
-		1F027FB511A7BEAF006B06DE /* OverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FA911A7BEAF006B06DE /* OverlayView.h */; };
-		1F027FB611A7BEAF006B06DE /* OverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FAA11A7BEAF006B06DE /* OverlayView.m */; };
-		1F027FBB11A7BEBF006B06DE /* TwoDDecoderResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FB711A7BEBF006B06DE /* TwoDDecoderResult.h */; };
-		1F027FBC11A7BEBF006B06DE /* TwoDDecoderResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FB811A7BEBF006B06DE /* TwoDDecoderResult.m */; };
-		1F027FBD11A7BEBF006B06DE /* ZXingWidgetController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FB911A7BEBF006B06DE /* ZXingWidgetController.h */; };
-		1F027FBE11A7BEBF006B06DE /* ZXingWidgetController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FBA11A7BEBF006B06DE /* ZXingWidgetController.m */; };
-		1F027FCD11A7BED6006B06DE /* AddContactAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FBF11A7BED6006B06DE /* AddContactAction.h */; };
-		1F027FCE11A7BED6006B06DE /* AddContactAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC011A7BED6006B06DE /* AddContactAction.m */; };
-		1F027FCF11A7BED6006B06DE /* CallAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC111A7BED6006B06DE /* CallAction.h */; };
-		1F027FD011A7BED6006B06DE /* CallAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC211A7BED6006B06DE /* CallAction.m */; };
-		1F027FD111A7BED6006B06DE /* EmailAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC311A7BED6006B06DE /* EmailAction.h */; };
-		1F027FD211A7BED6006B06DE /* EmailAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC411A7BED6006B06DE /* EmailAction.m */; };
-		1F027FD311A7BED6006B06DE /* OpenUrlAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC511A7BED6006B06DE /* OpenUrlAction.h */; };
-		1F027FD411A7BED6006B06DE /* OpenUrlAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC611A7BED6006B06DE /* OpenUrlAction.m */; };
-		1F027FD511A7BED6006B06DE /* ResultAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC711A7BED6006B06DE /* ResultAction.h */; };
-		1F027FD611A7BED6006B06DE /* ResultAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC811A7BED6006B06DE /* ResultAction.m */; };
-		1F027FD711A7BED6006B06DE /* ShowMapAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC911A7BED6006B06DE /* ShowMapAction.h */; };
-		1F027FD811A7BED6006B06DE /* ShowMapAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FCA11A7BED6006B06DE /* ShowMapAction.m */; };
-		1F027FD911A7BED6006B06DE /* SMSAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FCB11A7BED6006B06DE /* SMSAction.h */; };
-		1F027FDA11A7BED6006B06DE /* SMSAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FCC11A7BED6006B06DE /* SMSAction.m */; };
-		1F027FEB11A7BEEB006B06DE /* BusinessCardParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FDB11A7BEEB006B06DE /* BusinessCardParsedResult.h */; };
-		1F027FEC11A7BEEB006B06DE /* BusinessCardParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FDC11A7BEEB006B06DE /* BusinessCardParsedResult.m */; };
-		1F027FED11A7BEEB006B06DE /* EmailParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FDD11A7BEEB006B06DE /* EmailParsedResult.h */; };
-		1F027FEE11A7BEEB006B06DE /* EmailParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FDE11A7BEEB006B06DE /* EmailParsedResult.m */; };
-		1F027FEF11A7BEEB006B06DE /* GeoParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FDF11A7BEEB006B06DE /* GeoParsedResult.h */; };
-		1F027FF011A7BEEB006B06DE /* GeoParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE011A7BEEB006B06DE /* GeoParsedResult.m */; };
-		1F027FF111A7BEEB006B06DE /* ParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE111A7BEEB006B06DE /* ParsedResult.h */; };
-		1F027FF211A7BEEB006B06DE /* ParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE211A7BEEB006B06DE /* ParsedResult.m */; };
-		1F027FF311A7BEEB006B06DE /* SMSParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE311A7BEEB006B06DE /* SMSParsedResult.h */; };
-		1F027FF411A7BEEB006B06DE /* SMSParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE411A7BEEB006B06DE /* SMSParsedResult.m */; };
-		1F027FF511A7BEEB006B06DE /* TelParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE511A7BEEB006B06DE /* TelParsedResult.h */; };
-		1F027FF611A7BEEB006B06DE /* TelParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE611A7BEEB006B06DE /* TelParsedResult.m */; };
-		1F027FF711A7BEEB006B06DE /* TextParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE711A7BEEB006B06DE /* TextParsedResult.h */; };
-		1F027FF811A7BEEB006B06DE /* TextParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE811A7BEEB006B06DE /* TextParsedResult.m */; };
-		1F027FF911A7BEEB006B06DE /* URIParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE911A7BEEB006B06DE /* URIParsedResult.h */; };
-		1F027FFA11A7BEEB006B06DE /* URIParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FEA11A7BEEB006B06DE /* URIParsedResult.m */; };
-		1F02801511A7BF06006B06DE /* BookmarkDoCoMoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FFB11A7BF06006B06DE /* BookmarkDoCoMoResultParser.h */; };
-		1F02801611A7BF06006B06DE /* BookmarkDoCoMoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FFC11A7BF06006B06DE /* BookmarkDoCoMoResultParser.m */; };
-		1F02801711A7BF06006B06DE /* DoCoMoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FFD11A7BF06006B06DE /* DoCoMoResultParser.h */; };
-		1F02801811A7BF06006B06DE /* DoCoMoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FFE11A7BF06006B06DE /* DoCoMoResultParser.m */; };
-		1F02801911A7BF06006B06DE /* EmailDoCoMoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FFF11A7BF06006B06DE /* EmailDoCoMoResultParser.h */; };
-		1F02801A11A7BF06006B06DE /* EmailDoCoMoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800011A7BF06006B06DE /* EmailDoCoMoResultParser.m */; };
-		1F02801B11A7BF06006B06DE /* GeoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800111A7BF06006B06DE /* GeoResultParser.h */; };
-		1F02801C11A7BF06006B06DE /* GeoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800211A7BF06006B06DE /* GeoResultParser.m */; };
-		1F02801D11A7BF06006B06DE /* MeCardParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800311A7BF06006B06DE /* MeCardParser.h */; };
-		1F02801E11A7BF06006B06DE /* MeCardParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800411A7BF06006B06DE /* MeCardParser.m */; };
-		1F02801F11A7BF06006B06DE /* PlainEmailResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800511A7BF06006B06DE /* PlainEmailResultParser.h */; };
-		1F02802011A7BF06006B06DE /* PlainEmailResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800611A7BF06006B06DE /* PlainEmailResultParser.m */; };
-		1F02802111A7BF06006B06DE /* ResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800711A7BF06006B06DE /* ResultParser.h */; };
-		1F02802211A7BF06006B06DE /* ResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800811A7BF06006B06DE /* ResultParser.m */; };
-		1F02802311A7BF06006B06DE /* SMSResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800911A7BF06006B06DE /* SMSResultParser.h */; };
-		1F02802411A7BF06006B06DE /* SMSResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800A11A7BF06006B06DE /* SMSResultParser.m */; };
-		1F02802511A7BF06006B06DE /* SMSTOResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800B11A7BF06006B06DE /* SMSTOResultParser.h */; };
-		1F02802611A7BF06006B06DE /* SMSTOResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800C11A7BF06006B06DE /* SMSTOResultParser.m */; };
-		1F02802711A7BF06006B06DE /* TelResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800D11A7BF06006B06DE /* TelResultParser.h */; };
-		1F02802811A7BF06006B06DE /* TelResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800E11A7BF06006B06DE /* TelResultParser.m */; };
-		1F02802911A7BF06006B06DE /* TextResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800F11A7BF06006B06DE /* TextResultParser.h */; };
-		1F02802A11A7BF06006B06DE /* TextResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02801011A7BF06006B06DE /* TextResultParser.m */; };
-		1F02802B11A7BF06006B06DE /* URLResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02801111A7BF06006B06DE /* URLResultParser.h */; };
-		1F02802C11A7BF06006B06DE /* URLResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02801211A7BF06006B06DE /* URLResultParser.m */; };
-		1F02802D11A7BF06006B06DE /* URLTOResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02801311A7BF06006B06DE /* URLTOResultParser.h */; };
-		1F02802E11A7BF06006B06DE /* URLTOResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02801411A7BF06006B06DE /* URLTOResultParser.m */; };
-		1F3DB0C211C60DB4009C581B /* QRCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3DB0C011C60DB4009C581B /* QRCodeReader.h */; };
-		1F3DB0C311C60DB4009C581B /* QRCodeReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DB0C111C60DB4009C581B /* QRCodeReader.mm */; };
-		1F3DB0FB11C61080009C581B /* DataMatrixReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3DB0F511C61080009C581B /* DataMatrixReader.h */; };
-		1F3DB0FC11C61080009C581B /* DataMatrixReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DB0F611C61080009C581B /* DataMatrixReader.mm */; };
-		1F3DB0FD11C61080009C581B /* MultiFormatOneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3DB0F711C61080009C581B /* MultiFormatOneDReader.h */; };
-		1F3DB0FE11C61080009C581B /* MultiFormatOneDReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DB0F811C61080009C581B /* MultiFormatOneDReader.mm */; };
-		1F3DB0FF11C61080009C581B /* MultiFormatUPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3DB0F911C61080009C581B /* MultiFormatUPCEANReader.h */; };
-		1F3DB10011C61080009C581B /* MultiFormatUPCEANReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DB0FA11C61080009C581B /* MultiFormatUPCEANReader.mm */; };
-		1FB4319F12901C76002D63E8 /* UniversalResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FB4319D12901C76002D63E8 /* UniversalResultParser.h */; };
-		1FB431A012901C76002D63E8 /* UniversalResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4319E12901C76002D63E8 /* UniversalResultParser.m */; };
-		3B72D96F12130EF6007CEF32 /* ResultPointCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B72D96D12130EF6007CEF32 /* ResultPointCallback.cpp */; };
-		3B72D97012130EF6007CEF32 /* ResultPointCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B72D96E12130EF6007CEF32 /* ResultPointCallback.h */; };
-		3B81AAC5120F07E40022E5D4 /* DecodeHints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B81AAC3120F07E40022E5D4 /* DecodeHints.cpp */; };
-		3B81AAC6120F07E40022E5D4 /* DecodeHints.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B81AAC4120F07E40022E5D4 /* DecodeHints.h */; };
-		3B81AAC9120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B81AAC7120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp */; };
-		3B81AACA120F080D0022E5D4 /* GreyscaleLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B81AAC8120F080D0022E5D4 /* GreyscaleLuminanceSource.h */; };
-		3B81AACD120F08170022E5D4 /* HybridBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B81AACB120F08170022E5D4 /* HybridBinarizer.cpp */; };
-		3B81AACE120F08170022E5D4 /* HybridBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B81AACC120F08170022E5D4 /* HybridBinarizer.h */; };
-		3B81AAF8120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B81AAF6120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp */; };
-		3B81AAF9120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B81AAF7120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h */; };
-		AA747D9F0F9514B9006C5449 /* ZXingWidget_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* ZXingWidget_Prefix.pch */; };
-		AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; };
-		E534594311987396000CB77F /* BarcodeFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458B511987396000CB77F /* BarcodeFormat.cpp */; };
-		E534594411987396000CB77F /* BarcodeFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458B611987396000CB77F /* BarcodeFormat.h */; };
-		E534594511987396000CB77F /* Binarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458B711987396000CB77F /* Binarizer.cpp */; };
-		E534594611987396000CB77F /* Binarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458B811987396000CB77F /* Binarizer.h */; };
-		E534594711987396000CB77F /* BinaryBitmap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458B911987396000CB77F /* BinaryBitmap.cpp */; };
-		E534594811987396000CB77F /* BinaryBitmap.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458BA11987396000CB77F /* BinaryBitmap.h */; };
-		E534594911987396000CB77F /* Array.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458BC11987396000CB77F /* Array.cpp */; };
-		E534594A11987396000CB77F /* Array.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458BD11987396000CB77F /* Array.h */; };
-		E534594B11987396000CB77F /* BitArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458BE11987396000CB77F /* BitArray.cpp */; };
-		E534594C11987396000CB77F /* BitArray.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458BF11987396000CB77F /* BitArray.h */; };
-		E534594D11987396000CB77F /* BitMatrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458C011987396000CB77F /* BitMatrix.cpp */; };
-		E534594E11987396000CB77F /* BitMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C111987396000CB77F /* BitMatrix.h */; };
-		E534594F11987396000CB77F /* BitSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458C211987396000CB77F /* BitSource.cpp */; };
-		E534595011987396000CB77F /* BitSource.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C311987396000CB77F /* BitSource.h */; };
-		E534595111987396000CB77F /* Counted.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458C411987396000CB77F /* Counted.cpp */; };
-		E534595211987396000CB77F /* Counted.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C511987396000CB77F /* Counted.h */; };
-		E534595311987396000CB77F /* DecoderResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458C611987396000CB77F /* DecoderResult.cpp */; };
-		E534595411987396000CB77F /* DecoderResult.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C711987396000CB77F /* DecoderResult.h */; };
-		E534595511987396000CB77F /* DetectorResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458C811987396000CB77F /* DetectorResult.cpp */; };
-		E534595611987396000CB77F /* DetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C911987396000CB77F /* DetectorResult.h */; };
-		E534595711987396000CB77F /* EdgeDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458CA11987396000CB77F /* EdgeDetector.cpp */; };
-		E534595811987396000CB77F /* EdgeDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458CB11987396000CB77F /* EdgeDetector.h */; };
-		E534595911987396000CB77F /* GlobalHistogramBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458CC11987396000CB77F /* GlobalHistogramBinarizer.cpp */; };
-		E534595A11987396000CB77F /* GlobalHistogramBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458CD11987396000CB77F /* GlobalHistogramBinarizer.h */; };
-		E534595B11987396000CB77F /* GridSampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458CE11987396000CB77F /* GridSampler.cpp */; };
-		E534595C11987396000CB77F /* GridSampler.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458CF11987396000CB77F /* GridSampler.h */; };
-		E534595D11987396000CB77F /* IllegalArgumentException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458D011987396000CB77F /* IllegalArgumentException.cpp */; };
-		E534595E11987396000CB77F /* IllegalArgumentException.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458D111987396000CB77F /* IllegalArgumentException.h */; };
-		E534596111987396000CB77F /* PerspectiveTransform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458D411987396000CB77F /* PerspectiveTransform.cpp */; };
-		E534596211987396000CB77F /* PerspectiveTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458D511987396000CB77F /* PerspectiveTransform.h */; };
-		E534596311987396000CB77F /* Point.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458D611987396000CB77F /* Point.h */; };
-		E534596411987396000CB77F /* GF256.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458D811987396000CB77F /* GF256.cpp */; };
-		E534596511987396000CB77F /* GF256.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458D911987396000CB77F /* GF256.h */; };
-		E534596611987396000CB77F /* GF256Poly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458DA11987396000CB77F /* GF256Poly.cpp */; };
-		E534596711987396000CB77F /* GF256Poly.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458DB11987396000CB77F /* GF256Poly.h */; };
-		E534596811987396000CB77F /* ReedSolomonDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458DC11987396000CB77F /* ReedSolomonDecoder.cpp */; };
-		E534596911987396000CB77F /* ReedSolomonDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458DD11987396000CB77F /* ReedSolomonDecoder.h */; };
-		E534596A11987396000CB77F /* ReedSolomonException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458DE11987396000CB77F /* ReedSolomonException.cpp */; };
-		E534596B11987396000CB77F /* ReedSolomonException.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458DF11987396000CB77F /* ReedSolomonException.h */; };
-		E534596C11987396000CB77F /* Str.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458E011987396000CB77F /* Str.cpp */; };
-		E534596D11987396000CB77F /* Str.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458E111987396000CB77F /* Str.h */; };
-		E534596E11987396000CB77F /* DataMatrixReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458E311987396000CB77F /* DataMatrixReader.cpp */; };
-		E534596F11987396000CB77F /* DataMatrixReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458E411987396000CB77F /* DataMatrixReader.h */; };
-		E534597011987396000CB77F /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458E611987396000CB77F /* BitMatrixParser.cpp */; };
-		E534597111987396000CB77F /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458E711987396000CB77F /* BitMatrixParser.h */; };
-		E534597211987396000CB77F /* DataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458E811987396000CB77F /* DataBlock.cpp */; };
-		E534597311987396000CB77F /* DataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458E911987396000CB77F /* DataBlock.h */; };
-		E534597411987396000CB77F /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458EA11987396000CB77F /* DecodedBitStreamParser.cpp */; };
-		E534597511987396000CB77F /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458EB11987396000CB77F /* DecodedBitStreamParser.h */; };
-		E534597611987396000CB77F /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458EC11987396000CB77F /* Decoder.cpp */; };
-		E534597711987396000CB77F /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458ED11987396000CB77F /* Decoder.h */; };
-		E534597811987396000CB77F /* CornerPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458EF11987396000CB77F /* CornerPoint.cpp */; };
-		E534597911987396000CB77F /* CornerPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458F011987396000CB77F /* CornerPoint.h */; };
-		E534597A11987396000CB77F /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458F111987396000CB77F /* Detector.cpp */; };
-		E534597B11987396000CB77F /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458F211987396000CB77F /* Detector.h */; };
-		E534597C11987396000CB77F /* MonochromeRectangleDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458F311987396000CB77F /* MonochromeRectangleDetector.cpp */; };
-		E534597D11987396000CB77F /* MonochromeRectangleDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458F411987396000CB77F /* MonochromeRectangleDetector.h */; };
-		E534597E11987396000CB77F /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458F511987396000CB77F /* Version.cpp */; };
-		E534597F11987396000CB77F /* Version.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458F611987396000CB77F /* Version.h */; };
-		E534598011987396000CB77F /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458F711987396000CB77F /* Exception.cpp */; };
-		E534598111987396000CB77F /* Exception.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458F811987396000CB77F /* Exception.h */; };
-		E534598211987396000CB77F /* LuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458F911987396000CB77F /* LuminanceSource.cpp */; };
-		E534598311987396000CB77F /* LuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458FA11987396000CB77F /* LuminanceSource.h */; };
-		E534598411987396000CB77F /* MultiFormatReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458FB11987396000CB77F /* MultiFormatReader.cpp */; };
-		E534598511987396000CB77F /* MultiFormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458FC11987396000CB77F /* MultiFormatReader.h */; };
-		E534598611987396000CB77F /* Code128Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458FE11987396000CB77F /* Code128Reader.cpp */; };
-		E534598711987396000CB77F /* Code128Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458FF11987396000CB77F /* Code128Reader.h */; };
-		E534598811987396000CB77F /* Code39Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590011987396000CB77F /* Code39Reader.cpp */; };
-		E534598911987396000CB77F /* Code39Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590111987396000CB77F /* Code39Reader.h */; };
-		E534598A11987396000CB77F /* EAN13Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590211987396000CB77F /* EAN13Reader.cpp */; };
-		E534598B11987396000CB77F /* EAN13Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590311987396000CB77F /* EAN13Reader.h */; };
-		E534598C11987396000CB77F /* EAN8Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590411987396000CB77F /* EAN8Reader.cpp */; };
-		E534598D11987396000CB77F /* EAN8Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590511987396000CB77F /* EAN8Reader.h */; };
-		E534598E11987396000CB77F /* ITFReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590611987396000CB77F /* ITFReader.cpp */; };
-		E534598F11987396000CB77F /* ITFReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590711987396000CB77F /* ITFReader.h */; };
-		E534599011987396000CB77F /* MultiFormatOneDReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590811987396000CB77F /* MultiFormatOneDReader.cpp */; };
-		E534599111987396000CB77F /* MultiFormatOneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590911987396000CB77F /* MultiFormatOneDReader.h */; };
-		E534599211987396000CB77F /* MultiFormatUPCEANReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590A11987396000CB77F /* MultiFormatUPCEANReader.cpp */; };
-		E534599311987396000CB77F /* MultiFormatUPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590B11987396000CB77F /* MultiFormatUPCEANReader.h */; };
-		E534599411987396000CB77F /* OneDReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590C11987396000CB77F /* OneDReader.cpp */; };
-		E534599511987396000CB77F /* OneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590D11987396000CB77F /* OneDReader.h */; };
-		E534599611987396000CB77F /* OneDResultPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590E11987396000CB77F /* OneDResultPoint.cpp */; };
-		E534599711987396000CB77F /* OneDResultPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590F11987396000CB77F /* OneDResultPoint.h */; };
-		E534599811987396000CB77F /* UPCAReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591011987396000CB77F /* UPCAReader.cpp */; };
-		E534599911987396000CB77F /* UPCAReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591111987396000CB77F /* UPCAReader.h */; };
-		E534599A11987396000CB77F /* UPCEANReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591211987396000CB77F /* UPCEANReader.cpp */; };
-		E534599B11987396000CB77F /* UPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591311987396000CB77F /* UPCEANReader.h */; };
-		E534599C11987396000CB77F /* UPCEReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591411987396000CB77F /* UPCEReader.cpp */; };
-		E534599D11987396000CB77F /* UPCEReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591511987396000CB77F /* UPCEReader.h */; };
-		E534599E11987396000CB77F /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591811987396000CB77F /* BitMatrixParser.cpp */; };
-		E534599F11987396000CB77F /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591911987396000CB77F /* BitMatrixParser.h */; };
-		E53459A011987396000CB77F /* DataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591A11987396000CB77F /* DataBlock.cpp */; };
-		E53459A111987396000CB77F /* DataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591B11987396000CB77F /* DataBlock.h */; };
-		E53459A211987396000CB77F /* DataMask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591C11987396000CB77F /* DataMask.cpp */; };
-		E53459A311987396000CB77F /* DataMask.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591D11987396000CB77F /* DataMask.h */; };
-		E53459A411987396000CB77F /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591E11987396000CB77F /* DecodedBitStreamParser.cpp */; };
-		E53459A511987396000CB77F /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591F11987396000CB77F /* DecodedBitStreamParser.h */; };
-		E53459A611987396000CB77F /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592011987396000CB77F /* Decoder.cpp */; };
-		E53459A711987396000CB77F /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592111987396000CB77F /* Decoder.h */; };
-		E53459A811987396000CB77F /* Mode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592211987396000CB77F /* Mode.cpp */; };
-		E53459A911987396000CB77F /* Mode.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592311987396000CB77F /* Mode.h */; };
-		E53459AA11987396000CB77F /* AlignmentPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592511987396000CB77F /* AlignmentPattern.cpp */; };
-		E53459AB11987396000CB77F /* AlignmentPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592611987396000CB77F /* AlignmentPattern.h */; };
-		E53459AC11987396000CB77F /* AlignmentPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592711987396000CB77F /* AlignmentPatternFinder.cpp */; };
-		E53459AD11987396000CB77F /* AlignmentPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592811987396000CB77F /* AlignmentPatternFinder.h */; };
-		E53459AE11987396000CB77F /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592911987396000CB77F /* Detector.cpp */; };
-		E53459AF11987396000CB77F /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592A11987396000CB77F /* Detector.h */; };
-		E53459B011987396000CB77F /* FinderPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592B11987396000CB77F /* FinderPattern.cpp */; };
-		E53459B111987396000CB77F /* FinderPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592C11987396000CB77F /* FinderPattern.h */; };
-		E53459B211987396000CB77F /* FinderPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592D11987396000CB77F /* FinderPatternFinder.cpp */; };
-		E53459B311987396000CB77F /* FinderPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592E11987396000CB77F /* FinderPatternFinder.h */; };
-		E53459B411987396000CB77F /* FinderPatternInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592F11987396000CB77F /* FinderPatternInfo.cpp */; };
-		E53459B511987396000CB77F /* FinderPatternInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593011987396000CB77F /* FinderPatternInfo.h */; };
-		E53459B611987396000CB77F /* QREdgeDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593111987396000CB77F /* QREdgeDetector.cpp */; };
-		E53459B711987396000CB77F /* QREdgeDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593211987396000CB77F /* QREdgeDetector.h */; };
-		E53459B811987396000CB77F /* ErrorCorrectionLevel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593311987396000CB77F /* ErrorCorrectionLevel.cpp */; };
-		E53459B911987396000CB77F /* ErrorCorrectionLevel.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593411987396000CB77F /* ErrorCorrectionLevel.h */; };
-		E53459BA11987396000CB77F /* FormatInformation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593511987396000CB77F /* FormatInformation.cpp */; };
-		E53459BB11987396000CB77F /* FormatInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593611987396000CB77F /* FormatInformation.h */; };
-		E53459BC11987396000CB77F /* QRCodeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593711987396000CB77F /* QRCodeReader.cpp */; };
-		E53459BD11987396000CB77F /* QRCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593811987396000CB77F /* QRCodeReader.h */; };
-		E53459BE11987396000CB77F /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593911987396000CB77F /* Version.cpp */; };
-		E53459BF11987396000CB77F /* Version.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593A11987396000CB77F /* Version.h */; };
-		E53459C011987396000CB77F /* Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593B11987396000CB77F /* Reader.cpp */; };
-		E53459C111987396000CB77F /* Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593C11987396000CB77F /* Reader.h */; };
-		E53459C211987396000CB77F /* ReaderException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593D11987396000CB77F /* ReaderException.cpp */; };
-		E53459C311987396000CB77F /* ReaderException.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593E11987396000CB77F /* ReaderException.h */; };
-		E53459C411987396000CB77F /* Result.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593F11987396000CB77F /* Result.cpp */; };
-		E53459C511987396000CB77F /* Result.h in Headers */ = {isa = PBXBuildFile; fileRef = E534594011987396000CB77F /* Result.h */; };
-		E53459C611987396000CB77F /* ResultPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534594111987396000CB77F /* ResultPoint.cpp */; };
-		E53459C711987396000CB77F /* ResultPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = E534594211987396000CB77F /* ResultPoint.h */; };
-		E53459CB119873F3000CB77F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E53459CA119873F3000CB77F /* UIKit.framework */; };
-		E5345A661198792F000CB77F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5345A651198792F000CB77F /* AudioToolbox.framework */; };
-		E5345AA31198859A000CB77F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5345AA21198859A000CB77F /* CoreGraphics.framework */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXFileReference section */
-		1D0CBDF713D0DD5D003D0F8D /* BizcardResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BizcardResultParser.h; path = Classes/resultParsers/BizcardResultParser.h; sourceTree = ""; };
-		1D0CBDF813D0DD5D003D0F8D /* BizcardResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BizcardResultParser.m; path = Classes/resultParsers/BizcardResultParser.m; sourceTree = ""; };
-		1DFA090A13CE1A3900599044 /* CBarcodeFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CBarcodeFormat.h; path = Classes/CBarcodeFormat.h; sourceTree = ""; };
-		1DFA090B13CE1A3900599044 /* CBarcodeFormat.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = CBarcodeFormat.mm; path = Classes/CBarcodeFormat.mm; sourceTree = ""; };
-		1DFA092213CE251600599044 /* ProductParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProductParsedResult.h; path = Classes/parsedResults/ProductParsedResult.h; sourceTree = ""; };
-		1DFA092313CE251600599044 /* ProductParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProductParsedResult.m; path = Classes/parsedResults/ProductParsedResult.m; sourceTree = ""; };
-		1DFA092813CE252300599044 /* ProductResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProductResultParser.h; path = Classes/resultParsers/ProductResultParser.h; sourceTree = ""; };
-		1DFA092913CE252300599044 /* ProductResultParser.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ProductResultParser.mm; path = Classes/resultParsers/ProductResultParser.mm; sourceTree = ""; };
-		1DFA099E13CE5C0300599044 /* AddressBookAUResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AddressBookAUResultParser.h; path = Classes/resultParsers/AddressBookAUResultParser.h; sourceTree = ""; };
-		1DFA099F13CE5C0300599044 /* AddressBookAUResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AddressBookAUResultParser.m; path = Classes/resultParsers/AddressBookAUResultParser.m; sourceTree = ""; };
-		1F027F9F11A7BEAF006B06DE /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Decoder.h; path = Classes/Decoder.h; sourceTree = ""; };
-		1F027FA011A7BEAF006B06DE /* Decoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Decoder.mm; path = Classes/Decoder.mm; sourceTree = ""; };
-		1F027FA111A7BEAF006B06DE /* DecoderDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DecoderDelegate.h; path = Classes/DecoderDelegate.h; sourceTree = ""; };
-		1F027FA211A7BEAF006B06DE /* FormatReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FormatReader.h; path = Classes/FormatReader.h; sourceTree = ""; };
-		1F027FA311A7BEAF006B06DE /* FormatReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FormatReader.mm; path = Classes/FormatReader.mm; sourceTree = ""; };
-		1F027FA611A7BEAF006B06DE /* MultiFormatReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MultiFormatReader.mm; path = Classes/MultiFormatReader.mm; sourceTree = ""; };
-		1F027FA711A7BEAF006B06DE /* NSString+HTML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+HTML.h"; path = "Classes/NSString+HTML.h"; sourceTree = ""; };
-		1F027FA811A7BEAF006B06DE /* NSString+HTML.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+HTML.m"; path = "Classes/NSString+HTML.m"; sourceTree = ""; };
-		1F027FA911A7BEAF006B06DE /* OverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OverlayView.h; path = Classes/OverlayView.h; sourceTree = ""; };
-		1F027FAA11A7BEAF006B06DE /* OverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OverlayView.m; path = Classes/OverlayView.m; sourceTree = ""; };
-		1F027FB711A7BEBF006B06DE /* TwoDDecoderResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TwoDDecoderResult.h; path = Classes/TwoDDecoderResult.h; sourceTree = ""; };
-		1F027FB811A7BEBF006B06DE /* TwoDDecoderResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TwoDDecoderResult.m; path = Classes/TwoDDecoderResult.m; sourceTree = ""; };
-		1F027FB911A7BEBF006B06DE /* ZXingWidgetController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXingWidgetController.h; path = Classes/ZXingWidgetController.h; sourceTree = ""; };
-		1F027FBA11A7BEBF006B06DE /* ZXingWidgetController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ZXingWidgetController.m; path = Classes/ZXingWidgetController.m; sourceTree = ""; };
-		1F027FBF11A7BED6006B06DE /* AddContactAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AddContactAction.h; path = Classes/actions/AddContactAction.h; sourceTree = ""; };
-		1F027FC011A7BED6006B06DE /* AddContactAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AddContactAction.m; path = Classes/actions/AddContactAction.m; sourceTree = ""; };
-		1F027FC111A7BED6006B06DE /* CallAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CallAction.h; path = Classes/actions/CallAction.h; sourceTree = ""; };
-		1F027FC211A7BED6006B06DE /* CallAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CallAction.m; path = Classes/actions/CallAction.m; sourceTree = ""; };
-		1F027FC311A7BED6006B06DE /* EmailAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmailAction.h; path = Classes/actions/EmailAction.h; sourceTree = ""; };
-		1F027FC411A7BED6006B06DE /* EmailAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmailAction.m; path = Classes/actions/EmailAction.m; sourceTree = ""; };
-		1F027FC511A7BED6006B06DE /* OpenUrlAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpenUrlAction.h; path = Classes/actions/OpenUrlAction.h; sourceTree = ""; };
-		1F027FC611A7BED6006B06DE /* OpenUrlAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OpenUrlAction.m; path = Classes/actions/OpenUrlAction.m; sourceTree = ""; };
-		1F027FC711A7BED6006B06DE /* ResultAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultAction.h; path = Classes/actions/ResultAction.h; sourceTree = ""; };
-		1F027FC811A7BED6006B06DE /* ResultAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultAction.m; path = Classes/actions/ResultAction.m; sourceTree = ""; };
-		1F027FC911A7BED6006B06DE /* ShowMapAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ShowMapAction.h; path = Classes/actions/ShowMapAction.h; sourceTree = ""; };
-		1F027FCA11A7BED6006B06DE /* ShowMapAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ShowMapAction.m; path = Classes/actions/ShowMapAction.m; sourceTree = ""; };
-		1F027FCB11A7BED6006B06DE /* SMSAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMSAction.h; path = Classes/actions/SMSAction.h; sourceTree = ""; };
-		1F027FCC11A7BED6006B06DE /* SMSAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMSAction.m; path = Classes/actions/SMSAction.m; sourceTree = ""; };
-		1F027FDB11A7BEEB006B06DE /* BusinessCardParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BusinessCardParsedResult.h; path = Classes/parsedResults/BusinessCardParsedResult.h; sourceTree = ""; };
-		1F027FDC11A7BEEB006B06DE /* BusinessCardParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BusinessCardParsedResult.m; path = Classes/parsedResults/BusinessCardParsedResult.m; sourceTree = ""; };
-		1F027FDD11A7BEEB006B06DE /* EmailParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmailParsedResult.h; path = Classes/parsedResults/EmailParsedResult.h; sourceTree = ""; };
-		1F027FDE11A7BEEB006B06DE /* EmailParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmailParsedResult.m; path = Classes/parsedResults/EmailParsedResult.m; sourceTree = ""; };
-		1F027FDF11A7BEEB006B06DE /* GeoParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GeoParsedResult.h; path = Classes/parsedResults/GeoParsedResult.h; sourceTree = ""; };
-		1F027FE011A7BEEB006B06DE /* GeoParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GeoParsedResult.m; path = Classes/parsedResults/GeoParsedResult.m; sourceTree = ""; };
-		1F027FE111A7BEEB006B06DE /* ParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ParsedResult.h; path = Classes/parsedResults/ParsedResult.h; sourceTree = ""; };
-		1F027FE211A7BEEB006B06DE /* ParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ParsedResult.m; path = Classes/parsedResults/ParsedResult.m; sourceTree = ""; };
-		1F027FE311A7BEEB006B06DE /* SMSParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMSParsedResult.h; path = Classes/parsedResults/SMSParsedResult.h; sourceTree = ""; };
-		1F027FE411A7BEEB006B06DE /* SMSParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMSParsedResult.m; path = Classes/parsedResults/SMSParsedResult.m; sourceTree = ""; };
-		1F027FE511A7BEEB006B06DE /* TelParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TelParsedResult.h; path = Classes/parsedResults/TelParsedResult.h; sourceTree = ""; };
-		1F027FE611A7BEEB006B06DE /* TelParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TelParsedResult.m; path = Classes/parsedResults/TelParsedResult.m; sourceTree = ""; };
-		1F027FE711A7BEEB006B06DE /* TextParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TextParsedResult.h; path = Classes/parsedResults/TextParsedResult.h; sourceTree = ""; };
-		1F027FE811A7BEEB006B06DE /* TextParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TextParsedResult.m; path = Classes/parsedResults/TextParsedResult.m; sourceTree = ""; };
-		1F027FE911A7BEEB006B06DE /* URIParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = URIParsedResult.h; path = Classes/parsedResults/URIParsedResult.h; sourceTree = ""; };
-		1F027FEA11A7BEEB006B06DE /* URIParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = URIParsedResult.m; path = Classes/parsedResults/URIParsedResult.m; sourceTree = ""; };
-		1F027FFB11A7BF06006B06DE /* BookmarkDoCoMoResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarkDoCoMoResultParser.h; path = Classes/resultParsers/BookmarkDoCoMoResultParser.h; sourceTree = ""; };
-		1F027FFC11A7BF06006B06DE /* BookmarkDoCoMoResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarkDoCoMoResultParser.m; path = Classes/resultParsers/BookmarkDoCoMoResultParser.m; sourceTree = ""; };
-		1F027FFD11A7BF06006B06DE /* DoCoMoResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DoCoMoResultParser.h; path = Classes/resultParsers/DoCoMoResultParser.h; sourceTree = ""; };
-		1F027FFE11A7BF06006B06DE /* DoCoMoResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DoCoMoResultParser.m; path = Classes/resultParsers/DoCoMoResultParser.m; sourceTree = ""; };
-		1F027FFF11A7BF06006B06DE /* EmailDoCoMoResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmailDoCoMoResultParser.h; path = Classes/resultParsers/EmailDoCoMoResultParser.h; sourceTree = ""; };
-		1F02800011A7BF06006B06DE /* EmailDoCoMoResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmailDoCoMoResultParser.m; path = Classes/resultParsers/EmailDoCoMoResultParser.m; sourceTree = ""; };
-		1F02800111A7BF06006B06DE /* GeoResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GeoResultParser.h; path = Classes/resultParsers/GeoResultParser.h; sourceTree = ""; };
-		1F02800211A7BF06006B06DE /* GeoResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GeoResultParser.m; path = Classes/resultParsers/GeoResultParser.m; sourceTree = ""; };
-		1F02800311A7BF06006B06DE /* MeCardParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MeCardParser.h; path = Classes/resultParsers/MeCardParser.h; sourceTree = ""; };
-		1F02800411A7BF06006B06DE /* MeCardParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MeCardParser.m; path = Classes/resultParsers/MeCardParser.m; sourceTree = ""; };
-		1F02800511A7BF06006B06DE /* PlainEmailResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlainEmailResultParser.h; path = Classes/resultParsers/PlainEmailResultParser.h; sourceTree = ""; };
-		1F02800611A7BF06006B06DE /* PlainEmailResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlainEmailResultParser.m; path = Classes/resultParsers/PlainEmailResultParser.m; sourceTree = ""; };
-		1F02800711A7BF06006B06DE /* ResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultParser.h; path = Classes/resultParsers/ResultParser.h; sourceTree = ""; };
-		1F02800811A7BF06006B06DE /* ResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultParser.m; path = Classes/resultParsers/ResultParser.m; sourceTree = ""; };
-		1F02800911A7BF06006B06DE /* SMSResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMSResultParser.h; path = Classes/resultParsers/SMSResultParser.h; sourceTree = ""; };
-		1F02800A11A7BF06006B06DE /* SMSResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMSResultParser.m; path = Classes/resultParsers/SMSResultParser.m; sourceTree = ""; };
-		1F02800B11A7BF06006B06DE /* SMSTOResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMSTOResultParser.h; path = Classes/resultParsers/SMSTOResultParser.h; sourceTree = ""; };
-		1F02800C11A7BF06006B06DE /* SMSTOResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMSTOResultParser.m; path = Classes/resultParsers/SMSTOResultParser.m; sourceTree = ""; };
-		1F02800D11A7BF06006B06DE /* TelResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TelResultParser.h; path = Classes/resultParsers/TelResultParser.h; sourceTree = ""; };
-		1F02800E11A7BF06006B06DE /* TelResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TelResultParser.m; path = Classes/resultParsers/TelResultParser.m; sourceTree = ""; };
-		1F02800F11A7BF06006B06DE /* TextResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TextResultParser.h; path = Classes/resultParsers/TextResultParser.h; sourceTree = ""; };
-		1F02801011A7BF06006B06DE /* TextResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TextResultParser.m; path = Classes/resultParsers/TextResultParser.m; sourceTree = ""; };
-		1F02801111A7BF06006B06DE /* URLResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = URLResultParser.h; path = Classes/resultParsers/URLResultParser.h; sourceTree = ""; };
-		1F02801211A7BF06006B06DE /* URLResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = URLResultParser.m; path = Classes/resultParsers/URLResultParser.m; sourceTree = ""; };
-		1F02801311A7BF06006B06DE /* URLTOResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = URLTOResultParser.h; path = Classes/resultParsers/URLTOResultParser.h; sourceTree = ""; };
-		1F02801411A7BF06006B06DE /* URLTOResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = URLTOResultParser.m; path = Classes/resultParsers/URLTOResultParser.m; sourceTree = ""; };
-		1F3DB0C011C60DB4009C581B /* QRCodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QRCodeReader.h; path = Classes/QRCodeReader.h; sourceTree = ""; };
-		1F3DB0C111C60DB4009C581B /* QRCodeReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = QRCodeReader.mm; path = Classes/QRCodeReader.mm; sourceTree = ""; };
-		1F3DB0F511C61080009C581B /* DataMatrixReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DataMatrixReader.h; path = Classes/DataMatrixReader.h; sourceTree = ""; };
-		1F3DB0F611C61080009C581B /* DataMatrixReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = DataMatrixReader.mm; path = Classes/DataMatrixReader.mm; sourceTree = ""; };
-		1F3DB0F711C61080009C581B /* MultiFormatOneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MultiFormatOneDReader.h; path = Classes/MultiFormatOneDReader.h; sourceTree = ""; };
-		1F3DB0F811C61080009C581B /* MultiFormatOneDReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MultiFormatOneDReader.mm; path = Classes/MultiFormatOneDReader.mm; sourceTree = ""; };
-		1F3DB0F911C61080009C581B /* MultiFormatUPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MultiFormatUPCEANReader.h; path = Classes/MultiFormatUPCEANReader.h; sourceTree = ""; };
-		1F3DB0FA11C61080009C581B /* MultiFormatUPCEANReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MultiFormatUPCEANReader.mm; path = Classes/MultiFormatUPCEANReader.mm; sourceTree = ""; };
-		1FB4319D12901C76002D63E8 /* UniversalResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UniversalResultParser.h; path = Classes/resultParsers/UniversalResultParser.h; sourceTree = ""; };
-		1FB4319E12901C76002D63E8 /* UniversalResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UniversalResultParser.m; path = Classes/resultParsers/UniversalResultParser.m; sourceTree = ""; };
-		3B72D96D12130EF6007CEF32 /* ResultPointCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResultPointCallback.cpp; sourceTree = ""; };
-		3B72D96E12130EF6007CEF32 /* ResultPointCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResultPointCallback.h; sourceTree = ""; };
-		3B81AAC3120F07E40022E5D4 /* DecodeHints.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodeHints.cpp; sourceTree = ""; };
-		3B81AAC4120F07E40022E5D4 /* DecodeHints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodeHints.h; sourceTree = ""; };
-		3B81AAC7120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GreyscaleLuminanceSource.cpp; sourceTree = ""; };
-		3B81AAC8120F080D0022E5D4 /* GreyscaleLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GreyscaleLuminanceSource.h; sourceTree = ""; };
-		3B81AACB120F08170022E5D4 /* HybridBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridBinarizer.cpp; sourceTree = ""; };
-		3B81AACC120F08170022E5D4 /* HybridBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HybridBinarizer.h; sourceTree = ""; };
-		3B81AAF6120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GreyscaleRotatedLuminanceSource.cpp; sourceTree = ""; };
-		3B81AAF7120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GreyscaleRotatedLuminanceSource.h; sourceTree = ""; };
-		AA747D9E0F9514B9006C5449 /* ZXingWidget_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXingWidget_Prefix.pch; sourceTree = SOURCE_ROOT; };
-		AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
-		D2AAC07E0554694100DB518D /* libZXingWidget.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libZXingWidget.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		E53458B511987396000CB77F /* BarcodeFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BarcodeFormat.cpp; sourceTree = ""; };
-		E53458B611987396000CB77F /* BarcodeFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BarcodeFormat.h; sourceTree = ""; };
-		E53458B711987396000CB77F /* Binarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Binarizer.cpp; sourceTree = ""; };
-		E53458B811987396000CB77F /* Binarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Binarizer.h; sourceTree = ""; };
-		E53458B911987396000CB77F /* BinaryBitmap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BinaryBitmap.cpp; sourceTree = ""; };
-		E53458BA11987396000CB77F /* BinaryBitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BinaryBitmap.h; sourceTree = ""; };
-		E53458BC11987396000CB77F /* Array.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Array.cpp; sourceTree = ""; };
-		E53458BD11987396000CB77F /* Array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Array.h; sourceTree = ""; };
-		E53458BE11987396000CB77F /* BitArray.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitArray.cpp; sourceTree = ""; };
-		E53458BF11987396000CB77F /* BitArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitArray.h; sourceTree = ""; };
-		E53458C011987396000CB77F /* BitMatrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrix.cpp; sourceTree = ""; };
-		E53458C111987396000CB77F /* BitMatrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrix.h; sourceTree = ""; };
-		E53458C211987396000CB77F /* BitSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitSource.cpp; sourceTree = ""; };
-		E53458C311987396000CB77F /* BitSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitSource.h; sourceTree = ""; };
-		E53458C411987396000CB77F /* Counted.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Counted.cpp; sourceTree = ""; };
-		E53458C511987396000CB77F /* Counted.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Counted.h; sourceTree = ""; };
-		E53458C611987396000CB77F /* DecoderResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecoderResult.cpp; sourceTree = ""; };
-		E53458C711987396000CB77F /* DecoderResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecoderResult.h; sourceTree = ""; };
-		E53458C811987396000CB77F /* DetectorResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DetectorResult.cpp; sourceTree = ""; };
-		E53458C911987396000CB77F /* DetectorResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetectorResult.h; sourceTree = ""; };
-		E53458CA11987396000CB77F /* EdgeDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EdgeDetector.cpp; sourceTree = ""; };
-		E53458CB11987396000CB77F /* EdgeDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EdgeDetector.h; sourceTree = ""; };
-		E53458CC11987396000CB77F /* GlobalHistogramBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GlobalHistogramBinarizer.cpp; sourceTree = ""; };
-		E53458CD11987396000CB77F /* GlobalHistogramBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlobalHistogramBinarizer.h; sourceTree = ""; };
-		E53458CE11987396000CB77F /* GridSampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GridSampler.cpp; sourceTree = ""; };
-		E53458CF11987396000CB77F /* GridSampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridSampler.h; sourceTree = ""; };
-		E53458D011987396000CB77F /* IllegalArgumentException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IllegalArgumentException.cpp; sourceTree = ""; };
-		E53458D111987396000CB77F /* IllegalArgumentException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IllegalArgumentException.h; sourceTree = ""; };
-		E53458D411987396000CB77F /* PerspectiveTransform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PerspectiveTransform.cpp; sourceTree = ""; };
-		E53458D511987396000CB77F /* PerspectiveTransform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerspectiveTransform.h; sourceTree = ""; };
-		E53458D611987396000CB77F /* Point.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Point.h; sourceTree = ""; };
-		E53458D811987396000CB77F /* GF256.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GF256.cpp; sourceTree = ""; };
-		E53458D911987396000CB77F /* GF256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GF256.h; sourceTree = ""; };
-		E53458DA11987396000CB77F /* GF256Poly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GF256Poly.cpp; sourceTree = ""; };
-		E53458DB11987396000CB77F /* GF256Poly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GF256Poly.h; sourceTree = ""; };
-		E53458DC11987396000CB77F /* ReedSolomonDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReedSolomonDecoder.cpp; sourceTree = ""; };
-		E53458DD11987396000CB77F /* ReedSolomonDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedSolomonDecoder.h; sourceTree = ""; };
-		E53458DE11987396000CB77F /* ReedSolomonException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReedSolomonException.cpp; sourceTree = ""; };
-		E53458DF11987396000CB77F /* ReedSolomonException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedSolomonException.h; sourceTree = ""; };
-		E53458E011987396000CB77F /* Str.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Str.cpp; sourceTree = ""; };
-		E53458E111987396000CB77F /* Str.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Str.h; sourceTree = ""; };
-		E53458E311987396000CB77F /* DataMatrixReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataMatrixReader.cpp; sourceTree = ""; };
-		E53458E411987396000CB77F /* DataMatrixReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataMatrixReader.h; sourceTree = ""; };
-		E53458E611987396000CB77F /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; };
-		E53458E711987396000CB77F /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; };
-		E53458E811987396000CB77F /* DataBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataBlock.cpp; sourceTree = ""; };
-		E53458E911987396000CB77F /* DataBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataBlock.h; sourceTree = ""; };
-		E53458EA11987396000CB77F /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; };
-		E53458EB11987396000CB77F /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; };
-		E53458EC11987396000CB77F /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; };
-		E53458ED11987396000CB77F /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; };
-		E53458EF11987396000CB77F /* CornerPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CornerPoint.cpp; sourceTree = ""; };
-		E53458F011987396000CB77F /* CornerPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CornerPoint.h; sourceTree = ""; };
-		E53458F111987396000CB77F /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; };
-		E53458F211987396000CB77F /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; };
-		E53458F311987396000CB77F /* MonochromeRectangleDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MonochromeRectangleDetector.cpp; sourceTree = ""; };
-		E53458F411987396000CB77F /* MonochromeRectangleDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MonochromeRectangleDetector.h; sourceTree = ""; };
-		E53458F511987396000CB77F /* Version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Version.cpp; sourceTree = ""; };
-		E53458F611987396000CB77F /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; };
-		E53458F711987396000CB77F /* Exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Exception.cpp; sourceTree = ""; };
-		E53458F811987396000CB77F /* Exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Exception.h; sourceTree = ""; };
-		E53458F911987396000CB77F /* LuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LuminanceSource.cpp; sourceTree = ""; };
-		E53458FA11987396000CB77F /* LuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LuminanceSource.h; sourceTree = ""; };
-		E53458FB11987396000CB77F /* MultiFormatReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatReader.cpp; sourceTree = ""; };
-		E53458FC11987396000CB77F /* MultiFormatReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatReader.h; sourceTree = ""; };
-		E53458FE11987396000CB77F /* Code128Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code128Reader.cpp; sourceTree = ""; };
-		E53458FF11987396000CB77F /* Code128Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code128Reader.h; sourceTree = ""; };
-		E534590011987396000CB77F /* Code39Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code39Reader.cpp; sourceTree = ""; };
-		E534590111987396000CB77F /* Code39Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code39Reader.h; sourceTree = ""; };
-		E534590211987396000CB77F /* EAN13Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EAN13Reader.cpp; sourceTree = ""; };
-		E534590311987396000CB77F /* EAN13Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAN13Reader.h; sourceTree = ""; };
-		E534590411987396000CB77F /* EAN8Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EAN8Reader.cpp; sourceTree = ""; };
-		E534590511987396000CB77F /* EAN8Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAN8Reader.h; sourceTree = ""; };
-		E534590611987396000CB77F /* ITFReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ITFReader.cpp; sourceTree = ""; };
-		E534590711987396000CB77F /* ITFReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ITFReader.h; sourceTree = ""; };
-		E534590811987396000CB77F /* MultiFormatOneDReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatOneDReader.cpp; sourceTree = ""; };
-		E534590911987396000CB77F /* MultiFormatOneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatOneDReader.h; sourceTree = ""; };
-		E534590A11987396000CB77F /* MultiFormatUPCEANReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatUPCEANReader.cpp; sourceTree = ""; };
-		E534590B11987396000CB77F /* MultiFormatUPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatUPCEANReader.h; sourceTree = ""; };
-		E534590C11987396000CB77F /* OneDReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OneDReader.cpp; sourceTree = ""; };
-		E534590D11987396000CB77F /* OneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneDReader.h; sourceTree = ""; };
-		E534590E11987396000CB77F /* OneDResultPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OneDResultPoint.cpp; sourceTree = ""; };
-		E534590F11987396000CB77F /* OneDResultPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneDResultPoint.h; sourceTree = ""; };
-		E534591011987396000CB77F /* UPCAReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCAReader.cpp; sourceTree = ""; };
-		E534591111987396000CB77F /* UPCAReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCAReader.h; sourceTree = ""; };
-		E534591211987396000CB77F /* UPCEANReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCEANReader.cpp; sourceTree = ""; };
-		E534591311987396000CB77F /* UPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCEANReader.h; sourceTree = ""; };
-		E534591411987396000CB77F /* UPCEReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCEReader.cpp; sourceTree = ""; };
-		E534591511987396000CB77F /* UPCEReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCEReader.h; sourceTree = ""; };
-		E534591811987396000CB77F /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; };
-		E534591911987396000CB77F /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; };
-		E534591A11987396000CB77F /* DataBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataBlock.cpp; sourceTree = ""; };
-		E534591B11987396000CB77F /* DataBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataBlock.h; sourceTree = ""; };
-		E534591C11987396000CB77F /* DataMask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataMask.cpp; sourceTree = ""; };
-		E534591D11987396000CB77F /* DataMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataMask.h; sourceTree = ""; };
-		E534591E11987396000CB77F /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; };
-		E534591F11987396000CB77F /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; };
-		E534592011987396000CB77F /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; };
-		E534592111987396000CB77F /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; };
-		E534592211987396000CB77F /* Mode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode.cpp; sourceTree = ""; };
-		E534592311987396000CB77F /* Mode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mode.h; sourceTree = ""; };
-		E534592511987396000CB77F /* AlignmentPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlignmentPattern.cpp; sourceTree = ""; };
-		E534592611987396000CB77F /* AlignmentPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlignmentPattern.h; sourceTree = ""; };
-		E534592711987396000CB77F /* AlignmentPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlignmentPatternFinder.cpp; sourceTree = ""; };
-		E534592811987396000CB77F /* AlignmentPatternFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlignmentPatternFinder.h; sourceTree = ""; };
-		E534592911987396000CB77F /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; };
-		E534592A11987396000CB77F /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; };
-		E534592B11987396000CB77F /* FinderPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPattern.cpp; sourceTree = ""; };
-		E534592C11987396000CB77F /* FinderPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPattern.h; sourceTree = ""; };
-		E534592D11987396000CB77F /* FinderPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPatternFinder.cpp; sourceTree = ""; };
-		E534592E11987396000CB77F /* FinderPatternFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPatternFinder.h; sourceTree = ""; };
-		E534592F11987396000CB77F /* FinderPatternInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPatternInfo.cpp; sourceTree = ""; };
-		E534593011987396000CB77F /* FinderPatternInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPatternInfo.h; sourceTree = ""; };
-		E534593111987396000CB77F /* QREdgeDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QREdgeDetector.cpp; sourceTree = ""; };
-		E534593211987396000CB77F /* QREdgeDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QREdgeDetector.h; sourceTree = ""; };
-		E534593311987396000CB77F /* ErrorCorrectionLevel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorCorrectionLevel.cpp; sourceTree = ""; };
-		E534593411987396000CB77F /* ErrorCorrectionLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorCorrectionLevel.h; sourceTree = ""; };
-		E534593511987396000CB77F /* FormatInformation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatInformation.cpp; sourceTree = ""; };
-		E534593611987396000CB77F /* FormatInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatInformation.h; sourceTree = ""; };
-		E534593711987396000CB77F /* QRCodeReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QRCodeReader.cpp; sourceTree = ""; };
-		E534593811987396000CB77F /* QRCodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QRCodeReader.h; sourceTree = ""; };
-		E534593911987396000CB77F /* Version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Version.cpp; sourceTree = ""; };
-		E534593A11987396000CB77F /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; };
-		E534593B11987396000CB77F /* Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Reader.cpp; sourceTree = ""; };
-		E534593C11987396000CB77F /* Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reader.h; sourceTree = ""; };
-		E534593D11987396000CB77F /* ReaderException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReaderException.cpp; sourceTree = ""; };
-		E534593E11987396000CB77F /* ReaderException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderException.h; sourceTree = ""; };
-		E534593F11987396000CB77F /* Result.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Result.cpp; sourceTree = ""; };
-		E534594011987396000CB77F /* Result.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Result.h; sourceTree = ""; };
-		E534594111987396000CB77F /* ResultPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResultPoint.cpp; sourceTree = ""; };
-		E534594211987396000CB77F /* ResultPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResultPoint.h; sourceTree = ""; };
-		E53459CA119873F3000CB77F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
-		E5345A651198792F000CB77F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
-		E5345AA21198859A000CB77F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		D2AAC07C0554694100DB518D /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */,
-				E53459CB119873F3000CB77F /* UIKit.framework in Frameworks */,
-				E5345A661198792F000CB77F /* AudioToolbox.framework in Frameworks */,
-				E5345AA31198859A000CB77F /* CoreGraphics.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		034768DFFF38A50411DB9C8B /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				D2AAC07E0554694100DB518D /* libZXingWidget.a */,
-			);
-			name = Products;
-			sourceTree = "";
-		};
-		0867D691FE84028FC02AAC07 /* ZXingWidget */ = {
-			isa = PBXGroup;
-			children = (
-				E53458B311987396000CB77F /* CoreSrc */,
-				08FB77AEFE84172EC02AAC07 /* Classes */,
-				32C88DFF0371C24200C91783 /* Other Sources */,
-				0867D69AFE84028FC02AAC07 /* Frameworks */,
-				E5345D2811999F53000CB77F /* Resources */,
-				034768DFFF38A50411DB9C8B /* Products */,
-			);
-			name = ZXingWidget;
-			sourceTree = "";
-		};
-		0867D69AFE84028FC02AAC07 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				AACBBE490F95108600F1A2B1 /* Foundation.framework */,
-				E53459CA119873F3000CB77F /* UIKit.framework */,
-				E5345A651198792F000CB77F /* AudioToolbox.framework */,
-				E5345AA21198859A000CB77F /* CoreGraphics.framework */,
-			);
-			name = Frameworks;
-			sourceTree = "";
-		};
-		08FB77AEFE84172EC02AAC07 /* Classes */ = {
-			isa = PBXGroup;
-			children = (
-				1DFA090A13CE1A3900599044 /* CBarcodeFormat.h */,
-				1DFA090B13CE1A3900599044 /* CBarcodeFormat.mm */,
-				1F3DB0F511C61080009C581B /* DataMatrixReader.h */,
-				1F3DB0F611C61080009C581B /* DataMatrixReader.mm */,
-				1F3DB0F711C61080009C581B /* MultiFormatOneDReader.h */,
-				1F3DB0F811C61080009C581B /* MultiFormatOneDReader.mm */,
-				1F3DB0F911C61080009C581B /* MultiFormatUPCEANReader.h */,
-				1F3DB0FA11C61080009C581B /* MultiFormatUPCEANReader.mm */,
-				1F3DB0C011C60DB4009C581B /* QRCodeReader.h */,
-				1F3DB0C111C60DB4009C581B /* QRCodeReader.mm */,
-				1F027FB711A7BEBF006B06DE /* TwoDDecoderResult.h */,
-				1F027FB811A7BEBF006B06DE /* TwoDDecoderResult.m */,
-				1F027FB911A7BEBF006B06DE /* ZXingWidgetController.h */,
-				1F027FBA11A7BEBF006B06DE /* ZXingWidgetController.m */,
-				1F027F9F11A7BEAF006B06DE /* Decoder.h */,
-				1F027FA011A7BEAF006B06DE /* Decoder.mm */,
-				1F027FA111A7BEAF006B06DE /* DecoderDelegate.h */,
-				1F027FA211A7BEAF006B06DE /* FormatReader.h */,
-				1F027FA311A7BEAF006B06DE /* FormatReader.mm */,
-				1F027FA611A7BEAF006B06DE /* MultiFormatReader.mm */,
-				1F027FA711A7BEAF006B06DE /* NSString+HTML.h */,
-				1F027FA811A7BEAF006B06DE /* NSString+HTML.m */,
-				1F027FA911A7BEAF006B06DE /* OverlayView.h */,
-				1F027FAA11A7BEAF006B06DE /* OverlayView.m */,
-				E5345A00119876A5000CB77F /* Actions */,
-				E53459EF119876A5000CB77F /* ParsedResults */,
-				E53459D4119876A5000CB77F /* ResultParsers */,
-			);
-			name = Classes;
-			sourceTree = "";
-		};
-		32C88DFF0371C24200C91783 /* Other Sources */ = {
-			isa = PBXGroup;
-			children = (
-				AA747D9E0F9514B9006C5449 /* ZXingWidget_Prefix.pch */,
-			);
-			name = "Other Sources";
-			sourceTree = "";
-		};
-		E53458B311987396000CB77F /* CoreSrc */ = {
-			isa = PBXGroup;
-			children = (
-				E53458B411987396000CB77F /* zxing */,
-			);
-			name = CoreSrc;
-			path = ../../cpp/core/src;
-			sourceTree = SOURCE_ROOT;
-		};
-		E53458B411987396000CB77F /* zxing */ = {
-			isa = PBXGroup;
-			children = (
-				3B72D96D12130EF6007CEF32 /* ResultPointCallback.cpp */,
-				3B72D96E12130EF6007CEF32 /* ResultPointCallback.h */,
-				3B81AAC3120F07E40022E5D4 /* DecodeHints.cpp */,
-				3B81AAC4120F07E40022E5D4 /* DecodeHints.h */,
-				E53458B511987396000CB77F /* BarcodeFormat.cpp */,
-				E53458B611987396000CB77F /* BarcodeFormat.h */,
-				E53458B711987396000CB77F /* Binarizer.cpp */,
-				E53458B811987396000CB77F /* Binarizer.h */,
-				E53458B911987396000CB77F /* BinaryBitmap.cpp */,
-				E53458BA11987396000CB77F /* BinaryBitmap.h */,
-				E53458BB11987396000CB77F /* common */,
-				E53458E211987396000CB77F /* datamatrix */,
-				E53458F711987396000CB77F /* Exception.cpp */,
-				E53458F811987396000CB77F /* Exception.h */,
-				E53458F911987396000CB77F /* LuminanceSource.cpp */,
-				E53458FA11987396000CB77F /* LuminanceSource.h */,
-				E53458FB11987396000CB77F /* MultiFormatReader.cpp */,
-				E53458FC11987396000CB77F /* MultiFormatReader.h */,
-				E53458FD11987396000CB77F /* oned */,
-				E534591611987396000CB77F /* qrcode */,
-				E534593B11987396000CB77F /* Reader.cpp */,
-				E534593C11987396000CB77F /* Reader.h */,
-				E534593D11987396000CB77F /* ReaderException.cpp */,
-				E534593E11987396000CB77F /* ReaderException.h */,
-				E534593F11987396000CB77F /* Result.cpp */,
-				E534594011987396000CB77F /* Result.h */,
-				E534594111987396000CB77F /* ResultPoint.cpp */,
-				E534594211987396000CB77F /* ResultPoint.h */,
-			);
-			path = zxing;
-			sourceTree = "";
-		};
-		E53458BB11987396000CB77F /* common */ = {
-			isa = PBXGroup;
-			children = (
-				3B81AAF6120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp */,
-				3B81AAF7120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h */,
-				3B81AACB120F08170022E5D4 /* HybridBinarizer.cpp */,
-				3B81AACC120F08170022E5D4 /* HybridBinarizer.h */,
-				3B81AAC7120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp */,
-				3B81AAC8120F080D0022E5D4 /* GreyscaleLuminanceSource.h */,
-				E53458BC11987396000CB77F /* Array.cpp */,
-				E53458BD11987396000CB77F /* Array.h */,
-				E53458BE11987396000CB77F /* BitArray.cpp */,
-				E53458BF11987396000CB77F /* BitArray.h */,
-				E53458C011987396000CB77F /* BitMatrix.cpp */,
-				E53458C111987396000CB77F /* BitMatrix.h */,
-				E53458C211987396000CB77F /* BitSource.cpp */,
-				E53458C311987396000CB77F /* BitSource.h */,
-				E53458C411987396000CB77F /* Counted.cpp */,
-				E53458C511987396000CB77F /* Counted.h */,
-				E53458C611987396000CB77F /* DecoderResult.cpp */,
-				E53458C711987396000CB77F /* DecoderResult.h */,
-				E53458C811987396000CB77F /* DetectorResult.cpp */,
-				E53458C911987396000CB77F /* DetectorResult.h */,
-				E53458CA11987396000CB77F /* EdgeDetector.cpp */,
-				E53458CB11987396000CB77F /* EdgeDetector.h */,
-				E53458CC11987396000CB77F /* GlobalHistogramBinarizer.cpp */,
-				E53458CD11987396000CB77F /* GlobalHistogramBinarizer.h */,
-				E53458CE11987396000CB77F /* GridSampler.cpp */,
-				E53458CF11987396000CB77F /* GridSampler.h */,
-				E53458D011987396000CB77F /* IllegalArgumentException.cpp */,
-				E53458D111987396000CB77F /* IllegalArgumentException.h */,
-				E53458D411987396000CB77F /* PerspectiveTransform.cpp */,
-				E53458D511987396000CB77F /* PerspectiveTransform.h */,
-				E53458D611987396000CB77F /* Point.h */,
-				E53458D711987396000CB77F /* reedsolomon */,
-				E53458E011987396000CB77F /* Str.cpp */,
-				E53458E111987396000CB77F /* Str.h */,
-			);
-			path = common;
-			sourceTree = "";
-		};
-		E53458D711987396000CB77F /* reedsolomon */ = {
-			isa = PBXGroup;
-			children = (
-				E53458D811987396000CB77F /* GF256.cpp */,
-				E53458D911987396000CB77F /* GF256.h */,
-				E53458DA11987396000CB77F /* GF256Poly.cpp */,
-				E53458DB11987396000CB77F /* GF256Poly.h */,
-				E53458DC11987396000CB77F /* ReedSolomonDecoder.cpp */,
-				E53458DD11987396000CB77F /* ReedSolomonDecoder.h */,
-				E53458DE11987396000CB77F /* ReedSolomonException.cpp */,
-				E53458DF11987396000CB77F /* ReedSolomonException.h */,
-			);
-			path = reedsolomon;
-			sourceTree = "";
-		};
-		E53458E211987396000CB77F /* datamatrix */ = {
-			isa = PBXGroup;
-			children = (
-				E53458E311987396000CB77F /* DataMatrixReader.cpp */,
-				E53458E411987396000CB77F /* DataMatrixReader.h */,
-				E53458E511987396000CB77F /* decoder */,
-				E53458EE11987396000CB77F /* detector */,
-				E53458F511987396000CB77F /* Version.cpp */,
-				E53458F611987396000CB77F /* Version.h */,
-			);
-			path = datamatrix;
-			sourceTree = "";
-		};
-		E53458E511987396000CB77F /* decoder */ = {
-			isa = PBXGroup;
-			children = (
-				E53458E611987396000CB77F /* BitMatrixParser.cpp */,
-				E53458E711987396000CB77F /* BitMatrixParser.h */,
-				E53458E811987396000CB77F /* DataBlock.cpp */,
-				E53458E911987396000CB77F /* DataBlock.h */,
-				E53458EA11987396000CB77F /* DecodedBitStreamParser.cpp */,
-				E53458EB11987396000CB77F /* DecodedBitStreamParser.h */,
-				E53458EC11987396000CB77F /* Decoder.cpp */,
-				E53458ED11987396000CB77F /* Decoder.h */,
-			);
-			path = decoder;
-			sourceTree = "";
-		};
-		E53458EE11987396000CB77F /* detector */ = {
-			isa = PBXGroup;
-			children = (
-				E53458EF11987396000CB77F /* CornerPoint.cpp */,
-				E53458F011987396000CB77F /* CornerPoint.h */,
-				E53458F111987396000CB77F /* Detector.cpp */,
-				E53458F211987396000CB77F /* Detector.h */,
-				E53458F311987396000CB77F /* MonochromeRectangleDetector.cpp */,
-				E53458F411987396000CB77F /* MonochromeRectangleDetector.h */,
-			);
-			path = detector;
-			sourceTree = "";
-		};
-		E53458FD11987396000CB77F /* oned */ = {
-			isa = PBXGroup;
-			children = (
-				E53458FE11987396000CB77F /* Code128Reader.cpp */,
-				E53458FF11987396000CB77F /* Code128Reader.h */,
-				E534590011987396000CB77F /* Code39Reader.cpp */,
-				E534590111987396000CB77F /* Code39Reader.h */,
-				E534590211987396000CB77F /* EAN13Reader.cpp */,
-				E534590311987396000CB77F /* EAN13Reader.h */,
-				E534590411987396000CB77F /* EAN8Reader.cpp */,
-				E534590511987396000CB77F /* EAN8Reader.h */,
-				E534590611987396000CB77F /* ITFReader.cpp */,
-				E534590711987396000CB77F /* ITFReader.h */,
-				E534590811987396000CB77F /* MultiFormatOneDReader.cpp */,
-				E534590911987396000CB77F /* MultiFormatOneDReader.h */,
-				E534590A11987396000CB77F /* MultiFormatUPCEANReader.cpp */,
-				E534590B11987396000CB77F /* MultiFormatUPCEANReader.h */,
-				E534590C11987396000CB77F /* OneDReader.cpp */,
-				E534590D11987396000CB77F /* OneDReader.h */,
-				E534590E11987396000CB77F /* OneDResultPoint.cpp */,
-				E534590F11987396000CB77F /* OneDResultPoint.h */,
-				E534591011987396000CB77F /* UPCAReader.cpp */,
-				E534591111987396000CB77F /* UPCAReader.h */,
-				E534591211987396000CB77F /* UPCEANReader.cpp */,
-				E534591311987396000CB77F /* UPCEANReader.h */,
-				E534591411987396000CB77F /* UPCEReader.cpp */,
-				E534591511987396000CB77F /* UPCEReader.h */,
-			);
-			path = oned;
-			sourceTree = "";
-		};
-		E534591611987396000CB77F /* qrcode */ = {
-			isa = PBXGroup;
-			children = (
-				E534591711987396000CB77F /* decoder */,
-				E534592411987396000CB77F /* detector */,
-				E534593311987396000CB77F /* ErrorCorrectionLevel.cpp */,
-				E534593411987396000CB77F /* ErrorCorrectionLevel.h */,
-				E534593511987396000CB77F /* FormatInformation.cpp */,
-				E534593611987396000CB77F /* FormatInformation.h */,
-				E534593711987396000CB77F /* QRCodeReader.cpp */,
-				E534593811987396000CB77F /* QRCodeReader.h */,
-				E534593911987396000CB77F /* Version.cpp */,
-				E534593A11987396000CB77F /* Version.h */,
-			);
-			path = qrcode;
-			sourceTree = "";
-		};
-		E534591711987396000CB77F /* decoder */ = {
-			isa = PBXGroup;
-			children = (
-				E534591811987396000CB77F /* BitMatrixParser.cpp */,
-				E534591911987396000CB77F /* BitMatrixParser.h */,
-				E534591A11987396000CB77F /* DataBlock.cpp */,
-				E534591B11987396000CB77F /* DataBlock.h */,
-				E534591C11987396000CB77F /* DataMask.cpp */,
-				E534591D11987396000CB77F /* DataMask.h */,
-				E534591E11987396000CB77F /* DecodedBitStreamParser.cpp */,
-				E534591F11987396000CB77F /* DecodedBitStreamParser.h */,
-				E534592011987396000CB77F /* Decoder.cpp */,
-				E534592111987396000CB77F /* Decoder.h */,
-				E534592211987396000CB77F /* Mode.cpp */,
-				E534592311987396000CB77F /* Mode.h */,
-			);
-			path = decoder;
-			sourceTree = "";
-		};
-		E534592411987396000CB77F /* detector */ = {
-			isa = PBXGroup;
-			children = (
-				E534592511987396000CB77F /* AlignmentPattern.cpp */,
-				E534592611987396000CB77F /* AlignmentPattern.h */,
-				E534592711987396000CB77F /* AlignmentPatternFinder.cpp */,
-				E534592811987396000CB77F /* AlignmentPatternFinder.h */,
-				E534592911987396000CB77F /* Detector.cpp */,
-				E534592A11987396000CB77F /* Detector.h */,
-				E534592B11987396000CB77F /* FinderPattern.cpp */,
-				E534592C11987396000CB77F /* FinderPattern.h */,
-				E534592D11987396000CB77F /* FinderPatternFinder.cpp */,
-				E534592E11987396000CB77F /* FinderPatternFinder.h */,
-				E534592F11987396000CB77F /* FinderPatternInfo.cpp */,
-				E534593011987396000CB77F /* FinderPatternInfo.h */,
-				E534593111987396000CB77F /* QREdgeDetector.cpp */,
-				E534593211987396000CB77F /* QREdgeDetector.h */,
-			);
-			path = detector;
-			sourceTree = "";
-		};
-		E53459D4119876A5000CB77F /* ResultParsers */ = {
-			isa = PBXGroup;
-			children = (
-				1FB4319D12901C76002D63E8 /* UniversalResultParser.h */,
-				1FB4319E12901C76002D63E8 /* UniversalResultParser.m */,
-				1DFA099E13CE5C0300599044 /* AddressBookAUResultParser.h */,
-				1DFA099F13CE5C0300599044 /* AddressBookAUResultParser.m */,
-				1D0CBDF713D0DD5D003D0F8D /* BizcardResultParser.h */,
-				1D0CBDF813D0DD5D003D0F8D /* BizcardResultParser.m */,
-				1F027FFB11A7BF06006B06DE /* BookmarkDoCoMoResultParser.h */,
-				1F027FFC11A7BF06006B06DE /* BookmarkDoCoMoResultParser.m */,
-				1F027FFD11A7BF06006B06DE /* DoCoMoResultParser.h */,
-				1F027FFE11A7BF06006B06DE /* DoCoMoResultParser.m */,
-				1F027FFF11A7BF06006B06DE /* EmailDoCoMoResultParser.h */,
-				1F02800011A7BF06006B06DE /* EmailDoCoMoResultParser.m */,
-				1F02800111A7BF06006B06DE /* GeoResultParser.h */,
-				1F02800211A7BF06006B06DE /* GeoResultParser.m */,
-				1F02800311A7BF06006B06DE /* MeCardParser.h */,
-				1F02800411A7BF06006B06DE /* MeCardParser.m */,
-				1F02800511A7BF06006B06DE /* PlainEmailResultParser.h */,
-				1F02800611A7BF06006B06DE /* PlainEmailResultParser.m */,
-				1DFA092813CE252300599044 /* ProductResultParser.h */,
-				1DFA092913CE252300599044 /* ProductResultParser.mm */,
-				1F02800711A7BF06006B06DE /* ResultParser.h */,
-				1F02800811A7BF06006B06DE /* ResultParser.m */,
-				1F02800911A7BF06006B06DE /* SMSResultParser.h */,
-				1F02800A11A7BF06006B06DE /* SMSResultParser.m */,
-				1F02800B11A7BF06006B06DE /* SMSTOResultParser.h */,
-				1F02800C11A7BF06006B06DE /* SMSTOResultParser.m */,
-				1F02800D11A7BF06006B06DE /* TelResultParser.h */,
-				1F02800E11A7BF06006B06DE /* TelResultParser.m */,
-				1F02800F11A7BF06006B06DE /* TextResultParser.h */,
-				1F02801011A7BF06006B06DE /* TextResultParser.m */,
-				1F02801111A7BF06006B06DE /* URLResultParser.h */,
-				1F02801211A7BF06006B06DE /* URLResultParser.m */,
-				1F02801311A7BF06006B06DE /* URLTOResultParser.h */,
-				1F02801411A7BF06006B06DE /* URLTOResultParser.m */,
-			);
-			name = ResultParsers;
-			sourceTree = "";
-		};
-		E53459EF119876A5000CB77F /* ParsedResults */ = {
-			isa = PBXGroup;
-			children = (
-				1F027FDB11A7BEEB006B06DE /* BusinessCardParsedResult.h */,
-				1F027FDC11A7BEEB006B06DE /* BusinessCardParsedResult.m */,
-				1F027FDD11A7BEEB006B06DE /* EmailParsedResult.h */,
-				1F027FDE11A7BEEB006B06DE /* EmailParsedResult.m */,
-				1F027FDF11A7BEEB006B06DE /* GeoParsedResult.h */,
-				1F027FE011A7BEEB006B06DE /* GeoParsedResult.m */,
-				1F027FE111A7BEEB006B06DE /* ParsedResult.h */,
-				1F027FE211A7BEEB006B06DE /* ParsedResult.m */,
-				1DFA092213CE251600599044 /* ProductParsedResult.h */,
-				1DFA092313CE251600599044 /* ProductParsedResult.m */,
-				1F027FE311A7BEEB006B06DE /* SMSParsedResult.h */,
-				1F027FE411A7BEEB006B06DE /* SMSParsedResult.m */,
-				1F027FE511A7BEEB006B06DE /* TelParsedResult.h */,
-				1F027FE611A7BEEB006B06DE /* TelParsedResult.m */,
-				1F027FE711A7BEEB006B06DE /* TextParsedResult.h */,
-				1F027FE811A7BEEB006B06DE /* TextParsedResult.m */,
-				1F027FE911A7BEEB006B06DE /* URIParsedResult.h */,
-				1F027FEA11A7BEEB006B06DE /* URIParsedResult.m */,
-			);
-			name = ParsedResults;
-			sourceTree = "";
-		};
-		E5345A00119876A5000CB77F /* Actions */ = {
-			isa = PBXGroup;
-			children = (
-				1F027FBF11A7BED6006B06DE /* AddContactAction.h */,
-				1F027FC011A7BED6006B06DE /* AddContactAction.m */,
-				1F027FC111A7BED6006B06DE /* CallAction.h */,
-				1F027FC211A7BED6006B06DE /* CallAction.m */,
-				1F027FC311A7BED6006B06DE /* EmailAction.h */,
-				1F027FC411A7BED6006B06DE /* EmailAction.m */,
-				1F027FC511A7BED6006B06DE /* OpenUrlAction.h */,
-				1F027FC611A7BED6006B06DE /* OpenUrlAction.m */,
-				1F027FC711A7BED6006B06DE /* ResultAction.h */,
-				1F027FC811A7BED6006B06DE /* ResultAction.m */,
-				1F027FC911A7BED6006B06DE /* ShowMapAction.h */,
-				1F027FCA11A7BED6006B06DE /* ShowMapAction.m */,
-				1F027FCB11A7BED6006B06DE /* SMSAction.h */,
-				1F027FCC11A7BED6006B06DE /* SMSAction.m */,
-			);
-			name = Actions;
-			sourceTree = "";
-		};
-		E5345D2811999F53000CB77F /* Resources */ = {
-			isa = PBXGroup;
-			children = (
-			);
-			name = Resources;
-			sourceTree = "";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
-		D2AAC07A0554694100DB518D /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				AA747D9F0F9514B9006C5449 /* ZXingWidget_Prefix.pch in Headers */,
-				E534594411987396000CB77F /* BarcodeFormat.h in Headers */,
-				E534594611987396000CB77F /* Binarizer.h in Headers */,
-				E534594811987396000CB77F /* BinaryBitmap.h in Headers */,
-				E534594A11987396000CB77F /* Array.h in Headers */,
-				E534594C11987396000CB77F /* BitArray.h in Headers */,
-				E534594E11987396000CB77F /* BitMatrix.h in Headers */,
-				E534595011987396000CB77F /* BitSource.h in Headers */,
-				E534595211987396000CB77F /* Counted.h in Headers */,
-				E534595411987396000CB77F /* DecoderResult.h in Headers */,
-				E534595611987396000CB77F /* DetectorResult.h in Headers */,
-				E534595811987396000CB77F /* EdgeDetector.h in Headers */,
-				E534595A11987396000CB77F /* GlobalHistogramBinarizer.h in Headers */,
-				E534595C11987396000CB77F /* GridSampler.h in Headers */,
-				E534595E11987396000CB77F /* IllegalArgumentException.h in Headers */,
-				E534596211987396000CB77F /* PerspectiveTransform.h in Headers */,
-				E534596311987396000CB77F /* Point.h in Headers */,
-				E534596511987396000CB77F /* GF256.h in Headers */,
-				E534596711987396000CB77F /* GF256Poly.h in Headers */,
-				E534596911987396000CB77F /* ReedSolomonDecoder.h in Headers */,
-				E534596B11987396000CB77F /* ReedSolomonException.h in Headers */,
-				E534596D11987396000CB77F /* Str.h in Headers */,
-				E534596F11987396000CB77F /* DataMatrixReader.h in Headers */,
-				E534597111987396000CB77F /* BitMatrixParser.h in Headers */,
-				E534597311987396000CB77F /* DataBlock.h in Headers */,
-				E534597511987396000CB77F /* DecodedBitStreamParser.h in Headers */,
-				E534597711987396000CB77F /* Decoder.h in Headers */,
-				E534597911987396000CB77F /* CornerPoint.h in Headers */,
-				E534597B11987396000CB77F /* Detector.h in Headers */,
-				E534597D11987396000CB77F /* MonochromeRectangleDetector.h in Headers */,
-				E534597F11987396000CB77F /* Version.h in Headers */,
-				E534598111987396000CB77F /* Exception.h in Headers */,
-				E534598311987396000CB77F /* LuminanceSource.h in Headers */,
-				E534598511987396000CB77F /* MultiFormatReader.h in Headers */,
-				E534598711987396000CB77F /* Code128Reader.h in Headers */,
-				E534598911987396000CB77F /* Code39Reader.h in Headers */,
-				E534598B11987396000CB77F /* EAN13Reader.h in Headers */,
-				E534598D11987396000CB77F /* EAN8Reader.h in Headers */,
-				E534598F11987396000CB77F /* ITFReader.h in Headers */,
-				E534599111987396000CB77F /* MultiFormatOneDReader.h in Headers */,
-				E534599311987396000CB77F /* MultiFormatUPCEANReader.h in Headers */,
-				E534599511987396000CB77F /* OneDReader.h in Headers */,
-				E534599711987396000CB77F /* OneDResultPoint.h in Headers */,
-				E534599911987396000CB77F /* UPCAReader.h in Headers */,
-				E534599B11987396000CB77F /* UPCEANReader.h in Headers */,
-				E534599D11987396000CB77F /* UPCEReader.h in Headers */,
-				E534599F11987396000CB77F /* BitMatrixParser.h in Headers */,
-				E53459A111987396000CB77F /* DataBlock.h in Headers */,
-				E53459A311987396000CB77F /* DataMask.h in Headers */,
-				E53459A511987396000CB77F /* DecodedBitStreamParser.h in Headers */,
-				E53459A711987396000CB77F /* Decoder.h in Headers */,
-				E53459A911987396000CB77F /* Mode.h in Headers */,
-				E53459AB11987396000CB77F /* AlignmentPattern.h in Headers */,
-				E53459AD11987396000CB77F /* AlignmentPatternFinder.h in Headers */,
-				E53459AF11987396000CB77F /* Detector.h in Headers */,
-				E53459B111987396000CB77F /* FinderPattern.h in Headers */,
-				E53459B311987396000CB77F /* FinderPatternFinder.h in Headers */,
-				E53459B511987396000CB77F /* FinderPatternInfo.h in Headers */,
-				E53459B711987396000CB77F /* QREdgeDetector.h in Headers */,
-				E53459B911987396000CB77F /* ErrorCorrectionLevel.h in Headers */,
-				E53459BB11987396000CB77F /* FormatInformation.h in Headers */,
-				E53459BD11987396000CB77F /* QRCodeReader.h in Headers */,
-				E53459BF11987396000CB77F /* Version.h in Headers */,
-				E53459C111987396000CB77F /* Reader.h in Headers */,
-				E53459C311987396000CB77F /* ReaderException.h in Headers */,
-				E53459C511987396000CB77F /* Result.h in Headers */,
-				E53459C711987396000CB77F /* ResultPoint.h in Headers */,
-				1F027FAB11A7BEAF006B06DE /* Decoder.h in Headers */,
-				1F027FAD11A7BEAF006B06DE /* DecoderDelegate.h in Headers */,
-				1F027FAE11A7BEAF006B06DE /* FormatReader.h in Headers */,
-				1F027FB311A7BEAF006B06DE /* NSString+HTML.h in Headers */,
-				1F027FB511A7BEAF006B06DE /* OverlayView.h in Headers */,
-				1F027FBB11A7BEBF006B06DE /* TwoDDecoderResult.h in Headers */,
-				1F027FBD11A7BEBF006B06DE /* ZXingWidgetController.h in Headers */,
-				1F027FCD11A7BED6006B06DE /* AddContactAction.h in Headers */,
-				1F027FCF11A7BED6006B06DE /* CallAction.h in Headers */,
-				1F027FD111A7BED6006B06DE /* EmailAction.h in Headers */,
-				1F027FD311A7BED6006B06DE /* OpenUrlAction.h in Headers */,
-				1F027FD511A7BED6006B06DE /* ResultAction.h in Headers */,
-				1F027FD711A7BED6006B06DE /* ShowMapAction.h in Headers */,
-				1F027FD911A7BED6006B06DE /* SMSAction.h in Headers */,
-				1F027FEB11A7BEEB006B06DE /* BusinessCardParsedResult.h in Headers */,
-				1F027FED11A7BEEB006B06DE /* EmailParsedResult.h in Headers */,
-				1F027FEF11A7BEEB006B06DE /* GeoParsedResult.h in Headers */,
-				1F027FF111A7BEEB006B06DE /* ParsedResult.h in Headers */,
-				1F027FF311A7BEEB006B06DE /* SMSParsedResult.h in Headers */,
-				1F027FF511A7BEEB006B06DE /* TelParsedResult.h in Headers */,
-				1F027FF711A7BEEB006B06DE /* TextParsedResult.h in Headers */,
-				1F027FF911A7BEEB006B06DE /* URIParsedResult.h in Headers */,
-				1F02801511A7BF06006B06DE /* BookmarkDoCoMoResultParser.h in Headers */,
-				1F02801711A7BF06006B06DE /* DoCoMoResultParser.h in Headers */,
-				1F02801911A7BF06006B06DE /* EmailDoCoMoResultParser.h in Headers */,
-				1F02801B11A7BF06006B06DE /* GeoResultParser.h in Headers */,
-				1F02801D11A7BF06006B06DE /* MeCardParser.h in Headers */,
-				1F02801F11A7BF06006B06DE /* PlainEmailResultParser.h in Headers */,
-				1F02802111A7BF06006B06DE /* ResultParser.h in Headers */,
-				1F02802311A7BF06006B06DE /* SMSResultParser.h in Headers */,
-				1F02802511A7BF06006B06DE /* SMSTOResultParser.h in Headers */,
-				1F02802711A7BF06006B06DE /* TelResultParser.h in Headers */,
-				1F02802911A7BF06006B06DE /* TextResultParser.h in Headers */,
-				1F02802B11A7BF06006B06DE /* URLResultParser.h in Headers */,
-				1F02802D11A7BF06006B06DE /* URLTOResultParser.h in Headers */,
-				1F3DB0C211C60DB4009C581B /* QRCodeReader.h in Headers */,
-				1F3DB0FB11C61080009C581B /* DataMatrixReader.h in Headers */,
-				1F3DB0FD11C61080009C581B /* MultiFormatOneDReader.h in Headers */,
-				1F3DB0FF11C61080009C581B /* MultiFormatUPCEANReader.h in Headers */,
-				3B81AAC6120F07E40022E5D4 /* DecodeHints.h in Headers */,
-				3B81AACA120F080D0022E5D4 /* GreyscaleLuminanceSource.h in Headers */,
-				3B81AACE120F08170022E5D4 /* HybridBinarizer.h in Headers */,
-				3B81AAF9120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h in Headers */,
-				3B72D97012130EF6007CEF32 /* ResultPointCallback.h in Headers */,
-				1FB4319F12901C76002D63E8 /* UniversalResultParser.h in Headers */,
-				1DFA090C13CE1A3900599044 /* CBarcodeFormat.h in Headers */,
-				1DFA092413CE251600599044 /* ProductParsedResult.h in Headers */,
-				1DFA092A13CE252300599044 /* ProductResultParser.h in Headers */,
-				1DFA09A013CE5C0300599044 /* AddressBookAUResultParser.h in Headers */,
-				1D0CBDF913D0DD5D003D0F8D /* BizcardResultParser.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXHeadersBuildPhase section */
-
-/* Begin PBXNativeTarget section */
-		D2AAC07D0554694100DB518D /* ZXingWidget */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ZXingWidget" */;
-			buildPhases = (
-				D2AAC07A0554694100DB518D /* Headers */,
-				D2AAC07B0554694100DB518D /* Sources */,
-				D2AAC07C0554694100DB518D /* Frameworks */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = ZXingWidget;
-			productName = ZXingWidget;
-			productReference = D2AAC07E0554694100DB518D /* libZXingWidget.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		0867D690FE84028FC02AAC07 /* Project object */ = {
-			isa = PBXProject;
-			attributes = {
-				LastUpgradeCheck = 0610;
-			};
-			buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ZXingWidget" */;
-			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
-			hasScannedForEncodings = 1;
-			knownRegions = (
-				English,
-				Japanese,
-				French,
-				German,
-			);
-			mainGroup = 0867D691FE84028FC02AAC07 /* ZXingWidget */;
-			productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				D2AAC07D0554694100DB518D /* ZXingWidget */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXSourcesBuildPhase section */
-		D2AAC07B0554694100DB518D /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				E534594311987396000CB77F /* BarcodeFormat.cpp in Sources */,
-				E534594511987396000CB77F /* Binarizer.cpp in Sources */,
-				E534594711987396000CB77F /* BinaryBitmap.cpp in Sources */,
-				E534594911987396000CB77F /* Array.cpp in Sources */,
-				E534594B11987396000CB77F /* BitArray.cpp in Sources */,
-				E534594D11987396000CB77F /* BitMatrix.cpp in Sources */,
-				E534594F11987396000CB77F /* BitSource.cpp in Sources */,
-				E534595111987396000CB77F /* Counted.cpp in Sources */,
-				E534595311987396000CB77F /* DecoderResult.cpp in Sources */,
-				E534595511987396000CB77F /* DetectorResult.cpp in Sources */,
-				E534595711987396000CB77F /* EdgeDetector.cpp in Sources */,
-				E534595911987396000CB77F /* GlobalHistogramBinarizer.cpp in Sources */,
-				E534595B11987396000CB77F /* GridSampler.cpp in Sources */,
-				E534595D11987396000CB77F /* IllegalArgumentException.cpp in Sources */,
-				E534596111987396000CB77F /* PerspectiveTransform.cpp in Sources */,
-				E534596411987396000CB77F /* GF256.cpp in Sources */,
-				E534596611987396000CB77F /* GF256Poly.cpp in Sources */,
-				E534596811987396000CB77F /* ReedSolomonDecoder.cpp in Sources */,
-				E534596A11987396000CB77F /* ReedSolomonException.cpp in Sources */,
-				E534596C11987396000CB77F /* Str.cpp in Sources */,
-				E534596E11987396000CB77F /* DataMatrixReader.cpp in Sources */,
-				E534597011987396000CB77F /* BitMatrixParser.cpp in Sources */,
-				E534597211987396000CB77F /* DataBlock.cpp in Sources */,
-				E534597411987396000CB77F /* DecodedBitStreamParser.cpp in Sources */,
-				E534597611987396000CB77F /* Decoder.cpp in Sources */,
-				E534597811987396000CB77F /* CornerPoint.cpp in Sources */,
-				E534597A11987396000CB77F /* Detector.cpp in Sources */,
-				E534597C11987396000CB77F /* MonochromeRectangleDetector.cpp in Sources */,
-				E534597E11987396000CB77F /* Version.cpp in Sources */,
-				E534598011987396000CB77F /* Exception.cpp in Sources */,
-				E534598211987396000CB77F /* LuminanceSource.cpp in Sources */,
-				E534598411987396000CB77F /* MultiFormatReader.cpp in Sources */,
-				E534598611987396000CB77F /* Code128Reader.cpp in Sources */,
-				E534598811987396000CB77F /* Code39Reader.cpp in Sources */,
-				E534598A11987396000CB77F /* EAN13Reader.cpp in Sources */,
-				E534598C11987396000CB77F /* EAN8Reader.cpp in Sources */,
-				E534598E11987396000CB77F /* ITFReader.cpp in Sources */,
-				E534599011987396000CB77F /* MultiFormatOneDReader.cpp in Sources */,
-				E534599211987396000CB77F /* MultiFormatUPCEANReader.cpp in Sources */,
-				E534599411987396000CB77F /* OneDReader.cpp in Sources */,
-				E534599611987396000CB77F /* OneDResultPoint.cpp in Sources */,
-				E534599811987396000CB77F /* UPCAReader.cpp in Sources */,
-				E534599A11987396000CB77F /* UPCEANReader.cpp in Sources */,
-				E534599C11987396000CB77F /* UPCEReader.cpp in Sources */,
-				E534599E11987396000CB77F /* BitMatrixParser.cpp in Sources */,
-				E53459A011987396000CB77F /* DataBlock.cpp in Sources */,
-				E53459A211987396000CB77F /* DataMask.cpp in Sources */,
-				E53459A411987396000CB77F /* DecodedBitStreamParser.cpp in Sources */,
-				E53459A611987396000CB77F /* Decoder.cpp in Sources */,
-				E53459A811987396000CB77F /* Mode.cpp in Sources */,
-				E53459AA11987396000CB77F /* AlignmentPattern.cpp in Sources */,
-				E53459AC11987396000CB77F /* AlignmentPatternFinder.cpp in Sources */,
-				E53459AE11987396000CB77F /* Detector.cpp in Sources */,
-				E53459B011987396000CB77F /* FinderPattern.cpp in Sources */,
-				E53459B211987396000CB77F /* FinderPatternFinder.cpp in Sources */,
-				E53459B411987396000CB77F /* FinderPatternInfo.cpp in Sources */,
-				E53459B611987396000CB77F /* QREdgeDetector.cpp in Sources */,
-				E53459B811987396000CB77F /* ErrorCorrectionLevel.cpp in Sources */,
-				E53459BA11987396000CB77F /* FormatInformation.cpp in Sources */,
-				E53459BC11987396000CB77F /* QRCodeReader.cpp in Sources */,
-				E53459BE11987396000CB77F /* Version.cpp in Sources */,
-				E53459C011987396000CB77F /* Reader.cpp in Sources */,
-				E53459C211987396000CB77F /* ReaderException.cpp in Sources */,
-				E53459C411987396000CB77F /* Result.cpp in Sources */,
-				E53459C611987396000CB77F /* ResultPoint.cpp in Sources */,
-				1F027FAC11A7BEAF006B06DE /* Decoder.mm in Sources */,
-				1F027FAF11A7BEAF006B06DE /* FormatReader.mm in Sources */,
-				1F027FB211A7BEAF006B06DE /* MultiFormatReader.mm in Sources */,
-				1F027FB411A7BEAF006B06DE /* NSString+HTML.m in Sources */,
-				1F027FB611A7BEAF006B06DE /* OverlayView.m in Sources */,
-				1F027FBC11A7BEBF006B06DE /* TwoDDecoderResult.m in Sources */,
-				1F027FBE11A7BEBF006B06DE /* ZXingWidgetController.m in Sources */,
-				1F027FCE11A7BED6006B06DE /* AddContactAction.m in Sources */,
-				1F027FD011A7BED6006B06DE /* CallAction.m in Sources */,
-				1F027FD211A7BED6006B06DE /* EmailAction.m in Sources */,
-				1F027FD411A7BED6006B06DE /* OpenUrlAction.m in Sources */,
-				1F027FD611A7BED6006B06DE /* ResultAction.m in Sources */,
-				1F027FD811A7BED6006B06DE /* ShowMapAction.m in Sources */,
-				1F027FDA11A7BED6006B06DE /* SMSAction.m in Sources */,
-				1F027FEC11A7BEEB006B06DE /* BusinessCardParsedResult.m in Sources */,
-				1F027FEE11A7BEEB006B06DE /* EmailParsedResult.m in Sources */,
-				1F027FF011A7BEEB006B06DE /* GeoParsedResult.m in Sources */,
-				1F027FF211A7BEEB006B06DE /* ParsedResult.m in Sources */,
-				1F027FF411A7BEEB006B06DE /* SMSParsedResult.m in Sources */,
-				1F027FF611A7BEEB006B06DE /* TelParsedResult.m in Sources */,
-				1F027FF811A7BEEB006B06DE /* TextParsedResult.m in Sources */,
-				1F027FFA11A7BEEB006B06DE /* URIParsedResult.m in Sources */,
-				1F02801611A7BF06006B06DE /* BookmarkDoCoMoResultParser.m in Sources */,
-				1F02801811A7BF06006B06DE /* DoCoMoResultParser.m in Sources */,
-				1F02801A11A7BF06006B06DE /* EmailDoCoMoResultParser.m in Sources */,
-				1F02801C11A7BF06006B06DE /* GeoResultParser.m in Sources */,
-				1F02801E11A7BF06006B06DE /* MeCardParser.m in Sources */,
-				1F02802011A7BF06006B06DE /* PlainEmailResultParser.m in Sources */,
-				1F02802211A7BF06006B06DE /* ResultParser.m in Sources */,
-				1F02802411A7BF06006B06DE /* SMSResultParser.m in Sources */,
-				1F02802611A7BF06006B06DE /* SMSTOResultParser.m in Sources */,
-				1F02802811A7BF06006B06DE /* TelResultParser.m in Sources */,
-				1F02802A11A7BF06006B06DE /* TextResultParser.m in Sources */,
-				1F02802C11A7BF06006B06DE /* URLResultParser.m in Sources */,
-				1F02802E11A7BF06006B06DE /* URLTOResultParser.m in Sources */,
-				1F3DB0C311C60DB4009C581B /* QRCodeReader.mm in Sources */,
-				1F3DB0FC11C61080009C581B /* DataMatrixReader.mm in Sources */,
-				1F3DB0FE11C61080009C581B /* MultiFormatOneDReader.mm in Sources */,
-				1F3DB10011C61080009C581B /* MultiFormatUPCEANReader.mm in Sources */,
-				3B81AAC5120F07E40022E5D4 /* DecodeHints.cpp in Sources */,
-				3B81AAC9120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp in Sources */,
-				3B81AACD120F08170022E5D4 /* HybridBinarizer.cpp in Sources */,
-				3B81AAF8120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp in Sources */,
-				3B72D96F12130EF6007CEF32 /* ResultPointCallback.cpp in Sources */,
-				1FB431A012901C76002D63E8 /* UniversalResultParser.m in Sources */,
-				1DFA090D13CE1A3900599044 /* CBarcodeFormat.mm in Sources */,
-				1DFA092513CE251600599044 /* ProductParsedResult.m in Sources */,
-				1DFA092B13CE252300599044 /* ProductResultParser.mm in Sources */,
-				1DFA09A113CE5C0300599044 /* AddressBookAUResultParser.m in Sources */,
-				1D0CBDFA13D0DD5D003D0F8D /* BizcardResultParser.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin XCBuildConfiguration section */
-		1DEB921F08733DC00010E9CD /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = YES;
-				COPY_PHASE_STRIP = NO;
-				DEAD_CODE_STRIPPING = YES;
-				EXPORTED_SYMBOLS_FILE = exportList;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = ZXingWidget_Prefix.pch;
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				GCC_THUMB_SUPPORT = NO;
-				GCC_VERSION = "";
-				HEADER_SEARCH_PATHS = ../../cpp/core/src;
-				INSTALL_PATH = /usr/local/lib;
-				LD_GENERATE_MAP_FILE = YES;
-				LD_OPENMP_FLAGS = "-fopenmp";
-				MACH_O_TYPE = staticlib;
-				OTHER_LDFLAGS = (
-					"-ObjC",
-					"-M",
-				);
-				PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO;
-				PRODUCT_NAME = ZXingWidget;
-				SDKROOT = iphoneos;
-				SEPARATE_STRIP = NO;
-				SKIP_INSTALL = YES;
-				WARNING_CFLAGS = (
-					"-Wall",
-					"-Wextra",
-				);
-			};
-			name = Debug;
-		};
-		1DEB922008733DC00010E9CD /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = ZXingWidget_Prefix.pch;
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				GCC_THUMB_SUPPORT = NO;
-				GCC_VERSION = "";
-				HEADER_SEARCH_PATHS = ../../cpp/core/src;
-				INSTALL_PATH = /usr/local/lib;
-				PRODUCT_NAME = ZXingWidget;
-				SDKROOT = iphoneos;
-				SKIP_INSTALL = YES;
-				WARNING_CFLAGS = (
-					"-Wall",
-					"-Wextra",
-				);
-			};
-			name = Release;
-		};
-		1DEB922308733DC00010E9CD /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_THUMB_SUPPORT = NO;
-				GCC_VERSION = "";
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				HEADER_SEARCH_PATHS = ../../cpp/core/src;
-				"HEADER_SEARCH_PATHS[arch=*]" = "";
-				IPHONEOS_DEPLOYMENT_TARGET = 4.0;
-				ONLY_ACTIVE_ARCH = YES;
-				OTHER_LDFLAGS = "-ObjC";
-				PREBINDING = NO;
-				SDKROOT = iphoneos;
-				WARNING_CFLAGS = (
-					"-Wall",
-					"-Wextra",
-					"-Werror",
-					"-Wno-unused-private-field",
-					"-Wno-unused-parameter",
-				);
-			};
-			name = Debug;
-		};
-		1DEB922408733DC00010E9CD /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				GCC_C_LANGUAGE_STANDARD = c99;
-				GCC_THUMB_SUPPORT = NO;
-				GCC_VERSION = "";
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				HEADER_SEARCH_PATHS = ../../cpp/core/src;
-				IPHONEOS_DEPLOYMENT_TARGET = 4.0;
-				OTHER_LDFLAGS = "-ObjC";
-				PREBINDING = NO;
-				SDKROOT = iphoneos;
-				WARNING_CFLAGS = (
-					"-Wall",
-					"-Wextra",
-					"-Werror",
-					"-Wno-unused-private-field",
-					"-Wno-unused-parameter",
-				);
-			};
-			name = Release;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ZXingWidget" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1DEB921F08733DC00010E9CD /* Debug */,
-				1DEB922008733DC00010E9CD /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ZXingWidget" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1DEB922308733DC00010E9CD /* Debug */,
-				1DEB922408733DC00010E9CD /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
-}