status CAFFile::readInit(AFfilesetup setup) { m_fh->seek(8, File::SeekFromBeginning); if (!allocateTrack()) return AF_FAIL; off_t currentOffset = m_fh->tell(); off_t fileLength = m_fh->length(); while (currentOffset < fileLength) { Tag chunkType; int64_t chunkLength; if (!readTag(&chunkType) || !readS64(&chunkLength)) return AF_FAIL; currentOffset += 12; if (chunkType == "data" && chunkLength == -1) chunkLength = fileLength - currentOffset; else if (chunkLength < 0) _af_error(AF_BAD_HEADER, "invalid chunk length %jd for chunk type %s\n", static_cast<intmax_t>(chunkLength), chunkType.name().c_str()); if (chunkType == "desc") { if (parseDescription(chunkType, chunkLength) == AF_FAIL) return AF_FAIL; } else if (chunkType == "data") { if (parseData(chunkType, chunkLength) == AF_FAIL) return AF_FAIL; } currentOffset = m_fh->seek(currentOffset + chunkLength, File::SeekFromBeginning); } return AF_SUCCEED; }
void TestSerialization::testStreamRead() { std::string datastr( (const char *)test_serialized_data, sizeof(test_serialized_data)); std::istringstream is(datastr, std::ios_base::binary); UASSERT(readU8(is) == 0x11); UASSERT(readU16(is) == 0x2233); UASSERT(readU32(is) == 0x44556677); UASSERT(readU64(is) == 0x8899AABBCCDDEEFF); UASSERT(readS8(is) == -128); UASSERT(readS16(is) == 30000); UASSERT(readS32(is) == -6); UASSERT(readS64(is) == -43); UASSERT(readF1000(is) == 53.534f); UASSERT(readF1000(is) == -300000.32f); UASSERT(readF1000(is) == F1000_MIN); UASSERT(readF1000(is) == F1000_MAX); UASSERT(deSerializeString(is) == "foobar!"); UASSERT(readV2S16(is) == v2s16(500, 500)); UASSERT(readV3S16(is) == v3s16(4207, 604, -30)); UASSERT(readV2S32(is) == v2s32(1920, 1080)); UASSERT(readV3S32(is) == v3s32(-400, 6400054, 290549855)); UASSERT(readV2F1000(is) == v2f(500.656f, 350.345f)); UASSERT(deSerializeWideString(is) == L"\x02~woof~\x5455"); UASSERT(readV3F1000(is) == v3f(500, 10024.2f, -192.54f)); UASSERT(readARGB8(is) == video::SColor(255, 128, 50, 128)); UASSERT(deSerializeLongString(is) == "some longer string here"); UASSERT(is.rdbuf()->in_avail() == 2); UASSERT(readU16(is) == 0xF00D); UASSERT(is.rdbuf()->in_avail() == 0); }