Diff between 3d49a8830697d6adea3453286a85857413e57f4e and 84d01d66e164dccd076977237b28cbfbb8629d8e

Changed Files

File Additions Deletions Status
doc/obexd-api.txt +1 -1 modified
obexd/plugins/opp.c +6 -8 modified
obexd/src/manager.c +46 -41 modified
obexd/src/manager.h +9 -7 modified

Full Patch

diff --git a/doc/obexd-api.txt b/doc/obexd-api.txt
index cf95b32..a9d199b 100644
--- a/doc/obexd-api.txt
+++ b/doc/obexd-api.txt
@@ -45,7 +45,7 @@ Transfer hierarchy
 
 Service		org.bluez.obex
 Interface	org.bluez.obex.Transfer1
-Object path	/transfer{0, 1, 2, ...}
+Object path	/org/bluez/obex/session{0, 1, 2, ...}/transfer{0, 1, 2, ...}
 
 Methods		void Cancel()
 
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index faa4437..97bf943 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
@@ -46,17 +46,15 @@
 
 static void *opp_connect(struct obex_session *os, int *err)
 {
-	manager_register_transfer(os);
-
 	if (err)
 		*err = 0;
 
-	return NULL;
+	return manager_register_transfer(os);
 }
 
 static void opp_progress(struct obex_session *os, void *user_data)
 {
-	manager_emit_transfer_progress(os);
+	manager_emit_transfer_progress(user_data);
 }
 
 static int opp_chkput(struct obex_session *os, void *user_data)
@@ -80,7 +78,7 @@ static int opp_chkput(struct obex_session *os, void *user_data)
 	}
 
 	time = 0;
-	err = manager_request_authorization(os, time, &folder, &name);
+	err = manager_request_authorization(user_data, time, &folder, &name);
 	if (err < 0)
 		return -EPERM;
 
@@ -108,7 +106,7 @@ skip_auth:
 	if (err < 0)
 		goto failed;
 
-	manager_emit_transfer_started(os);
+	manager_emit_transfer_started(user_data);
 
 failed:
 	g_free(folder);
@@ -155,12 +153,12 @@ static int opp_get(struct obex_session *os, void *user_data)
 
 static void opp_disconnect(struct obex_session *os, void *user_data)
 {
-	manager_unregister_transfer(os);
+	manager_unregister_transfer(user_data);
 }
 
 static void opp_reset(struct obex_session *os, void *user_data)
 {
-	manager_emit_transfer_completed(os);
+	manager_emit_transfer_completed(user_data);
 }
 
 static struct obex_service_driver driver = {
diff --git a/obexd/src/manager.c b/obexd/src/manager.c
index 07cecee..b138e55 100644
--- a/obexd/src/manager.c
+++ b/obexd/src/manager.c
@@ -62,6 +62,11 @@ struct agent {
 	unsigned int watch_id;
 };
 
+struct obex_transfer {
+	char *path;
+	struct obex_session *session;
+};
+
 static struct agent *agent = NULL;
 
 static DBusConnection *connection = NULL;
@@ -373,73 +378,74 @@ void manager_cleanup(void)
 	dbus_connection_unref(connection);
 }
 
-void manager_emit_transfer_started(struct obex_session *os)
+void manager_emit_transfer_started(struct obex_transfer *transfer)
 {
-	char *path = g_strdup_printf("/transfer%u", os->id);
-
 	g_dbus_emit_signal(connection, OBEX_MANAGER_PATH,
 			OBEX_MANAGER_INTERFACE, "TransferStarted",
-			DBUS_TYPE_OBJECT_PATH, &path,
+			DBUS_TYPE_OBJECT_PATH, &transfer->path,
 			DBUS_TYPE_INVALID);
-
-	g_free(path);
 }
 
-static void emit_transfer_completed(struct obex_session *os, gboolean success)
+static void emit_transfer_completed(struct obex_transfer *transfer,
+							gboolean success)
 {
-	char *path = g_strdup_printf("/transfer%u", os->id);
-
 	g_dbus_emit_signal(connection, OBEX_MANAGER_PATH,
 			OBEX_MANAGER_INTERFACE, "TransferCompleted",
-			DBUS_TYPE_OBJECT_PATH, &path,
+			DBUS_TYPE_OBJECT_PATH, &transfer->path,
 			DBUS_TYPE_BOOLEAN, &success,
 			DBUS_TYPE_INVALID);
-
-	g_free(path);
 }
 
