* [PATCH v4 1/3] hfp_ag_bluez5: Create a hash to store connections
@ 2013-04-19 15:00 Paulo Borges
2013-04-19 15:00 ` [PATCH v4 2/3] hfp_ag_bluez5: Add watch for G_IO_HUP when connect Paulo Borges
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Paulo Borges @ 2013-04-19 15:00 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1466 bytes --]
We need to store active connections so we can disconnect them at
RequestDisconnect().
When we remove a connection from the hash, we also close it.
---
plugins/hfp_ag_bluez5.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/plugins/hfp_ag_bluez5.c b/plugins/hfp_ag_bluez5.c
index c171c87..edc76e6 100644
--- a/plugins/hfp_ag_bluez5.c
+++ b/plugins/hfp_ag_bluez5.c
@@ -48,6 +48,17 @@
static guint modemwatch_id;
static GList *modems;
static GHashTable *sim_hash = NULL;
+static GHashTable *connection_hash;
+
+static void connection_removed_notify(gpointer data)
+{
+ int fd = GPOINTER_TO_INT(data);
+
+ DBG("%d", fd);
+
+ shutdown(fd, SHUT_RDWR);
+ close(fd);
+}
static DBusMessage *profile_new_connection(DBusConnection *conn,
DBusMessage *msg, void *data)
@@ -251,6 +262,9 @@ static int hfp_ag_init(void)
modemwatch_id = __ofono_modemwatch_add(modem_watch, NULL, NULL);
__ofono_modem_foreach(call_modemwatch, NULL);
+ connection_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, connection_removed_notify);
+
return 0;
}
@@ -262,6 +276,8 @@ static void hfp_ag_exit(void)
g_dbus_unregister_interface(conn, HFP_AG_EXT_PROFILE_PATH,
BLUEZ_PROFILE_INTERFACE);
+ g_hash_table_destroy(connection_hash);
+
g_list_free(modems);
g_hash_table_foreach_remove(sim_hash, sim_watch_remove, NULL);
g_hash_table_destroy(sim_hash);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 2/3] hfp_ag_bluez5: Add watch for G_IO_HUP when connect
2013-04-19 15:00 [PATCH v4 1/3] hfp_ag_bluez5: Create a hash to store connections Paulo Borges
@ 2013-04-19 15:00 ` Paulo Borges
2013-04-19 15:01 ` [PATCH v4 3/3] hfp_ag_bluez5: Implement RequestDisconnection() Paulo Borges
2013-04-19 15:36 ` [PATCH v4 1/3] hfp_ag_bluez5: Create a hash to store connections Denis Kenzior
2 siblings, 0 replies; 4+ messages in thread
From: Paulo Borges @ 2013-04-19 15:00 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1599 bytes --]
A watch to G_IO_HUP is added to remove the file descriptor when the
emulator is automatically disconnected when its GAtServer closes.
We use a dupped file descriptor because the events aren't delivered to
the file descriptor who originated them.
---
plugins/hfp_ag_bluez5.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/plugins/hfp_ag_bluez5.c b/plugins/hfp_ag_bluez5.c
index edc76e6..67b6a8d 100644
--- a/plugins/hfp_ag_bluez5.c
+++ b/plugins/hfp_ag_bluez5.c
@@ -60,12 +60,24 @@ static void connection_removed_notify(gpointer data)
close(fd);
}
+static gboolean io_hup_cb(GIOChannel *io, GIOCondition cond, gpointer data)
+{
+ char *device = data;
+
+ DBG("Remove %s", device);
+
+ g_hash_table_remove(connection_hash, device);
+
+ return FALSE;
+}
+
static DBusMessage *profile_new_connection(DBusConnection *conn,
DBusMessage *msg, void *data)
{
DBusMessageIter entry;
const char *device;
- int fd;
+ GIOChannel *io;
+ int fd, fd_dup;
struct ofono_emulator *em;
struct ofono_modem *modem;
@@ -112,6 +124,15 @@ static DBusMessage *profile_new_connection(DBusConnection *conn,
ofono_emulator_register(em, fd);
+ fd_dup = dup(fd);
+ io = g_io_channel_unix_new(fd_dup);
+ g_io_add_watch_full(io, G_PRIORITY_DEFAULT, G_IO_HUP, io_hup_cb,
+ g_strdup(device), g_free);
+ g_io_channel_unref(io);
+
+ g_hash_table_insert(connection_hash, g_strdup(device),
+ GINT_TO_POINTER(fd_dup));
+
return dbus_message_new_method_return(msg);
invalid:
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 3/3] hfp_ag_bluez5: Implement RequestDisconnection()
2013-04-19 15:00 [PATCH v4 1/3] hfp_ag_bluez5: Create a hash to store connections Paulo Borges
2013-04-19 15:00 ` [PATCH v4 2/3] hfp_ag_bluez5: Add watch for G_IO_HUP when connect Paulo Borges
@ 2013-04-19 15:01 ` Paulo Borges
2013-04-19 15:36 ` [PATCH v4 1/3] hfp_ag_bluez5: Create a hash to store connections Denis Kenzior
2 siblings, 0 replies; 4+ messages in thread
From: Paulo Borges @ 2013-04-19 15:01 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1364 bytes --]
When a RequestDisconnect() is received, the socket must be closed.
This way, the related emulator will be freed.
---
plugins/hfp_ag_bluez5.c | 24 +++++++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/plugins/hfp_ag_bluez5.c b/plugins/hfp_ag_bluez5.c
index 67b6a8d..4383161 100644
--- a/plugins/hfp_ag_bluez5.c
+++ b/plugins/hfp_ag_bluez5.c
@@ -163,11 +163,29 @@ static DBusMessage *profile_cancel(DBusConnection *conn,
static DBusMessage *profile_disconnection(DBusConnection *conn,
DBusMessage *msg, void *user_data)
{
+ DBusMessageIter iter;
+ const char *device;
+
DBG("Profile handler RequestDisconnection");
- return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE
- ".NotImplemented",
- "Implementation not provided");
+ if (!dbus_message_iter_init(msg, &iter))
+ goto invalid;
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
+ goto invalid;
+
+ dbus_message_iter_get_basic(&iter, &device);
+
+ DBG("%s", device);
+
+ if (!g_hash_table_remove(connection_hash, device))
+ goto invalid;
+
+ return dbus_message_new_method_return(msg);
+
+invalid:
+ return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE ".Rejected",
+ "Invalid arguments in method call");
}
static const GDBusMethodTable profile_methods[] = {
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v4 1/3] hfp_ag_bluez5: Create a hash to store connections
2013-04-19 15:00 [PATCH v4 1/3] hfp_ag_bluez5: Create a hash to store connections Paulo Borges
2013-04-19 15:00 ` [PATCH v4 2/3] hfp_ag_bluez5: Add watch for G_IO_HUP when connect Paulo Borges
2013-04-19 15:01 ` [PATCH v4 3/3] hfp_ag_bluez5: Implement RequestDisconnection() Paulo Borges
@ 2013-04-19 15:36 ` Denis Kenzior
2 siblings, 0 replies; 4+ messages in thread
From: Denis Kenzior @ 2013-04-19 15:36 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1059 bytes --]
Hi Paulo,
On 04/19/2013 10:00 AM, Paulo Borges wrote:
> We need to store active connections so we can disconnect them at
> RequestDisconnect().
>
> When we remove a connection from the hash, we also close it.
> ---
> plugins/hfp_ag_bluez5.c | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/plugins/hfp_ag_bluez5.c b/plugins/hfp_ag_bluez5.c
> index c171c87..edc76e6 100644
> --- a/plugins/hfp_ag_bluez5.c
> +++ b/plugins/hfp_ag_bluez5.c
> @@ -48,6 +48,17 @@
> static guint modemwatch_id;
> static GList *modems;
> static GHashTable *sim_hash = NULL;
> +static GHashTable *connection_hash;
> +
> +static void connection_removed_notify(gpointer data)
> +{
> + int fd = GPOINTER_TO_INT(data);
> +
> + DBG("%d", fd);
> +
> + shutdown(fd, SHUT_RDWR);
> + close(fd);
> +}
I will be a bit nit-picky here, but shutdown() does not belong here.
You only want to do this inside the RequestDisconnection() implementation.
Also, please name this function connection_destroy().
Regards,
-Denis
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-04-19 15:36 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-19 15:00 [PATCH v4 1/3] hfp_ag_bluez5: Create a hash to store connections Paulo Borges
2013-04-19 15:00 ` [PATCH v4 2/3] hfp_ag_bluez5: Add watch for G_IO_HUP when connect Paulo Borges
2013-04-19 15:01 ` [PATCH v4 3/3] hfp_ag_bluez5: Implement RequestDisconnection() Paulo Borges
2013-04-19 15:36 ` [PATCH v4 1/3] hfp_ag_bluez5: Create a hash to store connections Denis Kenzior
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox