directory: add function directory_get_song(), ...
Wrap songvec_find() and other songvec methods.
This commit is contained in:
parent
5f9dd8287c
commit
3c75963352
@ -177,11 +177,41 @@ directory_lookup_directory(struct directory *directory, const char *uri)
|
||||
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 *
|
||||
directory_lookup_song(struct directory *directory, const char *uri)
|
||||
{
|
||||
char *duplicated, *base;
|
||||
struct song *song;
|
||||
|
||||
assert(directory != NULL);
|
||||
assert(uri != NULL);
|
||||
@ -199,7 +229,7 @@ directory_lookup_song(struct directory *directory, const char *uri)
|
||||
} else
|
||||
base = duplicated;
|
||||
|
||||
song = songvec_find(&directory->songs, base);
|
||||
struct song *song = directory_get_song(directory, base);
|
||||
assert(song == NULL || song->parent == directory);
|
||||
|
||||
g_free(duplicated);
|
||||
|
@ -180,6 +180,28 @@ directory_prune_empty(struct directory *directory);
|
||||
struct directory *
|
||||
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.
|
||||
*
|
||||
|
@ -146,7 +146,7 @@ directory_load(FILE *fp, struct directory *directory,
|
||||
const char *name = line + sizeof(SONG_BEGIN) - 1;
|
||||
struct song *song;
|
||||
|
||||
if (songvec_find(&directory->songs, name) != NULL) {
|
||||
if (directory_get_song(directory, name) != NULL) {
|
||||
g_set_error(error, directory_quark(), 0,
|
||||
"Duplicate song '%s'", name);
|
||||
return NULL;
|
||||
@ -157,7 +157,7 @@ directory_load(FILE *fp, struct directory *directory,
|
||||
if (song == NULL)
|
||||
return false;
|
||||
|
||||
songvec_add(&directory->songs, song);
|
||||
directory_add_song(directory, song);
|
||||
} else if (g_str_has_prefix(line, PLAYLIST_META_BEGIN)) {
|
||||
/* duplicate the name, because
|
||||
playlist_metadata_load() will overwrite the
|
||||
|
@ -93,7 +93,7 @@ static void
|
||||
delete_song(struct directory *dir, struct song *del)
|
||||
{
|
||||
/* 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) */
|
||||
update_remove_song(del);
|
||||
@ -144,13 +144,13 @@ static void
|
||||
delete_name_in(struct directory *parent, const char *name)
|
||||
{
|
||||
struct directory *directory = directory_get_child(parent, name);
|
||||
struct song *song = songvec_find(&parent->songs, name);
|
||||
|
||||
if (directory != NULL) {
|
||||
delete_directory(directory);
|
||||
modified = true;
|
||||
}
|
||||
|
||||
struct song *song = directory_get_song(parent, name);
|
||||
if (song != NULL) {
|
||||
delete_song(parent, song);
|
||||
modified = true;
|
||||
@ -357,7 +357,6 @@ static void
|
||||
update_archive_tree(struct directory *directory, char *name)
|
||||
{
|
||||
struct directory *subdir;
|
||||
struct song *song;
|
||||
char *tmp;
|
||||
|
||||
tmp = strchr(name, '/');
|
||||
@ -377,11 +376,11 @@ update_archive_tree(struct directory *directory, char *name)
|
||||
return;
|
||||
}
|
||||
//add file
|
||||
song = songvec_find(&directory->songs, name);
|
||||
struct song *song = directory_get_song(directory, name);
|
||||
if (song == NULL) {
|
||||
song = song_file_load(name, directory);
|
||||
if (song != NULL) {
|
||||
songvec_add(&directory->songs, song);
|
||||
directory_add_song(directory, song);
|
||||
modified = true;
|
||||
g_message("added %s/%s",
|
||||
directory_get_path(directory), name);
|
||||
@ -499,7 +498,7 @@ update_container_file( struct directory* directory,
|
||||
song->tag = plugin->tag_dup(child_path_fs);
|
||||
g_free(child_path_fs);
|
||||
|
||||
songvec_add(&contdir->songs, song);
|
||||
directory_add_song(contdir, song);
|
||||
|
||||
modified = true;
|
||||
|
||||
@ -559,7 +558,7 @@ update_regular_file(struct directory *directory,
|
||||
|
||||
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)) {
|
||||
g_warning("no read permissions on %s/%s",
|
||||
@ -592,7 +591,7 @@ update_regular_file(struct directory *directory,
|
||||
return;
|
||||
}
|
||||
|
||||
songvec_add(&directory->songs, song);
|
||||
directory_add_song(directory, song);
|
||||
modified = true;
|
||||
g_message("added %s/%s",
|
||||
directory_get_path(directory), name);
|
||||
@ -800,7 +799,6 @@ directory_make_child_checked(struct directory *parent, const char *name_utf8)
|
||||
{
|
||||
struct directory *directory;
|
||||
struct stat st;
|
||||
struct song *conflicting;
|
||||
|
||||
directory = directory_get_child(parent, name_utf8);
|
||||
if (directory != NULL)
|
||||
@ -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
|
||||
with potentially the same name */
|
||||
conflicting = songvec_find(&parent->songs, name_utf8);
|
||||
struct song *conflicting = directory_get_song(parent, name_utf8);
|
||||
if (conflicting)
|
||||
delete_song(parent, conflicting);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user