diff options
author | Claudio Saavedra <csaavedra@igalia.com> | 2011-06-25 03:04:04 +0800 |
---|---|---|
committer | Claudio Saavedra <csaavedra@igalia.com> | 2011-06-27 21:29:46 +0800 |
commit | d40bac577b628a3db8ef90f8a862b80e8cb729c2 (patch) | |
tree | a5c838f14966c1ba463667953a47035b86237774 /src/ephy-dbus.c | |
parent | 795fe5c4213809c8d776843fab6dcc31848e8871 (diff) | |
download | gsoc2013-epiphany-d40bac577b628a3db8ef90f8a862b80e8cb729c2.tar gsoc2013-epiphany-d40bac577b628a3db8ef90f8a862b80e8cb729c2.tar.gz gsoc2013-epiphany-d40bac577b628a3db8ef90f8a862b80e8cb729c2.tar.bz2 gsoc2013-epiphany-d40bac577b628a3db8ef90f8a862b80e8cb729c2.tar.lz gsoc2013-epiphany-d40bac577b628a3db8ef90f8a862b80e8cb729c2.tar.xz gsoc2013-epiphany-d40bac577b628a3db8ef90f8a862b80e8cb729c2.tar.zst gsoc2013-epiphany-d40bac577b628a3db8ef90f8a862b80e8cb729c2.zip |
Drop all dbus-glib code
We still need to provide equivalent ways to activate epiphany, but we
will use GActions instead.
https://bugzilla.gnome.org/show_bug.cgi?id=622903
Diffstat (limited to 'src/ephy-dbus.c')
-rw-r--r-- | src/ephy-dbus.c | 548 |
1 files changed, 0 insertions, 548 deletions
diff --git a/src/ephy-dbus.c b/src/ephy-dbus.c deleted file mode 100644 index 5fe4f8abf..000000000 --- a/src/ephy-dbus.c +++ /dev/null @@ -1,548 +0,0 @@ -/* - * Copyright © 2004, 2005 Jean-François Rameau - * Copyright © 2006 Christian Persch - * - * This program 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, or (at your option) - * any later version. - * - * This program 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "config.h" - -#include "ephy-dbus.h" -#include "ephy-type-builtins.h" -#include "ephy-debug.h" -#include "ephy-activation.h" -#include "ephy-dbus-server-bindings.h" - -#include <string.h> -#include <dbus/dbus-glib-bindings.h> - -/* dbus 0.6 API change */ -#ifndef DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT -#define DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT 0 -#endif - -/* dbus < 0.6 compat */ -#ifndef DBUS_NAME_FLAG_DO_NOT_QUEUE -#define DBUS_NAME_FLAG_DO_NOT_QUEUE 0 -#endif - -/* Epiphany's DBUS ids */ -#define DBUS_EPHY_SERVICE "org.gnome.Epiphany" -#define DBUS_EPHY_PATH "/org/gnome/Epiphany" -#define DBUS_EPHY_INTERFACE "org.gnome.Epiphany" - -#define RECONNECT_DELAY 3 /* seconds */ - -#define EPHY_DBUS_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_DBUS, EphyDbusPrivate)) - -struct _EphyDbusPrivate -{ - DBusGConnection *session_bus; - DBusGConnection *system_bus; - guint session_reconnect_timeout_id; - guint system_reconnect_timeout_id; - guint is_session_service_owner : 1; - guint register_name : 1; -}; - -enum -{ - CONNECTED, - DISCONNECTED, - LAST_SIGNAL -}; - -enum -{ - PROP_0, - PROP_CLAIM_NAME -}; - -static EphyDbus *ephy_dbus_instance; - -static guint signals[LAST_SIGNAL]; -GQuark ephy_dbus_error_quark; - -/* Filter signals form session bus */ -static DBusHandlerResult session_filter_func (DBusConnection *connection, - DBusMessage *message, - void *user_data); -/* Filter signals from system bus */ -static DBusHandlerResult system_filter_func (DBusConnection *connection, - DBusMessage *message, - void *user_data); - -/* Both connect to their respective bus */ -static gboolean ephy_dbus_connect_to_session_bus (EphyDbus*, GError**); -static gboolean ephy_dbus_connect_to_system_bus (EphyDbus*, GError**); - -/* implementation of the DBUS helpers */ - -static gboolean -ephy_dbus_connect_to_session_bus_cb (gpointer user_data) -{ - EphyDbus *dbus = EPHY_DBUS (user_data); - - if (!ephy_dbus_connect_to_session_bus (dbus, NULL)) - { - /* try again */ - return TRUE; - } - - dbus->priv->session_reconnect_timeout_id = 0; - - /* we're done */ - return FALSE; -} - -static gboolean -ephy_dbus_connect_to_system_bus_cb (gpointer user_data) -{ - EphyDbus *dbus = EPHY_DBUS (user_data); - - if (!ephy_dbus_connect_to_system_bus (dbus, NULL)) - { - /* try again */ - return TRUE; - } - - dbus->priv->system_reconnect_timeout_id = 0; - - /* we're done */ - return FALSE; -} - -static DBusHandlerResult -session_filter_func (DBusConnection *connection, - DBusMessage *message, - void *user_data) -{ - EphyDbus *ephy_dbus = EPHY_DBUS (user_data); - EphyDbusPrivate *priv = ephy_dbus->priv; - - if (dbus_message_is_signal (message, - DBUS_INTERFACE_LOCAL, - "Disconnected")) - { - LOG ("EphyDbus disconnected from session bus"); - - dbus_g_connection_unref (priv->session_bus); - priv->session_bus = NULL; - - g_signal_emit (ephy_dbus, signals[DISCONNECTED], 0, EPHY_DBUS_SESSION); - - /* try to reconnect later ... */ - priv->session_reconnect_timeout_id = - g_timeout_add_seconds (RECONNECT_DELAY, - (GSourceFunc) ephy_dbus_connect_to_session_bus_cb, - ephy_dbus); - - return DBUS_HANDLER_RESULT_HANDLED; - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -static DBusHandlerResult -system_filter_func (DBusConnection *connection, - DBusMessage *message, - void *user_data) -{ - EphyDbus *ephy_dbus = EPHY_DBUS (user_data); - EphyDbusPrivate *priv = ephy_dbus->priv; - - LOG ("EphyDbus filtering message from system bus"); - - if (dbus_message_is_signal (message, - DBUS_INTERFACE_LOCAL, - "Disconnected")) - { - LOG ("EphyDbus disconnected from system bus"); - - dbus_g_connection_unref (priv->system_bus); - priv->system_bus = NULL; - - g_signal_emit (ephy_dbus, signals[DISCONNECTED], 0, EPHY_DBUS_SYSTEM); - - /* try to reconnect later ... */ - priv->system_reconnect_timeout_id = - g_timeout_add_seconds (RECONNECT_DELAY, - (GSourceFunc) ephy_dbus_connect_to_system_bus_cb, - ephy_dbus); - - return DBUS_HANDLER_RESULT_HANDLED; - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -static gboolean -ephy_dbus_connect_to_system_bus (EphyDbus *ephy_dbus, - GError **error) -{ - EphyDbusPrivate *priv = ephy_dbus->priv; - - LOG ("EphyDbus connecting to system DBUS"); - - priv->system_bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, error); - if (priv->system_bus == NULL) - { - g_warning ("Unable to connect to system bus: %s", error ? (*error)->message : ""); - return FALSE; - } - - if (dbus_g_connection_get_connection (priv->system_bus) == NULL) - { - g_warning ("DBus connection is null"); - g_set_error (error, - EPHY_DBUS_ERROR_QUARK, - 0, - "DBus connection is NULL"); - return FALSE; - } - - dbus_connection_set_exit_on_disconnect - (dbus_g_connection_get_connection (priv->system_bus), - FALSE); - - dbus_connection_add_filter - (dbus_g_connection_get_connection (priv->system_bus), - system_filter_func, ephy_dbus, NULL); - - g_signal_emit (ephy_dbus, signals[CONNECTED], 0, EPHY_DBUS_SYSTEM); - - return TRUE; -} - -static gboolean -ephy_dbus_connect_to_session_bus (EphyDbus *ephy_dbus, - GError **error) -{ - EphyDbusPrivate *priv = ephy_dbus->priv; - DBusGProxy *proxy; - guint request_ret; - - LOG ("EphyDbus connecting to session DBUS"); - - /* Init the DBus connection */ - priv->session_bus = dbus_g_bus_get (DBUS_BUS_SESSION, error); - if (priv->session_bus == NULL) - { - g_warning("Unable to connect to session bus: %s", error && *error ? (*error)->message : ""); - return FALSE; - } - - dbus_connection_set_exit_on_disconnect - (dbus_g_connection_get_connection (priv->session_bus), - FALSE); - - dbus_connection_add_filter - (dbus_g_connection_get_connection (priv->session_bus), - session_filter_func, ephy_dbus, NULL); - - if (priv->register_name == FALSE) return TRUE; - - dbus_g_object_type_install_info (EPHY_TYPE_DBUS, - &dbus_glib_ephy_activation_object_info); - - /* Register DBUS path */ - dbus_g_connection_register_g_object (priv->session_bus, - DBUS_EPHY_PATH, - G_OBJECT (ephy_dbus)); - - /* Register the service name, the constant here are defined in dbus-glib-bindings.h */ - proxy = dbus_g_proxy_new_for_name (priv->session_bus, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); - - if (!org_freedesktop_DBus_request_name (proxy, - DBUS_EPHY_SERVICE, - DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT | - DBUS_NAME_FLAG_DO_NOT_QUEUE, - &request_ret, error)) - { - /* We have a BIG problem! */ - g_warning ("RequestName failed: %s\n", error ? (*error)->message : ""); - return FALSE; - } - - if (request_ret == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER || - request_ret == DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER) - { - priv->is_session_service_owner = TRUE; - } - else if (request_ret == DBUS_REQUEST_NAME_REPLY_EXISTS || - request_ret == DBUS_REQUEST_NAME_REPLY_IN_QUEUE) - { - priv->is_session_service_owner = FALSE; - } - - LOG ("Instance is %ssession bus owner.", priv->is_session_service_owner ? "" : "NOT "); - - g_object_unref (proxy); - - return TRUE; -} - -/* Public methods */ - -static void -ephy_dbus_shutdown (EphyDbus *dbus) -{ - EphyDbusPrivate *priv = dbus->priv; - - LOG ("EphyDbus shutdown"); - - if (priv->session_reconnect_timeout_id != 0) - { - g_source_remove (priv->session_reconnect_timeout_id); - priv->session_reconnect_timeout_id = 0; - } - - if (priv->system_reconnect_timeout_id != 0) - { - g_source_remove (priv->system_reconnect_timeout_id); - priv->system_reconnect_timeout_id = 0; - } - - if (priv->session_bus) - { - dbus_connection_remove_filter - (dbus_g_connection_get_connection (priv->session_bus), - session_filter_func, dbus); - dbus_g_connection_unref (priv->session_bus); - priv->session_bus = NULL; - } - - if (priv->system_bus) - { - dbus_connection_remove_filter - (dbus_g_connection_get_connection (priv->system_bus), - system_filter_func, dbus); - dbus_g_connection_unref (priv->system_bus); - priv->system_bus = NULL; - } -} - -/* Class implementation */ - -G_DEFINE_TYPE (EphyDbus, ephy_dbus, G_TYPE_OBJECT) - -static void -ephy_dbus_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - /* no readable properties */ - g_return_if_reached (); -} - -static void -ephy_dbus_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EphyDbus *dbus = EPHY_DBUS (object); - EphyDbusPrivate *priv = dbus->priv; - - switch (prop_id) - { - case PROP_CLAIM_NAME: - priv->register_name = g_value_get_boolean (value); - break; - } -} - -static void -ephy_dbus_finalize (GObject *object) -{ - EphyDbus *dbus = EPHY_DBUS (object); - - /* Have to do this after the object's weak ref notifiers have - * been called, see https://bugs.freedesktop.org/show_bug.cgi?id=5688 - */ - ephy_dbus_shutdown (dbus); - - LOG ("EphyDbus finalised"); - - G_OBJECT_CLASS (ephy_dbus_parent_class)->finalize (object); -} - -static void -ephy_dbus_init (EphyDbus *dbus) -{ - dbus->priv = EPHY_DBUS_GET_PRIVATE (dbus); - - LOG ("EphyDbus initialising"); -} - -static void -ephy_dbus_class_init (EphyDbusClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->get_property = ephy_dbus_get_property; - object_class->set_property = ephy_dbus_set_property; - object_class->finalize = ephy_dbus_finalize; - - signals[CONNECTED] = - g_signal_new ("connected", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EphyDbusClass, connected), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, - 1, - EPHY_TYPE_DBUS_BUS); - - signals[DISCONNECTED] = - g_signal_new ("disconnected", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EphyDbusClass, disconnected), - NULL, NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, - 1, - EPHY_TYPE_DBUS_BUS); - - g_object_class_install_property - (object_class, - PROP_CLAIM_NAME, - g_param_spec_boolean ("register-name", - "register-name", - "register-name", - TRUE, - G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); - - g_type_class_add_private (object_class, sizeof(EphyDbusPrivate)); -} - -EphyDbus * -ephy_dbus_get_default (void) -{ - g_assert (ephy_dbus_instance != NULL); - - return ephy_dbus_instance; -} - -/** - * ephy_dbus_get_bus: - * @dbus: - * @kind: - * - * Returns: the #DBusGConnection for the @kind DBUS, or %NULL - * if a connection could not be established. - */ -DBusGConnection * -ephy_dbus_get_bus (EphyDbus *dbus, - EphyDbusBus kind) -{ - EphyDbusPrivate *priv = dbus->priv; - DBusGConnection *bus = NULL; - - g_return_val_if_fail (EPHY_IS_DBUS (dbus), NULL); - - if (kind == EPHY_DBUS_SYSTEM) - { - /* We connect lazily to the system bus */ - if (priv->system_bus == NULL) - { - ephy_dbus_connect_to_system_bus (dbus, NULL); - } - - bus = priv->system_bus; - } - else if (kind == EPHY_DBUS_SESSION) - { - if (priv->session_bus == NULL) - { - ephy_dbus_connect_to_session_bus (dbus, NULL); - } - - bus = priv->session_bus; - } - else - { - g_assert_not_reached (); - } - - return bus; -} - -DBusGProxy * -ephy_dbus_get_proxy (EphyDbus *dbus, - EphyDbusBus kind) -{ - DBusGConnection *bus = NULL; - - g_return_val_if_fail (EPHY_IS_DBUS (dbus), NULL); - - bus = ephy_dbus_get_bus (dbus, kind); - - if (bus == NULL) - { - g_warning ("Unable to get proxy for the %s bus.\n", - kind == EPHY_DBUS_SESSION ? "session" : "system"); - return NULL; - } - - return dbus_g_proxy_new_for_name (bus, - DBUS_EPHY_SERVICE, - DBUS_EPHY_PATH, - DBUS_EPHY_INTERFACE); -} - -/* private API */ - -gboolean -_ephy_dbus_startup (gboolean connect_and_register_name, - GError **error) -{ - g_assert (ephy_dbus_instance == NULL); - - ephy_dbus_error_quark = g_quark_from_static_string ("ephy-dbus-error"); - - ephy_dbus_instance = g_object_new (EPHY_TYPE_DBUS, - "register-name", connect_and_register_name, - NULL); - - if (!connect_and_register_name) return TRUE; - - /* We only connect to the session bus on startup*/ - return ephy_dbus_connect_to_session_bus (ephy_dbus_instance, error); -} - -void -_ephy_dbus_release (void) -{ - g_assert (ephy_dbus_instance != NULL); - - g_object_unref (ephy_dbus_instance); - ephy_dbus_instance = NULL; -} - -gboolean -_ephy_dbus_is_name_owner (void) -{ - g_assert (ephy_dbus_instance != NULL); - - return ephy_dbus_instance->priv->is_session_service_owner; -} |