示例#1
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);
}
示例#2
0
static void
magnatune_get_db_done(GObject *source_object,
                      GAsyncResult *res,
                      gpointer user_data)
{
  gchar *db_path = NULL;
  gchar *new_db_path = NULL;
  gchar *content = NULL;
  gsize length = 0;
  gboolean ret = FALSE;
  gboolean first_run = FALSE;
  GError *err = NULL;
  GError *err_fn = NULL;
  OperationSpec *os = NULL;
  GrlMagnatuneSource *source = NULL;

  GRL_DEBUG("magnatune_get_db_done");
  os = (OperationSpec *) user_data;
  ret = grl_net_wc_request_finish(GRL_NET_WC(source_object),
                                  res,
                                  &content,
                                  &length,
                                  &err_fn);
  g_object_unref(source_object);

  if (ret == FALSE) {
    err = g_error_new(GRL_CORE_ERROR,
                      GRL_CORE_ERROR_MEDIA_NOT_FOUND,
                      _("Failed to get database from magnatune: %s"),
                      err_fn->message);
    g_error_free(err_fn);

    if (os != NULL)
      os->callback(os->source, os->operation_id, NULL, 0, os->user_data, err);

  } else {
    db_path = g_build_filename(g_get_user_data_dir(), "grilo-plugins",
                               GRL_SQL_DB, NULL);

    /* If this is a first run, new database must be ready to use */
    if (g_file_test(db_path, G_FILE_TEST_EXISTS) == FALSE) {
      new_db_path = db_path;
      first_run = TRUE;
    } else {
      g_free(db_path);
      new_db_path = g_build_filename(g_get_user_data_dir(), "grilo-plugins",
                                     GRL_SQL_NEW_DB, NULL);
    }

    GRL_WARNING("Saving database to path '%s'", new_db_path);
    ret = g_file_set_contents(new_db_path,
                              content,
                              length,
                              &err_fn);

    if (ret == FALSE) {
      err = g_error_new(GRL_CORE_ERROR,
                        GRL_CORE_ERROR_MEDIA_NOT_FOUND,
                        _("Failed to save database from magnatune - '%s'"),
                        err_fn->message);
      g_error_free(err_fn);

      if (os != NULL)
        os->callback(os->source, os->operation_id, NULL, 0, os->user_data, err);

    } else if (first_run == TRUE) {
      source = GRL_MAGNATUNE_SOURCE(os->source);

      if (source->priv->db == NULL) {
        GRL_DEBUG("Opening database connection.");
        if (sqlite3_open(db_path, &source->priv->db) != SQLITE_OK) {
          GRL_WARNING("Failed to open database '%s': %s",
                      db_path,
                      sqlite3_errmsg(source->priv->db));
          sqlite3_close(source->priv->db);
          source->priv->db = NULL;
        }
      }
    }

    g_free(new_db_path);
  }

  if (ret == TRUE && os != NULL) {
    /* execute application's request */
    os->magnatune_cb(os);
  }
}