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
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)
{
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,
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,
.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 = {
.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 = {