summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Orlenko <zxteam@gmail.com>2010-06-28 18:12:05 +1100
committerAlexander Orlenko <zxteam@gmail.com>2010-06-28 18:12:05 +1100
commit7aa61b2ab2912d99e9dd5c941956469343ef895c (patch)
treed9b59c9458b03fbf3458a28513fb393409c29e3e
parent49cd2edce02a1acba5f6dc903cb1179b26e21855 (diff)
downloadbluez-tools-7aa61b2ab2912d99e9dd5c941956469343ef895c.tar.gz
Added properties caching
-rwxr-xr-xcontrib/gen-dbus-gobject.pl130
-rw-r--r--src/bt-monitor.c92
-rw-r--r--src/lib/adapter.c383
-rw-r--r--src/lib/adapter.h34
-rw-r--r--src/lib/audio.c43
-rw-r--r--src/lib/audio.h2
-rw-r--r--src/lib/device.c391
-rw-r--r--src/lib/device.h32
-rw-r--r--src/lib/input.c42
-rw-r--r--src/lib/input.h2
-rw-r--r--src/lib/manager.c46
-rw-r--r--src/lib/manager.h2
-rw-r--r--src/lib/network.c93
-rw-r--r--src/lib/network.h6
-rw-r--r--src/lib/serial.c2
15 files changed, 670 insertions, 630 deletions
diff --git a/contrib/gen-dbus-gobject.pl b/contrib/gen-dbus-gobject.pl
index a984197..b07d079 100755
--- a/contrib/gen-dbus-gobject.pl
+++ b/contrib/gen-dbus-gobject.pl
@@ -261,8 +261,8 @@ EOT
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 .= "const ".get_g_type($p{'type'})."{\$object}_get_".(join '_', (map lc $_, @a))."({\$Object} *self);\n";
+ $method_defs .= "void {\$object}_set_".(join '_', (map lc $_, @a))."({\$Object} *self, const ".get_g_type($p{'type'})."value);\n" if $p{'mode'} eq 'readwrite';
}
$method_defs =~ s/\s+$//s;
@@ -294,6 +294,11 @@ sub generate_source {
struct _{\$Object}Private {
DBusGProxy *dbus_g_proxy;
+
+ {IF_PROPERTIES}
+ /* Properties */
+ {PRIV_PROPERTIES}
+ {FI_PROPERTIES}
};
G_DEFINE_TYPE({\$Object}, {\$object}, G_TYPE_OBJECT);
@@ -330,6 +335,11 @@ static void {\$object}_dispose(GObject *gobject)
{SIGNALS_DISCONNECTION}
{FI_SIGNALS}
+ {IF_PROPERTIES}
+ /* Properties free */
+ {PROPERTIES_FREE}
+ {FI_PROPERTIES}
+
/* Chain up to the parent class */
G_OBJECT_CLASS({\$object}_parent_class)->dispose(gobject);
}
@@ -368,10 +378,15 @@ static void {\$object}_init({\$Object} *self)
g_assert(self->priv->dbus_g_proxy != NULL);
{IF_SIGNALS}
- /* DBUS signals connection */
+ /* DBus signals connection */
{SIGNALS_CONNECTION}
{FI_SIGNALS}
+
+ {IF_PROPERTIES}
+ /* Properties init */
+ {PROPERTIES_INIT}
+ {FI_PROPERTIES}
{FI_INIT}
}
@@ -385,6 +400,11 @@ static void {\$object}_post_init({\$Object} *self)
{SIGNALS_CONNECTION}
{FI_SIGNALS}
+
+ {IF_PROPERTIES}
+ /* Properties init */
+ {PROPERTIES_INIT}
+ {FI_PROPERTIES}
}
{FI_POST_INIT}
@@ -515,7 +535,8 @@ EOT
my $args = join ', ', map($_->{'name'}, @{$s{'args'}});
$signals_handlers .= "$handler\n".
"{\n".
- "\t{\$Object} *self = {\$OBJECT}(data);\n".
+ "\t{\$Object} *self = {\$OBJECT}(data);\n\n".
+ ($handler_name eq 'property_changed_handler' ? "\t{PROPERTIES_CHANGED_HANDLER}\n\n" : "").
"\tg_signal_emit(self, signals[$enum], 0".($args eq '' ? "" : ", $args").");\n".
"}\n\n";
@@ -529,11 +550,19 @@ EOT
$signals_disconnection =~ s/^\t(.+?)\s+$/$1/s;
$signals_handlers =~ s/\s+$//s;
+ my $priv_properties = "";
my $enum_properties = "";
my $properties_registration = "";
my $get_properties = "";
my $set_properties = "";
my $properties_access_methods = "";
+ my $properties_init =
+ "\tGError *error = NULL;\n".
+ "\tGHashTable *properties = {\$object}_get_properties(self, &error);\n".
+ "\tg_assert(error == NULL);\n".
+ "\tg_assert(properties != NULL);\n\n";
+ my $properties_free = "";
+ my $properties_changed_handler = "\tif (g_strcmp0(name, ";
unless (defined $node->{'objectPath'}) {
$enum_properties .= "\tPROP_DBUS_OBJECT_PATH, /* readwrite, construct only */\n";
$properties_registration .=
@@ -543,7 +572,7 @@ EOT
$get_properties .=
"\tcase PROP_DBUS_OBJECT_PATH:\n".
- "\t\tg_value_set_string(value, g_strdup({\$object}_get_dbus_object_path(self)));\n".
+ "\t\tg_value_set_string(value, {\$object}_get_dbus_object_path(self));\n".
"\t\tbreak;\n\n";
$set_properties .=
@@ -568,54 +597,59 @@ EOT
my @a = $property =~ /([A-Z]+[a-z]*)/g;
my %p = %{$node->{$intf}{'properties'}{$property}};
+ my $property_var = join '_', (map lc $_, @a);
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));
+ my $property_get_method = "{\$object}_get_$property_var";
+ my $property_set_method = "{\$object}_set_$property_var";
+ $priv_properties .= "\t".get_g_type($p{'type'})."$property_var;\n";
$enum_properties .= "\t$enum, /* $p{'mode'} */\n";
$properties_registration .= "\t/* $p{'decl'} */\n";
- $get_properties .=
- "\tcase $enum:\n".
- "\t{\n".
- "\t\tGError *error = NULL;\n";
+ $properties_init .=
+ "\t/* $p{'decl'} */\n".
+ "\tself->priv->$property_var = ";
$properties_access_methods .=
- get_g_type($p{'type'})."$property_get_method({\$Object} *self, GError **error)\n".
+ "const ".get_g_type($p{'type'})."$property_get_method({\$Object} *self)\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 = ";
+ "\treturn self->priv->$property_var;\n".
+ "}\n\n";
+
+ $properties_changed_handler .= "\"$property\") == 0) {\n";
+ $get_properties .= "\tcase $enum:\n";
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, $property_get_method(self, &error));\n";
- $properties_access_methods .= "g_value_dup_string(g_hash_table_lookup(properties, \"$property\"));\n";
+ $properties_init .= "g_value_dup_string(g_hash_table_lookup(properties, \"$property\"));\n";
+ $get_properties .= "\t\tg_value_set_string(value, $property_get_method(self));\n";
+ $properties_free .= "\tg_free(self->priv->$property_var);\n";
+ $properties_changed_handler .=
+ "\t\tg_free(self->priv->$property_var);\n".
+ "\t\tself->priv->$property_var = g_value_dup_string(value);\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, $property_get_method(self, &error));\n";
- $properties_access_methods .= "g_value_dup_boxed(g_hash_table_lookup(properties, \"$property\"));\n";
+ $properties_init .= "g_value_dup_boxed(g_hash_table_lookup(properties, \"$property\"));\n";
+ $get_properties .= "\t\tg_value_set_boxed(value, $property_get_method(self));\n";
+ $properties_free .= "\tg_ptr_array_unref(self->priv->$property_var);\n";
+ $properties_changed_handler .=
+ "\t\tg_ptr_array_unref(self->priv->$property_var);\n".
+ "\t\tself->priv->$property_var = g_value_dup_boxed(value);\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, $property_get_method(self, &error));\n";
- $properties_access_methods .= "g_value_get_uint(g_hash_table_lookup(properties, \"$property\"));\n";
+ $properties_init .= "g_value_get_uint(g_hash_table_lookup(properties, \"$property\"));\n";
+ $get_properties .= "\t\tg_value_set_uint(value, $property_get_method(self));\n";
+ $properties_changed_handler .= "\t\tself->priv->$property_var = g_value_get_uint(value);\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, $property_get_method(self, &error));\n";
- $properties_access_methods .= "g_value_get_boolean(g_hash_table_lookup(properties, \"$property\"));\n";
+ $properties_init .= "g_value_get_boolean(g_hash_table_lookup(properties, \"$property\"));\n";
+ $get_properties .= "\t\tg_value_set_boolean(value, $property_get_method(self));\n";
+ $properties_changed_handler .= "\t\tself->priv->$property_var = g_value_get_boolean(value);\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\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";
+ $properties_init .= "\n";
+ $get_properties .= "\t\tbreak;\n\n";
+ $properties_changed_handler .= "\t} else if (g_strcmp0(name, ";
if ($p{'mode'} eq 'readwrite') {
$set_properties .=
@@ -623,17 +657,15 @@ EOT
"\t{\n".
"\t\tGError *error = NULL;\n".
"\t\t{\$object}_set_property(self, \"$property\", value, &error);\n".
- "\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\tg_assert(error == NULL);\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".
+ "void $property_set_method({\$Object} *self, const ".get_g_type($p{'type'})."value)\n".
"{\n".
- "\tg_return_if_fail({\$OBJECT}_IS(self));\n\n".
+ "\tg_assert({\$OBJECT}_IS(self));\n\n".
+ "\tGError *error = NULL;\n\n".
"\tGValue t = {0};\n".
"\tg_value_init(&t, ".get_g_type_name($p{'type'}).");\n".
"\tg_value_set_".
@@ -646,16 +678,26 @@ EOT
die "unknown setter type: $p{'type'}\n"
)
))."(&t, value);\n".
- "\t{\$object}_set_property(self, \"$property\", &t, error);\n".
- "\tg_value_unset(&t);\n".
+ "\t{\$object}_set_property(self, \"$property\", &t, &error);\n".
+ "\tg_value_unset(&t);\n\n".
+ "\tg_assert(error == NULL);\n".
"}\n\n";
}
}
+ $properties_init .=
+ "\tg_hash_table_unref(properties);\n\n";
+
+ $priv_properties =~ s/^\t(.+?)\s+$/$1/s;
$enum_properties =~ s/^\t(.+), (\/\* .+? \*\/)\s+$/$1 $2/s;
$properties_registration =~ s/^\t(.+?)\s+$/$1/s;
+ $properties_init =~ 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;
+ $properties_free =~ s/^\t(.+?)\s+$/$1/s;
+ $properties_changed_handler =~ s/^\t(.+?) else if \(g_strcmp0\(name, $/$1/s;
+
+ $properties_free ="/* none */" if $properties_free eq '';
my $output = "$HEADER\n$SOURCE_TEMPLATE";
if (defined $node->{'objectPath'}) {
@@ -682,11 +724,15 @@ EOT
$output =~ s/{SIGNALS_CONNECTION}/$signals_connection/;
$output =~ s/{SIGNALS_DISCONNECTION}/$signals_disconnection/;
$output =~ s/{SIGNALS_HANDLERS}/$signals_handlers/;
+ $output =~ s/{PRIV_PROPERTIES}/$priv_properties/;
$output =~ s/{ENUM_PROPERTIES}/$enum_properties/;
$output =~ s/{PROPERTIES_REGISTRATION}/$properties_registration/;
+ $output =~ s/{PROPERTIES_INIT}/$properties_init/;
+ $output =~ s/{PROPERTIES_FREE}/$properties_free/;
$output =~ s/{GET_PROPERTIES}/$get_properties/;
$output =~ s/{SET_PROPERTIES}/$set_properties/;
$output =~ s/{PROPERTIES_ACCESS_METHODS}/$properties_access_methods/;
+ $output =~ s/{PROPERTIES_CHANGED_HANDLER}/$properties_changed_handler/;
$output =~ s/{METHODS}/$methods/;
$output =~ s/{\$OBJECT}/$obj_uc/g;
$output =~ s/{\$Object}/$obj/g;
diff --git a/src/bt-monitor.c b/src/bt-monitor.c
index 239aef8..2e1c8e6 100644
--- a/src/bt-monitor.c
+++ b/src/bt-monitor.c
@@ -34,7 +34,7 @@
#include "lib/device.h"
#include "lib/manager.h"
-static gchar *adapter_name = NULL;
+static gchar *capture_adapter_name = NULL;
static GPtrArray *captured_adapters = NULL;
static GPtrArray *captured_devices = NULL;
@@ -43,17 +43,35 @@ static GPtrArray *captured_devices = NULL;
*/
static void manager_adapter_added(Manager *manager, const gchar *adapter_path, gpointer data)
{
- g_print("[MANAGER] adapter added: %s\n", adapter_path);
+ Adapter *adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
+ gchar *adapter_name = adapter_get_name(adapter, NULL);
- //if (adapter_name == NULL) {
- // Adapter *adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
- // g_ptr_array_add(captured_adapters, adapter);
- //}
+ if (capture_adapter_name == NULL || (g_strcmp0(capture_adapter_name, adapter_name) == 0 && captured_adapters->len == 0)) {
+ g_ptr_array_add(captured_adapters, adapter);
+ g_print("[MANAGER] adapter added: %s (%s)\n", adapter_name, adapter_path);
+ } else {
+ g_object_unref(adapter);
+ }
+
+ g_free(adapter_name);
}
static void manager_adapter_removed(Manager *manager, const gchar *adapter_path, gpointer data)
{
- g_print("[MANAGER] adapter removed: %s\n", adapter_path);
+ for (int i = 0; i < captured_adapters->len; i++) {
+ Adapter *adapter = ADAPTER(g_ptr_array_index(captured_adapters, i));
+ gchar *adapter_name = adapter_get_name(adapter, NULL);
+
+ if (g_strcmp0(adapter_path, adapter_get_dbus_object_path(adapter)) == 0) {
+ g_ptr_array_remove_index(captured_adapters, i);
+ g_print("[MANAGER] adapter removed: %s (%s)\n", adapter_name, adapter_path);
+ g_object_unref(adapter);
+ g_free(adapter_name);
+ break;
+ }
+
+ g_free(adapter_name);
+ }
}
static void manager_default_adapter_changed(Manager *manager, const gchar *adapter_path, gpointer data)
@@ -120,23 +138,23 @@ static void device_property_changed(Device *device, const gchar *name, const GVa
/*
* Service signals
*/
-static void audio_property_changed()
-{
+//static void audio_property_changed()
+//{
+//
+//}
-}
+//static void input_property_changed()
+//{
+//
+//}
-static void input_property_changed()
-{
-
-}
-
-static void network_property_changed()
-{
-
-}
+//static void network_property_changed()
+//{
+//
+//}
static GOptionEntry entries[] = {
- { "adapter", 'a', 0, G_OPTION_ARG_STRING, &adapter_name, "Adapter name or MAC", NULL},
+ { "adapter", 'a', 0, G_OPTION_ARG_STRING, &capture_adapter_name, "Adapter name or MAC", NULL},
{ NULL}
};
@@ -158,7 +176,6 @@ int main(int argc, char *argv[])
if (!dbus_connect(&error)) {
g_printerr("Couldn't connect to dbus: %s", error->message);
- g_error_free(error);
exit(EXIT_FAILURE);
}
@@ -167,20 +184,37 @@ int main(int argc, char *argv[])
Manager *manager = g_object_new(MANAGER_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);
- }
+ if (capture_adapter_name != NULL) {
+ gchar *adapter_path = find_adapter_by_name(capture_adapter_name, &error);
+ exit_if_error(error);
- g_print("found adapter: %s\n", adapter_path);
+ g_print("capturing adapter: %s (%s)\n", capture_adapter_name, 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 {
- exit(EXIT_FAILURE);
+ GPtrArray *adapters_list = manager_get_adapters(manager, &error);
+ g_return_val_if_fail(adapters_list != NULL, NULL);
+ exit_if_error(error);
+
+ if (adapters_list->len == 0) {
+ g_print("no adapters found\n");
+ }
+
+ for (int i = 0; i < adapters_list->len; i++) {
+ gchar *adapter_path = g_ptr_array_index(adapters_list, i);
+ Adapter *adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
+ gchar *adapter_name = adapter_get_name(adapter, &error);
+ exit_if_error(error);
+
+ g_print("capturing adapter: %s (%s)\n", adapter_name, adapter_path);
+
+ g_ptr_array_add(captured_adapters, adapter);
+ g_free(adapter_name);
+ }
+
+ g_ptr_array_unref(adapters_list);
}
g_signal_connect(manager, "AdapterAdded", G_CALLBACK(manager_adapter_added), NULL);
diff --git a/src/lib/adapter.c b/src/lib/adapter.c
index d5b9a86..fd11968 100644
--- a/src/lib/adapter.c
+++ b/src/lib/adapter.c
@@ -35,6 +35,19 @@
struct _AdapterPrivate {
DBusGProxy *dbus_g_proxy;
+
+ /* Properties */
+ gchar *address;
+ guint32 class;
+ GPtrArray *devices;
+ gboolean discoverable;
+ guint32 discoverable_timeout;
+ gboolean discovering;
+ gchar *name;
+ gboolean pairable;
+ guint32 paireable_timeout;
+ gboolean powered;
+ GPtrArray *uuids;
};
G_DEFINE_TYPE(Adapter, adapter, G_TYPE_OBJECT);
@@ -88,6 +101,12 @@ static void adapter_dispose(GObject *gobject)
dbus_g_proxy_disconnect_signal(self->priv->dbus_g_proxy, "DeviceRemoved", G_CALLBACK(device_removed_handler), self);
dbus_g_proxy_disconnect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self);
+ /* Properties free */
+ g_free(self->priv->address);
+ g_ptr_array_unref(self->priv->devices);
+ g_free(self->priv->name);
+ g_ptr_array_unref(self->priv->uuids);
+
/* Chain up to the parent class */
G_OBJECT_CLASS(adapter_parent_class)->dispose(gobject);
}
@@ -223,6 +242,47 @@ static void adapter_post_init(Adapter *self)
/* PropertyChanged(string name, variant value) */
dbus_g_proxy_add_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
dbus_g_proxy_connect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self, NULL);
+
+ /* Properties init */
+ GError *error = NULL;
+ GHashTable *properties = adapter_get_properties(self, &error);
+ g_assert(error == NULL);
+ g_assert(properties != NULL);
+
+ /* string Address [readonly] */
+ self->priv->address = g_value_dup_string(g_hash_table_lookup(properties, "Address"));
+
+ /* uint32 Class [readonly] */
+ self->priv->class = g_value_get_uint(g_hash_table_lookup(properties, "Class"));
+
+ /* array{object} Devices [readonly] */
+ self->priv->devices = g_value_dup_boxed(g_hash_table_lookup(properties, "Devices"));
+
+ /* boolean Discoverable [readwrite] */
+ self->priv->discoverable = g_value_get_boolean(g_hash_table_lookup(properties, "Discoverable"));
+
+ /* uint32 DiscoverableTimeout [readwrite] */
+ self->priv->discoverable_timeout = g_value_get_uint(g_hash_table_lookup(properties, "DiscoverableTimeout"));
+
+ /* boolean Discovering [readonly] */
+ self->priv->discovering = g_value_get_boolean(g_hash_table_lookup(properties, "Discovering"));
+
+ /* string Name [readwrite] */
+ self->priv->name = g_value_dup_string(g_hash_table_lookup(properties, "Name"));
+
+ /* boolean Pairable [readwrite] */
+ self->priv->pairable = g_value_get_boolean(g_hash_table_lookup(properties, "Pairable"));
+
+ /* uint32 PaireableTimeout [readwrite] */
+ self->priv->paireable_timeout = g_value_get_uint(g_hash_table_lookup(properties, "PaireableTimeout"));
+
+ /* boolean Powered [readwrite] */
+ self->priv->powered = g_value_get_boolean(g_hash_table_lookup(properties, "Powered"));
+
+ /* array{string} UUIDs [readonly] */
+ self->priv->uuids = g_value_dup_boxed(g_hash_table_lookup(properties, "UUIDs"));
+
+ g_hash_table_unref(properties);
}
static void _adapter_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
@@ -231,128 +291,51 @@ static void _adapter_get_property(GObject *object, guint property_id, GValue *va
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(adapter_get_dbus_object_path(self)));
+ g_value_set_string(value, adapter_get_dbus_object_path(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, adapter_get_address(self));
break;
case PROP_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);
- }
- }
+ g_value_set_uint(value, adapter_get_class(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boxed(value, adapter_get_devices(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, adapter_get_discoverable(self));
break;
case PROP_DISCOVERABLE_TIMEOUT:
- {
- 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);
- }
- }
+ g_value_set_uint(value, adapter_get_discoverable_timeout(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, adapter_get_discovering(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, adapter_get_name(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, adapter_get_pairable(self));
break;
case PROP_PAIREABLE_TIMEOUT:
- {
- 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);
- }
- }
+ g_value_set_uint(value, adapter_get_paireable_timeout(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, adapter_get_powered(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boxed(value, adapter_get_uuids(self));
break;
default:
@@ -380,10 +363,7 @@ static void _adapter_set_property(GObject *object, guint property_id, const GVal
{
GError *error = NULL;
adapter_set_property(self, "Discoverable", value, &error);
- if (error != NULL) {
- g_print("%s: %s\n", g_get_prgname(), error->message);
- g_error_free(error);
- }
+ g_assert(error == NULL);
}
break;
@@ -391,10 +371,7 @@ static void _adapter_set_property(GObject *object, guint property_id, const GVal
{
GError *error = NULL;
adapter_set_property(self, "DiscoverableTimeout", value, &error);
- if (error != NULL) {
- g_print("%s: %s\n", g_get_prgname(), error->message);
- g_error_free(error);
- }
+ g_assert(error == NULL);
}
break;
@@ -402,10 +379,7 @@ static void _adapter_set_property(GObject *object, guint property_id, const GVal
{
GError *error = NULL;
adapter_set_property(self, "Name", value, &error);
- if (error != NULL) {
- g_print("%s: %s\n", g_get_prgname(), error->message);
- g_error_free(error);
- }
+ g_assert(error == NULL);
}
break;
@@ -413,10 +387,7 @@ static void _adapter_set_property(GObject *object, guint property_id, const GVal
{
GError *error = NULL;
adapter_set_property(self, "Pairable", value, &error);
- if (error != NULL) {
- g_print("%s: %s\n", g_get_prgname(), error->message);
- g_error_free(error);
- }
+ g_assert(error == NULL);
}
break;
@@ -424,10 +395,7 @@ static void _adapter_set_property(GObject *object, guint property_id, const GVal
{
GError *error = NULL;
adapter_set_property(self, "PaireableTimeout", value, &error);
- if (error != NULL) {
- g_print("%s: %s\n", g_get_prgname(), error->message);
- g_error_free(error);
- }
+ g_assert(error == NULL);
}
break;
@@ -435,10 +403,7 @@ static void _adapter_set_property(GObject *object, guint property_id, const GVal
{
GError *error = NULL;
adapter_set_property(self, "Powered", value, &error);
- if (error != NULL) {
- g_print("%s: %s\n", g_get_prgname(), error->message);
- g_error_free(error);
- }
+ g_assert(error == NULL);
}
break;
@@ -582,232 +547,234 @@ const gchar *adapter_get_dbus_object_path(Adapter *self)
return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
}
-gchar *adapter_get_address(Adapter *self, GError **error)
+const gchar *adapter_get_address(Adapter *self)
{
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;
+ return self->priv->address;
}
-guint32 adapter_get_class(Adapter *self, GError **error)
+const guint32 adapter_get_class(Adapter *self)
{
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;
+ return self->priv->class;
}
-GPtrArray *adapter_get_devices(Adapter *self, GError **error)
+const GPtrArray *adapter_get_devices(Adapter *self)
{
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;
+ return self->priv->devices;
}
-gboolean adapter_get_discoverable(Adapter *self, GError **error)
+const gboolean adapter_get_discoverable(Adapter *self)
{
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;
+ return self->priv->discoverable;
}
-void adapter_set_discoverable(Adapter *self, const gboolean value, GError **error)
+void adapter_set_discoverable(Adapter *self, const gboolean value)
{
- g_return_if_fail(ADAPTER_IS(self));
+ g_assert(ADAPTER_IS(self));
+
+ GError *error = NULL;
GValue t = {0};
g_value_init(&t, G_TYPE_BOOLEAN);
g_value_set_boolean(&t, value);
- adapter_set_property(self, "Discoverable", &t, error);
+ adapter_set_property(self, "Discoverable", &t, &error);
g_value_unset(&t);
+
+ g_assert(error == NULL);
}
-guint32 adapter_get_discoverable_timeout(Adapter *self, GError **error)
+const guint32 adapter_get_discoverable_timeout(Adapter *self)
{
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;
+ return self->priv->discoverable_timeout;
}
-void adapter_set_discoverable_timeout(Adapter *self, const guint32 value, GError **error)
+void adapter_set_discoverable_timeout(Adapter *self, const guint32 value)
{
- g_return_if_fail(ADAPTER_IS(self));
+ g_assert(ADAPTER_IS(self));
+
+ GError *error = NULL;
GValue t = {0};
g_value_init(&t, G_TYPE_UINT);
g_value_set_uint(&t, value);
- adapter_set_property(self, "DiscoverableTimeout", &t, error);
+ adapter_set_property(self, "DiscoverableTimeout", &t, &error);
g_value_unset(&t);
+
+ g_assert(error == NULL);
}
-gboolean adapter_get_discovering(Adapter *self, GError **error)
+const gboolean adapter_get_discovering(Adapter *self)
{
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;
+ return self->priv->discovering;
}
-gchar *adapter_get_name(Adapter *self, GError **error)
+const gchar *adapter_get_name(Adapter *self)
{
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;
+ return self->priv->name;
}
-void adapter_set_name(Adapter *self, const gchar *value, GError **error)
+void adapter_set_name(Adapter *self, const gchar *value)
{
- g_return_if_fail(ADAPTER_IS(self));
+ g_assert(ADAPTER_IS(self));
+
+ GError *error = NULL;
GValue t = {0};
g_value_init(&t, G_TYPE_STRING);
g_value_set_string(&t, value);
- adapter_set_property(self, "Name", &t, error);
+ adapter_set_property(self, "Name", &t, &error);
g_value_unset(&t);
+
+ g_assert(error == NULL);
}
-gboolean adapter_get_pairable(Adapter *self, GError **error)
+const gboolean adapter_get_pairable(Adapter *self)
{
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;
+ return self->priv->pairable;
}
-void adapter_set_pairable(Adapter *self, const gboolean value, GError **error)
+void adapter_set_pairable(Adapter *self, const gboolean value)
{
- g_return_if_fail(ADAPTER_IS(self));
+ g_assert(ADAPTER_IS(self));
+
+ GError *error = NULL;
GValue t = {0};
g_value_init(&t, G_TYPE_BOOLEAN);
g_value_set_boolean(&t, value);
- adapter_set_property(self, "Pairable", &t, error);
+ adapter_set_property(self, "Pairable", &t, &error);
g_value_unset(&t);
+
+ g_assert(error == NULL);
}
-guint32 adapter_get_paireable_timeout(Adapter *self, GError **error)
+const guint32 adapter_get_paireable_timeout(Adapter *self)
{
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;
+ return self->priv->paireable_timeout;
}
-void adapter_set_paireable_timeout(Adapter *self, const guint32 value, GError **error)
+void adapter_set_paireable_timeout(Adapter *self, const guint32 value)
{
- g_return_if_fail(ADAPTER_IS(self));
+ g_assert(ADAPTER_IS(self));
+
+ GError *error = NULL;
GValue t = {0};
g_value_init(&t, G_TYPE_UINT);
g_value_set_uint(&t, value);
- adapter_set_property(self, "PaireableTimeout", &t, error);
+ adapter_set_property(self, "PaireableTimeout", &t, &error);
g_value_unset(&t);
+
+ g_assert(error == NULL);
}
-gboolean adapter_get_powered(Adapter *self, GError **error)
+const gboolean adapter_get_powered(Adapter *self)
{
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;
+ return self->priv->powered;
}
-void adapter_set_powered(Adapter *self, const gboolean value, GError **error)
+void adapter_set_powered(Adapter *self, const gboolean value)
{
- g_return_if_fail(ADAPTER_IS(self));
+ g_assert(ADAPTER_IS(self));
+
+ GError *error = NULL;
GValue t = {0};
g_value_init(&t, G_TYPE_BOOLEAN);
g_value_set_boolean(&t, value);
- adapter_set_property(self, "Powered", &t, error);
+ adapter_set_property(self, "Powered", &t, &error);
g_value_unset(&t);
+
+ g_assert(error == NULL);
}
-GPtrArray *adapter_get_uuids(Adapter *self, GError **error)
+const GPtrArray *adapter_get_uuids(Adapter *self)
{
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;
+ return self->priv->uuids;
}
/* Signals handlers */
static void device_created_handler(DBusGProxy *dbus_g_proxy, const gchar *device, gpointer data)
{
Adapter *self = ADAPTER(data);
+
g_signal_emit(self, signals[DEVICE_CREATED], 0, device);
}
static void device_disappeared_handler(DBusGProxy *dbus_g_proxy, const gchar *address, gpointer data)
{
Adapter *self = ADAPTER(data);
+
g_signal_emit(self, signals[DEVICE_DISAPPEARED], 0, address);
}
static void device_found_handler(DBusGProxy *dbus_g_proxy, const gchar *address, const GHashTable *values, gpointer data)
{
Adapter *self = ADAPTER(data);
+
g_signal_emit(self, signals[DEVICE_FOUND], 0, address, values);
}
static void device_removed_handler(DBusGProxy *dbus_g_proxy, const gchar *device, gpointer data)
{
Adapter *self = ADAPTER(data);
+
g_signal_emit(self, signals[DEVICE_REMOVED], 0, device);
}
static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name, const GValue *value, gpointer data)
{
Adapter *self = ADAPTER(data);
+
+ if (g_strcmp0(name, "Address") == 0) {
+ g_free(self->priv->address);
+ self->priv->address = g_value_dup_string(value);
+ } else if (g_strcmp0(name, "Class") == 0) {
+ self->priv->class = g_value_get_uint(value);
+ } else if (g_strcmp0(name, "Devices") == 0) {
+ g_ptr_array_unref(self->priv->devices);
+ self->priv->devices = g_value_dup_boxed(value);
+ } else if (g_strcmp0(name, "Discoverable") == 0) {
+ self->priv->discoverable = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "DiscoverableTimeout") == 0) {
+ self->priv->discoverable_timeout = g_value_get_uint(value);
+ } else if (g_strcmp0(name, "Discovering") == 0) {
+ self->priv->discovering = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "Name") == 0) {
+ g_free(self->priv->name);
+ self->priv->name = g_value_dup_string(value);
+ } else if (g_strcmp0(name, "Pairable") == 0) {
+ self->priv->pairable = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "PaireableTimeout") == 0) {
+ self->priv->paireable_timeout = g_value_get_uint(value);
+ } else if (g_strcmp0(name, "Powered") == 0) {
+ self->priv->powered = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "UUIDs") == 0) {
+ g_ptr_array_unref(self->priv->uuids);
+ self->priv->uuids = g_value_dup_boxed(value);
+ }
+
g_signal_emit(self, signals[PROPERTY_CHANGED], 0, name, value);
}
diff --git a/src/lib/adapter.h b/src/lib/adapter.h
index f18d5f7..488fde0 100644
--- a/src/lib/adapter.h
+++ b/src/lib/adapter.h
@@ -72,23 +72,23 @@ 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);
+const gchar *adapter_get_address(Adapter *self);
+const guint32 adapter_get_class(Adapter *self);
+const GPtrArray *adapter_get_devices(Adapter *self);
+const gboolean adapter_get_discoverable(Adapter *self);
+void adapter_set_discoverable(Adapter *self, const gboolean value);
+const guint32 adapter_get_discoverable_timeout(Adapter *self);
+void adapter_set_discoverable_timeout(Adapter *self, const guint32 value);
+const gboolean adapter_get_discovering(Adapter *self);
+const gchar *adapter_get_name(Adapter *self);
+void adapter_set_name(Adapter *self, const gchar *value);
+const gboolean adapter_get_pairable(Adapter *self);
+void adapter_set_pairable(Adapter *self, const gboolean value);
+const guint32 adapter_get_paireable_timeout(Adapter *self);
+void adapter_set_paireable_timeout(Adapter *self, const guint32 value);
+const gboolean adapter_get_powered(Adapter *self);
+void adapter_set_powered(Adapter *self, const gboolean value);
+const GPtrArray *adapter_get_uuids(Adapter *self);
#endif /* __ADAPTER_H */
diff --git a/src/lib/audio.c b/src/lib/audio.c
index cef4f80..090e536 100644
--- a/src/lib/audio.c
+++ b/src/lib/audio.c
@@ -35,6 +35,9 @@
struct _AudioPrivate {
DBusGProxy *dbus_g_proxy;
+
+ /* Properties */
+ gchar *state;
};
G_DEFINE_TYPE(Audio, audio, G_TYPE_OBJECT);
@@ -66,6 +69,9 @@ static void audio_dispose(GObject *gobject)
/* DBus signals disconnection */
dbus_g_proxy_disconnect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self);
+ /* Properties free */
+ g_free(self->priv->state);
+
/* Chain up to the parent class */
G_OBJECT_CLASS(audio_parent_class)->dispose(gobject);
}
@@ -117,6 +123,17 @@ static void audio_post_init(Audio *self)
/* PropertyChanged(string name, variant value) */
dbus_g_proxy_add_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
dbus_g_proxy_connect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self, NULL);
+
+ /* Properties init */
+ GError *error = NULL;
+ GHashTable *properties = audio_get_properties(self, &error);
+ g_assert(error == NULL);
+ g_assert(properties != NULL);
+
+ /* string State [readonly] */
+ self->priv->state = g_value_dup_string(g_hash_table_lookup(properties, "State"));
+
+ g_hash_table_unref(properties);
}
static void _audio_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
@@ -125,18 +142,11 @@ static void _audio_get_property(GObject *object, guint property_id, GValue *valu
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(audio_get_dbus_object_path(self)));
+ g_value_set_string(value, audio_get_dbus_object_path(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, audio_get_state(self));
break;
default:
@@ -205,22 +215,23 @@ const gchar *audio_get_dbus_object_path(Audio *self)
return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
}
-gchar *audio_get_state(Audio *self, GError **error)
+const gchar *audio_get_state(Audio *self)
{
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;
+ return self->priv->state;
}
/* Signals handlers */
static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name, const GValue *value, gpointer data)
{
Audio *self = AUDIO(data);
+
+ if (g_strcmp0(name, "State") == 0) {
+ g_free(self->priv->state);
+ self->priv->state = g_value_dup_string(value);
+ }
+
g_signal_emit(self, signals[PROPERTY_CHANGED], 0, name, value);
}
diff --git a/src/lib/audio.h b/src/lib/audio.h
index 0a74154..8275d50 100644
--- a/src/lib/audio.h
+++ b/src/lib/audio.h
@@ -62,7 +62,7 @@ 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);
+const gchar *audio_get_state(Audio *self);
#endif /* __AUDIO_H */
diff --git a/src/lib/device.c b/src/lib/device.c
index e692f5c..b192e06 100644
--- a/src/lib/device.c
+++ b/src/lib/device.c
@@ -35,6 +35,21 @@
struct _DevicePrivate {
DBusGProxy *dbus_g_proxy;
+
+ /* Properties */
+ gchar *adapter;
+ gchar *address;
+ gchar *alias;
+ gboolean blocked;
+ guint32 class;
+ gboolean connected;
+ gchar *icon;
+ gboolean legacy_pairing;
+ gchar *name;
+ GPtrArray *nodes;
+ gboolean paired;
+ gboolean trusted;
+ GPtrArray *uuids;
};
G_DEFINE_TYPE(Device, device, G_TYPE_OBJECT);
@@ -87,6 +102,15 @@ static void device_dispose(GObject *gobject)
dbus_g_proxy_disconnect_signal(self->priv->dbus_g_proxy, "NodeRemoved", G_CALLBACK(node_removed_handler), self);
dbus_g_proxy_disconnect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self);
+ /* Properties free */
+ g_free(self->priv->adapter);
+ g_free(self->priv->address);
+ g_free(self->priv->alias);
+ g_free(self->priv->icon);
+ g_free(self->priv->name);
+ g_ptr_array_unref(self->priv->nodes);
+ g_ptr_array_unref(self->priv->uuids);
+
/* Chain up to the parent class */
G_OBJECT_CLASS(device_parent_class)->dispose(gobject);
}
@@ -219,6 +243,53 @@ static void device_post_init(Device *self)
/* PropertyChanged(string name, variant value) */
dbus_g_proxy_add_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
dbus_g_proxy_connect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self, NULL);
+
+ /* Properties init */
+ GError *error = NULL;
+ GHashTable *properties = device_get_properties(self, &error);
+ g_assert(error == NULL);
+ g_assert(properties != NULL);
+
+ /* object Adapter [readonly] */
+ self->priv->adapter = g_value_dup_string(g_hash_table_lookup(properties, "Adapter"));
+
+ /* string Address [readonly] */
+ self->priv->address = g_value_dup_string(g_hash_table_lookup(properties, "Address"));
+
+ /* string Alias [readwrite] */
+ self->priv->alias = g_value_dup_string(g_hash_table_lookup(properties, "Alias"));
+
+ /* boolean Blocked [readwrite] */
+ self->priv->blocked = g_value_get_boolean(g_hash_table_lookup(properties, "Blocked"));
+
+ /* uint32 Class [readonly] */
+ self->priv->class = g_value_get_uint(g_hash_table_lookup(properties, "Class"));
+
+ /* boolean Connected [readonly] */
+ self->priv->connected = g_value_get_boolean(g_hash_table_lookup(properties, "Connected"));
+
+ /* string Icon [readonly] */
+ self->priv->icon = g_value_dup_string(g_hash_table_lookup(properties, "Icon"));
+
+ /* boolean LegacyPairing [readonly] */
+ self->priv->legacy_pairing = g_value_get_boolean(g_hash_table_lookup(properties, "LegacyPairing"));
+
+ /* string Name [readonly] */
+ self->priv->name = g_value_dup_string(g_hash_table_lookup(properties, "Name"));
+
+ /* array{object} Nodes [readonly] */
+ self->priv->nodes = g_value_dup_boxed(g_hash_table_lookup(properties, "Nodes"));
+
+ /* boolean Paired [readonly] */
+ self->priv->paired = g_value_get_boolean(g_hash_table_lookup(properties, "Paired"));
+
+ /* boolean Trusted [readwrite] */
+ self->priv->trusted = g_value_get_boolean(g_hash_table_lookup(properties, "Trusted"));
+
+ /* array{string} UUIDs [readonly] */
+ self->priv->uuids = g_value_dup_boxed(g_hash_table_lookup(properties, "UUIDs"));
+
+ g_hash_table_unref(properties);
}
static void _device_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
@@ -227,150 +298,59 @@ static void _device_get_property(GObject *object, guint property_id, GValue *val
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(device_get_dbus_object_path(self)));
+ g_value_set_string(value, device_get_dbus_object_path(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, device_get_adapter(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, device_get_address(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, device_get_alias(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, device_get_blocked(self));
break;
case PROP_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);
- }
- }
+ g_value_set_uint(value, device_get_class(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, device_get_connected(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, device_get_icon(self));
break;
case PROP_LEGACY_PAIRING:
- {
- 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);
- }
- }
+ g_value_set_boolean(value, device_get_legacy_pairing(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, device_get_name(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boxed(value, device_get_nodes(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, device_get_paired(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, device_get_trusted(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boxed(value, device_get_uuids(self));
break;
default:
@@ -398,10 +378,7 @@ static void _device_set_property(GObject *object, guint property_id, const GValu
{
GError *error = NULL;
device_set_property(self, "Alias", value, &error);
- if (error != NULL) {
- g_print("%s: %s\n", g_get_prgname(), error->message);
- g_error_free(error);
- }
+ g_assert(error == NULL);
}
break;
@@ -409,10 +386,7 @@ static void _device_set_property(GObject *object, guint property_id, const GValu
{
GError *error = NULL;
device_set_property(self, "Blocked", value, &error);
- if (error != NULL) {
- g_print("%s: %s\n", g_get_prgname(), error->message);
- g_error_free(error);
- }
+ g_assert(error == NULL);
}
break;
@@ -420,10 +394,7 @@ static void _device_set_property(GObject *object, guint property_id, const GValu
{
GError *error = NULL;
device_set_property(self, "Trusted", value, &error);
- if (error != NULL) {
- g_print("%s: %s\n", g_get_prgname(), error->message);
- g_error_free(error);
- }
+ g_assert(error == NULL);
}
break;
@@ -527,217 +498,203 @@ const gchar *device_get_dbus_object_path(Device *self)
return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
}
-gchar *device_get_adapter(Device *self, GError **error)
+const gchar *device_get_adapter(Device *self)
{
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;
+ return self->priv->adapter;
}
-gchar *device_get_address(Device *self, GError **error)
+const gchar *device_get_address(Device *self)
{
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;
+ return self->priv->address;
}
-gchar *device_get_alias(Device *self, GError **error)
+const gchar *device_get_alias(Device *self)
{
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;
+ return self->priv->alias;
}
-void device_set_alias(Device *self, const gchar *value, GError **error)
+void device_set_alias(Device *self, const gchar *value)
{
- g_return_if_fail(DEVICE_IS(self));
+ g_assert(DEVICE_IS(self));
+
+ GError *error = NULL;
GValue t = {0};
g_value_init(&t, G_TYPE_STRING);
g_value_set_string(&t, value);
- device_set_property(self, "Alias", &t, error);
+ device_set_property(self, "Alias", &t, &error);
g_value_unset(&t);
+
+ g_assert(error == NULL);
}
-gboolean device_get_blocked(Device *self, GError **error)
+const gboolean device_get_blocked(Device *self)
{
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;
+ return self->priv->blocked;
}
-void device_set_blocked(Device *self, const gboolean value, GError **error)
+void device_set_blocked(Device *self, const gboolean value)
{
- g_return_if_fail(DEVICE_IS(self));
+ g_assert(DEVICE_IS(self));
+
+ GError *error = NULL;
GValue t = {0};
g_value_init(&t, G_TYPE_BOOLEAN);
g_value_set_boolean(&t, value);
- device_set_property(self, "Blocked", &t, error);
+ device_set_property(self, "Blocked", &t, &error);
g_value_unset(&t);
+
+ g_assert(error == NULL);
}
-guint32 device_get_class(Device *self, GError **error)
+const guint32 device_get_class(Device *self)
{
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;
+ return self->priv->class;
}
-gboolean device_get_connected(Device *self, GError **error)
+const gboolean device_get_connected(Device *self)
{
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;
+ return self->priv->connected;
}
-gchar *device_get_icon(Device *self, GError **error)
+const gchar *device_get_icon(Device *self)
{
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;
+ return self->priv->icon;
}
-gboolean device_get_legacy_pairing(Device *self, GError **error)
+const gboolean device_get_legacy_pairing(Device *self)
{
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;
+ return self->priv->legacy_pairing;
}
-gchar *device_get_name(Device *self, GError **error)
+const gchar *device_get_name(Device *self)
{
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;
+ return self->priv->name;
}
-GPtrArray *device_get_nodes(Device *self, GError **error)
+const GPtrArray *device_get_nodes(Device *self)
{
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;
+ return self->priv->nodes;
}
-gboolean device_get_paired(Device *self, GError **error)
+const gboolean device_get_paired(Device *self)
{
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;
+ return self->priv->paired;
}
-gboolean device_get_trusted(Device *self, GError **error)
+const gboolean device_get_trusted(Device *self)
{
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;
+ return self->priv->trusted;
}
-void device_set_trusted(Device *self, const gboolean value, GError **error)
+void device_set_trusted(Device *self, const gboolean value)
{
- g_return_if_fail(DEVICE_IS(self));
+ g_assert(DEVICE_IS(self));
+
+ GError *error = NULL;
GValue t = {0};
g_value_init(&t, G_TYPE_BOOLEAN);
g_value_set_boolean(&t, value);
- device_set_property(self, "Trusted", &t, error);
+ device_set_property(self, "Trusted", &t, &error);
g_value_unset(&t);
+
+ g_assert(error == NULL);
}
-GPtrArray *device_get_uuids(Device *self, GError **error)
+const GPtrArray *device_get_uuids(Device *self)
{
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;
+ return self->priv->uuids;
}
/* Signals handlers */
static void disconnect_requested_handler(DBusGProxy *dbus_g_proxy, gpointer data)
{
Device *self = DEVICE(data);
+
g_signal_emit(self, signals[DISCONNECT_REQUESTED], 0);
}
static void node_created_handler(DBusGProxy *dbus_g_proxy, const gchar *node, gpointer data)
{
Device *self = DEVICE(data);
+
g_signal_emit(self, signals[NODE_CREATED], 0, node);
}
static void node_removed_handler(DBusGProxy *dbus_g_proxy, const gchar *node, gpointer data)
{
Device *self = DEVICE(data);
+
g_signal_emit(self, signals[NODE_REMOVED], 0, node);
}
static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name, const GValue *value, gpointer data)
{
Device *self = DEVICE(data);
+
+ if (g_strcmp0(name, "Adapter") == 0) {
+ g_free(self->priv->adapter);
+ self->priv->adapter = g_value_dup_string(value);
+ } else if (g_strcmp0(name, "Address") == 0) {
+ g_free(self->priv->address);
+ self->priv->address = g_value_dup_string(value);
+ } else if (g_strcmp0(name, "Alias") == 0) {
+ g_free(self->priv->alias);
+ self->priv->alias = g_value_dup_string(value);
+ } else if (g_strcmp0(name, "Blocked") == 0) {
+ self->priv->blocked = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "Class") == 0) {
+ self->priv->class = g_value_get_uint(value);
+ } else if (g_strcmp0(name, "Connected") == 0) {
+ self->priv->connected = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "Icon") == 0) {
+ g_free(self->priv->icon);
+ self->priv->icon = g_value_dup_string(value);
+ } else if (g_strcmp0(name, "LegacyPairing") == 0) {
+ self->priv->legacy_pairing = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "Name") == 0) {
+ g_free(self->priv->name);
+ self->priv->name = g_value_dup_string(value);
+ } else if (g_strcmp0(name, "Nodes") == 0) {
+ g_ptr_array_unref(self->priv->nodes);
+ self->priv->nodes = g_value_dup_boxed(value);
+ } else if (g_strcmp0(name, "Paired") == 0) {
+ self->priv->paired = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "Trusted") == 0) {
+ self->priv->trusted = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "UUIDs") == 0) {
+ g_ptr_array_unref(self->priv->uuids);
+ self->priv->uuids = g_value_dup_boxed(value);
+ }
+
g_signal_emit(self, signals[PROPERTY_CHANGED], 0, name, value);
}
diff --git a/src/lib/device.h b/src/lib/device.h
index b00ba7e..594f691 100644
--- a/src/lib/device.h
+++ b/src/lib/device.h
@@ -67,22 +67,22 @@ 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);
+const gchar *device_get_adapter(Device *self);
+const gchar *device_get_address(Device *self);
+const gchar *device_get_alias(Device *self);
+void device_set_alias(Device *self, const gchar *value);
+const gboolean device_get_blocked(Device *self);
+void device_set_blocked(Device *self, const gboolean value);
+const guint32 device_get_class(Device *self);
+const gboolean device_get_connected(Device *self);
+const gchar *device_get_icon(Device *self);
+const gboolean device_get_legacy_pairing(Device *self);
+const gchar *device_get_name(Device *self);
+const GPtrArray *device_get_nodes(Device *self);
+const gboolean device_get_paired(Device *self);
+const gboolean device_get_trusted(Device *self);
+void device_set_trusted(Device *self, const gboolean value);
+const GPtrArray *device_get_uuids(Device *self);
#endif /* __DEVICE_H */
diff --git a/src/lib/input.c b/src/lib/input.c
index 74bc211..d1f73c4 100644
--- a/src/lib/input.c
+++ b/src/lib/input.c
@@ -35,6 +35,9 @@
struct _InputPrivate {
DBusGProxy *dbus_g_proxy;
+
+ /* Properties */
+ gboolean connected;
};
G_DEFINE_TYPE(Input, input, G_TYPE_OBJECT);
@@ -66,6 +69,9 @@ static void input_dispose(GObject *gobject)
/* DBus signals disconnection */
dbus_g_proxy_disconnect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self);
+ /* Properties free */
+ /* none */
+
/* Chain up to the parent class */
G_OBJECT_CLASS(input_parent_class)->dispose(gobject);
}
@@ -117,6 +123,17 @@ static void input_post_init(Input *self)
/* PropertyChanged(string name, variant value) */
dbus_g_proxy_add_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
dbus_g_proxy_connect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self, NULL);
+
+ /* Properties init */
+ GError *error = NULL;
+ GHashTable *properties = input_get_properties(self, &error);
+ g_assert(error == NULL);
+ g_assert(properties != NULL);
+
+ /* boolean Connected [readonly] */
+ self->priv->connected = g_value_get_boolean(g_hash_table_lookup(properties, "Connected"));
+
+ g_hash_table_unref(properties);
}
static void _input_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
@@ -125,18 +142,11 @@ static void _input_get_property(GObject *object, guint property_id, GValue *valu
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(input_get_dbus_object_path(self)));
+ g_value_set_string(value, input_get_dbus_object_path(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, input_get_connected(self));
break;
default:
@@ -205,22 +215,22 @@ const gchar *input_get_dbus_object_path(Input *self)
return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
}
-gboolean input_get_connected(Input *self, GError **error)
+const gboolean input_get_connected(Input *self)
{
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;
+ return self->priv->connected;
}
/* Signals handlers */
static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name, const GValue *value, gpointer data)
{
Input *self = INPUT(data);
+
+ if (g_strcmp0(name, "Connected") == 0) {
+ self->priv->connected = g_value_get_boolean(value);
+ }
+
g_signal_emit(self, signals[PROPERTY_CHANGED], 0, name, value);
}
diff --git a/src/lib/input.h b/src/lib/input.h
index ddca212..2f7721e 100644
--- a/src/lib/input.h
+++ b/src/lib/input.h
@@ -62,7 +62,7 @@ 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);
+const gboolean input_get_connected(Input *self);
#endif /* __INPUT_H */
diff --git a/src/lib/manager.c b/src/lib/manager.c
index ac8b6fd..9a37fe6 100644
--- a/src/lib/manager.c
+++ b/src/lib/manager.c
@@ -36,6 +36,9 @@
struct _ManagerPrivate {
DBusGProxy *dbus_g_proxy;
+
+ /* Properties */
+ GPtrArray *adapters;
};
G_DEFINE_TYPE(Manager, manager, G_TYPE_OBJECT);
@@ -75,6 +78,9 @@ static void manager_dispose(GObject *gobject)
dbus_g_proxy_disconnect_signal(self->priv->dbus_g_proxy, "DefaultAdapterChanged", G_CALLBACK(default_adapter_changed_handler), self);
dbus_g_proxy_disconnect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self);
+ /* Properties free */
+ g_ptr_array_unref(self->priv->adapters);
+
/* Chain up to the parent class */
G_OBJECT_CLASS(manager_parent_class)->dispose(gobject);
}
@@ -137,7 +143,7 @@ static void manager_init(Manager *self)
g_assert(self->priv->dbus_g_proxy != NULL);
- /* DBUS signals connection */
+ /* DBus signals connection */
/* AdapterAdded(object adapter) */
dbus_g_proxy_add_signal(self->priv->dbus_g_proxy, "AdapterAdded", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
@@ -154,6 +160,17 @@ static void manager_init(Manager *self)
/* PropertyChanged(string name, variant value) */
dbus_g_proxy_add_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
dbus_g_proxy_connect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self, NULL);
+
+ /* Properties init */
+ GError *error = NULL;
+ GHashTable *properties = manager_get_properties(self, &error);
+ g_assert(error == NULL);
+ g_assert(properties != NULL);
+
+ /* array{object} Adapters [readonly] */
+ self->priv->adapters = g_value_dup_boxed(g_hash_table_lookup(properties, "Adapters"));
+
+ g_hash_table_unref(properties);
}
static void _manager_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
@@ -162,14 +179,7 @@ static void _manager_get_property(GObject *object, guint property_id, GValue *va
switch (property_id) {
case PROP_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);
- }
- }
+ g_value_set_boxed(value, manager_get_adapters(self));
break;
default:
@@ -231,40 +241,44 @@ GHashTable *manager_get_properties(Manager *self, GError **error)
}
/* Properties access methods */
-GPtrArray *manager_get_adapters(Manager *self, GError **error)
+const GPtrArray *manager_get_adapters(Manager *self)
{
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;
+ return self->priv->adapters;
}
/* Signals handlers */
static void adapter_added_handler(DBusGProxy *dbus_g_proxy, const gchar *adapter, gpointer data)
{
Manager *self = MANAGER(data);
+
g_signal_emit(self, signals[ADAPTER_ADDED], 0, adapter);
}
static void adapter_removed_handler(DBusGProxy *dbus_g_proxy, const gchar *adapter, gpointer data)
{
Manager *self = MANAGER(data);
+
g_signal_emit(self, signals[ADAPTER_REMOVED], 0, adapter);
}
static void default_adapter_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *adapter, gpointer data)
{
Manager *self = MANAGER(data);
+
g_signal_emit(self, signals[DEFAULT_ADAPTER_CHANGED], 0, adapter);
}
static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name, const GValue *value, gpointer data)
{
Manager *self = MANAGER(data);
+
+ if (g_strcmp0(name, "Adapters") == 0) {
+ g_ptr_array_unref(self->priv->adapters);
+ self->priv->adapters = g_value_dup_boxed(value);
+ }
+
g_signal_emit(self, signals[PROPERTY_CHANGED], 0, name, value);
}
diff --git a/src/lib/manager.h b/src/lib/manager.h
index 48445a5..240aab8 100644
--- a/src/lib/manager.h
+++ b/src/lib/manager.h
@@ -61,7 +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);
+const GPtrArray *manager_get_adapters(Manager *self);
#endif /* __MANAGER_H */
diff --git a/src/lib/network.c b/src/lib/network.c
index ee941ea..e59bb3f 100644
--- a/src/lib/network.c
+++ b/src/lib/network.c
@@ -35,6 +35,11 @@
struct _NetworkPrivate {
DBusGProxy *dbus_g_proxy;
+
+ /* Properties */
+ gboolean connected;
+ gchar *interface;
+ gchar *uuid;
};
G_DEFINE_TYPE(Network, network, G_TYPE_OBJECT);
@@ -68,6 +73,10 @@ static void network_dispose(GObject *gobject)
/* DBus signals disconnection */
dbus_g_proxy_disconnect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self);
+ /* Properties free */
+ g_free(self->priv->interface);
+ g_free(self->priv->uuid);
+
/* Chain up to the parent class */
G_OBJECT_CLASS(network_parent_class)->dispose(gobject);
}
@@ -127,6 +136,23 @@ static void network_post_init(Network *self)
/* PropertyChanged(string name, variant value) */
dbus_g_proxy_add_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
dbus_g_proxy_connect_signal(self->priv->dbus_g_proxy, "PropertyChanged", G_CALLBACK(property_changed_handler), self, NULL);
+
+ /* Properties init */
+ GError *error = NULL;
+ GHashTable *properties = network_get_properties(self, &error);
+ g_assert(error == NULL);
+ g_assert(properties != NULL);
+
+ /* boolean Connected [readonly] */
+ self->priv->connected = g_value_get_boolean(g_hash_table_lookup(properties, "Connected"));
+
+ /* string Interface [readonly] */
+ self->priv->interface = g_value_dup_string(g_hash_table_lookup(properties, "Interface"));
+
+ /* string UUID [readonly] */
+ self->priv->uuid = g_value_dup_string(g_hash_table_lookup(properties, "UUID"));
+
+ g_hash_table_unref(properties);
}
static void _network_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
@@ -135,40 +161,19 @@ static void _network_get_property(GObject *object, guint property_id, GValue *va
switch (property_id) {
case PROP_DBUS_OBJECT_PATH:
- g_value_set_string(value, g_strdup(network_get_dbus_object_path(self)));
+ g_value_set_string(value, network_get_dbus_object_path(self));
break;
case PROP_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);
- }
- }
+ g_value_set_boolean(value, network_get_connected(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, network_get_interface(self));
break;
case PROP_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);
- }
- }
+ g_value_set_string(value, network_get_uuid(self));
break;
default:
@@ -242,46 +247,42 @@ const gchar *network_get_dbus_object_path(Network *self)
return dbus_g_proxy_get_path(self->priv->dbus_g_proxy);
}
-gboolean network_get_connected(Network *self, GError **error)
+const gboolean network_get_connected(Network *self)
{
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;
+ return self->priv->connected;
}
-gchar *network_get_interface(Network *self, GError **error)
+const gchar *network_get_interface(Network *self)
{
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;
+ return self->priv->interface;
}
-gchar *network_get_uuid(Network *self, GError **error)
+const gchar *network_get_uuid(Network *self)
{
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;
+ return self->priv->uuid;
}
/* Signals handlers */
static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name, const GValue *value, gpointer data)
{
Network *self = NETWORK(data);
+
+ if (g_strcmp0(name, "Connected") == 0) {
+ self->priv->connected = g_value_get_boolean(value);
+ } else if (g_strcmp0(name, "Interface") == 0) {
+ g_free(self->priv->interface);
+ self->priv->interface = g_value_dup_string(value);
+ } else if (g_strcmp0(name, "UUID") == 0) {
+ g_free(self->priv->uuid);
+ self->priv->uuid = g_value_dup_string(value);
+ }
+
g_signal_emit(self, signals[PROPERTY_CHANGED], 0, name, value);
}
diff --git a/src/lib/network.h b/src/lib/network.h
index 202014a..c715d34 100644
--- a/src/lib/network.h
+++ b/src/lib/network.h
@@ -62,9 +62,9 @@ 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);
+const gboolean network_get_connected(Network *self);
+const gchar *network_get_interface(Network *self);
+const gchar *network_get_uuid(Network *self);
#endif /* __NETWORK_H */
diff --git a/src/lib/serial.c b/src/lib/serial.c
index d9222a7..bf00c0b 100644
--- a/src/lib/serial.c
+++ b/src/lib/serial.c
@@ -93,7 +93,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(serial_get_dbus_object_path(self)));
+ g_value_set_string(value, serial_get_dbus_object_path(self));
break;
default: