diff options
Diffstat (limited to 'src/obexftp.c')
-rw-r--r-- | src/obexftp.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/obexftp.c b/src/obexftp.c new file mode 100644 index 0000000..6d94c97 --- /dev/null +++ b/src/obexftp.c @@ -0,0 +1,162 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ + +/* + * Copyright (C) 2004-2008 Red Hat, Inc. + * + * Caja is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * Caja is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Authors: Bastien Nocera <[email protected]> + * + */ + +#include "config.h" + +#include <dbus/dbus-glib.h> +#include <dbus/dbus-glib-lowlevel.h> +#include <mateconf/mateconf-client.h> + +#include <string.h> + +#include "obexftp.h" +#include "user_share-common.h" +#include "user_share-private.h" + +static DBusGConnection *connection = NULL; +static DBusGProxy *manager_proxy = NULL; +static DBusGProxy *server_proxy = NULL; + +void +obexftp_up (void) +{ + GError *err = NULL; + MateConfClient *client; + char *public_dir, *server; + gboolean allow_write, require_pairing; + + client = mateconf_client_get_default (); + require_pairing = mateconf_client_get_bool (client, FILE_SHARING_BLUETOOTH_REQUIRE_PAIRING, NULL); + + server = NULL; + if (manager_proxy == NULL) { + manager_proxy = dbus_g_proxy_new_for_name (connection, + "org.openobex", + "/org/openobex", + "org.openobex.Manager"); + if (dbus_g_proxy_call (manager_proxy, "CreateBluetoothServer", + &err, G_TYPE_STRING, "00:00:00:00:00:00", G_TYPE_STRING, "ftp", G_TYPE_BOOLEAN, require_pairing, G_TYPE_INVALID, + DBUS_TYPE_G_OBJECT_PATH, &server, G_TYPE_INVALID) == FALSE) { + g_printerr ("Creating Bluetooth ObexFTP server failed: %s\n", + err->message); + g_error_free (err); + g_object_unref (manager_proxy); + manager_proxy = NULL; + return; + } + } + + public_dir = lookup_public_dir (); + allow_write = mateconf_client_get_bool (client, FILE_SHARING_BLUETOOTH_ALLOW_WRITE, NULL); + g_object_unref (client); + + if (server_proxy == NULL) { + server_proxy = dbus_g_proxy_new_for_name (connection, + "org.openobex", + server, + "org.openobex.Server"); + g_free (server); + } + if (dbus_g_proxy_call (server_proxy, "Start", &err, + G_TYPE_STRING, public_dir, G_TYPE_BOOLEAN, allow_write, G_TYPE_BOOLEAN, TRUE, G_TYPE_INVALID, + G_TYPE_INVALID) == FALSE) { + if (g_error_matches (err, DBUS_GERROR, DBUS_GERROR_REMOTE_EXCEPTION) != FALSE && + dbus_g_error_has_name (err, "org.openobex.Error.Started") != FALSE) { + g_error_free (err); + g_message ("already started, ignoring error"); + g_free (public_dir); + return; + } + g_printerr ("Starting Bluetooth ObexFTP server failed: %s\n", + err->message); + g_error_free (err); + g_free (public_dir); + g_object_unref (server_proxy); + server_proxy = NULL; + g_object_unref (manager_proxy); + manager_proxy = NULL; + return; + } + + g_free (public_dir); +} + +static void +obexftp_stop (gboolean stop_manager) +{ + GError *err = NULL; + + if (server_proxy == NULL) + return; + + if (dbus_g_proxy_call (server_proxy, "Close", &err, G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) { + if (err == NULL || + g_error_matches (err, DBUS_GERROR, DBUS_GERROR_REMOTE_EXCEPTION) == FALSE || + dbus_g_error_has_name (err, "org.openobex.Error.NotStarted") == FALSE) { + if (err != NULL) { + g_printerr ("Stopping Bluetooth ObexFTP server failed: %s\n", + err->message); + g_error_free (err); + } + return; + } + g_error_free (err); + } + + if (stop_manager != FALSE) { + g_object_unref (server_proxy); + server_proxy = NULL; + g_object_unref (manager_proxy); + manager_proxy = NULL; + } +} + +void +obexftp_down (void) +{ + obexftp_stop (TRUE); +} + +void +obexftp_restart (void) +{ + obexftp_stop (FALSE); + obexftp_up (); +} + +gboolean +obexftp_init (void) +{ + GError *err = NULL; + + connection = dbus_g_bus_get (DBUS_BUS_SESSION, &err); + if (connection == NULL) { + g_printerr ("Connecting to session bus failed: %s\n", + err->message); + g_error_free (err); + return FALSE; + } + + dbus_connection_set_exit_on_disconnect (dbus_g_connection_get_connection (connection), FALSE); + return TRUE; +} |