From 0aee0052346e97edcd9e0f511b3bcaf423791334 Mon Sep 17 00:00:00 2001 From: Slawomir Bochenski Date: Mon, 27 Jun 2011 16:20:54 +0200 Subject: [PATCH] obexd: Modify pbap plugin to utilize get_next_header() --- obexd/plugins/pbap.c | 97 ++++++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 35 deletions(-) diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c index 71a372ce0..b230218d7 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 = { -- 2.47.3