aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--e-util/ChangeLog5
-rw-r--r--e-util/e-component-listener.c131
-rw-r--r--e-util/e-component-listener.h4
3 files changed, 41 insertions, 99 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
index 3cbac0eade..2f7c25f84d 100644
--- a/e-util/ChangeLog
+++ b/e-util/ChangeLog
@@ -1,3 +1,8 @@
+2003-06-04 Rodrigo Moya <rodrigo@ximian.com>
+
+ * e-component-listener.[ch]: use ORBit_small_listen/_unlisten instead
+ of Bonobo_Unknown_ping'ing the components.
+
2003-05-29 JP Rosevear <jpr@ximian.com>
Fixes #43775
diff --git a/e-util/e-component-listener.c b/e-util/e-component-listener.c
index e3cb3c6e1f..024e4a93f1 100644
--- a/e-util/e-component-listener.c
+++ b/e-util/e-component-listener.c
@@ -14,12 +14,9 @@
#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);
@@ -27,6 +24,7 @@ static void e_component_listener_init (EComponentListener *cl, EComponentL
static void e_component_listener_finalize (GObject *object);
static GObjectClass *parent_class = NULL;
+static GList *watched_connections = NULL;
enum {
COMPONENT_DIED,
@@ -36,6 +34,30 @@ enum {
static guint comp_listener_signals[LAST_SIGNAL];
static void
+connection_listen_cb (gpointer object, gpointer user_data)
+{
+ GList *l, *next = NULL;
+ EComponentListener *cl;
+
+ for (l = watched_connections; l != NULL; l = next) {
+ next = l->next;
+ cl = l->data;
+
+ switch (ORBit_small_get_connection_status (cl->priv->component)) {
+ case ORBIT_CONNECTION_DISCONNECTED :
+ watched_connections = g_list_delete_link (watched_connections, l);
+
+ g_object_ref (cl);
+ g_signal_emit (cl, comp_listener_signals[COMPONENT_DIED], 0);
+ cl->priv->component = CORBA_OBJECT_NIL;
+ g_object_unref (cl);
+ break;
+ default :
+ }
+ }
+}
+
+static void
e_component_listener_class_init (EComponentListenerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -61,8 +83,6 @@ e_component_listener_init (EComponentListener *cl, EComponentListenerClass *klas
/* 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
@@ -72,12 +92,10 @@ e_component_listener_finalize (GObject *object)
g_return_if_fail (E_IS_COMPONENT_LISTENER (cl));
- cl->priv->component = CORBA_OBJECT_NIL;
+ watched_connections = g_list_remove (watched_connections, cl);
- if (cl->priv->ping_timeout_id != -1) {
- g_source_remove (cl->priv->ping_timeout_id);
- cl->priv->ping_timeout_id = -1;
- }
+ if (cl->priv->component != CORBA_OBJECT_NIL)
+ cl->priv->component = CORBA_OBJECT_NIL;
/* free memory */
g_free (cl->priv);
@@ -109,67 +127,9 @@ e_component_listener_get_type (void)
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.
@@ -177,43 +137,22 @@ setup_ping_timeout (EComponentListener *cl)
* Returns: a component listener object.
*/
EComponentListener *
-e_component_listener_new (Bonobo_Unknown comp, int ping_delay)
+e_component_listener_new (Bonobo_Unknown comp)
{
EComponentListener *cl;
+ g_return_val_if_fail (comp != NULL, NULL);
+
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);
+ /* watch the connection */
+ ORBit_small_listen_for_broken (comp, G_CALLBACK (connection_listen_cb), cl);
+ watched_connections = g_list_prepend (watched_connections, 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)
{
@@ -227,5 +166,5 @@ 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);
+ ORBit_small_listen_for_broken (comp, G_CALLBACK (connection_listen_cb), cl);
}
diff --git a/e-util/e-component-listener.h b/e-util/e-component-listener.h
index 3ade575cea..3f5694ecd0 100644
--- a/e-util/e-component-listener.h
+++ b/e-util/e-component-listener.h
@@ -36,10 +36,8 @@ typedef struct {
} EComponentListenerClass;
GType e_component_listener_get_type (void);
-EComponentListener *e_component_listener_new (Bonobo_Unknown comp, int ping_delay);
+EComponentListener *e_component_listener_new (Bonobo_Unknown comp);
-int e_component_listener_get_ping_delay (EComponentListener *cl);
-void e_component_listener_set_ping_delay (EComponentListener *cl, int ping_delay);
Bonobo_Unknown e_component_listener_get_component (EComponentListener *cl);
void e_component_listener_set_component (EComponentListener *cl,
Bonobo_Unknown comp);