Diff between 52f3b2bfe1daea7ce1af5a32a47fce3a609a827c and cec04075a7ba438cb0159174d3a11bb9a9a3d044

Changed Files

File Additions Deletions Status
obexd/plugins/ftp.c +12 -36 modified
obexd/plugins/opp.c +12 -36 modified
obexd/plugins/pbap.c +24 -21 modified
obexd/plugins/syncevolution.c +3 -16 modified
obexd/src/obex.c +37 -4 modified
obexd/src/obex.h +7 -1 modified
obexd/src/service.h +1 -1 modified

Full Patch

diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index 5da0a1b..354eaad 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
@@ -144,22 +144,21 @@ static const guint8 FTP_TARGET[TARGET_SIZE] = {
 static const guint8 PCSUITE_WHO[PCSUITE_WHO_SIZE] = {
 			'P','C',' ','S','u','i','t','e' };
 
-static gint get_by_type(struct obex_session *os, gchar *type, size_t *size)
+static gint get_by_type(struct OBEX_session *os, gchar *type)
 {
 	if (type == NULL)
 		return -ENOENT;
 
 	if (g_str_equal(type, CAP_TYPE))
-		return os_prepare_get(os, os->server->capability, size);
+		return obex_stream_start(os, os->server->capability);
 
 	if (g_str_equal(type, LST_TYPE))
-		return os_prepare_get(os, os->current_folder, size);
+		return obex_stream_start(os, os->current_folder);
 
 	return -ENOENT;
 }
 
-static gint ftp_prepare_get(struct obex_session *os, gchar *file,
-				size_t *size)
+static gint ftp_prepare_get(struct obex_session *os, gchar *file)
 {
 	gboolean root;
 
@@ -179,7 +178,7 @@ static gint ftp_prepare_get(struct obex_session *os, gchar *file,
 			return -EPERM;
 	}
 
-	return os_prepare_get(os, file, size);
+	return obex_stream_start(os, file);
 }
 
 static obex_rsp_t ftp_connect(struct OBEX_session *os)
@@ -189,31 +188,24 @@ static obex_rsp_t ftp_connect(struct OBEX_session *os)
 	return OBEX_RSP_SUCCESS;
 }
 
-static void ftp_get(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t ftp_get(struct OBEX_session *os)
 {
-	obex_headerdata_t hv;
-	struct obex_session *os;
-	size_t size;
 	gint err;
 	gchar *path;
 
-	os = OBEX_GetUserData(obex);
-	if (os == NULL)
-		return;
-
 	if (os->current_folder == NULL) {
 		err = -ENOENT;
 		goto fail;
 	}
 
-	err = get_by_type(os, os->type, &size);
+	err = get_by_type(os, os->type);
 	if (err < 0) {
 		if (!os->name)
 			goto fail;
 
 		path = g_build_filename(os->current_folder, os->name, NULL);
 
-		err = ftp_prepare_get(os, path, &size);
+		err = ftp_prepare_get(os, path);
 
 		g_free(path);
 
@@ -221,31 +213,15 @@ static void ftp_get(obex_t *obex, obex_object_t *obj)
 			goto fail;
 	}
 
-	hv.bq4 = size;
-	os->size = size;
-	OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_LENGTH, hv, 4, 0);
-
-	/* Add body header */
-	hv.bs = NULL;
-	if (size == 0)
-		OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY,
-				hv, 0, OBEX_FL_FIT_ONE_PACKET);
-	else
-		OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY,
-				hv, 0, OBEX_FL_STREAM_START);
-
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE,
-			OBEX_RSP_SUCCESS);
-
-	return;
+	return OBEX_RSP_SUCCESS;
 
 fail:
 	switch (err) {
 	case -ENOENT:
-		OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND, OBEX_RSP_NOT_FOUND);
-		break;
+		return OBEX_RSP_NOT_FOUND;
+
 	default:
-		OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+		return OBEX_RSP_FORBIDDEN;
 	}
 }
 
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index 34bdbdb..04bd57a 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
@@ -171,50 +171,26 @@ static void opp_put(obex_t *obex, obex_object_t *obj)
 	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
 }
 
