Don't attempt to access dead/defunct application when marshalling
[platform/core/uifw/at-spi2-atk.git] / registryd / registry.c
index 2d2ae74..c0e36bd 100644 (file)
@@ -116,7 +116,11 @@ desktop_add_application (SpiDesktop *desktop,
   /* FIXME
   spi_init_any_object (&e.any_data, a);
   */
-  spi_init_any_nil (&e.any_data);
+  spi_init_any_nil (&e.any_data,
+                   e.source,
+                   Accessibility_ROLE_DESKTOP_FRAME,
+                   "");
+
   Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry),
                                      &e, &ev);
   bonobo_object_release_unref (a, &ev);
@@ -131,7 +135,7 @@ desktop_remove_application (SpiDesktop *desktop,
 {
   BonoboObject *registry = BONOBO_OBJECT (data);
   Accessibility_Event e;
-  Accessibility_Accessible a;
+  /* Accessibility_Accessible a; FIXME */
   CORBA_Environment ev;
   
   CORBA_exception_init (&ev);
@@ -140,13 +144,16 @@ desktop_remove_application (SpiDesktop *desktop,
   e.source = BONOBO_OBJREF (desktop);
   e.detail1 = index;
   e.detail2 = 0;
+  /* FIXME
   a = Accessibility_Accessible_getChildAtIndex (BONOBO_OBJREF (desktop), 
                                                index, &ev);
-  /* FIXME
   spi_init_any_object (&e.any_data, a);
   */
-  spi_init_any_nil (&e.any_data);
-  Accessibility_Accessible_unref (a, &ev);
+  spi_init_any_nil (&e.any_data,
+                   e.source,
+                   Accessibility_ROLE_DESKTOP_FRAME,
+                   "");
+  /* Accessibility_Accessible_unref (a, &ev); */
   Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry),
                                      &e, &ev);
   Accessibility_Desktop_unref (e.source, &ev);
@@ -423,20 +430,31 @@ impl_accessibility_registry_register_global_event_listener (
     }
 }
 
+typedef struct {
+  gboolean                    remove_all;
+  Accessibility_EventListener listener;
+  EventTypeStruct             etype;
+} RemoveListenerClosure;
+
 static SpiReEntrantContinue
 remove_listener_cb (GList * const *list, gpointer user_data)
 {
   SpiListenerStruct *ls = (SpiListenerStruct *) (*list)->data;
   CORBA_Environment  ev;
-  Accessibility_EventListener listener = user_data;
+  RemoveListenerClosure *cl = user_data;
 
   CORBA_exception_init (&ev);
-       
-  if (CORBA_Object_is_equivalent (ls->listener, listener, &ev))
-    {
-       spi_re_entrant_list_delete_link (list);
-       spi_listener_struct_free (ls, &ev);
-    }
+
+  if (cl->remove_all || (((cl->etype.minor == ls->event_type_quark) || 
+                        (cl->etype.major == ls->event_type_quark)) &&
+                        cl->etype.type_cat == ls->event_type_cat ) )
+  {
+    if (CORBA_Object_is_equivalent (ls->listener, cl->listener, &ev))
+      {
+        spi_re_entrant_list_delete_link (list);
+        spi_listener_struct_free (ls, &ev);
+      }
+  }
 
   CORBA_exception_free (&ev);
 
@@ -455,14 +473,18 @@ impl_accessibility_registry_deregister_global_event_listener_all (
   int i;
   GList **lists[3];
   SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
+  RemoveListenerClosure cl = { 0, };
 
   lists[0] = &registry->object_listeners;
   lists[1] = &registry->window_listeners;
   lists[2] = &registry->toolkit_listeners;
 
+  cl.remove_all = TRUE;
+  cl.listener = listener;
+
   for (i = 0; i < sizeof (lists) / sizeof (lists[0]); i++)
     {
-      spi_re_entrant_list_foreach (lists [i], remove_listener_cb, listener);
+      spi_re_entrant_list_foreach (lists [i], remove_listener_cb, &cl);
     }
 }
 
@@ -478,14 +500,16 @@ impl_accessibility_registry_deregister_global_event_listener (
        CORBA_Environment          *ev)
 {
   SpiRegistry    *registry;
-  EventTypeStruct etype;
+  RemoveListenerClosure cl = { 0, };
 
   registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
 
-  parse_event_type (&etype, (char *) event_name);
+  cl.remove_all = FALSE;
+  parse_event_type (&cl.etype, (char *) event_name);
+  cl.listener = listener;
 
-  spi_re_entrant_list_foreach (get_listener_list (registry, etype.type_cat),
-                               remove_listener_cb, listener);
+  spi_re_entrant_list_foreach (get_listener_list (registry, cl.etype.type_cat),
+                               remove_listener_cb, &cl);
 }
 
 
@@ -694,6 +718,8 @@ registry_flush_event_queue (SpiRegistry       *registry,
     }
     CORBA_free ((void *)q_ctx->etype.event_name);
     CORBA_free ((void *)q_ctx->e_out.type);
+    if (q_ctx->e_out.any_data._type != TC_null) 
+       CORBA_free ((void *)q_ctx->e_out.any_data._value);
     g_free (q_ctx);
   }
   registry->is_queueing = FALSE;
@@ -824,6 +850,8 @@ registry_queue_event (SpiRegistry *registry, NotifyContext *ctx)
       bonobo_object_release_unref (q_ctx->source, NULL);
       CORBA_free ((void *)q_ctx->etype.event_name);
       CORBA_free ((void *)q_ctx->e_out.type);
+      if (q_ctx->e_out.any_data._type != TC_null) 
+         CORBA_free ((void *)q_ctx->e_out.any_data._value);
       g_free (q_ctx);
       return TRUE; 
     }