* [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.