gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [gnunet] branch master updated (65c86ea8d -> f256a930e)


From: gnunet
Subject: [GNUnet-SVN] [gnunet] branch master updated (65c86ea8d -> f256a930e)
Date: Wed, 03 Apr 2019 13:53:41 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a change to branch master
in repository gnunet.

    from 65c86ea8d man README
     new c7ec9cc03 gnunet-qr: Reimplement in C - yet only a proof of concept.
     new 2a302e571 gnunet-qr: Simplify verbose messaging.
     new 6f4f14aa5 Add helper lib "gnunet-qr-utils.h".
     new e72904083 gnunet-qr: Actually run gnunet-uri.
     new 7dd9b3864 Add Hartmut Goebel to the AUTHORS file.
     new e35cd05d9 configure.ac: Add check for libzbar (using pkgconfig).
     new 4cecaf9d9 gnunet-qr: Add into Makefile.am and pofiles,
     new 8f07aace2 gnunet-qr: Use the `gnunet-uri` binary installed into PREFIX.
     new 88c55363e gnunet-qr: Update documentation and scripts to changed 
dependencies.
     new ac123283d gnunet-qr: Use GNUNET_PROGRAM_run to simplify the code.
     new 6dd5119b1 contrib/guix: Add package zbar (for gnunet-qr).
     new e04ce03cf contrib/guix: Add zbar as dependency for package gnunet.
     new 9915d8f8a gnunet-qr: Implement functionality of gnunet-uri, don't 
spawn.
     new 311795caa add error handling for gnunet-qr
     new d5cfe4c29 gnunet-qr: Reimplement in C - yet only a proof of concept.
     new eaf7440ec gnunet-qr: Simplify verbose messaging.
     new a5de52ae3 Add helper lib "gnunet-qr-utils.h".
     new e8e2d599b gnunet-qr: Actually run gnunet-uri.
     new a89292d9b Add Hartmut Goebel to the AUTHORS file.
     new db1ae389d configure.ac: Add check for libzbar (using pkgconfig).
     new d60866a5d gnunet-qr: Add into Makefile.am and pofiles,
     new 70a749982 gnunet-qr: Use the `gnunet-uri` binary installed into PREFIX.
     new ee3ec8e4e gnunet-qr: Update documentation and scripts to changed 
dependencies.
     new e14a51a2b gnunet-qr: Use GNUNET_PROGRAM_run to simplify the code.
     new 7b85927fe contrib/guix: Add package zbar (for gnunet-qr).
     new ca946e556 contrib/guix: Add zbar as dependency for package gnunet.
     new 9f8374622 gnunet-qr: Implement functionality of gnunet-uri, don't 
spawn.
     new 1c53d67c2 merge conflict resolution
     new af57a5b89 fix libzbar detection
     new f256a930e Merge branch 'gnunet-qt-c-2'

The 30 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 AUTHORS                              |   1 +
 README                               |   4 +-
 configure.ac                         |  39 +++++
 contrib/guix/gnu/packages/gnunet.scm | 123 +++++++++++++-
 contrib/vagrant/bootstrap.ubuntu.sh  |   2 +-
 doc/system_specific/FROM_SOURCE      |   4 +-
 po/POTFILES.in                       |   1 +
 src/util/Makefile.am                 |  32 ++--
 src/util/gnunet-qr.c                 | 314 +++++++++++++++++++++++++++++++++++
 src/util/gnunet-qr.in                |  46 -----
 src/util/gnunet-qr.py                | 110 ------------
 11 files changed, 495 insertions(+), 181 deletions(-)
 create mode 100644 src/util/gnunet-qr.c
 delete mode 100755 src/util/gnunet-qr.in
 delete mode 100644 src/util/gnunet-qr.py

diff --git a/AUTHORS b/AUTHORS
index 829a0803e..3c337737f 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -49,6 +49,7 @@ Eric Noack <address@hidden>
 Felix von Leitner [ diet libc snprintf for win32 ]
 Gerd Knorr <address@hidden>
 Glenn McGrath <address@hidden>
+Hartmut Goebel <address@hidden>
 Hendrik Pagenhardt <address@hidden>
 Heikki Lindholm <address@hidden>
 Igor Wronsky <address@hidden>
