| | | items excluding the header (for 1.000 |
| | | compatibility) |
|----------------|---------|------------------------------------------------|
-|Item Count | 4 bytes | Number of items in the tag |
+| Item Count | 4 bytes | Number of items in the tag |
|----------------|---------|------------------------------------------------|
| Tag Flags | 4 bytes | Global flags |
|----------------|---------|------------------------------------------------|
Sections 5 - 7 haven't yet been converted from:
-http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html
\ No newline at end of file
+http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html
void APE::Item::parse(const ByteVector &data)
{
- if(data.size() < 10) {
+ // 11 bytes is the minimum size for an APE item
+
+ if(data.size() < 11) {
debug("APE::Item::parse() -- no data in item");
return;
}
return;
d->file->seek(d->tagOffset + Footer::size() - d->footer.tagSize());
- parse(d->file->readBlock(d->footer.tagSize() - Footer::size()), d->footer.itemCount());
+ parse(d->file->readBlock(d->footer.tagSize() - Footer::size()));
}
}
return d->footer.renderHeader() + data + d->footer.renderFooter();
}
-void APE::Tag::parse(const ByteVector &data, uint count)
+void APE::Tag::parse(const ByteVector &data, uint)
+{
+ parse(data);
+}
+
+void APE::Tag::parse(const ByteVector &data)
{
uint pos = 0;
- while(count > 0) {
+ // 11 bytes is the minimum size for an APE item
+
+ for(uint i = 0; i < d->footer.itemCount() && pos <= data.size() - 11; i++) {
APE::Item item;
item.parse(data.mid(pos));
d->itemListMap.insert(item.key().upper(), item);
pos += item.size();
- count--;
}
}
void read();
/*!
* Parses the body of the tag in \a data with \a count items.
+ * \deprecated Please use the version that doesn't require an item count.
*/
void parse(const ByteVector &data, uint count);
+ /*!
+ * Parses the body of the tag in \a data.
+ */
+ void parse(const ByteVector &data);
+
private:
Tag(const Tag &);
Tag &operator=(const Tag &);