示例#1
0
        private void GetData()
        {
            try
            {
                if (Data == null)
                {
                    Data = new byte[Size];
                    var dataPtr = Marshal.AllocHGlobal(Size);

                    int num;
                    DatExport.GetSubfileData(_handle, (int)FileId, dataPtr, 0, out num);

                    Marshal.Copy(dataPtr, Data, 0, Size);
                    Marshal.FreeHGlobal(dataPtr);

                    if (IsCompressed)
                    {
                        Data = Decompress();
                    }
                }

                IsValid = true;
            }
            catch
            {
                Logger.Write($"файл #{FileId} повреждён, пропускаю.");
            }
        }
示例#2
0
        internal Subfile(int handle, uint fileId, int size, int iteration, int version)
        {
            _handle      = handle;
            FileId       = fileId;
            Size         = size;
            Iteration    = iteration;
            Version      = version;
            IsCompressed = 1 == DatExport.GetSubfileCompressionFlag(_handle, (int)fileId);

            GetData();
            CheckHeader();
        }
示例#3
0
文件: DatFile.cs 项目: Endevir/Elanor
        private void Load()
        {
            var count = DatExport.GetNumSubfiles(_handle);

            for (var i = 0; i < count; ++i)
            {
                int fileId;
                int size;
                int iteration;
                DatExport.GetSubfileSizes(_handle, out fileId, out size, out iteration, i, 1);

                SubfileInfo.Add((uint)fileId, new SubfileInfo((uint)fileId, size, iteration));
            }
        }
示例#4
0
文件: DatFile.cs 项目: Endevir/Elanor
        public Subfile this[uint index]
        {
            get
            {
                Subfile subfile = null;

                if (SubfileInfo.ContainsKey(index))
                {
                    var si = SubfileInfo[index];
                    subfile = new Subfile(_handle, index, si.Size, si.Iteration, DatExport.GetSubfileVersion(_handle, (int)index));
                }

                return(subfile);
            }
        }
示例#5
0
        private byte[] Decompress()
        {
            var size   = Data.Length;
            var num    = Data[3] << 24 | Data[2] << 16 | Data[1] << 8 | Data[0];
            var num2   = size - 4;
            var array2 = new byte[num];
            var array3 = new byte[num2];

            for (var j = 4; j < size; j++)
            {
                array3[j - 4] = Data[j];
            }

            DatExport.uncompress(array2, ref num, array3, num2);

            return(array2);
        }
示例#6
0
文件: DatFile.cs 项目: Endevir/Elanor
        public void Open(string path, bool readOnly)
        {
            // detect
            ClientDat = ClientDat.WhoIs(path);

            // open
            _handle = AllocHandle();

            try
            {
                var  datIdStamp    = new StringBuilder(64);
                var  firstIterGuid = new StringBuilder(64);
                uint num           = 130u;

                if (readOnly)
                {
                    num |= 4u;
                }

                int   num2;
                int   num3;
                int   num4;
                int   num5;
                ulong num6;

                if (DatExport.OpenDatFile(_handle, path, num, out num2, out num3, out num4, out num5, out num6, datIdStamp, firstIterGuid) == -1)
                {
                    throw new DatFileException("Unable to open file [ " + path + " ]");
                }

                Load();
            }
            catch
            {
                FreeHandle(_handle);
                throw;
            }
        }
示例#7
0
文件: DatFile.cs 项目: Endevir/Elanor
 public void Close()
 {
     DatExport.CloseDatFile(_handle);
 }
示例#8
0
文件: DatFile.cs 项目: Endevir/Elanor
 public void Flush()
 {
     DatExport.Flush(_handle);
 }
示例#9
0
文件: DatFile.cs 项目: Endevir/Elanor
 public int Purge(uint id)
 {
     return(DatExport.PurgeSubfileData(_handle, (int)id));
 }
示例#10
0
文件: DatFile.cs 项目: Endevir/Elanor
 public int Put(uint id, IntPtr buffer, int offset, int size, int version, int iteration, bool compress = false)
 {
     return(DatExport.PutSubfileData(_handle, (int)id, buffer, offset, size, version, iteration, compress));
 }