Diff between 7d31f72c0d8c66f2cac90d4d19b83840f7f58bf4 and 5bb6f1c0b0236dee7f17be9d90ef58f6d97c9c42

Changed Files

File Additions Deletions Status
obexd/plugins/ftp.c +35 -2 modified
obexd/plugins/opp.c +31 -0 modified
obexd/plugins/pbap.c +33 -1 modified
obexd/src/obex.c +8 -39 modified
obexd/src/service.h +3 -0 modified

Full Patch

diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index 0736095..f5a8fd0 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
@@ -189,6 +189,27 @@ 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)
+{
+	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);
+}
+
 static void ftp_get(obex_t *obex, obex_object_t *obj)
 {
 	obex_headerdata_t hv;
@@ -432,16 +453,26 @@ done:
 	g_free(fullname);
 }
 
+static void ftp_disconnect(obex_t *obex)
+{
+	struct obex_session *os = OBEX_GetUserData(obex);
+
+	emit_session_removed(os->cid);
+	unregister_session(os->cid);
+}
+
 struct obex_service_driver pcsuite = {
 	.name = "Nokia OBEX PC Suite Services",
 	.service = OBEX_PCSUITE,
 	.channel = PCSUITE_CHANNEL,
 	.record = PCSUITE_RECORD,
 	.target = FTP_TARGET,
+	.connect = ftp_connect,
 	.get = ftp_get,
 	.put = ftp_put,
 	.chkput = ftp_chkput,
-	.setpath = ftp_setpath
+	.setpath = ftp_setpath,
+	.disconnect = ftp_disconnect
 };
 
 struct obex_service_driver ftp = {
@@ -450,10 +481,12 @@ struct obex_service_driver ftp = {
 	.channel = FTP_CHANNEL,
 	.record = FTP_RECORD,
 	.target = FTP_TARGET,
+	.connect = ftp_connect,
 	.get = ftp_get,
 	.put = ftp_put,
 	.chkput = ftp_chkput,
-	.setpath = ftp_setpath
+	.setpath = ftp_setpath,
+	.disconnect = ftp_disconnect
 };
 
 static int ftp_init(void)
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index 64de753..d7f2999 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
@@ -94,6 +94,15 @@
   </attribute>									\
 </record>"
 
+static void opp_connect(obex_t *obex, obex_object_t *obj)
+{
+	struct obex_session *os = OBEX_GetUserData(obex);
+
+	register_transfer(os->cid, os);
+	/* OPP doesn't contains target or connection id. */
+	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+}
+
 static gint opp_chkput(obex_t *obex, obex_object_t *obj)
 {
 	struct obex_session *os;
@@ -132,6 +141,7 @@ static gint opp_chkput(obex_t *obex, obex_object_t *obj)
 	}
 
 skip_auth:
+	emit_transfer_started(os->cid);
 	return os_prepare_put(os);
 }
 
@@ -199,14 +209,35 @@ fail:
 	OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
 }
 
+static void opp_disconnect(obex_t *obex)
+{
+	struct obex_session *os = OBEX_GetUserData(obex);
+
+	/* Got an error during a transfer. */
+	if (os->object)
+		emit_transfer_completed(os->cid, os->offset == os->size);
+
+	unregister_transfer(os->cid);
+}
+
+static void opp_reset(obex_t *obex)
+{
+	struct obex_session *os = OBEX_GetUserData(obex);
+
+	emit_transfer_completed(os->cid, !os->aborted);
+}
+
 struct obex_service_driver driver = {
 	.name = "Object Push server",
 	.service = OBEX_OPP,
 	.channel = OPP_CHANNEL,
 	.record = OPP_RECORD,
+	.connect = opp_connect,
+	.disconnect = opp_disconnect,
 	.get = opp_get,
 	.put = opp_put,
 	.chkput = opp_chkput,
+	.reset = opp_reset
 };
 
 static int opp_init(void)
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index c553deb..340fb06 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
@@ -40,6 +40,7 @@
 #include "service.h"
 #include "phonebook.h"
 #include "telephony.h"
+#include "dbus.h"
 
 #define PHONEBOOK_TYPE		"x-bt/phonebook"
 #define VCARDLISTING_TYPE	"x-bt/vcard-listing"
@@ -377,6 +378,27 @@ static int pbap_pullvcardentry(obex_t *obex, obex_object_t *obj)
 	return err;
 }
 
