From dc9a57269a1cb87a71d5caadfbd22aa0602bbb86 Mon Sep 17 00:00:00 2001 From: Qball Cow Date: Tue, 6 May 2008 10:19:24 +0200 Subject: [PATCH] Make downloading the db not block the whole damn interface. --- src/magnatune.c | 39 +++++++++++++++++++++++++++++++-------- src/plugin.c | 34 +++++++++++++++++++++++++--------- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/magnatune.c b/src/magnatune.c index c2d6e18..403c3a9 100644 --- a/src/magnatune.c +++ b/src/magnatune.c @@ -12,6 +12,8 @@ static void magnatune_cleanup_xml(); static axlDoc *magnatune_xmldoc = NULL; GMutex *mt_db_lock = NULL; + + /** * Makes a copy with all &#; decoded */ @@ -277,30 +279,34 @@ static void magnatune_cleanup_xml() } } -void magnatune_db_download_xml(ProgressCallback cb, gpointer data ) + +void magnatune_db_download_xml_thread(gpointer data) { + gmpc_easy_download_struct *dld = data; - gmpc_easy_download_struct dld = {NULL, 0, -1, cb, data}; g_mutex_lock(mt_db_lock); if(magnatune_xmldoc) { axl_doc_free(magnatune_xmldoc); - + magnatune_xmldoc = NULL; } - - if(gmpc_easy_download("http://www.magnatune.com/info/album_info.xml", &dld)) + g_mutex_unlock(mt_db_lock); + if(gmpc_easy_download("http://www.magnatune.com/info/album_info.xml", dld)) { + g_mutex_lock(mt_db_lock); gchar *path = NULL; - magnatune_xmldoc = axl_doc_parse(dld.data, dld.size, NULL); + magnatune_xmldoc = axl_doc_parse(dld->data, dld->size, NULL); magnatune_cleanup_xml(); path = gmpc_get_user_path("magnatune.xml"); axl_doc_dump_to_file(magnatune_xmldoc, path); g_free(path); + g_mutex_unlock(mt_db_lock); } else { + g_mutex_lock(mt_db_lock); /* update */ gchar *path = gmpc_get_user_path("magnatune.xml"); if(g_file_test(path, G_FILE_TEST_EXISTS)) @@ -308,12 +314,29 @@ void magnatune_db_download_xml(ProgressCallback cb, gpointer data ) magnatune_xmldoc = axl_doc_parse_from_file(path, NULL); } g_free(path); + g_mutex_unlock(mt_db_lock); } /** * cleanup */ - gmpc_easy_download_clean(&dld); - g_mutex_unlock(mt_db_lock); + gmpc_easy_download_clean(dld); + g_free(dld); + + + gdk_threads_enter(); + magnatune_end_download(); + gdk_threads_leave(); +} +void magnatune_db_download_xml(ProgressCallback cb, gpointer data ) +{ + gmpc_easy_download_struct *dld = g_malloc0(sizeof(*dld)); + dld->callback_data = data; + dld->callback = cb; + dld->max_size = -1; + dld->data = NULL; + dld->size = 0; + g_thread_create(magnatune_db_download_xml_thread, dld,FALSE, NULL); + } MpdData * magnatune_db_get_artist_list(char *wanted_genre) diff --git a/src/plugin.c b/src/plugin.c index 266f3fa..da6395d 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -37,6 +37,9 @@ static void magnatune_show_song_list(GtkTreeSelection *selection, gpointer user_ static int magnatune_button_handle_release_event_tag_add(GtkWidget *button, gpointer user_data); static void magnatune_save_myself(void); static GtkTreeRowReference *magnatune_ref = NULL; + + +static int downloading = FALSE; /** * Get set enabled */ @@ -160,7 +163,7 @@ static void magnatune_mpd_status_changed(MpdObj *mi, ChangedStatusType what, v } } -static void magnatune_get_genre_list() +void magnatune_get_genre_list() { MpdData *data = NULL; data = magnatune_db_get_genre_list(); @@ -459,7 +462,8 @@ static void magnatune_selected(GtkWidget *container) { magnatune_download(); } - magnatune_get_genre_list(); + else + magnatune_get_genre_list(); } else { gtk_container_add(GTK_CONTAINER(container), magnatune_vbox); gtk_widget_show(magnatune_vbox); @@ -470,10 +474,19 @@ static void magnatune_unselected(GtkWidget *container) gtk_container_remove(GTK_CONTAINER(container), magnatune_vbox); } +void magnatune_end_download() +{ + downloading = FALSE; + + magnatune_get_genre_list(); + gtk_widget_hide(magnatune_pb); + gtk_widget_set_sensitive(glade_xml_get_widget(pl3_xml, "pl3_win"), TRUE); +} static void magnatune_download_xml_callback(int download, int total,gpointer data) { GtkWidget *pb = data; gchar *label = NULL; + gdk_threads_enter(); if(total > 0) gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pb), download/(float)total); else @@ -492,17 +505,20 @@ static void magnatune_download_xml_callback(int download, int total,gpointer dat } gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pb), label); g_free(label); - while(gtk_events_pending()) - gtk_main_iteration(); +// while(gtk_events_pending()) +// gtk_main_iteration(); + gdk_threads_leave(); } static void magnatune_download() { - gtk_widget_set_sensitive(glade_xml_get_widget(pl3_xml, "pl3_win"), FALSE); + downloading = TRUE; + // gtk_widget_set_sensitive(glade_xml_get_widget(pl3_xml, "pl3_win"), FALSE); + gmpc_mpddata_model_set_mpd_data(GMPC_MPDDATA_MODEL(gtk_tree_view_get_model(GTK_TREE_VIEW(treeviews[0]))),NULL); gtk_widget_show(magnatune_pb); magnatune_db_download_xml(magnatune_download_xml_callback, magnatune_pb); - gtk_widget_hide(magnatune_pb); - gtk_widget_set_sensitive(glade_xml_get_widget(pl3_xml, "pl3_win"), TRUE); +// gtk_widget_hide(magnatune_pb); +// gtk_widget_set_sensitive(glade_xml_get_widget(pl3_xml, "pl3_win"), TRUE); } static void magnatune_add(GtkWidget *cat_tree) @@ -637,7 +653,7 @@ static void magnatune_redownload_reload_db() gtk_list_store_remove(GTK_LIST_STORE(model), &citer); } magnatune_download(); - magnatune_get_genre_list(); + //magnatune_get_genre_list(); } if(path) gtk_tree_path_free(path); @@ -720,7 +736,7 @@ static int magnatune_cat_menu_popup(GtkWidget *menu, int type, GtkWidget *tree, { GtkWidget *item; if(type != plugin.id) return 0; - else + else if (!downloading) { /* add the clear widget */ item = gtk_image_menu_item_new_from_stock(GTK_STOCK_REFRESH,NULL); -- 2.11.4.GIT