Removed the extra boolean parameter added to know when to unref the
[platform/core/uifw/at-spi2-atk.git] / atk-adaptor / object.c
index 856e991..3511682 100644 (file)
  * This function will simply look for all the accessibles that the cache object
  * has not found and assume that they need to be leased.
  */
-static void
-maybe_lease (AtkObject *obj)
+void
+spi_object_lease_if_needed (GObject *obj)
 {
-  if (!spi_cache_in (spi_global_cache, G_OBJECT (obj)))
+  if (!spi_cache_in (spi_global_cache, obj))
     {
-      spi_leasing_take (spi_global_leasing, G_OBJECT (obj));
+      spi_leasing_take (spi_global_leasing, obj);
     }
 }
 
@@ -74,13 +74,65 @@ maybe_lease (AtkObject *obj)
  */
 
 void
+spi_object_append_null_reference (DBusMessageIter * iter)
+{
+  DBusMessageIter iter_struct;
+  const char *name;
+  const char *path = SPI_DBUS_PATH_NULL;
+
+  name = dbus_bus_get_unique_name (spi_global_app_data->bus);
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
+                                    &iter_struct);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
+  dbus_message_iter_close_container (iter, &iter_struct);
+}
+
+void
 spi_object_append_reference (DBusMessageIter * iter, AtkObject * obj)
 {
   DBusMessageIter iter_struct;
   const gchar *name;
   gchar *path;
 
-  maybe_lease (obj);
+  if (!obj) {
+    spi_object_append_null_reference (iter);
+    return;
+  }
+
+  spi_object_lease_if_needed (G_OBJECT (obj));
+
+  name = dbus_bus_get_unique_name (spi_global_app_data->bus);
+  path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj));
+
+  if (!path)
+    path = g_strdup (SPI_DBUS_PATH_NULL);
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
+                                    &iter_struct);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
+  dbus_message_iter_close_container (iter, &iter_struct);
+  
+  g_free (path);
+}
+
+/* TODO: Perhaps combine with spi_object_append_reference.  Leaving separate
+ * for now in case we want to use a different path for hyperlinks. */
+void
+spi_hyperlink_append_reference (DBusMessageIter * iter, AtkHyperlink * obj)
+{
+  DBusMessageIter iter_struct;
+  const gchar *name;
+  gchar *path;
+
+  if (!obj) {
+    spi_object_append_null_reference (iter);
+    return;
+  }
+
+  spi_object_lease_if_needed (G_OBJECT (obj));
 
   name = dbus_bus_get_unique_name (spi_global_app_data->bus);
   path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj));
@@ -112,8 +164,8 @@ void
 spi_object_append_desktop_reference (DBusMessageIter * iter)
 {
   DBusMessageIter iter_struct;
-  const char *name = SPI_DBUS_NAME_REGISTRY;
-  const char *path = SPI_DBUS_PATH_DESKTOP;
+  const char *name = spi_global_app_data->desktop_name;
+  const char *path = spi_global_app_data->desktop_path;
 
   dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
                                     &iter_struct);
@@ -122,24 +174,24 @@ spi_object_append_desktop_reference (DBusMessageIter * iter)
   dbus_message_iter_close_container (iter, &iter_struct);
 }
 
-void
-spi_object_append_null_reference (DBusMessageIter * iter)
+DBusMessage *
+spi_object_return_reference (DBusMessage * msg, AtkObject * obj)
 {
-  DBusMessageIter iter_struct;
-  const char *name;
-  const char *path = "/org/at_spi/null";
+  DBusMessage *reply;
 
-  name = dbus_bus_get_unique_name (spi_global_app_data->bus);
+  reply = dbus_message_new_method_return (msg);
+  if (reply)
+    {
+      DBusMessageIter iter;
+      dbus_message_iter_init_append (reply, &iter);
+      spi_object_append_reference (&iter, obj);
+    }
 
-  dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
-                                    &iter_struct);
-  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
-  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
-  dbus_message_iter_close_container (iter, &iter_struct);
+  return reply;
 }
 
 DBusMessage *
-spi_object_return_reference (DBusMessage * msg, AtkObject * obj)
+spi_hyperlink_return_reference (DBusMessage * msg, AtkHyperlink * obj)
 {
   DBusMessage *reply;
 
@@ -148,9 +200,10 @@ spi_object_return_reference (DBusMessage * msg, AtkObject * obj)
     {
       DBusMessageIter iter;
       dbus_message_iter_init_append (reply, &iter);
-      spi_object_append_reference (&iter, obj);
+      spi_hyperlink_append_reference (&iter, obj);
     }
-  g_object_unref (G_OBJECT (obj));
+  if (obj)
+    g_object_unref (G_OBJECT (obj));
 
   return reply;
 }
@@ -171,6 +224,12 @@ spi_object_append_interfaces (DBusMessageIter * iter, AtkObject * obj)
       dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
     }
 
+  if (atk_object_get_role (obj) == ATK_ROLE_APPLICATION)
+    {
+      itf = SPI_DBUS_INTERFACE_APPLICATION;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
   if (ATK_IS_COMPONENT (obj))
     {
       itf = SPI_DBUS_INTERFACE_COMPONENT;
@@ -219,15 +278,17 @@ spi_object_append_interfaces (DBusMessageIter * iter, AtkObject * obj)
       dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
     }
 
+#if 0
   if (ATK_IS_STREAMABLE_CONTENT (obj))
     {
-      itf = "org.freedesktop.atspi.StreamableContent";
+      itf = "org.a11y.atspi.StreamableContent";
       dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
     }
+#endif
 
   if (ATK_IS_DOCUMENT (obj))
     {
-      itf = "org.freedesktop.atspi.Collection";
+      itf = "org.a11y.atspi.Collection";
       dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
       itf = SPI_DBUS_INTERFACE_DOCUMENT;
       dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);