// SPDX-License-Identifier: BSD-3-Clause // SPDX-FileCopyrightText: 2020-2023 The Monero Project #include "QrScanThread.h" #include #include QrScanThread::QrScanThread(QObject *parent) : QThread(parent) , m_running(true) { } void QrScanThread::processQImage(const QImage &qimg) { const auto hints = ZXing::DecodeHints() .setFormats(ZXing::BarcodeFormat::QRCode) .setTryHarder(true) .setMaxNumberOfSymbols(1); const auto result = QrCodeUtils::ReadBarcode(qimg, hints); if (result.isValid()) { emit decoded(result.text()); } } void QrScanThread::stop() { m_running = false; m_waitCondition.wakeOne(); } void QrScanThread::start() { m_queue.clear(); m_running = true; m_waitCondition.wakeOne(); QThread::start(); } void QrScanThread::addImage(const QImage &img) { QMutexLocker locker(&m_mutex); if (m_queue.length() > 100) { return; } m_queue.append(img); m_waitCondition.wakeOne(); } void QrScanThread::run() { while (m_running) { QMutexLocker locker(&m_mutex); while (m_queue.isEmpty() && m_running) { m_waitCondition.wait(&m_mutex); } if (!m_queue.isEmpty()) { processQImage(m_queue.takeFirst()); } } }