Commit 3c759633 authored by Max Kellermann's avatar Max Kellermann

directory: add function directory_get_song(), ...

Wrap songvec_find() and other songvec methods.
parent 5f9dd828
...@@ -177,11 +177,41 @@ directory_lookup_directory(struct directory *directory, const char *uri) ...@@ -177,11 +177,41 @@ directory_lookup_directory(struct directory *directory, const char *uri)
return found; return found;
} }
void
directory_add_song(struct directory *directory, struct song *song)
{
assert(directory != NULL);
assert(song != NULL);
assert(song->parent == directory);
songvec_add(&directory->songs, song);
}
void
directory_remove_song(struct directory *directory, struct song *song)
{
assert(directory != NULL);
assert(song != NULL);
assert(song->parent == directory);
songvec_delete(&directory->songs, song);
}
struct song *
directory_get_song(const struct directory *directory, const char *name_utf8)
{
assert(directory != NULL);
assert(name_utf8 != NULL);
struct song *song = songvec_find(&directory->songs, name_utf8);
assert(song == NULL || song->parent == directory);
return song;
}
struct song * struct song *
directory_lookup_song(struct directory *directory, const char *uri) directory_lookup_song(struct directory *directory, const char *uri)
{ {
char *duplicated, *base; char *duplicated, *base;
struct song *song;
assert(directory != NULL); assert(directory != NULL);
assert(uri != NULL); assert(uri != NULL);
...@@ -199,7 +229,7 @@ directory_lookup_song(struct directory *directory, const char *uri) ...@@ -199,7 +229,7 @@ directory_lookup_song(struct directory *directory, const char *uri)
} else } else
base = duplicated; base = duplicated;
song = songvec_find(&directory->songs, base); struct song *song = directory_get_song(directory, base);
assert(song == NULL || song->parent == directory); assert(song == NULL || song->parent == directory);
g_free(duplicated); g_free(duplicated);
......
...@@ -181,6 +181,28 @@ struct directory * ...@@ -181,6 +181,28 @@ struct directory *
directory_lookup_directory(struct directory *directory, const char *uri); directory_lookup_directory(struct directory *directory, const char *uri);
/** /**
* Add a song object to this directory. Its "parent" attribute must
* be set already.
*/
void
directory_add_song(struct directory *directory, struct song *song);
/**
* Remove a song object from this directory (which effectively
* invalidates the song object, because the "parent" attribute becomes
* stale), but does not free it.
*/
void
directory_remove_song(struct directory *directory, struct song *song);
/**
* Look up a song in this directory by its name.
*/
G_GNUC_PURE
struct song *
directory_get_song(const struct directory *directory, const char *name_utf8);
/**
* Looks up a song by its relative URI. * Looks up a song by its relative URI.
* *
* @param directory the parent (or grandparent, ...) directory * @param directory the parent (or grandparent, ...) directory
......
...@@ -146,7 +146,7 @@ directory_load(FILE *fp, struct directory *directory, ...@@ -146,7 +146,7 @@ directory_load(FILE *fp, struct directory *directory,
const char *name = line + sizeof(SONG_BEGIN) - 1; const char *name = line + sizeof(SONG_BEGIN) - 1;
struct song *song; struct song *song;
if (songvec_find(&directory->songs, name) != NULL) { if (directory_get_song(directory, name) != NULL) {
g_set_error(error, directory_quark(), 0, g_set_error(error, directory_quark(), 0,
"Duplicate song '%s'", name); "Duplicate song '%s'", name);
return NULL; return NULL;
...@@ -157,7 +157,7 @@ directory_load(FILE *fp, struct directory *directory, ...@@ -157,7 +157,7 @@ directory_load(FILE *fp, struct directory *directory,
if (song == NULL) if (song == NULL)
return false; return false;
songvec_add(&directory->songs, song); directory_add_song(directory, song);
} else if (g_str_has_prefix(line, PLAYLIST_META_BEGIN)) { } else if (g_str_has_prefix(line, PLAYLIST_META_BEGIN)) {
/* duplicate the name, because /* duplicate the name, because
playlist_metadata_load() will overwrite the playlist_metadata_load() will overwrite the
......
...@@ -93,7 +93,7 @@ static void ...@@ -93,7 +93,7 @@ static void
delete_song(struct directory *dir, struct song *del) delete_song(struct directory *dir, struct song *del)
{ {
/* first, prevent traversers in main task from getting this */ /* first, prevent traversers in main task from getting this */
songvec_delete(&dir->songs, del); directory_remove_song(dir, del);
/* now take it out of the playlist (in the main_task) */ /* now take it out of the playlist (in the main_task) */
update_remove_song(del); update_remove_song(del);
...@@ -144,13 +144,13 @@ static void ...@@ -144,13 +144,13 @@ static void
delete_name_in(struct directory *parent, const char *name) delete_name_in(struct directory *parent, const char *name)
{ {
struct directory *directory = directory_get_child(parent, name); struct directory *directory = directory_get_child(parent, name);
struct song *song = songvec_find(&parent->songs, name);
if (directory != NULL) { if (directory != NULL) {
delete_directory(directory); delete_directory(directory);
modified = true; modified = true;
} }
struct song *song = directory_get_song(parent, name);
if (song != NULL) { if (song != NULL) {
delete_song(parent, song); delete_song(parent, song);
modified = true; modified = true;
...@@ -357,7 +357,6 @@ static void ...@@ -357,7 +357,6 @@ static void
update_archive_tree(struct directory *directory, char *name) update_archive_tree(struct directory *directory, char *name)
{ {
struct directory *subdir; struct directory *subdir;
struct song *song;
char *tmp; char *tmp;
tmp = strchr(name, '/'); tmp = strchr(name, '/');
...@@ -377,11 +376,11 @@ update_archive_tree(struct directory *directory, char *name) ...@@ -377,11 +376,11 @@ update_archive_tree(struct directory *directory, char *name)
return; return;
} }
//add file //add file
song = songvec_find(&directory->songs, name); struct song *song = directory_get_song(directory, name);
if (song == NULL) { if (song == NULL) {
song = song_file_load(name, directory); song = song_file_load(name, directory);
if (song != NULL) { if (song != NULL) {
songvec_add(&directory->songs, song); directory_add_song(directory, song);
modified = true; modified = true;
g_message("added %s/%s", g_message("added %s/%s",
directory_get_path(directory), name); directory_get_path(directory), name);
...@@ -499,7 +498,7 @@ update_container_file( struct directory* directory, ...@@ -499,7 +498,7 @@ update_container_file( struct directory* directory,
song->tag = plugin->tag_dup(child_path_fs); song->tag = plugin->tag_dup(child_path_fs);
g_free(child_path_fs); g_free(child_path_fs);
songvec_add(&contdir->songs, song); directory_add_song(contdir, song);
modified = true; modified = true;
...@@ -559,7 +558,7 @@ update_regular_file(struct directory *directory, ...@@ -559,7 +558,7 @@ update_regular_file(struct directory *directory,
if ((plugin = decoder_plugin_from_suffix(suffix, false)) != NULL) if ((plugin = decoder_plugin_from_suffix(suffix, false)) != NULL)
{ {
struct song* song = songvec_find(&directory->songs, name); struct song *song = directory_get_song(directory, name);
if (!directory_child_access(directory, name, R_OK)) { if (!directory_child_access(directory, name, R_OK)) {
g_warning("no read permissions on %s/%s", g_warning("no read permissions on %s/%s",
...@@ -592,7 +591,7 @@ update_regular_file(struct directory *directory, ...@@ -592,7 +591,7 @@ update_regular_file(struct directory *directory,
return; return;
} }
songvec_add(&directory->songs, song); directory_add_song(directory, song);
modified = true; modified = true;
g_message("added %s/%s", g_message("added %s/%s",
directory_get_path(directory), name); directory_get_path(directory), name);
...@@ -800,7 +799,6 @@ directory_make_child_checked(struct directory *parent, const char *name_utf8) ...@@ -800,7 +799,6 @@ directory_make_child_checked(struct directory *parent, const char *name_utf8)
{ {
struct directory *directory; struct directory *directory;
struct stat st; struct stat st;
struct song *conflicting;
directory = directory_get_child(parent, name_utf8); directory = directory_get_child(parent, name_utf8);
if (directory != NULL) if (directory != NULL)
...@@ -812,7 +810,7 @@ directory_make_child_checked(struct directory *parent, const char *name_utf8) ...@@ -812,7 +810,7 @@ directory_make_child_checked(struct directory *parent, const char *name_utf8)
/* if we're adding directory paths, make sure to delete filenames /* if we're adding directory paths, make sure to delete filenames
with potentially the same name */ with potentially the same name */
conflicting = songvec_find(&parent->songs, name_utf8); struct song *conflicting = directory_get_song(parent, name_utf8);
if (conflicting) if (conflicting)
delete_song(parent, conflicting); delete_song(parent, conflicting);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment