hfp_ag_bluez5: Add watch for G_IO_HUP when connect
authorPaulo Borges <paulo.borges@openbossa.org>
Fri, 19 Apr 2013 22:19:04 +0000 (19:19 -0300)
committerDenis Kenzior <denkenz@gmail.com>
Mon, 22 Apr 2013 08:54:24 +0000 (03:54 -0500)
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

index bbced26313677cd9caeb2daf8eb3d9959d16c994..a0203b134e3958000e9034bf81dc8f92502feab9 100644 (file)
@@ -59,12 +59,24 @@ static void connection_destroy(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;
 
@@ -111,6 +123,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: