diff options
author | Alexander Orlenko <zxteam@gmail.com> | 2010-06-28 18:12:05 +1100 |
---|---|---|
committer | Alexander Orlenko <zxteam@gmail.com> | 2010-06-28 18:12:05 +1100 |
commit | 7aa61b2ab2912d99e9dd5c941956469343ef895c (patch) | |
tree | d9b59c9458b03fbf3458a28513fb393409c29e3e | |
parent | 49cd2edce02a1acba5f6dc903cb1179b26e21855 (diff) | |
download | bluez-tools-7aa61b2ab2912d99e9dd5c941956469343ef895c.tar.gz |
Added properties caching
-rwxr-xr-x | contrib/gen-dbus-gobject.pl | 130 | ||||
-rw-r--r-- | src/bt-monitor.c | 92 | ||||
-rw-r--r-- | src/lib/adapter.c | 383 | ||||
-rw-r--r-- | src/lib/adapter.h | 34 | ||||
-rw-r--r-- | src/lib/audio.c | 43 | ||||
-rw-r--r-- | src/lib/audio.h | 2 | ||||
-rw-r--r-- | src/lib/device.c | 391 | ||||
-rw-r--r-- | src/lib/device.h | 32 | ||||
-rw-r--r-- | src/lib/input.c | 42 | ||||
-rw-r--r-- | src/lib/input.h | 2 | ||||
-rw-r--r-- | src/lib/manager.c | 46 | ||||
-rw-r--r-- | src/lib/manager.h | 2 | ||||
-rw-r--r-- | src/lib/network.c | 93 | ||||
-rw-r--r-- | src/lib/network.h | 6 | ||||
-rw-r--r-- | src/lib/serial.c | 2 |
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: |