diff options
author | Alexander Orlenko <zxteam@gmail.com> | 2010-08-06 20:04:44 +1100 |
---|---|---|
committer | Alexander Orlenko <zxteam@gmail.com> | 2010-08-06 20:04:44 +1100 |
commit | 75eae0453ceffc4507fc6a5aca7aebebfcd8c521 (patch) | |
tree | a28dcba95d9f98bea30a37a993556b99bbbc64f8 | |
parent | d1c224a0a9b4784ace2bcc6d47853e7be14b37f9 (diff) | |
download | bluez-tools-75eae0453ceffc4507fc6a5aca7aebebfcd8c521.tar.gz |
Some improvements in bt-obex
Added SIGINT && SIGTERM handlers to bt-agent. TODO: add this in monitor
-rwxr-xr-x | contrib/gen-dbus-gobject.pl | 4 | ||||
-rwxr-xr-x | contrib/generate-all.sh | 26 | ||||
-rw-r--r-- | src/bt-agent.c | 46 | ||||
-rw-r--r-- | src/bt-obex.c | 2 | ||||
-rw-r--r-- | src/lib/agent.c | 23 | ||||
-rw-r--r-- | src/lib/device.c | 4 |
6 files changed, 82 insertions, 23 deletions
diff --git a/contrib/gen-dbus-gobject.pl b/contrib/gen-dbus-gobject.pl index 002b0b4..c09c03f 100755 --- a/contrib/gen-dbus-gobject.pl +++ b/contrib/gen-dbus-gobject.pl @@ -796,7 +796,7 @@ EOT $properties_registration .= "\tpspec = g_param_spec_string(\"$property\", NULL, NULL, NULL, ".($p{'mode'} eq 'readonly' ? 'G_PARAM_READABLE' : 'G_PARAM_READWRITE').");\n"; $properties_init .= "\tif (g_hash_table_lookup(properties, \"$property\")) {\n". - "\t\tself->priv->$property_var = (gchar *)g_value_dup_boxed(g_hash_table_lookup(properties, \"$property\"));\n". + "\t\tself->priv->$property_var = (gchar *) g_value_dup_boxed(g_hash_table_lookup(properties, \"$property\"));\n". "\t} else {\n". "\t\tself->priv->$property_var = g_strdup(\"undefined\");\n". "\t}\n"; @@ -804,7 +804,7 @@ EOT $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 = (gchar *)g_value_dup_boxed(value);\n"; + "\t\tself->priv->$property_var = (gchar *) g_value_dup_boxed(value);\n"; } elsif ($p{'type'} eq 'array{object}') { $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"; $properties_init .= diff --git a/contrib/generate-all.sh b/contrib/generate-all.sh index 30b6c73..1f70e2f 100755 --- a/contrib/generate-all.sh +++ b/contrib/generate-all.sh @@ -3,28 +3,28 @@ # BlueZ API # adapter-api.txt -./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/adapter-api.txt > ../src/lib/adapter.h -./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/adapter-api.txt > ../src/lib/adapter.c +./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/adapter-api.txt > ../src/lib/bluez/adapter.h +./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/adapter-api.txt > ../src/lib/bluez/adapter.c # audio-api.txt -./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/audio-api.txt > ../src/lib/audio.h -./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/audio-api.txt > ../src/lib/audio.c +./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/audio-api.txt > ../src/lib/bluez/audio.h +./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/audio-api.txt > ../src/lib/bluez/audio.c # device-api.txt -./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/device-api.txt > ../src/lib/device.h -./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/device-api.txt > ../src/lib/device.c +./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/device-api.txt > ../src/lib/bluez/device.h +./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/device-api.txt > ../src/lib/bluez/device.c # input-api.txt -./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/input-api.txt > ../src/lib/input.h -./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/input-api.txt > ../src/lib/input.c +./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/input-api.txt > ../src/lib/bluez/input.h +./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/input-api.txt > ../src/lib/bluez/input.c # manager-api.txt -./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/manager-api.txt > ../src/lib/manager.h -./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/manager-api.txt > ../src/lib/manager.c +./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/manager-api.txt > ../src/lib/bluez/manager.h +./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/manager-api.txt > ../src/lib/bluez/manager.c # network-api.txt -./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/network-api.txt > ../src/lib/network.h -./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/network-api.txt > ../src/lib/network.c +./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/network-api.txt > ../src/lib/bluez/network.h +./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/network-api.txt > ../src/lib/bluez/network.c ./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/network-api.txt 2 > ../src/lib/network_hub.h ./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/network-api.txt 2 > ../src/lib/network_hub.c @@ -39,7 +39,7 @@ ./gen-dbus-gobject.pl -header bluez-api-4.66-fixed/serial-api.txt > ../src/lib/serial.h ./gen-dbus-gobject.pl -source bluez-api-4.66-fixed/serial-api.txt > ../src/lib/serial.c -# obex-data-server API +# ODS (obex-data-server) API ./gen-dbus-gobject.pl -header obex-data-server-api-0.4.5-fixed.txt > ../src/lib/obexmanager.h ./gen-dbus-gobject.pl -source obex-data-server-api-0.4.5-fixed.txt > ../src/lib/obexmanager.c diff --git a/src/bt-agent.c b/src/bt-agent.c index f6b9a16..3af0f5b 100644 --- a/src/bt-agent.c +++ b/src/bt-agent.c @@ -27,10 +27,31 @@ #include <stdlib.h> #include <string.h> +#include <signal.h> #include <glib.h> #include "lib/bluez-dbus.h" +static gboolean need_unregister = TRUE; +static GMainLoop *mainloop = NULL; + +static void sigterm_handler(int sig) +{ + g_message("%s received", sig == SIGTERM ? "SIGTERM" : "SIGINT"); + g_main_loop_quit(mainloop); +} + +static void agent_released(Agent *agent, gpointer data) +{ + g_assert(data != NULL); + GMainLoop *mainloop = data; + + need_unregister = FALSE; + + if (g_main_loop_is_running(mainloop)) + g_main_loop_quit(mainloop); +} + static gchar *adapter_arg = NULL; static GOptionEntry entries[] = { @@ -66,6 +87,8 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } + mainloop = g_main_loop_new(NULL, FALSE); + Manager *manager = g_object_new(MANAGER_TYPE, NULL); Adapter *adapter = find_adapter(adapter_arg, &error); @@ -76,18 +99,31 @@ int main(int argc, char *argv[]) adapter_register_agent(adapter, DBUS_AGENT_PATH, "DisplayYesNo", &error); exit_if_error(error); - GMainLoop *mainloop = g_main_loop_new(NULL, FALSE); + g_signal_connect(agent, "AgentReleased", G_CALLBACK(agent_released), mainloop); + + /* Add SIGTERM && SIGINT handlers */ + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = sigterm_handler; + sigaction(SIGTERM, &sa, NULL); + sigaction(SIGINT, &sa, NULL); + g_main_loop_run(mainloop); - // TODO: Add SIGINT handler (Ctrl+C) + if (need_unregister) { + adapter_unregister_agent(adapter, DBUS_AGENT_PATH, &error); + exit_if_error(error); - adapter_unregister_agent(adapter, DBUS_AGENT_PATH, &error); - exit_if_error(error); + /* Waiting for AgentReleased signal */ + g_main_loop_run(mainloop); + } - g_main_loop_unref(mainloop); g_object_unref(agent); g_object_unref(adapter); g_object_unref(manager); + + g_main_loop_unref(mainloop); + dbus_disconnect(); exit(EXIT_SUCCESS); diff --git a/src/bt-obex.c b/src/bt-obex.c index ea27e28..bed079f 100644 --- a/src/bt-obex.c +++ b/src/bt-obex.c @@ -460,7 +460,7 @@ int main(int argc, char *argv[]) g_free(root_dir); g_hash_table_unref(server_sessions); } else if (opp_arg) { - + } g_object_unref(manager); diff --git a/src/lib/agent.c b/src/lib/agent.c index eb1c6b9..b18f316 100644 --- a/src/lib/agent.c +++ b/src/lib/agent.c @@ -38,17 +38,29 @@ #define AGENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), AGENT_TYPE, AgentPrivate)) struct _AgentPrivate { + /* Unused */ DBusGProxy *proxy; }; G_DEFINE_TYPE(Agent, agent, G_TYPE_OBJECT); +enum { + AGENT_RELEASED, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = {0}; + static void agent_dispose(GObject *gobject) { Agent *self = AGENT(gobject); dbus_g_connection_unregister_g_object(conn, gobject); + /* Proxy free */ + //g_object_unref(self->priv->proxy); + /* Chain up to the parent class */ G_OBJECT_CLASS(agent_parent_class)->dispose(gobject); } @@ -60,6 +72,14 @@ static void agent_class_init(AgentClass *klass) gobject_class->dispose = agent_dispose; g_type_class_add_private(klass, sizeof(AgentPrivate)); + + /* Signals registation */ + signals[AGENT_RELEASED] = g_signal_new("AgentReleased", + G_TYPE_FROM_CLASS(gobject_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void agent_init(Agent *self) @@ -78,6 +98,9 @@ static void agent_init(Agent *self) gboolean agent_release(Agent *self, GError **error) { g_print("Agent released\n"); + + g_signal_emit(self, signals[AGENT_RELEASED], 0); + return TRUE; } diff --git a/src/lib/device.c b/src/lib/device.c index b5c0ee5..fdc9920 100644 --- a/src/lib/device.c +++ b/src/lib/device.c @@ -286,7 +286,7 @@ static void device_post_init(Device *self, const gchar *dbus_object_path) /* object Adapter [readonly] */ if (g_hash_table_lookup(properties, "Adapter")) { - self->priv->adapter = (gchar *)g_value_dup_boxed(g_hash_table_lookup(properties, "Adapter")); + self->priv->adapter = (gchar *) g_value_dup_boxed(g_hash_table_lookup(properties, "Adapter")); } else { self->priv->adapter = g_strdup("undefined"); } @@ -727,7 +727,7 @@ static void property_changed_handler(DBusGProxy *dbus_g_proxy, const gchar *name if (g_strcmp0(name, "Adapter") == 0) { g_free(self->priv->adapter); - self->priv->adapter = (gchar *)g_value_dup_boxed(value); + self->priv->adapter = (gchar *) g_value_dup_boxed(value); } else if (g_strcmp0(name, "Address") == 0) { g_free(self->priv->address); self->priv->address = g_value_dup_string(value); |