bool ID3_TagHeader::Parse(ID3_Reader& reader) { io::ExitTrigger et(reader); if (!ID3_Tag::IsV2Tag(reader)) { ID3D_NOTICE( "ID3_TagHeader::Parse(): not an id3v2 header" ); return false; } uchar id[3]; reader.readChars(id, 3); // The spec version is determined with the MAJOR and MINOR OFFSETs uchar major = reader.readChar(); uchar minor = reader.readChar(); this->SetSpec(ID3_VerRevToV2Spec(major, minor)); // Get the flags at the appropriate offset _flags.set(static_cast<ID3_Flags::TYPE>(reader.readChar())); // set the data size this->SetDataSize(io::readUInt28(reader)); if (_flags.test(HEADER_FLAG_EXTENDED) && this->GetSpec() == ID3V2_2_1) { //couldn't find anything about this in the draft specifying 2.2.1 -> http://www.id3.org/pipermail/id3v2/2000-April/000126.html _flags.set(HEADER_FLAG_EXTENDED, false); _info->extended_bytes = 0; // rest is checked at ParseExtended() } et.setExitPos(reader.getCur()); return true; }
String io::readText(ID3_Reader& reader, size_t len) { String str; str.reserve(len); const size_t SIZE = 1024; ID3_Reader::char_type buf[SIZE]; size_t remaining = len; while (remaining > 0 && !reader.atEnd()) { size_t numRead = reader.readChars(buf, min(remaining, SIZE)); remaining -= numRead; str.append(reinterpret_cast<String::value_type *>(buf), numRead); } return str; }
BString io::readBinary(ID3_Reader& reader, size_t len) { BString binary; binary.reserve(len); size_t remaining = len; const size_t SIZE = 1024; ID3_Reader::char_type buf[SIZE]; while (!reader.atEnd() && remaining > 0) { size_t numRead = reader.readChars(buf, min(remaining, SIZE)); remaining -= numRead; binary.append(reinterpret_cast<BString::value_type *>(buf), numRead); } return binary; }
bool ID3_TagHeader::Parse(ID3_Reader& reader) { io::ExitTrigger et(reader); if (!ID3_Tag::IsV2Tag(reader)) { ID3D_NOTICE( "ID3_TagHeader::Parse(): not an id3v2 header" ); return false; } uchar id[3]; reader.readChars(id, 3); // The spec version is determined with the MAJOR and MINOR OFFSETs uchar major = reader.readChar(); uchar minor = reader.readChar(); this->SetSpec(ID3_VerRevToV2Spec(major, minor)); // Get the flags at the appropriate offset _flags.set(static_cast<ID3_Flags::TYPE>(reader.readChar())); // set the data size this->SetDataSize(io::readUInt28(reader)); if (_flags.test(EXTENDED)) { if (this->GetSpec() == ID3V2_2_1) { // okay, if we are ID3v2.2.1, then let's skip over the extended header // for now because I am lazy } if (this->GetSpec() == ID3V2_3_0) { // okay, if we are ID3v2.3.0, then let's actually parse the extended // header (for now, we skip it because we are lazy) } } et.setExitPos(reader.getCur()); return true; }