diff options
| author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2007-03-29 14:01:25 +0000 | 
|---|---|---|
| committer | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2007-03-29 14:01:25 +0000 | 
| commit | fe648edb4d67bb603509f392d3c82ebfe8334921 (patch) | |
| tree | 2eaa330b4db575116af98a2f914b63f4ecd67184 | |
| parent | ead055c1bc5bf032488d2b71838596a3e355a707 (diff) | |
Add code to extract record attributes.
| -rw-r--r-- | network/connection.c | 71 | ||||
| -rw-r--r-- | network/connection.h | 3 | ||||
| -rw-r--r-- | network/manager.c | 10 | 
3 files changed, 76 insertions, 8 deletions
| diff --git a/network/connection.c b/network/connection.c index 1ed9e433..7b944c6c 100644 --- a/network/connection.c +++ b/network/connection.c @@ -34,6 +34,8 @@  #include <bluetooth/bluetooth.h>  #include <bluetooth/l2cap.h>  #include <bluetooth/bnep.h> +#include <bluetooth/sdp.h> +#include <bluetooth/sdp_lib.h>  #include <glib.h> @@ -60,6 +62,8 @@ struct network_conn {  	bdaddr_t dst;  	char *path;	/* D-Bus path */  	char *dev;	/* BNEP interface name */ +	char *name; +	char *desc;  	uint16_t id;	/* Service Class Identifier */  	conn_state state;  	int sk; @@ -81,7 +85,10 @@ static gboolean bnep_watchdog_cb(GIOChannel *chan, GIOCondition cond,  	send_message_and_unref(nc->conn, signal);  	info("%s disconnected", nc->dev); -	return (!nc->state); +	nc->state = DISCONNECTED; +	g_io_channel_close(chan); +	g_io_channel_unref(chan); +	return FALSE;  }  static gboolean bnep_connect_cb(GIOChannel *chan, GIOCondition cond, @@ -332,13 +339,44 @@ static DBusHandlerResult get_uuid(DBusConnection *conn, DBusMessage *msg,  static DBusHandlerResult get_name(DBusConnection *conn, DBusMessage *msg,  					void *data)  { -	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +	struct network_conn *nc = data; +	DBusMessage *reply; + +	if (!nc->name) { +		err_failed(conn, msg, "Cannot find service name"); +		return DBUS_HANDLER_RESULT_HANDLED; +	} + +	reply = dbus_message_new_method_return(msg); +	if (!reply) +		return DBUS_HANDLER_RESULT_NEED_MEMORY; + +	dbus_message_append_args(reply, DBUS_TYPE_STRING, &nc->name, +					DBUS_TYPE_INVALID); + +	return send_message_and_unref(conn, reply); +  }  static DBusHandlerResult get_description(DBusConnection *conn,  					DBusMessage *msg, void *data)  { -	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +	struct network_conn *nc = data; +	DBusMessage *reply; + +	if (!nc->desc) { +		err_failed(conn, msg, "Cannot find service description"); +		return DBUS_HANDLER_RESULT_HANDLED; +	} + +	reply = dbus_message_new_method_return(msg); +	if (!reply) +		return DBUS_HANDLER_RESULT_NEED_MEMORY; + +	dbus_message_append_args(reply, DBUS_TYPE_STRING, &nc->desc, +					DBUS_TYPE_INVALID); + +	return send_message_and_unref(conn, reply);  }  static DBusHandlerResult get_interface(DBusConnection *conn, DBusMessage *msg, @@ -494,6 +532,12 @@ static void connection_free(struct network_conn *nc)  	if (nc->dev)  		g_free(nc->dev); +	if (nc->name) +		g_free(nc->name); + +	if (nc->desc) +		g_free(nc->desc); +  	g_free(nc);  } @@ -513,9 +557,10 @@ static const DBusObjectPathVTable connection_table = {  };  int connection_register(DBusConnection *conn, const char *path, -			const char *addr, uint16_t id) +			const char *addr, uint16_t id, const sdp_record_t *rec)  {  	struct network_conn *nc; +	sdp_data_t *d;  	if (!conn)  		return -1; @@ -533,7 +578,23 @@ int connection_register(DBusConnection *conn, const char *path,  	bacpy(&nc->src, BDADDR_ANY);  	str2ba(addr, &nc->dst);  	nc->id = id; -	/* FIXME: Check for device */ + +	/* Extract service name from record */ +	d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY); +	if (d) { +		nc->name = g_new0(char, d->unitSize); +		snprintf(nc->name, d->unitSize, "%.*s", d->unitSize, +				d->val.str); +	} + +	/* Extract service description from record */ +	d = sdp_data_get(rec, SDP_ATTR_SVCDESC_PRIMARY); +	if (d) { +		nc->desc = g_new0(char, d->unitSize); +		snprintf(nc->desc, d->unitSize, "%.*s", d->unitSize, +				d->val.str); +	} +  	nc->dev = g_strdup("bnep%d");  	nc->state = DISCONNECTED;  	nc->conn = conn; diff --git a/network/connection.h b/network/connection.h index 08861a72..08f36e1c 100644 --- a/network/connection.h +++ b/network/connection.h @@ -22,4 +22,5 @@   */  int connection_register(DBusConnection *conn, const char *path, -						const char *addr, uint16_t id); +						const char *addr, uint16_t id, +						const sdp_record_t *rec); diff --git a/network/manager.c b/network/manager.c index 58c335bb..2f745c1c 100644 --- a/network/manager.c +++ b/network/manager.c @@ -29,6 +29,8 @@  #include <bluetooth/hci.h>  #include <bluetooth/hci_lib.h>  #include <bluetooth/bnep.h> +#include <bluetooth/sdp.h> +#include <bluetooth/sdp_lib.h>  #include <glib.h> @@ -178,8 +180,9 @@ static void pan_record_reply(DBusPendingCall *call, void *data)  	struct pending_reply *pr = data;  	DBusMessage *reply = dbus_pending_call_steal_reply(call);  	DBusError derr; -	int len; +	int len, scanned;  	uint8_t *rec_bin; +	sdp_record_t *rec;  	dbus_error_init(&derr);  	if (dbus_set_error_from_message(&derr, reply)) { @@ -207,8 +210,10 @@ static void pan_record_reply(DBusPendingCall *call, void *data)  		goto fail;  	} +	rec = sdp_extract_pdu(rec_bin, &scanned); -	if (connection_register(pr->conn, pr->path, pr->addr, pr->id) == -1) { +	if (connection_register(pr->conn, pr->path, pr->addr, pr->id, +				rec) == -1) {  		err_failed(pr->conn, pr->msg, "D-Bus path registration failed");  		goto fail;  	} @@ -218,6 +223,7 @@ static void pan_record_reply(DBusPendingCall *call, void *data)  	create_path(pr->conn, pr->msg, g_strdup (pr->path), "ConnectionCreated");  fail: +	sdp_record_free(rec);  	dbus_error_free(&derr);  	pending_reply_free(pr);  	dbus_message_unref(reply); | 