-static void opp_get(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t opp_get(struct OBEX_session *os)
 {
-	struct obex_session *os;
-	obex_headerdata_t hv;
-	size_t size;
+	const char *type;
 
-	os = OBEX_GetUserData(obex);
-	if (os == NULL)
-		return;
+	if (obex_session_get_name(os) == NULL)
+		return OBEX_RSP_FORBIDDEN;
 
-	if (os->name)
-		goto fail;
+	type = obex_session_get_type(os);
 
-	if (os->type == NULL)
-		goto fail;
+	if (type == NULL)
+		return OBEX_RSP_FORBIDDEN;
 
 	if (g_str_equal(os->type, VCARD_TYPE)) {
-		if (os_prepare_get(os, VCARD_FILE, &size) < 0) {
-			OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND,
-					OBEX_RSP_NOT_FOUND);
-			return;
-		}
-	} else
-		goto fail;
-
+		if (obex_stream_start(os, VCARD_FILE) < 0)
+			return OBEX_RSP_NOT_FOUND;
 
-	hv.bq4 = size;
-	OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_LENGTH, hv, 4, 0);
-
-	/* Add body header */
-	hv.bs = NULL;
-	if (size == 0)
-		OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY,
-						hv, 0, OBEX_FL_FIT_ONE_PACKET);
-	else
-		OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY,
-						hv, 0, OBEX_FL_STREAM_START);
-
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
-
-	return;
+	} else
+		return OBEX_RSP_FORBIDDEN;
 
-fail:
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+	return OBEX_RSP_SUCCESS;
 }
 
 static void opp_disconnect(struct OBEX_session *os)
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index 10fe863..bb518fa 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
@@ -385,31 +385,30 @@ static obex_rsp_t pbap_connect(struct OBEX_session *os)
 	return OBEX_RSP_SUCCESS;
 }
 
-static void pbap_get(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t pbap_get(struct OBEX_session *os)
 {
-	struct obex_session *session = OBEX_GetUserData(obex);
-	obex_headerdata_t hd;
-	gboolean addbody = TRUE;
+	int addbody = TRUE;
+	const char *type = obex_session_get_type(os);
+	const char *name = obex_session_get_name(os);
 	int err;
 
-	if (session == NULL)
-		return;
-
-	if (session->type == NULL)
+	if (type == NULL)
 		goto fail;
 
-	if (g_str_equal(session->type, VCARDLISTING_TYPE) == FALSE
-						&& session->name == NULL)
+	if (g_str_equal(type, VCARDLISTING_TYPE) == FALSE
+						&& name == NULL)
 		goto fail;
 
-	OBEX_ObjectReParseHeaders(obex, obj);
-
-	if (g_str_equal(session->type, PHONEBOOK_TYPE) == TRUE)
-		err = pbap_pullphonebook(obex, obj, &addbody);
-	else if (g_str_equal(session->type, VCARDLISTING_TYPE) == TRUE)
-		err = pbap_pullvcardlisting(obex, obj, &addbody);
-	else if (g_str_equal(session->type, VCARDENTRY_TYPE) == TRUE)
-		err = pbap_pullvcardentry(obex, obj);
+	/* FIXME: broken */
+#if 0
+	OBEX_ObjectReParseHeaders(, obj);
+#endif
+	if (g_str_equal(type, PHONEBOOK_TYPE) == TRUE)
+		err = pbap_pullphonebook(NULL, NULL, NULL);
+	else if (g_str_equal(type, VCARDLISTING_TYPE) == TRUE)
+		err = pbap_pullvcardlisting(NULL, NULL, NULL);
+	else if (g_str_equal(type, VCARDENTRY_TYPE) == TRUE)
+		err = pbap_pullvcardentry(NULL, NULL);
 	else
 		goto fail;
 
@@ -417,21 +416,25 @@ static void pbap_get(obex_t *obex, obex_object_t *obj)
 		goto fail;
 
 	if (addbody == TRUE) {
+#if 0
 		OBEX_SuspendRequest(obex, obj);
 		session->size = 0;
 
 		/* Add body header */
 		hd.bs = NULL;
 		OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY,
-						hd, 0, OBEX_FL_STREAM_START);
+				hd, 0, OBEX_FL_STREAM_START);
+#endif
 	}
 
+#if 0
 	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+#endif
 
-	return;
+	return OBEX_RSP_SUCCESS;
 
 fail:
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+	return OBEX_RSP_FORBIDDEN;
 }
 
 static gboolean pbap_is_valid_folder(struct obex_session *session)
diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c
index 02fb6fb..94bb3b4 100644
--- a/obexd/plugins/syncevolution.c
+++ b/obexd/plugins/syncevolution.c
@@ -397,28 +397,15 @@ static void synce_put(obex_t *obex, obex_object_t *obj)
 	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
 }
 
