From 7a92ff811003bf2d04d9e3f74be5faca247f2368 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 24 Oct 2008 11:43:53 -0300 Subject: [PATCH] obexd: Establish File Transfer OBEX connection when CreateSession method is called --- obexd/client/main.c | 33 ++++++++++++++++++++++++++++----- obexd/client/session.c | 26 ++++++++++++++++++++++---- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/obexd/client/main.c b/obexd/client/main.c index 1f8a140b6..8a8cfb21d 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 cec5b3687..a4af3710a 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; -- 2.47.3