From e7856e195051004aba8d405f9005ad2b86a05476 Mon Sep 17 00:00:00 2001 From: Slawomir Bochenski Date: Mon, 27 Jun 2011 16:20:52 +0200 Subject: [PATCH] obexd: Start OpenOBEX stream automatically This removes stream argument from service driver get() function. Now the streaming is started automatically when first portion of data is received. Additionally the possibility to not send body header at all is added. This can be achieved by returning -ENOSTR from mime plugin read() function. --- obexd/plugins/ftp.c | 6 +----- obexd/plugins/ftp.h | 3 +-- obexd/plugins/irmc.c | 3 +-- obexd/plugins/mas.c | 5 +---- obexd/plugins/opp.c | 6 +----- obexd/plugins/pbap.c | 11 ++++------- obexd/plugins/pcsuite.c | 4 ++-- obexd/plugins/syncevolution.c | 5 +---- obexd/src/obex-priv.h | 1 + obexd/src/obex.c | 24 +++++++++++++++--------- obexd/src/service.h | 2 +- 11 files changed, 29 insertions(+), 41 deletions(-) diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c index 15cc7fba3..2ec008ffc 100644 --- a/obexd/plugins/ftp.c +++ b/obexd/plugins/ftp.c @@ -213,8 +213,7 @@ void *ftp_connect(struct obex_session *os, int *err) return ftp; } -int ftp_get(struct obex_session *os, obex_object_t *obj, gboolean *stream, - void *user_data) +int ftp_get(struct obex_session *os, obex_object_t *obj, void *user_data) { struct ftp_session *ftp = user_data; const char *type = obex_get_type(os); @@ -229,9 +228,6 @@ int ftp_get(struct obex_session *os, obex_object_t *obj, gboolean *stream, if (ret < 0) return ret; - if (stream) - *stream = TRUE; - return 0; } diff --git a/obexd/plugins/ftp.h b/obexd/plugins/ftp.h index 710bfa4c1..86c77250f 100644 --- a/obexd/plugins/ftp.h +++ b/obexd/plugins/ftp.h @@ -22,8 +22,7 @@ */ void *ftp_connect(struct obex_session *os, int *err); -int ftp_get(struct obex_session *os, obex_object_t *obj, gboolean *stream, - void *user_data); +int ftp_get(struct obex_session *os, obex_object_t *obj, void *user_data); int ftp_chkput(struct obex_session *os, void *user_data); int ftp_put(struct obex_session *os, obex_object_t *obj, void *user_data); int ftp_setpath(struct obex_session *os, obex_object_t *obj, void *user_data); diff --git a/obexd/plugins/irmc.c b/obexd/plugins/irmc.c index cd7f3861a..cc0b9dbf7 100644 --- a/obexd/plugins/irmc.c +++ b/obexd/plugins/irmc.c @@ -233,7 +233,7 @@ static void *irmc_connect(struct obex_session *os, int *err) } static int irmc_get(struct obex_session *os, obex_object_t *obj, - gboolean *stream, void *user_data) + void *user_data) { struct irmc_session *irmc = user_data; const char *type = obex_get_type(os); @@ -244,7 +244,6 @@ static int irmc_get(struct obex_session *os, obex_object_t *obj, DBG("name %s type %s irmc %p", name, type ? type : "NA", irmc); path = g_strdup(name); - *stream = TRUE; ret = obex_get_stream_start(os, path); diff --git a/obexd/plugins/mas.c b/obexd/plugins/mas.c index d13625c8f..08e47a240 100644 --- a/obexd/plugins/mas.c +++ b/obexd/plugins/mas.c @@ -134,8 +134,7 @@ static void mas_disconnect(struct obex_session *os, void *user_data) mas_clean(mas); } -static int mas_get(struct obex_session *os, obex_object_t *obj, - gboolean *stream, void *user_data) +static int mas_get(struct obex_session *os, obex_object_t *obj, void *user_data) { struct mas_session *mas = user_data; const char *type = obex_get_type(os); @@ -148,8 +147,6 @@ static int mas_get(struct obex_session *os, obex_object_t *obj, if (type == NULL) return -EBADR; - *stream = FALSE; - ret = obex_get_stream_start(os, name); if (ret < 0) goto failed; diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c index 17c43560e..4f0ed08e3 100644 --- a/obexd/plugins/opp.c +++ b/obexd/plugins/opp.c @@ -170,8 +170,7 @@ static int opp_put(struct obex_session *os, obex_object_t *obj, return 0; } -static int opp_get(struct obex_session *os, obex_object_t *obj, - gboolean *stream, void *user_data) +static int opp_get(struct obex_session *os, obex_object_t *obj, void *user_data) { const char *type; @@ -190,9 +189,6 @@ static int opp_get(struct obex_session *os, obex_object_t *obj, } else return -EPERM; - if (stream) - *stream = TRUE; - return 0; } diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c index e14a58d12..71a372ce0 100644 --- a/obexd/plugins/pbap.c +++ b/obexd/plugins/pbap.c @@ -620,7 +620,7 @@ static void *pbap_connect(struct obex_session *os, int *err) } static int pbap_get(struct obex_session *os, obex_object_t *obj, - gboolean *stream, void *user_data) + void *user_data) { struct pbap_session *pbap = user_data; const char *type = obex_get_type(os); @@ -658,7 +658,6 @@ static int pbap_get(struct obex_session *os, obex_object_t *obj, else path = g_build_filename("/", name, NULL); - *stream = (params->maxlistcount == 0 ? FALSE : TRUE); } else if (strcmp(type, VCARDLISTING_TYPE) == 0) { /* Always relative */ if (!name || strlen(name) == 0) @@ -668,11 +667,9 @@ static int pbap_get(struct obex_session *os, obex_object_t *obj, /* Current folder + relative path */ path = g_build_filename(pbap->folder, name, NULL); - *stream = (params->maxlistcount == 0 ? FALSE : TRUE); } else if (strcmp(type, VCARDENTRY_TYPE) == 0) { /* File name only */ path = g_strdup(name); - *stream = TRUE; } else return -EBADR; @@ -976,11 +973,11 @@ static ssize_t vobject_pull_read(void *object, void *buf, size_t count, if (pbap->params->maxlistcount == 0) { /* PhoneBookSize */ - *hi = OBEX_HDR_APPARAM; + *hi = obj->aparams->len ? OBEX_HDR_APPARAM : OBEX_HDR_BODY; return array_read(obj->aparams, buf, count); } else if (obj->firstpacket) { /* NewMissedCalls */ - *hi = OBEX_HDR_APPARAM; + *hi = obj->aparams->len ? OBEX_HDR_APPARAM : OBEX_HDR_BODY; obj->firstpacket = FALSE; return array_read(obj->aparams, buf, count); } else { @@ -1017,7 +1014,7 @@ static ssize_t vobject_list_read(void *object, void *buf, size_t count, return -EAGAIN; if (pbap->params->maxlistcount == 0) { - *hi = OBEX_HDR_APPARAM; + *hi = obj->aparams->len ? OBEX_HDR_APPARAM : OBEX_HDR_BODY; return array_read(obj->aparams, buf, count); } else { *hi = OBEX_HDR_BODY; diff --git a/obexd/plugins/pcsuite.c b/obexd/plugins/pcsuite.c index d43842f2a..9b9337244 100644 --- a/obexd/plugins/pcsuite.c +++ b/obexd/plugins/pcsuite.c @@ -181,13 +181,13 @@ fail: } static int pcsuite_get(struct obex_session *os, obex_object_t *obj, - gboolean *stream, void *user_data) + void *user_data) { struct pcsuite_session *pcsuite = user_data; DBG("%p", pcsuite); - return ftp_get(os, obj, stream, pcsuite->ftp); + return ftp_get(os, obj, pcsuite->ftp); } static int pcsuite_chkput(struct obex_session *os, void *user_data) diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c index ea3eb7ade..77c1bd681 100644 --- a/obexd/plugins/syncevolution.c +++ b/obexd/plugins/syncevolution.c @@ -250,11 +250,8 @@ static int synce_put(struct obex_session *os, obex_object_t *obj, } static int synce_get(struct obex_session *os, obex_object_t *obj, - gboolean *stream, void *user_data) + void *user_data) { - if (stream) - *stream = TRUE; - return obex_get_stream_start(os, NULL); } diff --git a/obexd/src/obex-priv.h b/obexd/src/obex-priv.h index 8fcd5d17b..02249b407 100644 --- a/obexd/src/obex-priv.h +++ b/obexd/src/obex-priv.h @@ -47,6 +47,7 @@ struct obex_session { obex_t *obex; obex_object_t *obj; struct obex_mime_type_driver *driver; + gboolean streaming; }; int obex_session_start(GIOChannel *io, uint16_t tx_mtu, uint16_t rx_mtu, diff --git a/obexd/src/obex.c b/obexd/src/obex.c index 16e65839c..aeca79d90 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -318,6 +318,7 @@ static void os_reset_session(struct obex_session *os) os->pending = 0; os->offset = 0; os->size = OBJECT_SIZE_DELETE; + os->streaming = FALSE; } static void obex_session_free(struct obex_session *os) @@ -651,14 +652,23 @@ static int obex_write_stream(struct obex_session *os, error("read(): %s (%zd)", strerror(-len), -len); if (len == -EAGAIN) return len; - else if (len == -ENOSTR) - return 0; g_free(os->buf); os->buf = NULL; + + if (len == -ENOSTR) + return 0; + return len; } + if (!os->streaming) { + hd.bs = NULL; + OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY, hd, 0, + OBEX_FL_STREAM_START); + os->streaming = TRUE; + } + hd.bs = os->buf; switch (hi) { @@ -712,7 +722,6 @@ proceed: static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj) { obex_headerdata_t hd; - gboolean stream; unsigned int hlen; uint8_t hi; int err; @@ -728,6 +737,8 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj) g_return_if_fail(chk_cid(obex, obj, os->cid)); + os->streaming = FALSE; + while (OBEX_ObjectGetNextHeader(obex, obj, &hi, &hd, &hlen)) { switch (hi) { case OBEX_HDR_NAME: @@ -789,7 +800,7 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj) return; } - err = os->service->get(os, obj, &stream, os->service_data); + err = os->service->get(os, obj, os->service_data); if (err < 0) goto done; @@ -808,11 +819,6 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj) goto done; } - if (stream) - /* Standard data stream */ - OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY, hd, 0, - OBEX_FL_STREAM_START); - /* Try to write to stream and suspend the stream immediately * if no data available to send. */ err = obex_write_stream(os, obex, obj); diff --git a/obexd/src/service.h b/obexd/src/service.h index 61c0dccc5..6633be3a9 100644 --- a/obexd/src/service.h +++ b/obexd/src/service.h @@ -33,7 +33,7 @@ struct obex_service_driver { void *(*connect) (struct obex_session *os, int *err); void (*progress) (struct obex_session *os, void *user_data); int (*get) (struct obex_session *os, obex_object_t *obj, - gboolean *stream, void *user_data); + void *user_data); int (*put) (struct obex_session *os, obex_object_t *obj, void *user_data); int (*chkput) (struct obex_session *os, void *user_data); -- 2.47.3