+ if (!(obj->cached_properties & ATSPI_CACHE_PARENT))
+ {
+ DBusMessage *message, *reply;
+ DBusMessageIter iter, iter_variant;
+ message = dbus_message_new_method_call (obj->app->bus_name, obj->path,
+ DBUS_INTERFACE_PROPERTIES, "Get");
+ if (!message)
+ return NULL;
+ dbus_message_append_args (message, DBUS_TYPE_STRING, &atspi_interface_accessible,
+ DBUS_TYPE_STRING, &str_parent,
+ DBUS_TYPE_INVALID);
+ reply = _atspi_dbus_send_with_reply_and_block (message);
+ if (!reply ||
+ (strcmp (dbus_message_get_signature (reply), "v") != 0))
+ return NULL;
+ dbus_message_iter_init (reply, &iter);
+ dbus_message_iter_recurse (&iter, &iter_variant);
+ obj->accessible_parent = _atspi_dbus_return_accessible_from_iter (&iter_variant);
+ dbus_message_unref (reply);
+ obj->cached_properties |= ATSPI_CACHE_PARENT;
+ }
+ if (!obj->accessible_parent)
+ return NULL;