+static void pbap_connect(obex_t *obex, obex_object_t *obj)
+{
+	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 = 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);
+}
+
 static void pbap_get(obex_t *obex, obex_object_t *obj)
 {
 	struct obex_session *session = OBEX_GetUserData(obex);
@@ -528,14 +550,24 @@ static void pbap_setpath(obex_t *obex, obex_object_t *obj)
 	OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
 }
 
+static void pbap_disconnect(obex_t *obex)
+{
+	struct obex_session *os = OBEX_GetUserData(obex);
+
+	emit_session_removed(os->cid);
+	unregister_session(os->cid);
+}
+
 struct obex_service_driver pbap = {
 	.name = "Phonebook Access server",
 	.service = OBEX_PBAP,
 	.channel = PBAP_CHANNEL,
 	.record = PBAP_RECORD,
 	.target = PBAP_TARGET,
+	.connect = pbap_connect,
 	.get = pbap_get,
-	.setpath = pbap_setpath
+	.setpath = pbap_setpath,
+	.disconnect = pbap_disconnect
 };
 
 static int pbap_init(void)
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index bdf3703..b333b6a 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
@@ -214,28 +214,8 @@ static void cmd_connect(struct obex_session *os,
 		return;
 	}
 
-	if (os->service->service == OBEX_OPP) {
-		register_transfer(os->cid, os);
-		/* OPP doesn't contains target or connection id. */
-		OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
-
-		return;
-	}
-
-	register_session(cid, os);
-	emit_session_created(cid);
-
-	/* Append received UUID in WHO header */
-	hd.bs = os->service->target;
-	OBEX_ObjectAddHeader(obex, obj,
-			OBEX_HDR_WHO, hd, TARGET_SIZE,
-			OBEX_FL_FIT_ONE_PACKET);
-	hd.bq4 = cid;
-	OBEX_ObjectAddHeader(obex, obj,
-			OBEX_HDR_CONNECTION, hd, 4,
-			OBEX_FL_FIT_ONE_PACKET);
-
-	OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+	if (os->service->connect)
+		os->service->connect(obex, obj);
 }
 
 static gboolean chk_cid(obex_t *obex, obex_object_t *obj, guint32 cid)
@@ -501,9 +481,6 @@ gint os_prepare_put(struct obex_session *os)
 
 	g_free(path);
 
-	if (os->service->service == OBEX_OPP)
-		emit_transfer_started(os->cid);
-
 	if (!os->buf) {
 		debug("PUT request checked, no buffered data");
 		return 0;
@@ -754,8 +731,8 @@ static void obex_event(obex_t *obex, obex_object_t *obj, gint mode,
 		break;
 	case OBEX_EV_ABORT:
 		os->aborted = TRUE;
-		if (os->service->service == OBEX_OPP)
-			emit_transfer_completed(os->cid, FALSE);
+		if (os->service->reset)
+			os->service->reset(obex);
 		os_reset_session(os);
 		OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
 		break;
@@ -767,8 +744,8 @@ static void obex_event(obex_t *obex, obex_object_t *obj, gint mode,
 		case OBEX_CMD_PUT:
 		case OBEX_CMD_GET:
 			os_session_mark_aborted(os);
-			if (os->service->service == OBEX_OPP)
-				emit_transfer_completed(os->cid, !os->aborted);
+			if (os->service->reset)
+				os->service->reset(obex);
 			os_reset_session(os);
 			break;
 		default:
@@ -874,16 +851,8 @@ static void obex_handle_destroy(gpointer user_data)
 
 	os = OBEX_GetUserData(obex);
 
-	if (os->service->service == OBEX_OPP) {
-		/* Got an error during a transfer. */
-		if (os->object)
-			emit_transfer_completed(os->cid, os->offset == os->size);
-
-		unregister_transfer(os->cid);
-	} else {
-		emit_session_removed(os->cid);
-		unregister_session(os->cid);
-	}
+	if (os->service && os->service->disconnect)
+		os->service->disconnect(obex);
 
 	obex_session_free(os);
 
diff --git a/obexd/src/service.h b/obexd/src/service.h
index 2cf3443..32720e1 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
@@ -27,10 +27,13 @@ struct obex_service_driver {
 	guint8 channel;
 	const guint8 *target;
 	const gchar *record;
+	void (*connect) (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);
 	gint (*chkput) (obex_t *obex, obex_object_t *obj);
 	void (*setpath) (obex_t *obex, obex_object_t *obj);
+	void (*disconnect) (obex_t *obex);
+	void (*reset) (obex_t *obex);
 };
 
 int obex_service_driver_register(struct obex_service_driver *driver);