static void magnatune_execute_search(OperationSpec *os) { GrlMedia *media = NULL; gchar *sql = NULL; GList *list_medias = NULL; GList *iter = NULL; gint num_medias = 0; gchar *id = NULL; GError *err = NULL; GRL_DEBUG("magnatune_execute_search"); sql = g_strdup_printf(GRL_SQL_SONGS_QUERY_ALL, os->text, os->text, os->text, os->count, os->skip); list_medias = magnatune_sqlite_execute(os, sql, build_media_track_from_stmt, &err); g_free(sql); if (list_medias == NULL) goto end_search; num_medias = g_list_length(list_medias) - 1; for (iter = list_medias; iter; iter = iter->next) { media = iter->data; id = g_strdup_printf("%s-%s", "track", grl_media_get_id(media)); grl_media_set_id(media, id); g_free(id); os->callback(os->source, os->operation_id, media, num_medias, os->user_data, NULL); num_medias--; } g_list_free(list_medias); g_slice_free(OperationSpec, os); return; end_search: if (err != NULL) { os->callback(os->source, os->operation_id, NULL, 0, os->user_data, err); g_error_free(err); } else { os->callback(os->source, os->operation_id, NULL, 0, os->user_data, NULL); } g_slice_free(OperationSpec, os); }
static void magnatune_execute_browse(OperationSpec *os) { MagnatuneBuildMediaFn *build_fn; GrlMedia *media = NULL; const gchar *container_id = NULL; gchar *sql = NULL; gchar **touple = NULL; gchar *box_id = NULL; gchar *category_str_id = NULL; gint id = 0; gint num_medias = 0; static GList *iter = NULL; static GList *list_medias = NULL; GError *err = NULL; GRL_DEBUG("magnatune_execute_browse"); container_id = grl_media_get_id(os->container); if (container_id == NULL) { magnatune_browse_root(os); goto end_browse; } touple = g_strsplit_set(container_id, MAGNATUNE_NAME_ID_SEP, 0); id = g_ascii_strtoll(touple[1], NULL, 10); build_fn = build_media_id_name_from_stmt; if (strcmp(touple[0], "root") == 0) { switch (id) { case MAGNATUNE_ARTIST_CAT: category_str_id = g_strdup("artist"); sql = g_strdup_printf(GRL_SQL_ARTISTS_QUERY_ALL, os->count, os->skip); break; case MAGNATUNE_ALBUM_CAT: category_str_id = g_strdup("album"); sql = g_strdup_printf(GRL_SQL_ALBUMS_QUERY_ALL, os->count, os->skip); break; case MAGNATUNE_GENRE_CAT: category_str_id = g_strdup("genre"); sql = g_strdup_printf(GRL_SQL_GENRES_QUERY_ALL, os->count, os->skip); break; } } else if (strcmp(touple[0], "artist") == 0) { category_str_id = g_strdup("album"); sql = g_strdup_printf(GRL_SQL_ALBUMS_BY_ARTIST, id, os->count, os->skip); } else if (strcmp(touple[0], "album") == 0) { category_str_id = g_strdup("track"); sql = g_strdup_printf(GRL_SQL_SONGS_BY_ALBUM, id, os->count, os->skip); build_fn = build_media_track_from_stmt; } else if (strcmp(touple[0], "genre") == 0) { category_str_id = g_strdup("album"); sql = g_strdup_printf(GRL_SQL_ALBUMS_BY_GENRE, id, os->count, os->skip); } else { err = g_error_new(GRL_CORE_ERROR, GRL_CORE_ERROR_BROWSE_FAILED, _("Invalid container identifier %s"), container_id); } g_strfreev(touple); if (sql == NULL || err != NULL) goto end_browse; /* We have the right sql-query, execute */ list_medias = magnatune_sqlite_execute(os, sql, build_fn, &err); g_free(sql); if (list_medias == NULL) goto end_browse; num_medias = g_list_length(list_medias) - 1;; for (iter = list_medias; iter; iter = iter->next) { media = iter->data; box_id = g_strdup_printf("%s-%s", category_str_id, grl_media_get_id(media)); grl_media_set_id(media, box_id); g_free(box_id); os->callback(os->source, os->operation_id, media, num_medias, os->user_data, NULL); num_medias--; } g_list_free(list_medias); end_browse: if (err != NULL) { os->callback(os->source, os->operation_id, NULL, 0, os->user_data, err); g_error_free(err); } g_clear_pointer (&category_str_id, g_free); g_slice_free(OperationSpec, os); }