Diff between 19a64b7b9a06971fe392863a28186b56e0d8b551 and ac94e9bd284043150693943d34ec690a0a277232

Changed Files

File Additions Deletions Status
obexd/plugins/ftp.c +4 -18 modified
obexd/plugins/opp.c +4 -6 modified
obexd/plugins/pbap.c +3 -17 modified
obexd/plugins/syncevolution.c +13 -9 modified
obexd/src/dbus.h +3 -0 modified
obexd/src/manager.c +11 -0 modified
obexd/src/obex.c +34 -2 modified
obexd/src/obex.h +3 -0 modified
obexd/src/service.c +1 -1 modified
obexd/src/service.h +3 -1 modified

Full Patch

diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index c3a4193..b7f16f1 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
@@ -182,25 +182,11 @@ static gint ftp_prepare_get(struct obex_session *os, gchar *file,
 	return os_prepare_get(os, file, size);
 }
 
-static void ftp_connect(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t ftp_connect(struct OBEX_session *os)
 {
-	struct obex_session *os = OBEX_GetUserData(obex);
-	obex_headerdata_t hd;
-
-	register_session(os->cid, os);
-	emit_session_created(os->cid);
-
-	/* Append received UUID in WHO header */
-	hd.bs = FTP_TARGET;
-	OBEX_ObjectAddHeader(obex, obj,
-			OBEX_HDR_WHO, hd, sizeof(FTP_TARGET),
-			OBEX_FL_FIT_ONE_PACKET);
-	hd.bq4 = os->cid;
-	OBEX_ObjectAddHeader(obex, obj,
-			OBEX_HDR_CONNECTION, hd, 4,
-			OBEX_FL_FIT_ONE_PACKET);
-
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+	manager_register_session(os);
+
+	return OBEX_RSP_SUCCESS;
 }
 
 static void ftp_get(obex_t *obex, obex_object_t *obj)
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index d531e3c..aa690f8 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
@@ -34,9 +34,9 @@
 #include <glib.h>
 
 #include "plugin.h"
+#include "obex.h"
 #include "service.h"
 #include "logging.h"
-#include "obex.h"
 #include "dbus.h"
 
 #define VCARD_TYPE "text/x-vcard"
@@ -93,13 +93,11 @@
   </attribute>									\
 </record>"
 
-static void opp_connect(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t opp_connect(struct OBEX_session *os)
 {
-	struct obex_session *os = OBEX_GetUserData(obex);
+	manager_register_transfer(os);
 
-	register_transfer(os->cid, os);
-	/* OPP doesn't contains target or connection id. */
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+	return OBEX_RSP_SUCCESS;
 }
 
 static void opp_progress(obex_t *obex, obex_object_t *obj)
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index 807e68f..43d4214 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
@@ -378,25 +378,11 @@ static int pbap_pullvcardentry(obex_t *obex, obex_object_t *obj)
 	return err;
 }
 
-static void pbap_connect(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t pbap_connect(struct OBEX_session *os)
 {
-	struct obex_session *os = OBEX_GetUserData(obex);
-	obex_headerdata_t hd;
-
-	register_session(os->cid, os);
-	emit_session_created(os->cid);
+	manager_register_session(os);
 
-	/* Append received UUID in WHO header */
-	hd.bs = PBAP_TARGET;
-	OBEX_ObjectAddHeader(obex, obj,
-			OBEX_HDR_WHO, hd, sizeof(PBAP_TARGET),
-			OBEX_FL_FIT_ONE_PACKET);
-	hd.bq4 = os->cid;
-	OBEX_ObjectAddHeader(obex, obj,
-			OBEX_HDR_CONNECTION, hd, 4,
-			OBEX_FL_FIT_ONE_PACKET);
-
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+	return OBEX_RSP_SUCCESS;
 }
 
 static void pbap_get(obex_t *obex, obex_object_t *obj)
diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c
index 711b5a0..9b77492 100644
--- a/obexd/plugins/syncevolution.c
+++ b/obexd/plugins/syncevolution.c
@@ -219,8 +219,7 @@ static void connect_cb(DBusPendingCall *call, void *user_data)
 	g_free(cb_data);
 
 	/* Append received UUID in WHO header */
-	register_session(os->cid, os);
-	emit_session_created(os->cid);
+	manager_register_session(os);
 
 	hd.bs = SYNCML_TARGET;
 	OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_WHO, hd, SYNCML_TARGET_SIZE,
@@ -254,9 +253,8 @@ static void process_cb(DBusPendingCall *call, void *user_data)
 	dbus_message_unref(reply);
 }
 
-static void synce_connect(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t synce_connect(struct OBEX_session *os)
 {
-	struct obex_session *os = OBEX_GetUserData(obex);
 	DBusConnection *conn;
 	GError *err = NULL;
 	gchar address[18], id[36], transport[36], transport_description[24];
@@ -320,9 +318,13 @@ static void synce_connect(obex_t *obex, obex_object_t *obj)
 		goto failed;
 	}
 
+	/* FIXME: completely broken */
+
 	cb_data = g_malloc0(sizeof(struct callback_data));
-	cb_data->obex = obex;
-	cb_data->obj = obj;
+#if 0
+	cb_data->obex = os->obex;
+	cb_data->obj = os->obj;
+#endif
 	dbus_pending_call_set_notify(call, connect_cb, cb_data, NULL);
 
 	context = g_new0(struct synce_context, 1);
@@ -332,12 +334,14 @@ static void synce_connect(obex_t *obex, obex_object_t *obj)
 
 	dbus_pending_call_unref(call);
 	dbus_message_unref(msg);
+#if 0
+	/* FIXME: broken */
 	OBEX_SuspendRequest(obex, obj);
-
-	return;
+#endif
+	return OBEX_RSP_SUCCESS;
 
 failed:
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+	return OBEX_RSP_FORBIDDEN;
 }
 
 static void synce_put(obex_t *obex, obex_object_t *obj)
diff --git a/obexd/src/dbus.h b/obexd/src/dbus.h
index 7c3d360..d24085b 100644
--- a/obexd/src/dbus.h
+++ b/obexd/src/dbus.h
@@ -47,3 +47,6 @@ gint request_service_authorization(struct server *server, GIOChannel *io,
 void register_session(guint32 id, struct obex_session *os);
 
 void unregister_session(guint32 id);
+
+void manager_register_session(struct OBEX_session *os);
+void manager_register_transfer(struct OBEX_session *os);
diff --git a/obexd/src/manager.c b/obexd/src/manager.c
index 28ad0e1..962cd4e 100644
--- a/obexd/src/manager.c
+++ b/obexd/src/manager.c
@@ -642,6 +642,11 @@ void emit_transfer_progress(guint32 id, guint32 total, guint32 transfered)
 	g_free(path);
 }
 
+void manager_register_transfer(struct OBEX_session *os)
+{
+	register_transfer(os->cid, os);
+}
+
 void register_transfer(guint32 id, struct obex_session *os)
 {
 	gchar *path = g_strdup_printf("/transfer%u", id);
@@ -1022,6 +1027,12 @@ void register_session(guint32 id, struct obex_session *os)
 	g_free(path);
 }
 
+void manager_register_session(struct OBEX_session *os)
+{
+	register_session(os->cid, os);
+	emit_session_created(os->cid);
+}
+
 void unregister_session(guint32 id)
 {
 	gchar *path = g_strdup_printf("/session%u", id);
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index 3035b1f..bd83917 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
@@ -64,6 +64,21 @@ typedef struct {
 	guint16 mtu;
 } __attribute__ ((packed)) obex_connect_hdr_t;
 
+static void os_set_response(obex_object_t *obj, obex_rsp_t lastrsp)
+{
+	guint8 rsp;
+
+	switch (lastrsp) {
+	case OBEX_RSP_SUCCESS:
+		rsp = OBEX_RSP_CONTINUE;
+		break;
+	default:
+		rsp = lastrsp;
+	}
+
+	OBEX_ObjectSetRsp(obj, rsp, lastrsp);
+}
+
 static void os_reset_session(struct obex_session *os)
 {
 	if (os->object) {
@@ -182,6 +197,7 @@ static void cmd_connect(struct obex_session *os,
 	guint8 hi;
 	const guint8 *target = NULL, *who = NULL;
 	guint target_size = 0, who_size = 0;
+	obex_rsp_t rsp;
 
 	if (OBEX_ObjectGetNonHdrData(obj, &buffer) != sizeof(*nonhdr)) {
 		OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
@@ -228,8 +244,24 @@ static void cmd_connect(struct obex_session *os,
 
 	debug("Selected driver: %s", os->service->name);
 
-	if (os->service->connect)
-		os->service->connect(obex, obj);
+	if (!os->service->connect) {
+		OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+		return;
+	}
+
+	rsp = os->service->connect(os);
+	if (rsp == OBEX_RSP_SUCCESS && os->service->target) {
+		hd.bs = os->service->target;
+		OBEX_ObjectAddHeader(obex, obj,
+				OBEX_HDR_WHO, hd, 16,
+				OBEX_FL_FIT_ONE_PACKET);
+		hd.bq4 = os->cid;
+		OBEX_ObjectAddHeader(obex, obj,
+				OBEX_HDR_CONNECTION, hd, 4,
+				OBEX_FL_FIT_ONE_PACKET);
+	}
+
+	os_set_response(obj, rsp);
 }
 
 static gboolean chk_cid(obex_t *obex, obex_object_t *obj, guint32 cid)
diff --git a/obexd/src/obex.h b/obexd/src/obex.h
index 3e206ad..76dbdc1 100644
--- a/obexd/src/obex.h
+++ b/obexd/src/obex.h
@@ -82,6 +82,9 @@ struct obex_session {
 	gboolean	finished;
 };
 
+/* FIXME: first step to obsfuscate */
+#define OBEX_session obex_session
+
 gint obex_session_start(GIOChannel *io, struct server *server);
 struct obex_session *obex_get_session(gpointer object);
 gint obex_tty_session_stop(void);
diff --git a/obexd/src/service.c b/obexd/src/service.c
index c6ce101..2a376be 100644
--- a/obexd/src/service.c
+++ b/obexd/src/service.c
@@ -32,9 +32,9 @@
 #include <openobex/obex.h>
 #include <openobex/obex_const.h>
 
+#include "obex.h"
 #include "service.h"
 #include "logging.h"
-#include "obex.h"
 
 static GSList *drivers = NULL;
 
diff --git a/obexd/src/service.h b/obexd/src/service.h
index 94017ad..a4f3e34 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
@@ -21,6 +21,8 @@
  *
  */
 
+typedef guint8		obex_rsp_t;
+
 struct obex_service_driver {
 	const char *name;
 	guint16 service;
@@ -30,7 +32,7 @@ struct obex_service_driver {
 	const guint8 *who;
 	guint who_size;
 	const gchar *record;
-	void (*connect) (obex_t *obex, obex_object_t *obj);
+	obex_rsp_t (*connect) (struct OBEX_session *os);
 	void (*progress) (obex_t *obex, obex_object_t *obj);
 	void (*get) (obex_t *obex, obex_object_t *obj);
 	void (*put) (obex_t *obex, obex_object_t *obj);