diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index 15cc7fb..2ec008f 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
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);
if (ret < 0)
return ret;
- if (stream)
- *stream = TRUE;
-
return 0;
}
diff --git a/obexd/plugins/ftp.h b/obexd/plugins/ftp.h
index 710bfa4..86c7725 100644
--- a/obexd/plugins/ftp.h
+++ b/obexd/plugins/ftp.h
*/
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 cd7f386..cc0b9db 100644
--- a/obexd/plugins/irmc.c
+++ b/obexd/plugins/irmc.c
}
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);
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 d13625c..08e47a2 100644
--- a/obexd/plugins/mas.c
+++ b/obexd/plugins/mas.c
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);
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 17c4356..4f0ed08 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
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;
} else
return -EPERM;
- if (stream)
- *stream = TRUE;
-
return 0;
}
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index e14a58d..71a372c 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
}
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);
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)
/* 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;
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 {
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 d43842f..9b93372 100644
--- a/obexd/plugins/pcsuite.c
+++ b/obexd/plugins/pcsuite.c
}
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 ea3eb7a..77c1bd6 100644
--- a/obexd/plugins/syncevolution.c
+++ b/obexd/plugins/syncevolution.c
}
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 8fcd5d1..02249b4 100644
--- a/obexd/src/obex-priv.h
+++ b/obexd/src/obex-priv.h
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 16e6583..aeca79d 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
os->pending = 0;
os->offset = 0;
os->size = OBJECT_SIZE_DELETE;
+ os->streaming = FALSE;
}
static void obex_session_free(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) {
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;
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:
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;
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 61c0dcc..6633be3 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
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);