From c51e1bf1c093f823fca3ecbf3fe87e1ce1c6059a Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 1 Apr 2009 18:44:26 +0200 Subject: song_sticker: added song_sticker_find() This is a wrapper for sticker_find(), which looks up the song object. --- src/song_sticker.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/song_sticker.h | 16 +++++++++++++++ 2 files changed, 76 insertions(+) (limited to 'src') diff --git a/src/song_sticker.c b/src/song_sticker.c index 54792678a..131519bcd 100644 --- a/src/song_sticker.c +++ b/src/song_sticker.c @@ -19,11 +19,13 @@ #include "song_sticker.h" #include "song.h" +#include "directory.h" #include "sticker.h" #include #include +#include char * sticker_song_get_value(const struct song *song, const char *name) @@ -88,3 +90,61 @@ sticker_song_get(const struct song *song) return sticker; } + +struct sticker_song_find_data { + struct directory *directory; + const char *base_uri; + size_t base_uri_length; + + void (*func)(struct song *song, const char *value, + gpointer user_data); + gpointer user_data; +}; + +static void +sticker_song_find_cb(const char *uri, const char *value, gpointer user_data) +{ + struct sticker_song_find_data *data = user_data; + struct song *song; + + if (memcmp(uri, data->base_uri, data->base_uri_length) != 0) + /* should not happen, ignore silently */ + return; + + song = directory_lookup_song(data->directory, + uri + data->base_uri_length); + if (song != NULL) + data->func(song, value, data->user_data); +} + +bool +sticker_song_find(struct directory *directory, const char *name, + void (*func)(struct song *song, const char *value, + gpointer user_data), + gpointer user_data) +{ + struct sticker_song_find_data data = { + .directory = directory, + .func = func, + .user_data = user_data, + }; + char *allocated; + bool success; + + data.base_uri = directory_get_path(directory); + if (*data.base_uri != 0) + /* append slash to base_uri */ + data.base_uri = allocated = + g_strconcat(data.base_uri, "/", NULL); + else + /* searching in root directory - no trailing slash */ + allocated = NULL; + + data.base_uri_length = strlen(data.base_uri); + + success = sticker_find("song", data.base_uri, name, + sticker_song_find_cb, &data); + g_free(allocated); + + return success; +} diff --git a/src/song_sticker.h b/src/song_sticker.h index 9b32c9215..435e4c935 100644 --- a/src/song_sticker.h +++ b/src/song_sticker.h @@ -24,6 +24,7 @@ #include struct song; +struct directory; struct sticker; /** @@ -56,4 +57,19 @@ sticker_song_delete(const struct song *song); struct sticker * sticker_song_get(const struct song *song); +/** + * Finds stickers with the specified name below the specified + * directory. + * + * @param directory the base directory to search in + * @param name the name of the sticker + * @return true on success (even if no sticker was found), false on + * failure + */ +bool +sticker_song_find(struct directory *directory, const char *name, + void (*func)(struct song *song, const char *value, + gpointer user_data), + gpointer user_data); + #endif -- cgit v1.2.3