Diff between 6a711a17f5979054299c022549f46302b685d2cb and e7856e195051004aba8d405f9005ad2b86a05476

Changed Files

File Additions Deletions Status
obexd/plugins/ftp.c +1 -5 modified
obexd/plugins/ftp.h +1 -2 modified
obexd/plugins/irmc.c +1 -2 modified
obexd/plugins/mas.c +1 -4 modified
obexd/plugins/opp.c +1 -5 modified
obexd/plugins/pbap.c +4 -7 modified
obexd/plugins/pcsuite.c +2 -2 modified
obexd/plugins/syncevolution.c +1 -4 modified
obexd/src/obex-priv.h +1 -0 modified
obexd/src/obex.c +15 -9 modified
obexd/src/service.h +1 -1 modified

Full Patch

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
@@ -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 710bfa4..86c7725 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 cd7f386..cc0b9db 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 d13625c..08e47a2 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 17c4356..4f0ed08 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 e14a58d..71a372c 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 d43842f..9b93372 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 ea3eb7a..77c1bd6 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 8fcd5d1..02249b4 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 16e6583..aeca79d 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 61c0dcc..6633be3 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);