Open Source Telephony
 help / color / mirror / Atom feed
* [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