GList * pragha_dnd_plain_text_get_mobj_list (GtkSelectionData *data) { PraghaMusicobject *mobj = NULL; gchar *filename = NULL; GList *list = NULL; CDEBUG(DBG_VERBOSE, "Target: PLAIN_TEXT"); filename = (gchar*)gtk_selection_data_get_text(data); if (g_file_test(filename, G_FILE_TEST_IS_DIR)) { list = append_mobj_list_from_folder(list, filename); } else { mobj = new_musicobject_from_file(filename, NULL); if (G_LIKELY(mobj)) list = g_list_prepend(list, mobj); /* Have to give control to GTK periodically ... */ pragha_process_gtk_events (); } g_free(filename); return g_list_reverse (list); }
GList * append_mobj_list_from_unknown_filename(GList *list, gchar *filename) { PraghaMusicobject *mobj; PraghaMediaType file_type; if (is_dir_and_accessible(filename)) { list = append_mobj_list_from_folder (list, filename); } else { file_type = pragha_file_get_media_type (filename); switch (file_type) { case MEDIA_TYPE_AUDIO: mobj = new_musicobject_from_file (filename); if (G_LIKELY(mobj)) { list = g_list_append(list, mobj); add_recent_file(filename); } break; case MEDIA_TYPE_PLAYLIST: list = pragha_pl_parser_append_mobj_list_by_extension (list, filename); break; case MEDIA_TYPE_IMAGE: case MEDIA_TYPE_UNKNOWN: default: break; } } /* Have to give control to GTK periodically ... */ pragha_process_gtk_events (); return list; }
GList * pragha_dnd_uri_list_get_mobj_list (GtkSelectionData *data) { PraghaMusicobject *mobj = NULL; gchar **uris = NULL, *filename = NULL; GList *list = NULL; gint i = 0; CDEBUG(DBG_VERBOSE, "Target: URI_LIST"); uris = gtk_selection_data_get_uris(data); if(uris){ for(i = 0; uris[i] != NULL; i++) { filename = g_filename_from_uri(uris[i], NULL, NULL); if (g_file_test(filename, G_FILE_TEST_IS_DIR)){ list = append_mobj_list_from_folder(list, filename); } else { mobj = new_musicobject_from_file(filename, NULL); if (G_LIKELY(mobj)) list = g_list_prepend(list, mobj); } /* Have to give control to GTK periodically ... */ pragha_process_gtk_events (); g_free(filename); } g_strfreev(uris); } return g_list_reverse (list); }
static void dbus_add_file(DBusMessage *msg, struct con_win *cwin) { gchar *file; DBusError error; struct musicobject *mobj = NULL; dbus_error_init(&error); dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &file, DBUS_TYPE_INVALID); if (dbus_error_is_set(&error)) { g_critical("Unable to get file name out of add file signal"); dbus_error_free(&error); return; } gdk_threads_enter(); if (is_dir_and_accessible(file, cwin)) { if(cwin->cpref->add_recursively_files) __recur_add(file, cwin); else __non_recur_add(file, TRUE, cwin); } else if (is_playable_file(file)) { mobj = new_musicobject_from_file(file); if (mobj) append_current_playlist(mobj, cwin); CDEBUG(DBG_INFO, "Add file from command line: %s", file); } else { g_warning("Unable to add %s", file); } gdk_threads_leave(); }
static void pragha_scanner_scan_handler(PraghaScanner *scanner, const gchar *dir_name) { GDir *dir; const gchar *next_file = NULL; gchar *ab_file; GError *error = NULL; PraghaMusicobject *mobj = NULL; PraghaMediaType file_type; if(g_cancellable_is_cancelled (scanner->cancellable)) return; dir = g_dir_open(dir_name, 0, &error); if (!dir) { g_critical("Unable to open library : %s", dir_name); return; } next_file = g_dir_read_name(dir); while (next_file) { if(g_cancellable_is_cancelled (scanner->cancellable)) { g_dir_close(dir); return; } ab_file = g_strconcat(dir_name, G_DIR_SEPARATOR_S, next_file, NULL); if (g_file_test(ab_file, G_FILE_TEST_IS_DIR)) pragha_scanner_scan_handler(scanner, ab_file); else { file_type = pragha_file_get_media_type (ab_file); switch (file_type) { case MEDIA_TYPE_AUDIO: mobj = new_musicobject_from_file(ab_file); if (G_LIKELY(mobj)) g_hash_table_insert(scanner->tracks_table, g_strdup(pragha_musicobject_get_file(mobj)), mobj); break; case MEDIA_TYPE_PLAYLIST: scanner->playlists = g_slist_prepend (scanner->playlists, g_strdup(ab_file)); break; case MEDIA_TYPE_IMAGE: case MEDIA_TYPE_UNKNOWN: default: break; } g_mutex_lock (&scanner->files_scanned_mutex); scanner->files_scanned++; g_mutex_unlock (&scanner->files_scanned_mutex); } g_free(ab_file); next_file = g_dir_read_name(dir); } g_dir_close(dir); }
GList * append_mobj_list_from_folder(GList *list, gchar *dir_name) { PraghaPreferences *preferences; PraghaMusicobject *mobj = NULL; PraghaMediaType file_type; GDir *dir; const gchar *next_file = NULL; gchar *ab_file; GError *error = NULL; dir = g_dir_open(dir_name, 0, &error); if (!dir) { g_critical("Unable to open library : %s", dir_name); return list; } next_file = g_dir_read_name(dir); while (next_file) { ab_file = g_strconcat(dir_name, G_DIR_SEPARATOR_S, next_file, NULL); if (is_dir_and_accessible(ab_file)) { preferences = pragha_preferences_get(); if(pragha_preferences_get_add_recursively(preferences)) list = append_mobj_list_from_folder(list, ab_file); g_object_unref(G_OBJECT(preferences)); } else { file_type = pragha_file_get_media_type (ab_file); switch (file_type) { case MEDIA_TYPE_AUDIO: mobj = new_musicobject_from_file (ab_file); if (G_LIKELY(mobj)) list = g_list_append(list, mobj); break; case MEDIA_TYPE_PLAYLIST: list = pragha_pl_parser_append_mobj_list_by_extension (list, ab_file); break; case MEDIA_TYPE_IMAGE: case MEDIA_TYPE_UNKNOWN: default: break; } } /* Have to give control to GTK periodically ... */ pragha_process_gtk_events (); g_free(ab_file); next_file = g_dir_read_name(dir); } g_dir_close(dir); return list; }
GList * append_mobj_list_from_folder(GList *list, gchar *dir_name) { PraghaPreferences *preferences; PraghaMusicobject *mobj = NULL; GDir *dir; const gchar *next_file = NULL; gchar *ab_file; GError *error = NULL; dir = g_dir_open(dir_name, 0, &error); if (!dir) { g_critical("Unable to open library : %s", dir_name); return list; } next_file = g_dir_read_name(dir); while (next_file) { ab_file = g_strconcat(dir_name, G_DIR_SEPARATOR_S, next_file, NULL); if (is_dir_and_accessible(ab_file)) { preferences = pragha_preferences_get(); if(pragha_preferences_get_add_recursively(preferences)) list = append_mobj_list_from_folder(list, ab_file); g_object_unref(G_OBJECT(preferences)); } else { if (is_playable_file(ab_file)) { mobj = new_musicobject_from_file(ab_file); if (G_LIKELY(mobj)) list = g_list_append(list, mobj); } } /* Have to give control to GTK periodically ... */ pragha_process_gtk_events (); g_free(ab_file); next_file = g_dir_read_name(dir); } g_dir_close(dir); return list; }
gint tag_edit_dialog(struct tags *otag, struct tags *ntag, gchar *file, struct con_win *cwin) { GtkWidget *dialog; GtkWidget *tag_table; GtkWidget *label_title, *label_artist, *label_album, *label_genre, *label_tno, *label_year, *label_comment, *label_file; GtkWidget *chk_title, *chk_artist, *chk_album, *chk_genre, *chk_tno, *chk_year, *chk_comment; GtkWidget *entry_title, *entry_artist, *entry_album, *entry_genre, *entry_tno, *entry_year, *entry_comment, *entry_file; GtkWidget *hbox_title, *hbox_artist, *hbox_album, *hbox_genre, *hbox_tno, *hbox_year, *hbox_comment; GtkWidget *hbox_spins, *comment_view_scroll, *chk_alignment; GtkTextBuffer *buffer; GtkTextIter start, end; gpointer storage; gint location_id, result, changed = 0; struct musicobject *mobj = NULL; gchar *uri = NULL; /*Create table*/ tag_table = gtk_table_new(8, 2, FALSE); gtk_table_set_col_spacings(GTK_TABLE(tag_table), 5); gtk_table_set_row_spacings(GTK_TABLE(tag_table), 5); gtk_container_set_border_width(GTK_CONTAINER(tag_table), 5); /* Create labels */ label_title = gtk_label_new(_("Title")); label_artist = gtk_label_new(_("Artist")); label_album = gtk_label_new(_("Album")); label_genre = gtk_label_new(_("Genre")); label_tno = gtk_label_new(_("Track No")); label_year = gtk_label_new(_("Year")); label_comment = gtk_label_new(_("Comment")); label_file = gtk_label_new(_("File")); gtk_misc_set_alignment(GTK_MISC (label_title), 1, 0.5); gtk_misc_set_alignment(GTK_MISC (label_artist), 1, 0.5); gtk_misc_set_alignment(GTK_MISC (label_album), 1, 0.5); gtk_misc_set_alignment(GTK_MISC (label_genre), 1, 0.5); gtk_misc_set_alignment(GTK_MISC (label_tno), 1, 0.5); gtk_misc_set_alignment(GTK_MISC (label_year), 1, 0.5); gtk_misc_set_alignment(GTK_MISC (label_comment), 1, 0); gtk_misc_set_alignment(GTK_MISC (label_file), 1, 0.5); /* Create entry fields */ entry_title = gtk_entry_new(); entry_artist = gtk_entry_new(); entry_album = gtk_entry_new(); entry_genre = gtk_entry_new(); entry_tno = gtk_spin_button_new_with_range (0, 2030, 1); entry_year = gtk_spin_button_new_with_range (0, 2030, 1); entry_comment = gtk_text_view_new(); gtk_text_view_set_accepts_tab (GTK_TEXT_VIEW (entry_comment), FALSE); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (entry_comment)); entry_file = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(entry_title), TAG_MAX_LEN); gtk_entry_set_max_length(GTK_ENTRY(entry_artist), TAG_MAX_LEN); gtk_entry_set_max_length(GTK_ENTRY(entry_album), TAG_MAX_LEN); gtk_entry_set_max_length(GTK_ENTRY(entry_genre), TAG_MAX_LEN); gtk_entry_set_completion(GTK_ENTRY(entry_artist), cwin->completion[0]); gtk_entry_set_completion(GTK_ENTRY(entry_album), cwin->completion[1]); gtk_entry_set_completion(GTK_ENTRY(entry_genre), cwin->completion[2]); gtk_entry_set_icon_from_stock (GTK_ENTRY(entry_title), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); gtk_entry_set_icon_from_stock (GTK_ENTRY(entry_artist), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); gtk_entry_set_icon_from_stock (GTK_ENTRY(entry_album), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); gtk_entry_set_icon_from_stock (GTK_ENTRY(entry_genre), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); gtk_entry_set_icon_from_stock (GTK_ENTRY(entry_file), GTK_ENTRY_ICON_PRIMARY, GTK_STOCK_DIRECTORY); gtk_entry_set_icon_from_stock (GTK_ENTRY(entry_file), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_JUMP_TO); gtk_entry_set_editable (GTK_ENTRY(entry_file), FALSE); /* Create checkboxes */ chk_title = gtk_check_button_new(); chk_artist = gtk_check_button_new(); chk_album = gtk_check_button_new(); chk_genre = gtk_check_button_new(); chk_year = gtk_check_button_new(); chk_tno = gtk_check_button_new(); chk_comment = gtk_check_button_new(); hbox_title = gtk_hbox_new(FALSE, 0); hbox_artist = gtk_hbox_new(FALSE, 0); hbox_album = gtk_hbox_new(FALSE, 0); hbox_genre = gtk_hbox_new(FALSE, 0); hbox_year = gtk_hbox_new(FALSE, 0); hbox_tno = gtk_hbox_new(FALSE, 0); hbox_comment = gtk_hbox_new(FALSE, 0); hbox_spins = gtk_hbox_new(FALSE, 5); /* Create hobxs(ENTRY CHECHK) and attach in table */ gtk_box_pack_start(GTK_BOX(hbox_title), entry_title, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_title), chk_title, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE (tag_table), label_title, 0, 1, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_table_attach(GTK_TABLE (tag_table), hbox_title, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 0, 0); gtk_box_pack_start(GTK_BOX(hbox_artist), entry_artist, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_artist), chk_artist, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE (tag_table), label_artist, 0, 1, 1, 2, GTK_FILL, GTK_SHRINK, 0, 0); gtk_table_attach(GTK_TABLE (tag_table), hbox_artist, 1, 2, 1, 2, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 0, 0); gtk_box_pack_start(GTK_BOX(hbox_album), entry_album, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_album), chk_album, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE (tag_table), label_album, 0, 1, 2, 3, GTK_FILL, GTK_SHRINK, 0, 0); gtk_table_attach(GTK_TABLE (tag_table), hbox_album, 1, 2, 2, 3, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 0, 0); gtk_box_pack_start(GTK_BOX(hbox_genre), entry_genre, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_genre), chk_genre, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE (tag_table), label_genre, 0, 1, 3, 4, GTK_FILL, GTK_SHRINK, 0, 0); gtk_table_attach(GTK_TABLE (tag_table), hbox_genre, 1, 2, 3, 4, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 0, 0); gtk_box_pack_start(GTK_BOX(hbox_tno), entry_tno, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_tno), chk_tno, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox_year), label_year, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox_year), entry_year, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_year), chk_year, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox_spins), hbox_tno, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_spins), hbox_year, TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE (tag_table), label_tno, 0, 1, 4, 5, GTK_FILL, GTK_SHRINK, 0, 0); gtk_table_attach(GTK_TABLE (tag_table), hbox_spins, 1, 2, 4, 5, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 0, 0); comment_view_scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(comment_view_scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(comment_view_scroll), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(comment_view_scroll), entry_comment); chk_alignment = gtk_alignment_new(0.5, 0, 0, 0); gtk_container_add(GTK_CONTAINER(chk_alignment), chk_comment); gtk_box_pack_start(GTK_BOX(hbox_comment), comment_view_scroll, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_comment), chk_alignment, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE (tag_table), label_comment, 0, 1, 5, 7, GTK_FILL, GTK_FILL|GTK_EXPAND, 0, 0); gtk_table_attach(GTK_TABLE (tag_table), hbox_comment, 1, 2, 5, 7, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); gtk_table_attach(GTK_TABLE (tag_table), label_file, 0, 1, 7, 8, GTK_FILL, GTK_SHRINK, 0, 0); gtk_table_attach(GTK_TABLE (tag_table), entry_file, 1, 2, 7, 8, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 0, 0); /* The main edit dialog */ dialog = gtk_dialog_new_with_buttons(_("Edit tags"), GTK_WINDOW(cwin->mainwindow), GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_window_set_default_size(GTK_WINDOW (dialog), 450, -1); /* Add to the dialog's main vbox */ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), tag_table); /* Fill in initial entries */ if (otag->title) gtk_entry_set_text(GTK_ENTRY(entry_title), otag->title); if (otag->artist) gtk_entry_set_text(GTK_ENTRY(entry_artist), otag->artist); if (otag->album) gtk_entry_set_text(GTK_ENTRY(entry_album), otag->album); if (otag->genre) gtk_entry_set_text(GTK_ENTRY(entry_genre), otag->genre); if (otag->track_no > 0) gtk_spin_button_set_value(GTK_SPIN_BUTTON(entry_tno), (int)otag->track_no); if (otag->year > 0) gtk_spin_button_set_value(GTK_SPIN_BUTTON(entry_year), (int)otag->year); if (otag->comment) gtk_text_buffer_set_text (buffer, otag->comment, -1); if (file) { gtk_entry_set_text(GTK_ENTRY(entry_file), file); gtk_editable_set_position(GTK_EDITABLE(entry_file), strlen(file)); gtk_dialog_add_button(GTK_DIALOG(dialog), _("Details"), GTK_RESPONSE_HELP); } else gtk_widget_set_sensitive(GTK_WIDGET(entry_file), FALSE); /* Connect to check the save changes when change the entry. */ g_signal_connect(G_OBJECT(entry_title), "changed", G_CALLBACK(check_entry), chk_title); g_signal_connect(G_OBJECT(entry_artist), "changed", G_CALLBACK(check_entry), chk_artist); g_signal_connect(G_OBJECT(entry_album), "changed", G_CALLBACK(check_entry), chk_album); g_signal_connect(G_OBJECT(entry_genre), "changed", G_CALLBACK(check_entry), chk_genre); g_signal_connect(G_OBJECT(entry_tno), "changed", G_CALLBACK(check_entry), chk_tno); g_signal_connect(G_OBJECT(entry_year), "changed", G_CALLBACK(check_entry), chk_year); g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK(check_entry), chk_comment); /* Save changes when press enter. */ gtk_entry_set_activates_default (GTK_ENTRY(entry_title), TRUE); gtk_entry_set_activates_default (GTK_ENTRY(entry_artist), TRUE); gtk_entry_set_activates_default (GTK_ENTRY(entry_album), TRUE); gtk_entry_set_activates_default (GTK_ENTRY(entry_genre), TRUE); gtk_entry_set_activates_default (GTK_ENTRY(entry_tno), TRUE); gtk_entry_set_activates_default (GTK_ENTRY(entry_year), TRUE); /* Connect to set clear check when click the icon. */ g_signal_connect (G_OBJECT(entry_title), "icon-press", G_CALLBACK (clear_pressed), NULL); g_signal_connect (G_OBJECT(entry_artist), "icon-press", G_CALLBACK (clear_pressed), NULL); g_signal_connect (G_OBJECT(entry_album), "icon-press", G_CALLBACK (clear_pressed), NULL); g_signal_connect (G_OBJECT(entry_genre), "icon-press", G_CALLBACK (clear_pressed), NULL); g_signal_connect (G_OBJECT(entry_file), "icon-press", G_CALLBACK (directory_pressed), file); /* Genereate storage of gtk_entry and cwin, * and add popup menu to copy selection to tags. */ storage = g_object_new(G_TYPE_OBJECT, NULL); g_object_set_data(storage, "entry_title", entry_title); g_object_set_data(storage, "entry_artist", entry_artist); g_object_set_data(storage, "entry_album", entry_album); g_object_set_data(storage, "entry_genre", entry_genre); g_object_set_data(storage, "entry_comment", entry_comment); g_object_set_data(storage, "entry_file", entry_file); g_object_set_data(storage, "cwin", cwin); g_signal_connect (G_OBJECT(entry_file), "populate-popup", G_CALLBACK (file_entry_populate_popup), storage); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_widget_show_all(dialog); while ((result = gtk_dialog_run (GTK_DIALOG (dialog))) && (result != GTK_RESPONSE_CANCEL) && (result != GTK_RESPONSE_OK) && (result != GTK_RESPONSE_DELETE_EVENT)) { if(result == GTK_RESPONSE_HELP){ if (g_str_has_prefix(file, "cdda://")) mobj = new_musicobject_from_cdda(cwin, otag->track_no); else { uri = sanitize_string_sqlite3(file); if ((location_id = find_location_db(uri, cwin))) mobj = new_musicobject_from_db(location_id, cwin); else mobj = new_musicobject_from_file(file); } track_properties(mobj, cwin); } } switch (result) { case GTK_RESPONSE_OK: if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_tno))) { ntag->track_no = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(entry_tno)); changed |= TAG_TNO_CHANGED; } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_title))) { ntag->title = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry_title))); changed |= TAG_TITLE_CHANGED; } if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_artist))) { ntag->artist = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry_artist))); changed |= TAG_ARTIST_CHANGED; } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_album))) { ntag->album = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry_album))); changed |= TAG_ALBUM_CHANGED; } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_genre))) { ntag->genre = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry_genre))); changed |= TAG_GENRE_CHANGED; } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_year))) { ntag->year = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(entry_year)); changed |= TAG_YEAR_CHANGED; } if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_comment))) { gtk_text_buffer_get_start_iter (buffer, &start); gtk_text_buffer_get_end_iter (buffer, &end); ntag->comment = g_strdup(gtk_text_buffer_get_text (buffer, &start, &end, FALSE)); changed |= TAG_COMMENT_CHANGED; } break; case GTK_RESPONSE_DELETE_EVENT: break; case GTK_RESPONSE_CANCEL: break; default: break; } gtk_widget_destroy(dialog); if (mobj) delete_musicobject(mobj); g_free(uri); return changed; }
static void pragha_scanner_update_handler(PraghaScanner *scanner, const gchar *dir_name) { GDir *dir; const gchar *next_file = NULL; gchar *ab_file = NULL, *s_ab_file = NULL; GError *error = NULL; struct stat sbuf; PraghaMusicobject *mobj = NULL; if(g_cancellable_is_cancelled (scanner->cancellable)) return; dir = g_dir_open(dir_name, 0, &error); if (!dir) { g_critical("Unable to open library : %s", dir_name); return; } next_file = g_dir_read_name(dir); while (next_file) { if(g_cancellable_is_cancelled (scanner->cancellable)) return; ab_file = g_strconcat(dir_name, G_DIR_SEPARATOR_S, next_file, NULL); if (g_file_test(ab_file, G_FILE_TEST_IS_DIR)) { pragha_scanner_update_handler(scanner, ab_file); } else { mobj = g_hash_table_lookup(scanner->tracks_table, ab_file); if(!mobj) { mobj = new_musicobject_from_file(ab_file); if (G_LIKELY(mobj)) g_hash_table_insert(scanner->tracks_table, g_strdup(pragha_musicobject_get_file(mobj)), mobj); } else { if ((g_stat(ab_file, &sbuf) == 0) && (sbuf.st_mtime > scanner->last_update.tv_sec)) { mobj = new_musicobject_from_file(ab_file); if (G_LIKELY(mobj)) { g_hash_table_replace(scanner->tracks_table, g_strdup(pragha_musicobject_get_file(mobj)), mobj); } } } g_mutex_lock (&scanner->files_scanned_mutex); scanner->files_scanned++; g_mutex_unlock (&scanner->files_scanned_mutex); g_free(s_ab_file); } g_free(ab_file); next_file = g_dir_read_name(dir); } g_dir_close(dir); }