using System; 
 | 
using System.IO; 
 | 
using System.Threading; 
 | 
using UnityEngine; 
 | 
  
 | 
namespace Xdxn { 
 | 
  
 | 
    public delegate void ProgressDelegate(Int64 fileSize, Int64 processSize); 
 | 
    public class FileCompressInfo { 
 | 
        public string inPath; 
 | 
        public string outPath; 
 | 
        public ProgressDelegate progressDelegate; 
 | 
    } 
 | 
  
 | 
    public class CompressUtility { 
 | 
  
 | 
        public class CodeProgress : SevenZip.ICodeProgress { 
 | 
  
 | 
            private ProgressDelegate progressDelegate; 
 | 
  
 | 
            public CodeProgress(ProgressDelegate callBack) { 
 | 
                progressDelegate = callBack; 
 | 
            } 
 | 
  
 | 
            public void SetProgress(Int64 inSize, Int64 outSize) { 
 | 
                if (progressDelegate != null) { 
 | 
                    progressDelegate(inSize, outSize); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public static void Compress(string inPath, string outPath, ProgressDelegate progressDelegate) { 
 | 
            FileCompressInfo _fileCompressInfo = new FileCompressInfo(); 
 | 
            _fileCompressInfo.inPath = inPath; 
 | 
            _fileCompressInfo.outPath = outPath; 
 | 
            _fileCompressInfo.progressDelegate = progressDelegate; 
 | 
            CompressLZMA(_fileCompressInfo); 
 | 
        } 
 | 
  
 | 
        public static void DeCompress(string inPath, string outPath, ProgressDelegate progressDelegate) { 
 | 
            FileCompressInfo _fileCompressInfo = new FileCompressInfo(); 
 | 
            _fileCompressInfo.inPath = inPath; 
 | 
            _fileCompressInfo.outPath = outPath; 
 | 
            _fileCompressInfo.progressDelegate = progressDelegate; 
 | 
            DeCompressLZMA(_fileCompressInfo); 
 | 
        } 
 | 
  
 | 
        public static void CompressAsync(string inPath, string outPath, ProgressDelegate progressDelegate) { 
 | 
            Thread _compressThread = new Thread(new ParameterizedThreadStart(CompressLZMA)); 
 | 
            FileCompressInfo _fileCompressInfo = new FileCompressInfo(); 
 | 
            _fileCompressInfo.inPath = inPath; 
 | 
            _fileCompressInfo.outPath = outPath; 
 | 
            _fileCompressInfo.progressDelegate = progressDelegate; 
 | 
            _compressThread.Start(_fileCompressInfo); 
 | 
        } 
 | 
  
 | 
        public static void DeCompressAsync(string inPath, string outPath, ProgressDelegate progressDelegate) { 
 | 
            Thread _deCompressThread = new Thread(new ParameterizedThreadStart(DeCompressLZMA)); 
 | 
            FileCompressInfo _fileCompressInfo = new FileCompressInfo(); 
 | 
            _fileCompressInfo.inPath = inPath; 
 | 
            _fileCompressInfo.outPath = outPath; 
 | 
            _fileCompressInfo.progressDelegate = progressDelegate; 
 | 
            _deCompressThread.Start(_fileCompressInfo); 
 | 
        } 
 | 
  
 | 
        private static void CompressLZMA(object obj) { 
 | 
  
 | 
            FileCompressInfo _fileCompressInfo = obj as FileCompressInfo; 
 | 
  
 | 
            FileStream _input = null; 
 | 
            FileStream _output = null; 
 | 
            SevenZip.Compression.LZMA.Encoder _encoder = null; 
 | 
  
 | 
            CodeProgress _codeProgress = null; 
 | 
            if (_fileCompressInfo.progressDelegate != null) { 
 | 
                _codeProgress = new CodeProgress(_fileCompressInfo.progressDelegate); 
 | 
            } 
 | 
  
 | 
            try { 
 | 
                _encoder = new SevenZip.Compression.LZMA.Encoder(); 
 | 
  
 | 
                _input = new FileStream(_fileCompressInfo.inPath, FileMode.Open); 
 | 
                _output = new FileStream(_fileCompressInfo.outPath, FileMode.Create); 
 | 
  
 | 
                _encoder.WriteCoderProperties(_output); 
 | 
  
 | 
                _output.Write(BitConverter.GetBytes(_input.Length), 0, 8); 
 | 
                _encoder.Code(_input, _output, _input.Length, -1, _codeProgress); 
 | 
  
 | 
                _output.Flush(); 
 | 
            } 
 | 
            catch (Exception e) { 
 | 
                DebugEx.LogFormat(e.Message); 
 | 
            } 
 | 
            finally { 
 | 
                if (_encoder != null) { 
 | 
                    _encoder = null; 
 | 
                } 
 | 
                if (_input != null) { 
 | 
                    _input.Close(); 
 | 
                    _input = null; 
 | 
                } 
 | 
                if (_output != null) { 
 | 
                    _output.Close(); 
 | 
                    _output = null; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        private static void DeCompressLZMA(object obj) { 
 | 
  
 | 
            FileCompressInfo _fileCompressInfo = obj as FileCompressInfo; 
 | 
  
 | 
            SevenZip.Compression.LZMA.Decoder _decoder = null; 
 | 
            FileStream _input = null; 
 | 
            FileStream _output = null; 
 | 
  
 | 
            CodeProgress _codeProgress = null; 
 | 
            if (_fileCompressInfo.progressDelegate != null) { 
 | 
                _codeProgress = new CodeProgress(_fileCompressInfo.progressDelegate); 
 | 
            } 
 | 
  
 | 
            try { 
 | 
  
 | 
                _decoder = new SevenZip.Compression.LZMA.Decoder(); 
 | 
  
 | 
                _input = new FileStream(_fileCompressInfo.inPath, FileMode.Open); 
 | 
                _output = new FileStream(_fileCompressInfo.outPath, FileMode.Create); 
 | 
  
 | 
                byte[] _properties = new byte[5]; 
 | 
                _input.Read(_properties, 0, 5); 
 | 
  
 | 
                byte[] fileLengthBytes = new byte[8]; 
 | 
                _input.Read(fileLengthBytes, 0, 8); 
 | 
                long _fileLength = BitConverter.ToInt64(fileLengthBytes, 0); 
 | 
  
 | 
                _decoder.SetDecoderProperties(_properties); 
 | 
                _decoder.Code(_input, _output, _input.Length, _fileLength, _codeProgress); 
 | 
  
 | 
                _output.Flush(); 
 | 
  
 | 
            } 
 | 
            catch (Exception e) { 
 | 
                DebugEx.LogFormat(e.Message); 
 | 
            } 
 | 
            finally { 
 | 
                if (_decoder != null) { 
 | 
                    _decoder = null; 
 | 
                } 
 | 
                if (_input != null) { 
 | 
                    _input.Close(); 
 | 
                    _input = null; 
 | 
                } 
 | 
                if (_output != null) { 
 | 
                    _output.Close(); 
 | 
                    _output = null; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |