diff options
| author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-12-01 14:44:30 -0300 | 
|---|---|---|
| committer | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-12-01 14:44:30 -0300 | 
| commit | 82c82fe3270f9d33f5a2c7b2e7009fc9f4c7a131 (patch) | |
| tree | 8ad9655b1741af678adef1f7779e69aebee0d30c | |
| parent | a537a1998dd27a9ab92f4eaae47fc09f36a83545 (diff) | |
Add disconnect watch for Network.Connect method.
If the client leaves or dies the connection should be removed.
| -rw-r--r-- | network/connection.c | 33 | 
1 files changed, 28 insertions, 5 deletions
diff --git a/network/connection.c b/network/connection.c index 1bb7bd92..8d4a2ed7 100644 --- a/network/connection.c +++ b/network/connection.c @@ -66,6 +66,7 @@ struct network_conn {  	uint16_t	id;		/* Role: Service Class Identifier */  	conn_state	state;  	int		sk; +	guint		watch;		/* Disconnect watch */  	struct network_peer *peer;  }; @@ -152,6 +153,10 @@ static gboolean bnep_watchdog_cb(GIOChannel *chan, GIOCondition cond,  		emit_property_changed(connection, nc->peer->path,  					NETWORK_PEER_INTERFACE, "UUID",  					DBUS_TYPE_STRING, &property); +		if (nc->watch) { +			g_dbus_remove_watch(connection, nc->watch); +			nc->watch = 0; +		}  	}  	info("%s disconnected", nc->dev); @@ -345,6 +350,19 @@ failed:  	g_dbus_send_message(connection, reply);  } +static void connection_destroy(DBusConnection *conn, void *user_data) +{ +	struct network_conn *nc = user_data; + +	nc->watch = 0; + +	if (nc->state == CONNECTED) { +		bnep_if_down(nc->dev); +		bnep_kill_connection(&nc->peer->dst); +	} else +		close(nc->sk); +} +  /* Connect and initiate BNEP session */  static DBusMessage *connection_connect(DBusConnection *conn,  						DBusMessage *msg, void *data) @@ -369,6 +387,10 @@ static DBusMessage *connection_connect(DBusConnection *conn,  	nc->state = CONNECTING;  	nc->msg = dbus_message_ref(msg); +	nc->watch = g_dbus_add_disconnect_watch(conn, +						dbus_message_get_sender(msg), +						connection_destroy, +						nc, NULL);  	err = bt_l2cap_connect(&peer->src, &peer->dst, BNEP_PSM, BNEP_MTU,  							connect_cb, nc); @@ -388,11 +410,12 @@ static DBusMessage *connection_cancel(DBusConnection *conn,  {  	struct network_conn *nc = data; -	if (nc->state == CONNECTED) { -		bnep_if_down(nc->dev); -		bnep_kill_connection(&nc->peer->dst); -	} else -		close(nc->sk); +	if (nc->watch) { +		g_dbus_remove_watch(conn, nc->watch); +		nc->watch = 0; +	} + +	connection_destroy(conn, data);  	return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);  }  | 
