summaryrefslogtreecommitdiff
path: root/libjuicer
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2012-05-20 11:36:00 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2012-06-16 11:41:55 +0200
commitd674cddb00e8c086574730d75a3e4208b8713dc0 (patch)
tree268244b41a03cac0e48f78a35e67bef1fabd2c45 /libjuicer
parent10d6dba86ca2a31d28760dad9e69e2c3f8df1874 (diff)
Factor code iterating over relations
fill_work_relations and fill_recording_relations are using the same code to iterate over the relations contained in a RelationListList. This commit moves the common code in a helper function and changes these 2 functions to use it. https://bugzilla.gnome.org/show_bug.cgi?id=661646
Diffstat (limited to 'libjuicer')
-rw-r--r--libjuicer/sj-metadata-musicbrainz4.c88
1 files changed, 39 insertions, 49 deletions
diff --git a/libjuicer/sj-metadata-musicbrainz4.c b/libjuicer/sj-metadata-musicbrainz4.c
index e6b7485..087f79a 100644
--- a/libjuicer/sj-metadata-musicbrainz4.c
+++ b/libjuicer/sj-metadata-musicbrainz4.c
@@ -228,93 +228,83 @@ fill_relations (Mb4RelationList relations, AlbumDetails *album)
}
}
-static void
-fill_work_relations (Mb4Work work, TrackDetails *track)
+typedef void (*RelationForeachFunc)(Mb4Relation relation, gpointer user_data);
+
+static void relationlist_list_foreach_relation(Mb4RelationListList relation_lists,
+ const char *targettype,
+ const char *relation_type,
+ RelationForeachFunc callback,
+ gpointer user_data)
{
- Mb4RelationListList relation_lists;
unsigned int j;
- if (work == NULL)
- return;
-
- relation_lists = mb4_work_get_relationlistlist (work);
if (relation_lists == NULL)
return;
for (j = 0; j < mb4_relationlist_list_size (relation_lists); j++) {
Mb4RelationList relations;
- char buffer[512]; /* for the GET() macro */
+ char type[512]; /* To hold relationlist target-type and relation type */
unsigned int i;
relations = mb4_relationlist_list_item (relation_lists, j);
if (relations == NULL)
return;
- mb4_relation_list_get_targettype (relations, buffer, sizeof (buffer));
- if (!g_str_equal (buffer, "artist"))
+ mb4_relation_list_get_targettype (relations, type, sizeof (type));
+ if (!g_str_equal (type, targettype))
continue;
for (i = 0; i < mb4_relation_list_size (relations); i++) {
Mb4Relation relation;
- Mb4Artist composer;
relation = mb4_relation_list_item (relations, i);
if (relation == NULL)
continue;
- mb4_relation_get_type (relation, buffer, sizeof (buffer));
- if (!g_str_equal (buffer, "composer"))
+ mb4_relation_get_type (relation, type, sizeof (type));
+ if (!g_str_equal (type, relation_type))
continue;
+ callback(relation, user_data);
+ }
+ }
+}
+
+static void composer_cb (Mb4Relation relation, gpointer user_data)
+{
+ Mb4Artist composer;
+ TrackDetails *track = (TrackDetails *)user_data;
+ char buffer[512]; /* for the GET() macro */
+
composer = mb4_relation_get_artist (relation);
if (composer == NULL)
- continue;
+ return;
GET (track->composer, mb4_artist_get_name, composer);
GET (track->composer_sortname, mb4_artist_get_sortname, composer);
- }
- }
+}
+
+static void work_cb (Mb4Relation relation, gpointer user_data)
+{
+ Mb4RelationListList relation_lists;
+ Mb4Work work;
+
+ work = mb4_relation_get_work (relation);
+ if (work == NULL)
+ return;
+ relation_lists = mb4_work_get_relationlistlist (work);
+ relationlist_list_foreach_relation (relation_lists, "artist", "composer",
+ composer_cb, user_data);
}
static void
fill_recording_relations (Mb4Recording recording, TrackDetails *track)
{
Mb4RelationListList relation_lists;
- unsigned int j;
relation_lists = mb4_recording_get_relationlistlist (recording);
- if (relation_lists == NULL)
- return;
-
- for (j = 0; j < mb4_relationlist_list_size (relation_lists); j++) {
- Mb4RelationList relations;
- char type[512]; /* To hold relationlist target-type and relation type */
- unsigned int i;
-
- relations = mb4_relationlist_list_item (relation_lists, j);
- if (relations == NULL)
- return;
-
- mb4_relation_list_get_targettype (relations, type, sizeof (type));
- if (!g_str_equal (type, "work"))
- continue;
-
- for (i = 0; i < mb4_relation_list_size (relations); i++) {
- Mb4Relation relation;
- Mb4Work work;
-
- relation = mb4_relation_list_item (relations, i);
- if (relation == NULL)
- continue;
-
- mb4_relation_get_type (relation, type, sizeof (type));
- if (!g_str_equal (type, "performance"))
- continue;
-
- work = mb4_relation_get_work (relation);
- fill_work_relations (work, track);
- }
- }
+ relationlist_list_foreach_relation(relation_lists, "work", "performance",
+ work_cb, track);
}
static void