Diff between b988fe35c7596aec35a05901a0786f3530d32127 and 0aee0052346e97edcd9e0f511b3bcaf423791334

Changed Files

File Additions Deletions Status
obexd/plugins/pbap.c +62 -35 modified

Full Patch

diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index 71a372c..b230218 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
@@ -958,6 +958,26 @@ static ssize_t array_read(GByteArray *array, void *buf, size_t count)
 	return len;
 }
 
+static ssize_t vobject_pull_get_next_header(void *object, void *buf, size_t mtu,
+								uint8_t *hi)
+{
+	struct pbap_object *obj = object;
+	struct pbap_session *pbap = obj->session;
+
+	if (!obj->buffer && !obj->aparams)
+		return -EAGAIN;
+
+	*hi = OBEX_HDR_APPARAM;
+
+	if (pbap->params->maxlistcount == 0 || obj->firstpacket) {
+		obj->firstpacket = FALSE;
+
+		return array_read(obj->aparams, buf, mtu);
+	}
+
+	return 0;
+}
+
 static ssize_t vobject_pull_read(void *object, void *buf, size_t count,
 								uint8_t *hi)
 {
@@ -971,33 +991,43 @@ static ssize_t vobject_pull_read(void *object, void *buf, size_t count,
 	if (!obj->buffer && !obj->aparams)
 		return -EAGAIN;
 
-	if (pbap->params->maxlistcount == 0) {
-		/* PhoneBookSize */
-		*hi = obj->aparams->len ? OBEX_HDR_APPARAM : OBEX_HDR_BODY;
-		return array_read(obj->aparams, buf, count);
-	} else if (obj->firstpacket) {
-		/* NewMissedCalls */
-		*hi = obj->aparams->len ? OBEX_HDR_APPARAM : OBEX_HDR_BODY;
-		obj->firstpacket = FALSE;
-		return array_read(obj->aparams, buf, count);
-	} else {
-		/* Stream data */
-		*hi = OBEX_HDR_BODY;
-		len = string_read(obj->buffer, buf, count);
-		if (len == 0 && !obj->lastpart) {
-			/* in case when buffer is empty and we know that more
-			 * data is still available in backend, requesting new
-			 * data part via phonebook_pull_read and returning
-			 * -EAGAIN to suspend request for now */
-			ret = phonebook_pull_read(obj->request);
-			if (ret)
-				return -EPERM;
-
-			return -EAGAIN;
-		}
+	if (pbap->params->maxlistcount == 0)
+		return -ENOSTR;
+
+	*hi = OBEX_HDR_BODY;
 
-		return len;
+	len = string_read(obj->buffer, buf, count);
+	if (len == 0 && !obj->lastpart) {
+		/* in case when buffer is empty and we know that more
+		 * data is still available in backend, requesting new
+		 * data part via phonebook_pull_read and returning
+		 * -EAGAIN to suspend request for now */
+		ret = phonebook_pull_read(obj->request);
+		if (ret)
+			return -EPERM;
+
+		return -EAGAIN;
 	}
+
+	return len;
+}
+
+static ssize_t vobject_list_get_next_header(void *object, void *buf, size_t mtu,
+								uint8_t *hi)
+{
+	struct pbap_object *obj = object;
+	struct pbap_session *pbap = obj->session;
+
+	/* Backend still busy reading contacts */
+	if (!pbap->cache.valid)
+		return -EAGAIN;
+
+	*hi = OBEX_HDR_APPARAM;
+
+	if (pbap->params->maxlistcount == 0)
+		return array_read(obj->aparams, buf, mtu);
+
+	return 0;
 }
 
 static ssize_t vobject_list_read(void *object, void *buf, size_t count,
@@ -1009,17 +1039,12 @@ static ssize_t vobject_list_read(void *object, void *buf, size_t count,
 	DBG("valid %d maxlistcount %d", pbap->cache.valid,
 						pbap->params->maxlistcount);
 
-	/* Backend still busy reading contacts */
-	if (!pbap->cache.valid)
-		return -EAGAIN;
+	if (pbap->params->maxlistcount == 0)
+		return -ENOSTR;
 
-	if (pbap->params->maxlistcount == 0) {
-		*hi = obj->aparams->len ? OBEX_HDR_APPARAM : OBEX_HDR_BODY;
-		return array_read(obj->aparams, buf, count);
-	} else {
-		*hi = OBEX_HDR_BODY;
-		return string_read(obj->buffer, buf, count);
-	}
+	*hi = OBEX_HDR_BODY;
+
+	return string_read(obj->buffer, buf, count);
 }
 
 static ssize_t vobject_vcard_read(void *object, void *buf, size_t count,
@@ -1043,6 +1068,7 @@ static struct obex_mime_type_driver mime_pull = {
 	.open = vobject_pull_open,
 	.close = vobject_close,
 	.read = vobject_pull_read,
+	.get_next_header = vobject_pull_get_next_header,
 };
 
 static struct obex_mime_type_driver mime_list = {
@@ -1052,6 +1078,7 @@ static struct obex_mime_type_driver mime_list = {
 	.open = vobject_list_open,
 	.close = vobject_close,
 	.read = vobject_list_read,
+	.get_next_header = vobject_list_get_next_header,
 };
 
 static struct obex_mime_type_driver mime_vcard = {