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;
|
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)
|
|||||||
} 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);
|
||||||
|
@ -180,6 +180,28 @@ directory_prune_empty(struct directory *directory);
|
|||||||
struct directory *
|
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.
|
||||||
*
|
*
|
||||||
|
@ -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,
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
|
|
||||||
/* 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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user