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;
}
Example #4
0
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);
}