/* * * Panbox - encryption for cloud storage * Copyright (C) 2014-2015 by Fraunhofer SIT and Sirrix AG * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Additonally, third party code may be provided with notices and open source * licenses from communities and third parties that govern the use of those * portions, and any licenses granted hereunder do not alter any rights and * obligations you may have under such open source licenses, however, the * disclaimer of warranty and limitation of liability provisions of the GPLv3 * will apply to all the product. * */ package org.panbox.desktop.common.pairing.cam; import java.util.ArrayList; import java.util.List; import org.bytedeco.javacpp.opencv_core.IplImage; import com.google.zxing.BinaryBitmap; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; import com.google.zxing.Result; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.HybridBinarizer; public class QRCodeProcessor extends AbstractProcessor { private List<QRCodeListener> listeners = new ArrayList<QRCodeListener>(); private long lastFoundTime = 0; private final static long CLEAR_RESULT_TIMEOUT = 5000; private String lastResult = ""; public QRCodeProcessor() { } public void addSquareCodeListener(QRCodeListener sql) { listeners.add(sql); } public void removeSquareCodeListener(QRCodeListener sql) { listeners.remove(sql); } private void fire(String text) { List<QRCodeListener> tmp = new ArrayList<QRCodeListener>(listeners); for (QRCodeListener sql : tmp) { sql.qrCodeDetected(text); } } @Override public IplImage processImage(IplImage in) { LuminanceSource source = new BufferedImageLuminanceSource( in.getBufferedImage()); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Result result; try { result = new MultiFormatReader().decode(bitmap); lastResult = result.getText(); lastFoundTime = System.currentTimeMillis(); fire(result.getText()); } catch (NotFoundException e) { // that's ok if (!lastResult.equals("")) // if result was not empty, clear old // result { long mt1 = System.currentTimeMillis(); if (mt1 - lastFoundTime > CLEAR_RESULT_TIMEOUT) { lastFoundTime = mt1; fire(""); lastResult = ""; } } } return in; } }