From 807f9b748186fa4747ad9f9d35dd38d9a3108604 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Wed, 29 Oct 2008 10:45:54 -0300 Subject: [PATCH] obexd: Added ListFolder method skeleton --- obexd/client/session.c | 105 +++++++++++++++++++++++++++++------------ 1 file changed, 75 insertions(+), 30 deletions(-) diff --git a/obexd/client/session.c b/obexd/client/session.c index 036eb6d69..96e9be69f 100644 --- a/obexd/client/session.c +++ b/obexd/client/session.c @@ -650,6 +650,43 @@ static GDBusMethodTable session_methods[] = { { } }; +static void list_folder_callback(struct session_data *session, + void *user_data) +{ + DBusMessage *message = user_data; + + g_dbus_send_reply(session->conn, message, DBUS_TYPE_INVALID); + dbus_message_unref(message); +} + +static void get_xfer_progress(GwObexXfer *xfer, gpointer user_data) +{ + struct callback_data *callback = user_data; + char buf[1024]; + gint len; + + if (gw_obex_xfer_read(xfer, buf, sizeof(buf), &len, NULL) == FALSE) + goto complete; + + if (len == gw_obex_xfer_object_size(xfer)) + goto complete; + + gw_obex_xfer_flush(xfer, NULL); + + return; + +complete: + gw_obex_xfer_close(xfer, NULL); + gw_obex_xfer_free(xfer); + callback->session->xfer = NULL; + + callback->func(callback->session, callback->data); + + session_unref(callback->session); + + g_free(callback); +} + static DBusMessage *change_folder(DBusConnection *connection, DBusMessage *message, void *user_data) { @@ -681,7 +718,42 @@ static DBusMessage *create_folder(DBusConnection *connection, static DBusMessage *list_folder(DBusConnection *connection, DBusMessage *message, void *user_data) { - return dbus_message_new_method_return(message); + struct session_data *session = user_data; + struct callback_data *callback; + GwObexXfer *xfer; + int err; + + if (session->obex == NULL) + return g_dbus_create_error(message, + "org.openobex.Error.Failed", + "Not connected"); + + session_ref(session); + xfer = gw_obex_get_async(session->obex, + NULL, "x-obex/folder-listing", &err); + if (xfer == NULL) { + session_unref(session); + return g_dbus_create_error(message, + "org.openobex.Error.Failed", + OBEX_ResponseToString(err)); + } + + callback = g_try_malloc0(sizeof(*callback)); + if (callback == NULL) { + session_unref(session); + gw_obex_xfer_free(xfer); + return NULL; + } + + callback->session = session; + callback->func = list_folder_callback; + callback->data = dbus_message_ref(message); + + gw_obex_xfer_set_callback(xfer, get_xfer_progress, callback); + + session->xfer = xfer; + + return NULL; } static DBusMessage *get_file(DBusConnection *connection, @@ -733,7 +805,8 @@ static DBusMessage *delete(DBusConnection *connection, static GDBusMethodTable ftp_methods[] = { { "ChangeFolder", "s", "", change_folder }, { "CreateFolder", "s", "", create_folder }, - { "ListFolder", "", "aa{sv}", list_folder }, + { "ListFolder", "", "aa{sv}", list_folder, + G_DBUS_METHOD_FLAG_ASYNC }, { "GetFile", "ss", "", get_file }, { "PutFile", "ss", "", put_file }, { "CopyFile", "ss", "", copy_file }, @@ -902,34 +975,6 @@ int session_send(struct session_data *session, const char *filename, return 0; } -static void get_xfer_progress(GwObexXfer *xfer, gpointer user_data) -{ - struct callback_data *callback = user_data; - char buf[1024]; - gint len; - - if (gw_obex_xfer_read(xfer, buf, sizeof(buf), &len, NULL) == FALSE) - goto complete; - - if (len == gw_obex_xfer_object_size(xfer)) - goto complete; - - gw_obex_xfer_flush(xfer, NULL); - - return; - -complete: - gw_obex_xfer_close(xfer, NULL); - gw_obex_xfer_free(xfer); - callback->session->xfer = NULL; - - callback->func(callback->session, callback->data); - - session_unref(callback->session); - - g_free(callback); -} - int session_pull(struct session_data *session, const char *type, const char *filename, session_callback_t function, void *user_data) -- 2.47.3