-static void synce_get(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t synce_get(struct OBEX_session *os)
 {
-	obex_headerdata_t hd;
-	struct obex_session *os;
 	struct synce_context *context;
 
-	os = OBEX_GetUserData(obex);
-	if (!os)
-		return;
-
 	context = find_context(os);
 	if (!context)
-		return;
-
-	if (!context->reply_received)
-		OBEX_SuspendRequest(obex, obj);
-
-	hd.bs = NULL;
-	OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY, hd, 0,
-					OBEX_FL_STREAM_START);
+		return OBEX_RSP_FORBIDDEN;
 
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+	return OBEX_RSP_SUCCESS;
 }
 
 static void close_cb(DBusPendingCall *call, void *user_data)
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index b8e8b5d..c07754b 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
@@ -299,6 +299,7 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj)
 	obex_headerdata_t hd;
 	guint hlen;
 	guint8 hi;
+	guint rsp;
 
 	if (!os->service) {
 		OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
@@ -363,7 +364,22 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj)
 		}
 	}
 
-	os->service->get(obex, obj);
+	rsp = os->service->get(os);
+	if (rsp == OBEX_RSP_SUCCESS) {
+		hd.bq4 = os->size;
+		OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_LENGTH, hd, 4, 0);
+
+		/* Add body header */
+		hd.bs = NULL;
+		if (os->size == 0)
+			OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY,
+					hd, 0, OBEX_FL_FIT_ONE_PACKET);
+		else
+			OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY,
+					hd, 0, OBEX_FL_STREAM_START);
+	}
+
+	os_set_response(obj, rsp);
 }
 
 static void cmd_setpath(struct obex_session *os,
@@ -415,12 +431,13 @@ static void cmd_setpath(struct obex_session *os,
 	os->service->setpath(obex, obj);
 }
 
-int os_prepare_get(struct obex_session *os, gchar *filename, size_t *size)
+int obex_stream_start(struct OBEX_session *os, gchar *filename)
 {
 	gint err;
 	gpointer object;
+	size_t size;
 
-	object = os->driver->open(filename, O_RDONLY, 0, size, &err);
+	object = os->driver->open(filename, O_RDONLY, 0, &size, &err);
 	if (object == NULL) {
 		error("open(%s): %s (%d)", filename, strerror(-err), -err);
 		goto fail;
@@ -428,8 +445,9 @@ int os_prepare_get(struct obex_session *os, gchar *filename, size_t *size)
 
 	os->object = object;
 	os->offset = 0;
+	os->size = size;
 
-	if (*size > 0)
+	if (size > 0)
 		os->buf = g_malloc0(os->tx_mtu);
 
 	return 0;
@@ -1077,3 +1095,18 @@ struct obex_session *obex_get_session(gpointer object)
 
 	return NULL;
 }
+
+const char *obex_session_get_name(struct OBEX_session *os)
+{
+	return os->name;
+}
+
+const char *obex_session_get_type(struct OBEX_session *os)
+{
+	return os->type;
+}
+
+ssize_t obex_session_get_size(struct OBEX_session *os)
+{
+	return os->size;
+}
diff --git a/obexd/src/obex.h b/obexd/src/obex.h
index f710a9f..4d4f60a 100644
--- a/obexd/src/obex.h
+++ b/obexd/src/obex.h
@@ -91,7 +91,7 @@ gint obex_session_start(GIOChannel *io, struct server *server);
 struct obex_session *obex_get_session(gpointer object);
 gint obex_tty_session_stop(void);
 
-gint os_prepare_get(struct obex_session *os, gchar *file, size_t *size);
+int obex_stream_start(struct OBEX_session *os, gchar *filename);
 gint os_prepare_put(struct obex_session *os);
 
 void server_free(struct server *server);
@@ -99,3 +99,9 @@ void server_free(struct server *server);
 int tty_init(gint service, const gchar *folder, const gchar *capability,
 		gboolean symlinks, const gchar *devnode);
 void tty_closed(void);
+
+const char *obex_session_get_name(struct OBEX_session *os);
+
+ssize_t obex_session_get_size(struct OBEX_session *os);
+
+const char *obex_session_get_type(struct OBEX_session *os);
diff --git a/obexd/src/service.h b/obexd/src/service.h
index 3f35b80..3b6e4ba 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
@@ -34,7 +34,7 @@ struct obex_service_driver {
 	const gchar *record;
 	obex_rsp_t (*connect) (struct OBEX_session *os);
 	void (*progress) (struct OBEX_session *os);
-	void (*get) (obex_t *obex, obex_object_t *obj);
+	obex_rsp_t (*get) (struct OBEX_session *os);
 	void (*put) (obex_t *obex, obex_object_t *obj);
 	gint (*chkput) (obex_t *obex, obex_object_t *obj);
 	void (*setpath) (obex_t *obex, obex_object_t *obj);