diff options
author | Alexander Orlenko <zxteam@gmail.com> | 2010-06-23 18:11:20 +1100 |
---|---|---|
committer | Alexander Orlenko <zxteam@gmail.com> | 2010-06-23 18:11:20 +1100 |
commit | 8c28f5fbed9380905da77cc522f1cd3d94cfc7d0 (patch) | |
tree | d8ad72750f0e9868792d75893a66b7ca7804c8bd | |
parent | 10fd73a7ce52641bc62626b9b4cee766f2845478 (diff) | |
download | bluez-tools-8c28f5fbed9380905da77cc522f1cd3d94cfc7d0.tar.gz |
added getters and setters for properties && some fixes and impl's
-rw-r--r-- | configure.ac | 6 | ||||
-rwxr-xr-x | contrib/gen-dbus-gobject.pl | 116 | ||||
-rw-r--r-- | src/Makefile.am | 33 | ||||
-rw-r--r-- | src/bt-monitor.c | 176 | ||||
-rw-r--r-- | src/lib/adapter.c | 344 | ||||
-rw-r--r-- | src/lib/adapter.h | 22 | ||||
-rw-r--r-- | src/lib/audio.c | 45 | ||||
-rw-r--r-- | src/lib/audio.h | 6 | ||||
-rw-r--r-- | src/lib/device.c | 343 | ||||
-rw-r--r-- | src/lib/device.h | 21 | ||||
-rw-r--r-- | src/lib/input.c | 45 | ||||
-rw-r--r-- | src/lib/input.h | 6 | ||||
-rw-r--r-- | src/lib/manager.c | 38 | ||||
-rw-r--r-- | src/lib/manager.h | 5 | ||||
-rw-r--r-- | src/lib/marshallers.c | 86 | ||||
-rw-r--r-- | src/lib/marshallers.h | 20 | ||||
-rw-r--r-- | src/lib/network.c | 88 | ||||
-rw-r--r-- | src/lib/network.h | 8 | ||||
-rw-r--r-- | src/lib/serial.c | 15 | ||||
-rw-r--r-- | src/lib/serial.h | 5 |
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 */ |