def load(cls, data=None, filename=None, parse=True, expected_type=None): if filename is not None: filename = os.path.normpath(filename) stream = BinaryStream(data=data, filename=filename) del data (sig, platform, version, attribs, size) = stream.unpack(_XNB_HEADER) if sig != XNB_SIGNATURE: raise ReaderError("bad sig: '{!r}'".format(sig)) if platform not in XNB_PLATFORMS: raise ReaderError("bad platform: '{!r}'".format(platform)) if version not in XNB_VERSIONS: raise ReaderError("bad version: {}".format(version)) stream_length = stream.length() if stream_length != size: raise ReaderError("bad size: {} != {}".format(stream_length, size)) compressed = False profile = 0 if version >= VERSION_40: profile = attribs & _PROFILE_MASK if profile not in XNB_PROFILES: raise ReaderError("bad profile: {}".format(profile)) if version >= VERSION_30: compressed = bool(attribs & _COMPRESS_MASK) size -= stream.calc_size(_XNB_HEADER) if compressed: uncomp = stream.read_int32() size -= 4 content_comp = stream.read(size) content = decompress(content_comp, uncomp) else: content = stream.read(size) return cls(content, platform, version, profile, compressed, parse=parse, expected_type=expected_type)