少年修仙传客户端基础资源
client_Wu Xijin
2019-02-14 54fad068f41ba7b0d2f16699a3f774be2a0d84e9
Assets/Plugins/SevenZip/lzma.cs
@@ -1,3 +1,4 @@
#if !(UNITY_IOS || UNITY_IPHONE)
using System;
using System.Runtime.InteropServices;
using UnityEngine;
@@ -5,45 +6,47 @@
using System.IO;
#if (UNITY_WSA_8_1 ||  UNITY_WP_8_1 || UNITY_WINRT_8_1) && !UNITY_EDITOR
#if (UNITY_WSA_8_1 || UNITY_WP_8_1 || UNITY_WINRT_8_1) && !UNITY_EDITOR
 using File = UnityEngine.Windows.File;
 #else
 using File = System.IO.File;
 #endif
#else
using File = System.IO.File;
#endif
#if NETFX_CORE
   #if UNITY_WSA_10_0
#if UNITY_WSA_10_0
      using System.IO.IsolatedStorage;
      using static System.IO.Directory;
      using static System.IO.File;
      using static System.IO.FileStream;
   #endif
#endif
#endif
public class lzma {
public class lzma
{
   //if you want to be able to call the functions: get7zinfo, get7zSize, decode2Buffer from a thread set this string before to the Application.persistentDataPath !
   public static string persitentDataPath="";
    //if you want to be able to call the functions: get7zinfo, get7zSize, decode2Buffer from a thread set this string before to the Application.persistentDataPath !
    public static string persitentDataPath = "";
#if !(UNITY_WSA || UNITY_WP_8_1) || UNITY_EDITOR
    internal static int[] props = new int [7];
    internal static int[] props = new int[7];
    internal static bool defaultsSet = false;
    //0 = level, /* 0 <= level <= 9, default = 5 */
   //1 = dictSize, /* use (1 << N) or (3 << N). 4 KB < dictSize <= 128 MB */
   //2 = lc, /* 0 <= lc <= 8, default = 3  */
   //3 = lp, /* 0 <= lp <= 4, default = 0  */
   //4 = pb, /* 0 <= pb <= 4, default = 2  */
   //5 = fb,  /* 5 <= fb <= 273, default = 32 */
   //6 = numThreads /* 1 or 2, default = 2 */
    //1 = dictSize, /* use (1 << N) or (3 << N). 4 KB < dictSize <= 128 MB */
    //2 = lc, /* 0 <= lc <= 8, default = 3  */
    //3 = lp, /* 0 <= lp <= 4, default = 0  */
    //4 = pb, /* 0 <= pb <= 4, default = 2  */
    //5 = fb,  /* 5 <= fb <= 273, default = 32 */
    //6 = numThreads /* 1 or 2, default = 2 */
   //A function that sets the compression properties for the lzma compressor. Will affect the lzma alone file and the lzma buffer compression.
   //A simple usage of this function is to call it only with the 1st parameter that sets the compression level: setProps(9);
   //
   //Multithread safe advice: call this function before starting any thread operations !!!
    public static void setProps(int level = 5, int dictSize = 16777216, int lc = 3, int lp = 0, int pb = 2, int fb = 32, int numThreads = 2) {
    //A function that sets the compression properties for the lzma compressor. Will affect the lzma alone file and the lzma buffer compression.
    //A simple usage of this function is to call it only with the 1st parameter that sets the compression level: setProps(9);
    //
    //Multithread safe advice: call this function before starting any thread operations !!!
    public static void setProps(int level = 5, int dictSize = 16777216, int lc = 3, int lp = 0, int pb = 2, int fb = 32, int numThreads = 2)
    {
        defaultsSet = true;
        props[0] = level;
        props[1] = dictSize;
@@ -56,14 +59,14 @@
#endif
#if (UNITY_IOS || UNITY_WEBGL || UNITY_IPHONE) && !UNITY_EDITOR
#if (UNITY_WEBGL) && !UNITY_EDITOR
      #if(!UNITY_WEBGL)
#if (!UNITY_WEBGL)
         [DllImport("__Internal")]
         public static extern int lsetPermissions(string filePath, string _user, string _group, string _other);
         [DllImport("__Internal")]
         private static extern int decompress7zip(string filePath, string exctractionPath, bool fullPaths,  string entry, IntPtr progress, IntPtr FileBuffer, int FileBufferLength);
      #endif
#endif
      [DllImport("__Internal")]
      private static extern int decompress7zip2(string filePath, string exctractionPath, bool fullPaths, string entry, IntPtr progress, IntPtr FileBuffer, int FileBufferLength);
@@ -82,54 +85,50 @@
#endif
#if UNITY_5_4_OR_NEWER
   #if (UNITY_ANDROID || UNITY_STANDALONE_LINUX) && (!UNITY_EDITOR || UNITY_EDITOR_LINUX)
#if (UNITY_ANDROID || UNITY_STANDALONE_LINUX) && (!UNITY_EDITOR || UNITY_EDITOR_LINUX)
      private const string libname = "lzma";
   #elif UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX
      private const string libname = "liblzma";
   #endif
#elif UNITY_EDITOR || UNITY_STANDALONE_WIN
    private const string libname = "liblzma";
#endif
#else
   #if (UNITY_ANDROID || UNITY_STANDALONE_LINUX) && !UNITY_EDITOR
#if (UNITY_ANDROID || UNITY_STANDALONE_LINUX) && !UNITY_EDITOR
      private const string libname = "lzma";
   #endif
   #if UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX
#endif
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
      private const string libname = "liblzma";
   #endif
#endif
#endif
#if UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || UNITY_ANDROID || UNITY_STANDALONE_LINUX
      #if (UNITY_STANDALONE_OSX  || UNITY_STANDALONE_LINUX || UNITY_ANDROID || UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX)&& !UNITY_EDITOR_WIN
#if UNITY_EDITOR || UNITY_STANDALONE_WIN ||  UNITY_ANDROID || UNITY_STANDALONE_LINUX
#if ( UNITY_STANDALONE_LINUX || UNITY_ANDROID ||  UNITY_EDITOR_LINUX) && !UNITY_EDITOR_WIN
         //set permissions of a file in user, group, other. Each string should contain any or all chars of "rwx".
         //returns 0 on success
         [DllImport(libname, EntryPoint = "lsetPermissions")]
         internal static extern int lsetPermissions(string filePath, string _user, string _group, string _other);
      #endif
        [DllImport(libname, EntryPoint = "decompress7zip")]
      internal static extern int decompress7zip(string filePath, string exctractionPath, bool fullPaths,  string entry, IntPtr progress, IntPtr FileBuffer, int FileBufferLength);
      [DllImport(libname, EntryPoint = "decompress7zip2")]
      internal static extern int decompress7zip2(string filePath, string exctractionPath, bool fullPaths, string entry, IntPtr progress, IntPtr FileBuffer, int FileBufferLength);
      [DllImport(libname, EntryPoint = "_getSize")]
      internal static extern int _getSize(string filePath, string tempPath, IntPtr FileBuffer, int FileBufferLength);
      [DllImport(libname, EntryPoint = "lzmaUtil")]
      internal static extern int lzmaUtil(bool encode, string inPath, string outPath, IntPtr Props);
      [DllImport(libname, EntryPoint = "decode2Buf")]
      internal static extern int decode2Buf(string filePath, string entry,  IntPtr buffer, IntPtr FileBuffer, int FileBufferLength);
      [DllImport(libname, EntryPoint = "_releaseBuffer")]
      internal static extern void _releaseBuffer(IntPtr buffer);
      [DllImport(libname, EntryPoint = "Lzma_Compress")]
      internal static extern IntPtr Lzma_Compress( IntPtr buffer, int bufferLength, bool makeHeader, ref int v, IntPtr Props);
      [DllImport(libname, EntryPoint = "Lzma_Uncompress")]
      internal static extern int Lzma_Uncompress( IntPtr buffer, int bufferLength, int uncompressedSize, IntPtr outbuffer,bool useHeader);
#endif
    [DllImport(libname, EntryPoint = "decompress7zip")]
    internal static extern int decompress7zip(string filePath, string exctractionPath, bool fullPaths, string entry, IntPtr progress, IntPtr FileBuffer, int FileBufferLength);
    [DllImport(libname, EntryPoint = "decompress7zip2")]
    internal static extern int decompress7zip2(string filePath, string exctractionPath, bool fullPaths, string entry, IntPtr progress, IntPtr FileBuffer, int FileBufferLength);
    [DllImport(libname, EntryPoint = "_getSize")]
    internal static extern int _getSize(string filePath, string tempPath, IntPtr FileBuffer, int FileBufferLength);
    [DllImport(libname, EntryPoint = "lzmaUtil")]
    internal static extern int lzmaUtil(bool encode, string inPath, string outPath, IntPtr Props);
    [DllImport(libname, EntryPoint = "decode2Buf")]
    internal static extern int decode2Buf(string filePath, string entry, IntPtr buffer, IntPtr FileBuffer, int FileBufferLength);
    [DllImport(libname, EntryPoint = "_releaseBuffer")]
    internal static extern void _releaseBuffer(IntPtr buffer);
    [DllImport(libname, EntryPoint = "Lzma_Compress")]
    internal static extern IntPtr Lzma_Compress(IntPtr buffer, int bufferLength, bool makeHeader, ref int v, IntPtr Props);
    [DllImport(libname, EntryPoint = "Lzma_Uncompress")]
    internal static extern int Lzma_Uncompress(IntPtr buffer, int bufferLength, int uncompressedSize, IntPtr outbuffer, bool useHeader);
#endif
#if (UNITY_WP_8_1 || UNITY_WSA) && !UNITY_EDITOR
      #if (UNITY_IOS  || UNITY_IPHONE)
         [DllImport("__Internal")]
         internal static extern int lsetPermissions(string filePath, string _user, string _group, string _other);
      #endif
        #if UNITY_WSA_10_0
#if UNITY_WSA_10_0
            [DllImport("liblzma", EntryPoint = "decompress7zip")]
         internal static extern int decompress7zip(string filePath, string exctractionPath, bool fullPaths,  string entry, IntPtr progress, IntPtr FileBuffer, int FileBufferLength);
        #endif
#endif
      [DllImport("liblzma", EntryPoint = "decompress7zip2")]
      internal static extern int decompress7zip2(string filePath, string exctractionPath, bool fullPaths, string entry, IntPtr progress, IntPtr FileBuffer, int FileBufferLength);
      [DllImport("liblzma", EntryPoint = "_getSize")]
@@ -141,16 +140,17 @@
#endif
   // set permissions of a file in user, group, other.
   // Each string should contain any or all chars of "rwx".
   // returns 0 on success
   public static int setFilePermissions(string filePath, string _user, string _group, string _other){
      #if (UNITY_STANDALONE_OSX || UNITY_STANDALONE_LINUX || UNITY_ANDROID || UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX || UNITY_IOS || UNITY_IPHONE) && !UNITY_EDITOR_WIN
    // set permissions of a file in user, group, other.
    // Each string should contain any or all chars of "rwx".
    // returns 0 on success
    public static int setFilePermissions(string filePath, string _user, string _group, string _other)
    {
#if (UNITY_STANDALONE_LINUX || UNITY_ANDROID ||  UNITY_EDITOR_LINUX) && !UNITY_EDITOR_WIN
         return lsetPermissions(filePath, _user, _group, _other);
      #else
         return -1;
      #endif
   }
#else
        return -1;
#endif
    }
    // An integer variable to store the total number of files in a 7z archive, excluding the folders.
    public static int trueTotalFiles = 0;
@@ -174,23 +174,24 @@
    //WSA8.1 does not support large files.
   //filePath         : the full path to the archive, including the archives name. (/myPath/myArchive.7z)
   //exctractionPath   : the path in where you want your files to be extracted
    //filePath         : the full path to the archive, including the archives name. (/myPath/myArchive.7z)
    //exctractionPath   : the path in where you want your files to be extracted
    //progress          : a single item integer array to get the progress of the extracted files (use this function when calling from a separate thread, otherwise call the 2nd implementation)
    //                  : (for ios this integer is not properly updated. So we use the lzma.getProgressCount() function to get the progress. See example.)
   //largeFiles      : set this to true if you are extracting files larger then 30-40 Mb. It is slower though but prevents crashing your app when extracting large files!
   //fullPaths         : set this to true if you want to keep the folder structure of the 7z file.
   //entry            : set the name of a single file file you want to extract from your archive. If the file resides in a folder, the full path should be added.
   //                  (for example  game/meshes/small/table.mesh )
   //FileBuffer      : A buffer that holds a 7zip file. When assigned the function will decompress from this buffer and will ignore the filePath. (Linux, iOS, Android, MacOSX)
    //largeFiles      : set this to true if you are extracting files larger then 30-40 Mb. It is slower though but prevents crashing your app when extracting large files!
    //fullPaths         : set this to true if you want to keep the folder structure of the 7z file.
    //entry            : set the name of a single file file you want to extract from your archive. If the file resides in a folder, the full path should be added.
    //                  (for example  game/meshes/small/table.mesh )
    //FileBuffer      : A buffer that holds a 7zip file. When assigned the function will decompress from this buffer and will ignore the filePath. (Linux, iOS, Android, MacOSX)
    //use this function from a separate thread to get the progress  of the extracted files in the referenced 'progress' integer.
    //
   public static int doDecompress7zip(string filePath, string exctractionPath,  int [] progress, bool largeFiles=false, bool fullPaths=false, string entry=null, byte[] FileBuffer=null){
    public static int doDecompress7zip(string filePath, string exctractionPath, int[] progress, bool largeFiles = false, bool fullPaths = false, string entry = null, byte[] FileBuffer = null)
    {
      int res = 0;
      GCHandle ibuf = GCHandle.Alloc(progress, GCHandleType.Pinned);
        int res = 0;
        GCHandle ibuf = GCHandle.Alloc(progress, GCHandleType.Pinned);
      #if (UNITY_IPHONE || UNITY_IOS || UNITY_STANDALONE_OSX || UNITY_ANDROID || UNITY_STANDALONE_LINUX || UNITY_EDITOR) && !UNITY_EDITOR_WIN
#if (UNITY_ANDROID || UNITY_STANDALONE_LINUX || UNITY_EDITOR) && !UNITY_EDITOR_WIN
      if(FileBuffer != null) {
         GCHandle fbuf = GCHandle.Alloc(FileBuffer, GCHandleType.Pinned);
@@ -212,36 +213,39 @@
         }
      }
      
      #endif
       #if (!UNITY_WSA && !UNITY_WEBGL && !UNITY_EDITOR_OSX && !UNITY_STANDALONE_LINUX && !UNITY_ANDROID && !UNITY_IOS)  || UNITY_EDITOR_WIN || UNITY_WSA_10_0
            if (largeFiles){
            res = decompress7zip(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
            ibuf.Free(); return res;
         }else{
            res = decompress7zip2(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
            ibuf.Free(); return res;
         }
      #endif
#endif
      #if (UNITY_WSA_8_1 ||  UNITY_WP_8_1 || UNITY_WINRT_8_1 || UNITY_WEBGL) && !UNITY_EDITOR
#if (!UNITY_WSA && !UNITY_WEBGL && !UNITY_STANDALONE_LINUX && !UNITY_ANDROID) || UNITY_EDITOR_WIN || UNITY_WSA_10_0
        if (largeFiles)
        {
            res = decompress7zip(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
            ibuf.Free(); return res;
        }
        else
        {
            res = decompress7zip2(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
            ibuf.Free(); return res;
        }
#endif
#if (UNITY_WSA_8_1 || UNITY_WP_8_1 || UNITY_WINRT_8_1 || UNITY_WEBGL) && !UNITY_EDITOR
         res = decompress7zip2(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
         ibuf.Free(); return res;
      #endif
#endif
    }
    //same as above only the progress integer is a local variable.
    //use this when you don't want to get the progress of the extracted files and when not calling the function from a separate thread.
    public static int doDecompress7zip(string filePath, string exctractionPath,  bool largeFiles = false, bool fullPaths = false, string entry = null, byte[] FileBuffer=null)
    public static int doDecompress7zip(string filePath, string exctractionPath, bool largeFiles = false, bool fullPaths = false, string entry = null, byte[] FileBuffer = null)
    {
        //make a check if the last '/' exists at the end of the exctractionPath and add it if it is missing
        if (@exctractionPath.Substring(@exctractionPath.Length - 1, 1) != "/") { @exctractionPath += "/"; }
        int[] progress = new int[1];
      GCHandle ibuf = GCHandle.Alloc(progress, GCHandleType.Pinned);
      int res = 0;
      #if (UNITY_IPHONE || UNITY_IOS || UNITY_STANDALONE_OSX || UNITY_ANDROID || UNITY_STANDALONE_LINUX || UNITY_EDITOR) && !UNITY_EDITOR_WIN
        GCHandle ibuf = GCHandle.Alloc(progress, GCHandleType.Pinned);
        int res = 0;
#if (UNITY_ANDROID || UNITY_STANDALONE_LINUX || UNITY_EDITOR) && !UNITY_EDITOR_WIN
      if(FileBuffer != null) {
         GCHandle fbuf = GCHandle.Alloc(FileBuffer, GCHandleType.Pinned);
         
@@ -261,23 +265,25 @@
            ibuf.Free(); return res;
         }
      }
      #endif
      #if (!UNITY_WSA && !UNITY_WEBGL && !UNITY_EDITOR_OSX && !UNITY_STANDALONE_LINUX  && !UNITY_ANDROID && !UNITY_IOS) || UNITY_EDITOR_WIN || UNITY_WSA_10_0
         if (largeFiles){
            res = decompress7zip(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
            ibuf.Free(); return res;
            }
            else{
            res = decompress7zip2(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
            ibuf.Free(); return res;
            }
      #endif
#endif
      #if (UNITY_WSA_8_1 ||  UNITY_WP_8_1 || UNITY_WINRT_8_1  || UNITY_WEBGL) && !UNITY_EDITOR
#if (!UNITY_WSA && !UNITY_WEBGL && !UNITY_STANDALONE_LINUX && !UNITY_ANDROID) || UNITY_EDITOR_WIN || UNITY_WSA_10_0
        if (largeFiles)
        {
            res = decompress7zip(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
            ibuf.Free(); return res;
        }
        else
        {
            res = decompress7zip2(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
            ibuf.Free(); return res;
        }
#endif
#if (UNITY_WSA_8_1 || UNITY_WP_8_1 || UNITY_WINRT_8_1 || UNITY_WEBGL) && !UNITY_EDITOR
         res = decompress7zip2(@filePath, @exctractionPath, fullPaths, entry, ibuf.AddrOfPinnedObject(), IntPtr.Zero, 0);
         ibuf.Free(); return res;
      #endif
#endif
    }
@@ -292,30 +298,32 @@
    //This function encodes a single archive in lzma alone format.
    //inPath   : the file to be encoded. (use full path + file name)
    //outPath   : the .lzma file that will be produced. (use full path + file name)
   //
   //You can set the compression properties by calling the setProps function before.
   //setProps(9) for example will set compression evel to highest level.
    public static int LzmaUtilEncode(string inPath, string outPath){
    //
    //You can set the compression properties by calling the setProps function before.
    //setProps(9) for example will set compression evel to highest level.
    public static int LzmaUtilEncode(string inPath, string outPath)
    {
        if (!defaultsSet) setProps();
        GCHandle prps = GCHandle.Alloc(props, GCHandleType.Pinned);
      int res = lzmaUtil(true, @inPath, @outPath, prps.AddrOfPinnedObject());
        int res = lzmaUtil(true, @inPath, @outPath, prps.AddrOfPinnedObject());
        prps.Free();
        return res;
   }
    }
   //This function decodes a single archive in lzma alone format.
   //inPath   : the .lzma file that will be decoded. (use full path + file name)
   //outPath   : the decoded file. (use full path + file name)
   public static int LzmaUtilDecode(string inPath, string outPath){
      return lzmaUtil(false, @inPath, @outPath, IntPtr.Zero);
   }
    //This function decodes a single archive in lzma alone format.
    //inPath   : the .lzma file that will be decoded. (use full path + file name)
    //outPath   : the decoded file. (use full path + file name)
    public static int LzmaUtilDecode(string inPath, string outPath)
    {
        return lzmaUtil(false, @inPath, @outPath, IntPtr.Zero);
    }
#endif
   //Lists get filled with filenames (including path if the file is in a folder) and uncompressed file sizes
   public static List <string> ninfo = new List<string>();//filenames
   public static List <long> sinfo = new List<long>();//file sizes
    //Lists get filled with filenames (including path if the file is in a folder) and uncompressed file sizes
    public static List<string> ninfo = new List<string>();//filenames
    public static List<long> sinfo = new List<long>();//file sizes
    //this function fills the ArrayLists with the filenames and file sizes that are in the 7zip file
    //returns         : the total size in bytes of the files in the 7z archive 
@@ -324,34 +332,37 @@
    //tempPath         : (optional) a temp path that will be used to write the files info (otherwise the path of the 7z archive will be used)
    //               : this is useful when your 7z archive resides in a read only location.
    //               : the tempPath should be in this form: 'dir/dir/myTempLog' with no slash in the end. The last name will be used as the log's filename.
   //FileBuffer      : A buffer that holds a 7zip file. When assigned the function will read from this buffer and will ignore the filePath. (Linux, iOS, Android, MacOSX)
    //FileBuffer      : A buffer that holds a 7zip file. When assigned the function will read from this buffer and will ignore the filePath. (Linux, iOS, Android, MacOSX)
    //
    //trueTotalFiles is an integer variable to store the total number of files in a 7z archive, excluding the folders.
    public static long get7zInfo(string filePath, string tempPath = null, byte[] FileBuffer = null){
    public static long get7zInfo(string filePath, string tempPath = null, byte[] FileBuffer = null)
    {
        ninfo.Clear(); sinfo.Clear();
        trueTotalFiles = 0;
        int res = -1;
        string logPath = "";
      #if !NETFX_CORE
         if (@tempPath == null) {
            if(persitentDataPath.Length>0) logPath = @persitentDataPath + "/sevenZip.log"; else  logPath = @Application.persistentDataPath + "/sevenZip.log";
          }else { logPath = @tempPath; }
      #endif
      //for WSA, logPath should always be: Application.persistentDataPath + "/sevenZip.log";
      #if NETFX_CORE
         #if UNITY_WSA_10_0
#if !NETFX_CORE
        if (@tempPath == null)
        {
            if (persitentDataPath.Length > 0) logPath = @persitentDataPath + "/sevenZip.log"; else logPath = @Application.persistentDataPath + "/sevenZip.log";
        }
        else { logPath = @tempPath; }
#endif
        //for WSA, logPath should always be: Application.persistentDataPath + "/sevenZip.log";
#if NETFX_CORE
#if UNITY_WSA_10_0
            if(persitentDataPath.Length>0) logPath = @persitentDataPath + "/sevenZip.log"; else  logPath = @Application.persistentDataPath + "/sevenZip.log";
         #endif
         #if UNITY_WSA_8_1 ||  UNITY_WP_8_1 || UNITY_WINRT_8_1
#endif
#if UNITY_WSA_8_1 || UNITY_WP_8_1 || UNITY_WINRT_8_1
            if(persitentDataPath.Length>0) logPath = @persitentDataPath + "/sevenZip.log"; else  logPath = @UnityEngine.Windows.Directory.localFolder + "/sevenZip.log";
         #endif
      #endif
#endif
#endif
      if (File.Exists(logPath + ".txt")) File.Delete(logPath + ".txt");
        if (File.Exists(logPath + ".txt")) File.Delete(logPath + ".txt");
      #if (UNITY_IPHONE || UNITY_IOS || UNITY_STANDALONE_OSX || UNITY_ANDROID || UNITY_STANDALONE_LINUX || UNITY_EDITOR) && !UNITY_EDITOR_WIN
#if (UNITY_ANDROID || UNITY_STANDALONE_LINUX || UNITY_EDITOR) && !UNITY_EDITOR_WIN
          if(FileBuffer != null) {
                GCHandle fbuf = GCHandle.Alloc(FileBuffer, GCHandleType.Pinned);
                res = _getSize(null, logPath,  fbuf.AddrOfPinnedObject(), FileBuffer.Length);
@@ -359,113 +370,122 @@
            }else {
                res = _getSize(@filePath, logPath,  IntPtr.Zero, 0);
            }
        #else
            res = _getSize(@filePath, logPath,  IntPtr.Zero, 0);
        #endif
#else
        res = _getSize(@filePath, logPath, IntPtr.Zero, 0);
#endif
        if (res == -1) { /*Debug.Log("Input file not found.");*/ return -1; }
      if (!File.Exists(logPath + ".txt")) {/* Debug.Log("Info file not found.");*/ return -3; }
        if (!File.Exists(logPath + ".txt")) {/* Debug.Log("Info file not found.");*/ return -3; }
      #if !NETFX_CORE
         StreamReader r = new StreamReader(logPath + ".txt");
      #endif
      #if NETFX_CORE
         #if UNITY_WSA_10_0
#if !NETFX_CORE
        StreamReader r = new StreamReader(logPath + ".txt");
#endif
#if NETFX_CORE
#if UNITY_WSA_10_0
         IsolatedStorageFile ipath = IsolatedStorageFile.GetUserStoreForApplication();
         StreamReader r = new StreamReader(new IsolatedStorageFileStream("sevenZip.log.txt", FileMode.Open, ipath));
         #endif
         #if UNITY_WSA_8_1 ||  UNITY_WP_8_1 || UNITY_WINRT_8_1
#endif
#if UNITY_WSA_8_1 || UNITY_WP_8_1 || UNITY_WINRT_8_1
         var data = UnityEngine.Windows.File.ReadAllBytes(logPath + ".txt");
         string ss = System.Text.Encoding.UTF8.GetString(data,0,data.Length);
         StringReader r = new StringReader(ss);
         #endif
      #endif
#endif
#endif
        string line;
        string[] rtt;
        long t = 0, sum = 0;
      while ((line = r.ReadLine()) != null)
      {
         rtt = line.Split('|');
         ninfo.Add(rtt[0]);
         long.TryParse(rtt[1], out t);
         sum += t;
         sinfo.Add(t);
         if (t > 0) trueTotalFiles++;
      }
      #if !NETFX_CORE
         r.Close();
      #endif
      r.Dispose();
      File.Delete(logPath + ".txt");
        while ((line = r.ReadLine()) != null)
        {
            rtt = line.Split('|');
            ninfo.Add(rtt[0]);
            long.TryParse(rtt[1], out t);
            sum += t;
            sinfo.Add(t);
            if (t > 0) trueTotalFiles++;
        }
#if !NETFX_CORE
        r.Close();
#endif
        r.Dispose();
        File.Delete(logPath + ".txt");
        return sum;
    }
   //this function returns the uncompressed file size of a given file in the 7z archive if specified,
   //otherwise it will return the total uncompressed size of all the files in the archive.
   //
   //If you don't fill the filePath parameter it will assume that the get7zInfo function has already been called.
   //
   //
   //filePath         : the full path to the archive, including the archives name. (/myPath/myArchive.7z)
   //                : if you call the function with filePath as null, it will try to find file sizes from the last call.
   //fileName          : the file name we want to get the file size (if it resides in a folder add the folder path also)
   //tempPath         : (optional) a temp path that will be used to write the files info (otherwise the path of the 7z archive will be used)
   //               : this is useful when your 7z archive resides in a read only location.
    //this function returns the uncompressed file size of a given file in the 7z archive if specified,
    //otherwise it will return the total uncompressed size of all the files in the archive.
    //
    //If you don't fill the filePath parameter it will assume that the get7zInfo function has already been called.
    //
    //
    //filePath         : the full path to the archive, including the archives name. (/myPath/myArchive.7z)
    //                : if you call the function with filePath as null, it will try to find file sizes from the last call.
    //fileName          : the file name we want to get the file size (if it resides in a folder add the folder path also)
    //tempPath         : (optional) a temp path that will be used to write the files info (otherwise the path of the 7z archive will be used)
    //               : this is useful when your 7z archive resides in a read only location.
    //               : the tempPath should be in this form: 'dir/dir/myTempLog' with no slash in the end. The last name will be used as the log's filename.
   //FileBuffer      : A buffer that holds a 7zip file. When assigned the function will read from this buffer and will ignore the filePath. (Linux, iOS, Android, MacOSX)
   public static long get7zSize( string filePath=null, string fileName=null, string tempPath=null, byte[] FileBuffer=null){
      if(filePath!=null){
         if(get7zInfo(@filePath, @tempPath, FileBuffer) < 0){ return -1;}
      }
    //FileBuffer      : A buffer that holds a 7zip file. When assigned the function will read from this buffer and will ignore the filePath. (Linux, iOS, Android, MacOSX)
    public static long get7zSize(string filePath = null, string fileName = null, string tempPath = null, byte[] FileBuffer = null)
    {
      if(ninfo == null){
         if(ninfo.Count==0) { return -1; }
      }
        if (filePath != null)
        {
            if (get7zInfo(@filePath, @tempPath, FileBuffer) < 0) { return -1; }
        }
      long sum=0;
        if (ninfo == null)
        {
            if (ninfo.Count == 0) { return -1; }
        }
      if(fileName!=null){
         for(int i=0; i<ninfo.Count; i++){
            if(ninfo[i].ToString() == fileName){
               return (long)sinfo[i];
            }
         }
      }else{
         for(int i=0; i<ninfo.Count; i++){
            sum += (long)sinfo[i];
         }
         return sum;
      }
      return -1;//nothing was found
   }
        long sum = 0;
        if (fileName != null)
        {
            for (int i = 0; i < ninfo.Count; i++)
            {
                if (ninfo[i].ToString() == fileName)
                {
                    return (long)sinfo[i];
                }
            }
        }
        else
        {
            for (int i = 0; i < ninfo.Count; i++)
            {
                sum += (long)sinfo[i];
            }
            return sum;
        }
        return -1;//nothing was found
    }
   //A function to decode a specific archive in a 7z archive to a byte buffer
   //
   //filePath      : the full path to the 7z archive
   //entry         : the file name to decode to a buffer. If the file resides in a folder, the full path should be used.
   //tempPath      : (optional) a temp path that will be used to write the files info (otherwise the path of the 7z archive will be used)
   //            : this is useful when your 7z archive resides in a read only location.
    //A function to decode a specific archive in a 7z archive to a byte buffer
    //
    //filePath      : the full path to the 7z archive
    //entry         : the file name to decode to a buffer. If the file resides in a folder, the full path should be used.
    //tempPath      : (optional) a temp path that will be used to write the files info (otherwise the path of the 7z archive will be used)
    //            : this is useful when your 7z archive resides in a read only location.
    //            : the tempPath should be in this form: 'dir/dir/myTempLog' with no slash in the end. The last name will be used as the log's filename.
   //FileBuffer   : A buffer that holds a 7zip file. When assigned the function will read from this buffer and will ignore the filePath. (Linux, iOS, Android, MacOSX)
   public static byte[] decode2Buffer(  string filePath, string entry, string tempPath=null, byte[] FileBuffer=null){
      int bufs = (int)get7zSize( @filePath, entry, @tempPath,FileBuffer );
    //FileBuffer   : A buffer that holds a 7zip file. When assigned the function will read from this buffer and will ignore the filePath. (Linux, iOS, Android, MacOSX)
    public static byte[] decode2Buffer(string filePath, string entry, string tempPath = null, byte[] FileBuffer = null)
    {
        int bufs = (int)get7zSize(@filePath, entry, @tempPath, FileBuffer);
        if (bufs <= 0) return null;//entry error or it does not exist
        byte[] nb = new byte[bufs];
        int res = 0;
        GCHandle dec2buf = GCHandle.Alloc(nb, GCHandleType.Pinned);
      #if (UNITY_IPHONE || UNITY_IOS || UNITY_STANDALONE_OSX || UNITY_ANDROID || UNITY_STANDALONE_LINUX || UNITY_EDITOR) && !UNITY_EDITOR_WIN
#if (UNITY_ANDROID || UNITY_STANDALONE_LINUX || UNITY_EDITOR) && !UNITY_EDITOR_WIN
          if(FileBuffer != null) {
                GCHandle fbuf = GCHandle.Alloc(FileBuffer, GCHandleType.Pinned);
                res = decode2Buf(null, entry, dec2buf.AddrOfPinnedObject(), fbuf.AddrOfPinnedObject(), FileBuffer.Length);
@@ -473,13 +493,13 @@
            }else {
                res = decode2Buf(@filePath, entry, dec2buf.AddrOfPinnedObject(), IntPtr.Zero, 0);
            }
        #else
            res = decode2Buf(@filePath, entry, dec2buf.AddrOfPinnedObject(), IntPtr.Zero, 0);
        #endif
#else
        res = decode2Buf(@filePath, entry, dec2buf.AddrOfPinnedObject(), IntPtr.Zero, 0);
#endif
        dec2buf.Free();
      if(res==1){ return nb;}
      else {nb=null; return null; }
        if (res == 1) { return nb; }
        else { nb = null; return null; }
    }
@@ -490,43 +510,44 @@
    //This buffer can be uncompressed by the decompressBuffer function.
    //Returns true if success
    //if makeHeader==false then the lzma 13 bytes header will not be added to the buffer.
   //
   //You can set the compression properties by calling the setProps function before.
   //setProps(9) for example will set compression level to the highest level.
   //
    public static  bool compressBuffer(byte[] inBuffer, ref byte[] outBuffer, bool makeHeader=true){
    //
    //You can set the compression properties by calling the setProps function before.
    //setProps(9) for example will set compression level to the highest level.
    //
    public static bool compressBuffer(byte[] inBuffer, ref byte[] outBuffer, bool makeHeader = true)
    {
        if (!defaultsSet) setProps();
        GCHandle prps = GCHandle.Alloc(props, GCHandleType.Pinned);
      GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
      IntPtr ptr;
        GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
        IntPtr ptr;
        int res = 0;
      ptr = Lzma_Compress(cbuf.AddrOfPinnedObject(), inBuffer.Length, makeHeader, ref res, prps.AddrOfPinnedObject());
        ptr = Lzma_Compress(cbuf.AddrOfPinnedObject(), inBuffer.Length, makeHeader, ref res, prps.AddrOfPinnedObject());
      cbuf.Free(); prps.Free();
        cbuf.Free(); prps.Free();
      if(res==0 || ptr==IntPtr.Zero){_releaseBuffer(ptr); return false;}
        if (res == 0 || ptr == IntPtr.Zero) { _releaseBuffer(ptr); return false; }
      Array.Resize(ref outBuffer,res);
      Marshal.Copy(ptr, outBuffer, 0, res);
        Array.Resize(ref outBuffer, res);
        Marshal.Copy(ptr, outBuffer, 0, res);
      _releaseBuffer(ptr);
        _releaseBuffer(ptr);
      return true;
   }
        return true;
    }
    //same as the above function, only it compresses a part of the input buffer.
   //
   //inBufferPartialLength: the size of the input buffer that should be compressed
   //inBufferPartialIndex:  the offset of the input buffer from where the compression will start
   //
   public static bool compressBufferPartial(byte[] inBuffer, int inBufferPartialIndex, int inBufferPartialLength, ref byte[] outBuffer, bool makeHeader = true)
    //
    //inBufferPartialLength: the size of the input buffer that should be compressed
    //inBufferPartialIndex:  the offset of the input buffer from where the compression will start
    //
    public static bool compressBufferPartial(byte[] inBuffer, int inBufferPartialIndex, int inBufferPartialLength, ref byte[] outBuffer, bool makeHeader = true)
    {
      if(inBufferPartialIndex + inBufferPartialLength > inBuffer.Length) return false;
        if (inBufferPartialIndex + inBufferPartialLength > inBuffer.Length) return false;
        if (!defaultsSet) setProps();
        GCHandle prps = GCHandle.Alloc(props, GCHandleType.Pinned);
@@ -547,18 +568,18 @@
        Array.Resize(ref outBuffer, res);
        Marshal.Copy(ptr, outBuffer, 0, res);
        _releaseBuffer(ptr);
        return true;
    }
   //same as compressBufferPartial, only this function will compress the data into a fixed size buffer
   //the compressed size is returned so you can manipulate it at will.
   public static int compressBufferPartialFixed(byte[] inBuffer, int inBufferPartialIndex, int inBufferPartialLength, ref byte[] outBuffer, bool safe = true,  bool makeHeader = true)
    //same as compressBufferPartial, only this function will compress the data into a fixed size buffer
    //the compressed size is returned so you can manipulate it at will.
    public static int compressBufferPartialFixed(byte[] inBuffer, int inBufferPartialIndex, int inBufferPartialLength, ref byte[] outBuffer, bool safe = true, bool makeHeader = true)
    {
      if(inBufferPartialIndex + inBufferPartialLength > inBuffer.Length) return 0;
        if (inBufferPartialIndex + inBufferPartialLength > inBuffer.Length) return 0;
        if (!defaultsSet) setProps();
        GCHandle prps = GCHandle.Alloc(props, GCHandleType.Pinned);
@@ -577,53 +598,56 @@
        if (res == 0 || ptr == IntPtr.Zero) { _releaseBuffer(ptr); return 0; }
      //if the compressed buffer is larger then the fixed size buffer we use:
      //1. then write only the data that fit in it.
      //2. or we return 0.
      //It depends on if we set the safe flag to true or not.
      if(res>outBuffer.Length) {
         if(safe){ _releaseBuffer(ptr); return 0; } else {  res = outBuffer.Length; }
      }
        //if the compressed buffer is larger then the fixed size buffer we use:
        //1. then write only the data that fit in it.
        //2. or we return 0.
        //It depends on if we set the safe flag to true or not.
        if (res > outBuffer.Length)
        {
            if (safe) { _releaseBuffer(ptr); return 0; } else { res = outBuffer.Length; }
        }
        Marshal.Copy(ptr, outBuffer, 0, res);
        _releaseBuffer(ptr);
        return res;
    }
   //same as the compressBuffer function, only this function will put the result in a fixed size buffer to avoid memory allocations.
   //the compressed size is returned so you can manipulate it at will.
   public static int compressBufferFixed(byte[] inBuffer, ref byte[] outBuffer, bool safe = true, bool makeHeader=true){
    //same as the compressBuffer function, only this function will put the result in a fixed size buffer to avoid memory allocations.
    //the compressed size is returned so you can manipulate it at will.
    public static int compressBufferFixed(byte[] inBuffer, ref byte[] outBuffer, bool safe = true, bool makeHeader = true)
    {
        if (!defaultsSet) setProps();
        GCHandle prps = GCHandle.Alloc(props, GCHandleType.Pinned);
      GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
      IntPtr ptr;
        GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
        IntPtr ptr;
        int res = 0;
      ptr = Lzma_Compress(cbuf.AddrOfPinnedObject(), inBuffer.Length, makeHeader, ref res, prps.AddrOfPinnedObject());
        ptr = Lzma_Compress(cbuf.AddrOfPinnedObject(), inBuffer.Length, makeHeader, ref res, prps.AddrOfPinnedObject());
      cbuf.Free(); prps.Free();
      if(res==0 || ptr==IntPtr.Zero){_releaseBuffer(ptr); return 0;}
        cbuf.Free(); prps.Free();
        if (res == 0 || ptr == IntPtr.Zero) { _releaseBuffer(ptr); return 0; }
      //if the compressed buffer is larger then the fixed size buffer we use:
      //1. then write only the data that fit in it.
      //2. or we return 0.
      //It depends on if we set the safe flag to true or not.
      if(res>outBuffer.Length) {
         if(safe){ _releaseBuffer(ptr); return 0; } else {  res = outBuffer.Length; }
      }
        //if the compressed buffer is larger then the fixed size buffer we use:
        //1. then write only the data that fit in it.
        //2. or we return 0.
        //It depends on if we set the safe flag to true or not.
        if (res > outBuffer.Length)
        {
            if (safe) { _releaseBuffer(ptr); return 0; } else { res = outBuffer.Length; }
        }
      Marshal.Copy(ptr, outBuffer, 0, res);
        Marshal.Copy(ptr, outBuffer, 0, res);
      _releaseBuffer(ptr);
        _releaseBuffer(ptr);
      return res;
   }
        return res;
    }
#endif
@@ -631,11 +655,11 @@
   //This function will decompress a compressed asset bundle.
   //It finds the magic number of the lzma format and extracts from there.
   //
   //inBuffer:      the buffer that stores a compressed asset bundle.
   //outBuffer:   a referenced buffer where the asset bundle will be uncompressed.
    //This function will decompress a compressed asset bundle.
    //It finds the magic number of the lzma format and extracts from there.
    //
    //inBuffer:      the buffer that stores a compressed asset bundle.
    //outBuffer:   a referenced buffer where the asset bundle will be uncompressed.
    //The error codes
    /*
        OK 0
@@ -649,44 +673,50 @@
        ERROR_FAIL 11
        ERROR_THREAD 12
    */
   public static  int decompressAssetBundle(byte[] inBuffer,  ref byte[] outbuffer){
    public static int decompressAssetBundle(byte[] inBuffer, ref byte[] outbuffer)
    {
      int offset = 0;
      for(int i=0; i<inBuffer.Length; i++) {
         if(i>1024) break;
         if(inBuffer[i] == 0x5d) {
            if(inBuffer[i+1] == 0x00) {
               if(inBuffer[i+2] == 0x00) {
                  if(inBuffer[i+3] == 0x08) {
                     offset = i;  break;
                  }
               }
            }
         }
      }
      if(offset==0 || offset>1024) return 4;
        int offset = 0;
      GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
      IntPtr ptrBundle = new IntPtr(cbuf.AddrOfPinnedObject().ToInt64() + offset);
      int uncompressedSize = (int)BitConverter.ToUInt64(inBuffer,offset+5);
      if(uncompressedSize<0) { cbuf.Free(); return 4; }
      Array.Resize(ref outbuffer, uncompressedSize);
      GCHandle obuf = GCHandle.Alloc(outbuffer, GCHandleType.Pinned);
      int res = Lzma_Uncompress(ptrBundle, inBuffer.Length-offset, uncompressedSize, obuf.AddrOfPinnedObject(), true);
        for (int i = 0; i < inBuffer.Length; i++)
        {
            if (i > 1024) break;
            if (inBuffer[i] == 0x5d)
            {
                if (inBuffer[i + 1] == 0x00)
                {
                    if (inBuffer[i + 2] == 0x00)
                    {
                        if (inBuffer[i + 3] == 0x08)
                        {
                            offset = i; break;
                        }
                    }
                }
            }
        }
      cbuf.Free();
      obuf.Free();
        if (offset == 0 || offset > 1024) return 4;
      //if(res!=0){/*Debug.Log("ERROR: "+res.ToString());*/ return res; }
      return res;
   }
        GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
        IntPtr ptrBundle = new IntPtr(cbuf.AddrOfPinnedObject().ToInt64() + offset);
        int uncompressedSize = (int)BitConverter.ToUInt64(inBuffer, offset + 5);
        if (uncompressedSize < 0) { cbuf.Free(); return 4; }
        Array.Resize(ref outbuffer, uncompressedSize);
        GCHandle obuf = GCHandle.Alloc(outbuffer, GCHandleType.Pinned);
        int res = Lzma_Uncompress(ptrBundle, inBuffer.Length - offset, uncompressedSize, obuf.AddrOfPinnedObject(), true);
        cbuf.Free();
        obuf.Free();
        //if(res!=0){/*Debug.Log("ERROR: "+res.ToString());*/ return res; }
        return res;
    }
   /*
    /*
   //this will decompress an lzma alone format file.
   public static  int decompressLzmaAlone(string inFile,  string outFile){
@@ -756,84 +786,88 @@
        ERROR_FAIL 11
        ERROR_THREAD 12
        */
    public static  int decompressBuffer(byte[] inBuffer,  ref byte[] outbuffer, bool useHeader=true, int customLength=0){
      GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
      int uncompressedSize = 0;
      //if the lzma header will be used to extract the uncompressed size of the buffer. If the buffer does not have a header
      //provide the known uncompressed size through the customLength integer.
      if(useHeader) uncompressedSize = (int)BitConverter.ToUInt64(inBuffer,5); else uncompressedSize = customLength;
    public static int decompressBuffer(byte[] inBuffer, ref byte[] outbuffer, bool useHeader = true, int customLength = 0)
    {
      Array.Resize(ref outbuffer, uncompressedSize);
        GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
        int uncompressedSize = 0;
      GCHandle obuf = GCHandle.Alloc(outbuffer, GCHandleType.Pinned);
      int res = Lzma_Uncompress(cbuf.AddrOfPinnedObject(), inBuffer.Length, uncompressedSize, obuf.AddrOfPinnedObject(), useHeader);
        //if the lzma header will be used to extract the uncompressed size of the buffer. If the buffer does not have a header
        //provide the known uncompressed size through the customLength integer.
        if (useHeader) uncompressedSize = (int)BitConverter.ToUInt64(inBuffer, 5); else uncompressedSize = customLength;
      cbuf.Free();
      obuf.Free();
        Array.Resize(ref outbuffer, uncompressedSize);
      //if(res!=0){/*Debug.Log("ERROR: "+res.ToString());*/ return res; }
      return res;
   }
        GCHandle obuf = GCHandle.Alloc(outbuffer, GCHandleType.Pinned);
   public static  byte[] decompressBuffer(byte[] inBuffer, bool useHeader=true, int customLength=0){
      GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
      int uncompressedSize = 0;
      //if the lzma header will be used to extract the uncompressed size of the buffer. If the buffer does not have a header
      //provide the known uncompressed size through the customLength integer.
      if(useHeader) uncompressedSize = (int)BitConverter.ToUInt64(inBuffer,5); else uncompressedSize = customLength;
        int res = Lzma_Uncompress(cbuf.AddrOfPinnedObject(), inBuffer.Length, uncompressedSize, obuf.AddrOfPinnedObject(), useHeader);
      byte[] outbuffer = new byte[uncompressedSize];
        cbuf.Free();
        obuf.Free();
      GCHandle obuf = GCHandle.Alloc(outbuffer, GCHandleType.Pinned);
      int res = Lzma_Uncompress(cbuf.AddrOfPinnedObject(), inBuffer.Length, uncompressedSize, obuf.AddrOfPinnedObject(), useHeader);
        //if(res!=0){/*Debug.Log("ERROR: "+res.ToString());*/ return res; }
      cbuf.Free();
      obuf.Free();
        return res;
    }
      if(res!=0){/*Debug.Log("ERROR: "+res.ToString());*/ return null; }
      return outbuffer;
   }
    public static byte[] decompressBuffer(byte[] inBuffer, bool useHeader = true, int customLength = 0)
    {
        GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
        int uncompressedSize = 0;
        //if the lzma header will be used to extract the uncompressed size of the buffer. If the buffer does not have a header
        //provide the known uncompressed size through the customLength integer.
        if (useHeader) uncompressedSize = (int)BitConverter.ToUInt64(inBuffer, 5); else uncompressedSize = customLength;
        byte[] outbuffer = new byte[uncompressedSize];
        GCHandle obuf = GCHandle.Alloc(outbuffer, GCHandleType.Pinned);
        int res = Lzma_Uncompress(cbuf.AddrOfPinnedObject(), inBuffer.Length, uncompressedSize, obuf.AddrOfPinnedObject(), useHeader);
        cbuf.Free();
        obuf.Free();
        if (res != 0) {/*Debug.Log("ERROR: "+res.ToString());*/ return null; }
        return outbuffer;
    }
   //same as above function. Only this one outputs to a buffer of fixed which size isn't resized to avoid memory allocations.
   //The fixed buffer should have a size that will be able to hold the incoming decompressed data.
   //returns the uncompressed size.
   public static  int decompressBufferFixed(byte[] inBuffer,  ref byte[] outbuffer, bool safe = true, bool useHeader=true, int customLength=0){
    //same as above function. Only this one outputs to a buffer of fixed which size isn't resized to avoid memory allocations.
    //The fixed buffer should have a size that will be able to hold the incoming decompressed data.
    //returns the uncompressed size.
    public static int decompressBufferFixed(byte[] inBuffer, ref byte[] outbuffer, bool safe = true, bool useHeader = true, int customLength = 0)
    {
      int uncompressedSize = 0;
      //if the lzma header will be used to extract the uncompressed size of the buffer. If the buffer does not have a header
      //provide the known uncompressed size through the customLength integer.
      if(useHeader) uncompressedSize = (int)BitConverter.ToUInt64(inBuffer,5); else uncompressedSize = customLength;
        int uncompressedSize = 0;
      //Check if the uncompressed size is bigger then the size of the fixed buffer. Then:
      //1. write only the data that fit in it.
      //2. or return a negative number.
      //It depends on if we set the safe flag to true or not.
      if(uncompressedSize > outbuffer.Length) {
         if(safe) return -101;  else  uncompressedSize = outbuffer.Length;
       }
        //if the lzma header will be used to extract the uncompressed size of the buffer. If the buffer does not have a header
        //provide the known uncompressed size through the customLength integer.
        if (useHeader) uncompressedSize = (int)BitConverter.ToUInt64(inBuffer, 5); else uncompressedSize = customLength;
      GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
      GCHandle obuf = GCHandle.Alloc(outbuffer, GCHandleType.Pinned);
      int res = Lzma_Uncompress(cbuf.AddrOfPinnedObject(), inBuffer.Length, uncompressedSize, obuf.AddrOfPinnedObject(), useHeader);
        //Check if the uncompressed size is bigger then the size of the fixed buffer. Then:
        //1. write only the data that fit in it.
        //2. or return a negative number.
        //It depends on if we set the safe flag to true or not.
        if (uncompressedSize > outbuffer.Length)
        {
            if (safe) return -101; else uncompressedSize = outbuffer.Length;
        }
      cbuf.Free();
      obuf.Free();
        GCHandle cbuf = GCHandle.Alloc(inBuffer, GCHandleType.Pinned);
        GCHandle obuf = GCHandle.Alloc(outbuffer, GCHandleType.Pinned);
      if(res!=0){/*Debug.Log("ERROR: "+res.ToString());*/ return -res; }
      return uncompressedSize;
   }
        int res = Lzma_Uncompress(cbuf.AddrOfPinnedObject(), inBuffer.Length, uncompressedSize, obuf.AddrOfPinnedObject(), useHeader);
        cbuf.Free();
        obuf.Free();
        if (res != 0) {/*Debug.Log("ERROR: "+res.ToString());*/ return -res; }
        return uncompressedSize;
    }
}
#endif