MPD  0.20.6
TagHandler.hxx
Go to the documentation of this file.
1 /*
2  * Copyright 2003-2017 The Music Player Daemon Project
3  * http://www.musicpd.org
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #ifndef MPD_TAG_HANDLER_HXX
21 #define MPD_TAG_HANDLER_HXX
22 
23 #include "check.h"
24 #include "TagType.h"
25 #include "Chrono.hxx"
26 
27 #include <assert.h>
28 
32 struct TagHandler {
38  void (*duration)(SongTime duration, void *ctx);
39 
46  void (*tag)(TagType type, const char *value, void *ctx);
47 
52  void (*pair)(const char *key, const char *value, void *ctx);
53 };
54 
55 static inline void
56 tag_handler_invoke_duration(const TagHandler &handler, void *ctx,
57  SongTime duration)
58 {
59  if (handler.duration != nullptr)
60  handler.duration(duration, ctx);
61 }
62 
63 static inline void
64 tag_handler_invoke_tag(const TagHandler &handler, void *ctx,
65  TagType type, const char *value)
66 {
67  assert((unsigned)type < TAG_NUM_OF_ITEM_TYPES);
68  assert(value != nullptr);
69 
70  if (handler.tag != nullptr)
71  handler.tag(type, value, ctx);
72 }
73 
74 static inline void
75 tag_handler_invoke_pair(const TagHandler &handler, void *ctx,
76  const char *name, const char *value)
77 {
78  assert(name != nullptr);
79  assert(value != nullptr);
80 
81  if (handler.pair != nullptr)
82  handler.pair(name, value, ctx);
83 }
84 
89 extern const TagHandler add_tag_handler;
90 
96 extern const TagHandler full_tag_handler;
97 
98 #endif
void(* tag)(TagType type, const char *value, void *ctx)
A tag has been read.
Definition: TagHandler.hxx:46
A time stamp within a song.
Definition: Chrono.hxx:31
A callback table for receiving metadata of a song.
Definition: TagHandler.hxx:32
const TagHandler add_tag_handler
This TagHandler implementation adds tag values to a TagBuilder object (casted from the context pointe...
static void tag_handler_invoke_pair(const TagHandler &handler, void *ctx, const char *name, const char *value)
Definition: TagHandler.hxx:75
const TagHandler full_tag_handler
This TagHandler implementation adds tag values to a TagBuilder object (casted from the context pointe...
static void tag_handler_invoke_duration(const TagHandler &handler, void *ctx, SongTime duration)
Definition: TagHandler.hxx:56
void(* duration)(SongTime duration, void *ctx)
Declare the duration of a song.
Definition: TagHandler.hxx:38
TagType
Codes for the type of a tag item.
Definition: TagType.h:30
void(* pair)(const char *key, const char *value, void *ctx)
A name-value pair has been read.
Definition: TagHandler.hxx:52
static void tag_handler_invoke_tag(const TagHandler &handler, void *ctx, TagType type, const char *value)
Definition: TagHandler.hxx:64
const Partition const char * name
Definition: Count.hxx:34