diff options
| author | Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> | 2013-05-13 15:35:27 (GMT) |
|---|---|---|
| committer | Bastien Nocera <hadess@hadess.net> | 2013-07-24 07:09:52 (GMT) |
| commit | 8ac9a4d917bd55f869bba86420ecc5938693905a (patch) | |
| tree | de0ce619d0a177c5b2a5de7116a72f1b35e8223c | |
| parent | 4625ad8608727557f747efbb57da9574877ed9af (diff) | |
| download | gnome-user-share-8ac9a4d917bd55f869bba86420ecc5938693905a.zip gnome-user-share-8ac9a4d917bd55f869bba86420ecc5938693905a.tar.xz | |
Port to BlueZ 5
https://bugzilla.gnome.org/show_bug.cgi?id=694347
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rw-r--r-- | src/obexpush.c | 578 | ||||
| -rw-r--r-- | src/obexpush.h | 42 | ||||
| -rw-r--r-- | src/user_share.c | 125 |
4 files changed, 325 insertions, 422 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index d49a70c..b58522e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -36,8 +36,6 @@ gnome_user_share_SOURCES = \ user_share-private.c \ http.c \ http.h \ - obexftp.c \ - obexftp.h \ obexpush.c \ obexpush.h \ $(MARSHALFILES) diff --git a/src/obexpush.c b/src/obexpush.c index 5c77664..91adfdf 100644 --- a/src/obexpush.c +++ b/src/obexpush.c @@ -2,6 +2,7 @@ /* * Copyright (C) 2004-2008 Red Hat, Inc. + * Copyright (C) 2013 Intel Corporation. * * Nautilus is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -18,6 +19,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Authors: Bastien Nocera <hadess@hadess.net> + * Authors: Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> * */ @@ -26,25 +28,44 @@ #include <glib.h> #include <glib/gi18n.h> #include <gio/gio.h> -#include <gdk/gdk.h> #include <gtk/gtk.h> #include <libnotify/notify.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> #include <canberra-gtk.h> -#include <string.h> - -#include "marshal.h" -#include "obexpush.h" #include "user_share.h" #include "user_share-private.h" -#define DBUS_TYPE_G_STRING_VARIANT_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING)) +#include "obexpush.h" + +#define MANAGER_SERVICE "org.bluez.obex" +#define MANAGER_IFACE "org.bluez.obex.AgentManager1" +#define MANAGER_PATH "/org/bluez/obex" + +#define AGENT_PATH "/org/gnome/share/agent" +#define AGENT_IFACE "org.bluez.obex.Agent1" + +#define TRANSFER_INTERFACE "org.bluez.obex.Transfer1" -static DBusGConnection *connection = NULL; -static DBusGProxy *manager_proxy = NULL; -static DBusGProxy *server_proxy = NULL; +static GDBusNodeInfo *introspection_data = NULL; + +static const gchar introspection_xml[] = +"<node name='"AGENT_PATH"'>" +" <interface name='"AGENT_IFACE"'>" +" <method name='Release'>" +" </method>" +" <method name='Cancel'>" +" </method>" +" <method name='AuthorizePush'>" +" <arg name='transfer' type='o' />" +" <arg name='path' type='s' direction='out' />" +" </method>" +" </interface>" +"</node>"; + +G_DEFINE_TYPE(ObexAgent, obex_agent, G_TYPE_OBJECT) + +static ObexAgent *agent; +static GDBusProxy *manager; static AcceptSetting accept_setting = -1; static gboolean show_notifications = FALSE; @@ -179,379 +200,332 @@ show_icon (void) num_notifications++; } -static gboolean -device_is_authorised (const char *bdaddr) +static void +obex_agent_release (GError **error) { - DBusGConnection *connection; - DBusGProxy *manager; - GError *error = NULL; - GPtrArray *adapters; - gboolean retval = FALSE; - guint i; - - connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL); - if (connection == NULL) - return FALSE; - - manager = dbus_g_proxy_new_for_name (connection, "org.bluez", - "/", "org.bluez.Manager"); - if (manager == NULL) { - dbus_g_connection_unref (connection); - return FALSE; - } +} + +static void +obex_agent_cancel (GError **error) +{ +} - if (dbus_g_proxy_call (manager, "ListAdapters", &error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &adapters, G_TYPE_INVALID) == FALSE) { - g_object_unref (manager); - dbus_g_connection_unref (connection); - return FALSE; +static void +transfer_property_changed (GDBusProxy *transfer, + GVariant *changed_properties, + GStrv invalidated_properties, + gpointer user_data) +{ + GVariantIter iter; + const gchar *key; + GVariant *value; + + g_variant_iter_init (&iter, changed_properties); + while (g_variant_iter_next (&iter, "{&sv}", &key, &value)) { + if (g_str_equal (key, "Status")) { + const gchar *status, *filename; + + status = g_variant_get_string (value, NULL); + filename = g_object_get_data (G_OBJECT (transfer), "filename"); + + if (g_str_equal (status, "complete")) { + if (show_notifications) { + g_debug ("transfer completed, showing a notification"); + show_notification (filename); + } else { + hide_statusicon (); + } + } + } + g_variant_unref (value); } +} - for (i = 0; i < adapters->len; i++) { - DBusGProxy *adapter, *device; - char *device_path; - GHashTable *props; +static void +obex_agent_authorize_push (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GDBusProxy *transfer = g_dbus_proxy_new_for_bus_finish (res, NULL); + GDBusMethodInvocation *invocation = user_data; + GVariant *variant = g_dbus_proxy_get_cached_property (transfer, "Name"); + const gchar *filename = g_variant_get_string (variant, NULL); + gboolean authorize = FALSE; + + g_debug ("AuthorizePush received"); + + switch (accept_setting) { + case ACCEPT_ALWAYS: + authorize = TRUE; + break; + case ACCEPT_BONDED: + g_warning ("'Bonded' authorization method not implemented"); + break; + case ACCEPT_ASK: + g_warning ("'Ask' authorization method not implemented"); + break; + default: + g_warn_if_reached (); + } - g_debug ("checking adapter %s", (gchar *) g_ptr_array_index (adapters, i)); + if (authorize) { + gchar *download_dir = lookup_download_dir (); + gchar *file = g_build_filename (download_dir, filename, NULL); + g_free (download_dir); - adapter = dbus_g_proxy_new_for_name (connection, "org.bluez", - g_ptr_array_index (adapters, i), "org.bluez.Adapter"); + g_signal_connect (transfer, "g-properties-changed", + G_CALLBACK (transfer_property_changed), NULL); - if (dbus_g_proxy_call (adapter, "FindDevice", NULL, - G_TYPE_STRING, bdaddr, G_TYPE_INVALID, - DBUS_TYPE_G_OBJECT_PATH, &device_path, G_TYPE_INVALID) == FALSE) - { - g_object_unref (adapter); - continue; - } + g_object_set_data_full (G_OBJECT (transfer), "filename", file, g_free); - device = dbus_g_proxy_new_for_name (connection, "org.bluez", device_path, "org.bluez.Device"); - - if (dbus_g_proxy_call (device, "GetProperties", NULL, - G_TYPE_INVALID, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), - &props, G_TYPE_INVALID) != FALSE) - { - GValue *value; - gboolean bonded; - - value = g_hash_table_lookup (props, "Paired"); - bonded = g_value_get_boolean (value); - g_message ("%s is %s", bdaddr, bonded ? "bonded" : "not bonded"); - - if (bonded) { - g_hash_table_destroy (props); - g_object_unref (device); - g_object_unref (adapter); - retval = TRUE; - break; - } - } - g_object_unref(adapter); - } + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", file)); - g_ptr_array_free (adapters, TRUE); + show_icon (); - g_object_unref(manager); - dbus_g_connection_unref(connection); + g_debug ("Incoming transfer authorized: %s", file); + } else { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.bluez.obex.Error.Rejected", "Not Authorized"); + g_debug ("Incoming transfer rejected: %s", filename); + } - return retval; + g_variant_unref (variant); } static void -transfer_started_cb (DBusGProxy *session, - const char *filename, - const char *local_path, - guint64 size, - gpointer user_data) +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) { - GHashTable *dict; - DBusGProxy *server = (DBusGProxy *) user_data; - GError *error = NULL; - gboolean authorise; + if (g_str_equal (method_name, "Cancel")) { + obex_agent_cancel (NULL); + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_str_equal (method_name, "Release")) { + obex_agent_release (NULL); + g_dbus_method_invocation_return_value (invocation, NULL); + } else if (g_str_equal (method_name, "AuthorizePush")) { + const gchar *transfer; + + g_variant_get (parameters, "(&o)", &transfer); + + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + MANAGER_SERVICE, + transfer, + TRANSFER_INTERFACE, + NULL, + obex_agent_authorize_push, + invocation); + } else { + g_warning ("Unknown method name or unknown parameters: %s", + method_name); + } +} - g_message ("transfer started on %s", local_path); - g_object_set_data_full (G_OBJECT (session), "filename", g_strdup (local_path), (GDestroyNotify) g_free); +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + NULL, + NULL +}; - show_icon (); +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + guint id; - /* First transfer of the session */ - if (g_object_get_data (G_OBJECT (session), "bdaddr") == NULL) { - const char *bdaddr; + /* parse introspection data */ + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, + NULL); - if (dbus_g_proxy_call (server, "GetServerSessionInfo", &error, - DBUS_TYPE_G_OBJECT_PATH, dbus_g_proxy_get_path (session), G_TYPE_INVALID, - DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &dict, G_TYPE_INVALID) == FALSE) { - g_printerr ("Getting Server session info failed: %s\n", - error->message); - g_error_free (error); - return; - } + id = g_dbus_connection_register_object (connection, + AGENT_PATH, + introspection_data->interfaces[0], + &interface_vtable, + NULL, /* user_data */ + NULL, /* user_data_free_func */ + NULL); /* GError** */ - bdaddr = g_hash_table_lookup (dict, "BluetoothAddress"); - g_message ("transfer started for device %s", bdaddr); + g_dbus_node_info_unref (introspection_data); - g_object_set_data_full (G_OBJECT (session), "bdaddr", g_strdup (bdaddr), (GDestroyNotify) g_free); - /* Initial accept method is undefined, we do that lower down */ - g_object_set_data (G_OBJECT (session), "accept-method", GINT_TO_POINTER (-1)); - g_hash_table_destroy (dict); - } + g_assert (id > 0); +} - /* Accept method changed */ - if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (session), "accept-method")) != accept_setting) { - const char *bdaddr; - - bdaddr = g_object_get_data (G_OBJECT (session), "bdaddr"); - - if (bdaddr == NULL) { - g_warning ("Couldn't get the Bluetooth address for the device, rejecting the transfer"); - authorise = FALSE; - } else if (accept_setting == ACCEPT_ALWAYS) { - authorise = TRUE; - } else if (accept_setting == ACCEPT_BONDED) { - authorise = device_is_authorised (bdaddr); - } else { - //FIXME implement - g_warning ("\"Ask\" authorisation method not implemented"); - authorise = FALSE; - } - g_object_set_data (G_OBJECT (session), "authorise", GINT_TO_POINTER (authorise)); - } +static void +on_agent_registered (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GError *error = NULL; + GVariant *v; - g_message ("accept_setting: %d", accept_setting); + v = g_dbus_proxy_call_finish (manager, res, &error); - authorise = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (session), "authorise")); - if (authorise != FALSE) { - if (dbus_g_proxy_call (session, "Accept", &error, G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) { - g_printerr ("Failed to accept file transfer: %s\n", error->message); - g_error_free (error); - return; - } - g_message ("authorised transfer"); - } else { - if (dbus_g_proxy_call (session, "Reject", &error, G_TYPE_INVALID, G_TYPE_INVALID) == FALSE) { - g_printerr ("Failed to reject file transfer: %s\n", error->message); - g_error_free (error); - return; - } - g_message ("rejected transfer"); - g_object_set_data (G_OBJECT (session), "filename", NULL); + if (error) { + g_warning ("error: %s", error->message); + g_error_free (error); + return; } + + g_variant_unref (v); } static void -transfer_completed_cb (DBusGProxy *session, +on_agent_unregistered (GObject *source_object, + GAsyncResult *res, gpointer user_data) { - GSettings *settings; - gboolean display_notify; - const char *filename; - - filename = (const char *) g_object_get_data (G_OBJECT (session), "filename"); + GError *error = NULL; + GVariant *v; - g_message ("file finish transfer: %s", filename); + v = g_dbus_proxy_call_finish (manager, res, &error); - if (filename == NULL) + if (error) { + g_warning ("error: %s", error->message); + g_error_free (error); return; + } - settings = g_settings_new (GNOME_USER_SHARE_SCHEMAS); - display_notify = g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_OBEXPUSH_NOTIFY); - g_object_unref (settings); + g_variant_unref (v); +} - if (display_notify) { - show_notification (filename); - } else { - hide_statusicon (); +static void +on_proxy_acquired (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GError *error = NULL; + + manager = g_dbus_proxy_new_for_bus_finish (res, &error); + + if (!manager) { + g_warning ("error: %s", error->message); + g_error_free (error); + return; } - g_object_set_data (G_OBJECT (session), "filename", NULL); + + g_dbus_proxy_call (manager, + "RegisterAgent", + g_variant_new ("(o)", AGENT_PATH), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + on_agent_registered, + NULL); } static void -cancelled_cb (DBusGProxy *session, - gpointer user_data) +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) { - //FIXME implement properly, we never actually finished the transfer - g_message ("transfered was cancelled by the sender"); - transfer_completed_cb (session, user_data); - hide_statusicon (); } static void -error_occurred_cb (DBusGProxy *session, - const char *error_name, - const char *error_message, - gpointer user_data) +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) { - //FIXME implement properly - g_message ("transfer error occurred: %s", error_message); - transfer_completed_cb (session, user_data); } static void -session_created_cb (DBusGProxy *server, const char *session_path, gpointer user_data) +obex_agent_init (ObexAgent *self) { - DBusGProxy *session; - - session = dbus_g_proxy_new_for_name (connection, - "org.openobex", - session_path, - "org.openobex.ServerSession"); - - dbus_g_proxy_add_signal (session, "TransferStarted", - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(session, "TransferStarted", - G_CALLBACK (transfer_started_cb), server, NULL); - dbus_g_proxy_add_signal (session, "TransferCompleted", - G_TYPE_INVALID, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(session, "TransferCompleted", - G_CALLBACK (transfer_completed_cb), server, NULL); - dbus_g_proxy_add_signal (session, "Cancelled", - G_TYPE_INVALID, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(session, "Cancelled", - G_CALLBACK (cancelled_cb), server, NULL); - dbus_g_proxy_add_signal (session, "ErrorOccurred", - G_TYPE_INVALID, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(session, "ErrorOccurred", - G_CALLBACK (error_occurred_cb), server, NULL); } -void -obexpush_up (void) +static void +obex_agent_dispose (GObject *obj) { - GError *err = NULL; - char *download_dir, *server; - - 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, "opp", G_TYPE_BOOLEAN, FALSE, G_TYPE_INVALID, - DBUS_TYPE_G_OBJECT_PATH, &server, G_TYPE_INVALID) == FALSE) { - g_printerr ("Creating Bluetooth ObexPush server failed: %s\n", - err->message); - g_error_free (err); - g_object_unref (manager_proxy); - manager_proxy = NULL; - return; - } - } - - download_dir = lookup_download_dir (); - - if (server_proxy == NULL) { - server_proxy = dbus_g_proxy_new_for_name (connection, - "org.openobex", - server, - "org.openobex.Server"); - g_free (server); - - dbus_g_proxy_add_signal (server_proxy, "SessionCreated", - DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(server_proxy, "SessionCreated", - G_CALLBACK (session_created_cb), NULL, NULL); - } + ObexAgent *self = OBEX_AGENT (obj); - if (dbus_g_proxy_call (server_proxy, "Start", &err, - G_TYPE_STRING, download_dir, G_TYPE_BOOLEAN, TRUE, G_TYPE_BOOLEAN, FALSE, 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 (download_dir); - return; - } - g_printerr ("Starting Bluetooth ObexPush server failed: %s\n", - err->message); - g_error_free (err); - g_free (download_dir); - g_object_unref (server_proxy); - server_proxy = NULL; - g_object_unref (manager_proxy); - manager_proxy = NULL; - return; - } + g_bus_unown_name (self->owner_id); - g_free (download_dir); + G_OBJECT_CLASS (obex_agent_parent_class)->dispose (obj); } static void -obexpush_stop (gboolean stop_manager) +obex_agent_class_init (ObexAgentClass *klass) { - GError *err = NULL; + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - if (server_proxy == NULL) - return; + gobject_class->dispose = obex_agent_dispose; +} - if (dbus_g_proxy_call (server_proxy, "Close", &err, 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.NotStarted") == FALSE) { - g_printerr ("Stopping Bluetooth ObexPush server failed: %s\n", - err->message); - g_error_free (err); - return; - } - g_error_free (err); - } +static ObexAgent * +obex_agent_new (void) +{ + ObexAgent *self = NULL; - if (stop_manager != FALSE) { - g_object_unref (server_proxy); - server_proxy = NULL; - g_object_unref (manager_proxy); - manager_proxy = NULL; - } + self = (ObexAgent *) g_object_new (OBEX_AGENT_TYPE, NULL); - //FIXME stop all the notifications -} + self->owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + AGENT_IFACE, + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); -void -obexpush_down (void) -{ - obexpush_stop (TRUE); + return self; } void -obexpush_restart (void) +obex_agent_down (void) { - obexpush_stop (FALSE); - obexpush_up (); + g_dbus_proxy_call (manager, + "UnregisterAgent", + g_variant_new ("(o)", AGENT_PATH), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + on_agent_unregistered, + NULL); + + g_clear_object (&manager); + g_clear_object (&agent); } gboolean -obexpush_init (void) +obex_agent_up (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; + if (agent == NULL) { + agent = obex_agent_new (); + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + MANAGER_SERVICE, + MANAGER_PATH, + MANAGER_IFACE, + NULL, + on_proxy_acquired, + NULL); } - dbus_g_object_register_marshaller (marshal_VOID__STRING_STRING_UINT64, - G_TYPE_NONE, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_INVALID); - if (!notify_init("gnome-user-share")) { - g_warning("Unable to initialize the notification system\n"); - } - - dbus_connection_set_exit_on_disconnect (dbus_g_connection_get_connection (connection), FALSE); + g_warning("Unable to initialize the notification system"); + } - return TRUE; + return agent != NULL; } void -obexpush_set_accept_files_policy (AcceptSetting setting) +obex_agent_set_accept_files_policy (AcceptSetting setting) { accept_setting = setting; } void -obexpush_set_notify (gboolean enabled) +obex_agent_set_notify (gboolean enabled) { show_notifications = enabled; } diff --git a/src/obexpush.h b/src/obexpush.h index abc786e..ddf944e 100644 --- a/src/obexpush.h +++ b/src/obexpush.h @@ -2,6 +2,7 @@ /* * Copyright (C) 2004-2008 Red Hat, Inc. + * Copyright (C) 2013 Intel Corporation. * * Nautilus is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -18,15 +19,42 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Authors: Bastien Nocera <hadess@hadess.net> + * Authors: Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> * */ -#include <glib.h> +#ifndef __OBEX_AGENT_H__ +#define __OBEX_AGENT_H__ + +#include <glib-object.h> + #include "user_share-private.h" -void obexpush_up (void); -void obexpush_down (void); -void obexpush_restart (void); -gboolean obexpush_init (void); -void obexpush_set_accept_files_policy (AcceptSetting accept_setting); -void obexpush_set_notify (gboolean enabled); +G_BEGIN_DECLS + +typedef struct _ObexAgent { + GObject parent; + guint owner_id; +} ObexAgent; + +typedef struct _ObexAgentClass { + GObjectClass parent; +} ObexAgentClass; + +GType obex_agent_get_type(); + +#define OBEX_AGENT_TYPE (obex_agent_get_type ()) +#define OBEX_AGENT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), OBEX_AGENT_TYPE, ObexAgent)) +#define OBEX_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), OBEX_AGENT_TYPE, ObexAgentClass)) +#define IS_OBEX_AGENT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), OBEX_AGENT_TYPE)) +#define IS_OBEX_AGENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), OBEX_AGENT_TYPE)) +#define OBEX_AGENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), OBEX_AGENT_TYPE, ObexAgentClass)) + +gboolean obex_agent_up (void); +void obex_agent_down (void); +void obex_agent_set_accept_files_policy (AcceptSetting setting); +void obex_agent_set_notify (gboolean enabled); + +G_END_DECLS + +#endif diff --git a/src/user_share.c b/src/user_share.c index add1a36..2bd79c9 100644 --- a/src/user_share.c +++ b/src/user_share.c @@ -35,7 +35,6 @@ #include "user_share-private.h" #include "user_share-common.h" #include "http.h" -#include "obexftp.h" #include "obexpush.h" #include <stdarg.h> @@ -56,31 +55,23 @@ static guint disabled_timeout_tag = 0; static GDBusProxy *session_proxy = NULL; static gboolean has_console = TRUE; -static BluetoothClient *client = NULL; -static gboolean bluetoothd_enabled = FALSE; - -#define OBEX_ENABLED (bluetoothd_enabled && has_console) +#define OBEX_ENABLED (has_console) static void obex_services_start (void) { - if (bluetoothd_enabled == FALSE || - has_console == FALSE) - return; + if (has_console == FALSE) + return; if (g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_OBEXPUSH_ENABLED) == TRUE) { - obexpush_up (); - } - if (g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_ENABLED) == TRUE) { - obexftp_up (); + obex_agent_up (); } } static void obex_services_shutdown (void) { - obexpush_down (); - obexftp_down (); + obex_agent_down (); } static void @@ -146,44 +137,6 @@ session_init (void) } static void -default_adapter_changed (GObject *gobject, - GParamSpec *pspec, - gpointer user_data) -{ - char *adapter; - gboolean adapter_powered; - - g_object_get (G_OBJECT (client), - "default-adapter", &adapter, - "default-adapter-powered", &adapter_powered, - NULL); - if (adapter != NULL && *adapter != '\0') { - bluetoothd_enabled = adapter_powered; - } else { - bluetoothd_enabled = FALSE; - } - - /* Were we called as init, or as a callback */ - if (gobject != NULL) { - if (bluetoothd_enabled != FALSE) - obex_services_start (); - else - obex_services_shutdown (); - } -} - -static void -bluez_init (void) -{ - client = bluetooth_client_new (); - default_adapter_changed (NULL, NULL, NULL); - g_signal_connect (G_OBJECT (client), "notify::default-adapter", - G_CALLBACK (default_adapter_changed), NULL); - g_signal_connect (G_OBJECT (client), "notify::default-adapter-powered", - G_CALLBACK (default_adapter_changed), NULL); -} - -static void migrate_old_configuration (void) { const char *old_config_dir; @@ -213,8 +166,7 @@ disabled_timeout_callback (void) { http_down (); - if (g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_ENABLED) == FALSE && - g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_OBEXPUSH_ENABLED) == FALSE) + if (g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_OBEXPUSH_ENABLED) == FALSE) _exit (0); return FALSE; } @@ -244,50 +196,16 @@ file_sharing_enabled_changed (void) } static void -file_sharing_bluetooth_allow_write_changed (void) -{ - if (g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_ENABLED) != FALSE) - obexftp_restart (); -} - -static void -file_sharing_bluetooth_require_pairing_changed (void) -{ - if (g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_ENABLED) != FALSE) { - /* We need to fully reset the session, - * otherwise the new setting isn't taken into account */ - obexftp_down (); - obexftp_up (); - } -} - -static void -file_sharing_bluetooth_enabled_changed (void) -{ - if (g_settings_get_boolean (settings, - FILE_SHARING_BLUETOOTH_ENABLED) == FALSE) { - obexftp_down (); - if (g_settings_get_boolean (settings, FILE_SHARING_ENABLED) == FALSE && - g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_OBEXPUSH_ENABLED) == FALSE) { - _exit (0); - } - } else if (OBEX_ENABLED) { - obexftp_up (); - } -} - -static void file_sharing_bluetooth_obexpush_enabled_changed (void) { if (g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_OBEXPUSH_ENABLED) == FALSE) { - obexpush_down (); - if (g_settings_get_boolean (settings, FILE_SHARING_ENABLED) == FALSE && - g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_ENABLED) == FALSE) { + obex_agent_down (); + if (g_settings_get_boolean (settings, FILE_SHARING_ENABLED) == FALSE) { _exit (0); } } else if (OBEX_ENABLED) { - obexpush_up (); + obex_agent_up (); } } @@ -301,13 +219,13 @@ file_sharing_bluetooth_obexpush_accept_files_changed (void) setting = accept_setting_from_string (str); g_free (str); - obexpush_set_accept_files_policy (setting); + obex_agent_set_accept_files_policy (setting); } static void file_sharing_bluetooth_obexpush_notify_changed (void) { - obexpush_set_notify (g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_OBEXPUSH_NOTIFY)); + obex_agent_set_notify (g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_OBEXPUSH_NOTIFY)); } static void @@ -321,15 +239,6 @@ setttings_changed (GSettings *settings, else if (g_strcmp0 (FILE_SHARING_REQUIRE_PASSWORD, path) == 0) require_password_changed (); - else if (g_strcmp0 (FILE_SHARING_BLUETOOTH_ENABLED, path) == 0) - file_sharing_bluetooth_enabled_changed (); - - else if (g_strcmp0 (FILE_SHARING_BLUETOOTH_ALLOW_WRITE, path) == 0) - file_sharing_bluetooth_allow_write_changed (); - - else if (g_strcmp0 (FILE_SHARING_BLUETOOTH_REQUIRE_PAIRING, path) == 0) - file_sharing_bluetooth_require_pairing_changed (); - else if (g_strcmp0 (FILE_SHARING_BLUETOOTH_OBEXPUSH_ENABLED, path) == 0) file_sharing_bluetooth_obexpush_enabled_changed (); @@ -344,8 +253,7 @@ static void cleanup_handler (int sig) { http_down (); - obexftp_down (); - obexpush_down (); + obex_agent_down (); _exit (2); } @@ -353,7 +261,7 @@ static int x_io_error_handler (Display *xdisplay) { http_down (); - obexftp_down (); + obex_agent_down (); _exit (2); } @@ -410,7 +318,6 @@ main (int argc, char **argv) settings = g_settings_new (GNOME_USER_SHARE_SCHEMAS); if (g_settings_get_boolean (settings, FILE_SHARING_ENABLED) == FALSE && - g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_ENABLED) == FALSE && g_settings_get_boolean (settings, FILE_SHARING_BLUETOOTH_OBEXPUSH_ENABLED) == FALSE) return 1; @@ -419,19 +326,15 @@ main (int argc, char **argv) if (http_init () == FALSE) return 1; - if (obexftp_init () == FALSE) - return 1; - if (obexpush_init () == FALSE) + if (obex_agent_up () == FALSE) return 1; g_signal_connect (settings, "changed", G_CALLBACK(setttings_changed), NULL); - bluez_init (); session_init (); /* Initial setting */ file_sharing_enabled_changed (); - file_sharing_bluetooth_enabled_changed (); file_sharing_bluetooth_obexpush_accept_files_changed (); file_sharing_bluetooth_obexpush_notify_changed (); file_sharing_bluetooth_obexpush_enabled_changed (); |
