From 74e34fa35a59098db7c4358b788ad3ac0a5745f7 Mon Sep 17 00:00:00 2001
From: Volker Krause <vkrause@kde.org>
Date: Fri, 8 Jul 2022 16:18:47 +0200
Subject: [PATCH] Support ZXing 1.4.0

The previous code doesn't build (and when made to build, crashes) with
ZXing 1.4.0.
---
 src/scanner/CMakeLists.txt             |  2 ++
 src/scanner/config-prison-scanner.h.in | 14 ++++++++++++++
 src/scanner/videoscannerworker.cpp     | 17 +++++++++++++++++
 3 files changed, 33 insertions(+)
 create mode 100644 src/scanner/config-prison-scanner.h.in

diff --git a/src/scanner/CMakeLists.txt b/src/scanner/CMakeLists.txt
index d5b9cf5..ef690c5 100644
--- a/src/scanner/CMakeLists.txt
+++ b/src/scanner/CMakeLists.txt
@@ -1,6 +1,8 @@
 # SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
 # SPDX-License-Identifier: BSD-3-Clause
 
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config-prison-scanner.h.in ${CMAKE_CURRENT_BINARY_DIR}/config-prison-scanner.h)
+
 add_library(KF5PrisonScanner)
 add_library(KF5::PrisonScanner ALIAS KF5PrisonScanner)
 
diff --git a/src/scanner/config-prison-scanner.h.in b/src/scanner/config-prison-scanner.h.in
new file mode 100644
index 0000000..d80ceaf
--- /dev/null
+++ b/src/scanner/config-prison-scanner.h.in
@@ -0,0 +1,14 @@
+/*
+   SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+   SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CONFIG_PRISON_SCANNER_H
+#define CONFIG_PRISON_SCANNER_H
+
+#define ZXING_VERSION_MAJOR @ZXing_VERSION_MAJOR@
+#define ZXING_VERSION_MINOR @ZXing_VERSION_MINOR@
+#define ZXING_VERSION_PATCH @ZXing_VERSION_PATCH@
+#define ZXING_VERSION ((@ZXing_VERSION_MAJOR@<<16)|(@ZXing_VERSION_MINOR@<<8)|(@ZXing_VERSION_PATCH@))
+
+#endif // CONFIG_PRISON_SCANNER_H
diff --git a/src/scanner/videoscannerworker.cpp b/src/scanner/videoscannerworker.cpp
index 45792dc..947367c 100644
--- a/src/scanner/videoscannerworker.cpp
+++ b/src/scanner/videoscannerworker.cpp
@@ -3,6 +3,7 @@
     SPDX-License-Identifier: MIT
 */
 
+#include "config-prison-scanner.h"
 #include "format_p.h"
 #include "scanresult_p.h"
 #include "videoscannerframe_p.h"
@@ -12,6 +13,7 @@
 #include <QImage>
 #include <QTransform>
 
+#define ZX_USE_UTF8 1
 #include <ZXing/ReadBarcode.h>
 #include <ZXing/TextUtfEncoding.h>
 
@@ -25,7 +27,11 @@ VideoScannerWorker::VideoScannerWorker(QObject *parent)
 
 void VideoScannerWorker::slotScanFrame(VideoScannerFrame frame)
 {
+#if ZXING_VERSION < QT_VERSION_CHECK(1, 4, 0)
     ZXing::Result zxRes(ZXing::DecodeStatus::FormatError);
+#else
+    ZXing::Result zxRes;
+#endif
     ZXing::DecodeHints hints;
     hints.setFormats(frame.formats() == Format::NoFormat ? ZXing::BarcodeFormats::all() : Format::toZXing(frame.formats()));
 
@@ -173,6 +179,7 @@ void VideoScannerWorker::slotScanFrame(VideoScannerFrame frame)
     if (zxRes.isValid()) {
         auto res = ScanResultPrivate::get(scanResult);
 
+#if ZXING_VERSION < QT_VERSION_CHECK(1, 4, 0)
         // distinguish between binary and text content
         const auto hasWideChars = std::any_of(zxRes.text().begin(), zxRes.text().end(), [](auto c) {
             return c > 255;
@@ -188,6 +195,16 @@ void VideoScannerWorker::slotScanFrame(VideoScannerFrame frame)
             std::copy(zxRes.text().begin(), zxRes.text().end(), b.begin());
             res->content = b;
         }
+#else
+        if (zxRes.contentType() == ZXing::ContentType::Text) {
+            res->content = QString::fromStdString(zxRes.text());
+        } else {
+            QByteArray b;
+            b.resize(zxRes.bytes().size());
+            std::copy(zxRes.bytes().begin(), zxRes.bytes().end(), b.begin());
+            res->content = b;
+        }
+#endif
 
         // determine the bounding rect
         // the cooridinates we get from ZXing are a polygon, we need to determine the
-- 
GitLab

