/** * gom_repository_find_one_sync: * @repository: (in): A #GomRepository. * @resource_type: (in): A #GType of the resource to lookup. * @filter: (in): A #GomFilter to apply to your search. * @error: (out): A location for a #GError, or %NULL. * * Synchronous version of gom_repository_find_async(). * * Returns: (transfer full): A #GomResource or %NULL. */ GomResource * gom_repository_find_one_sync (GomRepository *repository, GType resource_type, GomFilter *filter, GError **error) { GomResourceGroup *group; GomResource *ret; g_return_val_if_fail(GOM_IS_REPOSITORY(repository), NULL); g_return_val_if_fail(g_type_is_a(resource_type, GOM_TYPE_RESOURCE), NULL); g_return_val_if_fail(resource_type != GOM_TYPE_RESOURCE, NULL); g_return_val_if_fail(!filter || GOM_IS_FILTER(filter), NULL); if (!(group = gom_repository_find_sync(repository, resource_type, filter, error))) { return NULL; } if (!gom_resource_group_get_count(group)) { g_set_error(error, GOM_ERROR, GOM_ERROR_REPOSITORY_EMPTY_RESULT, _("No resources were found.")); g_object_unref(group); return NULL; } if (!gom_resource_group_fetch_sync(group, 0, 1, error)) { g_object_unref(group); return NULL; } ret = g_object_ref(gom_resource_group_get_index(group, 0)); g_object_unref(group); return ret; }
static void find_cb (GObject *object, GAsyncResult *res, gpointer user_data) { GomResourceGroup *group; OperationSpec *os = user_data; GError *local_error = NULL; GError *error = NULL; guint idx, count, num_left; group = gom_repository_find_finish (GOM_REPOSITORY (object), res, &local_error); if (!group) { GRL_WARNING ("Failed to find bookmarks: %s", local_error->message); error = g_error_new (GRL_CORE_ERROR, os->error_code, _("Failed to find bookmarks: %s"), local_error->message); g_error_free (local_error); os->callback (os->source, os->operation_id, NULL, 0, os->user_data, error); g_error_free (error); goto out; } count = gom_resource_group_get_count (group); if (os->skip >= count) { os->callback (os->source, os->operation_id, NULL, 0, os->user_data, NULL); goto out; } if (!gom_resource_group_fetch_sync (group, os->skip, os->count, &local_error)) { GRL_WARNING ("Failed to find bookmarks: %s", local_error->message); error = g_error_new (GRL_CORE_ERROR, os->error_code, _("Failed to find bookmarks: %s"), local_error->message); g_error_free (local_error); os->callback (os->source, os->operation_id, NULL, 0, os->user_data, error); g_error_free (error); goto out; } idx = os->skip; num_left = MIN (count - os->skip, os->count); for (idx = os->skip; num_left > 0 ; idx++) { GomResource *resource; GrlMedia *media; resource = gom_resource_group_get_index (group, idx); media = build_media_from_resource (NULL, resource, os->type_filter); if (media == NULL) { num_left--; if (num_left == 0) os->callback (os->source, os->operation_id, NULL, 0, os->user_data, NULL); continue; } os->callback (os->source, os->operation_id, media, --num_left, os->user_data, NULL); } g_object_unref (group); out: g_slice_free (OperationSpec, os); }