Diff between 26e1b857020c1a3be79b146ea3a2eff2fdad19c0 and 7a92ff811003bf2d04d9e3f74be5faca247f2368

Changed Files

File Additions Deletions Status
obexd/client/main.c +28 -5 modified
obexd/client/session.c +22 -4 modified

Full Patch

diff --git a/obexd/client/main.c b/obexd/client/main.c
index 1f8a140..8a8cfb2 100644
--- a/obexd/client/main.c
+++ b/obexd/client/main.c
@@ -57,11 +57,14 @@ static void create_callback(struct session_data *session, void *user_data)
 		DBusMessage *error = g_dbus_create_error(data->message,
 					"org.openobex.Error.Failed", NULL);
 		g_dbus_send_message(data->connection, error);
-		goto failed;
+		goto done;
 	}
 
 	g_dbus_send_reply(data->connection, data->message, DBUS_TYPE_INVALID);
 
+	if (session->target != NULL)
+		goto done;
+
 	session_set_agent(session, data->sender, data->agent);
 
 	for (i = 0; i < data->files->len; i++) {
@@ -70,8 +73,9 @@ static void create_callback(struct session_data *session, void *user_data)
 			break;
 	}
 
-failed:
-	g_ptr_array_free(data->files, TRUE);
+done:
+	if (data->files)
+		g_ptr_array_free(data->files, TRUE);
 	dbus_message_unref(data->message);
 	dbus_connection_unref(data->connection);
 	g_free(data->sender);
@@ -180,6 +184,7 @@ static DBusMessage *create_session(DBusConnection *connection,
 				DBusMessage *message, void *user_data)
 {
 	DBusMessageIter iter, dict;
+	struct send_data *data;
 	const char *source = NULL, *dest = NULL, *target = NULL;
 
 	dbus_message_iter_init(message, &iter);
@@ -190,12 +195,30 @@ static DBusMessage *create_session(DBusConnection *connection,
 		return g_dbus_create_error(message,
 				"org.openobex.Error.InvalidArguments", NULL);
 
-	return g_dbus_create_error(message, "org.openobex.Error.Failed", NULL);
+	data = g_try_malloc0(sizeof(*data));
+	if (data == NULL)
+		return g_dbus_create_error(message,
+					"org.openobex.Error.NoMemory", NULL);
+
+	data->connection = dbus_connection_ref(connection);
+	data->message = dbus_message_ref(message);
+	data->sender = g_strdup(dbus_message_get_sender(message));
+
+	if (session_create(source, dest, target, create_callback, data) == 0)
+		return NULL;
+
+	dbus_message_unref(data->message);
+	dbus_connection_unref(data->connection);
+	g_free(data->sender);
+	g_free(data);
+
+	return g_dbus_create_error(message,
+			"org.openobex.Error.Failed", NULL);
 }
 
 static GDBusMethodTable client_methods[] = {
 	{ "SendFiles", "a{sv}aso", "", send_files, G_DBUS_METHOD_FLAG_ASYNC },
-	{ "CreateSession", "a{sv}", "", create_session },
+	{ "CreateSession", "a{sv}", "", create_session, G_DBUS_METHOD_FLAG_ASYNC },
 	{ }
 };
 
diff --git a/obexd/client/session.c b/obexd/client/session.c
index cec5b36..a4af371 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
@@ -46,6 +46,8 @@
 #define TRANSFER_INTERFACE  "org.openobex.Transfer"
 #define TRANSFER_BASEPATH   "/org/openobex"
 
+#define FOLDER_BROWSING_UUID	"\xF9\xEC\x7B\xC4\x95\x3C\x11\xD2\x98\x4E\x52\x54\x00\xDC\x9E\x09"
+
 static guint64 counter = 0;
 
 struct callback_data {
@@ -116,14 +118,26 @@ static gboolean rfcomm_callback(GIOChannel *io, GIOCondition cond,
 {
 	struct callback_data *callback = user_data;
 	GwObex *obex;
-	int fd;
+	const char *uuid;
+	int fd, len;
 
 	if (cond & (G_IO_NVAL | G_IO_ERR))
 		goto done;
 
 	fd = g_io_channel_unix_get_fd(io);
 
-	obex = gw_obex_setup_fd(fd, NULL, 0, NULL, NULL);
+	switch (callback->uuid) {
+	case OBEX_FILETRANS_SVCLASS_ID:
+		uuid = FOLDER_BROWSING_UUID;
+		len = 16;
+		break;
+	case OBEX_OBJPUSH_SVCLASS_ID:
+		uuid = NULL;
+		len = 0;
+		break;
+	}
+
+	obex = gw_obex_setup_fd(fd, uuid, len, NULL, NULL);
 
 	callback->session->sock = fd;
 	callback->session->obex = obex;
@@ -352,6 +366,7 @@ int session_create(const char *source,
 	struct session_data *session;
 	struct callback_data *callback;
 	int err;
+	uint16_t uuid;
 
 	if (destination == NULL)
 		return -EINVAL;
@@ -376,8 +391,11 @@ int session_create(const char *source,
 
 	str2ba(destination, &session->dst);
 
-	if (target != NULL)
+	if (target != NULL) {
+		uuid = OBEX_FILETRANS_SVCLASS_ID;
 		session->target = g_strdup(target);
+	} else
+		uuid = OBEX_OBJPUSH_SVCLASS_ID;
 
 	callback = g_try_malloc0(sizeof(*callback));
 	if (callback == NULL) {
@@ -393,7 +411,7 @@ int session_create(const char *source,
 		err = rfcomm_connect(&session->src, &session->dst,
 				session->channel, rfcomm_callback, callback);
 	} else {
-		callback->uuid = OBEX_OBJPUSH_SVCLASS_ID;
+		callback->uuid = uuid;
 		callback->sdp = service_connect(&session->src, &session->dst,
 						service_callback, callback);
 		err = (callback->sdp == NULL) ? -ENOMEM : 0;