static void
gom_repository_find_one_cb (GObject      *object,
                            GAsyncResult *result,
                            gpointer      user_data)
{
   GSimpleAsyncResult *simple = user_data;
   GomResourceGroup *group;
   GomRepository *repository = (GomRepository *)object;
   GError *error = NULL;

   g_return_if_fail(GOM_IS_REPOSITORY(repository));
   g_return_if_fail(G_IS_SIMPLE_ASYNC_RESULT(simple));

   if (!(group = gom_repository_find_finish(repository, result, &error))) {
      g_simple_async_result_take_error(simple, error);
      g_simple_async_result_complete_in_idle(simple);
      g_object_unref(simple);
      return;
   }

   if (!gom_resource_group_get_count(group)) {
      g_simple_async_result_set_error(simple, GOM_ERROR,
                                      GOM_ERROR_REPOSITORY_EMPTY_RESULT,
                                      _("No resources were found."));
      g_simple_async_result_complete_in_idle(simple);
      g_object_unref(simple);
      g_object_unref(group);
      return;
   }

   gom_resource_group_fetch_async(group, 0, 1,
                                  gom_repository_find_one_fetch_cb,
                                  simple);
   g_object_unref(group);
}
Example #2
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);
}