[PATCH obexd 6/6] client: queue transfers in pbap sessions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx>

Previous implementation reported busy when trying to queue several
operations in the same session.
---
 client/pbap.c |  127 +++++++++++++++++++++++++++++---------------------------
 1 files changed, 66 insertions(+), 61 deletions(-)

diff --git a/client/pbap.c b/client/pbap.c
index c4b14a2..eed7fa6 100644
--- a/client/pbap.c
+++ b/client/pbap.c
@@ -127,12 +127,16 @@ static const char *filter_list[] = {
 struct pbap_data {
 	struct obc_session *session;
 	char *path;
-	DBusMessage *msg;
 	guint8 format;
 	guint8 order;
 	uint64_t filter;
 };
 
+struct pending_request {
+	struct pbap_data *pbap;
+	DBusMessage *msg;
+};
+
 struct pullphonebook_apparam {
 	uint8_t     filter_tag;
 	uint8_t     filter_len;
@@ -167,6 +171,24 @@ struct apparam_hdr {
 
 static DBusConnection *conn = NULL;
 
+struct pending_request *pending_request_new(struct pbap_data *pbap,
+						DBusMessage *message)
+{
+	struct pending_request *p;
+
+	p = g_new0(struct pending_request, 1);
+	p->pbap = pbap;
+	p->msg = dbus_message_ref(message);
+
+	return p;
+}
+
+static void pending_request_free(struct pending_request *p)
+{
+	dbus_message_unref(p->msg);
+	g_free(p);
+}
+
 static void listing_element(GMarkupParseContext *ctxt,
 				const gchar *element,
 				const gchar **names,
@@ -252,24 +274,21 @@ static void pbap_reset_path(struct pbap_data *pbap)
 static void pbap_setpath_cb(struct obc_session *session, GError *err,
 							gpointer user_data)
 {
-	struct pbap_data *pbap = user_data;
+	struct pending_request *request = user_data;
+	struct pbap_data *pbap = request->pbap;
 
 	if (err != NULL)
-		pbap_reset_path(user_data);
-
-	if (pbap->msg == NULL)
-		return;
+		pbap_reset_path(pbap);
 
 	if (err) {
-		DBusMessage *reply= g_dbus_create_error(pbap->msg,
+		DBusMessage *reply = g_dbus_create_error(request->msg,
 							ERROR_INF ".Failed",
 							"%s", err->message);
 		g_dbus_send_message(conn, reply);
 	} else
-		g_dbus_send_reply(conn, pbap->msg, DBUS_TYPE_INVALID);
+		g_dbus_send_reply(conn, request->msg, DBUS_TYPE_INVALID);
 
-	dbus_message_unref(pbap->msg);
-	pbap->msg = NULL;
+	pending_request_free(request);
 }
 
 static void read_return_apparam(struct obc_session *session,
@@ -322,22 +341,19 @@ static void read_return_apparam(struct obc_session *session,
 static void pull_phonebook_callback(struct obc_session *session,
 					GError *err, void *user_data)
 {
-	struct pbap_data *pbap = user_data;
+	struct pending_request *request = user_data;
 	DBusMessage *reply;
 	const char *buf;
 	size_t size;
 
-	if (pbap->msg == NULL)
-		return;
-
 	if (err) {
-		reply = g_dbus_create_error(pbap->msg,
+		reply = g_dbus_create_error(request->msg,
 						"org.openobex.Error.Failed",
 						"%s", err->message);
 		goto send;
 	}
 
-	reply = dbus_message_new_method_return(pbap->msg);
+	reply = dbus_message_new_method_return(request->msg);
 
 	buf = obc_session_get_buffer(session, &size);
 	if (size == 0)
@@ -349,29 +365,25 @@ static void pull_phonebook_callback(struct obc_session *session,
 
 send:
 	g_dbus_send_message(conn, reply);
-	dbus_message_unref(pbap->msg);
-	pbap->msg = NULL;
+	pending_request_free(request);
 }
 
 static void phonebook_size_callback(struct obc_session *session,
 					GError *err, void *user_data)
 {
-	struct pbap_data *pbap = user_data;
+	struct pending_request *request = user_data;
 	DBusMessage *reply;
 	guint16 phone_book_size;
 	guint8 new_missed_calls;
 
-	if (pbap->msg == NULL)
-		return;
-
 	if (err) {
-		reply = g_dbus_create_error(pbap->msg,
+		reply = g_dbus_create_error(request->msg,
 						"org.openobex.Error.Failed",
 						"%s", err->message);
 		goto send;
 	}
 
-	reply = dbus_message_new_method_return(pbap->msg);
+	reply = dbus_message_new_method_return(request->msg);
 
 	read_return_apparam(session, &phone_book_size, &new_missed_calls);
 
@@ -381,31 +393,27 @@ static void phonebook_size_callback(struct obc_session *session,
 
 send:
 	g_dbus_send_message(conn, reply);
-	dbus_message_unref(pbap->msg);
-	pbap->msg = NULL;
+	pending_request_free(request);
 }
 
 static void pull_vcard_listing_callback(struct obc_session *session,
 					GError *err, void *user_data)
 {
-	struct pbap_data *pbap = user_data;
+	struct pending_request *request = user_data;
 	GMarkupParseContext *ctxt;
 	DBusMessage *reply;
 	DBusMessageIter iter, array;
 	const char *buf;
 	size_t size;
 
-	if (pbap->msg == NULL)
-		return;
-
 	if (err) {
-		reply = g_dbus_create_error(pbap->msg,
+		reply = g_dbus_create_error(request->msg,
 						"org.openobex.Error.Failed",
 						"%s", err->message);
 		goto send;
 	}
 
-	reply = dbus_message_new_method_return(pbap->msg);
+	reply = dbus_message_new_method_return(request->msg);
 
 	buf = obc_session_get_buffer(session, &size);
 	if (size == 0)
@@ -423,8 +431,7 @@ static void pull_vcard_listing_callback(struct obc_session *session,
 
 send:
 	g_dbus_send_message(conn, reply);
-	dbus_message_unref(pbap->msg);
-	pbap->msg = NULL;
+	pending_request_free(request);
 }
 
 static DBusMessage *pull_phonebook(struct pbap_data *pbap,
@@ -433,14 +440,10 @@ static DBusMessage *pull_phonebook(struct pbap_data *pbap,
 					guint8 format, guint16 maxlistcount,
 					guint16 liststartoffset)
 {
+	struct pending_request *request;
 	struct pullphonebook_apparam apparam;
 	session_callback_t func;
 
-	if (pbap->msg)
-		return g_dbus_create_error(message,
-				"org.openobex.Error.InProgress",
-				"Transfer in progress");
-
 	apparam.filter_tag = FILTER_TAG;
 	apparam.filter_len = FILTER_LEN;
 	apparam.filter = GUINT64_TO_BE(filter);
@@ -466,14 +469,16 @@ static DBusMessage *pull_phonebook(struct pbap_data *pbap,
 		return NULL;
 	}
 
+	request = pending_request_new(pbap, message);
+
 	if (obc_session_get(pbap->session, "x-bt/phonebook", name, NULL,
 				(guint8 *) &apparam, sizeof(apparam),
-				func, pbap) < 0)
+				func, request) < 0) {
+		pending_request_free(request);
 		return g_dbus_create_error(message,
 				"org.openobex.Error.Failed",
 				"Failed");
-
-	pbap->msg = dbus_message_ref(message);
+	}
 
 	return NULL;
 }
@@ -495,15 +500,11 @@ static DBusMessage *pull_vcard_listing(struct pbap_data *pbap,
 					guint8 order, char *searchval, guint8 attrib,
 					guint16 count, guint16 offset)
 {
+	struct pending_request *request;
 	guint8 *p, *apparam = NULL;
 	gint apparam_size;
 	int err;
 
-	if (pbap->msg)
-		return g_dbus_create_error(message,
-				"org.openobex.Error.InProgress",
-				"Transfer in progress");
-
 	/* trunc the searchval string if it's length exceed the max value of guint8 */
 	if (strlen(searchval) > 254)
 		searchval[255] = '\0';
@@ -530,16 +531,18 @@ static DBusMessage *pull_vcard_listing(struct pbap_data *pbap,
 	offset = GUINT16_TO_BE(offset);
 	p = fill_apparam(p, &offset, LISTSTARTOFFSET_TAG, LISTSTARTOFFSET_LEN);
 
+	request = pending_request_new(pbap, message);
+
 	err = obc_session_get(pbap->session, "x-bt/vcard-listing", name, NULL,
 				apparam, apparam_size,
-				pull_vcard_listing_callback, pbap);
+				pull_vcard_listing_callback, request);
 	g_free(apparam);
-	if (err < 0)
+	if (err < 0) {
+		pending_request_free(request);
 		return g_dbus_create_error(message,
 				"org.openobex.Error.Failed",
 				"Failed");
-
-	pbap->msg = dbus_message_ref(message);
+	}
 
 	return NULL;
 }
@@ -663,6 +666,7 @@ static DBusMessage *pbap_select(DBusConnection *connection,
 	struct pbap_data *pbap = user_data;
 	const char *item, *location;
 	char *path;
+	struct pending_request *request;
 	GError *err = NULL;
 
 	if (dbus_message_get_args(message, NULL,
@@ -682,19 +686,22 @@ static DBusMessage *pbap_select(DBusConnection *connection,
 		return dbus_message_new_method_return(message);
 	}
 
-	obc_session_setpath(pbap->session, path, pbap_setpath_cb, pbap, &err);
+	request = pending_request_new(pbap, message);
+
+	obc_session_setpath(pbap->session, path, pbap_setpath_cb, request,
+									&err);
 	if (err != NULL) {
 		DBusMessage *reply;
 		reply =  g_dbus_create_error(message, ERROR_INF ".Failed",
 							"%s", err->message);
 		g_error_free(err);
 		g_free(path);
+		pending_request_free(request);
 		return reply;
 	}
 
 	g_free(pbap->path);
 	pbap->path = path;
-	pbap->msg = dbus_message_ref(message);
 
 	return NULL;
 }
@@ -725,6 +732,7 @@ static DBusMessage *pbap_pull_vcard(DBusConnection *connection,
 	struct pbap_data *pbap = user_data;
 	struct pullvcardentry_apparam apparam;
 	const char *name;
+	struct pending_request *request;
 
 	if (!pbap->path)
 		return g_dbus_create_error(message,
@@ -737,11 +745,6 @@ static DBusMessage *pbap_pull_vcard(DBusConnection *connection,
 		return g_dbus_create_error(message,
 				ERROR_INF ".InvalidArguments", NULL);
 
-	if (pbap->msg)
-		return g_dbus_create_error(message,
-				"org.openobex.Error.InProgress",
-				"Transfer in progress");
-
 	apparam.filter_tag = FILTER_TAG;
 	apparam.filter_len = FILTER_LEN;
 	apparam.filter = GUINT64_TO_BE(pbap->filter);
@@ -749,14 +752,16 @@ static DBusMessage *pbap_pull_vcard(DBusConnection *connection,
 	apparam.format_len = FORMAT_LEN;
 	apparam.format = pbap->format;
 
+	request = pending_request_new(pbap, message);
+
 	if (obc_session_get(pbap->session, "x-bt/vcard", name, NULL,
 			(guint8 *)&apparam, sizeof(apparam),
-			pull_phonebook_callback, pbap) < 0)
+			pull_phonebook_callback, request) < 0) {
+		pending_request_free(request);
 		return g_dbus_create_error(message,
 				"org.openobex.Error.Failed",
 				"Failed");
-
-	pbap->msg = dbus_message_ref(message);
+	}
 
 	return NULL;
 }
-- 
1.7.6.5

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux