Re: [PATCH zbar 1/1] Add simple dbus IPC API to zbarcam.

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

 



Hi James,

Em Wed, 16 Jan 2019 16:54:55 +0800
james.hilliard1@xxxxxxxxx escreveu:

> From: James Hilliard <james.hilliard1@xxxxxxxxx>
> 
> This is useful for running zbarcam as a systemd service so that other
> applications can receive scan messages through dbus.

Nice approach!

Yet, I would try to write it on a different way, making sure that it
could also be using by zbarimg.

I mean, if you add the dbus bindings inside the zbar core, it
shouldn't matter if the source image comes via a webcam or via a 
scanned image. Both will be able to send the scancodes via dbus.

As a future approach, we may even think on making the interface
duplex in the future, e. g. allowing any camera application to
send an image via dbus and let zbar to decode it and return
the decoded bar codes.

> 
> Signed-off-by: James Hilliard <james.hilliard1@xxxxxxxxx>
> ---
>  Makefile.am                |  6 ++++
>  configure.ac               | 30 ++++++++++++++++++++
>  dbus/org.linuxtv.Zbar.conf | 19 +++++++++++++
>  zbarcam/Makefile.am.inc    |  4 +++
>  zbarcam/zbarcam.c          | 70 ++++++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 129 insertions(+)
>  create mode 100644 dbus/org.linuxtv.Zbar.conf
> 
> diff --git a/Makefile.am b/Makefile.am
> index 624dcde..62e516a 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -50,6 +50,12 @@ if HAVE_DOC
>  include $(srcdir)/doc/Makefile.am.inc
>  endif
>  
> +if HAVE_DBUS
> +dbusconfdir = @DBUS_CONFDIR@
> +dbusconf_DATA = $(srcdir)/dbus/org.linuxtv.Zbar.conf
> +EXTRA_DIST += $(dbusconf_DATA)
> +endif
> +
>  EXTRA_DIST += zbar.ico zbar.nsi
>  
>  EXTRA_DIST += examples/barcode.png examples/upcrpc.py examples/upcrpc.pl \
> diff --git a/configure.ac b/configure.ac
> index 2633b48..2398da5 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -291,6 +291,35 @@ specify XV_LIBS or configure --without-xv to disable the extension])],
>  ])
>  AM_CONDITIONAL([HAVE_XV], [test "x$with_xv" = "xyes"])
>  
> +dnl dbus
> +AC_ARG_WITH([dbus],
> +  [AS_HELP_STRING([--without-dbus],
> +    [disable support for dbus])],
> +  [],
> +  [with_dbus="check"])
> +
> +AS_IF([test "x$with_dbus" != "xno"],
> +  [PKG_CHECK_MODULES(DBUS, dbus-1 >= 1.0, have_dbus=yes, have_dbus=no)
> +  AS_IF([test "x$have_dbusx$with_dbus" = "xnoxyes"],
> +    [AC_MSG_FAILURE([DBus development libraries not found])],
> +    [with_dbus="$have_dbus"])
> +])
> +AM_CONDITIONAL([HAVE_DBUS], [test "x$with_dbus" = "xyes"])
> +
> +AS_IF([test "x$with_dbus" = "xyes"],
> +  [CPPFLAGS="$CPPFLAGS $DBUS_CFLAGS"
> +  AC_ARG_VAR([DBUS_LIBS], [linker flags for building dbus])
> +  AC_DEFINE([HAVE_DBUS], [1], [Define to 1 to use dbus])
> +  AC_ARG_WITH(dbusconfdir, AC_HELP_STRING([--with-dbusconfdir=PATH],
> +  [path to D-Bus config directory]),
> +  [path_dbusconf=$withval],
> +  [path_dbusconf="`$PKG_CONFIG --variable=sysconfdir dbus-1`"])
> +  AS_IF([test -z "$path_dbusconf"],
> +    DBUS_CONFDIR="$sysconfdir/dbus-1/system.d",
> +    DBUS_CONFDIR="$path_dbusconf/dbus-1/system.d")
> +  AC_SUBST(DBUS_CONFDIR)
> +])
> +
>  dnl libjpeg
>  AC_ARG_WITH([jpeg],
>    [AS_HELP_STRING([--without-jpeg],
> @@ -617,6 +646,7 @@ AS_IF([test "x$enable_video" != "xyes"],
>    [echo "        => zbarcam video scanner will *NOT* be built"])
>  AS_IF([test "x$have_libv4l" != "xyes"],
>    [echo "        => libv4l will *NOT* be used"])
> +echo "dbus              --with-dbus=$with_dbus"
>  echo "jpeg              --with-jpeg=$with_jpeg"
>  AS_IF([test "x$with_jpeg" != "xyes"],
>    [echo "        => JPEG image conversions will *NOT* be supported"])
> diff --git a/dbus/org.linuxtv.Zbar.conf b/dbus/org.linuxtv.Zbar.conf
> new file mode 100644
> index 0000000..e0a5ea5
> --- /dev/null
> +++ b/dbus/org.linuxtv.Zbar.conf
> @@ -0,0 +1,19 @@
> +<!DOCTYPE busconfig PUBLIC
> + "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
> + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd";>
> +<busconfig>
> +
> +    <policy user="root">
> +        <allow own="org.linuxtv.Zbar"/>
> +    </policy>
> +
> +    <policy context="default">
> +        <allow send_destination="org.linuxtv.Zbar"/>
> +        <allow send_destination="org.linuxtv.Zbar"
> +               send_interface="org.linuxtv.ZbarCam1"/>
> +        <allow send_destination="org.linuxtv.Zbar"
> +               send_interface="org.freedesktop.DBus.Properties"/>
> +        <allow send_destination="org.linuxtv.Zbar"
> +               send_interface="org.freedesktop.DBus.Introspectable"/>
> +    </policy>
> +</busconfig>
> diff --git a/zbarcam/Makefile.am.inc b/zbarcam/Makefile.am.inc
> index 5aa788a..98199ee 100644
> --- a/zbarcam/Makefile.am.inc
> +++ b/zbarcam/Makefile.am.inc
> @@ -4,6 +4,10 @@ zbarcam_zbarcam_LDADD = zbar/libzbar.la
>  # automake bug in "monolithic mode"?
>  CLEANFILES += zbarcam/.libs/zbarcam zbarcam/moc_zbarcam_qt.h
>  
> +if HAVE_DBUS
> +zbarcam_zbarcam_LDADD += $(DBUS_LIBS)
> +endif
> +
>  if HAVE_GTK
>  bin_PROGRAMS += zbarcam/zbarcam-gtk
>  check_PROGRAMS += zbarcam/zbarcam-gtk
> diff --git a/zbarcam/zbarcam.c b/zbarcam/zbarcam.c
> index e0f3622..18b4fd1 100644
> --- a/zbarcam/zbarcam.c
> +++ b/zbarcam/zbarcam.c
> @@ -33,6 +33,10 @@
>  
>  #include <zbar.h>
>  
> +#ifdef HAVE_DBUS
> +#include <dbus/dbus.h>
> +#endif
> +
>  #define BELL "\a"
>  
>  static const char *note_usage =
> @@ -92,6 +96,68 @@ static inline int parse_config (const char *cfgstr, int i, int n, char *arg)
>      return(0);
>  }
>  
> +#ifdef HAVE_DBUS
> +void send_dbus(const char* sigvalue)
> +{
> +    DBusMessage* msg;
> +    DBusMessageIter args;
> +    DBusConnection* conn;
> +    DBusError err;
> +    int ret;
> +    dbus_uint32_t serial = 0;
> +
> +    // initialise the error value
> +    dbus_error_init(&err);
> +
> +    // connect to the DBUS system bus, and check for errors
> +    conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
> +    if (dbus_error_is_set(&err)) {
> +        fprintf(stderr, "Connection Error (%s)\n", err.message);
> +        dbus_error_free(&err);
> +    }
> +    if (NULL == conn) {
> +        exit(1);
> +    }
> +
> +    // register our name on the bus, and check for errors
> +    ret = dbus_bus_request_name(conn, "org.linuxtv.Zbar", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
> +    if (dbus_error_is_set(&err)) {
> +        fprintf(stderr, "Name Error (%s)\n", err.message);
> +        dbus_error_free(&err);
> +    }
> +    if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
> +        exit(1);
> +    }
> +
> +    // create a signal & check for errors
> +    msg = dbus_message_new_signal("/org/linuxtv/ZbarCam1", // object name of the signal
> +                                 "org.linuxtv.ZbarCam1", // interface name of the signal
> +                                 "ZbarCam1"); // name of the signal
> +    if (NULL == msg)
> +    {
> +        fprintf(stderr, "Message Null\n");
> +        exit(1);
> +    }
> +
> +    // append arguments onto signal
> +    dbus_message_iter_init_append(msg, &args);
> +    if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &sigvalue)) {
> +        fprintf(stderr, "Out Of Memory!\n");
> +        exit(1);
> +    }
> +
> +    // send the message and flush the connection
> +    if (!dbus_connection_send(conn, msg, &serial)) {
> +        fprintf(stderr, "Out Of Memory!\n");
> +        exit(1);
> +    }
> +    dbus_connection_flush(conn);
> +
> +    // free the message
> +    dbus_message_unref(msg);
> +}
> +#endif
> +
>  static void data_handler (zbar_image_t *img, const void *userdata)
>  {
>      const zbar_symbol_t *sym = zbar_image_first_symbol(img);
> @@ -105,6 +171,10 @@ static void data_handler (zbar_image_t *img, const void *userdata)
>          if(type == ZBAR_PARTIAL)
>              continue;
>  
> +#ifdef HAVE_DBUS
> +        send_dbus(zbar_symbol_get_data(sym));
> +#endif
> +
>          if(!format) {
>              printf("%s:", zbar_get_symbol_name(type));
>              if(fwrite(zbar_symbol_get_data(sym),



Thanks,
Mauro



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux