static void removeDeletedFromDirectory(struct directory *directory) { int i; struct dirvec *dv = &directory->children; for (i = dv->nr; --i >= 0; ) { if (directory_exists(dv->base[i])) continue; g_debug("removing directory: %s", dv->base[i]->path); delete_directory(dv->base[i]); modified = true; } songvec_for_each(&directory->songs, delete_song_if_removed, directory); for (const struct playlist_metadata *pm = directory->playlists.head; pm != NULL;) { const struct playlist_metadata *next = pm->next; if (!directory_child_is_regular(directory, pm->name)) playlist_vector_remove(&directory->playlists, pm->name); pm = next; } }
int directory_walk(struct directory *directory, int (*forEachSong)(struct song *, void *), int (*forEachDir)(struct directory *, void *), void *data) { struct dirvec *dv = &directory->children; int err = 0; size_t j; if (forEachDir && (err = forEachDir(directory, data)) < 0) return err; if (forEachSong) { err = songvec_for_each(&directory->songs, forEachSong, data); if (err < 0) return err; } for (j = 0; err >= 0 && j < dv->nr; ++j) err = directory_walk(dv->base[j], forEachSong, forEachDir, data); return err; }
/** * Recursively remove all sub directories and songs from a directory, * leaving an empty directory. */ static void clear_directory(struct directory *directory) { int i; for (i = directory->children.nr; --i >= 0;) delete_directory(directory->children.base[i]); assert(directory->children.nr == 0); songvec_for_each(&directory->songs, delete_each_song, directory); }
static void removeDeletedFromDirectory(struct directory *directory) { int i; struct dirvec *dv = &directory->children; for (i = dv->nr; --i >= 0; ) { if (directory_exists(dv->base[i])) continue; g_debug("removing directory: %s", dv->base[i]->path); delete_directory(dv->base[i]); modified = true; } songvec_for_each(&directory->songs, delete_song_if_removed, directory); }
static void remove_excluded_from_directory(struct directory *directory, GSList *exclude_list) { int i; struct dirvec *dv = &directory->children; for (i = dv->nr; --i >= 0; ) { struct directory *child = dv->base[i]; char *name_fs = utf8_to_fs_charset(directory_get_name(child)); if (exclude_list_check(exclude_list, name_fs)) { delete_directory(child); modified = true; } g_free(name_fs); } songvec_for_each(&directory->songs, delete_song_if_excluded, exclude_list); }
int songvec_print(struct client *client, const struct songvec *sv) { return songvec_for_each(sv, song_print_info_x, client); }
void songvec_save(FILE *fp, const struct songvec *sv) { songvec_for_each(sv, song_save_callback, fp); }