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

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

 



On Wed, Jan 16, 2019 at 7:37 AM Mauro Carvalho Chehab
<mchehab+samsung@xxxxxxxxxx> wrote:
>
> 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.
Which function should I call send_dbus() from in that case?
>
> 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.
That could be useful, probably too difficult for me to implement
myself though(I don't write a lot of c usually).
>
> >
> > 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