コード例 #1
0
 public CacheMetadataAttribute(CacheGeneration generation, CachePlatform platform, CacheResourceCodec codec, CacheMetadataFlags flags)
 {
     Generation    = generation;
     Platform      = platform;
     ResourceCodec = codec;
     Flags         = flags;
 }
コード例 #2
0
 public BuildStringAttribute(string buildString, string stringIds, CacheResourceCodec codec)
     : this(buildString, stringIds, codec, null)
 {
 }
コード例 #3
0
 public CacheMetadataAttribute(CacheGeneration generation, CachePlatform platform, CacheResourceCodec codec)
     : this(generation, platform, codec, None)
 {
 }
コード例 #4
0
        //the reader must currently be at the start of the encoded block. the first [segmentOffset] bytes of the block will be discarded.
        internal static byte[] GetResourceData(EndianReader reader, CacheResourceCodec codec, int maxLength, int segmentOffset, int compressedSize, int decompressedSize)
        {
            var segmentLength = Math.Min(maxLength, decompressedSize - segmentOffset);

            if (codec == CacheResourceCodec.Uncompressed || compressedSize == decompressedSize)
            {
                reader.Seek(segmentOffset, SeekOrigin.Current);
                return(reader.ReadBytes(segmentLength));
            }
            else if (codec == CacheResourceCodec.Deflate)
            {
                using (var ds = new DeflateStream(reader.BaseStream, CompressionMode.Decompress))
                    using (var reader2 = new BinaryReader(ds))
                    {
                        reader2.ReadBytes(segmentOffset);
                        return(reader2.ReadBytes(segmentLength));
                    }
            }
            else if (codec == CacheResourceCodec.LZX)
            {
                var compressed   = reader.ReadBytes(compressedSize);
                var decompressed = new byte[decompressedSize];

                int startSize            = compressedSize;
                int endSize              = decompressedSize;
                int decompressionContext = 0;
                XCompress.XMemCreateDecompressionContext(XCompress.XMemCodecType.LZX, 0, 0, ref decompressionContext);
                XCompress.XMemResetDecompressionContext(decompressionContext);
                XCompress.XMemDecompressStream(decompressionContext, decompressed, ref endSize, compressed, ref startSize);
                XCompress.XMemDestroyDecompressionContext(decompressionContext);

                if (decompressed.Length == segmentLength)
                {
                    return(decompressed);
                }

                var result = new byte[segmentLength];
                Array.Copy(decompressed, segmentOffset, result, 0, result.Length);
                return(result);
            }
            else if (codec == CacheResourceCodec.UnknownDeflate) //experimental
            {
                using (var ms = new MemoryStream())
                    using (var mw = new BinaryWriter(ms))
                        using (var ds = new DeflateStream(reader.BaseStream, CompressionMode.Decompress))
                            using (var reader2 = new BinaryReader(ds))
                            {
                                for (int i = 0; i < segmentLength;)
                                {
                                    bool flag;
                                    var  blockSize = ReadSpecialInt(reader2, out flag);
                                    if (flag)
                                    {
                                        reader2.ReadBytes(2);
                                    }
                                    mw.Write(reader2.ReadBytes(blockSize));
                                    i += blockSize;
                                }

                                return(ms.ToArray());
                            }
            }
            else
            {
                throw new NotSupportedException("Unknown Resource Codec");
            }
        }