summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Orlenko <zxteam@gmail.com>2010-07-14 15:44:45 +1100
committerAlexander Orlenko <zxteam@gmail.com>2010-07-14 15:44:45 +1100
commit4983869a78233a6bd04e4327db904569dd5cf613 (patch)
treec7977dadf59492a862329e52831a985e03fedd8f
parent499a706c529a9e821cb7dcb54f63dfa50117ba39 (diff)
downloadbluez-tools-4983869a78233a6bd04e4327db904569dd5cf613.tar.gz
Added script to generate version number
Moved dbus interface definition in gobjects to header Added helper (intf_is_supported function) to check interface existence in dbus Other changes will be commited later
-rw-r--r--configure.ac10
-rwxr-xr-xcontrib/gen-dbus-gobject.pl47
-rwxr-xr-xgit-version-gen158
-rw-r--r--src/Makefile.am11
-rw-r--r--src/bt-device.c11
-rw-r--r--src/bt-input.c15
-rw-r--r--src/lib/adapter.c8
-rw-r--r--src/lib/adapter.h2
-rw-r--r--src/lib/audio.c8
-rw-r--r--src/lib/audio.h2
-rw-r--r--src/lib/device.c8
-rw-r--r--src/lib/device.h2
-rw-r--r--src/lib/helpers.c56
-rw-r--r--src/lib/helpers.h20
-rw-r--r--src/lib/input.c8
-rw-r--r--src/lib/input.h2
-rw-r--r--src/lib/manager.c9
-rw-r--r--src/lib/manager.h3
-rw-r--r--src/lib/network.c8
-rw-r--r--src/lib/network.h2
-rw-r--r--src/lib/network_hub.c8
-rw-r--r--src/lib/network_hub.h2
-rw-r--r--src/lib/network_peer.c8
-rw-r--r--src/lib/network_peer.h2
-rw-r--r--src/lib/network_router.c8
-rw-r--r--src/lib/network_router.h2
-rw-r--r--src/lib/serial.c8
-rw-r--r--src/lib/serial.h2
28 files changed, 347 insertions, 83 deletions
diff --git a/configure.ac b/configure.ac
index 91e1467..57e0d4e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([bluez-tools], [0.1], [bluez-tools-bug-report@notavailable.ru], [bluez-tools], [http://notavailable.ru/projects/bluez-tools/])
+AC_INIT([bluez-tools], m4_esyscmd([./git-version-gen .tarball-version]), [bluez-tools-bug-report@notavailable.ru], [bluez-tools], [http://notavailable.ru/projects/bluez-tools/])
AC_PREREQ([2.65])
AM_INIT_AUTOMAKE([1.11 no-define foreign -Wall subdir-objects])
AC_CONFIG_HEADERS([config.h])
@@ -8,11 +8,9 @@ AC_PROG_CC_C99
AC_PROG_INSTALL
AM_PROG_CC_C_O
-PKG_CHECK_MODULES([DBUS], [dbus-1 >= 1.2.24])
-PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.24.1])
-PKG_CHECK_MODULES([DBUS_GLIB], [dbus-glib-1 >= 0.86])
-
-CFLAGS="$CFLAGS -Wall -g3"
+PKG_CHECK_MODULES([DBUS], [dbus-1 >= 1.2.16])
+PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.24.0])
+PKG_CHECK_MODULES([DBUS_GLIB], [dbus-glib-1 >= 0.84])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT
diff --git a/contrib/gen-dbus-gobject.pl b/contrib/gen-dbus-gobject.pl
index 3a31650..c9298eb 100755
--- a/contrib/gen-dbus-gobject.pl
+++ b/contrib/gen-dbus-gobject.pl
@@ -1,5 +1,26 @@
#!/usr/bin/perl -w
+#
+# bluez-tools - a set of tools to manage bluetooth devices for linux
+#
+# Copyright (C) 2010 Alexander Orlenko <zxteam@gmail.com>
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+
use strict;
die "usage: -header|source FILE <hid>\n" unless $ARGV[0] && $ARGV[1] && $ARGV[0] =~ /^-(header|source)$/;
@@ -229,6 +250,8 @@ sub generate_header {
#include <glib-object.h>
+{BLUEZ_DBUS_OBJECT_DEFS}
+
/*
* Type macros
*/
@@ -270,6 +293,10 @@ EOT
my $obj_lc = lc join('_', $obj =~ /([A-Z]+[a-z]*)/g);
my $obj_uc = uc join('_', $obj =~ /([A-Z]+[a-z]*)/g);
+ my $bluez_dbus_object_defs = "";
+ $bluez_dbus_object_defs .= "#define BLUEZ_DBUS_{\$OBJECT}_PATH \"$node->{'objectPath'}\"\n" if defined $node->{'objectPath'};
+ $bluez_dbus_object_defs .= "#define BLUEZ_DBUS_{\$OBJECT}_INTERFACE \"$node->{'intf'}\"";
+
my $method_defs = "";
for my $method (sort keys %{$node->{$intf}{'methods'}}) {
@@ -302,6 +329,7 @@ EOT
$method_defs =~ s/\s+$//s;
my $output = "$HEADER\n$HEADER_TEMPLATE\n";
+ $output =~ s/{BLUEZ_DBUS_OBJECT_DEFS}/$bluez_dbus_object_defs/;
$output =~ s/{METHOD_DEFS}/$method_defs/;
$output =~ s/{\$OBJECT}/$obj_uc/g;
$output =~ s/{\$Object}/$obj/g;
@@ -324,8 +352,6 @@ sub generate_source {
#include "marshallers.h"
#include "{\$object}.h"
-{BLUEZ_DBUS_OBJECT_DEFS}
-
#define {\$OBJECT}_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), {\$OBJECT}_TYPE, {\$Object}Private))
struct _{\$Object}Private {
@@ -440,12 +466,12 @@ static void {\$object}_init({\$Object} *self)
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\\"", BLUEZ_DBUS_{\$OBJECT}_INTERFACE, "\\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\\"", BLUEZ_DBUS_{\$OBJECT}_INTERFACE, "\\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \\"%s\\" does not exist in \\"%s\\"", BLUEZ_DBUS_{\$OBJECT}_INTERFACE, BLUEZ_DBUS_{\$OBJECT}_PATH);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, BLUEZ_DBUS_{\$OBJECT}_PATH, BLUEZ_DBUS_{\$OBJECT}_INTERFACE);
@@ -479,12 +505,12 @@ static void {\$object}_post_init({\$Object} *self, const gchar *dbus_object_path
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\\"", BLUEZ_DBUS_{\$OBJECT}_INTERFACE, "\\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\\"", BLUEZ_DBUS_{\$OBJECT}_INTERFACE, "\\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \\"%s\\" does not exist in \\"%s\\"", BLUEZ_DBUS_{\$OBJECT}_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_{\$OBJECT}_INTERFACE);
{IF_SIGNALS}
@@ -560,10 +586,6 @@ EOT
my $obj_lc = lc join('_', $obj =~ /([A-Z]+[a-z]*)/g);
my $obj_uc = uc join('_', $obj =~ /([A-Z]+[a-z]*)/g);
- my $bluez_dbus_object_defs = "";
- $bluez_dbus_object_defs .= "#define BLUEZ_DBUS_{\$OBJECT}_PATH \"$node->{'objectPath'}\"\n" if defined $node->{'objectPath'};
- $bluez_dbus_object_defs .= "#define BLUEZ_DBUS_{\$OBJECT}_INTERFACE \"$node->{'intf'}\"";
-
my $methods = "";
my $async_flag = 0;
my $priv_async_calls = '';
@@ -910,7 +932,6 @@ EOT
} else {
$output =~ s/\s+\{IF_ASYNC_CALLS\}.+?\{FI_ASYNC_CALLS\}//gs;
}
- $output =~ s/{BLUEZ_DBUS_OBJECT_DEFS}/$bluez_dbus_object_defs/;
$output =~ s/{ENUM_SIGNALS}/$enum_signals/;
$output =~ s/{SIGNALS_HANDLERS_DEF}/$signals_handlers_def/;
$output =~ s/{SIGNALS_REGISTRATION}/$signals_registration/;
diff --git a/git-version-gen b/git-version-gen
new file mode 100755
index 0000000..5617eb8
--- /dev/null
+++ b/git-version-gen
@@ -0,0 +1,158 @@
+#!/bin/sh
+# Print a version string.
+scriptversion=2010-06-14.19; # UTC
+
+# Copyright (C) 2007-2010 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
+# It may be run two ways:
+# - from a git repository in which the "git describe" command below
+# produces useful output (thus requiring at least one signed tag)
+# - from a non-git-repo directory containing a .tarball-version file, which
+# presumes this script is invoked like "./git-version-gen .tarball-version".
+
+# In order to use intra-version strings in your project, you will need two
+# separate generated version string files:
+#
+# .tarball-version - present only in a distribution tarball, and not in
+# a checked-out repository. Created with contents that were learned at
+# the last time autoconf was run, and used by git-version-gen. Must not
+# be present in either $(srcdir) or $(builddir) for git-version-gen to
+# give accurate answers during normal development with a checked out tree,
+# but must be present in a tarball when there is no version control system.
+# Therefore, it cannot be used in any dependencies. GNUmakefile has
+# hooks to force a reconfigure at distribution time to get the value
+# correct, without penalizing normal development with extra reconfigures.
+#
+# .version - present in a checked-out repository and in a distribution
+# tarball. Usable in dependencies, particularly for files that don't
+# want to depend on config.h but do want to track version changes.
+# Delete this file prior to any autoconf run where you want to rebuild
+# files to pick up a version string change; and leave it stale to
+# minimize rebuild time after unrelated changes to configure sources.
+#
+# It is probably wise to add these two files to .gitignore, so that you
+# don't accidentally commit either generated file.
+#
+# Use the following line in your configure.ac, so that $(VERSION) will
+# automatically be up-to-date each time configure is run (and note that
+# since configure.ac no longer includes a version string, Makefile rules
+# should not depend on configure.ac for version updates).
+#
+# AC_INIT([GNU project],
+# m4_esyscmd([build-aux/git-version-gen .tarball-version]),
+# [bug-project@example])
+#
+# Then use the following lines in your Makefile.am, so that .version
+# will be present for dependencies, and so that .tarball-version will
+# exist in distribution tarballs.
+#
+# BUILT_SOURCES = $(top_srcdir)/.version
+# $(top_srcdir)/.version:
+# echo $(VERSION) > $@-t && mv $@-t $@
+# dist-hook:
+# echo $(VERSION) > $(distdir)/.tarball-version
+
+case $# in
+ 1|2) ;;
+ *) echo 1>&2 "Usage: $0 \$srcdir/.tarball-version" \
+ '[TAG-NORMALIZATION-SED-SCRIPT]'
+ exit 1;;
+esac
+
+tarball_version_file=$1
+tag_sed_script="${2:-s/x/x/}"
+nl='
+'
+
+# Avoid meddling by environment variable of the same name.
+v=
+
+# First see if there is a tarball-only version file.
+# then try "git describe", then default.
+if test -f $tarball_version_file
+then
+ v=`cat $tarball_version_file` || exit 1
+ case $v in
+ *$nl*) v= ;; # reject multi-line output
+ [0-9]*) ;;
+ *) v= ;;
+ esac
+ test -z "$v" \
+ && echo "$0: WARNING: $tarball_version_file seems to be damaged" 1>&2
+fi
+
+if test -n "$v"
+then
+ : # use $v
+elif test -d .git \
+ && v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \
+ || git describe --abbrev=4 HEAD 2>/dev/null` \
+ && v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \
+ && case $v in
+ v[0-9]*) ;;
+ *) (exit 1) ;;
+ esac
+then
+ # Is this a new git that lists number of commits since the last
+ # tag or the previous older version that did not?
+ # Newer: v6.10-77-g0f8faeb
+ # Older: v6.10-g0f8faeb
+ case $v in
+ *-*-*) : git describe is okay three part flavor ;;
+ *-*)
+ : git describe is older two part flavor
+ # Recreate the number of commits and rewrite such that the
+ # result is the same as if we were using the newer version
+ # of git describe.
+ vtag=`echo "$v" | sed 's/-.*//'`
+ numcommits=`git rev-list "$vtag"..HEAD | wc -l`
+ v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
+ ;;
+ esac
+
+ # Change the first '-' to a '.', so version-comparing tools work properly.
+ # Remove the "g" in git describe's output string, to save a byte.
+ v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
+else
+ v=UNKNOWN
+fi
+
+v=`echo "$v" |sed 's/^v//'`
+
+# Don't declare a version "dirty" merely because a time stamp has changed.
+git update-index --refresh > /dev/null 2>&1
+
+dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty=
+case "$dirty" in
+ '') ;;
+ *) # Append the suffix only if there isn't one already.
+ case $v in
+ *-dirty) ;;
+ *) v="$v-dirty" ;;
+ esac ;;
+esac
+
+# Omit the trailing newline, so that m4_esyscmd can use the result directly.
+echo "$v" | tr -d "$nl"
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/src/Makefile.am b/src/Makefile.am
index 00a1e28..297f674 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,8 +1,8 @@
AM_CPPFLAGS = $(DBUS_CFLAGS) $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) $(GIO_CFLAGS) $(DBUS_GLIB_CFLAGS)
AM_LDFLAGS = $(DBUS_LIBS) $(GLIB_LIBS) $(GOBJECT_LIBS) $(GIO_LIBS) $(DBUS_GLIB_LIBS)
-BUILT_SOURCES = lib/marshallers.c lib/marshallers.h
-
+#BUILT_SOURCES = lib/marshallers.c lib/marshallers.h
+#
#GENMARSHAL_FLAGS = --prefix="g_cclosure_bluez_marshal" --g-fatal-warnings
#
#lib/marshallers.h: lib/marshallers.list
@@ -11,6 +11,13 @@ BUILT_SOURCES = lib/marshallers.c lib/marshallers.h
#lib/marshallers.c: lib/marshallers.list
# glib-genmarshal $(GENMARSHAL_FLAGS) --body lib/marshallers.list > lib/marshallers.c
+BUILT_SOURCES = $(top_srcdir)/.version
+
+$(top_srcdir)/.version:
+ echo $(VERSION) > $@-t && mv $@-t $@
+dist-hook:
+ echo $(VERSION) > $(distdir)/.tarball-version
+
lib_sources = lib/marshallers.c lib/marshallers.h \
lib/dbus-common.c lib/dbus-common.h \
lib/helpers.c lib/helpers.h \
diff --git a/src/bt-device.c b/src/bt-device.c
index e6bef9e..afddc77 100644
--- a/src/bt-device.c
+++ b/src/bt-device.c
@@ -298,11 +298,12 @@ int main(int argc, char *argv[])
g_hash_table_iter_init(&iter, device_services);
while (g_hash_table_iter_next(&iter, &key, &value)) {
- GMarkupParser xml_parser = {xml_start_element, xml_end_element, NULL, NULL, NULL};
- GMarkupParseContext *xml_parse_context = g_markup_parse_context_new(&xml_parser, 0, NULL, NULL);
- g_markup_parse_context_parse(xml_parse_context, value, strlen(value), &error);
- exit_if_error(error);
- g_markup_parse_context_free(xml_parse_context);
+ //GMarkupParser xml_parser = {xml_start_element, xml_end_element, NULL, NULL, NULL};
+ //GMarkupParseContext *xml_parse_context = g_markup_parse_context_new(&xml_parser, 0, NULL, NULL);
+ //g_markup_parse_context_parse(xml_parse_context, value, strlen(value), &error);
+ //exit_if_error(error);
+ //g_markup_parse_context_free(xml_parse_context);
+ g_print("%s", value);
}
g_print("Done\n");
diff --git a/src/bt-input.c b/src/bt-input.c
index 36a8ad7..42979d4 100644
--- a/src/bt-input.c
+++ b/src/bt-input.c
@@ -48,9 +48,9 @@ static gchar *connect_arg = NULL;
static gchar *disconnect_arg = NULL;
static GOptionEntry entries[] = {
- {"adapter", 'a', 0, G_OPTION_ARG_STRING, &adapter_arg, "Adapter name or MAC", "adapter#id"},
- {"connect", 'c', 0, G_OPTION_ARG_STRING, &connect_arg, "Connect to an input device", "device#id"},
- {"disconnect", 'd', 0, G_OPTION_ARG_STRING, &disconnect_arg, "Disconnect from an input device", "device#id"},
+ {"adapter", 'a', 0, G_OPTION_ARG_STRING, &adapter_arg, "Adapter name or MAC", "<name|mac>"},
+ {"connect", 'c', 0, G_OPTION_ARG_STRING, &connect_arg, "Connect to an input device", "<name|mac>"},
+ {"disconnect", 'd', 0, G_OPTION_ARG_STRING, &disconnect_arg, "Disconnect from an input device", "<name|mac>"},
{NULL}
};
@@ -63,8 +63,8 @@ int main(int argc, char *argv[])
context = g_option_context_new("- a bluetooth input manager");
g_option_context_add_main_entries(context, entries, NULL);
- g_option_context_set_summary(context, "input summary");
- g_option_context_set_description(context, "input desc");
+ g_option_context_set_summary(context, "Version "PACKAGE_VERSION);
+ g_option_context_set_description(context, "Report bugs to <"PACKAGE_BUGREPORT">.");
if (!g_option_context_parse(context, &argc, &argv, &error)) {
g_print("%s: %s\n", g_get_prgname(), error->message);
@@ -88,7 +88,10 @@ int main(int argc, char *argv[])
Device *device = find_device(adapter, connect_arg != NULL ? connect_arg : disconnect_arg, &error);
exit_if_error(error);
- // TODO: Test to HID service
+ if (!intf_is_supported(device_get_dbus_object_path(device), INPUT_INTF)) {
+ g_printerr("Input service is not supported by this device\n");
+ exit(EXIT_FAILURE);
+ }
GMainLoop *mainloop = g_main_loop_new(NULL, FALSE);
diff --git a/src/lib/adapter.c b/src/lib/adapter.c
index 228ce81..009c037 100644
--- a/src/lib/adapter.c
+++ b/src/lib/adapter.c
@@ -31,8 +31,6 @@
#include "marshallers.h"
#include "adapter.h"
-#define BLUEZ_DBUS_ADAPTER_INTERFACE "org.bluez.Adapter"
-
#define ADAPTER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), ADAPTER_TYPE, AdapterPrivate))
struct _AdapterPrivate {
@@ -252,12 +250,12 @@ static void adapter_post_init(Adapter *self, const gchar *dbus_object_path)
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_ADAPTER_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_ADAPTER_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_ADAPTER_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_ADAPTER_INTERFACE);
/* DBus signals connection */
diff --git a/src/lib/adapter.h b/src/lib/adapter.h
index 54b099f..2d4a82c 100644
--- a/src/lib/adapter.h
+++ b/src/lib/adapter.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_ADAPTER_INTERFACE "org.bluez.Adapter"
+
/*
* Type macros
*/
diff --git a/src/lib/audio.c b/src/lib/audio.c
index 019df16..3e02761 100644
--- a/src/lib/audio.c
+++ b/src/lib/audio.c
@@ -31,8 +31,6 @@
#include "marshallers.h"
#include "audio.h"
-#define BLUEZ_DBUS_AUDIO_INTERFACE "org.bluez.Audio"
-
#define AUDIO_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), AUDIO_TYPE, AudioPrivate))
struct _AudioPrivate {
@@ -143,12 +141,12 @@ static void audio_post_init(Audio *self, const gchar *dbus_object_path)
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_AUDIO_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_AUDIO_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_AUDIO_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_AUDIO_INTERFACE);
/* DBus signals connection */
diff --git a/src/lib/audio.h b/src/lib/audio.h
index 8275d50..f5e4da0 100644
--- a/src/lib/audio.h
+++ b/src/lib/audio.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_AUDIO_INTERFACE "org.bluez.Audio"
+
/*
* Type macros
*/
diff --git a/src/lib/device.c b/src/lib/device.c
index 7fc2797..04ba636 100644
--- a/src/lib/device.c
+++ b/src/lib/device.c
@@ -31,8 +31,6 @@
#include "marshallers.h"
#include "device.h"
-#define BLUEZ_DBUS_DEVICE_INTERFACE "org.bluez.Device"
-
#define DEVICE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), DEVICE_TYPE, DevicePrivate))
struct _DevicePrivate {
@@ -251,12 +249,12 @@ static void device_post_init(Device *self, const gchar *dbus_object_path)
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_DEVICE_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_DEVICE_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_DEVICE_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_DEVICE_INTERFACE);
/* DBus signals connection */
diff --git a/src/lib/device.h b/src/lib/device.h
index 316220e..f689bdd 100644
--- a/src/lib/device.h
+++ b/src/lib/device.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_DEVICE_INTERFACE "org.bluez.Device"
+
/*
* Type macros
*/
diff --git a/src/lib/helpers.c b/src/lib/helpers.c
index d7b7557..d62c503 100644
--- a/src/lib/helpers.c
+++ b/src/lib/helpers.c
@@ -26,8 +26,10 @@
#endif
#include <glib.h>
+#include <dbus/dbus-glib.h>
#include <string.h>
+#include "dbus-common.h"
#include "manager.h"
#include "helpers.h"
@@ -208,3 +210,57 @@ Device *find_device(Adapter *adapter, const gchar *name, GError **error)
return device;
}
+gboolean intf_is_supported(const gchar *dbus_object_path, int intf_id)
+{
+ g_assert(conn != NULL);
+ g_assert(dbus_object_path != NULL);
+ g_assert(strlen(dbus_object_path) > 0);
+ gboolean intf_supported = FALSE;
+
+ /* Getting introspection XML */
+ DBusGProxy *introspection_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, "org.freedesktop.DBus.Introspectable");
+ gchar *introspection_xml = NULL;
+ GError *error = NULL;
+ if (!dbus_g_proxy_call(introspection_g_proxy, "Introspect", &error, G_TYPE_INVALID, G_TYPE_STRING, &introspection_xml, G_TYPE_INVALID)) {
+ g_critical("%s", error->message);
+ }
+ g_assert(error == NULL);
+
+ gchar *check_intf_regex_str = NULL;
+ switch (intf_id) {
+ case AUDIO_INTF:
+ check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_AUDIO_INTERFACE, "\">", NULL);
+ break;
+ case INPUT_INTF:
+ check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_INPUT_INTERFACE, "\">", NULL);
+ break;
+ case NETWORK_INTF:
+ check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_INTERFACE, "\">", NULL);
+ break;
+ case NETWORK_HUB_INTF:
+ check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_HUB_INTERFACE, "\">", NULL);
+ break;
+ case NETWORK_PEER_INTF:
+ check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_PEER_INTERFACE, "\">", NULL);
+ break;
+ case NETWORK_ROUTER_INTF:
+ check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_ROUTER_INTERFACE, "\">", NULL);
+ break;
+ case SERIAL_INTF:
+ check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_SERIAL_INTERFACE, "\">", NULL);
+ break;
+ default:
+ check_intf_regex_str = g_strconcat("<interface name=\"", "undefined", "\">", NULL);
+ }
+
+ if (g_regex_match_simple(check_intf_regex_str, introspection_xml, 0, 0)) {
+ intf_supported = TRUE;
+ }
+
+ g_free(check_intf_regex_str);
+ g_free(introspection_xml);
+ g_object_unref(introspection_g_proxy);
+
+ return intf_supported;
+}
+
diff --git a/src/lib/helpers.h b/src/lib/helpers.h
index b343867..2ec0797 100644
--- a/src/lib/helpers.h
+++ b/src/lib/helpers.h
@@ -29,6 +29,23 @@
#include "adapter.h"
#include "device.h"
+#include "audio.h"
+#include "input.h"
+#include "network.h"
+#include "network_hub.h"
+#include "network_peer.h"
+#include "network_router.h"
+#include "serial.h"
+
+enum {
+ AUDIO_INTF,
+ INPUT_INTF,
+ NETWORK_INTF,
+ NETWORK_HUB_INTF,
+ NETWORK_PEER_INTF,
+ NETWORK_ROUTER_INTF,
+ SERIAL_INTF,
+};
/* Adapter helpers */
Adapter *find_adapter(const gchar *name, GError **error);
@@ -51,5 +68,8 @@ inline int xtoi(const gchar *str) {
const gchar *get_uuid_name(const gchar *uuid);
+/* Interface helpers */
+gboolean intf_is_supported(const gchar *dbus_object_path, int intf_id);
+
#endif /* __HELPERS_H */
diff --git a/src/lib/input.c b/src/lib/input.c
index d11f650..a5e7f17 100644
--- a/src/lib/input.c
+++ b/src/lib/input.c
@@ -31,8 +31,6 @@
#include "marshallers.h"
#include "input.h"
-#define BLUEZ_DBUS_INPUT_INTERFACE "org.bluez.Input"
-
#define INPUT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), INPUT_TYPE, InputPrivate))
struct _InputPrivate {
@@ -143,12 +141,12 @@ static void input_post_init(Input *self, const gchar *dbus_object_path)
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_INPUT_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_INPUT_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_INPUT_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_INPUT_INTERFACE);
/* DBus signals connection */
diff --git a/src/lib/input.h b/src/lib/input.h
index 2f7721e..0dd7b17 100644
--- a/src/lib/input.h
+++ b/src/lib/input.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_INPUT_INTERFACE "org.bluez.Input"
+
/*
* Type macros
*/
diff --git a/src/lib/manager.c b/src/lib/manager.c
index 2713e43..978fd58 100644
--- a/src/lib/manager.c
+++ b/src/lib/manager.c
@@ -31,9 +31,6 @@
#include "marshallers.h"
#include "manager.h"
-#define BLUEZ_DBUS_MANAGER_PATH "/"
-#define BLUEZ_DBUS_MANAGER_INTERFACE "org.bluez.Manager"
-
#define MANAGER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), MANAGER_TYPE, ManagerPrivate))
struct _ManagerPrivate {
@@ -162,12 +159,12 @@ static void manager_init(Manager *self)
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_MANAGER_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_MANAGER_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_MANAGER_INTERFACE, BLUEZ_DBUS_MANAGER_PATH);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, BLUEZ_DBUS_MANAGER_PATH, BLUEZ_DBUS_MANAGER_INTERFACE);
diff --git a/src/lib/manager.h b/src/lib/manager.h
index 240aab8..770fd5e 100644
--- a/src/lib/manager.h
+++ b/src/lib/manager.h
@@ -26,6 +26,9 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_MANAGER_PATH "/"
+#define BLUEZ_DBUS_MANAGER_INTERFACE "org.bluez.Manager"
+
/*
* Type macros
*/
diff --git a/src/lib/network.c b/src/lib/network.c
index 94e7b67..092c05e 100644
--- a/src/lib/network.c
+++ b/src/lib/network.c
@@ -31,8 +31,6 @@
#include "marshallers.h"
#include "network.h"
-#define BLUEZ_DBUS_NETWORK_INTERFACE "org.bluez.Network"
-
#define NETWORK_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), NETWORK_TYPE, NetworkPrivate))
struct _NetworkPrivate {
@@ -156,12 +154,12 @@ static void network_post_init(Network *self, const gchar *dbus_object_path)
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_NETWORK_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_NETWORK_INTERFACE);
/* DBus signals connection */
diff --git a/src/lib/network.h b/src/lib/network.h
index c715d34..b0af8f2 100644
--- a/src/lib/network.h
+++ b/src/lib/network.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_NETWORK_INTERFACE "org.bluez.Network"
+
/*
* Type macros
*/
diff --git a/src/lib/network_hub.c b/src/lib/network_hub.c
index 3c09582..a746488 100644
--- a/src/lib/network_hub.c
+++ b/src/lib/network_hub.c
@@ -31,8 +31,6 @@
#include "marshallers.h"
#include "network_hub.h"
-#define BLUEZ_DBUS_NETWORK_HUB_INTERFACE "org.bluez.NetworkHub"
-
#define NETWORK_HUB_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), NETWORK_HUB_TYPE, NetworkHubPrivate))
struct _NetworkHubPrivate {
@@ -135,12 +133,12 @@ static void network_hub_post_init(NetworkHub *self, const gchar *dbus_object_pat
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_HUB_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_HUB_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_NETWORK_HUB_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_NETWORK_HUB_INTERFACE);
/* Properties init */
diff --git a/src/lib/network_hub.h b/src/lib/network_hub.h
index 3a30f57..f989e5e 100644
--- a/src/lib/network_hub.h
+++ b/src/lib/network_hub.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_NETWORK_HUB_INTERFACE "org.bluez.NetworkHub"
+
/*
* Type macros
*/
diff --git a/src/lib/network_peer.c b/src/lib/network_peer.c
index 918371a..032619d 100644
--- a/src/lib/network_peer.c
+++ b/src/lib/network_peer.c
@@ -31,8 +31,6 @@
#include "marshallers.h"
#include "network_peer.h"
-#define BLUEZ_DBUS_NETWORK_PEER_INTERFACE "org.bluez.NetworkPeer"
-
#define NETWORK_PEER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), NETWORK_PEER_TYPE, NetworkPeerPrivate))
struct _NetworkPeerPrivate {
@@ -135,12 +133,12 @@ static void network_peer_post_init(NetworkPeer *self, const gchar *dbus_object_p
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_PEER_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_PEER_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_NETWORK_PEER_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_NETWORK_PEER_INTERFACE);
/* Properties init */
diff --git a/src/lib/network_peer.h b/src/lib/network_peer.h
index b5a4da3..6ef5746 100644
--- a/src/lib/network_peer.h
+++ b/src/lib/network_peer.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_NETWORK_PEER_INTERFACE "org.bluez.NetworkPeer"
+
/*
* Type macros
*/
diff --git a/src/lib/network_router.c b/src/lib/network_router.c
index f196b6a..6f8c576 100644
--- a/src/lib/network_router.c
+++ b/src/lib/network_router.c
@@ -31,8 +31,6 @@
#include "marshallers.h"
#include "network_router.h"
-#define BLUEZ_DBUS_NETWORK_ROUTER_INTERFACE "org.bluez.NetworkRouter"
-
#define NETWORK_ROUTER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), NETWORK_ROUTER_TYPE, NetworkRouterPrivate))
struct _NetworkRouterPrivate {
@@ -135,12 +133,12 @@ static void network_router_post_init(NetworkRouter *self, const gchar *dbus_obje
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_ROUTER_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_NETWORK_ROUTER_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_NETWORK_ROUTER_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_NETWORK_ROUTER_INTERFACE);
/* Properties init */
diff --git a/src/lib/network_router.h b/src/lib/network_router.h
index c2b80fd..a163608 100644
--- a/src/lib/network_router.h
+++ b/src/lib/network_router.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_NETWORK_ROUTER_INTERFACE "org.bluez.NetworkRouter"
+
/*
* Type macros
*/
diff --git a/src/lib/serial.c b/src/lib/serial.c
index ce0ef67..8028e41 100644
--- a/src/lib/serial.c
+++ b/src/lib/serial.c
@@ -31,8 +31,6 @@
#include "marshallers.h"
#include "serial.h"
-#define BLUEZ_DBUS_SERIAL_INTERFACE "org.bluez.Serial"
-
#define SERIAL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), SERIAL_TYPE, SerialPrivate))
struct _SerialPrivate {
@@ -111,12 +109,12 @@ static void serial_post_init(Serial *self, const gchar *dbus_object_path)
}
g_assert(error == NULL);
- gchar *test_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_SERIAL_INTERFACE, "\">");
- if (!g_regex_match_simple(test_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
+ gchar *check_intf_regex_str = g_strconcat("<interface name=\"", BLUEZ_DBUS_SERIAL_INTERFACE, "\">", NULL);
+ if (!g_regex_match_simple(check_intf_regex_str, self->priv->introspection_xml, 0, 0)) {
g_critical("Interface \"%s\" does not exist in \"%s\"", BLUEZ_DBUS_SERIAL_INTERFACE, dbus_object_path);
g_assert(FALSE);
}
- g_free(test_intf_regex_str);
+ g_free(check_intf_regex_str);
self->priv->dbus_g_proxy = dbus_g_proxy_new_for_name(conn, BLUEZ_DBUS_NAME, dbus_object_path, BLUEZ_DBUS_SERIAL_INTERFACE);
}
diff --git a/src/lib/serial.h b/src/lib/serial.h
index c7ec2a2..97b071b 100644
--- a/src/lib/serial.h
+++ b/src/lib/serial.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
+#define BLUEZ_DBUS_SERIAL_INTERFACE "org.bluez.Serial"
+
/*
* Type macros
*/