aboutsummaryrefslogtreecommitdiffstats
path: root/src/cue/CueParser.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/cue/CueParser.cxx')
-rw-r--r--src/cue/CueParser.cxx79
1 files changed, 38 insertions, 41 deletions
diff --git a/src/cue/CueParser.cxx b/src/cue/CueParser.cxx
index 60b33b6b4..dc96218f4 100644
--- a/src/cue/CueParser.cxx
+++ b/src/cue/CueParser.cxx
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2013 The Music Player Daemon Project
+ * Copyright (C) 2003-2014 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -19,19 +19,18 @@
#include "config.h"
#include "CueParser.hxx"
+#include "util/Alloc.hxx"
#include "util/StringUtil.hxx"
#include "util/CharUtil.hxx"
-#include "Song.hxx"
+#include "DetachedSong.hxx"
#include "tag/Tag.hxx"
-#include <glib.h>
-
#include <assert.h>
#include <string.h>
#include <stdlib.h>
CueParser::CueParser()
- :state(HEADER), tag(new Tag()),
+ :state(HEADER),
current(nullptr),
previous(nullptr),
finished(nullptr),
@@ -39,16 +38,9 @@ CueParser::CueParser()
CueParser::~CueParser()
{
- delete tag;
-
- if (current != nullptr)
- current->Free();
-
- if (previous != nullptr)
- previous->Free();
-
- if (finished != nullptr)
- finished->Free();
+ delete current;
+ delete previous;
+ delete finished;
}
static const char *
@@ -109,7 +101,7 @@ cue_next_value(char **pp)
}
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);
if (value != nullptr)
@@ -118,7 +110,7 @@ cue_add_tag(Tag &tag, TagType type, char *p)
}
static void
-cue_parse_rem(char *p, Tag &tag)
+cue_parse_rem(char *p, TagBuilder &tag)
{
const char *type = cue_next_token(&p);
if (type == nullptr)
@@ -129,13 +121,13 @@ cue_parse_rem(char *p, Tag &tag)
cue_add_tag(tag, type2, p);
}
-Tag *
+TagBuilder *
CueParser::GetCurrentTag()
{
if (state == HEADER)
- return tag;
+ return &header_tag;
else if (state == TRACK)
- return current->tag;
+ return &song_tag;
else
return nullptr;
}
@@ -172,6 +164,9 @@ CueParser::Commit()
if (current == nullptr)
return;
+ assert(!current->GetTag().IsDefined());
+ current->SetTag(song_tag.Commit());
+
finished = previous;
previous = current;
current = nullptr;
@@ -188,9 +183,9 @@ CueParser::Feed2(char *p)
return;
if (strcmp(command, "REM") == 0) {
- Tag *current_tag = GetCurrentTag();
- if (current_tag != nullptr)
- cue_parse_rem(p, *current_tag);
+ TagBuilder *tag = GetCurrentTag();
+ if (tag != nullptr)
+ cue_parse_rem(p, *tag);
} else if (strcmp(command, "PERFORMER") == 0) {
/* MPD knows a "performer" tag, but it is not a good
match for this CUE tag; from the Hydrogenaudio
@@ -202,14 +197,14 @@ CueParser::Feed2(char *p)
? TAG_ARTIST
: TAG_ALBUM_ARTIST;
- Tag *current_tag = GetCurrentTag();
- if (current_tag != nullptr)
- cue_add_tag(*current_tag, type, p);
+ TagBuilder *tag = GetCurrentTag();
+ if (tag != nullptr)
+ cue_add_tag(*tag, type, p);
} else if (strcmp(command, "TITLE") == 0) {
if (state == HEADER)
- cue_add_tag(*tag, TAG_ALBUM, p);
+ cue_add_tag(header_tag, TAG_ALBUM, p);
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) {
Commit();
@@ -249,10 +244,12 @@ CueParser::Feed2(char *p)
}
state = TRACK;
- current = Song::NewRemote(filename.c_str());
- assert(current->tag == nullptr);
- current->tag = new Tag(*tag);
- current->tag->AddItem(TAG_TRACK, nr);
+ current = new DetachedSong(filename);
+ assert(!current->GetTag().IsDefined());
+
+ song_tag = header_tag;
+ song_tag.AddItem(TAG_TRACK, nr);
+
last_updated = false;
} else if (state == IGNORE_TRACK) {
return;
@@ -270,14 +267,14 @@ CueParser::Feed2(char *p)
return;
if (!last_updated && previous != nullptr &&
- previous->start_ms < (unsigned)position_ms) {
+ previous->GetStartMS() < (unsigned)position_ms) {
last_updated = true;
- previous->end_ms = position_ms;
- previous->tag->time =
- (previous->end_ms - previous->start_ms + 500) / 1000;
+ previous->SetEndMS(position_ms);
+ previous->WritableTag().time =
+ (previous->GetEndMS() - previous->GetStartMS() + 500) / 1000;
}
- current->start_ms = position_ms;
+ current->SetStartMS(position_ms);
}
}
@@ -287,9 +284,9 @@ CueParser::Feed(const char *line)
assert(!end);
assert(line != nullptr);
- char *allocated = g_strdup(line);
+ char *allocated = xstrdup(line);
Feed2(allocated);
- g_free(allocated);
+ free(allocated);
}
void
@@ -303,7 +300,7 @@ CueParser::Finish()
end = true;
}
-Song *
+DetachedSong *
CueParser::Get()
{
if (finished == nullptr && end) {
@@ -315,7 +312,7 @@ CueParser::Get()
previous = nullptr;
}
- Song *song = finished;
+ DetachedSong *song = finished;
finished = nullptr;
return song;
}