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); }
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); } }