public static ContentReaderShim GetContentReaderFromXnb(string originalAssetName, Stream stream, BinaryReader xnbReader) { // The first 4 bytes should be the "XNB" header. i use that to detect an invalid file byte x = xnbReader.ReadByte(); byte n = xnbReader.ReadByte(); byte b = xnbReader.ReadByte(); byte platform = xnbReader.ReadByte(); if (x != 'X' || n != 'N' || b != 'B' || !(targetPlatformIdentifiers.Contains((char)platform))) { throw new ContentLoadException("Asset does not appear to be a valid XNB file. Did you process your content for Windows?"); } byte version = xnbReader.ReadByte(); byte flags = xnbReader.ReadByte(); bool compressedLzx = (flags & ContentCompressedLzx) != 0; bool compressedLz4 = (flags & ContentCompressedLz4) != 0; if (version != 6 && version != 5) { throw new ContentLoadException("Invalid XNB version"); } // The next int32 is the length of the XNB file int xnbLength = xnbReader.ReadInt32(); Stream decompressedStream = null; if (compressedLzx || compressedLz4) { // Decompress the xnb int decompressedSize = xnbReader.ReadInt32(); if (compressedLzx) { int compressedSize = xnbLength - 14; decompressedStream = new LzxDecoderStream(stream, decompressedSize, compressedSize); } else if (compressedLz4) { decompressedStream = new Lz4DecoderStream(stream); } } else { decompressedStream = stream; } var reader = new ContentReaderShim(decompressedStream, version); return(reader); }
public ContentTypeReaderManager(ContentReaderShim reader) { this._reader = reader; }