static struct directory * directory_load_subdir(FILE *fp, struct directory *parent, const char *name, GString *buffer, GError **error_r) { struct directory *directory; const char *line; bool success; if (directory_get_child(parent, name) != NULL) { g_set_error(error_r, directory_quark(), 0, "Duplicate subdirectory '%s'", name); return NULL; } if (directory_is_root(parent)) { directory = directory_new(name, parent); } else { char *path = g_strconcat(directory_get_path(parent), "/", name, NULL); directory = directory_new(path, parent); g_free(path); } line = read_text_line(fp, buffer); if (line == NULL) { g_set_error(error_r, directory_quark(), 0, "Unexpected end of file"); directory_free(directory); return NULL; } if (g_str_has_prefix(line, DIRECTORY_MTIME)) { directory->mtime = g_ascii_strtoull(line + sizeof(DIRECTORY_MTIME) - 1, NULL, 10); line = read_text_line(fp, buffer); if (line == NULL) { g_set_error(error_r, directory_quark(), 0, "Unexpected end of file"); directory_free(directory); return NULL; } } if (!g_str_has_prefix(line, DIRECTORY_BEGIN)) { g_set_error(error_r, directory_quark(), 0, "Malformed line: %s", line); directory_free(directory); return NULL; } success = directory_load(fp, directory, buffer, error_r); if (!success) { directory_free(directory); return NULL; } return directory; }
static void simple_db_close(struct db *_db) { struct simple_db *db = (struct simple_db *)_db; assert(db->root != NULL); directory_free(db->root); }
/** * Recursively free a directory and all its contents. */ static void delete_directory(struct directory *directory) { assert(directory->parent != NULL); clear_directory(directory); dirvec_delete(&directory->parent->children, directory); directory_free(directory); }
void directory_delete(struct directory *directory) { assert(holding_db_lock()); assert(directory != NULL); assert(directory->parent != NULL); list_del(&directory->siblings); directory_free(directory); }
static void dynamic_destroy(void) { wchain_free(); songlist_free(songlist); directory_free(directory); playlist_free(playlist); visualizer_free(visualizer); }
void directory_free(struct directory *directory) { for (unsigned i = 0; i < directory->songs.nr; ++i) song_free(directory->songs.base[i]); for (unsigned i = 0; i < directory->children.nr; ++i) directory_free(directory->children.base[i]); dirvec_destroy(&directory->children); songvec_destroy(&directory->songs); g_free(directory); /* this resets last dir returned */ /*directory_get_path(NULL); */ }
void directory_free(struct directory *directory) { playlist_vector_deinit(&directory->playlists); struct song *song, *ns; directory_for_each_song_safe(song, ns, directory) song_free(song); struct directory *child, *n; directory_for_each_child_safe(child, n, directory) directory_free(child); g_free(directory); /* this resets last dir returned */ /*directory_get_path(NULL); */ }
void directory_prune_empty(struct directory *directory) { int i; struct dirvec *dv = &directory->children; for (i = dv->nr; --i >= 0; ) { struct directory *child = dv->base[i]; directory_prune_empty(child); if (directory_is_empty(child)) { dirvec_delete(dv, child); directory_free(child); } } if (!dv->nr) dirvec_destroy(dv); }
static bool simple_db_open(struct db *_db, G_GNUC_UNUSED GError **error_r) { struct simple_db *db = (struct simple_db *)_db; db->root = directory_new("", NULL); db->mtime = 0; GError *error = NULL; if (!simple_db_load(db, &error)) { directory_free(db->root); g_warning("Failed to load database: %s", error->message); g_error_free(error); if (!simple_db_check(db, error_r)) return false; db->root = directory_new("", NULL); } return true; }