-static void emit_transfer_progress(struct obex_session *os, uint32_t total,
-							uint32_t transferred)
+static void emit_transfer_progress(struct obex_transfer *transfer,
+					uint32_t total, uint32_t transferred)
 {
-	char *path = g_strdup_printf("/transfer%u", os->id);
-
-	g_dbus_emit_signal(connection, path,
+	g_dbus_emit_signal(connection, transfer->path,
 			TRANSFER_INTERFACE, "Progress",
 			DBUS_TYPE_INT32, &total,
 			DBUS_TYPE_INT32, &transferred,
 			DBUS_TYPE_INVALID);
+}
 
-	g_free(path);
+static void transfer_free(struct obex_transfer *transfer)
+{
+	g_free(transfer->path);
+	g_free(transfer);
 }
 
-void manager_register_transfer(struct obex_session *os)
+struct obex_transfer *manager_register_transfer(struct obex_session *os)
 {
-	char *path = g_strdup_printf("/transfer%u", os->id);
+	struct obex_transfer *transfer;
+	static unsigned int id = 0;
 
-	if (!g_dbus_register_interface(connection, path,
+	transfer = g_new0(struct obex_transfer, 1);
+	transfer->path = g_strdup_printf("/org/bluez/obex/session%u/transfer%u",
+								os->id, id++);
+	transfer->session = os;
+
+	if (!g_dbus_register_interface(connection, transfer->path,
 				TRANSFER_INTERFACE,
 				transfer_methods, transfer_signals,
 				NULL, os, NULL)) {
 		error("Cannot register Transfer interface.");
-		g_free(path);
-		return;
+		transfer_free(transfer);
+		return NULL;
 	}
 
-	g_free(path);
+	return transfer;
 }
 
-void manager_unregister_transfer(struct obex_session *os)
+void manager_unregister_transfer(struct obex_transfer *transfer)
 {
-	char *path = g_strdup_printf("/transfer%u", os->id);
+	struct obex_session *os = transfer->session;
 
 	/* Got an error during a transfer. */
 	if (os->object)
-		emit_transfer_completed(os, os->offset == os->size);
+		emit_transfer_completed(transfer, os->offset == os->size);
 
-	g_dbus_unregister_interface(connection, path,
-				TRANSFER_INTERFACE);
+	g_dbus_unregister_interface(connection, transfer->path,
+							TRANSFER_INTERFACE);
 
-	g_free(path);
+	transfer_free(transfer);
 }
 
 static void agent_cancel(void)
@@ -508,14 +514,15 @@ static gboolean auth_error(GIOChannel *io, GIOCondition cond, void *user_data)
 	return FALSE;
 }
 
-int manager_request_authorization(struct obex_session *os, int32_t time,
+int manager_request_authorization(struct obex_transfer *transfer, int32_t time,
 					char **new_folder, char **new_name)
 {
+	struct obex_session *os = transfer->session;
 	DBusMessage *msg;
 	DBusPendingCall *call;
 	const char *filename = os->name ? os->name : "";
 	const char *type = os->type ? os->type : "";
-	char *path, *address;
+	char *address;
 	unsigned int watch;
 	gboolean got_reply;
 	int err;
@@ -533,13 +540,11 @@ int manager_request_authorization(struct obex_session *os, int32_t time,
 	if (err < 0)
 		return err;
 
-	path = g_strdup_printf("/transfer%u", os->id);
-
 	msg = dbus_message_new_method_call(agent->bus_name, agent->path,
 						AGENT_INTERFACE, "Authorize");
 
 	dbus_message_append_args(msg,
-			DBUS_TYPE_OBJECT_PATH, &path,
+			DBUS_TYPE_OBJECT_PATH, &transfer->path,
 			DBUS_TYPE_STRING, &address,
 			DBUS_TYPE_STRING, &filename,
 			DBUS_TYPE_STRING, &type,
@@ -547,7 +552,6 @@ int manager_request_authorization(struct obex_session *os, int32_t time,
 			DBUS_TYPE_INT32, &time,
 			DBUS_TYPE_INVALID);
 
-	g_free(path);
 	g_free(address);
 
 	if (!dbus_connection_send_with_reply(connection,
@@ -618,15 +622,16 @@ void manager_unregister_session(struct obex_session *os)
 	g_free(path);
 }
 
-void manager_emit_transfer_progress(struct obex_session *os)
+void manager_emit_transfer_progress(struct obex_transfer *transfer)
 {
-	emit_transfer_progress(os, os->size, os->offset);
+	emit_transfer_progress(transfer, transfer->session->size,
+						transfer->session->offset);
 }
 
-void manager_emit_transfer_completed(struct obex_session *os)
+void manager_emit_transfer_completed(struct obex_transfer *transfer)
 {
-	if (os->object)
-		emit_transfer_completed(os, !os->aborted);
+	if (transfer->session->object)
+		emit_transfer_completed(transfer, !transfer->session->aborted);
 }
 
 DBusConnection *manager_dbus_get_connection(void)
diff --git a/obexd/src/manager.h b/obexd/src/manager.h
index b0400aa..669b223 100644
--- a/obexd/src/manager.h
+++ b/obexd/src/manager.h
@@ -26,15 +26,17 @@
 #define OBEXD_SERVICE  "org.bluez.obex"
 
 struct obex_session;
+struct obex_transfer;
 
 void manager_register_session(struct obex_session *os);
 void manager_unregister_session(struct obex_session *os);
-void manager_register_transfer(struct obex_session *os);
-void manager_unregister_transfer(struct obex_session *os);
-void manager_emit_transfer_started(struct obex_session *os);
-void manager_emit_transfer_progress(struct obex_session *os);
-void manager_emit_transfer_completed(struct obex_session *os);
-int manager_request_authorization(struct obex_session *os, int32_t time,
-		char **new_folder, char **new_name);
+
+struct obex_transfer *manager_register_transfer(struct obex_session *os);
+void manager_unregister_transfer(struct obex_transfer *transfer);
+void manager_emit_transfer_started(struct obex_transfer *transfer);
+void manager_emit_transfer_progress(struct obex_transfer *transfer);
+void manager_emit_transfer_completed(struct obex_transfer *transfer);
+int manager_request_authorization(struct obex_transfer *transfer, int32_t time,
+					char **new_folder, char **new_name);
 
 DBusConnection *manager_dbus_get_connection(void);