/**
* g_simple_async_result_is_valid:
* @result: the #GAsyncResult passed to the _finish function.
- * @source: the #GObject passed to the _finish function.
- * @source_tag: the asynchronous function.
+ * @source: (allow-none): the #GObject passed to the _finish function.
+ * @source_tag: (allow-none): the asynchronous function.
*
* Ensures that the data passed to the _finish function of an async
* operation is consistent. Three checks are performed.
* First, @result is checked to ensure that it is really a
* #GSimpleAsyncResult. Second, @source is checked to ensure that it
* matches the source object of @result. Third, @source_tag is
- * checked to ensure that it is either %NULL (as it is when the result was
- * created by g_simple_async_report_error_in_idle() or
- * g_simple_async_report_gerror_in_idle()) or equal to the
- * @source_tag argument given to g_simple_async_result_new() (which, by
- * convention, is a pointer to the _async function corresponding to the
- * _finish function from which this function is called).
+ * checked to ensure that it is equal to the @source_tag argument given
+ * to g_simple_async_result_new() (which, by convention, is a pointer
+ * to the _async function corresponding to the _finish function from
+ * which this function is called). (Alternatively, if either
+ * @source_tag or @result's source tag is %NULL, then the source tag
+ * check is skipped.)
*
* Returns: #TRUE if all checks passed or #FALSE if any failed.
*
{
GSimpleAsyncResult *simple;
GObject *cmp_source;
+ gpointer result_source_tag;
if (!G_IS_SIMPLE_ASYNC_RESULT (result))
return FALSE;
if (cmp_source != NULL)
g_object_unref (cmp_source);
- return source_tag == NULL ||
- source_tag == g_simple_async_result_get_source_tag (simple);
+ result_source_tag = g_simple_async_result_get_source_tag (simple);
+ return source_tag == NULL || result_source_tag == NULL ||
+ source_tag == result_source_tag;
}
/**
ensure_destroyed (b);
}
+static void
+test_valid (void)
+{
+ GAsyncResult *result;
+ GObject *a, *b;
+
+ a = g_object_new (G_TYPE_OBJECT, NULL);
+ b = g_object_new (G_TYPE_OBJECT, NULL);
+
+ /* Without source or tag */
+ result = (GAsyncResult *) g_simple_async_result_new (NULL, NULL, NULL, NULL);
+ g_assert_true (g_simple_async_result_is_valid (result, NULL, NULL));
+ g_assert_true (g_simple_async_result_is_valid (result, NULL, test_valid));
+ g_assert_true (g_simple_async_result_is_valid (result, NULL, test_simple_async));
+ g_assert_false (g_simple_async_result_is_valid (result, a, NULL));
+ g_assert_false (g_simple_async_result_is_valid (result, a, test_valid));
+ g_assert_false (g_simple_async_result_is_valid (result, a, test_simple_async));
+ g_object_unref (result);
+
+ /* Without source, with tag */
+ result = (GAsyncResult *) g_simple_async_result_new (NULL, NULL, NULL, test_valid);
+ g_assert_true (g_simple_async_result_is_valid (result, NULL, NULL));
+ g_assert_true (g_simple_async_result_is_valid (result, NULL, test_valid));
+ g_assert_false (g_simple_async_result_is_valid (result, NULL, test_simple_async));
+ g_assert_false (g_simple_async_result_is_valid (result, a, NULL));
+ g_assert_false (g_simple_async_result_is_valid (result, a, test_valid));
+ g_assert_false (g_simple_async_result_is_valid (result, a, test_simple_async));
+ g_object_unref (result);
+
+ /* With source, without tag */
+ result = (GAsyncResult *) g_simple_async_result_new (a, NULL, NULL, NULL);
+ g_assert_true (g_simple_async_result_is_valid (result, a, NULL));
+ g_assert_true (g_simple_async_result_is_valid (result, a, test_valid));
+ g_assert_true (g_simple_async_result_is_valid (result, a, test_simple_async));
+ g_assert_false (g_simple_async_result_is_valid (result, NULL, NULL));
+ g_assert_false (g_simple_async_result_is_valid (result, NULL, test_valid));
+ g_assert_false (g_simple_async_result_is_valid (result, NULL, test_simple_async));
+ g_assert_false (g_simple_async_result_is_valid (result, b, NULL));
+ g_assert_false (g_simple_async_result_is_valid (result, b, test_valid));
+ g_assert_false (g_simple_async_result_is_valid (result, b, test_simple_async));
+ g_object_unref (result);
+
+ /* With source and tag */
+ result = (GAsyncResult *) g_simple_async_result_new (a, NULL, NULL, test_valid);
+ g_assert_true (g_simple_async_result_is_valid (result, a, test_valid));
+ g_assert_true (g_simple_async_result_is_valid (result, a, NULL));
+ g_assert_false (g_simple_async_result_is_valid (result, a, test_simple_async));
+ g_assert_false (g_simple_async_result_is_valid (result, NULL, NULL));
+ g_assert_false (g_simple_async_result_is_valid (result, NULL, test_valid));
+ g_assert_false (g_simple_async_result_is_valid (result, NULL, test_simple_async));
+ g_assert_false (g_simple_async_result_is_valid (result, b, NULL));
+ g_assert_false (g_simple_async_result_is_valid (result, b, test_valid));
+ g_assert_false (g_simple_async_result_is_valid (result, b, test_simple_async));
+ g_object_unref (result);
+
+ /* Non-GSimpleAsyncResult */
+ result = (GAsyncResult *) g_task_new (NULL, NULL, NULL, NULL);
+ g_assert_false (g_simple_async_result_is_valid (result, NULL, NULL));
+ g_object_unref (result);
+
+ g_object_unref (a);
+ g_object_unref (b);
+}
+
int
main (int argc, char **argv)
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/gio/simple-async-result/test", test_simple_async);
+ g_test_add_func ("/gio/simple-async-result/valid", test_valid);
return g_test_run();
}