static void gom_repository_find_one_fetch_cb (GObject *object, GAsyncResult *result, gpointer user_data) { GSimpleAsyncResult *simple = user_data; GomResourceGroup *group = (GomResourceGroup *)object; GomResource *resource; GError *error = NULL; g_return_if_fail(GOM_IS_RESOURCE_GROUP(group)); g_return_if_fail(G_IS_SIMPLE_ASYNC_RESULT(simple)); if (!gom_resource_group_fetch_finish(group, result, &error)) { g_simple_async_result_take_error(simple, error); g_simple_async_result_complete_in_idle(simple); g_object_unref(simple); return; } resource = gom_resource_group_get_index(group, 0); g_simple_async_result_set_op_res_gpointer(simple, g_object_ref(resource), g_object_unref); g_simple_async_result_complete_in_idle(simple); g_object_unref(simple); }
/** * catch_resource_group_get_resource: * @group: (in): A #CatchResourceGroup. * @index_: (in): The index of the resource to retrieve. * * Fetches the resource found at @index_. catch_resource_group_fetch_async() * must have been called to load a range including this resource. * * Returns: (transfer none): A #GomResource. */ CatchResource * catch_resource_group_get_resource (CatchResourceGroup *group, guint index_) { CatchResourceGroupPrivate *priv; CatchResource *ret = NULL; ENTRY; g_return_val_if_fail(CATCH_IS_RESOURCE_GROUP(group), NULL); priv = group->priv; if (priv->group) { ret = CATCH_RESOURCE(gom_resource_group_get_index(priv->group, index_)); } else { ret = g_hash_table_lookup(priv->resources, &index_); } RETURN(ret); }
/** * 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); }