QRCodeScanViewController.m revision 960ee46ac6eaff8d3a1638319e95a4f1047ff5f3
//
// FreeOTP
//
// Authors: Nathaniel McCallum <npmccallum@redhat.com>
//
// Copyright (C) 2013 Nathaniel McCallum, Red Hat
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#import "QRCodeScanViewController.h"
#include "TokenStore.h"
@interface QRCodeScanViewController ()
@end
@implementation QRCodeScanViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.session = [[AVCaptureSession alloc] init];
AVCaptureDevice* device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError* error = nil;
AVCaptureDeviceInput* input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (input == nil) {
[self.navigationController popViewControllerAnimated:TRUE];
return;
}
[self.session addInput:input];
AVCaptureVideoPreviewLayer* preview = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session];
preview.frame = self.view.layer.bounds;
[self.view.layer addSublayer:preview];
[self.session startRunning];
}
- (void)viewDidAppear:(BOOL)animated
{
/* NOTE: We start output processing in viewDidAppear() to avoid a
* race condition when the QR code is scanned before the view appears. */
AVCaptureMetadataOutput* output = [[AVCaptureMetadataOutput alloc] init];
[self.session addOutput:output];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
}
- (void)captureOutput:(AVCaptureOutput*)captureOutput didOutputMetadataObjects:(NSArray*)metadataObjects fromConnection:(AVCaptureConnection*) connection
{
for (AVMetadataObject *metadata in metadataObjects) {
if ([metadata.type isEqualToString:AVMetadataObjectTypeQRCode]) {
NSString* qrcode = [(AVMetadataMachineReadableCodeObject *)metadata stringValue];
if (qrcode == nil)
continue;
Token* token = [[Token alloc] initWithString:qrcode];
if (token != nil)
[[[TokenStore alloc] init] add:token];
[self.session stopRunning];
if (self.popover == nil)
[self.navigationController popViewControllerAnimated:YES];
else
[self.popover dismissPopoverAnimated:YES];
return;
}
}
}
@end