summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac6
-rwxr-xr-xcontrib/gen-dbus-gobject.pl116
-rw-r--r--src/Makefile.am33
-rw-r--r--src/bt-monitor.c176
-rw-r--r--src/lib/adapter.c344
-rw-r--r--src/lib/adapter.h22
-rw-r--r--src/lib/audio.c45
-rw-r--r--src/lib/audio.h6
-rw-r--r--src/lib/device.c343
-rw-r--r--src/lib/device.h21
-rw-r--r--src/lib/input.c45
-rw-r--r--src/lib/input.h6
-rw-r--r--src/lib/manager.c38
-rw-r--r--src/lib/manager.h5
-rw-r--r--src/lib/marshallers.c86
-rw-r--r--src/lib/marshallers.h20
-rw-r--r--src/lib/network.c88
-rw-r--r--src/lib/network.h8
-rw-r--r--src/lib/serial.c15
-rw-r--r--src/lib/serial.h5
20 files changed, 1115 insertions, 313 deletions
diff --git a/configure.ac b/configure.ac
index 94b908c..1ae3821 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,10 +1,12 @@
AC_INIT([bluez-tools], [0.1], [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])
+AM_INIT_AUTOMAKE([1.11 no-define foreign -Wall subdir-objects])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
+AC_PROG_CC_C99
AC_PROG_INSTALL
+AM_PROG_CC_C_O
dnl 1.2.24
PKG_CHECK_MODULES([DBUS], [dbus-1 >= 1.2.16])
@@ -12,7 +14,7 @@ PKG_CHECK_MODULES([DBUS], [dbus-1 >= 1.2.16])
dnl 2.24.1
PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.22.4])
PKG_CHECK_MODULES([GOBJECT], [gobject-2.0 >= 2.22.4])
-PKG_CHECK_MODULES([GIO], [gio-2.0 >= 2.22.4])
+#PKG_CHECK_MODULES([GIO], [gio-2.0 >= 2.22.4])
dnl 0.86
PKG_CHECK_MODULES([DBUS_GLIB], [dbus-glib-1 >= 0.82])
diff --git a/contrib/gen-dbus-gobject.pl b/contrib/gen-dbus-gobject.pl
index 81af0e6..d1c9ab9 100755
--- a/contrib/gen-dbus-gobject.pl
+++ b/contrib/gen-dbus-gobject.pl
@@ -167,8 +167,9 @@ sub get_g_type {
$g_type = 'GValue *' if $bluez_type eq 'variant';
$g_type = 'guint8 ' if $bluez_type eq 'uint8';
$g_type = 'gboolean ' if $bluez_type eq 'boolean';
- $g_type = 'gint32' if $bluez_type eq 'int32';
- $g_type = 'GPtrArray *' if $bluez_type eq 'array{object}';
+ $g_type = 'gint32 ' if $bluez_type eq 'int32';
+ $g_type = 'guint32 ' if $bluez_type eq 'uint32';
+ $g_type = 'GPtrArray *' if $bluez_type eq 'array{object}' || $bluez_type eq 'array{string}';
die "unknown bluez type (1): $bluez_type\n" unless defined $g_type;
@@ -182,6 +183,8 @@ sub get_g_type_name {
$g_type_name = 'DBUS_TYPE_G_OBJECT_PATH' if $bluez_type eq 'object';
$g_type_name = 'G_TYPE_STRING' if $bluez_type eq 'string';
$g_type_name = 'G_TYPE_VALUE' if $bluez_type eq 'variant';
+ $g_type_name = 'G_TYPE_BOOLEAN' if $bluez_type eq 'boolean';
+ $g_type_name = 'G_TYPE_UINT' if $bluez_type eq 'uint32';
$g_type_name = 'DBUS_TYPE_G_STRING_VARIANT_HASHTABLE' if $bluez_type eq 'dict';
$g_type_name = 'DBUS_TYPE_G_OBJECT_ARRAY' if $bluez_type eq 'array{object}';
@@ -224,6 +227,9 @@ struct _{\$Object}Class {
GObjectClass parent_class;
};
+/* used by {\$OBJECT}_TYPE */
+GType {\$object}_get_type(void) G_GNUC_CONST;
+
/*
* Method definitions
*/
@@ -238,16 +244,28 @@ EOT
my $obj_uc = uc $obj;
my $method_defs = "";
+
for my $method (sort keys %{$node->{$intf}{'methods'}}) {
my @a = $method =~ /([A-Z]+[a-z]*)/g;
my %m = %{$node->{$intf}{'methods'}{$method}};
my $in_args = join ', ', (map "const ".get_g_type($_->{'type'}).$_->{'name'}, @{$m{'args'}});
$method_defs .=
- get_g_type($m{'ret'})."{\$object}_".(join '_', (map lc $_, @a))."($obj *self, ".
+ get_g_type($m{'ret'})."{\$object}_".(join '_', (map lc $_, @a))."({\$Object} *self, ".
($in_args eq '' ? "" : "$in_args, ")."GError **error);\n";
}
- chomp $method_defs;
+ $method_defs .= "\n";
+
+ $method_defs .= "const gchar *{\$object}_get_dbus_object_path({\$Object} *self);\n" unless defined $node->{'objectPath'};
+ for my $property (sort keys %{$node->{$intf}{'properties'}}) {
+ my @a = $property =~ /([A-Z]+[a-z]*)/g;
+ my %p = %{$node->{$intf}{'properties'}{$property}};
+
+ $method_defs .= get_g_type($p{'type'})."{\$object}_get_".(join '_', (map lc $_, @a))."({\$Object} *self, GError **error);\n";
+ $method_defs .= "void {\$object}_set_".(join '_', (map lc $_, @a))."({\$Object} *self, const ".get_g_type($p{'type'})."value, GError **error);\n" if $p{'mode'} eq 'readwrite';
+ }
+
+ $method_defs =~ s/\s+$//s;
my $output = "$HEADER\n$HEADER_TEMPLATE\n";
$output =~ s/{METHOD_DEFS}/$method_defs/;
@@ -358,13 +376,6 @@ static void _{\$object}_get_property(GObject *object, guint property_id, GValue
{
{\$Object} *self = {\$OBJECT}(object);
- {IF_PROPERTIES}
- GHashTable *properties = {\$object}_get_properties(self, NULL);
- if (properties == NULL) {
- return;
- }
- {FI_PROPERTIES}
-
switch (property_id) {
{GET_PROPERTIES}
@@ -372,10 +383,6 @@ static void _{\$object}_get_property(GObject *object, guint property_id, GValue
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
break;
}
-
- {IF_PROPERTIES}
- g_hash_table_unref(properties);
- {FI_PROPERTIES}
}
static void _{\$object}_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
@@ -395,6 +402,9 @@ static void _{\$object}_set_property(GObject *object, guint property_id, const G
{METHODS}
+/* Properties access methods */
+{PROPERTIES_ACCESS_METHODS}
+
{IF_SIGNALS}
/* Signals handlers */
{SIGNALS_HANDLERS}
@@ -417,7 +427,7 @@ EOT
my $in_args = join ', ', (map "const ".get_g_type($_->{'type'}).$_->{'name'}, @{$m{'args'}});
my $method_def =
- get_g_type($m{'ret'})."{\$object}_".(join '_', (map lc $_, @a))."($obj *self, ".
+ get_g_type($m{'ret'})."{\$object}_".(join '_', (map lc $_, @a))."({\$Object} *self, ".
($in_args eq '' ? "" : "$in_args, ")."GError **error)";
my $in_args2 = join ', ', (map get_g_type_name($_->{'type'}).", $_->{'name'}", @{$m{'args'}});
@@ -425,11 +435,11 @@ EOT
"/* $m{'decl'} */\n".
"$method_def\n".
"{\n".
- "\tg_assert(self != NULL);\n\n".
+ "\tg_assert({\$OBJECT}_IS(self));\n\n".
($m{'ret'} eq 'void' ?
"\tdbus_g_proxy_call(self->priv->dbus_g_proxy, \"$method\", error, ".($in_args2 eq '' ? "" : "$in_args2, ")."G_TYPE_INVALID, G_TYPE_INVALID);\n"
:
- "\t".get_g_type($m{'ret'})."ret;\n\n".
+ "\t".get_g_type($m{'ret'})."ret;\n".
"\tif (!dbus_g_proxy_call(self->priv->dbus_g_proxy, \"$method\", error, ".($in_args2 eq '' ? "" : "$in_args2, ")."G_TYPE_INVALID, ".($m{'ret'} eq 'void' ? "" : get_g_type_name($m{'ret'}).", &ret, ")."G_TYPE_INVALID)) {\n".
"\t\treturn NULL;\n".
"\t}\n\n".
@@ -502,6 +512,7 @@ EOT
my $properties_registration = "";
my $get_properties = "";
my $set_properties = "";
+ my $properties_access_methods = "";
unless (defined $node->{'objectPath'}) {
$enum_properties .= "\tPROP_DBUS_OBJECT_PATH, /* readwrite, construct only */\n";
$properties_registration .=
@@ -511,7 +522,7 @@ EOT
$get_properties .=
"\tcase PROP_DBUS_OBJECT_PATH:\n".
- "\t\tg_value_set_string(value, g_strdup(dbus_g_proxy_get_path(self->priv->dbus_g_proxy)));\n".
+ "\t\tg_value_set_string(value, g_strdup({\$object}_get_dbus_object_path(self)));\n".
"\t\tbreak;\n\n";
$set_properties .=
@@ -524,33 +535,66 @@ EOT
"\t\t{\$object}_post_init(self);\n".
"\t}\n".
"\t\tbreak;\n\n";
+
+ $properties_access_methods .=
+ "const gchar *{\$object}_get_dbus_object_path({\$Object} *self)\n".
+ "{\n".
+ "\tg_assert({\$OBJECT}_IS(self));\n\n".
+ "\treturn dbus_g_proxy_get_path(self->priv->dbus_g_proxy);\n".
+ "}\n\n";
}
for my $property (sort keys %{$node->{$intf}{'properties'}}) {
my @a = $property =~ /([A-Z]+[a-z]*)/g;
my %p = %{$node->{$intf}{'properties'}{$property}};
my $enum = "PROP_".(join '_', (map uc $_, @a));
+ my $property_get_method = "{\$object}_get_".(join '_', (map lc $_, @a));
+ my $property_set_method = "{\$object}_set_".(join '_', (map lc $_, @a));
$enum_properties .= "\t$enum, /* $p{'mode'} */\n";
$properties_registration .= "\t/* $p{'decl'} */\n";
- $get_properties .= "\tcase $enum:\n";
+ $get_properties .=
+ "\tcase $enum:\n".
+ "\t{\n".
+ "\t\tGError *error = NULL;\n";
+ $properties_access_methods .=
+ get_g_type($p{'type'})."$property_get_method({\$Object} *self, GError **error)\n".
+ "{\n".
+ "\tg_assert({\$OBJECT}_IS(self));\n\n".
+ "\tGHashTable *properties = {\$object}_get_properties(self, error);\n".
+ "\tg_return_val_if_fail(properties != NULL, ".(get_g_type($p{'type'}) =~ /\*$/ ? "NULL" : 0).");\n".
+ "\t".get_g_type($p{'type'})."ret = ";
if ($p{'type'} eq 'string' || $p{'type'} eq 'object') {
$properties_registration .= "\tpspec = g_param_spec_string(\"$property\", NULL, NULL, NULL, ".($p{'mode'} eq 'readonly' ? 'G_PARAM_READABLE' : 'G_PARAM_READWRITE').");\n";
- $get_properties .= "\t\tg_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, \"$property\")));\n";
+ $get_properties .= "\t\tg_value_set_string(value, $property_get_method(self, &error));\n";
+ $properties_access_methods .= "g_value_dup_string(g_hash_table_lookup(properties, \"$property\"));\n";
} elsif ($p{'type'} eq 'array{object}' || $p{'type'} eq 'array{string}') {
$properties_registration .= "\tpspec = g_param_spec_boxed(\"$property\", NULL, NULL, G_TYPE_PTR_ARRAY, ".($p{'mode'} eq 'readonly' ? 'G_PARAM_READABLE' : 'G_PARAM_READWRITE').");\n";
- $get_properties .= "\t\tg_value_set_boxed(value, g_value_dup_boxed(g_hash_table_lookup(properties, \"$property\")));\n";
+ $get_properties .= "\t\tg_value_set_boxed(value, $property_get_method(self, &error));\n";
+ $properties_access_methods .= "g_value_dup_boxed(g_hash_table_lookup(properties, \"$property\"));\n";
} elsif ($p{'type'} eq 'uint32') {
$properties_registration .= "\tpspec = g_param_spec_uint(\"$property\", NULL, NULL, 0, 65535, 0, ".($p{'mode'} eq 'readonly' ? 'G_PARAM_READABLE' : 'G_PARAM_READWRITE').");\n";
- $get_properties .= "\t\tg_value_set_uint(value, g_value_get_uint(g_hash_table_lookup(properties, \"$property\")));\n";
+ $get_properties .= "\t\tg_value_set_uint(value, $property_get_method(self, &error));\n";
+ $properties_access_methods .= "g_value_get_uint(g_hash_table_lookup(properties, \"$property\"));\n";
} elsif ($p{'type'} eq 'boolean') {
$properties_registration .= "\tpspec = g_param_spec_boolean(\"$property\", NULL, NULL, FALSE, ".($p{'mode'} eq 'readonly' ? 'G_PARAM_READABLE' : 'G_PARAM_READWRITE').");\n";
- $get_properties .= "\t\tg_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, \"$property\")));\n";
+ $get_properties .= "\t\tg_value_set_boolean(value, $property_get_method(self, &error));\n";
+ $properties_access_methods .= "g_value_get_boolean(g_hash_table_lookup(properties, \"$property\"));\n";
} else {
die "unknown property type: $p{'type'}\n";
}
$properties_registration .= "\tg_object_class_install_property(gobject_class, $enum, pspec);\n\n";
- $get_properties .= "\t\tbreak;\n\n";
+ $get_properties .=
+ "\t\tif (error != NULL) {\n".
+ "\t\t\tg_print(\"%s: %s\\n\", g_get_prgname(), error->message);\n".
+ "\t\t\tg_error_free(error);\n".
+ "\t\t}\n".
+ "\t}\n".
+ "\t\tbreak;\n\n";
+ $properties_access_methods .=
+ "\tg_hash_table_unref(properties);\n\n".
+ "\treturn ret;\n".
+ "}\n\n";
if ($p{'mode'} eq 'readwrite') {
$set_properties .=
@@ -564,12 +608,33 @@ EOT
"\t\t}\n".
"\t}\n".
"\t\tbreak;\n\n";
+
+ $properties_access_methods .=
+ "void $property_set_method({\$Object} *self, const ".get_g_type($p{'type'})."value, GError **error)\n".
+ "{\n".
+ "\tg_return_if_fail({\$OBJECT}_IS(self));\n\n".
+ "\tGValue t = {0};\n".
+ "\tg_value_init(&t, ".get_g_type_name($p{'type'}).");\n".
+ "\tg_value_set_".
+ ($p{'type'} eq 'string' ?
+ "string" : (
+ $p{'type'} eq 'uint32' ?
+ "uint" : (
+ $p{'type'} eq 'boolean' ?
+ "boolean" :
+ die "unknown setter type: $p{'type'}\n"
+ )
+ ))."(&t, value);\n".
+ "\t{\$object}_set_property(self, \"$property\", &t, error);\n".
+ "\tg_value_unset(&t);\n".
+ "}\n\n";
}
}
$enum_properties =~ s/^\t(.+), (\/\* .+? \*\/)\s+$/$1 $2/s;
$properties_registration =~ s/^\t(.+?)\s+$/$1/s;
$get_properties =~ s/^\t(.+?)\s+$/$1/s;
$set_properties =~ s/^\t(.+?)\s+$/$1/s;
+ $properties_access_methods =~ s/\s+$//s;
my $output = "$HEADER\n$SOURCE_TEMPLATE";
if (defined $node->{'objectPath'}) {
@@ -599,6 +664,7 @@ EOT
$output =~ s/{PROPERTIES_REGISTRATION}/$properties_registration/;
$output =~ s/{GET_PROPERTIES}/$get_properties/;
$output =~ s/{SET_PROPERTIES}/$set_properties/;
+ $output =~ s/{PROPERTIES_ACCESS_METHODS}/$properties_access_methods/;
$output =~ s/{METHODS}/$methods/;
$output =~ s/{\$OBJECT}/$obj_uc/g;
$output =~ s/{\$Object}/$obj/g;
diff --git a/src/Makefile.am b/src/Makefile.am
index 406fda6..a5391bb 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -6,27 +6,24 @@ BUILT_SOURCES = lib/marshallers.c lib/marshallers.h
GENMARSHAL_FLAGS = --prefix="g_cclosure_bluez_marshal" --g-fatal-warnings
lib/marshallers.h: lib/marshallers.list
- glib-genmarshal $(GENMARSHAL_FLAGS) \
- --header lib/marshallers.list > lib/marshallers.h
+ glib-genmarshal $(GENMARSHAL_FLAGS) --header lib/marshallers.list > lib/marshallers.h
lib/marshallers.c: lib/marshallers.list
- glib-genmarshal $(GENMARSHAL_FLAGS) \
- --body lib/marshallers.list > lib/marshallers.c
-
-lib_sources = lib/marshallers.c lib/marshallers.h \
- lib/dbus-common.c lib/dbus-common.h \
- lib/adapter.c lib/adapter.h \
- lib/audio.c lib/audio.h \
- lib/device.c lib/device.h \
- lib/input.c lib/input.h \
- lib/manager.c lib/manager.h \
- lib/network.c lib/network.h \
- lib/serial.c lib/serial.h
+ glib-genmarshal $(GENMARSHAL_FLAGS) --body lib/marshallers.list > lib/marshallers.c
+
+lib_sources = lib/marshallers.c lib/marshallers.h \
+ lib/dbus-common.c lib/dbus-common.h \
+ lib/helpers.c lib/helpers.h \
+ lib/adapter.c lib/adapter.h \
+ lib/audio.c lib/audio.h \
+ lib/device.c lib/device.h \
+ lib/input.c lib/input.h \
+ lib/manager.c lib/manager.h \
+ lib/network.c lib/network.h \
+ lib/serial.c lib/serial.h
bin_PROGRAMS = bt-monitor
bt_monitor_SOURCES = $(lib_sources) bt-monitor.c
-CLEANFILES = \
- Makefile.in \
- lib/marshallers.c \
- lib/marshallers.h
+CLEANFILES = Makefile.in lib/marshallers.c lib/marshallers.h
+
diff --git a/src/bt-monitor.c b/src/bt-monitor.c
index 69cb788..470ead8 100644
--- a/src/bt-monitor.c
+++ b/src/bt-monitor.c
@@ -29,29 +29,110 @@
#include <glib.h>
#include "lib/dbus-common.h"
+#include "lib/helpers.h"
#include "lib/adapter.h"
+#include "lib/device.h"
#include "lib/manager.h"
static gchar *adapter_name = NULL;
+static GPtrArray *captured_adapters = NULL;
+static GPtrArray *captured_devices = NULL;
-static void property_changed_handler(Manager *manager, const gchar *name, const GValue *value, gpointer data)
+/*
+ * Manager signals
+ */
+static void manager_adapter_added(Manager *manager, const gchar *adapter_path, gpointer data)
+{
+ g_print("[MANAGER] adapter added: %s\n", adapter_path);
+
+ if (adapter_name == NULL) {
+ Adapter *adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
+ g_ptr_array_add(captured_adapters, adapter);
+ }
+}
+
+static void manager_adapter_removed(Manager *manager, const gchar *adapter_path, gpointer data)
+{
+ g_print("[MANAGER] adapter removed: %s\n", adapter_path);
+}
+
+static void manager_default_adapter_changed(Manager *manager, const gchar *adapter_path, gpointer data)
+{
+ g_print("[MANAGER] default adapter changed: %s\n", adapter_path);
+}
+
+static void manager_property_changed(Manager *manager, const gchar *name, const GValue *value, gpointer data)
+{
+ g_print("[MANAGER] property changed: %s -> %s\n", name, g_strdup_value_contents(value));
+}
+
+/*
+ * Adapter signals
+ */
+static void adapter_device_created(Adapter *adapter, const gchar *device_path, gpointer data)
+{
+ g_print("[ADAPTER] device created: %s\n", device);
+}
+
+static void adapter_device_disappeared(Adapter *adapter, const gchar *address, gpointer data)
+{
+ g_print("[ADAPTER] device disappeared: %s\n", address);
+}
+
+static void adapter_device_found(Adapter *adapter, const gchar *address, gpointer data)
+{
+ g_print("[ADAPTER] device found: %s\n", address);
+}
+
+static void adapter_device_removed(Adapter *adapter, const gchar *device_path, gpointer data)
+{
+ g_print("[ADAPTER] device removed: %s\n", device);
+}
+
+static void adapter_property_changed(Adapter *adapter, const gchar *name, const GValue *value, gpointer data)
+{
+ g_print("[ADAPTER] property changed: %s -> %s\n", name, g_strdup_value_contents(value));
+}
+
+/*
+ * Device signals
+ */
+static void device_disconnect_requested(Device *device, gpointer data)
{
- g_print("property changed: %s\n", name);
+ g_print("[DEVICE] disconnect requested\n");
}
-static void adapter_added_handler(Manager *manager, const gchar *adapter_path, gpointer data)
+static void device_node_created(Device *device, const gchar *node, gpointer data)
{
- g_print("adapter added: %s\n", adapter_path);
+ g_print("[DEVICE] node created: %s\n", node);
}
-static void adapter_removed_handler(Manager *manager, const gchar *adapter_path, gpointer data)
+static void device_node_removed(Device *device, const gchar *node, gpointer data)
{
- g_print("adapter removed: %s\n", adapter_path);
+ g_print("[DEVICE] node removed: %s\n", node);
}
-static void default_adapter_changed_handler(Manager *manager, const gchar *adapter_path, gpointer data)
+static void device_property_changed(Device *device, const gchar *name, const GValue *value, gpointer data)
{
- g_print("default adapter changed: %s\n", adapter_path);
+ g_print("[DEVICE] property changed: %s -> %s\n", name, g_strdup_value_contents(value));
+}
+
+/*
+ * Service signals
+ */
+static void audio_property_changed()
+{
+
+}
+
+static void input_property_changed()
+{
+
+}
+
+static void network_property_changed()
+{
+
}
static GOptionEntry entries[] = {
@@ -71,9 +152,6 @@ int main(int argc, char *argv[])
if (!g_option_context_parse(context, &argc, &argv, &error)) {
g_print("%s: %s\n", g_get_prgname(), error->message);
g_print("Try `%s --help` for more information.\n", g_get_prgname());
- // ME: should I call this functions?
- g_error_free(error);
- g_option_context_free(context);
exit(EXIT_FAILURE);
}
g_option_context_free(context);
@@ -84,30 +162,61 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
+ captured_adapters = g_ptr_array_new();
+ captured_devices = g_ptr_array_new();
+
Manager *manager = g_object_new(MANAGER_TYPE, NULL);
- //if (!adapter_name) {
- // Listen for all events
- //} else {
- // Listen for an adapter events
- //Adapter *adapter_obj;
- //if (!find_adapter(adapter, &error, &adapter_obj)) {
- // g_printerr("Couldn't find adapter '%s': %s\n", adapter, error->message);
- // g_error_free(error);
- // exit(EXIT_FAILURE);
- //}
- //}
-
- g_signal_connect(manager, "PropertyChanged", G_CALLBACK(property_changed_handler), NULL);
- g_signal_connect(manager, "AdapterAdded", G_CALLBACK(adapter_added_handler), NULL);
- g_signal_connect(manager, "AdapterRemoved", G_CALLBACK(adapter_removed_handler), NULL);
- g_signal_connect(manager, "DefaultAdapterChanged", G_CALLBACK(default_adapter_changed_handler), NULL);
-
- gchar *adapter_path;
- manager_get_default_adapter(manager, &error, &adapter_path);
-
- //Adapter *adapter = g_object_new(ADAPTER_TYPE, "dbus_object_path", adapter_path, NULL);
- Adapter *adapter = g_object_new(ADAPTER_TYPE, NULL);
+ if (adapter_name != NULL) {
+ gchar *adapter_path = find_adapter_by_name(adapter_name, &error);
+ if (error != NULL) {
+ g_printerr("%s\n", error->message);
+ exit(EXIT_FAILURE);
+ }
+
+ g_print("found adapter: %s\n", adapter_path);
+
+ Adapter *adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
+ g_ptr_array_add(captured_adapters, adapter);
+ g_free(adapter_path);
+ } else {
+
+ }
+
+ g_signal_connect(manager, "AdapterAdded", G_CALLBACK(manager_adapter_added), NULL);
+ g_signal_connect(manager, "AdapterRemoved", G_CALLBACK(manager_adapter_removed), NULL);
+ g_signal_connect(manager, "DefaultAdapterChanged", G_CALLBACK(manager_default_adapter_changed), NULL);
+ g_signal_connect(manager, "PropertyChanged", G_CALLBACK(manager_property_changed), NULL);
+
+ // Capturing signals from adapters
+ for (int i = 0; i < captured_adapters->len; i++) {
+ Adapter *adapter = ADAPTER(g_ptr_array_index(captured_adapters, i));
+
+ g_signal_connect(adapter, "DeviceCreated", G_CALLBACK(adapter_device_created), NULL);
+ g_signal_connect(adapter, "DeviceDisappeared", G_CALLBACK(adapter_device_disappeared), NULL);
+ g_signal_connect(adapter, "DeviceFound", G_CALLBACK(adapter_device_found), NULL);
+ g_signal_connect(adapter, "DeviceRemoved", G_CALLBACK(adapter_device_removed), NULL);
+ g_signal_connect(adapter, "PropertyChanged", G_CALLBACK(adapter_property_changed), NULL);
+
+ // Capturing signals from devices
+ GValue adapter_prop_devices = {0};
+ g_value_init(&adapter_prop_devices, G_TYPE_PTR_ARRAY);
+ g_object_get_property(G_OBJECT(adapter), "Devices", &adapter_prop_devices);
+
+ GPtrArray *devices_list = g_value_get_boxed(&adapter_prop_devices);
+ for (int i = 0; i < devices_list->len; i++) {
+ gchar *device_path = g_ptr_array_index(devices_list, i);
+ Device *device = g_object_new(DEVICE_TYPE, "DBusObjectPath", device_path, NULL);
+ g_ptr_array_add(captured_devices, device);
+
+ g_signal_connect(device, "DisconnectRequested", G_CALLBACK(device_disconnect_requested), NULL);
+ g_signal_connect(device, "NodeCreated", G_CALLBACK(device_node_created), NULL);
+ g_signal_connect(device, "NodeRemoved", G_CALLBACK(device_node_removed), NULL);
+ g_signal_connect(device, "PropertyChanged", G_CALLBACK(device_property_changed), NULL);
+ }
+
+ g_value_unset(&adapter_prop_devices);
+ }
GMainLoop *mainloop;
mainloop = g_main_loop_new(NULL, FALSE);
@@ -115,3 +224,4 @@ int main(int argc, char *argv[])
exit(EXIT_SUCCESS);
}
+
diff --git a/src/lib/adapter.c b/src/lib/adapter.c
index 8d877d6..4a82b8f 100644
--- a/src/lib/adapter.c
+++ b/src/lib/adapter.c
@@ -211,66 +211,136 @@ static void _adapter_get_property(GObject *object, guint property_id, GValue *va
{
Adapter *self = ADAPTER(object);
- GHashTable *properties = adapter_get_properties(self, NULL);
- if (properties == NULL) {
- return;
- }
-
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(dbus_g_proxy_get_path(self->priv->dbus_g_proxy)));
+ g_value_set_string(value, g_strdup(adapter_get_dbus_object_path(self)));
break;
case PROP_ADDRESS:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "Address")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, adapter_get_address(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_CLASS:
- g_value_set_uint(value, g_value_get_uint(g_hash_table_lookup(properties, "Class")));
+ {
+ GError *error = NULL;
+ g_value_set_uint(value, adapter_get_class(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_DEVICES:
- g_value_set_boxed(value, g_value_dup_boxed(g_hash_table_lookup(properties, "Devices")));
+ {
+ GError *error = NULL;
+ g_value_set_boxed(value, adapter_get_devices(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_DISCOVERABLE:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Discoverable")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, adapter_get_discoverable(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_DISCOVERABLE_TIMEOUT:
- g_value_set_uint(value, g_value_get_uint(g_hash_table_lookup(properties, "DiscoverableTimeout")));
+ {
+ GError *error = NULL;
+ g_value_set_uint(value, adapter_get_discoverable_timeout(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_DISCOVERING:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Discovering")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, adapter_get_discovering(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_NAME:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "Name")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, adapter_get_name(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_PAIRABLE:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Pairable")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, adapter_get_pairable(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_PAIREABLE_TIMEOUT:
- g_value_set_uint(value, g_value_get_uint(g_hash_table_lookup(properties, "PaireableTimeout")));
+ {
+ GError *error = NULL;
+ g_value_set_uint(value, adapter_get_paireable_timeout(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_POWERED:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Powered")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, adapter_get_powered(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_UUIDS:
- g_value_set_boxed(value, g_value_dup_boxed(g_hash_table_lookup(properties, "UUIDs")));
+ {
+ GError *error = NULL;
+ g_value_set_boxed(value, adapter_get_uuids(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
break;
}
-
- g_hash_table_unref(properties);
}
static void _adapter_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
@@ -365,7 +435,7 @@ static void _adapter_set_property(GObject *object, guint property_id, const GVal
/* void CancelDeviceCreation(string address) */
void adapter_cancel_device_creation(Adapter *self, const gchar *address, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "CancelDeviceCreation", error, G_TYPE_STRING, address, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -373,10 +443,9 @@ void adapter_cancel_device_creation(Adapter *self, const gchar *address, GError
/* object CreateDevice(string address) */
gchar *adapter_create_device(Adapter *self, const gchar *address, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
gchar *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "CreateDevice", error, G_TYPE_STRING, address, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -387,10 +456,9 @@ gchar *adapter_create_device(Adapter *self, const gchar *address, GError **error
/* object CreatePairedDevice(string address, object agent, string capability) */
gchar *adapter_create_paired_device(Adapter *self, const gchar *address, const gchar *agent, const gchar *capability, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
gchar *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "CreatePairedDevice", error, G_TYPE_STRING, address, DBUS_TYPE_G_OBJECT_PATH, agent, G_TYPE_STRING, capability, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -401,10 +469,9 @@ gchar *adapter_create_paired_device(Adapter *self, const gchar *address, const g
/* object FindDevice(string address) */
gchar *adapter_find_device(Adapter *self, const gchar *address, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
gchar *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "FindDevice", error, G_TYPE_STRING, address, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -415,10 +482,9 @@ gchar *adapter_find_device(Adapter *self, const gchar *address, GError **error)
/* dict GetProperties() */
GHashTable *adapter_get_properties(Adapter *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
GHashTable *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetProperties", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -429,7 +495,7 @@ GHashTable *adapter_get_properties(Adapter *self, GError **error)
/* void RegisterAgent(object agent, string capability) */
void adapter_register_agent(Adapter *self, const gchar *agent, const gchar *capability, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "RegisterAgent", error, DBUS_TYPE_G_OBJECT_PATH, agent, G_TYPE_STRING, capability, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -437,7 +503,7 @@ void adapter_register_agent(Adapter *self, const gchar *agent, const gchar *capa
/* void ReleaseSession() */
void adapter_release_session(Adapter *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "ReleaseSession", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -445,7 +511,7 @@ void adapter_release_session(Adapter *self, GError **error)
/* void RemoveDevice(object device) */
void adapter_remove_device(Adapter *self, const gchar *device, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "RemoveDevice", error, DBUS_TYPE_G_OBJECT_PATH, device, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -453,7 +519,7 @@ void adapter_remove_device(Adapter *self, const gchar *device, GError **error)
/* void RequestSession() */
void adapter_request_session(Adapter *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "RequestSession", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -461,7 +527,7 @@ void adapter_request_session(Adapter *self, GError **error)
/* void SetProperty(string name, variant value) */
void adapter_set_property(Adapter *self, const gchar *name, const GValue *value, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "SetProperty", error, G_TYPE_STRING, name, G_TYPE_VALUE, value, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -469,7 +535,7 @@ void adapter_set_property(Adapter *self, const gchar *name, const GValue *value,
/* void StartDiscovery() */
void adapter_start_discovery(Adapter *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "StartDiscovery", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -477,7 +543,7 @@ void adapter_start_discovery(Adapter *self, GError **error)
/* void StopDiscovery() */
void adapter_stop_discovery(Adapter *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "StopDiscovery", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -485,11 +551,217 @@ void adapter_stop_discovery(Adapter *self, GError **error)
/* void UnregisterAgent(object agent) */
void adapter_unregister_agent(Adapter *self, const gchar *agent, GError **error)
{
- g_assert(self != NULL);
+ g_assert(ADAPTER_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "UnregisterAgent", error, DBUS_TYPE_G_OBJECT_PATH, agent, G_TYPE_INVALID, G_TYPE_INVALID);
}
+/* Properties access methods */
+const gchar *adapter_get_dbus_object_path(Adapter *self)
+{
+ g_assert(ADAPTER_IS(self));
+
+ return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
+}
+
+gchar *adapter_get_address(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "Address"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+guint32 adapter_get_class(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ guint32 ret = g_value_get_uint(g_hash_table_lookup(properties, "Class"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+GPtrArray *adapter_get_devices(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ GPtrArray *ret = g_value_dup_boxed(g_hash_table_lookup(properties, "Devices"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gboolean adapter_get_discoverable(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Discoverable"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+void adapter_set_discoverable(Adapter *self, const gboolean value, GError **error)
+{
+ g_return_if_fail(ADAPTER_IS(self));
+
+ GValue t = {0};
+ g_value_init(&t, G_TYPE_BOOLEAN);
+ g_value_set_boolean(&t, value);
+ adapter_set_property(self, "Discoverable", &t, error);
+ g_value_unset(&t);
+}
+
+guint32 adapter_get_discoverable_timeout(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ guint32 ret = g_value_get_uint(g_hash_table_lookup(properties, "DiscoverableTimeout"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+void adapter_set_discoverable_timeout(Adapter *self, const guint32 value, GError **error)
+{
+ g_return_if_fail(ADAPTER_IS(self));
+
+ GValue t = {0};
+ g_value_init(&t, G_TYPE_UINT);
+ g_value_set_uint(&t, value);
+ adapter_set_property(self, "DiscoverableTimeout", &t, error);
+ g_value_unset(&t);
+}
+
+gboolean adapter_get_discovering(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Discovering"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gchar *adapter_get_name(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "Name"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+void adapter_set_name(Adapter *self, const gchar *value, GError **error)
+{
+ g_return_if_fail(ADAPTER_IS(self));
+
+ GValue t = {0};
+ g_value_init(&t, G_TYPE_STRING);
+ g_value_set_string(&t, value);
+ adapter_set_property(self, "Name", &t, error);
+ g_value_unset(&t);
+}
+
+gboolean adapter_get_pairable(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Pairable"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+void adapter_set_pairable(Adapter *self, const gboolean value, GError **error)
+{
+ g_return_if_fail(ADAPTER_IS(self));
+
+ GValue t = {0};
+ g_value_init(&t, G_TYPE_BOOLEAN);
+ g_value_set_boolean(&t, value);
+ adapter_set_property(self, "Pairable", &t, error);
+ g_value_unset(&t);
+}
+
+guint32 adapter_get_paireable_timeout(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ guint32 ret = g_value_get_uint(g_hash_table_lookup(properties, "PaireableTimeout"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+void adapter_set_paireable_timeout(Adapter *self, const guint32 value, GError **error)
+{
+ g_return_if_fail(ADAPTER_IS(self));
+
+ GValue t = {0};
+ g_value_init(&t, G_TYPE_UINT);
+ g_value_set_uint(&t, value);
+ adapter_set_property(self, "PaireableTimeout", &t, error);
+ g_value_unset(&t);
+}
+
+gboolean adapter_get_powered(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Powered"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+void adapter_set_powered(Adapter *self, const gboolean value, GError **error)
+{
+ g_return_if_fail(ADAPTER_IS(self));
+
+ GValue t = {0};
+ g_value_init(&t, G_TYPE_BOOLEAN);
+ g_value_set_boolean(&t, value);
+ adapter_set_property(self, "Powered", &t, error);
+ g_value_unset(&t);
+}
+
+GPtrArray *adapter_get_uuids(Adapter *self, GError **error)
+{
+ g_assert(ADAPTER_IS(self));
+
+ GHashTable *properties = adapter_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ GPtrArray *ret = g_value_dup_boxed(g_hash_table_lookup(properties, "UUIDs"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
/* Signals handlers */
static void device_created_handler(DBusGProxy *dbus_g_proxy, const gchar *device, gpointer data)
{
diff --git a/src/lib/adapter.h b/src/lib/adapter.h
index 3b15e4d..f18d5f7 100644
--- a/src/lib/adapter.h
+++ b/src/lib/adapter.h
@@ -51,6 +51,9 @@ struct _AdapterClass {
GObjectClass parent_class;
};
+/* used by ADAPTER_TYPE */
+GType adapter_get_type(void) G_GNUC_CONST;
+
/*
* Method definitions
*/
@@ -68,5 +71,24 @@ void adapter_start_discovery(Adapter *self, GError **error);
void adapter_stop_discovery(Adapter *self, GError **error);
void adapter_unregister_agent(Adapter *self, const gchar *agent, GError **error);
+const gchar *adapter_get_dbus_object_path(Adapter *self);
+gchar *adapter_get_address(Adapter *self, GError **error);
+guint32 adapter_get_class(Adapter *self, GError **error);
+GPtrArray *adapter_get_devices(Adapter *self, GError **error);
+gboolean adapter_get_discoverable(Adapter *self, GError **error);
+void adapter_set_discoverable(Adapter *self, const gboolean value, GError **error);
+guint32 adapter_get_discoverable_timeout(Adapter *self, GError **error);
+void adapter_set_discoverable_timeout(Adapter *self, const guint32 value, GError **error);
+gboolean adapter_get_discovering(Adapter *self, GError **error);
+gchar *adapter_get_name(Adapter *self, GError **error);
+void adapter_set_name(Adapter *self, const gchar *value, GError **error);
+gboolean adapter_get_pairable(Adapter *self, GError **error);
+void adapter_set_pairable(Adapter *self, const gboolean value, GError **error);
+guint32 adapter_get_paireable_timeout(Adapter *self, GError **error);
+void adapter_set_paireable_timeout(Adapter *self, const guint32 value, GError **error);
+gboolean adapter_get_powered(Adapter *self, GError **error);
+void adapter_set_powered(Adapter *self, const gboolean value, GError **error);
+GPtrArray *adapter_get_uuids(Adapter *self, GError **error);
+
#endif /* __ADAPTER_H */
diff --git a/src/lib/audio.c b/src/lib/audio.c
index aad9d1f..c7052b7 100644
--- a/src/lib/audio.c
+++ b/src/lib/audio.c
@@ -109,26 +109,26 @@ static void _audio_get_property(GObject *object, guint property_id, GValue *valu
{
Audio *self = AUDIO(object);
- GHashTable *properties = audio_get_properties(self, NULL);
- if (properties == NULL) {
- return;
- }
-
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(dbus_g_proxy_get_path(self->priv->dbus_g_proxy)));
+ g_value_set_string(value, g_strdup(audio_get_dbus_object_path(self)));
break;
case PROP_STATE:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "State")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, audio_get_state(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
break;
}
-
- g_hash_table_unref(properties);
}
static void _audio_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
@@ -157,7 +157,7 @@ static void _audio_set_property(GObject *object, guint property_id, const GValue
/* void Connect() */
void audio_connect(Audio *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(AUDIO_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "Connect", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -165,7 +165,7 @@ void audio_connect(Audio *self, GError **error)
/* void Disconnect() */
void audio_disconnect(Audio *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(AUDIO_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "Disconnect", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -173,10 +173,9 @@ void audio_disconnect(Audio *self, GError **error)
/* dict GetProperties() */
GHashTable *audio_get_properties(Audio *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(AUDIO_IS(self));
GHashTable *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetProperties", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -184,6 +183,26 @@ GHashTable *audio_get_properties(Audio *self, GError **error)
return ret;
}
+/* Properties access methods */
+const gchar *audio_get_dbus_object_path(Audio *self)
+{
+ g_assert(AUDIO_IS(self));
+
+ return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
+}
+
+gchar *audio_get_state(Audio *self, GError **error)
+{
+ g_assert(AUDIO_IS(self));
+
+ GHashTable *properties = audio_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "State"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
/* Signals handlers */
static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name, const GValue *value, gpointer data)
{
diff --git a/src/lib/audio.h b/src/lib/audio.h
index ac0c1c4..0a74154 100644
--- a/src/lib/audio.h
+++ b/src/lib/audio.h
@@ -51,6 +51,9 @@ struct _AudioClass {
GObjectClass parent_class;
};
+/* used by AUDIO_TYPE */
+GType audio_get_type(void) G_GNUC_CONST;
+
/*
* Method definitions
*/
@@ -58,5 +61,8 @@ void audio_connect(Audio *self, GError **error);
void audio_disconnect(Audio *self, GError **error);
GHashTable *audio_get_properties(Audio *self, GError **error);
+const gchar *audio_get_dbus_object_path(Audio *self);
+gchar *audio_get_state(Audio *self, GError **error);
+
#endif /* __AUDIO_H */
diff --git a/src/lib/device.c b/src/lib/device.c
index 00560f2..ae3b9a3 100644
--- a/src/lib/device.c
+++ b/src/lib/device.c
@@ -208,74 +208,158 @@ static void _device_get_property(GObject *object, guint property_id, GValue *val
{
Device *self = DEVICE(object);
- GHashTable *properties = device_get_properties(self, NULL);
- if (properties == NULL) {
- return;
- }
-
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(dbus_g_proxy_get_path(self->priv->dbus_g_proxy)));
+ g_value_set_string(value, g_strdup(device_get_dbus_object_path(self)));
break;
case PROP_ADAPTER:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "Adapter")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, device_get_adapter(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_ADDRESS:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "Address")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, device_get_address(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_ALIAS:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "Alias")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, device_get_alias(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_BLOCKED:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Blocked")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, device_get_blocked(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_CLASS:
- g_value_set_uint(value, g_value_get_uint(g_hash_table_lookup(properties, "Class")));
+ {
+ GError *error = NULL;
+ g_value_set_uint(value, device_get_class(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_CONNECTED:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Connected")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, device_get_connected(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_ICON:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "Icon")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, device_get_icon(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_LEGACY_PAIRING:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "LegacyPairing")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, device_get_legacy_pairing(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_NAME:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "Name")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, device_get_name(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_NODES:
- g_value_set_boxed(value, g_value_dup_boxed(g_hash_table_lookup(properties, "Nodes")));
+ {
+ GError *error = NULL;
+ g_value_set_boxed(value, device_get_nodes(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_PAIRED:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Paired")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, device_get_paired(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_TRUSTED:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Trusted")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, device_get_trusted(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_UUIDS:
- g_value_set_boxed(value, g_value_dup_boxed(g_hash_table_lookup(properties, "UUIDs")));
+ {
+ GError *error = NULL;
+ g_value_set_boxed(value, device_get_uuids(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
break;
}
-
- g_hash_table_unref(properties);
}
static void _device_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
@@ -337,7 +421,7 @@ static void _device_set_property(GObject *object, guint property_id, const GValu
/* void CancelDiscovery() */
void device_cancel_discovery(Device *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(DEVICE_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "CancelDiscovery", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -345,10 +429,9 @@ void device_cancel_discovery(Device *self, GError **error)
/* object CreateNode(string uuid) */
gchar *device_create_node(Device *self, const gchar *uuid, GError **error)
{
- g_assert(self != NULL);
+ g_assert(DEVICE_IS(self));
gchar *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "CreateNode", error, G_TYPE_STRING, uuid, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -359,7 +442,7 @@ gchar *device_create_node(Device *self, const gchar *uuid, GError **error)
/* void Disconnect() */
void device_disconnect(Device *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(DEVICE_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "Disconnect", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -367,10 +450,9 @@ void device_disconnect(Device *self, GError **error)
/* dict DiscoverServices(string pattern) */
GHashTable *device_discover_services(Device *self, const gchar *pattern, GError **error)
{
- g_assert(self != NULL);
+ g_assert(DEVICE_IS(self));
GHashTable *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "DiscoverServices", error, G_TYPE_STRING, pattern, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -381,10 +463,9 @@ GHashTable *device_discover_services(Device *self, const gchar *pattern, GError
/* dict GetProperties() */
GHashTable *device_get_properties(Device *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(DEVICE_IS(self));
GHashTable *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetProperties", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -395,10 +476,9 @@ GHashTable *device_get_properties(Device *self, GError **error)
/* array{object} ListNodes() */
GPtrArray *device_list_nodes(Device *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(DEVICE_IS(self));
GPtrArray *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "ListNodes", error, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_ARRAY, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -409,7 +489,7 @@ GPtrArray *device_list_nodes(Device *self, GError **error)
/* void RemoveNode(object node) */
void device_remove_node(Device *self, const gchar *node, GError **error)
{
- g_assert(self != NULL);
+ g_assert(DEVICE_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "RemoveNode", error, DBUS_TYPE_G_OBJECT_PATH, node, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -417,11 +497,208 @@ void device_remove_node(Device *self, const gchar *node, GError **error)
/* void SetProperty(string name, variant value) */
void device_set_property(Device *self, const gchar *name, const GValue *value, GError **error)
{
- g_assert(self != NULL);
+ g_assert(DEVICE_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "SetProperty", error, G_TYPE_STRING, name, G_TYPE_VALUE, value, G_TYPE_INVALID, G_TYPE_INVALID);
}
+/* Properties access methods */
+const gchar *device_get_dbus_object_path(Device *self)
+{
+ g_assert(DEVICE_IS(self));
+
+ return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
+}
+
+gchar *device_get_adapter(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "Adapter"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gchar *device_get_address(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "Address"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gchar *device_get_alias(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "Alias"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+void device_set_alias(Device *self, const gchar *value, GError **error)
+{
+ g_return_if_fail(DEVICE_IS(self));
+
+ GValue t = {0};
+ g_value_init(&t, G_TYPE_STRING);
+ g_value_set_string(&t, value);
+ device_set_property(self, "Alias", &t, error);
+ g_value_unset(&t);
+}
+
+gboolean device_get_blocked(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Blocked"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+void device_set_blocked(Device *self, const gboolean value, GError **error)
+{
+ g_return_if_fail(DEVICE_IS(self));
+
+ GValue t = {0};
+ g_value_init(&t, G_TYPE_BOOLEAN);
+ g_value_set_boolean(&t, value);
+ device_set_property(self, "Blocked", &t, error);
+ g_value_unset(&t);
+}
+
+guint32 device_get_class(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ guint32 ret = g_value_get_uint(g_hash_table_lookup(properties, "Class"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gboolean device_get_connected(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Connected"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gchar *device_get_icon(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "Icon"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gboolean device_get_legacy_pairing(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "LegacyPairing"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gchar *device_get_name(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "Name"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+GPtrArray *device_get_nodes(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ GPtrArray *ret = g_value_dup_boxed(g_hash_table_lookup(properties, "Nodes"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gboolean device_get_paired(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Paired"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gboolean device_get_trusted(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Trusted"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+void device_set_trusted(Device *self, const gboolean value, GError **error)
+{
+ g_return_if_fail(DEVICE_IS(self));
+
+ GValue t = {0};
+ g_value_init(&t, G_TYPE_BOOLEAN);
+ g_value_set_boolean(&t, value);
+ device_set_property(self, "Trusted", &t, error);
+ g_value_unset(&t);
+}
+
+GPtrArray *device_get_uuids(Device *self, GError **error)
+{
+ g_assert(DEVICE_IS(self));
+
+ GHashTable *properties = device_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ GPtrArray *ret = g_value_dup_boxed(g_hash_table_lookup(properties, "UUIDs"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
/* Signals handlers */
static void disconnect_requested_handler(DBusGProxy *dbus_g_proxy, gpointer data)
{
diff --git a/src/lib/device.h b/src/lib/device.h
index 30586d0..b00ba7e 100644
--- a/src/lib/device.h
+++ b/src/lib/device.h
@@ -51,6 +51,9 @@ struct _DeviceClass {
GObjectClass parent_class;
};
+/* used by DEVICE_TYPE */
+GType device_get_type(void) G_GNUC_CONST;
+
/*
* Method definitions
*/
@@ -63,5 +66,23 @@ GPtrArray *device_list_nodes(Device *self, GError **error);
void device_remove_node(Device *self, const gchar *node, GError **error);
void device_set_property(Device *self, const gchar *name, const GValue *value, GError **error);
+const gchar *device_get_dbus_object_path(Device *self);
+gchar *device_get_adapter(Device *self, GError **error);
+gchar *device_get_address(Device *self, GError **error);
+gchar *device_get_alias(Device *self, GError **error);
+void device_set_alias(Device *self, const gchar *value, GError **error);
+gboolean device_get_blocked(Device *self, GError **error);
+void device_set_blocked(Device *self, const gboolean value, GError **error);
+guint32 device_get_class(Device *self, GError **error);
+gboolean device_get_connected(Device *self, GError **error);
+gchar *device_get_icon(Device *self, GError **error);
+gboolean device_get_legacy_pairing(Device *self, GError **error);
+gchar *device_get_name(Device *self, GError **error);
+GPtrArray *device_get_nodes(Device *self, GError **error);
+gboolean device_get_paired(Device *self, GError **error);
+gboolean device_get_trusted(Device *self, GError **error);
+void device_set_trusted(Device *self, const gboolean value, GError **error);
+GPtrArray *device_get_uuids(Device *self, GError **error);
+
#endif /* __DEVICE_H */
diff --git a/src/lib/input.c b/src/lib/input.c
index 6a4cd89..c486b83 100644
--- a/src/lib/input.c
+++ b/src/lib/input.c
@@ -109,26 +109,26 @@ static void _input_get_property(GObject *object, guint property_id, GValue *valu
{
Input *self = INPUT(object);
- GHashTable *properties = input_get_properties(self, NULL);
- if (properties == NULL) {
- return;
- }
-
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(dbus_g_proxy_get_path(self->priv->dbus_g_proxy)));
+ g_value_set_string(value, g_strdup(input_get_dbus_object_path(self)));
break;
case PROP_CONNECTED:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Connected")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, input_get_connected(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
break;
}
-
- g_hash_table_unref(properties);
}
static void _input_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
@@ -157,7 +157,7 @@ static void _input_set_property(GObject *object, guint property_id, const GValue
/* void Connect() */
void input_connect(Input *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(INPUT_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "Connect", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -165,7 +165,7 @@ void input_connect(Input *self, GError **error)
/* void Disconnect() */
void input_disconnect(Input *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(INPUT_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "Disconnect", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -173,10 +173,9 @@ void input_disconnect(Input *self, GError **error)
/* dict GetProperties() */
GHashTable *input_get_properties(Input *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(INPUT_IS(self));
GHashTable *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetProperties", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -184,6 +183,26 @@ GHashTable *input_get_properties(Input *self, GError **error)
return ret;
}
+/* Properties access methods */
+const gchar *input_get_dbus_object_path(Input *self)
+{
+ g_assert(INPUT_IS(self));
+
+ return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
+}
+
+gboolean input_get_connected(Input *self, GError **error)
+{
+ g_assert(INPUT_IS(self));
+
+ GHashTable *properties = input_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Connected"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
/* Signals handlers */
static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name, const GValue *value, gpointer data)
{
diff --git a/src/lib/input.h b/src/lib/input.h
index 47f30b0..ddca212 100644
--- a/src/lib/input.h
+++ b/src/lib/input.h
@@ -51,6 +51,9 @@ struct _InputClass {
GObjectClass parent_class;
};
+/* used by INPUT_TYPE */
+GType input_get_type(void) G_GNUC_CONST;
+
/*
* Method definitions
*/
@@ -58,5 +61,8 @@ void input_connect(Input *self, GError **error);
void input_disconnect(Input *self, GError **error);
GHashTable *input_get_properties(Input *self, GError **error);
+const gchar *input_get_dbus_object_path(Input *self);
+gboolean input_get_connected(Input *self, GError **error);
+
#endif /* __INPUT_H */
diff --git a/src/lib/manager.c b/src/lib/manager.c
index af7382c..72f7c63 100644
--- a/src/lib/manager.c
+++ b/src/lib/manager.c
@@ -143,22 +143,22 @@ static void _manager_get_property(GObject *object, guint property_id, GValue *va
{
Manager *self = MANAGER(object);
- GHashTable *properties = manager_get_properties(self, NULL);
- if (properties == NULL) {
- return;
- }
-
switch (property_id) {
case PROP_ADAPTERS:
- g_value_set_boxed(value, g_value_dup_boxed(g_hash_table_lookup(properties, "Adapters")));
+ {
+ GError *error = NULL;
+ g_value_set_boxed(value, manager_get_adapters(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
break;
}
-
- g_hash_table_unref(properties);
}
static void _manager_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
@@ -177,10 +177,9 @@ static void _manager_set_property(GObject *object, guint property_id, const GVal
/* object DefaultAdapter() */
gchar *manager_default_adapter(Manager *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(MANAGER_IS(self));
gchar *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "DefaultAdapter", error, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -191,10 +190,9 @@ gchar *manager_default_adapter(Manager *self, GError **error)
/* object FindAdapter(string pattern) */
gchar *manager_find_adapter(Manager *self, const gchar *pattern, GError **error)
{
- g_assert(self != NULL);
+ g_assert(MANAGER_IS(self));
gchar *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "FindAdapter", error, G_TYPE_STRING, pattern, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -205,10 +203,9 @@ gchar *manager_find_adapter(Manager *self, const gchar *pattern, GError **error)
/* dict GetProperties() */
GHashTable *manager_get_properties(Manager *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(MANAGER_IS(self));
GHashTable *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetProperties", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -216,6 +213,19 @@ GHashTable *manager_get_properties(Manager *self, GError **error)
return ret;
}
+/* Properties access methods */
+GPtrArray *manager_get_adapters(Manager *self, GError **error)
+{
+ g_assert(MANAGER_IS(self));
+
+ GHashTable *properties = manager_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ GPtrArray *ret = g_value_dup_boxed(g_hash_table_lookup(properties, "Adapters"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
/* Signals handlers */
static void adapter_added_handler(DBusGProxy *dbus_g_proxy, const gchar *adapter, gpointer data)
{
diff --git a/src/lib/manager.h b/src/lib/manager.h
index 8ebb7a4..48445a5 100644
--- a/src/lib/manager.h
+++ b/src/lib/manager.h
@@ -51,6 +51,9 @@ struct _ManagerClass {
GObjectClass parent_class;
};
+/* used by MANAGER_TYPE */
+GType manager_get_type(void) G_GNUC_CONST;
+
/*
* Method definitions
*/
@@ -58,5 +61,7 @@ gchar *manager_default_adapter(Manager *self, GError **error);
gchar *manager_find_adapter(Manager *self, const gchar *pattern, GError **error);
GHashTable *manager_get_properties(Manager *self, GError **error);
+GPtrArray *manager_get_adapters(Manager *self, GError **error);
+
#endif /* __MANAGER_H */
diff --git a/src/lib/marshallers.c b/src/lib/marshallers.c
deleted file mode 100644
index 0d4eca4..0000000
--- a/src/lib/marshallers.c
+++ /dev/null
@@ -1,86 +0,0 @@
-
-#include <glib-object.h>
-
-
-#ifdef G_ENABLE_DEBUG
-#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)
-#define g_marshal_value_peek_char(v) g_value_get_char (v)
-#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)
-#define g_marshal_value_peek_int(v) g_value_get_int (v)
-#define g_marshal_value_peek_uint(v) g_value_get_uint (v)
-#define g_marshal_value_peek_long(v) g_value_get_long (v)
-#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)
-#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)
-#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)
-#define g_marshal_value_peek_enum(v) g_value_get_enum (v)
-#define g_marshal_value_peek_flags(v) g_value_get_flags (v)
-#define g_marshal_value_peek_float(v) g_value_get_float (v)
-#define g_marshal_value_peek_double(v) g_value_get_double (v)
-#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)
-#define g_marshal_value_peek_param(v) g_value_get_param (v)
-#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)
-#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)
-#define g_marshal_value_peek_object(v) g_value_get_object (v)
-#else /* !G_ENABLE_DEBUG */
-/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
- * Do not access GValues directly in your code. Instead, use the
- * g_value_get_*() functions
- */
-#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int
-#define g_marshal_value_peek_char(v) (v)->data[0].v_int
-#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint
-#define g_marshal_value_peek_int(v) (v)->data[0].v_int
-#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint
-#define g_marshal_value_peek_long(v) (v)->data[0].v_long
-#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong
-#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64
-#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64
-#define g_marshal_value_peek_enum(v) (v)->data[0].v_long
-#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong
-#define g_marshal_value_peek_float(v) (v)->data[0].v_float
-#define g_marshal_value_peek_double(v) (v)->data[0].v_double
-#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer
-#endif /* !G_ENABLE_DEBUG */
-
-
-/* VOID:STRING,BOXED (lib/marshallers.list:1) */
-void
-g_cclosure_bluez_marshal_VOID__STRING_BOXED (GClosure *closure,
- GValue *return_value G_GNUC_UNUSED,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint G_GNUC_UNUSED,
- gpointer marshal_data)
-{
- typedef void (*GMarshalFunc_VOID__STRING_BOXED) (gpointer data1,
- gpointer arg_1,
- gpointer arg_2,
- gpointer data2);
- register GMarshalFunc_VOID__STRING_BOXED callback;
- register GCClosure *cc = (GCClosure*) closure;
- register gpointer data1, data2;
-
- g_return_if_fail (n_param_values == 3);
-
- if (G_CCLOSURE_SWAP_DATA (closure))
- {
- data1 = closure->data;
- data2 = g_value_peek_pointer (param_values + 0);
- }
- else
- {
- data1 = g_value_peek_pointer (param_values + 0);
- data2 = closure->data;
- }
- callback = (GMarshalFunc_VOID__STRING_BOXED) (marshal_data ? marshal_data : cc->callback);
-
- callback (data1,
- g_marshal_value_peek_string (param_values + 1),
- g_marshal_value_peek_boxed (param_values + 2),
- data2);
-}
-
diff --git a/src/lib/marshallers.h b/src/lib/marshallers.h
deleted file mode 100644
index 50093ba..0000000
--- a/src/lib/marshallers.h
+++ /dev/null
@@ -1,20 +0,0 @@
-
-#ifndef __g_cclosure_bluez_marshal_MARSHAL_H__
-#define __g_cclosure_bluez_marshal_MARSHAL_H__
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-/* VOID:STRING,BOXED (lib/marshallers.list:1) */
-extern void g_cclosure_bluez_marshal_VOID__STRING_BOXED (GClosure *closure,
- GValue *return_value,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint,
- gpointer marshal_data);
-
-G_END_DECLS
-
-#endif /* __g_cclosure_bluez_marshal_MARSHAL_H__ */
-
diff --git a/src/lib/network.c b/src/lib/network.c
index a67e7ef..def9baa 100644
--- a/src/lib/network.c
+++ b/src/lib/network.c
@@ -119,34 +119,48 @@ static void _network_get_property(GObject *object, guint property_id, GValue *va
{
Network *self = NETWORK(object);
- GHashTable *properties = network_get_properties(self, NULL);
- if (properties == NULL) {
- return;
- }
-
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(dbus_g_proxy_get_path(self->priv->dbus_g_proxy)));
+ g_value_set_string(value, g_strdup(network_get_dbus_object_path(self)));
break;
case PROP_CONNECTED:
- g_value_set_boolean(value, g_value_get_boolean(g_hash_table_lookup(properties, "Connected")));
+ {
+ GError *error = NULL;
+ g_value_set_boolean(value, network_get_connected(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_INTERFACE:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "Interface")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, network_get_interface(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
case PROP_UUID:
- g_value_set_string(value, g_value_dup_string(g_hash_table_lookup(properties, "UUID")));
+ {
+ GError *error = NULL;
+ g_value_set_string(value, network_get_uuid(self, &error));
+ if (error != NULL) {
+ g_print("%s: %s\n", g_get_prgname(), error->message);
+ g_error_free(error);
+ }
+ }
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
break;
}
-
- g_hash_table_unref(properties);
}
static void _network_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
@@ -175,10 +189,9 @@ static void _network_set_property(GObject *object, guint property_id, const GVal
/* string Connect(string uuid) */
gchar *network_connect(Network *self, const gchar *uuid, GError **error)
{
- g_assert(self != NULL);
+ g_assert(NETWORK_IS(self));
gchar *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "Connect", error, G_TYPE_STRING, uuid, G_TYPE_INVALID, G_TYPE_STRING, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -189,7 +202,7 @@ gchar *network_connect(Network *self, const gchar *uuid, GError **error)
/* void Disconnect() */
void network_disconnect(Network *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(NETWORK_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "Disconnect", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
@@ -197,10 +210,9 @@ void network_disconnect(Network *self, GError **error)
/* dict GetProperties() */
GHashTable *network_get_properties(Network *self, GError **error)
{
- g_assert(self != NULL);
+ g_assert(NETWORK_IS(self));
GHashTable *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetProperties", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -208,6 +220,50 @@ GHashTable *network_get_properties(Network *self, GError **error)
return ret;
}
+/* Properties access methods */
+const gchar *network_get_dbus_object_path(Network *self)
+{
+ g_assert(NETWORK_IS(self));
+
+ return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
+}
+
+gboolean network_get_connected(Network *self, GError **error)
+{
+ g_assert(NETWORK_IS(self));
+
+ GHashTable *properties = network_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, 0);
+ gboolean ret = g_value_get_boolean(g_hash_table_lookup(properties, "Connected"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gchar *network_get_interface(Network *self, GError **error)
+{
+ g_assert(NETWORK_IS(self));
+
+ GHashTable *properties = network_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "Interface"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
+gchar *network_get_uuid(Network *self, GError **error)
+{
+ g_assert(NETWORK_IS(self));
+
+ GHashTable *properties = network_get_properties(self, error);
+ g_return_val_if_fail(properties != NULL, NULL);
+ gchar *ret = g_value_dup_string(g_hash_table_lookup(properties, "UUID"));
+ g_hash_table_unref(properties);
+
+ return ret;
+}
+
/* Signals handlers */
static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name, const GValue *value, gpointer data)
{
diff --git a/src/lib/network.h b/src/lib/network.h
index 1010df6..202014a 100644
--- a/src/lib/network.h
+++ b/src/lib/network.h
@@ -51,6 +51,9 @@ struct _NetworkClass {
GObjectClass parent_class;
};
+/* used by NETWORK_TYPE */
+GType network_get_type(void) G_GNUC_CONST;
+
/*
* Method definitions
*/
@@ -58,5 +61,10 @@ gchar *network_connect(Network *self, const gchar *uuid, GError **error);
void network_disconnect(Network *self, GError **error);
GHashTable *network_get_properties(Network *self, GError **error);
+const gchar *network_get_dbus_object_path(Network *self);
+gboolean network_get_connected(Network *self, GError **error);
+gchar *network_get_interface(Network *self, GError **error);
+gchar *network_get_uuid(Network *self, GError **error);
+
#endif /* __NETWORK_H */
diff --git a/src/lib/serial.c b/src/lib/serial.c
index 2a375c7..642c2dc 100644
--- a/src/lib/serial.c
+++ b/src/lib/serial.c
@@ -82,7 +82,7 @@ static void _serial_get_property(GObject *object, guint property_id, GValue *val
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(dbus_g_proxy_get_path(self->priv->dbus_g_proxy)));
+ g_value_set_string(value, g_strdup(serial_get_dbus_object_path(self)));
break;
default:
@@ -117,10 +117,9 @@ static void _serial_set_property(GObject *object, guint property_id, const GValu
/* string Connect(string pattern) */
gchar *serial_connect(Serial *self, const gchar *pattern, GError **error)
{
- g_assert(self != NULL);
+ g_assert(SERIAL_IS(self));
gchar *ret;
-
if (!dbus_g_proxy_call(self->priv->dbus_g_proxy, "Connect", error, G_TYPE_STRING, pattern, G_TYPE_INVALID, G_TYPE_STRING, &ret, G_TYPE_INVALID)) {
return NULL;
}
@@ -131,8 +130,16 @@ gchar *serial_connect(Serial *self, const gchar *pattern, GError **error)
/* void Disconnect(string device) */
void serial_disconnect(Serial *self, const gchar *device, GError **error)
{
- g_assert(self != NULL);
+ g_assert(SERIAL_IS(self));
dbus_g_proxy_call(self->priv->dbus_g_proxy, "Disconnect", error, G_TYPE_STRING, device, G_TYPE_INVALID, G_TYPE_INVALID);
}
+/* Properties access methods */
+const gchar *serial_get_dbus_object_path(Serial *self)
+{
+ g_assert(SERIAL_IS(self));
+
+ return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
+}
+
diff --git a/src/lib/serial.h b/src/lib/serial.h
index 1b7d556..c7ec2a2 100644
--- a/src/lib/serial.h
+++ b/src/lib/serial.h
@@ -51,11 +51,16 @@ struct _SerialClass {
GObjectClass parent_class;
};
+/* used by SERIAL_TYPE */
+GType serial_get_type(void) G_GNUC_CONST;
+
/*
* Method definitions
*/
gchar *serial_connect(Serial *self, const gchar *pattern, GError **error);
void serial_disconnect(Serial *self, const gchar *device, GError **error);
+const gchar *serial_get_dbus_object_path(Serial *self);
+
#endif /* __SERIAL_H */