ByteVector APE::Item::render() const { ByteVector data; TagLib::uint flags = ((d->readOnly) ? 1 : 0) | (d->type << 1); ByteVector value; if(isEmpty()) return data; if(d->type == Text) { StringList::ConstIterator it = d->text.begin(); value.append(it->data(String::UTF8)); it++; for(; it != d->text.end(); ++it) { value.append('\0'); value.append(it->data(String::UTF8)); } d->value = value; } else value.append(d->value); data.append(ByteVector::fromUInt(value.size(), false)); data.append(ByteVector::fromUInt(flags, false)); data.append(d->key.data(String::UTF8)); data.append(ByteVector('\0')); data.append(value); return data; }
ByteVector MP4::Tag::renderText(const ByteVector &name, const MP4::Item &item, int flags) const { ByteVectorList data; StringList value = item.toStringList(); for(StringList::ConstIterator it = value.begin(); it != value.end(); ++it) { data.append(it->data(String::UTF8)); } return renderData(name, flags, data); }
int APE::Item::size() const { // SFB: Why is d->key.size() used when size() returns the length in UniChars and not UTF-8? int result = 8 + d->key.size() /* d->key.data(String::UTF8).size() */ + 1; switch (d->type) { case Text: if(d->text.size()) { StringList::ConstIterator it = d->text.begin(); result += it->data(String::UTF8).size(); it++; for(; it != d->text.end(); ++it) result += 1 + it->data(String::UTF8).size(); } break; case Binary: case Locator: result += d->value.size(); break; } return result; }
void ID3v2::Tag::removeUnsupportedProperties(const StringList &properties) { for(StringList::ConstIterator it = properties.begin(); it != properties.end(); ++it){ if(it->startsWith("UNKNOWN/")) { String frameID = it->substr(String("UNKNOWN/").size()); if(frameID.size() != 4) continue; // invalid specification ByteVector id = frameID.data(String::Latin1); // delete all unknown frames of given type FrameList l = frameList(id); for(FrameList::ConstIterator fit = l.begin(); fit != l.end(); fit++) if (dynamic_cast<const UnknownFrame *>(*fit) != 0) removeFrame(*fit); } else if(it->size() == 4){ ByteVector id = it->data(String::Latin1); removeFrames(id); } else { ByteVector id = it->substr(0,4).data(String::Latin1); if(it->size() <= 5) continue; // invalid specification String description = it->substr(5); Frame *frame = 0; if(id == "TXXX") frame = UserTextIdentificationFrame::find(this, description); else if(id == "WXXX") frame = UserUrlLinkFrame::find(this, description); else if(id == "COMM") frame = CommentsFrame::findByDescription(this, description); else if(id == "USLT") frame = UnsynchronizedLyricsFrame::findByDescription(this, description); else if(id == "UFID") frame = UniqueFileIdentifierFrame::findByOwner(this, description); if(frame) removeFrame(frame); } } }
ByteVector MP4::Tag::renderFreeForm(const String &name, const MP4::Item &item) const { StringList header = StringList::split(name, ":"); if(header.size() != 3) { debug("MP4: Invalid free-form item name \"" + name + "\""); return ByteVector(); } ByteVector data; data.append(renderAtom("mean", ByteVector::fromUInt(0) + header[1].data(String::UTF8))); data.append(renderAtom("name", ByteVector::fromUInt(0) + header[2].data(String::UTF8))); AtomDataType type = item.atomDataType(); if(type == TypeUndefined) { if(!item.toStringList().isEmpty()) { type = TypeUTF8; } else { type = TypeImplicit; } } if(type == TypeUTF8) { StringList value = item.toStringList(); for(StringList::ConstIterator it = value.begin(); it != value.end(); ++it) { data.append(renderAtom("data", ByteVector::fromUInt(type) + ByteVector(4, '\0') + it->data(String::UTF8))); } } else { ByteVectorList value = item.toByteVectorList(); for(ByteVectorList::ConstIterator it = value.begin(); it != value.end(); ++it) { data.append(renderAtom("data", ByteVector::fromUInt(type) + ByteVector(4, '\0') + *it)); } } return renderAtom("----", data); }