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
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++) {
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);
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);
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
#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 {
{
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;
struct session_data *session;
struct callback_data *callback;
int err;
+ uint16_t uuid;
if (destination == NULL)
return -EINVAL;
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) {
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;