Sophie

Sophie

distrib > Fedora > 13 > i386 > media > updates-src > by-pkgid > 825e88f1c9d8f85a407e419f7dd12d19 > files > 5

openobex-1.4-5.fc13.src.rpm

From 9f01069f6844a371ae14c30d85ae6d88467394eb Mon Sep 17 00:00:00 2001
From: Zhao Forrest <forrest.zhao@gmail.com>
Date: Wed, 24 Dec 2008 03:19:49 +0200
Subject: [PATCH] Fix obex_object_resume for server side role

---
 lib/obex_object.c |   32 +++++++++++++++++++++++++-------
 lib/obex_server.c |    9 ++++++++-
 2 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/lib/obex_object.c b/lib/obex_object.c
index 482e6a7..f0e69a7 100644
--- a/lib/obex_object.c
+++ b/lib/obex_object.c
@@ -908,6 +908,8 @@ int obex_object_suspend(obex_object_t *object)
 
 int obex_object_resume(obex_t *self, obex_object_t *object)
 {
+	int ret;
+
 	if (!object->suspend)
 		return 0;
 
@@ -916,16 +918,32 @@ int obex_object_resume(obex_t *self, obex_object_t *object)
 	if (object->first_packet_sent && !object->continue_received)
 		return 0;
 
-	if (obex_object_send(self, object, TRUE, FALSE) < 0) {
-		obex_deliver_event(self, OBEX_EV_LINKERR, object->opcode, 0, TRUE);
+	ret = obex_object_send(self, object, TRUE, FALSE);
+
+	if (ret < 0) {
+		obex_deliver_event(self, OBEX_EV_LINKERR,
+					object->opcode & ~OBEX_FINAL, 0, TRUE);
 		return -1;
+	} else if (ret == 0) {
+		obex_deliver_event(self, OBEX_EV_PROGRESS,
+					object->opcode & ~OBEX_FINAL, 0,
+					FALSE);
+		object->first_packet_sent = 1;
+		object->continue_received = 0;
+	} else {
+		if (self->state & MODE_SRV) {
+			obex_deliver_event(self, OBEX_EV_REQDONE,
+						object->opcode & ~OBEX_FINAL,
+						0, TRUE);
+			self->state = MODE_SRV | STATE_IDLE;
+			return 0;
+		}
 	}
 
-	obex_deliver_event(self, OBEX_EV_PROGRESS, object->opcode, 0, FALSE);
-
-	self->state = MODE_CLI | STATE_REC;
-	object->first_packet_sent = 1;
-	object->continue_received = 0;
+	if (self->state & MODE_SRV)
+		self->state = MODE_SRV | STATE_REC;
+	else
+		self->state = MODE_CLI | STATE_REC;
 
 	return 0;
 }
diff --git a/lib/obex_server.c b/lib/obex_server.c
index f27c8ee..cf19529 100644
--- a/lib/obex_server.c
+++ b/lib/obex_server.c
@@ -159,7 +159,7 @@ int obex_server(obex_t *self, buf_t *msg, int final)
 			} else
 				obex_deliver_event(self, OBEX_EV_PROGRESS, cmd, 0, FALSE);
 			break; /* Stay in this state if not final */
-		} else {
+		} else if (!self->object->first_packet_sent) {
 			DEBUG(4, "We got a request!\n");
 			/* More connect-magic woodoo stuff */
 			if (cmd == OBEX_CMD_CONNECT)
@@ -234,10 +234,17 @@ int obex_server(obex_t *self, buf_t *msg, int final)
 		 * See Obex spec v1.2, chapter 3.2, page 21 and 22.
 		 * See also example on chapter 7.3, page 47.
 		 * So, force the final bit here. - Jean II */
+		self->object->continue_received = 1;
+
+		if (self->object->suspend)
+			break;
+
 		ret = obex_object_send(self, self->object, TRUE, TRUE);
 		if (ret == 0) {
 			/* Made some progress */
 			obex_deliver_event(self, OBEX_EV_PROGRESS, cmd, 0, FALSE);
+			self->object->first_packet_sent = 1;
+			self->object->continue_received = 0;
 		} else if (ret < 0) {
 			/* Error sending response */
 			obex_deliver_event(self, OBEX_EV_LINKERR, cmd, 0, TRUE);
-- 
1.7.2.3