diff --git a/README b/README
index 0e676b491..1841bb616 100644
--- a/README
+++ b/README
@@ -124,6 +124,7 @@ These are the optional dependencies:
 - libogg             >= 1.3.0       (for experimental conversation tool)
 - libnss                            (certtool binary (for convenient
                                      installation of GNS proxy))
+- libzbar            >= 0.10        (for gnunet-qr)
 - libpbc             >= 0.5.14      (for Attribute-Based Encryption and
                                      Identity Provider functionality)
 - libgabe                           (for Attribute-Based Encryption and
@@ -133,9 +134,6 @@ These are the optional dependencies:
                                      html output of man pages)
 - miniupnpc
 - perl5                             (for some utilities)
-- python2.7          = 2.7          (for gnunet-qr, only python 2.7
-                                     supported)
-- python-zbar        >= 0.10        (for gnunet-qr, not optional)
 - TeX Live           >= 2012        (for gnunet-bcd[*])
 - texi2mdoc                         (for automatic mdoc generation [*2])
 
diff --git a/configure.ac b/configure.ac
index 96d7cbbc0..ac8ed60c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -534,6 +534,39 @@ else
   AC_DEFINE([HAVE_LIBBLUETOOTH],[0],[Lacking bluetooth library])
 fi
 
+# check for zbar library
+zbar=0
+AC_MSG_CHECKING(for libzbar)
+AC_ARG_WITH(zbar,
+   [  --with-zbar=PFX    base of libzbar installation],
+   [AC_MSG_RESULT([$with_zbar])
+    case $with_zbar in
+      no)
+        ;;
+      yes)
+        AC_CHECK_HEADERS(zbar.h,
+          AC_CHECK_LIB([zbar], [zbar_processor_create],
+            zbar=1))
+        ;;
+      *)
+        LDFLAGS="-L$with_zbar/lib $LDFLAGS"
+        CPPFLAGS="-I$with_zbar/include $CPPFLAGS"
+        AC_CHECK_HEADERS(zbar.h,
+          AC_CHECK_LIB([zbar], [zbar_processor_create],
+            EXT_LIB_PATH="-L$with_zbar/lib $EXT_LIB_PATH"
+            zbar=1))
+        ;;
+    esac
+   ],
+   [AC_MSG_RESULT([--with-zbar not specified])
+    AC_CHECK_HEADERS(zbar.h,
+     AC_CHECK_LIB([zbar], [zbar_processor_create],
+      zbar=1))])
+AM_CONDITIONAL(HAVE_ZBAR, [test "$zbar" = 1])
+AS_IF([test "x$zbar" = x1],
+      [AC_DEFINE([HAVE_ZBAR],[1],[Have zbar library])],
+      [AC_DEFINE([HAVE_ZBAR],[0],[Lacking zbar library])])
+
 # check for jansson library
 jansson=0
 AC_MSG_CHECKING(for libjansson)
@@ -563,6 +596,7 @@ AC_ARG_WITH(jansson,
      AC_CHECK_LIB([jansson], [json_loads],
       jansson=1))])
 AM_CONDITIONAL(HAVE_JANSSON, [test "$jansson" = 1])
+AM_CONDITIONAL(HAVE_JSON, [test x$jansson = x1])
 AS_IF([test "x$jansson" = x1],
       [AC_DEFINE([HAVE_JANSSON],[1],[Have jansson library])],
       [AC_DEFINE([HAVE_JANSSON],[0],[Lacking jansson library])])
@@ -1432,6 +1466,7 @@ AM_CONDITIONAL(HAVE_GNUTLS_DANE, test x$gnutls_dane = x1)
 AC_DEFINE_UNQUOTED([HAVE_GNUTLS_DANE], $gnutls_dane, [We have GnuTLS with DANE 
support])
 
 
+
 # Test if we are building for superMUC
 AC_MSG_CHECKING(if GNUnet is being configured to run on the SuperMUC)
 AC_ARG_ENABLE([supermuc],
@@ -1938,6 +1973,10 @@ AS_IF([test x$gnutls != xtrue],
  [AS_IF([test "x$gnutls_dane" != "x1"],
   [AC_MSG_NOTICE([WARNING: GnuTLS has no DANE support, DANE validation will 
not be possible])])])
 
+# warn user if libzbar is not found
+AS_IF([test "$have_zbar" = 0],
+      [AC_MSG_NOTICE([WARNING: zbar not found, gnunet-qr will not be built.])])
+
 # java ports
 AS_IF([test "x$enable_java_ports" = "xyes"],
       [AC_MSG_NOTICE([NOTICE: Opening ports for gnunet-java bindings by 
default.])])
diff --git a/contrib/guix/gnu/packages/gnunet.scm 
b/contrib/guix/gnu/packages/gnunet.scm
index 6089ee2fa..0039eeca4 100644
--- a/contrib/guix/gnu/packages/gnunet.scm
+++ b/contrib/guix/gnu/packages/gnunet.scm
@@ -43,6 +43,7 @@
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages gstreamer)
+  #:use-module (gnu packages imagemagick)
   #:use-module (gnu packages libidn)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages image)
@@ -56,11 +57,14 @@
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages qt)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages video)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xiph)
+  #:use-module (gnu packages xml)
+  #:use-module (gnu packages xorg)
   #:use-module (gnu packages backup)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module ((guix build utils) #:prefix build-utils:)
@@ -191,6 +195,122 @@ authentication and support for SSL3 and TLS.")
    (license license:lgpl2.1+)
    (home-page "https://www.gnu.org/software/libmicrohttpd/";)))
 
+(define-public zbar
+  (package
+   (name "zbar")
+   (version "0.22")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "https://www.linuxtv.org/downloads/zbar/zbar-";
+                                version ".tar.bz2"))
+            (sha256
+             (base32
+              "1dsffj42gbasfq4sfhgirmi3lfgdygfspwzr00wbva0pf96fka8v"))))
+   (build-system gnu-build-system)
+   (outputs '("out" "gtk" "qt"))
+   (native-inputs
+    `(;;("coreutils" ,coreutils)
+      ("dbus" ,dbus)
+      ("glib:bin", glib "bin")
+      ("pkg-config" ,pkg-config)
+      ;; for testing
+      ("perl" ,perl)
+      ("python2" ,python-2.7)
+      ))
+   (inputs
+    `(("gtk+-2" ,gtk+-2)
+      ("imagemagick" ,imagemagick)
+      ("libjpeg" ,libjpeg)
+      ("libxv" ,libxv)
+      ;;("python2-pygtk" ,python2-pygtk)
+      ("qtbase" ,qtbase)
+      ("qt11extras" ,qtx11extras)
+      ("v4l-utils" ,v4l-utils)
+      ("xmlto" ,xmlto)))
+   (arguments
+    `(#:configure-flags
+      (list "--without-python2"
+           "--without-java"
+           (string-append
+            "--with-dbusconfdir=" (assoc-ref %outputs "out") "/etc")
+           "CXXFLAGS=-std=gnu++11" ;; for qt related
+           ;; Add the other outputs lib directories to the RUNPATH.
+           ;; (string-append "LDFLAGS="
+           ;;             "-Wl,-rpath=" (assoc-ref %outputs "gtk") "/lib"
+           ;;             " "
+           ;;             "-Wl,-rpath=" (assoc-ref %outputs "qt") "/lib"
+           ;;             )
+           )
+      #:tests? #f
+      #:validate-runpath? #f
+      #:phases
+      (modify-phases %standard-phases
+        (add-before 'configure 'create-missing-file
+         ;; Create a file missing in the distribution archive,
+         ;; see https://github.com/mchehab/zbar/issues/35
+         (lambda _
+           (with-output-to-file "examples/sha1sum"
+             (lambda _
+               (display "
+a56811d078ea5cfac9be5deb4b6796177763e152  zbarimg codabar.png
+cc53bf34878f769fc3611020c11e572f2853bd2a  zbarimg code-128.png
+7537d593ea42393a43bc0eda0a896c0e31017dd8  zbarimg code-39.png
+f8f55b828eb7d0400f300be021d29293bd4a3191  zbarimg code-93.png
+aebbdbed0b32d7fd72f1245e3fb384822d492062  zbarimg databar.png
+9e245874d3229a575eabfdba1c668369c55960e3  zbarimg databar-exp.png
+53429fc04dfcf674349e2db6cfbaf73e301fc3dc  zbarimg ean-13.png
+4095418b74efbb026dd730543558fefdda46f5b9  zbarimg ean-8.png
+5501245dbba21c153f690787fc97ab50c973b846  zbarimg i2-5.png
+b350ca7efad7a50c5ac082d5c683a8e8d8d380a7  zbarimg qr-code.png
+84c0ce7072e2227073dc8bd1e5f4518d8f42ae3d  zbarimg sqcode1-generated.png
+84c0ce7072e2227073dc8bd1e5f4518d8f42ae3d  zbarimg sqcode1-scanned.png
+5ab2b518e2c9d827cedc5825d2e3c9646d43713a  zbarimg -Sean2.enable ean-2.png
+668fef8cb9caac34df8cb8564c2cde62e4af5e65  zbarimg -Sean5.enable ean-5.png
+b567e550216fe24f7652f683146365a9fe7ee867  zbarimg -Sisbn10.enable ean-13.png
+d0f37aa076d42c270f7231c5490beea5605e2ba0  zbarimg -Sisbn13.enable ean-13.png
+3f041225df3b8364b5fd0daf9cf402e8a4731f9b  zbarimg -Supca.enable code-upc-a.png
+b350ca7efad7a50c5ac082d5c683a8e8d8d380a7  zbarimg -Stest-inverted 
qr-code-inverted.png\n")))))
+        (replace 'check
+         ;; Run test-suite under a dbus session.
+         (lambda _
+           ;; Don't fail on missing  '/etc/machine-id'.
+           (setenv "DBUS_FATAL_WARNINGS" "0")
+           (invoke "dbus-launch" "make" "check")))
+        (add-after 'install 'split
+          (lambda* (#:key inputs outputs #:allow-other-keys)
+            ;; Split the binaries to the various outputs.
+            (let* ((out (assoc-ref outputs "out"))
+                   (gtk (assoc-ref outputs "gtk"))
+                   (qt  (assoc-ref outputs "qt"))
+                  (mv (lambda (dest-out dir pattern)
+                        (mkdir-p (string-append dest-out dir))
+                        (for-each
+                         (lambda (file)
+                           (rename-file
+                            file
+                            (string-append dest-out dir "/" (basename file))))
+                         (find-files (string-append out dir) pattern)))))
+             (mv qt  "/bin" "zbarcam-qt")
+             (mv gtk "/bin" "zbarcam-gtk")
+             (mv qt  "/lib" "libzbarqt\\..*")
+             (mv gtk "/lib" "libzbargtk\\..*")
+             (mv qt  "/lib/pkgconfig" "zbar-qt\\.pc" )
+             (mv gtk "/lib/pkgconfig" "zbar-gtk\\.pc" )
+             (mv qt  "/include/zbar" "QZBar.*\\.h")
+             (mv gtk "/include/zbar" "zbargtk\\.h"))
+           #t)))))
+   (synopsis "Read bar-codes from various sources")
+   (description "ZBar is a software suite for reading bar codes from
+various sources, such as video streams, image files and raw intensity
+sensors. It supports EAN-13/UPC-A, UPC-E, EAN-8, Code 128, Code 39,
+Interleaved 2 of 5 and QR Code. Included with the library are basic
+applications for decoding captured bar code images and using a video
+device (eg, webcam) as a bar code scanner. For application developers,
+language bindings are included for C, C++ and Perl as well as
+GUI widgets for Qt and GTK")
+   (license license:lgpl2.1+)
+   (home-page "http://zbar.sourceforge.net/";)))
+
 (define-public gnurl
   (package
    (name "gnurl")
@@ -301,7 +421,8 @@ newspace."
       ("bluez" ,bluez) ; gnunet-transport
       ("glib" ,glib)
       ("libogg" ,libogg) ; gnunet-conversation
-      ("python-2" ,python-2))) ; tests, gnunet-qr
+      ("zbar" ,zbar) ; gnunet-qr
+      ("python-2" ,python-2))) ; tests
    (native-inputs
     `(("pkg-config" ,pkg-config)
       ("autoconf" ,autoconf)
diff --git a/contrib/vagrant/bootstrap.ubuntu.sh 
b/contrib/vagrant/bootstrap.ubuntu.sh
index 6b28d3075..f0b7c454e 100644
--- a/contrib/vagrant/bootstrap.ubuntu.sh
+++ b/contrib/vagrant/bootstrap.ubuntu.sh
@@ -27,7 +27,7 @@ apt-get -y install zlib1g-dev
 # optional for gnunet-conversation
 # apt-get -y install libpulse-dev libopus-dev libogg-dev gstreamer1.0
 # optional for gnunet-qr
-apt-get -y install python-zbar
+apt-get -y install libzbar-dev
 # optional for experimental code
 apt-get -y install libglpk-dev
 #
diff --git a/doc/system_specific/FROM_SOURCE b/doc/system_specific/FROM_SOURCE
index 72660798d..7b0ebf436 100644
--- a/doc/system_specific/FROM_SOURCE
+++ b/doc/system_specific/FROM_SOURCE
@@ -534,7 +534,7 @@ at all.
 We begin by installing a few Debian packages from stable:@
 
 @example
-# apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
+# apt-get install gcc make libzbar-dev libltdl-dev libsqlite3-dev \
   libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev \
   texlive libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev \
   libbz2-dev libexiv2-dev libflac-dev libgif-dev libglib2.0-dev \
@@ -778,7 +778,7 @@ as a normal user.
 We begin by installing a few Debian packages from stable:
 
 @example
-# apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
+# apt-get install gcc make libzbar-dev libltdl-dev libsqlite3-dev \
 libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev texlive \
 libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev libbz2-dev \
 libflac-dev libgif-dev libglib2.0-dev libgtk-3-dev libmpeg2-4-dev \
diff --git a/po/POTFILES.in b/po/POTFILES.in
index fe788fdae..67c22aaed 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -480,6 +480,7 @@ src/util/gnunet-config.c
 src/util/gnunet-config-diff.c
 src/util/gnunet-ecc.c
 src/util/gnunet-helper-w32-console.c
+src/util/gnunet-qr.c
 src/util/gnunet-resolver.c
 src/util/gnunet-scrypt.c
 src/util/gnunet-service-resolver.c
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index cd14fb4ca..89d0462c5 100644
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -204,26 +204,15 @@ libexec_PROGRAMS = \
  gnunet-timeout \
  $(W32CONSOLEHELPER)
 
-do_subst = $(SED) -e 's,address@hidden@],$(prefix),g'
-
-gnunet-qr: gnunet-qr.in Makefile
-       $(do_subst) < $(srcdir)/gnunet-qr.in > gnunet-qr
-       chmod +x gnunet-qr
-
-CLEANFILES = gnunet-qr
-
-pkgdata_DATA = \
-  gnunet-qr.py
-
-bin_SCRIPTS =\
- gnunet-qr
-
 bin_PROGRAMS = \
  gnunet-resolver \
  gnunet-config \
  $(GNUNET_ECC) \
  $(GNUNET_SCRYPT) \
  gnunet-uri
+if HAVE_ZBAR
+bin_PROGRAMS += gnunet-qr
+endif
 
 noinst_PROGRAMS = \
  gnunet-config-diff \
@@ -283,13 +272,22 @@ gnunet_config_LDADD = \
   libgnunetutil.la \
   $(GN_LIBINTL)
 
-
 gnunet_uri_SOURCES = \
  gnunet-uri.c
 gnunet_uri_LDADD = \
   libgnunetutil.la \
   $(GN_LIBINTL)
 
+
+gnunet_qr_SOURCES = \
+  gnunet-qr.c \
+  gnunet-qr-utils.h
+gnunet_qr_LDADD = \
+  libgnunetutil.la \
+  $(GN_LIBINTL)
+gnunet_qr_LDFLAGS= $(libzbar_LIBS)
+gnunet_qr_CFLAGS = $(libzbar_CFLAGS) -DBINDIR=\"@bindir@/\"
+
 plugin_LTLIBRARIES = \
   libgnunet_plugin_test.la
 
@@ -670,6 +668,4 @@ EXTRA_DIST = \
   test_program_data.conf \
   test_resolver_api_data.conf \
   test_service_data.conf \
-  test_speedup_data.conf \
-  gnunet-qr.in \
-  gnunet-qr.py
+  test_speedup_data.conf
diff --git a/src/util/gnunet-qr.c b/src/util/gnunet-qr.c
new file mode 100644
index 000000000..fa95d6c05
--- /dev/null
+++ b/src/util/gnunet-qr.c
@@ -0,0 +1,314 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2013-2019 GNUnet e.V.
+
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
+
+     GNUnet 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
+     Affero General Public License for more details.
+
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+*/
+/**
+ * @file util/gnunet-qr.c
+ * @author Hartmut Goebel (original implementation)
+ * @author Martin Schanzenbach (integrate gnunet-uri)
+ * @author Christian Grothoff (error handling)
+ */
+#include <stdio.h>
+#include <zbar.h>
+#include <stdbool.h>
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+#define LOG(fmt, ...) if (verbose == true) printf(fmt, ## __VA_ARGS__)
+
+/**
+ * Video device to capture from. Sane default for GNU/Linux systems.
+ */
+static char* device = "/dev/video0";
+
+/**
+ * --verbose option
+ */
+static int verbose = false;
+
+/**
+ * --silent option
+ */
+static int silent = false;
+
+/**
+ * Handler exit code
+ */
+static long unsigned int exit_code = 1;
+
+/**
+ * Helper process we started.
+ */
+static struct GNUNET_OS_Process *p;
+
+
+/**
+ * Pipe used to communicate child death via signal.
+ */
+static struct GNUNET_DISK_PipeHandle *sigpipe;
+
+
+/**
+ * Task triggered whenever we receive a SIGCHLD (child
+ * process died) or when user presses CTRL-C.
+ *
+ * @param cls closure, NULL
+ */
+static void
+maint_child_death (void *cls)
+{
+  enum GNUNET_OS_ProcessStatusType type;
+
+  if ( (GNUNET_OK !=
+       GNUNET_OS_process_status (p, &type, &exit_code)) ||
+       (type != GNUNET_OS_PROCESS_EXITED) )
+    GNUNET_break (0 == GNUNET_OS_process_kill (p, GNUNET_TERM_SIG));
+  GNUNET_OS_process_destroy (p);
+}
+
+
+/**
+ * Dispatch URIs to the appropriate GNUnet helper process
+ *
+ * @param cls closure
+ * @param uri uri to dispatch
+ * @param cfgfile name of the configuration file used (for saving, can be 
NULL!)
+ * @param cfg configuration
+ */
+static void
+gnunet_uri (void *cls,
+            const char *uri,
+            const char *cfgfile,
+            const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  const char *orig_uri;
+  const char *slash;
+  char *subsystem;
+  char *program;
+  struct GNUNET_SCHEDULER_Task * rt;
+
+  orig_uri = uri;
+  if (0 != strncasecmp ("gnunet://", uri, strlen ("gnunet://"))) {
+    fprintf (stderr,
+            _("Invalid URI: does not start with `%s'\n"),
+            "gnunet://");
+    return;
+  }
+  uri += strlen ("gnunet://");
+  if (NULL == (slash = strchr (uri, '/')))
+  {
+    fprintf (stderr,
+             _("Invalid URI: fails to specify subsystem\n"));
+    return;
+  }
+  subsystem = GNUNET_strndup (uri, slash - uri);
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_string (cfg,
+                                            "uri",
+                                            subsystem,
+                                            &program))
+  {
+    fprintf (stderr,
+             _("No handler known for subsystem `%s'\n"),
+             subsystem);
+    GNUNET_free (subsystem);
+    return;
+  }
+  GNUNET_free (subsystem);
+  rt = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                      GNUNET_DISK_pipe_handle (sigpipe,
+                                                               
GNUNET_DISK_PIPE_END_READ),
+                                      &maint_child_death, NULL);
+  p = GNUNET_OS_start_process (GNUNET_NO, 0,
+                              NULL, NULL, NULL,
+                              program,
+                              program,
+                              orig_uri,
+                              NULL);
+  GNUNET_free (program);
+  if (NULL == p)
+    GNUNET_SCHEDULER_cancel (rt);
+}
+
+
+/**
+ * Obtain QR code 'symbol' from @a proc.
+ *
+ * @param proc zbar processor to use
+ * @return NULL on error
+ */
+static const zbar_symbol_t *
+get_symbol (zbar_processor_t *proc)
+{
+  const zbar_symbol_set_t* symbols;
+  int rc;
+  int n;
+
+  if (0 !=
+      zbar_processor_parse_config (proc, "enable"))
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+
+  /* initialize the Processor */
+  if (0 !=
+      (rc = zbar_processor_init(proc, device, 1)))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Failed to open device `%s': %d\n",
+                device,
+                rc);
+    return NULL;
+  }
+
+  /* enable the preview window */
+  if ( (0 != (rc = zbar_processor_set_visible (proc, 1))) ||
+       (0 != (rc = zbar_processor_set_active(proc, 1))) )
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+
+  /* read at least one barcode (or until window closed) */
+  LOG ("Capturing\n");
+  n = zbar_process_one (proc, -1);
+
+  /* hide the preview window */
+  (void) zbar_processor_set_active (proc, 0);
+  (void) zbar_processor_set_visible (proc, 0);
+  if (-1 == n)
+    return NULL; /* likely user closed the window */
+  LOG ("Got %i images\n",
+       n);
+  /* extract results */
+  symbols = zbar_processor_get_results (proc);
+  if (NULL == symbols)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+  return zbar_symbol_set_first_symbol (symbols);
+}
+
+
+/**
+ * Run zbar QR code parser.
+ *
+ * @return NULL on error, otherwise the URI that we found
+ */
+static char *
+run_zbar ()
+{
+  zbar_processor_t *proc;
+  const char *data;
+  char *ret;
+  const zbar_symbol_t* symbol;
+
+  /* configure the Processor */
+  proc = zbar_processor_create (1);
+  if (NULL == proc)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+
+  symbol = get_symbol (proc);
+  if (NULL == symbol)
+  {
+    zbar_processor_destroy (proc);
+    return NULL;
+  }
+  data = zbar_symbol_get_data (symbol);
+  if (NULL == data)
+  {
+    GNUNET_break (0);
+    zbar_processor_destroy (proc);
+    return NULL;
+  }
+  LOG ("Found %s \"%s\"\n",
+       zbar_get_symbol_name (zbar_symbol_get_type(symbol)),
+       data);
+  ret = GNUNET_strdup (data);
+  /* clean up */
+  zbar_processor_destroy(proc);
+  return ret;
+}
+
+
+/**
+ * Main function that will be run by the scheduler.
+ *
+ * @param cls closure
+ * @param args remaining command-line arguments
+ * @param cfgfile name of the configuration file used (for saving, can be 
NULL!)
+ * @param cfg configuration
+ */
+static void
+run (void *cls,
+     char *const *args,
+     const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  char *data;
+
+  data = run_zbar ();
+  if (NULL == data)
+    return;
+  gnunet_uri (cls,
+              data,
+              cfgfile,
+              cfg);
+  if (exit_code != 0)
+  {
+    printf ("Failed to add URI %s\n",
+            data);
+  }
+  else
+  {
+    printf ("Added URI %s\n",
+            data);
+  }
+  GNUNET_free (data);
+};
+
+
+int
+main (int argc, char *const *argv)
+{
+  int ret;
+  struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_option_string ('d', "device", "DEVICE",
+     gettext_noop ("use video-device DEVICE (default: /dev/video0"),
+     &device),
+    GNUNET_GETOPT_option_flag ('\0', "verbose",
+     gettext_noop ("be verbose"),
+     &verbose),
+    GNUNET_GETOPT_option_flag ('s', "silent",
+     gettext_noop ("do not show preview windows"),
+                              &silent),
+    GNUNET_GETOPT_OPTION_END
+  };
+
+  ret = GNUNET_PROGRAM_run (argc,
+                           argv,
+                           "gnunet-qr",
+                           gettext_noop ("Scan a QR code using a video device 
and import the uri read"),
+                           options, &run, NULL);
+  return ((GNUNET_OK == ret) && (0 == exit_code)) ? 0 : 1;
+}
diff --git a/src/util/gnunet-qr.in b/src/util/gnunet-qr.in
deleted file mode 100755
index ce7a19b69..000000000
--- a/src/util/gnunet-qr.in
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/sh
-#
-# From curl's buildconf, making this script subject to the
-# curl license: https://curl.haxx.se/docs/copyright.html
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <address@hidden>, et al.
-# Copyright (C) 2019 GNUnet e.V.
-
-# findtool works like which without relying on which (which is a problem
-# for some limited shells.
-findtool(){
-  file="$1"
-
-  if { echo "$file" | grep "/" >/dev/null 2>&1; } then
-    # when file is given with a path check it first
-    if test -f "$file"; then
-      echo "$file"
-      return
-    fi
-  fi
-
-  old_IFS=$IFS; IFS=':'
-  for path in $PATH
-  do
-    IFS=$old_IFS
-    # echo "checks for $file in $path" >&2
-    if test "$path" -a "$path" != '.' -a -f "$path/$file"; then
-      echo "$path/$file"
-      return
-    fi
-  done
-  IFS=$old_IFS
-}
-
-# end curl licensed code
-pythonize=`findtool python2.7 2>/dev/null`
-if test ! -x "$pythonize"; then
-       pythonize=`findtool ${PYTHON2:-python2.7}`
-fi
-
-if test -z "$pythonize"; then
-  echo "ERROR: python2.7 not found."
-  echo "  You need python2.7 installed."
-  exit 1
-fi
-
-${pythonize} @PREFIX@/share/gnunet/gnunet-qr.py $@
diff --git a/src/util/gnunet-qr.py b/src/util/gnunet-qr.py
deleted file mode 100644
index 0ee0b9507..000000000
--- a/src/util/gnunet-qr.py
+++ /dev/null
@@ -1,110 +0,0 @@
-import sys
-import getopt
-import subprocess
-from sys import argv
-try:
-    import zbar
-except ImportError as e:
-    print('Cannot run gnunet-qr, please install the zbar module.')
-    print('For Debian, you can obtain it as "python-zbar".')
-    print('Upstream: http://zbar.sourceforge.net/')
-    sys.exit(1)
-
-
-def help():
-    print('gnunet-qr\n\
-Scan a QR code using a video device and import\n\
-Arguments mandatory for long options are also mandatory for short options.\n\
-  -c, --config FILENAME      use configuration file FILENAME\n\
-  -d, --device DEVICE        use device DEVICE\n\
-  -s, --silent               do not show preview windows\n\
-  -h, --help                 print this help\n\
-  -v, --verbose              be verbose\n\
-Report bugs to address@hidden
-GNUnet home page: https://gnunet.org/\n\
-General help using GNU software: https://www.gnu.org/gethelp/')
-
-
-if __name__ == '__main__':
-    configuration = ''
-    device = '/dev/video0'
-    url = ''
-    verbose = False
-    silent = False
-    # Parse arguments
-    try:
-        opts, args = getopt.gnu_getopt(sys.argv[1:], "c:hd:sv", ["config", 
"help", "device", "silent", "verbose"])
-    except getopt.GetoptError as e:
-        help()
-        print(str(e))
-        exit(1)
-    for o, a in opts:
-        if o in ("-h", "--help"):
-            help()
-            sys.exit(0)
-        elif o in ("-c", "--config"):
-            configuration = a
-        elif o in ("-d", "--device"):
-            device = a
-        elif o in ("-s", "--silent"):
-            silent = True
-        elif o in ("-v", "--verbose"):
-            verbose = True
-    if (True == verbose):
-        print('Initializing')
-    # create a Processor
-    proc = zbar.Processor()
-
-    # configure the Processor
-    proc.parse_config('enable')
-
-    # initialize the Processor
-    try:
-        if (True == verbose):
-            print('Opening video device ' + device)
-        proc.init(device)
-    except Exception as e:
-        print('Failed to open device ' + device)
-        exit(1)
-
-    # enable the preview window
-    # if (True == silent):
-    #       proc.visible = True
-    # else:
-    #               proc.visible = False
-
-    proc.visible = True
-    # read at least one barcode (or until window closed)
-    try:
-        if (True == verbose):
-            print('Capturing')
-        proc.process_one()
-    except Exception as e:
-        # Window was closed without finding code
-        exit(1)
-
-    # hide the preview window
-    proc.visible = False
-
-    # extract results
-    for symbol in proc.results:
-        # do something useful with results
-        if (True == verbose):
-            print('Found ', symbol.type, ' symbol ', '"%s"' % symbol.data)
-        args = list()
-        args.append("gnunet-uri")
-        if (configuration != ''):
-            args.append(str("-c " + str(configuration)))
-        args.append(str(symbol.data))
-        cmd = ''
-        for a in args:
-            cmd += " " + str(a)
-        if (verbose):
-            print('Running `' + cmd +'`')
-        res = subprocess.call(args)
-        if (0 != res):
-            print('Failed to add URI ' + str(symbol.data))
-        else:
-            print('Added URI ' + str(symbol.data))
-        exit(res)
-    exit(1)

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]