CueParser: use class TagBuilder
This commit is contained in:
parent
a5574f9189
commit
ef68946e74
@ -31,7 +31,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
CueParser::CueParser()
|
CueParser::CueParser()
|
||||||
:state(HEADER), header_tag(new Tag()),
|
:state(HEADER),
|
||||||
current(nullptr),
|
current(nullptr),
|
||||||
previous(nullptr),
|
previous(nullptr),
|
||||||
finished(nullptr),
|
finished(nullptr),
|
||||||
@ -39,8 +39,6 @@ CueParser::CueParser()
|
|||||||
|
|
||||||
CueParser::~CueParser()
|
CueParser::~CueParser()
|
||||||
{
|
{
|
||||||
delete header_tag;
|
|
||||||
|
|
||||||
if (current != nullptr)
|
if (current != nullptr)
|
||||||
current->Free();
|
current->Free();
|
||||||
|
|
||||||
@ -109,7 +107,7 @@ cue_next_value(char **pp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cue_add_tag(Tag &tag, TagType type, char *p)
|
cue_add_tag(TagBuilder &tag, TagType type, char *p)
|
||||||
{
|
{
|
||||||
const char *value = cue_next_value(&p);
|
const char *value = cue_next_value(&p);
|
||||||
if (value != nullptr)
|
if (value != nullptr)
|
||||||
@ -118,7 +116,7 @@ cue_add_tag(Tag &tag, TagType type, char *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cue_parse_rem(char *p, Tag &tag)
|
cue_parse_rem(char *p, TagBuilder &tag)
|
||||||
{
|
{
|
||||||
const char *type = cue_next_token(&p);
|
const char *type = cue_next_token(&p);
|
||||||
if (type == nullptr)
|
if (type == nullptr)
|
||||||
@ -129,13 +127,13 @@ cue_parse_rem(char *p, Tag &tag)
|
|||||||
cue_add_tag(tag, type2, p);
|
cue_add_tag(tag, type2, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
Tag *
|
TagBuilder *
|
||||||
CueParser::GetCurrentTag()
|
CueParser::GetCurrentTag()
|
||||||
{
|
{
|
||||||
if (state == HEADER)
|
if (state == HEADER)
|
||||||
return header_tag;
|
return &header_tag;
|
||||||
else if (state == TRACK)
|
else if (state == TRACK)
|
||||||
return current->tag;
|
return &song_tag;
|
||||||
else
|
else
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -172,6 +170,9 @@ CueParser::Commit()
|
|||||||
if (current == nullptr)
|
if (current == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
assert(current->tag == nullptr);
|
||||||
|
current->tag = song_tag.Commit();
|
||||||
|
|
||||||
finished = previous;
|
finished = previous;
|
||||||
previous = current;
|
previous = current;
|
||||||
current = nullptr;
|
current = nullptr;
|
||||||
@ -188,7 +189,7 @@ CueParser::Feed2(char *p)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (strcmp(command, "REM") == 0) {
|
if (strcmp(command, "REM") == 0) {
|
||||||
Tag *tag = GetCurrentTag();
|
TagBuilder *tag = GetCurrentTag();
|
||||||
if (tag != nullptr)
|
if (tag != nullptr)
|
||||||
cue_parse_rem(p, *tag);
|
cue_parse_rem(p, *tag);
|
||||||
} else if (strcmp(command, "PERFORMER") == 0) {
|
} else if (strcmp(command, "PERFORMER") == 0) {
|
||||||
@ -202,14 +203,14 @@ CueParser::Feed2(char *p)
|
|||||||
? TAG_ARTIST
|
? TAG_ARTIST
|
||||||
: TAG_ALBUM_ARTIST;
|
: TAG_ALBUM_ARTIST;
|
||||||
|
|
||||||
Tag *tag = GetCurrentTag();
|
TagBuilder *tag = GetCurrentTag();
|
||||||
if (tag != nullptr)
|
if (tag != nullptr)
|
||||||
cue_add_tag(*tag, type, p);
|
cue_add_tag(*tag, type, p);
|
||||||
} else if (strcmp(command, "TITLE") == 0) {
|
} else if (strcmp(command, "TITLE") == 0) {
|
||||||
if (state == HEADER)
|
if (state == HEADER)
|
||||||
cue_add_tag(*header_tag, TAG_ALBUM, p);
|
cue_add_tag(header_tag, TAG_ALBUM, p);
|
||||||
else if (state == TRACK)
|
else if (state == TRACK)
|
||||||
cue_add_tag(*current->tag, TAG_TITLE, p);
|
cue_add_tag(song_tag, TAG_TITLE, p);
|
||||||
} else if (strcmp(command, "FILE") == 0) {
|
} else if (strcmp(command, "FILE") == 0) {
|
||||||
Commit();
|
Commit();
|
||||||
|
|
||||||
@ -251,8 +252,10 @@ CueParser::Feed2(char *p)
|
|||||||
state = TRACK;
|
state = TRACK;
|
||||||
current = Song::NewRemote(filename.c_str());
|
current = Song::NewRemote(filename.c_str());
|
||||||
assert(current->tag == nullptr);
|
assert(current->tag == nullptr);
|
||||||
current->tag = new Tag(*header_tag);
|
|
||||||
current->tag->AddItem(TAG_TRACK, nr);
|
song_tag = header_tag;
|
||||||
|
song_tag.AddItem(TAG_TRACK, nr);
|
||||||
|
|
||||||
last_updated = false;
|
last_updated = false;
|
||||||
} else if (state == IGNORE_TRACK) {
|
} else if (state == IGNORE_TRACK) {
|
||||||
return;
|
return;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#define MPD_CUE_PARSER_HXX
|
#define MPD_CUE_PARSER_HXX
|
||||||
|
|
||||||
#include "check.h"
|
#include "check.h"
|
||||||
|
#include "tag/TagBuilder.hxx"
|
||||||
#include "Compiler.h"
|
#include "Compiler.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -59,7 +60,14 @@ class CueParser {
|
|||||||
/**
|
/**
|
||||||
* Tags read from the CUE header.
|
* Tags read from the CUE header.
|
||||||
*/
|
*/
|
||||||
Tag *header_tag;
|
TagBuilder header_tag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tags read for the current song (attribute #current). When
|
||||||
|
* #current gets moved to #previous, TagBuilder::Commit() will
|
||||||
|
* be called.
|
||||||
|
*/
|
||||||
|
TagBuilder song_tag;
|
||||||
|
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
|
||||||
@ -121,7 +129,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
gcc_pure
|
gcc_pure
|
||||||
Tag *GetCurrentTag();
|
TagBuilder *GetCurrentTag();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Commit the current song. It will be moved to "previous",
|
* Commit the current song. It will be moved to "previous",
|
||||||
|
Loading…
Reference in New Issue
Block a user