diff options
Diffstat (limited to 'e-util/e-component-listener.c')
-rw-r--r-- | e-util/e-component-listener.c | 231 |
1 files changed, 0 insertions, 231 deletions
diff --git a/e-util/e-component-listener.c b/e-util/e-component-listener.c deleted file mode 100644 index e3cb3c6e1f..0000000000 --- a/e-util/e-component-listener.c +++ /dev/null @@ -1,231 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Component listener. - * - * Author: - * Rodrigo Moya <rodrigo@ximian.com> - * - * Copyright 2002, Ximian, Inc. - */ - -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-object.h> -#include "e-component-listener.h" -#include <libgnome/gnome-i18n.h> - -#define PARENT_TYPE GTK_TYPE_OBJECT -#define DEFAULT_PING_DELAY 10000 - -struct _EComponentListenerPrivate { - Bonobo_Unknown component; - int ping_delay; - int ping_timeout_id; -}; - -static void e_component_listener_class_init (EComponentListenerClass *klass); -static void e_component_listener_init (EComponentListener *cl, EComponentListenerClass *klass); -static void e_component_listener_finalize (GObject *object); - -static GObjectClass *parent_class = NULL; - -enum { - COMPONENT_DIED, - LAST_SIGNAL -}; - -static guint comp_listener_signals[LAST_SIGNAL]; - -static void -e_component_listener_class_init (EComponentListenerClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->finalize = e_component_listener_finalize; - klass->component_died = NULL; - - comp_listener_signals[COMPONENT_DIED] = - g_signal_new ("component_died", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EComponentListenerClass, component_died), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -e_component_listener_init (EComponentListener *cl, EComponentListenerClass *klass) -{ - /* allocate internal structure */ - cl->priv = g_new (EComponentListenerPrivate, 1); - cl->priv->component = CORBA_OBJECT_NIL; - cl->priv->ping_delay = DEFAULT_PING_DELAY; - cl->priv->ping_timeout_id = -1; -} - -static void -e_component_listener_finalize (GObject *object) -{ - EComponentListener *cl = (EComponentListener *) object; - - g_return_if_fail (E_IS_COMPONENT_LISTENER (cl)); - - cl->priv->component = CORBA_OBJECT_NIL; - - if (cl->priv->ping_timeout_id != -1) { - g_source_remove (cl->priv->ping_timeout_id); - cl->priv->ping_timeout_id = -1; - } - - /* free memory */ - g_free (cl->priv); - cl->priv = NULL; - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -GType -e_component_listener_get_type (void) -{ - static GType type = 0; - - if (!type) { - static GTypeInfo info = { - sizeof (EComponentListenerClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) e_component_listener_class_init, - NULL, NULL, - sizeof (EComponentListener), - 0, - (GInstanceInitFunc) e_component_listener_init - }; - type = g_type_register_static (G_TYPE_OBJECT, "EComponentListener", &info, 0); - } - - return type; -} - -static gboolean -ping_component_callback (gpointer user_data) -{ - gboolean alive; - int is_nil; - CORBA_Environment ev; - EComponentListener *cl = (EComponentListener *) user_data; - - g_return_val_if_fail (E_IS_COMPONENT_LISTENER (cl), FALSE); - - if (cl->priv->component == CORBA_OBJECT_NIL) - return FALSE; - - CORBA_exception_init (&ev); - is_nil = CORBA_Object_is_nil (cl->priv->component, &ev); - if (BONOBO_EX (&ev)) { - g_message (_("ping_timeout_callback: could not determine if the " - "CORBA object is nil or not")); - goto out; - } - - if (is_nil) - goto out; - - alive = bonobo_unknown_ping (cl->priv->component, &ev); - if (alive) { - CORBA_exception_free (&ev); - return TRUE; - } - - out: - /* the component has died, so we notify and close the timeout */ - CORBA_exception_free (&ev); - - /* we ref the object just in case it gets destroyed in the callbacks */ - g_object_ref (G_OBJECT (cl)); - g_signal_emit (G_OBJECT (cl), comp_listener_signals[COMPONENT_DIED], 0); - - cl->priv->component = CORBA_OBJECT_NIL; - cl->priv->ping_timeout_id = -1; - - g_object_unref (G_OBJECT (cl)); - - return FALSE; -} - -static void -setup_ping_timeout (EComponentListener *cl) -{ - if (cl->priv->ping_timeout_id != -1) - g_source_remove (cl->priv->ping_timeout_id); - - cl->priv->ping_timeout_id = g_timeout_add (cl->priv->ping_delay, - ping_component_callback, - cl); -} - -/** - * e_component_listener_new - * @comp: Component to listen for. - * @ping_delay: Delay (in ms) for pinging the component. - * - * Create a new #EComponentListener object, which allows to listen - * for a given component and get notified when that component dies. - * - * Returns: a component listener object. - */ -EComponentListener * -e_component_listener_new (Bonobo_Unknown comp, int ping_delay) -{ - EComponentListener *cl; - - cl = g_object_new (E_COMPONENT_LISTENER_TYPE, NULL); - cl->priv->component = comp; - - /* set up the timeout function */ - cl->priv->ping_delay = ping_delay > 0 ? ping_delay : DEFAULT_PING_DELAY; - setup_ping_timeout (cl); - - return cl; -} - -/** - * e_component_listener_get_ping_delay - * @cl: A #EComponentListener object. - * - * Get the ping delay being used to listen for an object. - */ -int -e_component_listener_get_ping_delay (EComponentListener *cl) -{ - g_return_val_if_fail (E_IS_COMPONENT_LISTENER (cl), -1); - return cl->priv->ping_delay; -} - -void -e_component_listener_set_ping_delay (EComponentListener *cl, int ping_delay) -{ - g_return_if_fail (E_IS_COMPONENT_LISTENER (cl)); - g_return_if_fail (ping_delay > 0); - - cl->priv->ping_delay = ping_delay; - setup_ping_timeout (cl); -} - -Bonobo_Unknown -e_component_listener_get_component (EComponentListener *cl) -{ - g_return_val_if_fail (E_IS_COMPONENT_LISTENER (cl), CORBA_OBJECT_NIL); - return cl->priv->component; -} - -void -e_component_listener_set_component (EComponentListener *cl, Bonobo_Unknown comp) -{ - g_return_if_fail (E_IS_COMPONENT_LISTENER (cl)); - - cl->priv->component = comp; - setup_ping_timeout (cl); -} |