summaryrefslogtreecommitdiffstats
path: root/transfer/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'transfer/main.c')
-rw-r--r--transfer/main.c101
1 files changed, 94 insertions, 7 deletions
diff --git a/transfer/main.c b/transfer/main.c
index 416b871e..c8baec6f 100644
--- a/transfer/main.c
+++ b/transfer/main.c
@@ -26,21 +26,98 @@
#endif
#include <stdlib.h>
-#include <string.h>
+#include <stdint.h>
#include <signal.h>
-#include <sys/stat.h>
-
-#include <dbus/dbus.h>
#include <glib.h>
+#include <dbus/dbus.h>
+
#include "logging.h"
#include "dbus.h"
+#include "server.h"
+#include "session.h"
+
+#define SERVICE_PATH "/org/bluez/transfer"
+
static GMainLoop *main_loop;
static DBusConnection *system_bus;
+static DBusHandlerResult error_reply(DBusConnection *conn,
+ DBusMessage *msg, const char *str)
+{
+ return send_message_and_unref(conn,
+ dbus_message_new_error(msg, "org.bluez.transfer.Error", str));
+}
+
+static DBusHandlerResult push_message(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ DBusMessage *reply;
+ const char *address, *pathname, *identifier;
+ struct session_data *session;
+
+ if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
+ DBUS_TYPE_STRING, &pathname, DBUS_TYPE_INVALID) == FALSE)
+ return error_reply(conn, msg, "Invalid arguments");
+
+ debug("Requesting push of %s to %s", pathname, address);
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+ session = session_create(conn, msg);
+ if (!session) {
+ dbus_message_unref(reply);
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ }
+
+ identifier = session_connect(session, address, pathname);
+ if (!identifier) {
+ session_destroy(session);
+ dbus_message_unref(reply);
+ return error_reply(conn, msg, "Unable to connect session");
+ }
+
+ debug("Created new session at %s", identifier);
+
+ dbus_message_append_args(reply, DBUS_TYPE_STRING, &identifier,
+ DBUS_TYPE_INVALID);
+
+ dbus_connection_send(conn, reply, NULL);
+
+ dbus_message_unref(reply);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusHandlerResult manager_handler(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ if (dbus_message_is_method_call(msg, "org.bluez.transfer.Manager", "Push"))
+ return push_message(conn, msg, data);
+
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+static DBusObjectPathVTable manager_table = {
+ .message_function = manager_handler,
+};
+
+static int setup_manager(void)
+{
+ if (dbus_connection_register_object_path(system_bus,
+ SERVICE_PATH, &manager_table, NULL) == FALSE) {
+ error("Service path registration failed");
+ return -1;
+ }
+
+ return 0;
+}
+
static void sig_term(int sig)
{
g_main_loop_quit(main_loop);
@@ -59,8 +136,6 @@ int main(int argc, char *argv[])
{
struct sigaction sa;
- umask(0077);
-
start_logging("transfer", "Bluetooth transfer service ver %s", VERSION);
memset(&sa, 0, sizeof(sa));
@@ -82,14 +157,26 @@ int main(int argc, char *argv[])
main_loop = g_main_loop_new(NULL, FALSE);
- system_bus = init_dbus("org.bluez.transfer", NULL, NULL);
+ system_bus = init_dbus(NULL, NULL, NULL);
if (!system_bus) {
g_main_loop_unref(main_loop);
exit(1);
}
+ if (setup_manager() < 0) {
+ dbus_connection_unref(system_bus);
+ g_main_loop_unref(main_loop);
+ exit(1);
+ }
+
+ start_server(9);
+
g_main_loop_run(main_loop);
+ stop_server();
+
+ dbus_connection_unregister_object_path(system_bus, SERVICE_PATH);
+
dbus_connection_unref(system_bus);
g_main_loop_unref(main_loop);