diff options
| author | Ulisses Furquim <ulissesf@gmail.com> | 2006-09-04 17:16:42 +0000 | 
|---|---|---|
| committer | Ulisses Furquim <ulissesf@gmail.com> | 2006-09-04 17:16:42 +0000 | 
| commit | 287671bee4169d7c247b680b59ffe09300e9ae9c (patch) | |
| tree | 46c6fc13aa19c13b513499ab7d9a833fe902fce2 /hcid/dbus-sdp.c | |
| parent | 3afdb2d2b7e8938e7cf2c225d61e628c04e6310e (diff) | |
Change to use sdp_connect() to make async searchs
Diffstat (limited to 'hcid/dbus-sdp.c')
| -rw-r--r-- | hcid/dbus-sdp.c | 73 | 
1 files changed, 23 insertions, 50 deletions
diff --git a/hcid/dbus-sdp.c b/hcid/dbus-sdp.c index e0ad16d4..bf60d7fa 100644 --- a/hcid/dbus-sdp.c +++ b/hcid/dbus-sdp.c @@ -78,6 +78,7 @@ typedef int connect_cb_t (struct transaction_context *t);  struct pending_connect {  	DBusConnection *conn;  	DBusMessage *rq; +	sdp_session_t *session;  	char *dst;  	connect_cb_t *conn_cb;  }; @@ -766,7 +767,7 @@ static gboolean sdp_client_connect_cb(GIOChannel *chan, GIOCondition cond, void  	ctxt->conn = dbus_connection_ref(c->conn);  	ctxt->rq = dbus_message_ref(c->rq); -	ctxt->session = sdp_create(sk, 0); +	ctxt->session = c->session;  	/* set the complete transaction callback and starts the search request */  	err = c->conn_cb(ctxt); @@ -791,73 +792,45 @@ done:  	return FALSE;  } -static int connect_request(DBusConnection *conn, DBusMessage *msg, uint16_t dev_id, -				const char *dst, connect_cb_t *cb, int *err) +static int connect_request(DBusConnection *conn, DBusMessage *msg, +			   uint16_t dev_id, const char *dst, +			   connect_cb_t *cb, int *err)  {  	struct pending_connect *c = NULL;  	GIOChannel *chan = NULL; -	struct sockaddr_l2 sa; -	int sk, watch = 0; +	bdaddr_t srcba, dstba; -	// create L2CAP connection -	/* FIXME: use set_nonblocking */ -	sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); -	if (sk < 0) { +	c = pending_connect_new(conn, msg, dst, cb); +	if (!c) {  		if (err) -			*err = errno; - +			*err = ENOMEM;  		return -1;  	} -	chan = g_io_channel_unix_new(sk); -	g_io_channel_set_close_on_unref(chan, TRUE); - -	sa.l2_family = AF_BLUETOOTH; -	sa.l2_psm = 0; +	hci_devba(dev_id, &srcba); +	str2ba(dst, &dstba); -	hci_devba(dev_id, &sa.l2_bdaddr); - -	if (bind(sk, (struct sockaddr *) &sa, sizeof(sa)) < 0) { +	c->session = sdp_connect(&srcba, &dstba, SDP_NON_BLOCKING); +	if (!c->session) {  		if (err)  			*err = errno; -		goto fail; -	} - -	sa.l2_psm = htobs(SDP_PSM); -	str2ba(dst, &sa.l2_bdaddr); - -	c = pending_connect_new(conn, msg, dst, cb); -	if (!c) { -		if (err) -			*err = ENOMEM; -		goto fail; +		error("sdp_connect() failed:%s (%d)", strerror(errno), errno); +		pending_connect_free(c); +		return -1;  	} -	fcntl(sk, F_SETFL, fcntl(sk, F_GETFL, 0)|O_NONBLOCK); -	if (connect(sk, (struct sockaddr *) &sa, sizeof(sa)) < 0) { -		if (!(errno == EAGAIN || errno == EINPROGRESS)) { -			if (err) -				*err = errno; -			error("connect() failed:%s (%d)", strerror(errno), errno); -			goto fail; -		} +	chan = g_io_channel_unix_new(c->session->sock); +	g_io_channel_set_close_on_unref(chan, TRUE); -		watch = g_io_add_watch(chan, G_IO_OUT, -					sdp_client_connect_cb, c); -		pending_connects = slist_append(pending_connects, c); -	} else { +	if (sdp_is_connected(c->session)) {  		sdp_client_connect_cb(chan, G_IO_OUT, c); +		return 0;  	} -	return 0; -fail: -	if (chan) -		g_io_channel_unref(chan); +	g_io_add_watch(chan, G_IO_OUT, sdp_client_connect_cb, c); +	pending_connects = slist_append(pending_connects, c); -	if (c) -		pending_connect_free(c); - -	return -1; +	return 0;  }  static int remote_svc_rec_conn_cb(struct transaction_context *ctxt)  | 
