diff options
Diffstat (limited to 'src/Directory.cxx')
-rw-r--r-- | src/Directory.cxx | 127 |
1 files changed, 60 insertions, 67 deletions
diff --git a/src/Directory.cxx b/src/Directory.cxx index f30eef725..8457a421b 100644 --- a/src/Directory.cxx +++ b/src/Directory.cxx @@ -56,7 +56,7 @@ directory_allocate(const char *path) } struct directory * -directory_new(const char *path, struct directory *parent) +directory::NewGeneric(const char *path, struct directory *parent) { assert(path != NULL); assert((*path == 0) == (parent == NULL)); @@ -69,124 +69,121 @@ directory_new(const char *path, struct directory *parent) } void -directory_free(struct directory *directory) +directory::Free() { - playlist_vector_deinit(&directory->playlists); + playlist_vector_deinit(&playlists); struct song *song, *ns; - directory_for_each_song_safe(song, ns, directory) + directory_for_each_song_safe(song, ns, this) song_free(song); struct directory *child, *n; - directory_for_each_child_safe(child, n, directory) - directory_free(child); + directory_for_each_child_safe(child, n, this) + child->Free(); - g_free(directory); - /* this resets last dir returned */ - /*directory_get_path(NULL); */ + g_free(this); } void -directory_delete(struct directory *directory) +directory::Delete() { assert(holding_db_lock()); - assert(directory != NULL); - assert(directory->parent != NULL); + assert(parent != nullptr); - list_del(&directory->siblings); - directory_free(directory); + list_del(&siblings); + Free(); } const char * -directory_get_name(const struct directory *directory) +directory::GetName() const { - assert(!directory_is_root(directory)); - assert(directory->path != NULL); + assert(!IsRoot()); + assert(path != nullptr); - const char *slash = strrchr(directory->path, '/'); - assert((slash == NULL) == directory_is_root(directory->parent)); + const char *slash = strrchr(path, '/'); + assert((slash == nullptr) == parent->IsRoot()); return slash != NULL ? slash + 1 - : directory->path; + : path; } struct directory * -directory_new_child(struct directory *parent, const char *name_utf8) +directory::CreateChild(const char *name_utf8) { assert(holding_db_lock()); - assert(parent != NULL); assert(name_utf8 != NULL); assert(*name_utf8 != 0); char *allocated; const char *path_utf8; - if (directory_is_root(parent)) { + if (IsRoot()) { allocated = NULL; path_utf8 = name_utf8; } else { - allocated = g_strconcat(directory_get_path(parent), + allocated = g_strconcat(GetPath(), "/", name_utf8, NULL); path_utf8 = allocated; } - struct directory *directory = directory_new(path_utf8, parent); + directory *child = NewGeneric(path_utf8, this); g_free(allocated); - list_add_tail(&directory->siblings, &parent->children); - return directory; + list_add_tail(&child->siblings, &children); + return child; } -struct directory * -directory_get_child(const struct directory *directory, const char *name) +const directory * +directory::FindChild(const char *name) const { assert(holding_db_lock()); - struct directory *child; - directory_for_each_child(child, directory) - if (strcmp(directory_get_name(child), name) == 0) + const struct directory *child; + directory_for_each_child(child, this) + if (strcmp(child->GetName(), name) == 0) return child; return NULL; } void -directory_prune_empty(struct directory *directory) +directory::PruneEmpty() { assert(holding_db_lock()); struct directory *child, *n; - directory_for_each_child_safe(child, n, directory) { - directory_prune_empty(child); + directory_for_each_child_safe(child, n, this) { + child->PruneEmpty(); - if (directory_is_empty(child)) - directory_delete(child); + if (child->IsEmpty()) + child->Delete(); } } struct directory * -directory_lookup_directory(struct directory *directory, const char *uri) +directory::LookupDirectory(const char *uri) { assert(holding_db_lock()); assert(uri != NULL); if (isRootDirectory(uri)) - return directory; + return this; char *duplicated = g_strdup(uri), *name = duplicated; + struct directory *d = this; while (1) { char *slash = strchr(name, '/'); if (slash == name) { - directory = NULL; + d = NULL; break; } if (slash != NULL) *slash = '\0'; - directory = directory_get_child(directory, name); - if (directory == NULL || slash == NULL) + d = d->FindChild(name); + if (d == NULL || slash == NULL) break; name = slash + 1; @@ -194,42 +191,38 @@ directory_lookup_directory(struct directory *directory, const char *uri) g_free(duplicated); - return directory; + return d; } void -directory_add_song(struct directory *directory, struct song *song) +directory::AddSong(struct song *song) { assert(holding_db_lock()); - assert(directory != NULL); assert(song != NULL); - assert(song->parent == directory); + assert(song->parent == this); - list_add_tail(&song->siblings, &directory->songs); + list_add_tail(&song->siblings, &songs); } void -directory_remove_song(G_GNUC_UNUSED struct directory *directory, - struct song *song) +directory::RemoveSong(struct song *song) { assert(holding_db_lock()); - assert(directory != NULL); assert(song != NULL); - assert(song->parent == directory); + assert(song->parent == this); list_del(&song->siblings); } -struct song * -directory_get_song(const struct directory *directory, const char *name_utf8) +const song * +directory::FindSong(const char *name_utf8) const { assert(holding_db_lock()); - assert(directory != NULL); assert(name_utf8 != NULL); struct song *song; - directory_for_each_song(song, directory) { - assert(song->parent == directory); + directory_for_each_song(song, this) { + assert(song->parent == this); if (strcmp(song->uri, name_utf8) == 0) return song; @@ -239,29 +232,29 @@ directory_get_song(const struct directory *directory, const char *name_utf8) } struct song * -directory_lookup_song(struct directory *directory, const char *uri) +directory::LookupSong(const char *uri) { char *duplicated, *base; assert(holding_db_lock()); - assert(directory != NULL); assert(uri != NULL); duplicated = g_strdup(uri); base = strrchr(duplicated, '/'); + struct directory *d = this; if (base != NULL) { *base++ = 0; - directory = directory_lookup_directory(directory, duplicated); - if (directory == NULL) { + d = d->LookupDirectory(duplicated); + if (d == nullptr) { g_free(duplicated); return NULL; } } else base = duplicated; - struct song *song = directory_get_song(directory, base); - assert(song == NULL || song->parent == directory); + struct song *song = d->FindSong(base); + assert(song == NULL || song->parent == d); g_free(duplicated); return song; @@ -278,16 +271,16 @@ directory_cmp(G_GNUC_UNUSED void *priv, } void -directory_sort(struct directory *directory) +directory::Sort() { assert(holding_db_lock()); - list_sort(NULL, &directory->children, directory_cmp); - song_list_sort(&directory->songs); + list_sort(NULL, &children, directory_cmp); + song_list_sort(&songs); struct directory *child; - directory_for_each_child(child, directory) - directory_sort(child); + directory_for_each_child(child, this) + child->Sort(); } bool |